在滚动 window 上对 pandas 数据框应用自定义函数
apply custom function on pandas dataframe on a rolling window
假设您有一个包含 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 数据框
我怀疑有更好的方法。
答案是 apply_rolling EdChum + min_periods 调整
下划线
问题来自输入数据中的几个 NaN
值,默认情况下 min_periods=None
,其反应好像 没有 NaN
值在您的 window 中是允许的(此处为 90 天)。
对我来说似乎非常违反直觉,但设置 min_periods=1
解决了我的问题。
假设您有一个包含 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
.
我怀疑有更好的方法。
答案是 apply_rolling EdChum + min_periods 调整
下划线问题来自输入数据中的几个 NaN
值,默认情况下 min_periods=None
,其反应好像 没有 NaN
值在您的 window 中是允许的(此处为 90 天)。
对我来说似乎非常违反直觉,但设置 min_periods=1
解决了我的问题。