时间序列数据挖掘:墨尔本十年气温变化(一)

从股票价格波动,到司机气温变化,从大桥沉降预测,到城市用电预警,时间序列数据广泛存在于量化交易、回归预测等机器学习应用,是最常见的数据类型。
接下来使用Python对一个经典的时间序列数据集:墨尔本十年气温变化数据集,进行以下工作:

  • 探索性数据挖掘和数据可视化:绘制折线图、热力图、箱型图、小提琴图、滞后图、自相关图,让枯燥的时间序列颜值爆表!
  • 对时间做特征工程:拓展时间数据纬度,这个代码模板也可以作为时间序列数据的通用预处理模板。
  • 使用三种机器学习模型建立回归拟合模型:岭回归、随机森林、神经网络,并可视化展示三种模型的回归拟合效果。

导入墨尔本1980-1990十年气温数据集

下载数据集

原始数据集

导入数据集

# 导入Python的数据处理库Pandas,相当于Python里的Excel
import pandas as pd

#导入Python绘图matplotlib
import matplotlib.pyplot as plt

# 使用ipython的魔法方法,将绘制出的图像直接嵌入在notebook单元格中
%matplotlib inline

#设置绘图大小
plt.style.use({'figure.figsize':(25,20)})

plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签  
plt.rcParams['axes.unicode_minus']=False  # 用来正常显示负号

#调用pandas的read_csv函数读取数据集文件
df = pd.read_csv('daily-minimum-temperature.csv')

探索数据集

# 查看df这张二维表格
df

在这里插入图片描述
第一列Date为日期,也就是时间序列,我们将第一列的数据类型转换为pandas中的datetime日期类型,并将这一列作为数据的索引,便于后续处理

df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')
#查看各列的信息
df.info()

在这里插入图片描述

探索性数据分析

#查看前五行
df.head()

在这里插入图片描述

df.shape

在这里插入图片描述
共有3650行数据,每一行数据都表示一天,总共表示了1980年1月1日到1990年12月31十年间墨尔本每天的最低气温

#查看df中割裂数据的统计特征
df.describe()

在这里插入图片描述

绘制折线图

df['Temp'].plot(figsize=(30,15))

#设置坐标字体大小
plt.tick_params(labelsize=30)
#生成刻度线网格
plt.grid()

在这里插入图片描述
折线图容易产生毛刺,可以换成散点图。

df['Temp'].plot(style='k.',figsize=(30,15))
#设置坐标字体大小
plt.tick_params(labelsize=30)
#生成刻度线网格
plt.grid()

在这里插入图片描述

直方图

hist表示在一定范围内的数的个数的统计,与bar不相同,bar表示的是每个数的数据,hist表示在一定范围内的数的个数。binas参数表示横轴多少等分。

# 设置绘图大小
plt.style.use({'figure.figsize':(5,5)})
df['Temp'].plot(kind='hist',bins=20)

在这里插入图片描述

df['Temp'].hist(bins=50)

在这里插入图片描述

堆积面积图

#seaborn是基于matplotlib的Python可视化库,将matplotlib库进行了进一步封装,使用更加简单,而且绘制出的图标更加高大上
#导入Python可视化库seaborn
import seaborn as sns

df.plot.area(stacked=False)

在这里插入图片描述

核密度估计图(KDE)

df['Temp'].plot(kind='kde')

在这里插入图片描述

热力图

将1982年每一个月的平均气温用热力图展示出来。
resample(‘M’)是按月份重采样

plt.style.use({'figure.figsize':(20,8)})
sns.heatmap(df['1982'].resample('M').mean().T)

在这里插入图片描述

为什么6月和7月气温最低呢?因为墨尔本在澳大利亚,属于南半球,6月和7月是冬天

筛选指定日期的数据

我们刚刚将日期列转换为了pandas中的datetime类型,我们可以直接通过年份和日期索引选择指定时间的数据。

df['1984']

在这里插入图片描述

#将每年和每天的温度筛选出来
groups = df.groupby(pd.Grouper(freq='1Y'))['Temp']

from pandas import DataFrame
years = DataFrame()
for name,group in groups:
    years[name.year] = group.values
years

在这里插入图片描述

# 设置绘图大小
plt.style.use({'figure.figsize':(30,15)})

years.plot()
#设置图例文字大小和图示大小
plt.legend(fontsize=15,markerscale=15)
#设置坐标文字大小
plt.tick_params(labelsize=15)

在这里插入图片描述

绘制每年的变化折线图、箱型图、热力图、小提琴图

绘制每年的变化折线图、箱型图、热力图、小提琴图

在这里插入图片描述

years.boxplot(figsize=(20,10))

在这里插入图片描述

#设置绘图大小
plt.style.use({'figure.figsize':(30,10)})
sns.heatmap(years.T)

在这里插入图片描述

# 矩阵可视化
plt.matshow(years.T,interpolation=None,aspect='auto')

在这里插入图片描述

#设置绘图大小
plt.style.use({'figure.figsize':(30,22)})
years.hist(bins=15)

在这里插入图片描述

#选取1985年12个月每天的气温数据
groups_month = df['1985'].groupby(pd.Grouper(freq='1M'))['Temp']
months = pd.concat([DataFrame(x[1].values) for x in groups_month], axis=1)
months = DataFrame(months)
months.columns = range(1,13)
months.boxplot(figsize=(20,15))
plt.title('墨尔本1982年每个月最低温度分布箱型图')

