模块六-数据合并与连接——37. 时间偏移与重采样
2026/5/17 0:36:22 网站建设 项目流程

37. 时间偏移与重采样

1. 概述

时间偏移和重采样是时间序列分析的核心操作:

  • 时间偏移:将数据向前或向后移动(shift、diff、pct_change)
  • 重采样:改变时间序列的频率(resample)
importpandasaspdimportnumpyasnpimportmatplotlib.pyplotasplt# 设置中文字体plt.rcParams['font.sans-serif']=['SimHei','Arial Unicode MS']plt.rcParams['axes.unicode_minus']=False# 创建示例数据np.random.seed(42)dates=pd.date_range('2024-01-01',periods=30,freq='D')df=pd.DataFrame({'日期':dates,'销售额':np.random.randint(100,500,30),'广告费':np.random.randint(50,200,30)})df.set_index('日期',inplace=True)print("原始数据:")print(df.head(10))

2. 时间偏移(shift)

2.1 基本用法

shift将数据向前或向后移动。

# 向后移动(昨天的数据)df['昨日销售额']=df['销售额'].shift(1)print("昨日销售额:")print(df[['销售额','昨日销售额']].head(10))# 向前移动(明天的数据)df['明日销售额']=df['销售额'].shift(-1)print("\n明日销售额:")print(df[['销售额','明日销售额']].head(10))# 移动多期df['7日前销售额']=df['销售额'].shift(7)print("\n7日前销售额:")print(df[['销售额','7日前销售额']].head(15))

3. 差分计算(diff)

3.1 基本用法

diff计算当前值与之前值的差值。

# 一阶差分(日变化)df['日变化']=df['销售额'].diff()print("日销售额变化:")print(df[['销售额','日变化']].head(10))# 多阶差分df['7日变化']=df['销售额'].diff(7)print("\n7日销售额变化:")print(df[['销售额','7日变化']].head(15))

4. 百分比变化(pct_change)

# 日增长率df['日增长率']=df['销售额'].pct_change()*100print("日增长率(%):")print(df[['销售额','日增长率']].head(10))# 周增长率df['周增长率']=df['销售额'].pct_change(7)*100print("\n周增长率(%):")print(df[['销售额','周增长率']].head(15))

5. 重采样(resample)

5.1 降采样(高频→低频)

# 创建分钟级数据np.random.seed(42)minute_dates=pd.date_range('2024-01-01 09:30:00',periods=60,freq='T')minute_data=pd.DataFrame({'价格':100+np.random.randn(60).cumsum(),'成交量':np.random.randint(100,1000,60)},index=minute_dates)print("分钟数据(前10行):")print(minute_data.head(10))# 降采样为小时(取平均值)hourly_mean=minute_data.resample('H').mean()print("\n小时均值:")print(hourly_mean)# 降采样为小时(取最高价)hourly_high=minute_data.resample('H').max()print("\n小时最高价:")print(hourly_high)# 降采样为小时(多种聚合)hourly_agg=minute_data.resample('H').agg({'价格':['first','max','min','last'],'成交量':'sum'})print("\n小时多种聚合:")print(hourly_agg)

5.2 升采样(低频→高频)

# 创建日数据daily_data=pd.DataFrame({'销售额':[100,150,200,180,220]},index=pd.date_range('2024-01-01',periods=5,freq='D'))print("日数据:")print(daily_data)# 升采样为小时hourly_data=daily_data.resample('H').asfreq()print("\n小时数据(升采样):")print(hourly_data.head(10))# 升采样并填充hourly_filled=daily_data.resample('H').ffill()print("\n小时数据(向前填充):")print(hourly_filled.head(10))# 升采样并插值hourly_interp=daily_data.resample('H').interpolate()print("\n小时数据(线性插值):")print(hourly_interp.head(10))

6. 完整示例:销售数据分析

# 创建日销售数据np.random.seed(42)dates=pd.date_range('2024-01-01',periods=90,freq='D')sales=pd.DataFrame({'销售额':10000+np.random.randn(90).cumsum()*100,'广告费':np.random.randint(500,1500,90),'访客数':500+np.random.randn(90).cumsum()*20},index=dates)# 确保数值为正sales['销售额']=sales['销售额'].abs()sales['访客数']=sales['访客数'].abs().astype(int)print("="*60)print("销售数据分析")print("="*60)print("\n原始数据:")print(sales.head(10))# 1. 计算日变化print("\n1. 日销售额变化:")sales['日变化']=sales['销售额'].diff()sales['日增长率']=sales['销售额'].pct_change()*100print(sales[['销售额','日变化','日增长率']].head(10))# 2. 计算周同比print("\n2. 周同比(7天前对比):")sales['周同比']=(sales['销售额']-sales['销售额'].shift(7))/sales['销售额'].shift(7)*100print(sales[['销售额','周同比']].head(15))# 3. 移动平均线print("\n3. 移动平均:")sales['MA7']=sales['销售额'].rolling(7).mean()sales['MA30']=sales['销售额'].rolling(30).mean()print(sales[['销售额','MA7','MA30']].head(15))# 4. 月度汇总print("\n4. 月度销售汇总:")monthly=sales.resample('M').agg({'销售额':['sum','mean','max'],'广告费':'sum','访客数':'mean'}).round(2)print(monthly)# 5. 周度汇总print("\n5. 周度销售汇总:")weekly=sales.resample('W').agg({'销售额':'sum','广告费':'sum'})print(weekly.head())# 6. 广告效果分析(滞后相关性)print("\n6. 广告滞后效果:")forlagin[0,1,2,3,7]:iflag==0:corr=sales['广告费'].corr(sales['销售额'])else:corr=sales['广告费'].shift(lag).corr(sales['销售额'])print(f"广告滞后{lag}天与销售额的相关性:{corr:.3f}")

7. shift vs diff vs pct_change 对比

方法公式用途
shift(n)x_t = x_{t-n}获取历史值
diff(n)x_t - x_{t-n}计算绝对变化
pct_change(n)(x_t - x_{t-n}) / x_{t-n}计算相对变化
# 对比示例test=pd.Series([10,20,30,40,50])print("原始:",test.values)print("shift(1):",test.shift(1).values)print("diff(1):",test.diff(1).values)print("pct_change(1):",test.pct_change(1).values)

8. 重采样方法总结

方法说明示例
mean()平均值df.resample('M').mean()
sum()求和df.resample('M').sum()
max()最大值df.resample('M').max()
min()最小值df.resample('M').min()
first()第一个值df.resample('M').first()
last()最后一个值df.resample('M').last()
ohlc()OHLC(开高低收)df.resample('M').ohlc()
asfreq()仅改变频率df.resample('H').asfreq()
ffill()向前填充df.resample('H').ffill()
bfill()向后填充df.resample('H').bfill()
interpolate()线性插值df.resample('H').interpolate()

9. 总结

操作方法示例
数据移位shift(n)df['col'].shift(1)
一阶差分diff()df['col'].diff()
百分比变化pct_change()df['col'].pct_change()
降采样resample('M').mean()df.resample('M').mean()
升采样resample('H').asfreq()df.resample('H').asfreq()
升采样+填充resample('H').ffill()df.resample('H').ffill()
多聚合resample('M').agg()df.resample('M').agg({'A':'sum','B':'mean'})

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询