Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在m大小的窗口中查找最小n值的移动平均值_Python_Pandas_Window Functions_Rolling Computation - Fatal编程技术网

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

Python 在m大小的窗口中查找最小n值的移动平均值,python,pandas,window-functions,rolling-computation,Python,Pandas,Window Functions,Rolling Computation,我有如下关于个人股票价值的数据: 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,我必须找到该用户最近20支股票中10支最有价值股票在股票x之前的平均价值。因此,我首先按userId分组,然后遍历每个股

我有如下关于个人股票价值的数据:

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,我必须找到该用户最近20支股票中10支最有价值股票在股票x之前的平均价值。因此,我首先按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中使用rolling,如下所示:

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)

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

我认为这有点接近正确的方向
希望得到任何反馈
newcol=df.groupby('userId')['value'].rolling(20,1).apply(lambda x:np.partition(x,10).mean())
df['roll']=newcol.reset_index(level=0,drop=True)