pandas 数据框:滚动年初至今累计STD(时间序列)

wxclj1h5  于 2023-02-02  发布在  其他
关注(0)|答案(1)|浏览(185)

我有一个DataFrame,看起来像这样:

daily_return      year month day
date                                        
2018-12-27           NaN      2018    12  27
2018-12-28      1.020245      2018    12  28
2018-12-31      1.000650      2018    12  31
2019-01-02      1.020473      2019    01  02
2019-01-03      1.009129      2019    01  03
...                  ...       ...   ...  ..
2023-01-20      1.001087      2023    01  20
2023-01-23      0.998455      2023    01  23
2023-01-24      1.002491      2023    01  24
2023-01-25      1.004482      2023    01  25
2023-01-26      1.004953      2023    01  26

我想为每个日期(每行)计算daily_return列的年初至今标准差。示例:

  • 对于行“2018-12- 31”,结果将是从“2018-12-01”到“2018-12- 31”的daily_return的标准差:[钠氮,1.020245,1.000650]。
  • 对于行“2019-01- 03”,我们引用的是"2019“年。因此,标准差应仅考虑从”2019-01-01“到当前行日期”2019-01- 03“的值:[一点零二零四七三,一点零零九一二九]
  • 对于行[2023-01-23],结果应为从2023-01-01到2023-01-23的所有daily_returns
  • 对于行[2023-01-24],结果应为从2023-01-01到2023-01-24的所有daily_returns...

我使用以下代码为Month-to-Date cumprod做了类似的工作:

df.groupby(['month', 'year'])['daily_return'].cumprod()

date
2018-12-27         NaN
2018-12-28    1.020245
2018-12-31    1.020909
2019-01-02    1.020473
2019-01-03    1.029789
                ...   
2023-01-20    0.999914
2023-01-23    0.998369
2023-01-24    1.000856
2023-01-25    1.005342
2023-01-26    1.010322

您可以看到它工作正常,因为对于每个日期,它都会给我本月至今的cumprod。
但是,每当我尝试按年分组并计算std时,它只计算全年的std,而不计算每行的年初至今的std

df.groupby(['year'])['daily_return'].std()

year
2018    0.013856
2019    0.007128
2020    0.021325
2021    0.010358
2022    0.009854
2023    0.006444
zpgglvta

zpgglvta1#

如果首先对索引进行排序,使行按正确顺序排列,则可以按年份分组,然后使用expanding窗口并应用.std()函数:

# may need to set index as datetime if it isn't already
df.index = pd.to_datetime(df.index, format="%Y-%m-%d")

# sort the index
df.sort_index(inplace=True)
# calculate YTD standard deviation
df["YTD std"] = df.groupby(df.index.year)['daily_return'].expanding().std().droplevel(0)

df
#Out: 
#            daily_return  year  month  day   YTD std
#date                                                
#2018-12-27           NaN  2018     12   27       NaN
#2018-12-28      1.020245  2018     12   28       NaN
#2018-12-31      1.000650  2018     12   31  0.013856
#2019-01-02      1.020473  2019      1    2       NaN
#2019-01-03      1.009129  2019      1    3  0.008021
#2023-01-20      1.001087  2023      1   20       NaN
#2023-01-23      0.998455  2023      1   23  0.001861
#2023-01-24      1.002491  2023      1   24  0.002049
#2023-01-25      1.004482  2023      1   25  0.002533
#2023-01-26      1.004953  2023      1   26  0.002650

相关问题