如何使用 Pandas 绘制基于时间序列的图表?

pythonpandasprogramming

在日常生活中,我们经常会遇到各种交互式图形数据。在日常工作或业务中,我们会遇到几个数据集或图表,它们可以帮助我们做出决策、预测未来等等。我们在日常接触中遇到的一组数据就是时间序列数据。

一系列以固定时间间隔收集的数据或数据点,这种时间约束数据集称为时间序列数据。这些数据集以固定的时间间隔收集。一个简单的例子可以是我们的天气数据,也可以是心电图报告中的数据等。这些数据集都按时间编入索引,并在一段时间内记录下来。

分析这些数据并预测未来或当前情景是这些数据的主要动机。这使它成为最广泛使用的数据形式之一。

在本文中,我们将尝试找出探索或可视化这些数据集的方法,方法是使用 Python 中非常流行的库 Pandas 将它们绘制成图表。我们可以通过多种方式实现这些数据集并获得有关数据的宝贵见解。通过图表可视化基于时间的数据对于获得见解和理解时间数据集内的趋势至关重要。

入门

首先,我们需要确保我们有一个安装了 Python 的工作系统(最好是 3.xx 或更高版本)。由于我们正在使用 Pandas 库和 matplotlib,因此我们需要为 Python 准备好这些包。一个简单的过程就是打开一个 cmd 窗口并运行以下命令:

pip install pandas
pip install matplotlib

为了稍后在我们的代码中导入这些包,我们可以简单地使用 import 关键字,如下所示:

import pandas as pd
import matplotlib.pyplot as plt

加载时间序列数据

现在,在绘制时间序列数据之前,我们需要数据。它可以来自某个来源,也可以创建并将其加载到 Pandas DataFrame 中。确保数据包含表示日期和时间信息(时间序列数据)的特定列非常重要。您可以从各种来源(例如 .csv 文件、Web API 或数据库)将数据加载到数据框中。

如果我们有一个名为 data.csv 的 CSV 文件,其中包含时间序列数据,我们可以将其加载为:

data = pd.read_csv('data.csv', parse_dates=['timestamp_column'])

*请确保将"data.csv"替换为实际文件路径,将"timestamp_column"替换为包含时间信息的列的名称,具体名称或路径应与您系统上的名称或路径一致。

将时间戳设置为索引

为了确保正确处理时间序列数据集的数据,将时间戳列设置为 DataFrame 的索引至关重要。此步骤基本上是为了让 Pandas 知道我们正在处理时间序列数据。您可以通过一行代码设置时间戳:

data.set_index('timestamp_column', inplace=True)

*请记住将"timestamp_column"替换为数据表中包含时间信息的列的名称。

使用示例数据集

在本文中,我们将创建一个数据集以避免任何混淆,并且我们所有的结果将主要基于该数据集,这意味着演示绘图的实际代码从这里开始。我们将创建一个包含 10 行和 4 列的数据集。以下是创建方法:

import pandas as pd
ts_data = { 'Date': ['2022-01-01', '2022-02-01','2022-03-01', '2022-04-01', '2022-05-01', '2022-06-01', '2022-07-01', '2022-08-01','2022-09-01', '2022-10-01'],
'A': [302, 404, 710, 484, 641, 669, 897, 994,1073, 944],'B': [849, 1488, 912, 855, 445, 752, 699, 1045, 1232, 974], 'C': [715, 355,284, 543, 112, 1052, 891, 776, 924, 786]}
dataframe = pd.DataFrame( ts_data,columns=[ 'Date', 'A', 'B', 'C'])
# 更改日期的数据类型
dataframe["Date"] = dataframe["Date"].astype("datetime64[ns]")
# 将日期设置为索引
dataframe = dataframe.set_index("Date")
print(dataframe)

输出

               A     B     C
