风速预测(一)数据集介绍和预处理
往期精彩内容:
Python-凯斯西储大学(CWRU)轴承数据解读与分类处理
时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较
1 风速数据集来源
????????国内气象站点的数据因为其保密性和版权问题,往往难以下载,不少数据网站通过国外气象站点的观测数据进行处理转换,得到国内城市区域的气象数据,都采用收费形式才能获取,本文提供一些免费获取风速数据的平台:
1.1 美国国家海洋和大气管理局(NOAA)下设的国家环境信息中心(NCEI)??
地址:https://www.ncei.noaa.gov/data/global-summary-of-the-day/archive/
数据包括1929——2022年的气象数据
1.2 美国国家航空航天局-地球数据
地址:https://www.earthdata.nasa.gov/
1.3?kaggle平台
地址:https://www.kaggle.com/
kaggle平台是机器学习和数据科学社区,里面有大量的数据集,直接搜索"wind speed",可以看到有上百个数据集
简单介绍两个排名靠前的高分数据集,
-
一个数据集比较大,是巴西气候地表数据-每小时,2000年至2021年间122个气象站的小时气候数据,
地址:https://www.kaggle.com/datasets/PROPPG-PPG/hourly-weather-surface-brazil-southeast-region
-
另一个数据集小一点,是本文采用的数据集(文末附数据集)
地址:https://www.kaggle.com/datasets/budincsevity/
szeged-weather/
2 数据集介绍
本文采用kaggle平台数据集:2006年至2016年塞格德的气象数据,包括每小时/每日数据,包括温度、压力、风速等。
第一步,读取数据
该数据为每小时时间序列数据,一共96453条,包括:时间、天气类型、降水类型、气温、体表温度、湿度、风速(km/小时)、风向(度)、能见度(km)、噪声、气压、全天天气12个变量。
第二步,提取数据集中的风速数据,并按照一天(24小时)的平均值进行重采样
import pandas as pd
# 读取原始 CSV 文件
df = pd.read_csv('weatherHistory.csv' )
# 移除时区信息并将日期时间列解析为 Pandas 的日期时间类型(包括毫秒)
df['Formatted Date'] = pd.to_datetime(df['Formatted Date'].str.replace(r'\s+\+\d{4}', '', regex=True),
format='%Y-%m-%d %H:%M:%S.%f', utc=True)
# 将日期时间列设置为索引
df.set_index('Formatted Date', inplace=True)
# 提取 风速 列
selected_column = df[['Wind Speed (km/h)']]
# 按照一天(24小时)的平均值重新采样
daily_avg_wind_speed = selected_column.resample('D').mean()
# 保存结果到新的 CSV 文件
daily_avg_wind_speed.to_csv('wind_speed.csv')
daily_avg_wind_speed
这样,数据就采集成为日平均风速,一共4018条数据。
第三步,数据可视化
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rc("font", family='Microsoft YaHei')
# 读取数据
data = pd.read_csv('wind_speed.csv')
# 可视化
plt.figure(figsize=(15,5), dpi=100)
plt.grid(True)
plt.plot(data['Wind Speed (km/h)'], color='green')
plt.show()
3 风速数据集预处理
第一步,先划分数据集
我们按照8:2划分训练集和测试集,划分比例不同,也会对后续的模型训练推理效果有影响,比如对电池寿命的预测中,明显训练集的数据量划分越多,模型拟合效果越好[1]。
第二步,滑动窗口介绍
在时间序列预测问题中,滑动窗口是一种常用的数据处理方法,用于将时间序列数据转换为模型的输入特征和输出标签。滑动窗口的基本思想是以固定的时间窗口长度对时间序列进行切片,每次滑动一定的步长,从而生成一系列的子序列。这些子序列可以作为模型的输入特征,同时可以对应相同长度的下一个时间步的数据作为输出标签。这样就可以将时间序列数据转换为监督学习问题的数据集,用于训练和测试预测模型。
具体来说,对于一个时间序列 [x1, x2, x3, ..., xn],滑动窗口的过程如下:
1. 选择固定长度的时间窗口,比如长度为w。
2. 从序列的起始位置开始,取前w个数据作为输入特征,同时取第w+1个数据作为输出标签,形成第一个样本。
3. 然后向后滑动一个固定的步长,取第2到w+1个数据作为输入特征,同时取第w+2个数据作为输出标签,形成第二个样本,依此类推,直到序列末尾。
比如序列长为20,滑动窗口设置为4
训练集,滑动:
构造训练集数据和对应标签:
构造测试集数据和对应标签:
通过滑动窗口的处理,原始的时间序列数据被转换为一系列的样本,每个样本包括了固定长度的输入特征和对应的输出标签,用于模型的训练和测试。滑动窗口技术可以帮助模型捕捉时间序列数据的局部模式和趋势,提高模型对时间序列的预测能力。
第三步,代码实现
import numpy as np
# 生成示例时间序列数据
time_series = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 定义滑动窗口大小
window_size = 3
# 使用滑动窗口处理时间序列数据
def data_window_maker(time_series, window_size):
# 用来存放输入特征
data_x = []
# 用来存放输出标签
data_y = []
# 构建训练集和对应标签
for i in range(len(time_series) - window_size):
data_x.append(time_series[i:i+window_size]) # 取前window_size个数据作为输入特征
data_y.append(time_series[i+window_size]) # 取第window_size+1个数据作为输出标签
return data_x, data_y
x, y = data_window_maker(time_series, window_size)
print("输出标签y:", y)
x
选择合适的 window_size 对于时间序列数据的滑动窗口处理非常关键。window_size 的大小直接影响着模型对时间序列数据的理解和预测能力。下面是一些关于选择 window_size 的决策因素:
-
上下文长度:window_size 应该足够长,能够捕获时间序列数据中的重要上下文信息,以便模型能够学习到时间序列数据的长期依赖关系。
-
数据周期性:如果时间序列数据具有明显的周期性,window_size 最好能够覆盖一个完整的周期,这样可以帮助模型更好地理解周期性特征。
-
数据频率:如果时间序列数据的采样频率很高,那么可能需要选择较小的 window_size,以便更好地捕捉时间序列数据的变化。
-
数据长度:如果时间序列数据比较长,可以适当增大 window_size,以提高模型对整体趋势的理解。
-
训练样本数量:选择合适的 window_size 可以确保生成足够数量的训练样本,以便模型能够充分学习时间序列数据的模式。
一般来说,选择合适的 window_size 需要结合具体的时间序列数据特点和预测任务需求来进行调整。通常情况下,可以通过尝试不同的 window_size 并进行交叉验证来确定最佳的参数值。也可阅读相关领域的论文,参考论文中的设定数值。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!