时间序列数据的主要特征是它们的时间索引,这为数据提供了明确的顺序。这种顺序使得我们可以分析随时间的变化趋势、周期性和季节性模式,以及突发事件的影响。为了充分利用时间序列数据,我们通常需要从时间索引中提取多种特征:
时间单位:如年、季度、月、周、日、小时等。
日期属性:如是否为月末、季末、年末等。
星期和时间段:如星期几、是否为工作日、时间段(早上、下午、傍晚、深夜)等。
节假日:如公共节假日、特殊事件等。
移动窗口统计:如过去几小时、几天、几个月的平均值、中位数、方差等。
import pandas as pd
import numpy as np
# 设置时间范围和频率
start_date = '2024-01-01'
end_date = '2024-01-04'
freq = 'H' # 每小时
# 生成时间索引
index = pd.date_range(start=start_date, end=end_date, freq=freq)
# 生成随机销售数据
np.random.seed(0) # 确保结果可重复
sales_data = np.random.randint(1, 300, size=len(index)) # 销售量范围从1到300
# 创建数据框
df = pd.DataFrame({'Sales_Vol': sales_data}, index=index)
df.head() # 显示前几行数据
# 从日期中提取特征
df['Year'] = df.index.year
df['Quarter'] = df.index.quarter
df['Month'] = df.index.month
df['Day of Week'] = df.index.day_name()
df['Is Working Day'] = df.index.weekday < 5 # 假设周一到周五为工作日
df['Time of Day'] = pd.cut(df.index.hour, bins=[0, 6, 12, 18, 24], labels=['Late Night', 'Morning', 'Afternoon', 'Evening'])
df.head() # 显示前几行数据
运行上述代码,时间为"00:00:00"时,"Time of Day"可能会出现空值NAN的情况。那这个时间点我们就特殊标记一下,将他划分到“Late Night”.
df['Time of Day'] = pd.cut(df.index.hour, bins=[0, 6, 12, 18, 24], right=False, labels=['Late Night', 'Morning', 'Afternoon', 'Evening'])
再格外补充一下,如何从时间中提取出公共节假日?
需要提前安装一下holidays库,pip install holidays
from holidays import China
# 使用China类来识别中国的法定节假日
cn_holidays = China()
# 标记时间序列中的节假日
df['Is Holiday'] = df.index.map(lambda x: x in cn_holidays)
print(df)
注意:部分节假日可能会出现调休的情况,holidays库可能不会自动处理这些调休工作日,因此如果需要这些信息,您可能需要手动添加或使用其他方法来获取。
# 计算5小时滚动窗口的平均销售量
df['5-Hour Rolling Average Sales Volume'] = df['Sales_Vol'].rolling(window=5).mean()
由于滚动窗口的计算需要足够的数据点,所以数据框的前几行显示为NaN,直到有足够的数据点来计算平均值。