计算熊猫数据帧非连续行的滚动平均值

时间:2019-08-22 00:24:11

标签: python pandas dataframe pandas-groupby exponential

我正在使用5分钟柱线和收盘价的熊猫数据框。我想针对不同时间范围计算滚动EMA。要执行5分钟的ema,这可行:df['close'].ewm(span=10, adjust=False).mean()

但是,滚动20分钟EMA跨度10似乎非常困难。我需要将每分钟分为20分钟,例如9:30、9:50、10:10 ...,然后9:35、9:55、10:15 ...,然后计算此子集上的EMA,最后合并回去。由于这些都是5分钟的小节,因此需要做12个子集。

以另一种方式说,我想在非连续行上计算滚动EMA。使用索引而不是日期,我想要的是EMA,行0,4,8,12 ... 76,然后是行1,5,9,13 ... 77,依此类推。

有更简单的方法吗?

数据框在下面,很抱歉,我无法将其转换为剪切并粘贴到控制台的格式。 json.dumps()说时间戳不能JSON可序列化。

谢谢。

    date    close
0   2019-08-21 09:30:00 292.26
1   2019-08-21 09:35:00 292.31
2   2019-08-21 09:40:00 292.77
3   2019-08-21 09:45:00 292.6
4   2019-08-21 09:50:00 292.63
5   2019-08-21 09:55:00 292.53
6   2019-08-21 10:00:00 292.48
7   2019-08-21 10:05:00 292.34
8   2019-08-21 10:10:00 292.18
9   2019-08-21 10:15:00 292.38
10  2019-08-21 10:20:00 292.4
11  2019-08-21 10:25:00 292.33
12  2019-08-21 10:30:00 292.19
13  2019-08-21 10:35:00 292.06
14  2019-08-21 10:40:00 292.04
15  2019-08-21 10:45:00 292.18
16  2019-08-21 10:50:00 292.32
17  2019-08-21 10:55:00 292.3
18  2019-08-21 11:00:00 292.28
19  2019-08-21 11:05:00 292.57
20  2019-08-21 11:10:00 292.55
21  2019-08-21 11:15:00 292.47
22  2019-08-21 11:20:00 292.47
23  2019-08-21 11:25:00 292.49
24  2019-08-21 11:30:00 292.63
25  2019-08-21 11:35:00 292.76
26  2019-08-21 11:40:00 292.72
27  2019-08-21 11:45:00 292.59
28  2019-08-21 11:50:00 292.55
29  2019-08-21 11:55:00 292.75
30  2019-08-21 12:00:00 292.63
31  2019-08-21 12:05:00 292.57
32  2019-08-21 12:10:00 292.64
33  2019-08-21 12:15:00 292.52
34  2019-08-21 12:20:00 292.43
35  2019-08-21 12:25:00 292.46
36  2019-08-21 12:30:00 292.46
37  2019-08-21 12:35:00 292.46
38  2019-08-21 12:40:00 292.47
39  2019-08-21 12:45:00 292.5
40  2019-08-21 12:50:00 292.64
41  2019-08-21 12:55:00 292.59
42  2019-08-21 13:00:00 292.63
43  2019-08-21 13:05:00 292.64
44  2019-08-21 13:10:00 292.59
45  2019-08-21 13:15:00 292.61
46  2019-08-21 13:20:00 292.61
47  2019-08-21 13:25:00 292.54
48  2019-08-21 13:30:00 292.43
49  2019-08-21 13:35:00 292.48
50  2019-08-21 13:40:00 292.42
51  2019-08-21 13:45:00 292.46
52  2019-08-21 13:50:00 292.4
53  2019-08-21 13:55:00 292.32
54  2019-08-21 14:00:00 292.47
55  2019-08-21 14:05:00 292.37
56  2019-08-21 14:10:00 292.26
57  2019-08-21 14:15:00 292.57
58  2019-08-21 14:20:00 292.45
59  2019-08-21 14:25:00 292.58
60  2019-08-21 14:30:00 292.37
61  2019-08-21 14:35:00 292.05
62  2019-08-21 14:40:00 292.15
63  2019-08-21 14:45:00 291.88
64  2019-08-21 14:50:00 291.89
65  2019-08-21 14:55:00 292.0
66  2019-08-21 15:00:00 291.96
67  2019-08-21 15:05:00 292.15
68  2019-08-21 15:10:00 292.14
69  2019-08-21 15:15:00 292.28
70  2019-08-21 15:20:00 292.23
71  2019-08-21 15:25:00 292.25
72  2019-08-21 15:30:00 292.39
73  2019-08-21 15:35:00 292.36
74  2019-08-21 15:40:00 292.35
75  2019-08-21 15:45:00 292.27
76  2019-08-21 15:50:00 292.38
77  2019-08-21 15:55:00 292.43

1 个答案:

答案 0 :(得分:0)

定义一个分组密钥,然后定义df.groupby(key).rolling()。mean()

例如每4行的滚动平均值

df['mod_4'] = df.index % 4
df['rolling_mean_4'] df.groupby(['mod_4']).mean()

另请参阅https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rolling.html