Pandas 时间序列:入门教程

导航至

时间序列数据是众多现实世界应用的基础组成部分,从股票市场分析到天气预报再到金融市场预测。有效管理、分析和可视化时间序列数据对于提取有意义的见解和做出明智的决策至关重要。这就是 pandas 时间序列发挥作用的地方。它可以帮助您组织、转换和可视化数据,并检查特定时间段的详细信息。在这篇文章中,我们将通过一个真实世界的数据集,了解什么是 pandas 时间序列、它的工作原理以及它提供的基本功能。

什么是 pandas 时间序列?

要理解 pandas 时间序列,重要的是要了解什么是时间序列数据。它本质上被定义为在一段时间内以特定时间间隔记录的一组数据点。这可以是任何事物,从患者几个月内收集的血糖水平、过去几个月的股票价格、过去几周的商店销售额,到温度读数和一段时间内的社交媒体活动。

无论领域如何,Pandas 都提供了广泛的功能和能力来处理时间序列数据。它建立在 Python 原生的 datetimedateutil模块、NumPy 的 timedelta64datetime64 dtypes 之上,并结合了 Python 中其他库(如 scikits.timeseries)的众多功能,以提供分析和操作时间序列数据的新功能。

结合了 dateutildatetime 模块的易用性以及 NumPy 的 datetime64 的向量化接口和高效存储,pandas 提供了 Timestamp 对象。然后,该库从这些 Timestamp 对象创建一个 DatetimeIndex 来索引 DataFrameSeries。这使得从带时间戳的数据中可视化、操作和提取有价值的信息,以及执行重采样、分组和过滤等操作变得容易。

pandas 时间序列如何工作

在我们深入示例之前,重要的是要理解 时间序列 的工作原理。Pandas 可以捕获以下与时间相关的概念

  • 日期时间(具有时区支持的特定时间和日期)
  • 时间跨度(时间点及其相关频率)
  • 时间差(绝对时间持续时间)
  • 日期偏移量(可以添加到日期或从日期中减去的时间持续时间)

它使用以下数据结构来处理时间序列数据

  • Timestamp 类型,用于带有 DatetimeIndex 作为关联索引结构的时间戳
  • Period 类型,用于带有 PeriodIndex 作为关联索引结构的时间段(基于 NumPy 的 datetime64 编码固定频率间隔)
  • Timedelta 类型,用于带有 TimedeltaIndex 作为关联索引结构的时间持续时间

DatetimeIndexTimestamp 对象都是其中最基本的。虽然您可以直接调用这些类对象,但通常的做法是使用 pd.to_datetime() 来解析各种格式。

请注意,按照惯例,为 DataFrameSeries 设置时间列以处理时间序列数据。设置索引允许 pandas 将您的数据识别为时间序列数据。一旦您这样做,您就可以使用基于时间的索引和其他函数来分析您的数据。但是,两者也可以直接支持作为数据的时间组件。 自动生成的标志特写描述

何时使用它

您可以将 pandas 时间序列用于所有遵循基于时间结构的数据,例如销售记录和股票价格。一些常见的用例包括时间序列包括

  • 通过分析金融市场数据来识别模式和趋势
  • 使用历史时间序列数据来预测未来值
  • 随时间监控传感器数据,如湿度和温度
  • 跟踪应用程序或网站上的用户活动以识别使用模式
  • 研究经济指标、GDP 增长和通货膨胀率

Pandas 时间序列示例

为了说明 pandas 时间序列的工作原理,我们将使用一个真实世界的示例。对于以下示例,我使用的是存储在带注释的 .csv 文件中的比特币历史数据。该文件包含来自 CoinDesk API 的过去 30 天的比特币定价数据。您可以在 GitHub 上找到此 .csv 文件。

如何创建时间序列

要创建时间序列,您首先需要安装 Python 并从 .csv 文件加载数据。

import pandas as pd

#load in data

github_csv_url = "https://raw.githubusercontent.com/influxdata/influxdb2-sample-data/master/bitcoin-price-data/bitcoin-historical-annotated.csv"

df = pd.read_csv(github_csv_url, header = 3)

在本例中,我将 header 设置为 3,因为我希望 .csv 文件中的第三行作为列名。然后,您需要使用 pd.to_datetime() 函数将日期字符串转换为 Timestamp 对象,并将日期/时间列作为参数传递。在本例中,我想将 time 列转换为 datetime。

