如何用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
生成的数据示例:
| date | 7 days return |
|---|---|
| 2019-01-04 | 0.780342 |
| 2019-01-05 | 0.7238 |
| 2019-01-06 | 0.02408 |
| ... | ... |
| 2022-01-01 | 0.182522 |
| 2022-01-02 | 0.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))
代码说明
- 分组逻辑:用
df.index.dayofweek将数据按星期几分成7组,每组包含所有每周同一天的数据,正好对应需求中“间隔7天的对应行”。 - 滚动计算:每组内用
rolling(52)取近52个数据点(约一年的周数)计算标准差,transform方法会保留原索引,确保每个日期都有对应的结果。 - min_periods=1:确保数据不足52期时也能计算(比如前51天的结果基于已有数据)。
内容的提问来源于stack exchange,提问作者idleriver
相关产品推荐
相关产品推荐