在这里插入图片描述

months

在这里插入图片描述

# 设置图像大小
plt.style.use({'figure.figsize':(15,10)})

sns.violinplot(data=months)
plt.title('墨尔本1982年每个月最低气温分布小提琴图')

在这里插入图片描述

# linewidth参数可以控制线宽
sns.violinplot(data=months,linewidth=3)
plt.title('墨尔本1982年每个月最低气温分布小提琴图')

在这里插入图片描述

# 设置图像大小
plt.style.use({'figure.figsize':(5,8)})
sns.heatmap(months)
plt.title('墨尔本1982年每天最低气温分布热力图')

在这里插入图片描述

plt.matshow(months, interpolation=None, aspect='auto',cmap='rainbow')

在这里插入图片描述

滞后散点图

时间序列分析假定一个观测值与前面的观测值之间存在一定的关系。 相对于某观察值之前的观测值被称为滞后值,在一个时间步长前的观测值称为滞后一期,在两个时间步长前的观测值为滞后二期,依此类推。 比如,对于1982年8月15日的气温数据,8月14日的气温为滞后一期,8月13日的气温为滞后二期。 每个观察值之间和其滞后值之间的关系可以用滞后散点图表示。

#设置图片大小
plt.style.use({'figure.figsize':(10,10)})

from pandas.plotting import lag_plot
lag_plot(df['Temp'])
plt.title('墨尔本1980-1990年最低气温滞后一期散点图')

在这里插入图片描述

散点图聚在左下角到右上角,表示与滞后值正相关。 散点图聚在左上角到右下角,表示与滞后值负相关。 离对角线越紧密,表明相关关系越强。 分散的球状散点图表明相关关系微弱。

lag_list = [1,2,3,5,10,20,50,100,150,180]
plt.style.use({'figure.figsize':(15,35)})
for i in range(len(lag_list)):
    ax = plt.subplot(5,2,i+1)
    ax.set_title('t vs t+' + str(lag_list[i]))
    lag_plot(df['Temp'],lag=lag_list[i])
    plt.title('墨尔本1980-1990年最低气温滞后{}期散点图'.format(lag_list[i]))

在这里插入图片描述

自相关图

高中数学就讲过的,两个随机变量之间的pearson相关性系数
在这里插入图片描述
但是对于我们的时间序列来说, 需要比较的两个随机变量分别是: 一段时间的温度值,以及这段时间之前某段时间的温度值序列。
相关性系数的公式稍微有一些改变。
在这里插入图片描述
比如我们有一个星期的温度数据,即T=7 当我们选择滞后值为3,也就是比较每段序列和它之前三天的序列, 带入公式,分子的第一个括号是周四到周日的温度与一周平均温度的差值 分子的第二个括号是周一到周三的温度与一周平均温度的差值 分母的括号为一周每天的温度与一周平均温度的差值

# 设置图像大小
plt.style.use({'figure.figsize':(15,10)})

import numpy as np
from pandas.plotting import autocorrelation_plot
autocorrelation_plot(df['Temp'])
plt.title('墨尔本1980-1990年最低气温自相关图')
# 设置坐标文字大小
plt.tick_params(labelsize=10)

# plt.xticks(np.linspace(0, 3650, 7))
plt.yticks(np.linspace(-1, 1, 20))

在这里插入图片描述

# 设置图像大小
plt.style.use({'figure.figsize':(10,5)})

import numpy as np
a = np.random.randn(100)
a = pd.Series(a)
lag_plot(a)
plt.title('随机数列的1期滞后散点图')

在这里插入图片描述

autocorrelation_plot(a)
plt.title('随机数列的自相关图')

在这里插入图片描述

  • 11
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
ARIMA(自回归移动平均模型)是一种用于时间序列分析和预测的经典模型。在数据挖掘中,ARIMA模型被广泛应用于气温预测。 ARIMA模型有三个主要的参数:p、d和q。p表示自回归项(AR),即当前值与过去p个时刻的值之间的关系;d表示差分项(I),即进行d次差分以使时间序列变得平稳;q表示移动平均项(MA),即当前值与过去q个时刻的预测误差之间的关系。 在进行气温预测时,首先需要对时间序列数据进行分析和预处理,确保数据的平稳性。然后,可以通过查看自相关图(ACF)和偏自相关图(PACF)来确定ARIMA模型的参数。这些图可以帮助确定p、d和q的最优值。 一旦确定了ARIMA模型的参数,可以使用历史气温数据来拟合模型。拟合完成后,可以使用ARIMA模型生成未来一段时间的气温预测。预测结果可以与实际观测值进行比较,评估模型的准确性。 ARIMA模型在气温预测中的应用有一定的局限性。气温受到许多因素的影响,包括季节性、长期趋势、天气变化等。ARIMA模型只考虑了时间序列自身的关系,对于这些外部因素无法很好地捕捉。因此,在进行气温预测时,还需要结合其他模型或方法,如回归模型、神经网络等,以提高预测的准确性。 总结来说,数据挖掘中的时间序列气温预测可以使用ARIMA模型。首先确定模型的参数,然后拟合模型,并生成未来一段时间的气温预测。但需要注意ARIMA模型的局限性,需要结合其他模型或方法来提高预测的准确性。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值