Python 使用Pandas计算rolling.mean时,忽略给定列的前面值
以下是我掌握的时间序列数据的一小部分:Python 使用Pandas计算rolling.mean时,忽略给定列的前面值,python,pandas,moving-average,Python,Pandas,Moving Average,以下是我掌握的时间序列数据的一小部分: Date Client Value 01-Sep-2016T ABC 160000 02-Sep-2016T ABC 150000 03-Sep-2016T ABC 190000 04-Sep-2016T ABC 200000 05-Sep-2016T ABC 1400
Date Client Value
01-Sep-2016T ABC 160000
02-Sep-2016T ABC 150000
03-Sep-2016T ABC 190000
04-Sep-2016T ABC 200000
05-Sep-2016T ABC 140000
06-Sep-2016T ABC 120000
07-Sep-2016T ABC 185000
08-Sep-2016T ABC 119000
01-Sep-2016T DEF 200
02-Sep-2016T DEF 100
03-Sep-2016T DEF 150
04-Sep-2016T DEF 10
05-Sep-2016T DEF 5
06-Sep-2016T DEF 160
07-Sep-2016T DEF 150
08-Sep-2016T DEF 3
我创建了一个数据框,如下所示:
dataFrame = pd.read_csv('test_data_02.csv')
dataFrame['Value_MovingAverage'] = dataFrame['Value'].rolling(window=3, min_periods=1, center=False).mean()
然后,我尝试添加值
列的移动平均值,如下所示:
dataFrame = pd.read_csv('test_data_02.csv')
dataFrame['Value_MovingAverage'] = dataFrame['Value'].rolling(window=3, min_periods=1, center=False).mean()
然后,当我调用dataFrame.head(20)
查看结果ValueMovingAverage
列时,我看到:
Date Client Value Value_MovingAverage
0 01-Sep ABC 160000 160000.000000
1 02-Sep ABC 150000 155000.000000
2 03-Sep ABC 190000 166666.666667
3 04-Sep ABC 200000 180000.000000
4 05-Sep ABC 140000 176666.666667
5 06-Sep ABC 120000 153333.333333
6 07-Sep ABC 185000 148333.333333
7 08-Sep ABC 119000 141333.333333
8 01-Sep DEF 200 **101400.000000**
9 02-Sep DEF 100 39766.666667
10 03-Sep DEF 150 150.000000
11 04-Sep DEF 10 86.666667
12 05-Sep DEF 5 55.000000
13 06-Sep DEF 160 58.333333
14 07-Sep DEF 150 105.000000
15 08-Sep DEF 3 104.333333
如我们所见,“DEF”客户端的值\u MovingAverage
受前两个“ABC”客户端的非常高的值的影响。例如,指数#8显示“DEF”的3天移动平均值为101400.000000,因为它使用以下值:
185000
119,000
二百
平均-->101400
我试图让索引#8的值_MovingAverage不显示任何内容(因为客户机“ABC”没有前面的值),而索引#14的值_MovingAverage为58.33333,因为它引用了以下内容:
一百六十
10
5.
平均-->58.33333
我的问题是:
1) 我如何告诉Pandas在计算“DEF”客户机的移动平均值时忽略“ABC”的值(以及整个数据帧中所有其他“客户机”值的移动平均值)?请注意,我有数百个“客户机”值,因此创建不同的帧(每个“客户机”一个),然后应用滚动平均值实际上不是一个选项
2) 如何将移动平均值偏移一行,以便给定行数的平均值不考虑本身
提前谢谢 我为您提供了一个解决方案,它不会直接回答您提出的特定问题,但可能会解决您实际遇到的问题;) 也就是说:熊猫的
groupby
特性
显然,您的datadrame不仅仅是一个简单的时间序列。相反,它是一组时间序列,根据“ABC”、“DEF”等的不同值连接在一起
它看起来像是你知道如何使用熊猫的东西(例如,
滚动
),所以我把它留给你去弄清楚如何使用groupby
,但是如果你不能让它工作,请随时回答更多问题:)更新:
In [41]: df['new'] = (df.groupby('Client', as_index=False)
....: .rolling(3, min_periods=1, center=False)
....: .Value.mean()
....: .reset_index(drop=True))
In [42]: df
Out[42]:
Date Client Value new
0 01-Sep-2016T ABC 160000 160000.000000
1 02-Sep-2016T ABC 150000 155000.000000
2 03-Sep-2016T ABC 190000 166666.666667
3 04-Sep-2016T ABC 200000 180000.000000
4 05-Sep-2016T ABC 140000 176666.666667
5 06-Sep-2016T ABC 120000 153333.333333
6 07-Sep-2016T ABC 185000 148333.333333
7 08-Sep-2016T ABC 119000 141333.333333
8 01-Sep-2016T DEF 200 200.000000
9 02-Sep-2016T DEF 100 150.000000
10 03-Sep-2016T DEF 150 150.000000
11 04-Sep-2016T DEF 10 86.666667
12 05-Sep-2016T DEF 5 55.000000
13 06-Sep-2016T DEF 160 58.333333
14 07-Sep-2016T DEF 150 105.000000
15 08-Sep-2016T DEF 3 104.333333
In [28]: df.groupby('Client').rolling(3, min_periods=1, center=False).mean()
Out[28]:
Date Client Value
Client
ABC 0 01-Sep-2016T ABC 160000.000000
1 02-Sep-2016T ABC 155000.000000
2 03-Sep-2016T ABC 166666.666667
3 04-Sep-2016T ABC 180000.000000
4 05-Sep-2016T ABC 176666.666667
5 06-Sep-2016T ABC 153333.333333
6 07-Sep-2016T ABC 148333.333333
7 08-Sep-2016T ABC 141333.333333
DEF 8 01-Sep-2016T DEF 200.000000
9 02-Sep-2016T DEF 150.000000
10 03-Sep-2016T DEF 150.000000
11 04-Sep-2016T DEF 86.666667
12 05-Sep-2016T DEF 55.000000
13 06-Sep-2016T DEF 58.333333
14 07-Sep-2016T DEF 105.000000
15 08-Sep-2016T DEF 104.333333
旧答案:
In [41]: df['new'] = (df.groupby('Client', as_index=False)
....: .rolling(3, min_periods=1, center=False)
....: .Value.mean()
....: .reset_index(drop=True))
In [42]: df
Out[42]:
Date Client Value new
0 01-Sep-2016T ABC 160000 160000.000000
1 02-Sep-2016T ABC 150000 155000.000000
2 03-Sep-2016T ABC 190000 166666.666667
3 04-Sep-2016T ABC 200000 180000.000000
4 05-Sep-2016T ABC 140000 176666.666667
5 06-Sep-2016T ABC 120000 153333.333333
6 07-Sep-2016T ABC 185000 148333.333333
7 08-Sep-2016T ABC 119000 141333.333333
8 01-Sep-2016T DEF 200 200.000000
9 02-Sep-2016T DEF 100 150.000000
10 03-Sep-2016T DEF 150 150.000000
11 04-Sep-2016T DEF 10 86.666667
12 05-Sep-2016T DEF 5 55.000000
13 06-Sep-2016T DEF 160 58.333333
14 07-Sep-2016T DEF 150 105.000000
15 08-Sep-2016T DEF 3 104.333333
In [28]: df.groupby('Client').rolling(3, min_periods=1, center=False).mean()
Out[28]:
Date Client Value
Client
ABC 0 01-Sep-2016T ABC 160000.000000
1 02-Sep-2016T ABC 155000.000000
2 03-Sep-2016T ABC 166666.666667
3 04-Sep-2016T ABC 180000.000000
4 05-Sep-2016T ABC 176666.666667
5 06-Sep-2016T ABC 153333.333333
6 07-Sep-2016T ABC 148333.333333
7 08-Sep-2016T ABC 141333.333333
DEF 8 01-Sep-2016T DEF 200.000000
9 02-Sep-2016T DEF 150.000000
10 03-Sep-2016T DEF 150.000000
11 04-Sep-2016T DEF 86.666667
12 05-Sep-2016T DEF 55.000000
13 06-Sep-2016T DEF 58.333333
14 07-Sep-2016T DEF 105.000000
15 08-Sep-2016T DEF 104.333333
或:
是的,这就是我想要的。但是,“值”列被移动平均值覆盖(我原本打算将其作为一个新列,因为我仍然需要绘制原始“值”值)。有没有办法将此解决方案应用于新列?第二种方法(
df.groupby('Client',as_index=False)。滚动(3,min_periods=1,center=False)。mean()。重置_index(drop=True)
是我的目标。但是,我如何将其作为一个单独的列(因为我还需要使用绘图中现有的“Value”列)?谢谢。@Equianity,请检查答案中的更新部分是的。谢谢。但是,我们如何“抵消”它,使它不考虑自身?是否可以以某种方式合并.shift()
?@Equianity,您可以发布您想要的输出或打开一个新问题吗?谢谢您的帮助。我刚刚打开了一个新问题: