Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.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:计算组内的移动平均值_Python_Pandas_Pandas Groupby_Moving Average - Fatal编程技术网

Python:计算组内的移动平均值

Python:计算组内的移动平均值,python,pandas,pandas-groupby,moving-average,Python,Pandas,Pandas Groupby,Moving Average,我有一个包含100个对象的时间序列的数据帧: object period value 1 1 24 1 2 67 ... 1 1000 56 2 1 59 2 2 46 ... 2 1000 64 3 1 54 ... 100 1 451 100 2 153 ... 100 1000

我有一个包含100个对象的时间序列的数据帧:

object  period  value 
1       1       24
1       2       67
...
1       1000    56
2       1       59
2       2       46
...
2       1000    64
3       1       54
...
100     1       451
100     2       153
...
100     1000    21
我想用窗口10计算
列的移动平均值。我想我得做点什么

df.groupby('object').apply(lambda ~calculate MA~) 
然后按对象将此系列合并到原始数据帧?无法理解确切的命令

可以与
转换一起使用

df['moving'] = df.groupby('object')['value'].transform(lambda x: x.rolling(10, 1).mean())
rolling
中的
1
用于最小周期数。

您可以直接在
groupby
对象上使用:

df['moving'] = df.groupby('object').rolling(10)['value'].mean()
使用直接分配给列时,新版本会引发错误,因此请使用:

df['moving'] = df.groupby('object').rolling(10)['value'].mean().reset_index(drop=True)

从@Sandeep Kadapa扩展答案:

df['moving'] = df.groupby('object').rolling(10)['value'].mean().reset_index(drop=True)

reset\u index
的原因是,在
df.groupby
之后,我们得到了一个多级索引,在赋值时,我们将得到错误
TypeError:inserted column的索引与frame index不兼容
创建一个列作为链方法:

(
    df
        .assign(
            column_name = lambda x: 
                x
                    .groupby(['object'])['value']
                    .transform(lambda x: x.rolling(10)
                    .mean())
        )
)

如果您在多个列上分组,则提供的答案可能不会产生所需的结果

以下几点应该可以解决这个问题:

df['moving'] = df.groupby(['col_1', 'col_2', 'col_3']).rolling(10)['value'].mean().droplevel(level=[0,1,2])

这些解决方案假定数据帧以特定方式(按对象和周期)排序。例如,如果数据组织在面板中(按时段和对象),则分配将失败。不考虑排序顺序的一般解决方案如下:

df.loc[:, 'value_sma_10'] = df.groupby(by='object')[['object', 'period']].rolling(window=10, min_periods=1, on='period').mean().reset_index(level='object')['value']

移动平均线的行数会少一些,它们应该分配给哪个时段?这样做比较理想:对于时段1,MA仅等于时段1的值。从周期2开始,MA=(值_1+值_2)/2,依此类推,直到10。10点以后,这是一个正常的移动平均值。我正试图使用pd.rolling_mean(),但没想到是的,太漂亮了!我爱熊猫!这是推荐的方法:我打算用pd.rolling_mean回答,并得到了弃用警告。所以,谢谢你们今天教我一些东西@zipaHow我可以用什么方法计算组内的Bolinger带值?下面的代码给出了一个错误。(BBANDS()返回一个元组(上、中、下)。
df['bb_-up'],df['bb_-mid'],df['bb_-low']=df.groupby('object')['value'].transform(lambda x:talib.BBANDS(x))
Hi,我收到一个错误:
TypeError:插入的列的索引与框架索引不兼容。不知道是什么问题……请您提供一个。@SarahMesser这是因为您在每个组中只有一个值,请检查
对象
是否只有唯一的值,这意味着您计算滚动的每个组中只有一个值,因此您得到的是
NaN的
Oops。我删除了列表理解中的“period”循环,试图简化数据帧并使示例最小化。正如您所说,将其添加回修复了空值。我在mean()和reset_index()之间添加了一个移位(1),因为我不想在计算period-2的平均值时包含period-2的值。。。这似乎通过将多索引中的值从一个“对象”组转移到下一个“对象”组而混淆了值。手动构造的小数据帧似乎也依赖于原始索引。在groupby滚动构造之前,可能需要运行
df.sort_值(by=['object','period'])。重置_索引(drop=True)
,以确保索引对齐。这应该是最重要的答案+1!(.droplevel可替换为.reset_index,顺便说一句)。