我有这样的个人股票价值的数据:
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只,但我认为使用rolling(20,1)可以缓解这个问题。然而,在少于10只股票的情况下,例如8只股票,我只需要得到最后8只股票的平均值。
发布于 2019-12-07 02:29:37
我想通了。发帖,以防其他人遇到类似的情况。我定义了自己的函数,然后简单地使用了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)我仍然不确定最后的索引,但结果似乎是我想要的。
https://stackoverflow.com/questions/59183946
复制相似问题