時間序列數據的主要特征是它們的時間索引,這為數據提供了明確的順序。這種順序使得我們可以分析隨時間的變化趨勢、周期性和季節(jié)性模式,以及突發(fā)事件的影響。為了充分利用時間序列數據,我們通常需要從時間索引中提取多種特征:
時間單位:如年、季度、月、周、日、小時等。
日期屬性:如是否為月末、季末、年末等。
星期和時間段:如星期幾、是否為工作日、時間段(早上、下午、傍晚、深夜)等。
節(jié)假日:如公共節(jié)假日、特殊事件等。
移動窗口統(tǒng)計:如過去幾小時、幾天、幾個月的平均值、中位數、方差等。
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
# 創(chuàng)建數據框
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'])
再格外補充一下,如何從時間中提取出公共節(jié)假日?
需要提前安裝一下holidays庫,pip install holidays
from holidays import China
# 使用China類來識別中國的法定節(jié)假日
cn_holidays = China()
# 標記時間序列中的節(jié)假日
df['Is Holiday'] = df.index.map(lambda x: x in cn_holidays)
print(df)
注意:部分節(jié)假日可能會出現調休的情況,holidays庫可能不會自動處理這些調休工作日,因此如果需要這些信息,您可能需要手動添加或使用其他方法來獲取。
# 計算5小時滾動窗口的平均銷售量
df['5-Hour Rolling Average Sales Volume'] = df['Sales_Vol'].rolling(window=5).mean()
由于滾動窗口的計算需要足夠的數據點,所以數據框的前幾行顯示為NaN,直到有足夠的數據點來計算平均值。