如何在 Pandas 中利用时间序列?

pythonpandasprogramming

时间序列数据主要用于处理随时间变化的数据。处理这些数据在时间序列数据的数据分析中起着非常重要的作用。Pandas 是 Python 中流行的数据操作和分析库,它为处理时间序列数据提供了强大的功能。在本文中,我们将通过示例和说明了解如何在 Pandas 中有效地利用时间序列。

利用时间序列数据的方法

在下面的方法中,我们将使用从 Kaggle 获取的 Electric_ptoduction 时间序列数据集。您可以从此处下载数据集。

导入和操作时间序列数据

在 Pandas 中处理时间序列数据时,我们需要首先导入必要的库并将数据加载到 DataFrame 中。 Pandas 提供了多种方法从不同来源读取时间序列数据,包括 CSV 文件、数据库和 Web API。在加载数据时,Pandas 提供了强大的工具来操作、清理和预处理时间序列数据。

import pandas as pd

# 从 CSV 文件加载时间序列数据
data = pd.read_csv('Electric_Production.csv')

# 显示 DataFrame 的前几行
print(data.head())

# 将"timestamp"列设置为索引
data['DATE'] = pd.to_datetime(data['DATE'])
data.set_index('DATE', inplace=True)

# 将数据重新采样为每日频率
daily_data = data.resample('D').mean()

输出

       DATE  IPG2211A2N
0  1/1/1985     72.5052
1  2/1/1985     70.6720
2  3/1/1985     62.4502
3  4/1/1985     57.4714
4  5/1/1985     55.3151

索引和切片时间序列数据

Pandas 包含各种索引和切片方法,用于从时间序列数据中提取特定时间段或观测值。 Pandas 中的 DateTimeIndex 可实现基于时间的直观索引和选择。

import pandas as pd

# 从 CSV 文件加载时间序列数据
data = pd.read_csv('Electric_Production.csv')

# 将"timestamp"列设置为索引
data['DATE'] = pd.to_datetime(data['DATE'])
data.set_index('DATE', inplace=True)

# 将数据重新采样为每日频率
daily_data = data.resample('D').mean()

# 选择特定日期范围的数据
subset_1 = data['2017-01-01':'2017-10-30']
print(subset_1)

# 选择特定月份的数据
subset_2 = data[data.index.month == 3]
print(subset_2)

# 选择特定年份的数据
subset_3 = data[data.index.year == 2016]
print(subset_3)

输出

            IPG2211A2N
DATE
2017-01-01    114.8505
2017-02-01     99.4901
2017-03-01    101.0396
2017-04-01     88.3530
2017-05-01     92.0805
2017-06-01    102.1532
2017-07-01    112.1538
2017-08-01    108.9312
2017-09-01     98.6154
2017-10-01     93.6137
            IPG2211A2N
DATE
1985-03-01     62.4502
1986-03-01     62.2221
1987-03-01     65.6100
1988-03-01     70.2928
1989-03-01     73.3523
1990-03-01     73.1964
1991-03-01     73.3650
1992-03-01     74.5275
1993-03-01     79.4747
1994-03-01     79.2456
1995-03-01     81.2661
1996-03-01     86.9356
1997-03-01     83.0125
1998-03-01     86.5549
1999-03-01     90.7381
2000-03-01     88.0927
2001-03-01     92.8283
2002-03-01     93.2556
2003-03-01     94.5532
2004-03-01     95.4029
2005-03-01     98.9565
2006-03-01     98.4017
2007-03-01     99.1925
2008-03-01    100.4386
2009-03-01     97.8529
2010-03-01     98.2672
2011-03-01     99.1028
2012-03-01     93.5772
2013-03-01    102.9948
2014-03-01    104.7631
2015-03-01    104.4706
2016-03-01     95.3548
2017-03-01    101.0396
            IPG2211A2N
DATE
2016-01-01    117.0837
2016-02-01    106.6688
2016-03-01     95.3548
2016-04-01     89.3254
2016-05-01     90.7369
2016-06-01    104.0375
2016-07-01    114.5397
2016-08-01    115.5159
2016-09-01    102.7637
2016-10-01     91.4867
2016-11-01     92.8900
2016-12-01    112.7694

