[英]Find moving average of the smallest n values in m sized window
我有这样的个人股票价值数据:
UserId Stock Value Time
1 APL 20 '2019-01-01'
1 MCR 40 '2019-01-01'
1 ADX 60 '2019-01-01'
3 AGL 10 '2019-01-01'
...
我必须按用户分组,对于每只股票 x,我必须在股票 x 之前找到该用户最近 20 只股票中 10 只最有价值股票的价值的平均值。 因此,我首先按 userId 分组,然后遍历每只股票 x 执行以下操作:选择用户在股票 x 之前最近的 20 只股票,进一步从该窗口中选择 10 只最有价值的股票,取平均值并将其添加到股票 x 的新列。 我的数据集将如下所示:
UserId Stock Value Time MovingAverage
1 APL 20 '2019-01-01' 20
1 MCR 40 '2019-01-01' 30
1 ADX 60 '2019-01-01' 40
3 AGL 10 '2019-01-01' 10
...
到目前为止,我一直在尝试在 Python 中使用滚动,如下所示:
df = df.sort_values(['userId','time'], ascending=['true','false'])
df['roll'] = df.groupby('userId')['Value'].transform(lambda x: x.rolling(20,1).mean())
我不知道如何获得窗口中 10 个最高值的平均值! 我并不反对使用滚压以外的其他技术,这似乎是最流行的方法。
另一个问题是,某些股票之前的股票数量将少于 20 只,但我认为使用滚动 (20,1) 可以缓解该问题。 但是,在少于 10 只股票的情况下,例如 8 只股票,我只需要获得最后 8 只股票的平均值。
弄清楚了。 发帖以防其他人处于类似情况。 我定义了自己的函数,然后简单地使用了rolling.apply()。 最终变得相当简单。
首先,我定义了执行上述帖子中描述的行为的函数。
def gm(arr):
if (arr.size > 10):
x = np.partition(arr, 9).mean()
else:
x = arr.mean()
return x
然后,rolling.apply() 发挥了它的魔力:
newcol = df.groupby('userId')['value'].rolling(20,1).apply(lambda x: gm(x), raw=True)
df['roll'] = newcol.reset_index(level=0, drop=True)
我仍然不确定最后的索引,但结果似乎是我想要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.