| """ |
| Generate Denmark_data .mat files from the weather-denmark CSV |
| to match the format expected by the EQL-Wind-Speed-Forecasting repo. |
| """ |
| import numpy as np |
| import pandas as pd |
| from scipy.io import savemat |
| import os |
|
|
| def main(): |
| csv_path = '/tmp/weather-denmark/weather-denmark.csv' |
| df = pd.read_csv(csv_path) |
| df['DateTime'] = pd.to_datetime(df['DateTime']) |
|
|
| cities = ['Aalborg', 'Aarhus', 'Esbjerg', 'Odense', 'Roskilde'] |
| features = ['Temp', 'Pressure', 'WindSpeed', 'WindDir'] |
| target_feature = 'WindSpeed' |
| n_lags = 4 |
| steps_ahead = 6 |
| train_ratio = 0.9 |
|
|
| df_hourly = [] |
| for city in cities: |
| city_df = df[df['City'] == city].copy() |
| city_df = city_df.set_index('DateTime').sort_index() |
| city_hourly = city_df[features].resample('h').mean() |
| city_hourly = city_hourly.ffill().bfill() |
| city_hourly['City'] = city |
| df_hourly.append(city_hourly) |
|
|
| merged = pd.concat(df_hourly, axis=1, keys=cities) |
| merged = merged.dropna() |
| print(f"Total hourly samples after merge: {len(merged)}") |
|
|
| data_array = np.zeros((len(merged), len(cities), len(features))) |
| for i, city in enumerate(cities): |
| for j, feat in enumerate(features): |
| data_array[:, i, j] = merged[(city, feat)].values |
|
|
| valid_len = len(data_array) - steps_ahead - (n_lags - 1) |
| X = np.zeros((valid_len, len(cities), n_lags, len(features))) |
| Y = np.zeros((valid_len, len(cities))) |
|
|
| for t in range(valid_len): |
| start_idx = t + n_lags - 1 |
| for lag in range(n_lags): |
| X[t, :, lag, :] = data_array[start_idx - lag, :, :] |
| Y[t, :] = data_array[start_idx + steps_ahead, :, features.index(target_feature)] |
|
|
| n_train = int(valid_len * train_ratio) |
| Xtr = X[:n_train] |
| Xtest = X[n_train:] |
| Ytr = Y[:n_train] |
| Ytest = Y[n_train:] |
|
|
| x_min = np.zeros((len(cities), len(features))) |
| x_max = np.zeros((len(cities), len(features))) |
| for i in range(len(cities)): |
| for j in range(len(features)): |
| vals = Xtr[:, i, :, j].flatten() |
| x_min[i, j] = vals.min() |
| x_max[i, j] = vals.max() |
| rng = x_max[i, j] - x_min[i, j] |
| if rng < 1e-8: |
| rng = 1.0 |
| Xtr[:, i, :, j] = (Xtr[:, i, :, j] - x_min[i, j]) / rng |
| Xtest[:, i, :, j] = (Xtest[:, i, :, j] - x_min[i, j]) / rng |
|
|
| y_min_tr = np.zeros((1, len(cities))) |
| y_max_tr = np.zeros((1, len(cities))) |
| for i in range(len(cities)): |
| y_min_tr[0, i] = Ytr[:, i].min() |
| y_max_tr[0, i] = Ytr[:, i].max() |
| rng = y_max_tr[0, i] - y_min_tr[0, i] |
| if rng < 1e-8: |
| rng = 1.0 |
| Ytr[:, i] = (Ytr[:, i] - y_min_tr[0, i]) / rng |
| Ytest[:, i] = (Ytest[:, i] - y_min_tr[0, i]) / rng |
|
|
| os.makedirs('Denmark_data/wind_speed', exist_ok=True) |
| os.makedirs('Denmark_data/temp', exist_ok=True) |
|
|
| for feat_dir, label in [('wind_speed', 'wind_speed'), ('temp', 'temp')]: |
| savemat(f'Denmark_data/{feat_dir}/step1.mat', { |
| 'Xtr': Xtr, 'Xtest': Xtest, 'Ytr': Ytr, 'Ytest': Ytest, |
| 'y_min_tr': y_min_tr, 'y_max_tr': y_max_tr, |
| }, do_compression=True) |
|
|
| np.savez('Denmark_data/scaling_params.npz', |
| x_min=x_min, x_max=x_max, y_min_tr=y_min_tr, y_max_tr=y_max_tr, |
| cities=cities, features=features) |
| print(f"Saved Denmark_data. Xtr:{Xtr.shape} Ytr:{Ytr.shape}") |
|
|
| if __name__ == '__main__': |
| main() |
|
|