如何用Python构建时间序列天气预报应用程序

373 阅读6分钟

用Python构建时间序列天气预报应用程序

本教程将探讨我们如何使用一个名为Neural Prophet的时间序列包来预测天气。

在本教程中,我们将经历几个关键的事情。

  • 首先,我们将使用Pandas库对从Kaggle获取的数据进行预处理。
  • 我们将训练一个时间序列预测模型,使用该模型预测温度。
  • 我们将学习如何对未来的温度进行预测。

前提条件

要跟上这个教程,你需要。

  • 熟悉机器学习建模。
  • 使用谷歌Colab或Jupyter Notebook。

关于Neural Prophet

它是一个建立在AR-NetFacebook Prophet之上的时间序列模型。它是Facebook Prophet的升级版。它使用PyTorch框架作为后端。它对初学者很友好,使用快速的pip 安装就可以开始。

它结合了传统的统计和神经网络模型进行时间序列建模,用于预测和异常检测。该模型对具有线性或非线性增长的多种季节性的时间序列数据产生高质量的预测。

我们将使用该模型来预测德克萨斯州奥斯汀的未来温度,给定同一地点过去的温度数据。

安装和导入所需的依赖项

我们要安装的主要包是神经预言家包。

!pip install neuralprophet

我们需要将必要的依赖项导入我们的笔记本。我们将导入Pandas,Neural Prophet,Matplotlib, 和Pickle

import pandas as pd
from neuralprophet import NeuralProphet
from matplotlib import pyplot as plt
  • Pandas 是帮助我们将数据读入我们的笔记本。
  • NeuralProphet 是我们将用于预测未来温度的类。
  • Matplotlib 将用于绘图。

下一步是我们导入我们的数据。

加载数据集

我们将使用来自Kaggle的奥斯汀天气数据集。尽管这是一个包含德克萨斯州奥斯汀的历史温度、降水、湿度和风速的数据集,但我们将只预测温度。这意味着我们将只使用数据集中的温度数据。你需要下载它并将austin_weather.csv 文件上传到你的笔记本中。

df = pd.read_csv('austin_weather.csv')
df.tail()

我们已经使用了Pandasread_csv() 方法来加载我们的数据集。此外,我们还使用了tail() 方法来查看我们数据集中的最后五行。

让我们对数据做一下探索性的数据分析。

df.Date.unique()

当你运行上面的代码时,你会看到我们的数据集中用于训练的日期在2013-12-212017-07-31 之间。这大约是四年的数据。

输出。

array(['2013-12-21', '2013-12-22', '2013-12-23', ..., '2017-07-29',
       '2017-07-30', '2017-07-31'], dtype=object)

让我们来看看我们的数据集中的所有可用列。

df.columns

输出。

Index(['Date', 'TempHighF', 'TempAvgF', 'TempLowF', 'DewPointHighF',
       'DewPointAvgF', 'DewPointLowF', 'HumidityHighPercent',
       'HumidityAvgPercent', 'HumidityLowPercent',
       'SeaLevelPressureHighInches', 'SeaLevelPressureAvgInches',
       'SeaLevelPressureLowInches', 'VisibilityHighMiles',
       'VisibilityAvgMiles', 'VisibilityLowMiles', 'WindHighMPH', 'WindAvgMPH',
       'WindGustMPH', 'PrecipitationSumInches', 'Events'],
      dtype='object')

随着我们的推进,我们将只关注TempAvgF 列。

现在让我们做一下预处理。

预处理数据

我们首先检查各列的数据类型。

df.dtypes

输出。

Date                          object
TempHighF                      int64
TempAvgF                       int64
TempLowF                       int64
DewPointHighF                 object
DewPointAvgF                  object
DewPointLowF                  object
HumidityHighPercent           object
HumidityAvgPercent            object
HumidityLowPercent            object
SeaLevelPressureHighInches    object
SeaLevelPressureAvgInches     object
SeaLevelPressureLowInches     object
VisibilityHighMiles           object
VisibilityAvgMiles            object
VisibilityLowMiles            object
WindHighMPH                   object
WindAvgMPH                    object
WindGustMPH                   object
PrecipitationSumInches        object
Events                        object
dtype: object

我们将需要把Date 的格式从object 改为datetime 的格式。该模型只接受日期列的datetime 格式。

df ['Date'] = pd.to_datetime(df ['Date'])
df.tail()

我们已经将我们的日期列从一个对象转换为一个日期-时间类型。如果你输入df.dtypes ,你会看到格式已经改变。

结果。

Date                          datetime64[ns]
TempHighF                              int64
TempAvgF                               int64
dtype: object

每当你与Neural Prophet一起工作时,这都是一个要求。

Neural prophet要求你只给它两列。ds 列是一个时间戳,而y 列是我们要预测的数字。在这种情况下,我们的ds 将是Date ,而我们的y 将是TempAvgF

让我们用matplotlib 来绘制温度随时间的变化。

plt.plot(df ['Date'], df ['TempAvgF'])
plt.show()

结果。

Plot

为了绘制上面的图表,我们使用了Matplotlib的plt.plot() 方法。我们把df['Date'] 作为x变量,把df ['TempAvgF'] 作为y变量。

始终检查你的数据是否有缺失值,因为你不希望将有缺失值的数据传递给Neural Prophet。对于我们的情况,数据看起来不错。

接下来,我们将过滤掉一些列的数据。如前所述,Neural Prophet只希望有两列。

new_column = df[['Date', 'TempAvgF']] 
new_column.dropna(inplace=True)
new_column.columns = ['ds', 'y'] 
new_column.tail()

当你运行上面的代码时,你会发现我们的数据集已经被过滤到只有两列,dsy 。我们的Date 现在是dsTempAvgFy

如果你想预测其他东西,如HumidityAvgPercentDewPointAvgF ,你只需要将df[['Date', 'TempAvgF']] 中的第二个变量改为你想要的目标。例如,df[['Date', 'HumidityAvgPercent']]

我们现在可以继续训练我们的模型了。

训练预测模型

我们首先需要使用我们之前导入的NeuralProphet() 类创建一个新的神经先知实例。我们将这个实例存储在一个变量n 。其次,我们将使用fit() 方法来进行训练。

n = NeuralProphet()
model = n.fit(new_column, freq='D', epochs=5000)

我们将在5000 epochs中训练我们的模型。你可以根据你得到的准确度,选择更短或更长的历时来训练你的模型。它在后台使用AR-Net来训练。freq='D' 表示我们使用的是每日频率。

在训练了5000个历时后,我们得到的平均绝对误差为1.74

到现在为止,我们一直在做预处理和训练。让我们继续执行一些预测。

预测未来的温度

future = n.make_future_dataframe(new_column, periods=1500)
forecast = n.predict(future)
forecast.tail()

我们对1500期(未来1500天)进行预测。我们还使用了n.predict() 方法,去预测我们的未来值。最后,我们使用tail() 方法来列出我们最后的五行。你会注意到,最后一行是我们的第1500次预测。也就是说,2021-09-08 。请记住,我们的数据集只有截止到2017-07-31 的数值。

让我们把这些预测结果可视化。

plot = n.plot(forecast)

结果。

Visualizing our prediction

从这些结果中,我们可以推断出,我们预计6月至8月的年中温度会非常高。此外,在11月和2月之间,我们预计会有很多较冷的温度。这个结果模仿了我们之前的结果,即6月-8月之间温度较高,11月至2月之间温度较低。

总结

这就是如何生成未来的天气预报的总结。我们对我们的数据进行了一些探索性的数据分析,训练了我们的模型,最后只用几行代码就完成了预测。欢迎你自己尝试。