# Convert to datetime

df['_time'] = pd.to_datetime(df['_time'])

您现在已将字符串格式的日期转换为 Datetime 对象。为了确保您的数据是 datetime 格式,您可以在您的数据上运行一个基本的 pandas datetime 方法,看看它是否有效。这是一个您可以尝试的简单方法

# To check if datetime functions work

df.loc[0, '_time'].day_name()

如果您没有看到错误,而是看到了星期几,您可以确定您已创建了时间序列。

如何索引时间序列

您可以按日期过滤数据的一种方法是首先创建一个过滤器(作为单独的变量或内联),然后将过滤器传递给 df.loc(),如下所示

# Access data at a specific timestamp using a filter

filt = (df['_time']>='2023-09')

df.loc[filt]

然而,日期的一个优点是,如果您为 DataFrame 设置索引,使其使用日期,则可以通过切片来过滤数据。以下是如何设置索引以便它使用日期列,在本例中,日期列是 _time 列

df.set_index('_time')

如果结果数据看起来不错,您可以通过将 inplace 设置为 true 来使更改永久生效。

df.set_index('_time', inplace=True)

如何切片时间序列

设置索引后,您现在可以像这样切片数据

#slicing

df['2023-07':'2023-08']


如何使用时间序列进行数据分析

现在您已经基本了解了如何使用 pandas 时间序列,让我们回顾一下 数据分析 的一些基本操作。

计算基本统计信息

您可以计算时间序列的基本统计信息,例如最小值和最大值。在本例中,我正在查找 2023 年 8 月 21 日比特币的最大值和最小值。

max = df['2023-08-21']['_value'].min()

min = df['2023-08-21']['_value'].max()

print('max:', max, ',', 'min:', min)

您还可以计算平均值。在本例中,我正在计算 2023 年 7 月和 8 月比特币的平均值

mean = df['2023-07':'2023-08']['_value'].mean()

print('Mean value:', mean)

或者您可以计算值的标准差

std_dev = df['_value'].std()

print(std_dev)


重采样

您还可以将数据重采样到不同的时间频率,例如,每月,然后执行进一步的操作,例如计算比特币每日最大值。方法如下

std_dev = df['_value'].std()

print(std_dev)

或者您可以计算每周平均值

#resampling to find the weekly mean

df.resample('W').mean()


可视化数据

您还可以创建图形来可视化数据。例如,您可以简单地绘制比特币的最大值与日期的关系图,如下所示

import matplotlib.pyplot as plt

# Calculate the daily high

daily_high = df['_value'].resample('D').max()

# Plotting the results

plt.figure(figsize=(12, 6))

# Plot the daily high

plt.subplot(2, 1, 1)

plt.plot(daily_high.index, daily_high.values, marker='o', linestyle='-')

plt.title('Daily Max Price')

plt.xlabel('Date')

plt.ylabel('Value')

plt.tight_layout()

plt.show()

您可以在此 notebook 中找到本入门教程的所有代码。

常见问题解答

pandas 是否支持时间序列?

是的,pandas 为时间序列数据提供强大的支持,允许您高效地处理、操作和分析面向时间的数据。

如何在 pandas 中检查时间序列

在 pandas 中检查时间序列的最简单方法是检查索引。如果索引具有日期时间值,则它是时间序列。一种方法是使用 isinstance() 函数,如下所示

# Check time series in pandas

is_time_series = isinstance(df.index, pd.DatetimeIndex)

print(is_time_series)

或者,您可以使用索引的 .dtype 属性来确认它是否是 datetime64 类型。在本例中,我们的索引是 _time,应该具有 .dtype 作为 datetime64。

df.index.dtype



总结

Pandas 时间序列提供了一种处理基于时间数据的绝佳方法。在本入门教程中,我们介绍了它是什么、它的工作原理以及何时使用它。我们还介绍了使用过去 30 天的比特币定价数据创建、索引、切片和分析时间序列的基础知识。您现在可以分析和探索不同的时间序列数据集,并为您的跨领域项目解锁有价值的见解。

这篇文章由 Nimra Ahmed 撰写。Nimra 是一位软件工程专业毕业生,对 Node.js 和机器学习有着浓厚的兴趣。当她不工作时,你会发现她在摆弄无代码工具、游泳或探索新事物。