Pandas DataFrame指定子集滚动标准差实现方案问询
解决DataFrame反向滚动标准差的问题
这问题我之前也碰到过,Pandas的rolling默认是按索引从小到大的方向计算窗口统计,刚好和你的需求(索引0为最新数据,要取当前行+时间更早的14行)反过来,给你两个简单可行的实现方案:
方案1:反转列计算后再反转回来
核心思路是先把ratio_div列的顺序反转,让旧数据在前、新数据在后,这样常规的rolling(window=15)就会计算连续15个旧数据+当前新数据的窗口,最后再把结果反转回原顺序即可:
# 反转ratio_div列,计算滚动标准差,再反转回原顺序 df['SD1'] = df['ratio_div'][::-1].rolling(window=15, min_periods=15).std()[::-1]
df['ratio_div'][::-1]:将列反转,把最旧数据放到第一位,最新数据放到最后一位rolling(window=15, min_periods=15):计算窗口大小为15的滚动标准差,要求必须有15个非NaN值才计算(避免前14行出现无效结果)[::-1]:将计算结果反转,还原到原数据的索引顺序
方案2:利用shift调整滚动结果的位置
另一种思路是先计算正向的滚动标准差,再通过shift把结果移动到对应的位置:
# 先计算正向15行窗口的标准差,再将结果向前移动14位 df['SD1'] = df['ratio_div'].rolling(window=15, min_periods=15).std().shift(-14)
rolling(window=15, min_periods=15).std():计算索引i对应的窗口是i-14到i的标准差(比如索引14对应窗口0-14).shift(-14):将每个位置的结果向前移动14位,这样索引14的结果就会到索引0的位置,刚好对应你需要的“当前行(0)+前14行(1-14)”的标准差
灵活调整说明
如果你的200行数据中,希望最后14行(索引186到199)即使不足15行也计算标准差,可以把min_periods参数改成1,这样会用现有数据计算;如果严格要求必须15行才出结果,保持min_periods=15即可。
内容的提问来源于stack exchange,提问作者Gluons
相关产品推荐
相关产品推荐

