如何用Pandas按地点统计每日均价、标准差及实现周度聚合?
地点-日期维度的价格聚合(每日/周度)
一、每日价格均值&标准差计算(含空值填充)
步骤说明
因为大部分地点没有每日数据,需要先生成每个地点的完整日期序列,再和原始数据合并,最后分组计算聚合值,缺失数据会自动用NaN填充。
代码实现
先确保导入pandas:
import pandas as pd
1. 规范日期格式(修正你的代码)
保留datetime类型更便于后续时间聚合操作:
# 把"Book Date"列转为datetime类型 df['Book Date'] = pd.to_datetime(df['Book Date'])
2. 生成完整的地点-日期组合
# 获取所有唯一地点 all_lanes = df['Lane'].unique() # 获取数据中的最小/最大日期,确定日期范围 min_date = df['Book Date'].min() max_date = df['Book Date'].max() # 生成从最小到最大日期的每日序列 daily_dates = pd.date_range(start=min_date, end=max_date, freq='D') # 生成所有地点+所有日期的笛卡尔积(完整索引) full_index = pd.MultiIndex.from_product( [all_lanes, daily_dates], names=['Lane', 'Book Date'] )
3. 合并原始数据并计算聚合值
# 把原始数据按地点+日期索引,对齐到完整索引(缺失数据自动补NaN) df_full = df.set_index(['Lane', 'Book Date']).reindex(full_index).reset_index() # 按地点+日期分组,计算均值和标准差 daily_agg = df_full.groupby(['Lane', 'Book Date'])['Purchase Price'].agg( daily_mean='mean', daily_std='std' ).reset_index()
运行后daily_agg中,无数据日期对应的daily_mean和daily_std会自动填充为NaN。
二、周度价格均值&标准差计算(含空值填充)
周度聚合逻辑和每日一致,仅需将日期粒度从“天”替换为“周”。
代码实现
方式1:基于完整每日数据生成周度聚合
# 给完整数据添加周标识(这里用每周一作为周起始,可按需调整为W-SUN等) df_full['Week Start'] = df_full['Book Date'].dt.to_period('W-MON').dt.start_time # 按地点+周起始分组计算聚合值 weekly_agg = df_full.groupby(['Lane', 'Week Start'])['Purchase Price'].agg( weekly_mean='mean', weekly_std='std' ).reset_index()
若某周该地点无任何数据,weekly_mean和weekly_std会显示为NaN。
方式2:直接对原始数据做周度聚合(仅保留有数据的周)
如果不需要空值填充,仅计算有数据周的聚合值,可简化为:
weekly_agg_simple = df.groupby( ['Lane', pd.Grouper(key='Book Date', freq='W-MON')] )['Purchase Price'].agg(weekly_mean='mean', weekly_std='std').reset_index()
内容的提问来源于stack exchange,提问作者novicePythonLearner
相关产品推荐
相关产品推荐

