处理 PEMS-SF 数据集可以分为以下几个步骤:

  1. 读取数据

首先,我们需要读取 PEMS-SF 数据集的 .mat 文件,可以使用 Python 中的 scipy.io.loadmat 函数。例如,如果我们要读取 PEMS-SF 数据集中的第 1 个 .mat 文件(即 PEMSD4.mat),可以使用以下代码:

import scipy.io
data = scipy.io.loadmat('PEMS-SF/PEMSD4.mat')

这将把 .mat 文件中的数据读取到 Python 中的一个字典变量 data 中。

  1. 整理数据

PEMS-SF 数据集中包含多个测量站点(即多个传感器),每个站点每 5 分钟记录一次车辆流量。因此,我们需要将数据整理为一个二维数组,其中每行表示一个时间戳,每列表示一个测量站点。可以使用以下代码将数据整理为二维数组:

import numpy as np
data = np.transpose(data['data'])

这里使用了 numpy 库中的 transpose 函数来将原始数据矩阵进行转置,以便将测量站点放在列上。

  1. 处理时间戳

PEMS-SF 数据集中的时间戳是以 5 分钟为单位的整数,例如 0 表示 0:00,12 表示 1:00,24 表示 2:00,以此类推。因此,我们需要将时间戳转换为标准日期时间格式。可以使用以下代码将时间戳转换为标准日期时间格式:

import pandas as pd
timestamps = pd.date_range(start='1/1/2018', periods=data.shape[0], freq='5min')

这里使用了 pandas 库中的 date_range 函数来生成一组时间戳,从 2018 年 1 月 1 日 0:00 开始,每 5 分钟一个时间戳,共有 data.shape[0] 个时间戳。需要注意的是,PEMS-SF 数据集中的时间戳是从 0 开始计数的,因此需要将起始时间设置为 1/1/2018 而不是 1/1/2019。

  1. 添加静态特征

PEMS-SF 数据集中还包含一些静态特征,如天气、节假日等。如果我们没有这些静态变量的 csv 文件,可以使用一些公共 API 来获取这些信息。例如,我们可以使用 OpenWeatherMap API 获取每个时间戳的天气信息,可以使用 Holidays API 获取每个时间戳是否是节假日。以下是获取天气信息和节假日信息的示例代码:

import requests

# OpenWeatherMap API key
api_key = 'your_api_key'

# get weather data for each timestamp
weather_data = []
for timestamp in timestamps:
    url = f'http://api.openweathermap.org/data/2.5/weather?lat=37.7925&lon=-122.3975&appid={api_key}'
    response = requests.get(url)
    weather_data.append(response.json())

# Holidays API key
api_key = 'your_api_key'

# get holiday data for each timestamp
holiday_data = []
for timestamp in timestamps:
    url = f'https://api.abalin.net/namedays?country=us&month={timestamp.month}&day={timestamp.day}'
    response = requests.get(url)
    holiday_data.append(response.json())

在这里,我们使用了 requests 库来发送 HTTP 请求,并将响应数据转换为 JSON 格式。需要注意的是,我们需要替换示例代码中的 API 密钥为自己的 API 密钥。

  1. 添加动态特征

PEMS-SF 数据集中的每个测量站点都有其自身的位置信息,可以使用这些位置信息来添加动态特征。例如,我们可以计算每个时间戳每个测量站点距离最近的高速公路入口和出口的距离。以下是计算距离特征的示例代码:

from geopy.distance import geodesic

# PEMS-SF sensor locations
sensor_locations = {
    '400000': (37.7925, -122.3975),
    '400001': (37.7925, -122.3964),
    '400002': (37.7925, -122.3953),
    # ...
}

# highway entrance and exit locations
entrance_location = (37.7919, -122.4008)
exit_location = (37.7945, -122.3922)

# calculate distance to entrance and exit for each sensor at each timestamp
entrance_distances = np.zeros(data.shape)
exit_distances = np.zeros(data.shape)
for i in range(data.shape[0]):
    for j in range(data.shape[1]):
        sensor_location = sensor_locations[str(j)]
        entrance_distances[i, j] = geodesic(sensor_location, entrance_location).km
        exit_distances[i, j] = geodesic(sensor_location, exit_location).km

在这里,我们使用了 geopy 库中的 geodesic 函数来计算两个坐标之间的距离。需要注意的是,我们需要将坐标转换为十进制度表示法。

  1. 整合所有特征

最后,我们需要将所有特征整合到一起,形成一个完整的特征矩阵。可以使用以下代码将所有特征整合到一起:

# combine all features into a single matrix
features = np.concatenate([data, entrance_distances, exit_distances], axis=1)

这里使用了 numpy 库中的 concatenate 函数来将所有特征按列连接在一起。由于数据集中有多个测量站点和多个时间戳,因此需要使用 axis 参数指定连接的方向。

PEMS-SF 数据集处理指南:特征提取和静态变量添加

原文地址: https://www.cveoy.top/t/topic/myiQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录