我想用df.rolling().mean()
计算滚动指数加权平均值。我陷在win_type = 'exponential'
上了。
我尝试了其他* win_type,例如'gaussian'。我认为这与“指数”有点不同。
dfTemp.rolling(window=21, min_periods=10, win_type='gaussian').mean(std=1)
# works fine
但是涉及到“指数”,
dfTemp.rolling(window=21, min_periods=10, win_type='exponential').mean(tau=10)
# ValueError: The 'exponential' window needs one or more parameters -- pass a tuple.
如何使用win_type='exponential'
...谢谢~~~
答案 0 :(得分:3)
我遇到了同样的问题,asked it on Russian SO:
x.rolling(window=(2,10), min_periods=1, win_type='exponential').mean(std=0.1)
您应该将tau值直接传递给window=(2, 10)
参数,其中10
是tau的值。
我希望它会有所帮助!感谢@MaxU
答案 1 :(得分:2)
通过定义内核函数,可以轻松实现任何类型的窗口。
这是一个向后看的指数平均值的例子:
import pandas as pd
import numpy as np
# Kernel function ( backward-looking exponential )
def K(x):
return np.exp(-np.abs(x)) * np.where(x<=0,1,0)
# Exponenatial average function
def exp_average(values):
N = len(values)
exp_weights = list(map(K, np.arange(-N,0) / N ))
return values.dot(exp_weights) / N
# Create a sample DataFrame
df = pd.DataFrame({
'date': [pd.datetime(2020,1,1)]*50 + [pd.datetime(2020,1,2)]*50,
'x' : np.random.randn(100)
})
# Finally, compute the exponenatial moving average using `rolling` and `apply`
df['mu'] = df.groupby(['date'])['x'].rolling(5).apply(exp_average, raw=True).values
df.head(10)
请注意,如果N
是固定的,则可以通过保持权重不变来显着减少执行时间:
N = 10
exp_weights = list(map(K, np.arange(-N,0) / N ))
def exp_average(values):
return values.dot(exp_weights) / N
答案 2 :(得分:0)
简短答案:您应该将tau传递给所应用的函数,例如rolling(d, win_type='exponential').sum(tau=10)
。 请注意,mean
函数未达到预期的指数范围,因此您可能需要使用sum(tau=10)/window_size
来计算指数均值。这是当前版本的熊猫(1.0.5
)的错误。
完整示例:
# To calculate the rolling exponential mean
import numpy as np
import pandas as pd
window_size = 10
tau = 5
a = pd.Series(np.random.rand(100))
rolling_mean_a = a.rolling(window_size, win_type='exponential').sum(tau=tau) / window_size
@ИльяМитусов的答案不正确。使用pandas 1.0.5
,运行以下代码将引发ValueError: exponential window requires tau
:
import pandas as pd
import numpy as np
pd.Series(np.arange(10)).rolling(window=(4, 10), min_periods=1, win_type='exponential').mean(std=0.1)
此代码有很多问题。首先,window=(4, 10)
中的10不是tau
,这将导致错误的答案。其次,exponential
窗口不需要参数std
-仅gaussian
窗口需要。最后,tau
应该提供给mean
(尽管mean
不尊重win_type
)。