首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在m大小的窗口中查找最小n值的移动平均值

在m大小的窗口中查找最小n值的移动平均值
EN

Stack Overflow用户
提问于 2019-12-05 04:08:55
回答 1查看 62关注 0票数 0

我有这样的个人股票价值的数据:

代码语言:javascript
复制
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的新列中。我的数据集如下所示:

代码语言:javascript
复制
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中使用滚动,如下所示:

代码语言:javascript
复制
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只股票的平均值。

EN

回答 1

Stack Overflow用户

发布于 2019-12-07 02:29:37

我想通了。发帖,以防其他人遇到类似的情况。我定义了自己的函数,然后简单地使用了rolling.apply()。最终变得相当直白。

首先,我定义了执行上面帖子中描述的行为的函数。

代码语言:javascript
复制
def gm(arr):
    if (arr.size > 10):
        x = np.partition(arr, 9).mean()
    else:
        x = arr.mean()
    return x

然后,rolling.apply()发挥了它的魔力:

代码语言:javascript
复制
newcol = df.groupby('userId')['value'].rolling(20,1).apply(lambda x: gm(x), raw=True)
df['roll'] = newcol.reset_index(level=0, drop=True)

我仍然不确定最后的索引,但结果似乎是我想要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59183946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档