- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找一种方法来获得每一行的加权平均值,其中计算出的权重根据所有先前的值减半(并且随着先前值的增加对每一行继续)。
所以像 Out[1) 这样的输出应该看起来像 Out[2]:
权重应该从 1/1 到 1/2 到 1/3 到 1/4 到 1/5...等等,这取决于之前的观察数量。
>> Out[1]:
B
0 1
1 2
2 5
3 3
Out[2]:
B
0 1
1 1.66
2 3.455
3 3.080
# Where row 1 is calculated as: (2*1/1 + 1*1/2)/(1/1 + 1/2) = 1.66,
# and row 2 as: (5*1/1 + 2*1/2 + 1*1/3)/(1/1 + 1/2 + 1/3) = 3.455,
# row 3 as: (3*1/1 + 5*1/2 + 2*1/3 + 1*1/4)/(1/1 + 1/2 + 1/3 + 1/4) = 3.080,
# ... and that way keeping forward depending on how much observations I have.
是否可以修改 pandas.ewm() 函数以获得解决方案,因为它具有类似的方法?我只是想不通如何根据之前的所有行为每一行设置权重。
也许有人能够将其转换为使用 Python 的代码?
最佳答案
您不能使用 pandas EWM
函数执行此操作。
这是因为你无法表示几何级数
S_1 = 1 + 1/2 + 1/3 + ...
在表格中
S_2 = 1 + (1 - alpha) + (1 - alpha)**2 + ...
这应该让你得到你想要的东西
import numpy as np
def rolling_mean_harmonic(x: np.ndarray) -> np.ndarray:
"""
Calculates the rolling mean using harmonic series weightings
along the first dimension of ``x``
Example:
>>> rolling_mean_harmonic(np.array([1, 2, 5, 5]))
array([1. , 1.66666667, 3.45454545, 3.08 ])
"""
out = np.empty(x.shape, dtype=np.float64)
h = (1/np.arange(1, len(x) + 1))
h_cumsum = h.cumsum()
for i in range(x.shape[0]):
out[i] = (x[:i + 1] * h[:i + 1][::-1]).sum() / h_cumsum[i]
return out
如果速度是一个问题,上面的代码可以很容易地改进并与 Numba njit + prange 并行化
编辑...
我尝试使用 numba,发现并行实际上没有加速:
import numpy as np
import numba as nb
nb.njit('float64[:](float64[:])', nogil=True, fastmath=True)
def rolling_mean_harmonic_nb_noparr(x: np.ndarray) -> np.ndarray:
"""
Calculates the rolling mean using harmonic series weightings
Example:
>>> rolling_mean_harmonic(np.array([1, 2, 5, 5], dtype=float))
array([1. , 1.66666667, 3.45454545, 3.08 ])
"""
out = np.empty_like(x)
h = (1/np.arange(1, len(x) + 1))
h_cumsum = h.cumsum()
for i in range(x.shape[0]):
out[i] = (x[:i + 1] * h[:i + 1][::-1]).sum() / h_cumsum[i]
return out
nb.njit('float64[:](float64[:])', parallel=True, nogil=True, fastmath=True)
def rolling_mean_harmonic_nb(x: np.ndarray) -> np.ndarray:
"""
Calculates the rolling mean using harmonic series weightings
Example:
>>> rolling_mean_harmonic(np.array([1, 2, 5, 5], dtype=float))
array([1. , 1.66666667, 3.45454545, 3.08 ])
"""
out = np.empty_like(x)
h = (1/np.arange(1, len(x) + 1))
h_cumsum = h.cumsum()
for i in nb.prange(x.shape[0]):
out[i] = (x[:i + 1] * h[:i + 1][::-1]).sum() / h_cumsum[i]
return out
关于python - 排名逆权重类似于 pandas.ewm(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66051964/
我正在寻找一种方法来获得每一行的加权平均值,其中计算出的权重根据所有先前的值减半(并且随着先前值的增加对每一行继续)。 所以像 Out[1) 这样的输出应该看起来像 Out[2]: 权重应该从 1/1
我已经标记了事件(时间序列)数据,其中事件以给定标签的随机间隔发生。我想计算组内ewma并将其作为新列“X1_EWMA”添加到数据帧中。这是到目前为止的代码: import pandas as pd
当尝试从数据框中的金融数据计算指数移动平均线 (EMA) 时,Pandas 的 ewm 方法似乎不正确。 以下链接很好地解释了基础知识: http://stockcharts.com/school/d
我正在尝试使用Pandas ewm function计算指数加权移动平均线。然而我注意到信息似乎贯穿了你的整个时间序列。这意味着每个数据点的 MA 取决于不同数量的先前数据点。因此,每个数据点的 ew
是否有 ewm 和滚动方法的参数不填写 NA? >>> A = pd.Series([1,2,3,4,np.nan,5,6]) >>> A 0 1.0 1 2.0 2 3.0 3
我正在尝试验证 pandas 的 ewm.std 计算,以便我可以对我的代码实现一步更新。这是代码问题的完整描述。 mrt = pd.Series(np.random.randn(1000)) N =
我正在尝试构建一个指数移动平均算法,它产生与 Pandas 相同的输出 ewm()功能。特别是,我正在尝试实现这种方法: 下面的代码可以正常工作,直到移动平均窗口开始超出初始数据集,此时我开始得到与
假设我有一个如下所示的数据框 import pandas as pd data = {'team': ['team1','team1','team1','team1','team1','team1',
我有这个数据帧 ddd = pd.DataFrame({'day':['m','t','m','t','m','t','m','t'] ,'val':[15,2
我正在尝试运行以下代码,但出现错误。 line 43, in ups_avg = pd.ewm(ups, span=RSI_N)[-1] AttributeError: module 'pandas
关于新的 .rolling 和 .ewm 方法。我正在使用 Pandas 0.19.0。 >>> df = pd.DataFrame({'A' : [1,2,np.nan, 3, 4, 5], 'B'
如何在 NumPy 中获得指数加权移动平均线,就像 pandas 中的以下内容一样? import pandas as pd import pandas_datareader as pdr from
我是一名优秀的程序员,十分优秀!