Date                        
2022-01-01   302   849   715
2022-02-01   404  1488   355
2022-03-01   710   912   284
2022-04-01   484   855   543
2022-05-01   641   445   112
2022-06-01   669   752  1052
2022-07-01   897   699   891
2022-08-01   994  1045   776
2022-09-01  1073  1232   924
2022-10-01   944   974   786

使用 pandas 绘制时间序列数据

我们可以使用多种方式在 Python 中使用 pandas 实现或绘制这些数据集。我们有折线图、条形图、面积图和散点图等等。

让我们先来看看一些主要使用的图表:

绘制折线图

这是表示时间序列数据的一种非常常见的方式。它表示显示由线连接的数据点的两个轴 X 和 Y 之间的关系。

要使用 Pandas 和 Matplotlib 创建基本折线图,请使用以下代码:

import matplotlib.pyplot as plt
import pandas as pd
ts_data = { 'Date': ['2022-01-01', '2022-02-01','2022-03-01', '2022-04-01', '2022-05-01', '2022-06-01', '2022-07-01', '2022-08-01','2022-09-01', '2022-10-01'],
'A': [302, 404, 710, 484, 641, 669, 897, 994,1073, 944],'B': [849, 1488, 912, 855, 445, 752, 699, 1045, 1232, 974], 'C': [715, 355,284, 543, 112, 1052, 891, 776, 924, 786]}
dataframe = pd.DataFrame( ts_data,columns=[ 'Date', 'A', 'B', 'C'])
# 更改日期的数据类型
dataframe["Date"] = dataframe["Date"].astype("datetime64[ns]")
# 将日期设置为索引
dataframe = dataframe.set_index("Date")
dataframe.plot(figsize=(10, 6))
plt.title('Timeseries Data')
plt.xlabel('Time')
plt.ylabel('Value')
plt.show()

输出

* figsize 决定图表的大小,可以通过更改 xlabel 和 ylabel 值来相应地设置标签。

绘制条形图

条形图是数据的图形表示,其中的矩形条按比例表示相应的值。它更适合表示处理分类或离散值的时间序列数据。一个轴表示比较类别,另一个轴表示相应的值。要创建条形图,请使用以下代码:

示例

import matplotlib.pyplot as plt
import pandas as pd
ts_data = { 'Date': ['2022-01-01', '2022-02-01','2022-03-01', '2022-04-01', '2022-05-01', '2022-06-01', '2022-07-01', '2022-08-01','2022-09-01', '2022-10-01'],
'A': [302, 404, 710, 484, 641, 669, 897, 994,1073, 944],'B': [849, 1488, 912, 855, 445, 752, 699, 1045, 1232, 974], 'C': [715, 355,284, 543, 112, 1052, 891, 776, 924, 786]}
dataframe = pd.DataFrame( ts_data,columns=[ 'Date', 'A', 'B', 'C'])
# 更改日期的数据类型
dataframe["Date"] = dataframe["Date"].astype("datetime64[ns]")
# 将日期设置为索引
dataframe = dataframe.set_index("Date")
dataframe.plot(kind='bar', figsize=(10, 6))
plt.title('Timeseries Data')
plt.xlabel('Time')
plt.ylabel('Value')
plt.show()

输出

*这只是示例数据框的表示。

绘制面积图

面积图用于可视化不同变量随时间变化的幅度和比例。它们是通过填充线图下方的区域创建的。使用 pandas,我们生成如下图:

示例

import matplotlib.pyplot as plt
import pandas as pd
ts_data = { 'Date': ['2022-01-01', '2022-02-01','2022-03-01', '2022-04-01', '2022-05-01', '2022-06-01', '2022-07-01', '2022-08-01','2022-09-01', '2022-10-01'],
'A': [302, 404, 710, 484, 641, 669, 897, 994,1073, 944],'B': [849, 1488, 912, 855, 445, 752, 699, 1045, 1232, 974], 'C': [715, 355,284, 543, 112, 1052, 891, 776, 924, 786]}
dataframe = pd.DataFrame( ts_data,columns=[ 'Date', 'A', 'B', 'C'])
# 更改日期的数据类型
dataframe["Date"] = dataframe["Date"].astype("datetime64[ns]")
# 将日期设置为索引
dataframe = dataframe.set_index("Date")
dataframe.plot(kind='area', figsize=(10, 6))
plt.title('Timeseries Data')
plt.xlabel('Time')
plt.ylabel('Value')
plt.show()

