本文目录导读:

我来详细介绍用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或分批处理
扩展统计特别适用于时间序列分析、累计趋势分析和风险监控等场景。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播