时间序列 - 数据处理和可视化


时间序列是按等距时间间隔索引的观察序列。因此,任何时间序列都应保持顺序和连续性。

我们将使用的数据集是一个多变量时间序列,包含大约一年的每小时数据,用于了解污染严重的意大利城市的空气质量。数据集可以从下面给出的链接下载 - https://archive.ics.uci.edu/ml/datasets/air+quality

有必要确保 -

  • 时间序列是等间隔的,并且

  • 其中没有多余的值或间隙。

如果时间序列不连续,我们可以对其进行上采样或下采样。

显示 df.head()

在[122]中:

import pandas

在[123]中:

df = pandas.read_csv("AirQualityUCI.csv", sep = ";", decimal = ",")
df = df.iloc[ : , 0:14]

在[124]中:

len(df)

输出[124]:

9471

在[125]中:

df.head()

输出[125]:

代码片段

为了预处理时间序列,我们确保数据集中不存在 NaN(NULL) 值;如果有,我们可以用 0 或平均值或之前或之后的值替换它们。替换是比丢弃更好的选择,这样可以保持时间序列的连续性。然而,在我们的数据集中,最后几个值似乎为 NULL,因此删除不会影响连续性。

删除 NaN(非数字)

在[126]中:

df.isna().sum()
Out[126]:
Date             114
Time             114
CO(GT)           114
PT08.S1(CO)      114
NMHC(GT)         114
C6H6(GT)         114
PT08.S2(NMHC)    114
NOx(GT)          114
PT08.S3(NOx)     114
NO2(GT)          114
PT08.S4(NO2)     114
PT08.S5(O3)      114
T                114
RH               114
dtype: int64

在[127]中:

df = df[df['Date'].notnull()]

在[128]中:

df.isna().sum()

输出[128]:

Date             0
Time             0
CO(GT)           0
PT08.S1(CO)      0
NMHC(GT)         0
C6H6(GT)         0
PT08.S2(NMHC)    0
NOx(GT)          0
PT08.S3(NOx)     0
NO2(GT)          0
PT08.S4(NO2)     0
PT08.S5(O3)      0
T                0
RH               0
dtype: int64

时间序列通常绘制为相对于时间的折线图。为此,我们现在将组合日期和时间列并将其从字符串转换为日期时间对象。这可以使用日期时间库来完成。

转换为日期时间对象

在[129]中:

df['DateTime'] = (df.Date) + ' ' + (df.Time)
print (type(df.DateTime[0]))

<类'str'>

在[130]中:

import datetime

df.DateTime = df.DateTime.apply(lambda x: datetime.datetime.strptime(x, '%d/%m/%Y %H.%M.%S'))
print (type(df.DateTime[0]))

<类'pandas._libs.tslibs.timestamps.Timestamp'>

让我们看看温度等一些变量如何随时间变化。

显示地块

在[131]中:

df.index = df.DateTime

在[132]中:

import matplotlib.pyplot as plt
plt.plot(df['T'])

输出[132]:

[<matplotlib.lines.Line2D at 0x1eaad67f780>]
代码片段 4

在[208]中:

plt.plot(df['C6H6(GT)'])

输出[208]:

[<matplotlib.lines.Line2D at 0x1eaaeedff28>]

箱线图是另一种有用的图表,它允许您将有关数据集的大量信息压缩到单个图表中。它显示一个或多个变量的平均值、25% 和 75% 四分位数以及异常值。当异常值数量较少且与平均值相差很大的情况下,我们可以通过将异常值设置为平均值或75%四分位值来消除异常值。

显示箱线图

在[134]中:

plt.boxplot(df[['T','C6H6(GT)']].values)

输出[134]:

{'whiskers': [<matplotlib.lines.Line2D at 0x1eaac16de80>,
   <matplotlib.lines.Line2D at 0x1eaac16d908>,
   <matplotlib.lines.Line2D at 0x1eaac177a58>,
   <matplotlib.lines.Line2D at 0x1eaac177cf8>],
   'caps': [<matplotlib.lines.Line2D at 0x1eaac16d2b0>,
   <matplotlib.lines.Line2D at 0x1eaac16d588>,
   <matplotlib.lines.Line2D at 0x1eaac1a69e8>,
   <matplotlib.lines.Line2D at 0x1eaac1a64a8>],
   'boxes': [<matplotlib.lines.Line2D at 0x1eaac16dc50>,
   <matplotlib.lines.Line2D at 0x1eaac1779b0>],
   'medians': [<matplotlib.lines.Line2D at 0x1eaac16d4a8>,
   <matplotlib.lines.Line2D at 0x1eaac1a6c50>],
   'fliers': [<matplotlib.lines.Line2D at 0x1eaac177dd8>,
   <matplotlib.lines.Line2D at 0x1eaac1a6c18>],'means': []
}
代码片段 5