首页 > 解决方案 > 用数据绘制移动平均线

问题描述

我正在尝试计算和绘制移动平均值以及计算得出的数据:

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" 放入移动平均列表中,但是当我绘图时这些都被忽略了。

情节如下:这里

但我希望橙色线提前 7 步开始。所以它看起来像这样: 在此处输入图像描述

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

关于如何做的任何想法?提前致谢!

标签: pythonpandasmatplotlib

解决方案


当你做一个连接时,索引不会改变。NaN 也将采用与您的系列的前 7 个观察值相同的索引。因此,要么在 concat 之后重置索引,要么将 ignore_index 设置为 True ,如下所示:

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

这给出了预期的输出:

在此处输入图像描述


推荐阅读