首页 > 解决方案 > 为 ConvLSTM2d 准备网格天气数据

问题描述

我正在尝试使用使用每小时网格天气数据的 ConvLSTM2d 模型。我可以将数据放入具有这些维度(num_hours、lat、lon、num_features)的 4d 数组中。ConvLSTM2d 需要 5d,我计划为序列长度设置一个可能为 24 小时的变量。我的问题是如何在这个数组中创建一个额外的维度来获得序列长度维度?(num_hours,sequence_length,lat,lon,num_features)具有纬度,经度,时间,特征类型和值列的数据框?

* 我意识到在提出问题时拥有​​一个样本数据集总是更容易,所以我创建了一个集合来模拟这个问题。

import pandas as pd
import numpy as np

weather_variables = ['windspeed', 'temp','pressure']
lats = [x/10 for x in range(400,500,5)]
lons = [x/10 for x in range(900,1000,5)]
hours = pd.date_range('1/1/2021', '9/28/2021', freq= 'H')

df = []
for i in range (0, len(hours)):
    for weather in weather_variables:
        temp_df = pd.DataFrame(index = lats, columns = lons,data = np.random.randint(0,100,size=(len(lats), len(lons))))
        temp_df = temp_df.unstack().to_frame()
        temp_df.reset_index(inplace= True)
        temp_df['weather_variable'] = weather 
        temp_df['ts'] = hours[i] 
        df.append(temp_df)

df = pd.concat(df)
df.columns = ['lon','lat','value','weather_variable', 'ts']

因此,此代码将创建一个虚拟数据集,其中包含给定小时的 3 个网格。目标是将其转换为重叠的 24 小时序列的 5d 数组。我认为数组看起来像这样 (len(hours)?, 24, 20, 20, 3)

标签: pythonnumpykerastensorflow2.0

解决方案


ConvLSTM 论文中,

天气雷达数据每 6 分钟记录一次,因此每天有 240 帧。为了获得用于训练、测试和验证的不相交子集,我们将每个每日序列划分为 40 个不重叠的帧块,并随机分配 4 个块用于训练、1 个块用于测试和 1 个块用于验证。使用 20 帧宽的滑动窗口从这些块中切出数据实例。因此,我们的雷达回波数据集包含 8148 个训练序列、2037 个测试序列和 2037 个验证序列,所有序列长 20 帧(5 帧用于输入,15 帧用于预测)。

如果我的计算是正确的,每个“非重叠帧块”应该有 6 帧(每天 240 帧/每天 40 块 = 每块 6 帧)。所以我不确定你如何在给定的块中创建一个 20 帧宽的滑动窗口。尽管如此,您可以采取类似的方法:将您的数据划分为特定长度的非重叠窗口。也许您使用 6 小时的数据来预测接下来的 6 小时。我不确定您是否需要将窗口保持在给定的一天之内——从晚上 11 点到凌晨 1 点的变化似乎与从 3 点开始的时间窗口一样有效早上到早上 5 点。

我不认为 Pandas 将是处理数据的有效方式。我会坚持使用 NumPy 或者可能是TensorFlow 数据结构


推荐阅读