Implemented Non Autorgressive Quantile Regression

This commit is contained in:
Victor Mylle
2023-11-18 17:42:06 +00:00
parent 75f1f64c38
commit 1268af47a6
9 changed files with 196493 additions and 161 deletions

View File

@@ -12,6 +12,8 @@ class NrvDataset(Dataset):
self.nrv = torch.tensor(dataframe['nrv'].to_numpy(), dtype=torch.float32)
self.load_forecast = torch.tensor(dataframe['load_forecast'].to_numpy(), dtype=torch.float32)
self.total_load = torch.tensor(dataframe['total_load'].to_numpy(), dtype=torch.float32)
self.pv_gen_forecast = torch.tensor(dataframe['pv_forecast'].to_numpy(), dtype=torch.float32)
self.wind_gen_forecast = torch.tensor(dataframe['wind_forecast'].to_numpy(), dtype=torch.float32)
self.sequence_length = sequence_length
self.predict_sequence_length = predict_sequence_length
@@ -45,10 +47,26 @@ class NrvDataset(Dataset):
load_history = self.total_load[actual_idx:actual_idx+self.sequence_length]
features.append(load_history.view(-1))
if self.data_config.PV_HISTORY:
pv_history = self.pv_gen_forecast[actual_idx:actual_idx+self.sequence_length]
features.append(pv_history.view(-1))
if self.data_config.WIND_HISTORY:
wind_history = self.wind_gen_forecast[actual_idx:actual_idx+self.sequence_length]
features.append(wind_history.view(-1))
if self.data_config.LOAD_FORECAST:
load_forecast = self.load_forecast[actual_idx+self.sequence_length:actual_idx+self.sequence_length+self.predict_sequence_length]
features.append(load_forecast.view(-1))
if self.data_config.PV_FORECAST:
pv_forecast = self.pv_gen_forecast[actual_idx+self.sequence_length:actual_idx+self.sequence_length+self.predict_sequence_length]
features.append(pv_forecast.view(-1))
if self.data_config.WIND_FORECAST:
wind_forecast = self.wind_gen_forecast[actual_idx+self.sequence_length:actual_idx+self.sequence_length+self.predict_sequence_length]
features.append(wind_forecast.view(-1))
if not features:
raise ValueError("No features are configured to be included in the dataset.")
@@ -75,10 +93,28 @@ class NrvDataset(Dataset):
load_history = self.total_load[idx:idx+self.sequence_length]
features.append(load_history.view(-1))
if self.data_config.PV_HISTORY:
pv_history = self.pv_gen_forecast[idx:idx+self.sequence_length]
features.append(pv_history.view(-1))
if self.data_config.WIND_HISTORY:
wind_history = self.wind_gen_forecast[idx:idx+self.sequence_length]
features.append(wind_history.view(-1))
if self.data_config.LOAD_FORECAST:
load_forecast = self.load_forecast[idx+self.sequence_length:idx+self.sequence_length+self.predict_sequence_length]
features.append(load_forecast.view(-1))
if self.data_config.PV_FORECAST:
pv_forecast = self.pv_gen_forecast[idx+self.sequence_length:idx+self.sequence_length+self.predict_sequence_length]
features.append(pv_forecast.view(-1))
if self.data_config.WIND_FORECAST:
wind_forecast = self.wind_gen_forecast[idx+self.sequence_length:idx+self.sequence_length+self.predict_sequence_length]
features.append(wind_forecast.view(-1))
target = self.nrv[idx+self.sequence_length:idx+self.sequence_length+self.predict_sequence_length]
if len(features) == 0:

View File

@@ -9,11 +9,24 @@ import pytz
history_data_path = "../../data/history-quarter-hour-data.csv"
forecast_data_path = "../../data/load_forecast.csv"
pv_forecast_data_path = "../../data/pv_gen_forecast.csv"
wind_forecast_data_path = "../../data/wind_gen_forecast.csv"
class DataConfig:
NRV_HISTORY: bool = True
LOAD_FORECAST: bool = True
LOAD_HISTORY: bool = False
def __init__(self):
self.NRV_HISTORY: bool = True
### LOAD ###
self.LOAD_FORECAST: bool = True
self.LOAD_HISTORY: bool = False
### PV ###
self.PV_FORECAST: bool = False
self.PV_HISTORY: bool = False
### WIND ###
self.WIND_FORECAST: bool = False
self.WIND_HISTORY: bool = False
class DataProcessor:
def __init__(self, data_config: DataConfig):
@@ -26,8 +39,12 @@ class DataProcessor:
self.history_features = self.get_nrv_history()
self.future_features = self.get_load_forecast()
self.pv_forecast = self.get_pv_forecast()
self.wind_forecast = self.get_wind_forecast()
self.all_features = self.history_features.merge(self.future_features, on='datetime', how='left')
self.all_features = self.all_features.merge(self.pv_forecast, on='datetime', how='left')
self.all_features = self.all_features.merge(self.wind_forecast, on='datetime', how='left')
self.data_config = data_config
@@ -69,6 +86,31 @@ class DataProcessor:
df.sort_values(by="datetime", inplace=True)
return df
def get_pv_forecast(self):
df = pd.read_csv(pv_forecast_data_path, delimiter=';')
df = df.rename(columns={'dayahead11hforecast': 'pv_forecast', 'Datetime': 'datetime'})
df = df[['datetime', 'pv_forecast']]
df = df.groupby('datetime').mean().reset_index()
df['datetime'] = pd.to_datetime(df['datetime'], utc=True)
df.sort_values(by="datetime", inplace=True)
return df
def get_wind_forecast(self):
df = pd.read_csv(wind_forecast_data_path, delimiter=';')
df = df.rename(columns={'dayaheadforecast': 'wind_forecast', 'datetime': 'datetime'})
df = df[['datetime', 'wind_forecast']]
# remove nan rows
df = df[~df['wind_forecast'].isnull()]
df = df.groupby('datetime').mean().reset_index()
df['datetime'] = pd.to_datetime(df['datetime'], utc=True)
df.sort_values(by="datetime", inplace=True)
return df
def set_batch_size(self, batch_size: int):
self.batch_size = batch_size