在这篇博客中,我们将学习如何使用一个叫做Neural Prophet的时间序列包来预测天气。
涵盖的内容:
- 使用Pandas对来自Kaggle的天气数据集进行预处理。
- 使用Neural Prophet训练一个时间序列预测模型来预测下雨。
- 使用训练后的模型预测未来的雨量
我们是怎么做的!
- 使用Pandas从Kaggle读取天气数据到Jupyter笔记本中
- 对数据进行预处理,使其达到可用于建模的状态,一个状态和剥离的时间段
- 用神经先知拟合并预测一个时间序列模型
为了准确预测天气,我们需要专注于五个关键步骤。首先,我们将安装并导入必要的依赖项,包括Neural Prophet软件包。接下来,我们将读入我们的数据并对日期进行相应的处理(我会指导你完成这个过程)。然后,我们将训练我们的模型,产生预测结果,并保存模型供将来使用。
在这个项目中,我们将利用Kaggle上的爱尔兰天气数据集,专注于一个特定的列,这将帮助我们进行预测。我们感兴趣的那一栏被标记为 "雨",这将作为我们要预测的特征。
好了,让我们通过安装Neural Prophet来开始吧。之后,我们将继续导入一些关键的依赖项。具体来说,我们需要pandas、numpy、Neural Prophet和用于绘图的matplotlib。此外,我们将导入pickle,当我们以后将模型保存到磁盘时,它将派上用场。准备好了吗?让我们开始导入吧!
接下来,我们将需要读入我们的数据。首先找到它。
让我们先用一些常见的pandas函数来导入数据,并仔细看看我们可用的站点和各种功能。这种初步探索将帮助我们更好地了解数据集及其对我们的天气预报项目的潜在应用。
对于这个项目,我的重点是'VALENTIA OBSERVATORY'气象站,特别是在预测'雨'方面。
现在,让我们仔细看看'雨'的功能,检查它的独特值。这将为我们提供关于降雨数据的范围和分布的有价值的见解,这对于准确的预测至关重要。
这个特定的数据集带来了一个独特的挑战,因为没有明确定义的NaN值。然而,经过仔细检查,我们可以发现缺失的值被表示为空字符串(' ')。为了解决这个问题,我们可以利用pandas强大的 "替换 "方法,将这些空字符串转换为我们数据框架中 "雨 "列的NaN值。
随着我们的NaN值被成功识别和替换,现在是时候使用'dropna()'方法将它们从我们的数据集中删除了。这将确保我们的预测模型是基于尽可能完整和准确的数据。
为了准备我们的数据集以进行准确的预测,我们需要进行一些基本的预处理。具体来说,我们将过滤数据,只包括我们的目标气象站,我们将把日期列转换成日期时间格式。这将使我们能够更容易地处理和分析数据。
仔细看看我们的数据集的数据类型,我们可以看到,日期列目前被归类为 "对象"。这意味着它缺乏任何固有的时间属性,这可能会阻碍我们进行准确预测的能力。
为了专门关注我们的目标气象站,"VALENTIA OBSERVATORY",我们将创建一个新的数据框架,只包括来自该地点的数据。我们还将把日期列转换为日期时间格式,这将使我们更容易操作和分析数据。
在继续前进之前,让我们进行一次快速的理智检查,以确保我们的日期时间转换是成功的。通过再次检查日期列的数据类型,我们现在应该看到它已经被设置为 "datetime64[ns]"。这是确保我们的数据集被正确格式化以进行准确预测的关键步骤。
为了能够对降雨数据进行数值分析,我们需要将 "雨 "列转换为数值数据类型。
再进行一次合理性检查。检查雨是否已经变成了数字值。
很好!现在我们已经成功地预处理了我们的数据,是时候深入到一些探索性的数据分析了。通过检查雨量数据随时间变化的模式和趋势,我们可以获得对目标地点天气模式行为的宝贵见解。这将是开发准确预报模型的关键一步。
我们生成的图表显示了爱尔兰自1990年以来的每小时降雨量!然而,经过仔细检查,我们可以看到1998年和2019年前后的两个明显的降雨高峰。这可能表明洪水或其他极端天气事件的实例,这将需要进一步调查。让我们仔细看看这些峰值,以更好地了解其性质和潜在影响。
让我们在日期栏中只过滤2019年和2020年的行。
让我们把我们的发现可视化在接下来的代码中,'plt.xticks(rotation=90)'将日期标签旋转90度。你可以根据需要调整旋转角度,使标签更易读。之前,这些标签相互重叠,使其难以辨认。
现在我们可以看到尖峰是在2019年9月和11月之间的某个地方。
让我们再仔细看看首先,让我们制作一个新的数据框架。
通过更仔细地检查绘制的数据,我们可以看到,降雨量的显著峰值发生在2019年9月和11月之间的某个时候。
很好的进展!通过确定重大降雨高峰的确切日期,我们离开发一个准确的预测模型又近了一步。为了更详细地了解这一事件,我们将创建一个新的数据框架,专门研究2019年9月29日至10月2日这一高峰期的周边日期。这将使我们能够对这一极端天气事件进行更加集中和详细的分析。
上面的截断代码是:
val_obs_sep_29_oct_2_2019 = val_obs[(val_obs['date'] >= pd.to_datetime('2019-09-29')) & (val_obs['date'] <= pd.to_datetime('2019-10-02')) ]
注意:这都是一条线。
现在让我们再次绘制!
优秀的工作!通过将我们的焦点缩小到9月30日的深夜,我们可以对这一极端天气事件获得更详细的了解。要做到这一点,我们将创建一个专门针对所需日期和时间范围的掩码。这将使我们能够对数据集中的这个关键时期进行高度具体和细化的分析。
为了更详细地显示这个关键时期,让我们再一次绘制数据。从图中我们可以看到,降雨量的明显峰值发生在9月30日晚上9点到11点之间。
仔细检查 "雨量 "一栏,我们可以看到,2019年9月30日晚上11点,精确记录了21.4毫米的惊人降雨量。
当我们通过神经先知软件包传递数据时,必须注意这个工具正好需要两列--不多也不少。通过只选择最相关的列,我们可以确保我们的预测模型尽可能的集中和准确。
它期待着一个叫做ds的列,它代表着日期,它期待着另一个叫做y的列,这是我们试图预测的值。
因此,理想情况下,我们要做的是将我们的 日期列等于 ds和我们的 雨列等于 y.然后我们要去掉其他所有的列。让我们继续,现在就做。
在上面的这段代码中,我们也要去掉任何缺失的值。
让我们继续训练我们的模型。我们将写两行代码。第一行是创建一个新的未经训练的神经先知模型。我们所做的是使用在第0步中导入的神经预言家类,通过最后的括号来创建一个新的实例。所以我们的模型将被存储在一个叫做m的变量中。
第二行是'model .fit',这是为了继续训练模型。现在,为了做到这一点,我们传递了三个参数。我们传入我们想要处理的数据框架,也就是我们刚刚创建的名为data的数据框架。然后设置我们数据框架的频率。在这种情况下,我们的数据是以小时为频率的。然后,我们指定我们要训练多长时间。Epochs在后台使用一个AR-Net。这是一个特别适合时间序列预测的神经网络。因此,我们能够设置我们的epochs的数量。在这种情况下,我只是把它设置为20。你可以把它设置得更长,或者更短,这取决于你的准确率是什么样子。
结果是相当好的。
平均绝对误差是0.25。这意味着我们的模型平均偏离了约0.6毫米的雨量。考虑到我们训练得非常快,这还不算太坏。拥有一个巨大的数据集可能会有帮助。就性能而言,这还不算太坏。
现在我们已经训练了我们的模型,并得到了一大堆的操作指标。但我们实际上想去预测。到目前为止,我们真的只做了预处理和训练,但还没有真正的预测。
因此,首先我们要做的是建立一个未来的数据框架。我们将在我们的模型中使用预测方法,继续向前预测。
这就是我们创建的预测。我们做了三件关键的事情。
首先,我们做了一个数据框架,其中有我们的预测期。在这种情况下,我们预测的是21,600个周期。为了做到这一点,我们写了m.make_future_dataframe,并通过我们现有的数据框架数据和预测中的这个时期数。这被储存在一个叫做future的变量中。
让我们来看看这个:
然后,我们接下来所做的是使用模型预测方法来预测我们的未来时期。为了做到这一点,我们写了m.predict,并通过我们在第一行写的未来数据框。我们这样做,并将其存储在一个叫做预测的变量中。然后,一旦我们有了预测,在第三行,我们继续使用.head()方法查看前五行。
让我们看一下预测的尾部。
我们的原始数据框架在2020年6月1日停止。所以我们一直预测到2022年11月18日。
如果我们想,我们可以预测到未来。
现在我们还可以做的是把这些预测绘制出来。
为了生成组件图,我们要写这样的代码。
你将看到的是总体趋势,也就是你看到的第一个图表。看起来从2020年6月到2022年11月,雨量总体增加。
正如你所看到的,在爱尔兰下了很多雨,而且只会下得更多我们还看到,有一个明确的雨季。雨季从每年的10月开始,到4月结束。在这一周里,看起来没有太多的季节性,这也是我们所期望的。
这就结束了如何生成这些预测的工作。
我想说的最后一件事是如何保存这个模型,以便我们以后可以再次使用它。我们要做的是使用pickle.dump方法。我们将把它转储到磁盘上,这样我们就可以拿起我们的模型。
我们所写的是与,然后创建一个新的文件,叫做rain_forecast_model.pkl,然后到我们的open语句,我们通过wb。这意味着写二进制。然后在第二行代码中,为了把它转储下来,我们写了pickle.dump,然后是m,也就是我们的模型,然后我们把它指定为我们要把它转储为f,也就是那个特殊的文件rain_forecast_model.pkl。
这些都是一些相当标准的pickle转储功能,或者你通常会做的事情。
让我们通过代码来看看m。
这就是我们的神经预言家模型。
它在Finder中:
那么我们可以做的是删除我们的模型。
然后通过复制第一段代码把它带回来。
然后改变一些关键的东西。把写二进制的wb改为读二进制的rb。然后,我们不使用pickle.dump,而是使用m = pickle.load,并在最后删除m。
所以说,你想回去绘制900个小时,而不是21,600个小时!你现在就可以这样做!你现在就可以这么做。
这就结束了。我们已经做了很多事情。我们导入了我们的依赖项,并安装了神经预言家。我们预处理了我们的数据,并在做这些工作的同时绘制了数据。然后,我们使用神经预言家库和拟合方法来训练我们的模型。最后但并非最不重要的是,我们生成了一些预测,将我们的模型保存到磁盘,重新加载,然后去生成一个新的预测。这就结束了!