假设您有一个包含1000个收盘价的数据框。
您希望在最后90个收盘价格上滚动显示名为compute_var()
的风险计算功能(比如说VaR)。
你会怎么做?我假设有apply()
:
def compute_var(df):
return do_calculations_on(df[-90:])
def compute_rolling_var(self):
self.var = self.closing.apply(compute_var)
问题是.apply
仅将1天的关闭传递给compute_var,而不是数据帧。所以它给出了一个错误。
我找到的唯一可行的解决方案是使用迭代式算法(.iterrow()):我将迭代索引传递给compute_var
并在最后一次执行计算之前裁剪结束数据帧self.closing[:i]
90行,然后通过.loc(i) = computer_var_value
填充df.var数据帧。
我怀疑有更好的方法。
答案 0 :(得分:1)
回答是apply_rolling,由EdChum + min_periods调整
加下划线问题来自输入数据中的一些NaN
值,默认情况下为min_periods=None
,这会在窗口中显示 no NaN
值(这里90天)。
对我来说似乎非常违反直觉,但设置min_periods=1
解决了我的问题。