处理缺失数据

时间序列数据通常包含缺失值,这会妨碍分析和建模。Pandas 提供了几种处理缺失数据的方法,例如插值、前向填充或后向填充。这些方法有助于确保时间序列的连续性。

import pandas as pd

# 从 CSV 文件加载时间序列数据
data = pd.read_csv('Electric_Production.csv')

# 显示 DataFrame 的前几行
# print(data.head())

# 将"timestamp"列设置为索引
data['DATE'] = pd.to_datetime(data['DATE'])
data.set_index('DATE', inplace=True)

# 将数据重新采样为每日频率
daily_data = data.resample('D').mean()

## 插入缺失值
data['value'] = data['value'].interpolate()
print(data.head())

# 正向填充缺失值
data['value'] = data['value'].ffill()
print(data.head())

# 向后填充缺失值
data['value'] = data['value'].bfill()
print(data.head())

输出

               value
DATE
1985-01-01  72.5052
1985-02-01  70.6720
1985-03-01  64.0717
1985-04-01  57.4714
1985-05-01  55.3151
              value
DATE
1985-01-01  72.5052
1985-02-01  70.6720
1985-03-01  64.0717
1985-04-01  57.4714
1985-05-01  55.3151
              value
DATE
1985-01-01  72.5052
1985-02-01  70.6720
1985-03-01  64.0717
1985-04-01  57.4714
1985-05-01  55.3151

重采样和频率转换

重采样涉及改变时间序列数据的频率。Pandas 提供了对时间序列数据进行上采样(增加频率)和下采样(降低频率)的方法。这允许以不同的时间间隔聚合或插入数据。

import pandas as pd

# 从 CSV 文件加载时间序列数据
data = pd.read_csv('Electric_Production.csv')

# 显示 DataFrame 的前几行
# print(data.head())

# 将"timestamp"列设置为索引
data['DATE'] = pd.to_datetime(data['DATE'])
data.set_index('DATE', inplace=True)

# 将数据重新采样为每日频率
daily_data = data.resample('D').mean()
print(daily_data.head())

# 将数据重新采样为每周频率,取平均值
weekly_data = data.resample('W').mean()
print(weekly_data.head())

#将数据重新采样为每月频率,取总和值
monthly_data = data.resample('M').sum()
print(weekly_data.head())

输出

              value
DATE
1985-01-01  72.5052
1985-01-02      NaN
1985-01-03      NaN
1985-01-04      NaN
1985-01-05      NaN
              value
DATE
1985-01-06  72.5052
1985-01-13      NaN
1985-01-20      NaN
1985-01-27      NaN
1985-02-03  70.6720
              value
DATE
1985-01-06  72.5052
1985-01-13      NaN
1985-01-20      NaN
1985-01-27      NaN
1985-02-03  70.6720

绘制和可视化时间序列数据

Pandas 与流行的数据可视化库 Matplotlib 集成,可以轻松创建富有洞察力的时间序列数据图表和可视化。可视化有助于理解数据中的趋势、模式和异常

import pandas as pd
import matplotlib.pyplot as plt

# 从 CSV 文件加载时间序列数据
data = pd.read_csv('Electric_Production.csv')

# 显示 DataFrame 的前几行
# print(data.head())

# 将"时间戳"列设置为索引
data['DATE'] = pd.to_datetime(data['DATE'])
data.set_index('DATE', inplace=True)

# 绘制时间序列数据
data.plot()
plt.title('Time Series Data')
plt.xlabel('Date')
plt.ylabel('Value')
plt.show()

输出

结论

在本文中,我们讨论了如何使用 pandas 功能使用时间序列数据。从导入和预处理数据到高级分析和可视化,Pandas 简化了整个时间序列分析工作流程。通过利用本文讨论的功能,分析师和数据科学家可以获得有价值的见解并根据基于时间的数据做出明智的决策。


相关文章