本文目录导读:

我来详细介绍如何使用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参数进行时间频率滞后
需要我给某个具体案例提供更详细的实现吗?
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播