本文目录导读:

我来详细介绍用Pandas做数据扩展统计的常用方法和案例。
基础扩展统计方法
1 使用expanding()函数
import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
'日期': pd.date_range('2024-01-01', periods=10, freq='D'),
'销售额': [100, 150, 130, 200, 180, 250, 210, 280, 300, 350]
})
# 扩展统计
df['累计销售额'] = df['销售额'].expanding().sum()
df['移动平均'] = df['销售额'].expanding().mean()
df['最大值'] = df['销售额'].expanding().max()
df['最小值'] = df['销售额'].expanding().min()
df['标准差'] = df['销售额'].expanding().std()
print(df)
2 常见的扩展统计函数
# 创建更复杂的示例数据
np.random.seed(42)
df = pd.DataFrame({
'group': ['A'] * 5 + ['B'] * 5,
'value': np.random.randn(10) * 10 + 50
})
# 多种扩展统计
df['扩展求和'] = df.groupby('group')['value'].expanding().sum().reset_index(0, drop=True)
df['扩展均值'] = df.groupby('group')['value'].expanding().mean().reset_index(0, drop=True)
df['扩展中位数'] = df.groupby('group')['value'].expanding().median().reset_index(0, drop=True)
df['扩展计数'] = df.groupby('group')['value'].expanding().count().reset_index(0, drop=True)
print(df)
实际业务案例
案例1:股票价格技术分析
# 股票价格数据扩展统计
import yfinance as yf
# 获取股票数据
stock = yf.download('AAPL', start='2024-01-01', end='2024-03-01')
# 扩展统计用于技术分析
stock['扩展最高价'] = stock['High'].expanding().max()
stock['扩展最低价'] = stock['Low'].expanding().min()
stock['扩展均值'] = stock['Close'].expanding().mean()
stock['价格范围'] = stock['扩展最高价'] - stock['扩展最低价']
# 计算累计收益率
stock['日收益率'] = stock['Close'].pct_change()
stock['累计收益率'] = (1 + stock['日收益率']).expanding().apply(lambda x: x.prod()) - 1
print(stock[['Close', '扩展最高价', '扩展最低价', '累计收益率']].tail())
案例2:销售数据分析
# 销售数据扩展统计
sales_data = pd.DataFrame({
'日期': pd.date_range('2024-01-01', periods=30, freq='D'),
'产品A': np.random.randint(50, 200, 30),
'产品B': np.random.randint(30, 150, 30),
'产品C': np.random.randint(20, 100, 30)
})
# 计算每个产品的累计销售
for product in ['产品A', '产品B', '产品C']:
sales_data[f'{product}_累计'] = sales_data[product].expanding().sum()
sales_data[f'{product}_增长率'] = sales_data[product].pct_change().expanding().mean()
# 计算总销售额的扩展统计
sales_data['总销售额'] = sales_data[['产品A', '产品B', '产品C']].sum(axis=1)
sales_data['日均销售'] = sales_data['总销售额'].expanding().mean()
sales_data['销售趋势'] = sales_data['总销售额'].expanding().apply(
lambda x: np.polyfit(range(len(x)), x, 1)[0] if len(x) > 1 else 0
)
print(sales_data.tail(10))
高级扩展统计应用
1 自定义扩展函数
def custom_expanding_stats(series, window):
"""自定义扩展统计函数"""
def _calc_stats(data):
if len(data) < window:
return pd.Series([np.nan] * 4)
return pd.Series([
data.mean(),
data.std(),
data.skew(), # 偏度
data.kurt() # 峰度
])
return series.expanding().apply(
lambda x: _calc_stats(x) if len(x) >= window else pd.Series([np.nan] * 4)
)
# 应用自定义函数
df = pd.DataFrame({'value': np.random.randn(100)})
stats_result = df['value'].expanding(10).apply(
lambda x: pd.Series({
'mean': x.mean(),
'std': x.std(),
'skew': x.skew(),
'kurt': x.kurt()
})
)
print(stats_result.head(20))
2 条件扩展统计
# 条件扩展统计
df = pd.DataFrame({
'日期': pd.date_range('2024-01-01', periods=20, freq='D'),
'销售额': np.random.randint(100, 500, 20),
'目标': 300,
'达到目标': np.random.choice([True, False], 20, p=[0.6, 0.4])
})
# 条件累计统计
df['达标天数'] = df['达到目标'].expanding().sum()
df['达标率'] = df['达到目标'].expanding().mean()
df['超过目标平均'] = df.apply(
lambda row: row['销售额'] - row['目标'], axis=1
).expanding().mean()
# 按条件分组统计
df['超额累计'] = df.groupby(df['达到目标'])['销售额'].expanding().sum().reset_index(0, drop=True)
print(df)
性能优化技巧
# 大规模数据的扩展统计优化
def optimized_expanding_stats(data, window_size=5):
"""优化的扩展统计计算"""
# 使用numpy进行加速
values = data.values
n = len(values)
# 预分配结果数组
results = np.zeros(n)
# 使用向量化操作
for i in range(n):
if i < window_size - 1:
results[i] = np.nan
else:
window_data = values[max(0, i-window_size+1):i+1]
results[i] = np.mean(window_data)
return results
# 大数据示例
large_df = pd.DataFrame({
'value': np.random.randn(100000)
})
%timeit large_df['value'].expanding().mean() # Pandas原生方法
%timeit optimized_expanding_stats(large_df['value']) # 优化方法
可视化扩展统计结果
import matplotlib.pyplot as plt
# 创建可视化
df = pd.DataFrame({
'日期': pd.date_range('2024-01-01', periods=50, freq='D'),
'值': np.random.randn(50).cumsum() + 100
})
# 计算扩展统计
df['扩展均值'] = df['值'].expanding().mean()
df['扩展上限'] = df['值'].expanding().mean() + df['值'].expanding().std()
df['扩展下限'] = df['值'].expanding().mean() - df['值'].expanding().std()
# 绘图
plt.figure(figsize=(12, 6))
plt.plot(df['日期'], df['值'], label='原始数据', alpha=0.6)
plt.plot(df['日期'], df['扩展均值'], label='扩展均值', color='red')
plt.fill_between(df['日期'], df['扩展下限'], df['扩展上限'],
alpha=0.3, color='gray', label='±1标准差')
plt.xlabel('日期')
plt.ylabel('值')'扩展统计可视化')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
Pandas的扩展统计功能强大且灵活:
- 基础操作:使用
expanding()配合sum、mean、std等函数 - 分组扩展:结合
groupby()进行分组统计 - 自定义函数:通过
apply()实现复杂统计逻辑 - 性能优化:大数据量时考虑使用numpy或分批处理
扩展统计特别适用于时间序列分析、累计趋势分析和风险监控等场景。