本文目录导读:

我来详细介绍如何使用Pandas进行数据滞后(Lag)操作,包含多个实用案例。
基础滞后操作
import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=10, freq='D'),
'value': [100, 110, 120, 115, 130, 125, 140, 135, 150, 145]
})
print("原始数据:")
print(df)
# 基础滞后1期
df['value_lag1'] = df['value'].shift(1)
print("\n滞后1期:")
print(df)
输出:
date value
0 2024-01-01 100
1 2024-01-02 110
...
date value value_lag1
0 2024-01-01 100 NaN
1 2024-01-02 110 100.0
2 2024-01-03 120 110.0
多期滞后
# 创建更完整的数据
data = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=10, freq='D'),
'sales': [100, 110, 120, 115, 130, 125, 140, 135, 150, 145]
})
# 多期滞后
data['lag1'] = data['sales'].shift(1)
data['lag2'] = data['sales'].shift(2)
data['lag3'] = data['sales'].shift(3)
print("多期滞后:")
print(data)
时间序列滞后
# 设置日期索引
df_ts = data.set_index('date')
# 使用时间频率的滞后
df_ts['lag_1day'] = df_ts['sales'].shift(1, freq='D')
df_ts['lag_2days'] = df_ts['sales'].shift(2, freq='D')
print("\n时间序列滞后:")
print(df_ts)
分组滞后
# 创建分组数据
df_group = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=12, freq='M'),
'group': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C'],
'value': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]
})
# 按组滞后
df_group['value_lag'] = df_group.groupby('group')['value'].shift(1)
print("分组滞后:")
print(df_group)
金融数据滞后计算
# 模拟股票数据
stock_data = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=20, freq='D'),
'close': [100, 102, 101, 103, 105, 104, 106, 108, 107, 109,
110, 112, 111, 113, 115, 114, 116, 118, 117, 119]
})
# 计算收益率
stock_data['return'] = stock_data['close'].pct_change()
# 滞后收益率用于预测
for i in [1, 2, 3]:
stock_data[f'return_lag{i}'] = stock_data['return'].shift(i)
# 计算移动平均
stock_data['ma_5'] = stock_data['close'].rolling(window=5).mean()
print("金融数据滞后:")
print(stock_data.tail(10))
实际案例:销售预测特征工程
# 创建销售数据
sales_data = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=30, freq='D'),
'sales': np.random.randint(100, 200, 30),
'promotion': np.random.choice([0, 1], 30, p=[0.7, 0.3])
})
# 滞后特征
lag_features = []
for i in [1, 2, 3, 7]:
sales_data[f'sales_lag_{i}'] = sales_data['sales'].shift(i)
lag_features.append(f'sales_lag_{i}')
# 滚动统计特征
sales_data['sales_ma_3'] = sales_data['sales'].rolling(3).mean()
sales_data['sales_ma_7'] = sales_data['sales'].rolling(7).mean()
sales_data['sales_std_3'] = sales_data['sales'].rolling(3).std()
# 同比比较(周同比)
sales_data['sales_lag_7_diff'] = sales_data['sales'] - sales_data['sales_lag_7']
# 处理缺失值
sales_data = sales_data.dropna()
print("销售预测特征:")
print(sales_data.head(10))
差分运算
# 创建非平稳数据
non_stationary = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=20, freq='D'),
'value': [100, 102, 105, 109, 114, 120, 127, 135, 144, 154,
165, 177, 190, 204, 219, 235, 252, 270, 289, 309]
})
# 一阶差分
non_stationary['diff_1'] = non_stationary['value'].diff(1)
# 二阶差分
non_stationary['diff_2'] = non_stationary['value'].diff(2)
# 季节性差分(周期为7)
non_stationary['diff_seasonal'] = non_stationary['value'].diff(7)
print("差分运算:")
print(non_stationary)
自定义滞后函数
def create_lag_features(df, column, lags=[1, 2, 3], prefix='lag'):
"""
创建多个滞后特征
"""
df_lagged = df.copy()
for lag in lags:
df_lagged[f'{prefix}_{lag}'] = df[column].shift(lag)
return df_lagged
# 使用自定义函数
custom_lag = create_lag_features(
df,
'value',
lags=[1, 2, 3, 5, 7],
prefix='sales_lag'
)
print("自定义滞后特征:")
print(custom_lag)
处理多列滞后
# 多列数据
multi_col = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=10, freq='D'),
'price': [100, 102, 101, 103, 105, 104, 106, 108, 107, 109],
'volume': [1000, 1500, 1200, 1800, 2000, 1600, 1900, 2200, 1700, 2100],
'high': [105, 104, 103, 106, 108, 107, 109, 111, 110, 112]
})
# 对多列进行滞后
for col in ['price', 'volume']:
for i in [1, 2]:
multi_col[f'{col}_lag_{i}'] = multi_col[col].shift(i)
print("多列滞后:")
print(multi_col)
实际应用:异常检测
# 创建带异常的数据
np.random.seed(42)
anomaly_data = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=30, freq='D'),
'value': np.random.normal(100, 10, 30)
})
# 添加异常值
anomaly_data.loc[10, 'value'] = 200
anomaly_data.loc[15, 'value'] = 50
# 计算滞后差异
anomaly_data['lag_1'] = anomaly_data['value'].shift(1)
anomaly_data['diff_from_lag'] = anomaly_data['value'] - anomaly_data['lag_1']
# 标记异常
threshold = 3 * anomaly_data['value'].std()
anomaly_data['is_anomaly'] = np.abs(anomaly_data['diff_from_lag']) > threshold
print("异常检测结果:")
print(anomaly_data[anomaly_data['is_anomaly']])
这些案例覆盖了Pandas中数据滞后的主要应用场景,重要提示:
- 缺失值处理:滞后操作会产生NaN值,需要适当处理
- 索引对齐:确保数据按时间顺序排序
- 性能考虑:大数据集使用
shift()比循环更高效 - 时间频率:使用
freq参数进行时间频率滞后
需要我给某个具体案例提供更详细的实现吗?