用数据绘制移动平均线[重复]
Posted
技术标签:
【中文标题】用数据绘制移动平均线[重复]【英文标题】:Plot moving average with data [duplicate] 【发布时间】:2020-11-26 00:01:35 【问题描述】:我正在尝试计算和绘制移动平均线以及计算它的数据:
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
关于如何做的任何想法? 提前致谢!
【问题讨论】:
NaN 无法在绘图中显示。您可以将前七个值设为零或将其分配给系列本身以便绘制它们 嗨!如果我将它们分配为 0,情节看起来真的很时髦。如何将其分配给系列? 我建议使用动态窗口。直到第 7 点,窗口大小应该从 1 逐渐增加到 7,然后保持不变。 您希望这些值是什么? 您可以在您的问题中添加一些数据吗?请阅读minimal reproducible example。 【参考方案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)
这给出了预期的输出:
【讨论】:
随机,但有趣的是你同时使用“indexes”和“indices”作为Index的复数。 哈哈。很好的收获xD 甜蜜!这工作:-) 谢谢!以上是关于用数据绘制移动平均线[重复]的主要内容,如果未能解决你的问题,请参考以下文章