如何使每日pandas DataFrame获取与重采样后周度DataFrame相同的数值
如何让日度Pandas DataFrame匹配重采样后的周度数据?
嘿,我来帮你搞定这个问题——你想要让日度价格DataFrame的每一行,都对应上它所在周的周度重采样数值对吧?其实用Pandas的分组变换或者合并操作就能轻松实现,下面是具体的步骤和示例代码:
首先先把你的示例DataFrame用代码还原出来(方便后续操作):
import pandas as pd # 构建你提供的日度数据 data = { 'open': [44.66, 43.56, 43.15, 42.40, 42.50, 43.46, 43.75, 41.60, 42.05, 41.98, 41.87], 'high': [44.75, 43.74, 43.43, 42.70, 43.50, 43.46, 43.75, 42.01, 43.21, 42.48, 42.69], 'low': [43.56, 42.19, 42.45, 41.19, 41.77, 41.94, 40.60, 40.03, 41.67, 41.63, 41.70], 'close': [43.56, 42.93, 42.66, 42.25, 43.26, 43.00, 41.02, 41.90, 41.90, 41.96, 41.80], 'volume': [1000, 2500, 2000, 1500, 200, 5000, 500, 125, 1000, 1200, 800] } # 生成对应日期 dates = pd.DatetimeIndex(['2017-11-01', '2017-11-03', '2017-11-06', '2017-11-07', '2017-11-08', '2017-11-09', '2017-11-10', '2017-11-13', '2017-11-14', '2017-11-16', '2017-11-17']) df = pd.DataFrame(data, index=dates)
方法一:用transform直接生成周度统计列(最简洁)
这种方法会直接在原日度DataFrame上新增列,每个交易日都会带上它所在周的周度聚合值,和单独重采样得到的周度DataFrame数值完全一致:
# 按周分组,计算对应的周度OHLCV df['week_open'] = df['open'].groupby(pd.Grouper(freq='W')).transform('first') # 每周第一个交易日的开盘价 df['week_high'] = df['high'].groupby(pd.Grouper(freq='W')).transform('max') # 每周最高价 df['week_low'] = df['low'].groupby(pd.Grouper(freq='W')).transform('min') # 每周最低价 df['week_close'] = df['close'].groupby(pd.Grouper(freq='W')).transform('last')# 每周最后一个交易日的收盘价 df['week_volume'] = df['volume'].groupby(pd.Grouper(freq='W')).transform('sum')# 每周成交量总和
执行后,你可以查看任意一行的week_*列,它就是该行所在周的周度重采样结果。
方法二:先生成周度DataFrame,再合并回日度数据
如果你需要先单独处理周度数据,再把结果映射回日度,这种方法更灵活:
# 第一步:生成周度重采样DataFrame,用股票数据标准的聚合规则 weekly_df = df.resample('W').agg({ 'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last', 'volume': 'sum' }) # 给周度列重命名,避免和日度列冲突 weekly_df = weekly_df.rename(columns={col: f'week_{col}' for col in weekly_df.columns}) # 第二步:把周度数据合并到日度DataFrame,按周对齐 # 把日度索引和周度索引都转成周周期,用于匹配 df['week_period'] = df.index.to_period('W') weekly_df['week_period'] = weekly_df.index.to_period('W') # 合并数据 df = df.merge(weekly_df, on='week_period', how='left').drop('week_period', axis=1)
重要注意点:调整周的起始日期
Pandas默认的周是周日结束,如果你需要以周一作为一周的开始(比如美股常用的周度统计),只需要把freq参数改成'W-MON'即可,比如:
# 方法一的调整 df['week_open'] = df['open'].groupby(pd.Grouper(freq='W-MON')).transform('first') # 方法二的调整 weekly_df = df.resample('W-MON').agg(...)
这样处理后,你的日度DataFrame就会包含和重采样周度DataFrame完全一致的数值啦!
内容的提问来源于stack exchange,提问作者php-junkie
相关产品推荐
相关产品推荐

