风速预测(一)数据集介绍和预处理

2023-12-13 09:42:53

往期精彩内容:

Python-凯斯西储大学(CWRU)轴承数据解读与分类处理

电能质量扰动信号数据介绍与分类-Python实现

Python房价分析(一)pyton爬虫

时序预测: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 并进行交叉验证来确定最佳的参数值。也可阅读相关领域的论文,参考论文中的设定数值。

文章来源:https://blog.csdn.net/qq_40949048/article/details/134933776
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。