输出

绘制散点图

散点图对于理解两个连续变量之间的关系非常有效。它们帮助我们从数据集中了解趋势、相关性和聚类。从给定数据集生成散点图的简单语法是:

示例

import matplotlib.pyplot as plt
import pandas as pd
ts_data = { 'Date': ['2022-01-01', '2022-02-01','2022-03-01', '2022-04-01', '2022-05-01', '2022-06-01', '2022-07-01', '2022-08-01','2022-09-01', '2022-10-01'],
'A': [302, 404, 710, 484, 641, 669, 897, 994,1073, 944],'B': [849, 1488, 912, 855, 445, 752, 699, 1045, 1232, 974], 'C': [715, 355,284, 543, 112, 1052, 891, 776, 924, 786]}
dataframe = pd.DataFrame( ts_data,columns=[ 'Date', 'A', 'B', 'C'])
# 更改日期的数据类型
dataframe["Date"] = dataframe["Date"].astype("datetime64[ns]")
# 将日期设置为索引
dataframe = dataframe.set_index("Date")
dataframe.plot(kind='scatter', x='A', y='B', figsize=(10, 6))
plt.title('散点图')
plt.xlabel('A')
plt.ylabel('B')
plt.show()

输出

自定义时间序列图

Pandas 和 Matplotlib 为我们提供了自定义时间序列图的灵活性。您可以调整线条样式、标记样式、配色方案和轴格式等方面。

让我们快速探索一些自定义选项,我们将尝试进行简单的更改::

示例

import matplotlib.pyplot as plt
import pandas as pd
ts_data = { 'Date': ['2022-01-01', '2022-02-01','2022-03-01', '2022-04-01', '2022-05-01', '2022-06-01', '2022-07-01', '2022-08-01','2022-09-01', '2022-10-01'],
'A': [302, 404, 710, 484, 641, 669, 897, 994,1073, 944],'B': [849, 1488, 912, 855, 445, 752, 699, 1045, 1232, 974], 'C': [715, 355,284, 543, 112, 1052, 891, 776, 924, 786]}
dataframe = pd.DataFrame( ts_data,columns=[ 'Date', 'A', 'B', 'C'])
# 更改日期的数据类型
dataframe["Date"] = dataframe["Date"].astype("datetime64[ns]")
# 设置日期作为索引
dataframe = dataframe.set_index("Date")
dataframe.plot(figsize=(10, 6), linewidth=2, linestyle='--', marker='o', markersize=5, color='red')
plt.title('自定义时间序列图')
plt.xlabel('Time')
plt.ylabel('Value')
plt.grid(True) # 添加网格线
plt.legend(['Data'], loc='upper right')) # 添加图例
plt.show()

输出

*我们自定义了线宽、线型、标记样式、标记大小、颜色、网格线和图例这里

结论

时间序列数据非常重要,广泛用于研究和分析。Pandas 使我们能够可视化和分析这些数据集,以获得有意义的结果。

在本文中,我们探讨了 Pandas 和 Matplotlib 中可用于可视化时间序列数据的各种图表。我们介绍了面积图、散点图、条形图和折线图。每种图表类型都有独特的用途,可以为您的数据集提供很好的见解。

请探索庞大的 Pandas 库,查看时间序列分解、滚动均值以及它提供的几种分析和可视化工具。Python 及其强大的库确实使其成为开发人员和分析师的首选语言。


相关文章