Pandas 时序:入门指南
作者:社区 / 开发者
2024年1月29日
导航至
时序数据是众多现实应用的基础,从股市分析到天气预报到金融市场预测。有效管理、分析和可视化时序数据对于提取有意义的见解和做出明智的决策至关重要。这正是 pandas 时序发挥作用的地方。它可以帮助您组织、转换和可视化数据,并检查特定时间段内的详细信息。在这篇文章中,我们将探讨 pandas 时序是什么,它是如何工作的,以及它提供的基本功能,我们将使用真实世界的数据集进行说明。
什么是 pandas 时序?
要理解 pandas 时序,了解时序数据是非常重要的。它基本上定义为在一段时间内记录在特定时间间隔上的数据点集合。这可以是任何东西,从收集了几个月的患者血糖水平,过去几个月的股价,过去几周商店的销售额,到温度读数和社交媒体活动随时间的变化。
Pandas 提供了广泛的功能和功能,可以处理时序数据,无论领域如何。它建立在 Python 的本地 datetime 和 dateutil模块、NumPy 的 timedelta64 和 datetime64 类型的基础上,并从 Python 中的其他库(如 scikits.timeseries)结合了许多功能,以提供分析和管理时序数据的新功能。
结合 dateutil 和 datetime 模块的使用简便性和 NumPy 的 datetime64 的矢量化接口和高效存储,pandas 提供了一个 Timestamp 对象。然后,库将这些 Timestamp 对象制作成 DatetimeIndex 来索引 DataFrame 或 Series。这使得可视化、操作和从时间戳数据中提取有价值信息变得容易,并执行诸如重采样、分组和过滤等操作。
如何 pandas 时序工作
在我们深入研究示例之前,了解时序是如何工作的非常重要。Pandas 可以捕获以下与时间相关的概念
- 日期时间(具有时区支持的特定时间和日期)
- 时间段(一个时间点及其相关频率)
- 时间差(绝对时间持续时间)
- 日期偏移量(可以添加到或从日期中减去的时间段)
它使用以下数据结构来处理时间序列数据:
- Timestamp 类型,用于带有 DatetimeIndex 作为相关索引结构的时戳
- Period 类型,用于时间周期,相关索引结构为 PeriodIndex(基于 NumPy 的 datetime64 编码固定频率间隔)
- Timedelta 类型,用于时间跨度,相关索引结构为 TimedeltaIndex
DatetimeIndex 和 Timestamp 对象是最基本的,虽然可以直接调用这些类对象,但通常使用 pd.to_datetime()
来解析各种格式。
注意,为 DataFrame 或 Series 设置时间列是处理时间序列数据的常规做法。设置索引允许 pandas 识别您的数据为时间序列数据。一旦完成,您就可以使用基于时间的索引和其他功能来分析数据。然而,这两个也可以直接将时间组件作为数据支持。![一个标志的特写](//images.ctfassets.net/o7xu9whrs0u9/531dcf6d1924499a93e576f4a0a74ab6/b77fb73be87e4a89bc169aeb0342dfdd/Untitled.png)
何时使用它
您可以使用 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)
在这种情况下,我将标题设置为 3,因为我希望将 .csv 文件的第三行作为列名。然后,您需要使用 pd.to_datetime()
函数将日期字符串转换为 Timestamp 对象,传递日期/时间列作为参数。在这种情况下,我希望将时间列转换为 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()
您可以在这个笔记本中找到本指南的所有代码。
常见问题解答
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 & 机器学习有强烈兴趣的软件工程毕业生。当她不工作的时候,您会发现她在尝试无代码工具,游泳或探索新事物。