You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas每日计算近一年隔7行取数的标准差?

问题:每日计算间隔7天的近一年数据标准差

原始数据生成代码

import pandas as pd
import datetime
import random
df = pd.DataFrame(columns=["date", "7 days return"])
date = datetime.datetime.strptime("2019-01-04", '%Y-%m-%d')
for i in range(365*3):
    df = df.append({"date": date + datetime.timedelta(i), "7 days return":random.uniform(0,1)}, ignore_index=True)
df

生成的数据示例:

date7 days return
2019-01-040.780342
2019-01-050.7238
2019-01-060.02408
......
2022-01-010.182522
2022-01-020.612269

需求说明

计算每日对应的近一年(365天范围内)数据的标准差,但仅选取间隔7天的对应行:

  • 计算2022-01-02的标准差时,取2022-01-02、2021-12-26、2021-12-19...等间隔7天的行
  • 计算2022-01-01的标准差时,取2022-01-01、2021-12-25、2021-12-18...等对应间隔行

现有代码问题

a=[]
for i in range(0,len(df),7):
    a.append(i)
Volatility1Y=df.iloc[a].transform(lambda x:x.rolling(52).std())

仅能输出每7行一次的结果,无法覆盖所有日期的计算需求。

解决方案

通过按星期几分组,对每组单独计算滚动标准差,实现每日结果输出:

优化后的代码

import pandas as pd
import random

# 先优化数据生成(更高效)
dates = pd.date_range(start="2019-01-04", periods=365*3)
df = pd.DataFrame({
    "date": dates,
    "7 days return": [random.uniform(0, 1) for _ in range(len(dates))]
}).set_index("date")  # 将date设为索引,方便分组

# 按星期几分组(0=周一,6=周日),每组对应每周同一天的数据
grouped = df.groupby(df.index.dayofweek)["7 days return"]

# 对每组计算滚动52期(约一年)的标准差,合并回原DataFrame
df["1Y Volatility (7-day interval)"] = grouped.transform(
    lambda x: x.rolling(window=52, min_periods=1).std()
)

# 查看结果示例
print(df.tail(10))

代码说明

  1. 分组逻辑:用df.index.dayofweek将数据按星期几分成7组,每组包含所有每周同一天的数据,正好对应需求中“间隔7天的对应行”。
  2. 滚动计算:每组内用rolling(52)取近52个数据点(约一年的周数)计算标准差,transform方法会保留原索引,确保每个日期都有对应的结果。
  3. min_periods=1:确保数据不足52期时也能计算(比如前51天的结果基于已有数据)。

内容的提问来源于stack exchange,提问作者idleriver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:25:41