Python案例如何用Pandas做数据滞后

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据滞后

  1. 基础滞后操作
  2. 多期滞后
  3. 时间序列滞后
  4. 分组滞后
  5. 金融数据滞后计算
  6. 实际案例:销售预测特征工程
  7. 差分运算
  8. 自定义滞后函数
  9. 处理多列滞后
  10. 实际应用:异常检测

我来详细介绍如何使用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中数据滞后的主要应用场景,重要提示:

  1. 缺失值处理:滞后操作会产生NaN值,需要适当处理
  2. 索引对齐:确保数据按时间顺序排序
  3. 性能考虑:大数据集使用shift()比循环更高效
  4. 时间频率:使用freq参数进行时间频率滞后

需要我给某个具体案例提供更详细的实现吗?

抱歉,评论功能暂时关闭!