用数据绘制移动平均值

时间:2020-08-05 18:31:52

标签: python pandas matplotlib

我正在尝试计算和绘制移动平均线以及从以下位置计算出的数据:

def movingAvg(df):
window_size = 7
i = 0

moving_averages = []

while i < len(df) - window_size + 1:
    current_window = df[i : i + window_size]
    window_average = current_window.mean()
    moving_averages.append(window_average)
    i += 1

return moving_averages

    
dates = df_valid['dateTime']
startDay = dates.iloc[0]
lastDay = dates.iloc[-1]

fig, ax = plt.subplots(figsize=(20, 10))
ax.autoscale()
#plt.xlim(startDay, lastDay)

df_valid.sedentaryActivityMins.reset_index(drop=True, inplace=True)
df_moving = pd.DataFrame(movingAvg(df_valid['sedentaryActivityMins']))

df_nan = [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]
df_nan = pd.DataFrame(df_nan)

df_moving = pd.concat([df_nan, df_moving])
plt.plot(df_valid.sedentaryActivityMins)
plt.plot(df_moving)

#plt.show()

但是由于移动平均线使用7个窗口,因此移动平均线列表短了7个项目,因此绘图之间无法正确地跟随。

我尝试将7个“ NaN”放入移动平均线列表,但在绘制时将忽略它们。

情节如下:here

但是我希望橙色线开始向前7步。 所以看起来像这样: enter image description here

df_valid.sedentaryActivityMins.head(40)
0     608
1     494
2     579
3     586
4     404
5     750
6     573
7     466
8     389
9     604
10    351
11    553
12    768
13    572
14    616
15    522
16    675
17    607
18    229
19    529
20    746
21    646
22    625
23    590
24    572
25    462
26    708
27    662
28    649
29    626
30    485
31    509
32    561
33    664
34    517
35    587
36    602
37    601
38    495
39    352
Name: sedentaryActivityMins, dtype: int64

关于如何的任何想法? 预先感谢!

1 个答案:

答案 0 :(得分:1)

当执行concat时,索引不会更改。 NaN还将采用与系列的前7个观测值相同的索引。因此,要么在concat之后执行重置索引,要么将ignore_index设置为True,如下所示:

df_moving = pd.concat([df_nan, df_moving],ignore_index=True)
plt.plot(x)
plt.plot(df_moving)

这将提供预期的输出:

enter image description here