Python案例如何用Pandas做数据差分

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据差分

  1. 基础差分方法
  2. 实际应用案例
  3. 处理时间序列数据
  4. 高级差分技巧
  5. 数据清洗中的应用
  6. 数据平稳化处理
  7. 完整数据分析案例
  8. 注意事项

我来详细介绍Python中使用Pandas进行数据差分的各种方法。

基础差分方法

一阶差分

import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
    'date': pd.date_range('2023-01-01', periods=10, freq='D'),
    'value': [10, 15, 12, 18, 20, 22, 25, 23, 27, 30]
})
# 一阶差分
df['diff_1'] = df['value'].diff()
print("一阶差分:")
print(df)

多阶差分

# 二阶差分
df['diff_2'] = df['value'].diff().diff()
# 或者使用 periods 参数
df['diff_2_alt'] = df['value'].diff(periods=2)
print("\n多阶差分:")
print(df[['value', 'diff_1', 'diff_2', 'diff_2_alt']])

实际应用案例

股票价格差分分析

# 创建股票数据
dates = pd.date_range('2023-01-01', periods=20, freq='D')
prices = [100, 102, 98, 105, 110, 108, 112, 115, 113, 118,
          120, 119, 122, 125, 123, 128, 130, 127, 132, 135]
stock_df = pd.DataFrame({
    'date': dates,
    'price': prices
})
# 计算收益率
stock_df['daily_return'] = stock_df['price'].pct_change() * 100
stock_df['price_diff'] = stock_df['price'].diff()
print("股票价格差分分析:")
print(stock_df)

销售数据季节性分析

# 创建月度销售数据
sales_data = pd.DataFrame({
    'month': pd.date_range('2022-01-01', periods=24, freq='M'),
    'sales': [100, 120, 150, 200, 180, 160, 140, 130, 110, 90, 80, 85,
              110, 130, 160, 210, 190, 170, 150, 140, 120, 100, 90, 95]
})
# 年同比差分
sales_data['yearly_diff'] = sales_data['sales'].diff(12)
# 季度差分
sales_data['quarterly_diff'] = sales_data['sales'].diff(3)
print("\n销售数据季节性差分:")
print(sales_data[['month', 'sales', 'yearly_diff', 'quarterly_diff']])

处理时间序列数据

使用日期索引进行差分

# 设置日期索引
time_series = pd.Series(
    [10, 15, 12, 18, 20, 22, 25, 23, 27, 30],
    index=pd.date_range('2023-01-01', periods=10, freq='D')
)
# 时间序列差分
ts_diff = time_series.diff()
ts_diff_2 = time_series.diff(2)
print("\n时间序列差分:")
print("原始数据:\n", time_series)
print("\n一阶差分:\n", ts_diff)

高级差分技巧

条件差分

# 创建复杂数据
df_complex = pd.DataFrame({
    'group': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
    'value': [10, 15, 12, 20, 25, 22, 30, 35, 32]
})
# 按组进行差分
df_complex['group_diff'] = df_complex.groupby('group')['value'].diff()
print("\n分组差分:")
print(df_complex)

滚动差分

# 计算滚动平均值与当前值的差分
df_rolling = pd.DataFrame({
    'date': pd.date_range('2023-01-01', periods=15, freq='D'),
    'value': [10, 12, 15, 14, 18, 20, 22, 25, 23, 27, 
              30, 28, 32, 35, 33]
})
# 3天滚动平均值差分
df_rolling['rolling_mean'] = df_rolling['value'].rolling(window=3).mean()
df_rolling['rolling_diff'] = df_rolling['value'] - df_rolling['rolling_mean']
print("\n滚动差分:")
print(df_rolling)

数据清洗中的应用

检测异常值

# 检测数据突变
df_anomaly = pd.DataFrame({
    'timestamp': pd.date_range('2023-01-01', periods=10, freq='H'),
    'sensor_value': [25, 26, 25.5, 26.2, 25.8, 50, 26.1, 25.9, 26.3, 25.7]
})
# 计算差分检测异常
df_anomaly['diff'] = df_anomaly['sensor_value'].diff().abs()
threshold = 3  # 设置阈值
df_anomaly['is_anomaly'] = df_anomaly['diff'] > threshold
print("\n异常检测:")
print(df_anomaly)

数据平稳化处理

对数差分(用于金融数据)

# 创建指数增长数据
volume_data = pd.DataFrame({
    'day': range(1, 21),
    'volume': [100, 110, 125, 140, 160, 180, 210, 240, 275, 310,
               350, 395, 445, 500, 560, 630, 710, 800, 900, 1000]
})
# 对数差分(近似增长率)
volume_data['log_volume'] = np.log(volume_data['volume'])
volume_data['log_diff'] = volume_data['log_volume'].diff()
print("\n对数差分(平稳化):")
print(volume_data[['day', 'volume', 'log_diff']])

完整数据分析案例

综合应用示例

# 创建完整的数据分析流程
np.random.seed(42)
# 生成模拟数据
data = pd.DataFrame({
    'date': pd.date_range('2022-01-01', periods=100, freq='D'),
    'sales': np.random.randint(50, 200, 100) + np.arange(100) * 0.5
})
# 添加一些噪声
data['sales'] = data['sales'] + np.random.normal(0, 5, 100)
# 完整的差分分析
def comprehensive_diff_analysis(df, column):
    """
    全面的差分分析函数
    """
    results = pd.DataFrame()
    results['original'] = df[column]
    results['diff_1'] = df[column].diff()
    results['diff_2'] = df[column].diff().diff()
    results['pct_change'] = df[column].pct_change() * 100
    # 统计信息
    print(f"\n{'='*50}")
    print(f"{column} 差分分析报告")
    print(f"{'='*50}")
    print(f"原始数据统计:")
    print(f"  均值: {results['original'].mean():.2f}")
    print(f"  标准差: {results['original'].std():.2f}")
    print(f"\n一阶差分统计:")
    print(f"  均值: {results['diff_1'].mean():.2f}")
    print(f"  标准差: {results['diff_1'].std():.2f}")
    print(f"\n百分比变化统计:")
    print(f"  均值: {results['pct_change'].mean():.2f}%")
    print(f"  标准差: {results['pct_change'].std():.2f}")
    return results
# 执行分析
analysis_results = comprehensive_diff_analysis(data, 'sales')
print("\n前10行结果:")
print(analysis_results.head(10))

注意事项

  1. 缺失值处理:差分后会引入NaN值,需要适当处理
  2. 数据类型:确保数据是数值类型
  3. 时间序列:对于时间序列数据,确保索引正确
  4. 周期性:考虑数据的周期性来选择差分阶数

这些案例覆盖了Pandas数据差分的常见应用场景,可以根据实际需求选择合适的方法。

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