时间序列 - 数据处理和可视化
时间序列是以等间隔时间间隔索引的观察序列。 因此,在任何时间序列中都应保持顺序和连续性。
我们将使用的数据集是一个多变量时间序列,具有大约一年的每小时数据,用于一个严重污染的意大利城市的空气质量。 数据集可以从下面给出的链接下载 − https://archive.ics.uci.edu/ml/datasets/air+quality.
有必要确保 −
时间序列是等距的,并且
其中没有多余的值或空白。
如果时间序列不连续,我们可以对其进行上采样或下采样。
Showing df.head()
In [122]:
import pandas
In [123]:
df = pandas.read_csv("AirQualityUCI.csv", sep = ";", decimal = ",") df = df.iloc[ : , 0:14]
In [124]:
len(df)
Out[124]:
9471
In [125]:
df.head()
Out[125]:
![代码片段](/time_series/images/code_snippet.jpg)
为了预处理时间序列,我们确保数据集中没有 NaN(NULL) 值; 如果有,我们可以用 0 或平均值或前面或后面的值替换它们。 替换是比丢弃更好的选择,这样可以保持时间序列的连续性。 然而,在我们的数据集中,最后几个值似乎是 NULL,因此删除不会影响连续性。
Dropping NaN(Not-a-Number)
In [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
In [127]:
df = df[df['Date'].notnull()]
In [128]:
df.isna().sum()
Out[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
时间序列通常绘制为相对于时间的折线图。 为此,我们现在将结合日期和时间列并将其从字符串转换为日期时间对象。 这可以使用 datetime 库来完成。
转换为日期时间对象
In [129]:
df['DateTime'] = (df.Date) + ' ' + (df.Time) print (type(df.DateTime[0]))
<class 'str'>
In [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]))
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
让我们看看像温度这样的一些变量是如何随着时间的变化而变化的。
显示图
In [131]:
df.index = df.DateTime
In [132]:
import matplotlib.pyplot as plt plt.plot(df['T'])
Out[132]:
[<matplotlib.lines.Line2D at 0x1eaad67f780>]
![代码片段 4](/time_series/images/code_snippet4.jpg)
In [208]:
plt.plot(df['C6H6(GT)'])
Out[208]:
[<matplotlib.lines.Line2D at 0x1eaaeedff28>]
箱线图是另一种有用的图表,它允许您将有关数据集的大量信息浓缩到单个图表中。 它显示了一个或多个变量的平均值、25% 和 75% 四分位数以及异常值。 在异常值数量很少且与平均值相距甚远的情况下,我们可以通过将异常值设置为平均值或 75% 四分位数来消除异常值。
显示箱线图
In [134]:
plt.boxplot(df[['T','C6H6(GT)']].values)
Out[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](/time_series/images/code_snippet5.jpg)