数据可视化是数据科学的重要组成部分。我们将向您展示如何使用 matplotlib 绘制运行平均值
移动平均数(也称为移动平均数或滚动平均值)可帮助滤除噪音,并从时间序列数据中创建平滑的曲线。它还有助于突出时间序列数据中的不同季节周期。这是一种非常常用的工具,从物理学到环境科学和金融等许多领域都使用它。
在本文中,我们将解释什么是移动平均值以及如何计算它。我们还向您展示了如何使用 Python 中的 matplotlib 可视化结果。我们进一步讨论了一些关于移动平均值的重要知识,以帮助提高您的数据分析技能。
本文面向具有一定数据分析经验的人员。如果您正在寻找数据科学入门知识,我们有 一门课程 提供基础技能。如需更多在此基础上构建的材料,请查看 此数据科学轨迹 .
什么是运行平均值?
要生成移动平均值,我们需要确定计算平均值的窗口大小。该窗口大小可以是 2 到 n-1 之间的任意数字,其中 n 是时间序列中的数据点数。我们定义一个窗口,计算窗口中的平均值,将窗口滑动一个数据点,然后重复此过程,直到到达终点。
为了证明这一点,让我们定义一些数据并在 Python 中的 for 循环中计算运行平均值:
>>> import numpy as np
>>> data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> window = 2
>>> average_data = []
>>> for ind in range(len(data) â window + 1):
... average_data.append(np.mean(data[ind:ind+window]))
在这里,我们定义一个 2 个数据点的窗口大小,并使用列表切片来获取我们想要平均的数据子集。然后,我们使用 NumPy 来计算平均值。然后使用 for 循环推进索引,然后重复。注意循环结束了
len(data) – window + 1
,这意味着我们的平滑数据只有 9 个数据点。
如果要将运行平均值与原始数据进行比较,则必须正确对齐它们。一种方便的方法是使用 在列表开头插入 NaN
list.insert()
。亲自尝试一下。
在 matplotlib 中绘制移动平均值
这种平滑数据的方法的结果是,移动平均图中的特征(例如峰值或谷值)滞后于原始数据中的真实特征。值的大小也不同于真实数据。如果你想确定数据中的峰值何时出现以及其大小是多少,这一点很重要。
为了证明这一点,我们可以创建一个正弦波并在 Python 中计算移动平均值,就像我们之前所做的那样:
>>> x = np.linspace(0, 10, 50)
>>> y = np.sin(x)
>>> window = 5
>>> average_y = []
>>> for ind in range(len(y) - window + 1):
... average_y.append(np.mean(y[ind:ind+window]))
下面介绍如何添加
NaNs
到运行平均值的开始以确保列表具有与原始数据相同的长度:
>>> for ind in range(window - 1):
... average_y.insert(0, np.nan)
现在,我们可以使用 matplotlib 绘制结果:
>>> import matplotlib.pyplot as plt
>>> plt.figure(figsize=(10, 5))
>>> plt.plot(x, y, 'k.-', label='Original data')
>>> plt.plot(x, average_y, 'r.-', label='Running average')
>>> plt.yticks([-1, -0.5, 0, 0.5, 1])
>>> plt.grid(linestyle=':')
>>> plt.legend()
>>> plt.show()
运行上述代码将在新窗口中生成以下图表:
窗口越大,峰值和谷值的滞后越大,但数据越平滑。您需要测试几个值来确定特定用例的最佳平衡。
一个很好的练习是采用上面的代码示例,并在正弦波中添加一些噪声。噪声可以是 0 和 1 之间的随机数。然后,通过计算移动平均值来平滑数据,然后绘制两条曲线。
那么熊猫呢?
pandas库已经成为Python中数据分析的中坚力量,其基本数据结构是Series。
pandas 带有许多内置函数,可帮助简化数据处理,包括计算运行平均值的函数。它对于清理数据也非常有用,我们将在 本文 .
在大多数情况下,您的数据都保存在可以读入数据框的文件中。我们有两篇有用的文章:如何 读取 CSV 文件 和如何 读取 Excel 文件 。本文的重点不是如何使用 pandas 加载数据,因此我们假设您已经加载了数据并准备开始处理和绘图。如果您想了解如何在 pandas 中使用数据框,请查看 这篇文章 .
在这个例子中,我们有大约 7 个月的柏林每日气温测量数据,从 2021 年 1 月到 2021 年 7 月底。一周的移动平均值可以通过以下方式计算:
>>> temperature = df['temp']
>>> t_average = temperature.rolling(window=7).mean()
这非常方便,因为它可以快速轻松地计算您在 中定义的窗口内的滚动平均值(即移动平均值)
rolling()
。此外,它会自动正确对齐数据并用 填充缺失的数据
NaN
。现在,我们可以使用 matplotlib 绘制结果:
>>> plt.figure(figsize=(10, 5))
>>> plt.plot(temperature, 'k-', label='Original')
>>> plt.plot(t_average, 'r-', label='Running average')
>>> plt.ylabel('Temperature (deg C)')
>>> plt.xlabel('Date')
>>> plt.grid(linestyle=':')
>>> plt.fill_between(t_average.index, 0, t_average, color='r', alpha=0.1)
>>> plt.legend(loc='upper left')
>>> plt.show()
这将在新窗口中打开下图:
您应该注意到,我们在调用 plot() 时仅指定了 y 值。这是因为数据框的索引包含日期,而 pandas 可以识别并自动处理日期。
在此图中,您可以看到从冬季到夏季温度升高的趋势。从 7 天移动平均值产生的平滑数据中可以明显看出,小时间尺度上也存在变化。添加网格线有助于引导视线到相关的日期和温度值;移动平均值下方的阴影有助于强调其高于或低于零度的值。
将 Python 中的运行平均值提升到新的水平
在本文中,我们向您展示了如何在 Python 中计算运行平均值并使用 matplotlib 绘制结果。绘图是理解数据的一项关键技能。有关使用 matplotlib 可视化声音数据的演示,请查看 本文 .
如果你经常处理表格数据,那么以视觉上吸引人的方式呈现表格非常重要。我们有一篇关于 用 Python 漂亮地打印表格的 .
对于本文,平均窗口中的每个数据点对平均值的贡献相同。但是,情况不一定如此。例如,指数移动平均线对近期数据赋予更多权重,这有助于解决滞后问题。
我们希望鼓励您运用您在这里学到的知识并进行一些尝试。尝试实现指数移动平均线,看看它在平滑嘈杂的正弦波方面的表现如何。通过一点练习,您将使您的 Python 技能更上一层楼。
发表评论 取消回复