def plot_forecast(data, year, month, day, hour): day_date_time, inputs, label = get_day_data(data[0]['test'], data[0]['test_datetime'], year, month, day, hour) for model in data: pred = tm.get_predictions(model['model'], inputs.reshape(1, cfg.prediction['num_predictions'], model['num_features']), label.reshape(1, cfg.prediction['num_predictions']), model['scaler']).reshape(-1) plt.plot(day_date_time[cfg.prediction['num_predictions']:], pred, label=model['name'], color=model.get('plotting', {}).get('color', None), marker=model.get('plotting', {}).get('marker', 'x'), linestyle=model.get('plotting', {}).get('linestyle', '-'), linewidth=2, markersize=5, zorder=2.7) label = data[0]['scaler'].inverse_transform(label.reshape(-1, 1)) inputs = data[0]['scaler'].inverse_transform(inputs[:, 0].reshape(-1, 1)) plt.plot(day_date_time, np.concatenate([inputs[:, 0], label.reshape(-1)]), color='k', label='True', marker='.', markersize=3, zorder=2.6) # plt.title(data[0]['city'].capitalize() + ' ' + str(day) + '.' + str(month) + '.' + str(year)) plt.title(data[0]['city'].capitalize() + ', ' + day_date_time[24].date().strftime('%d.%m.%y')) plt.ylabel(f'global irradiation [$Wh/m^2$]') plt.xticks(day_date_time[::6], map(pd.Timestamp.time, day_date_time[::6]), rotation=20) formatter = DateFormatter('%H:%M') plt.gca().xaxis.set_major_formatter(formatter) plt.gcf().autofmt_xdate() plt.legend() plt.grid(True) return plt
def plot(self, model=None, plot_col=cfg.label, max_subplots=3, myscaler=None): inputs, labels = self.example plt.figure(figsize=(12, 8)) plot_col_index = self.column_indices[plot_col] max_n = min(max_subplots, len(inputs)) if myscaler is None: file_scaler = open('saver/outputs/scaler/scaler.pckl', 'rb') scaler = pickle.load(file_scaler) else: scaler = myscaler plt.suptitle(model.my_name) for n in range(max_n): plt.subplot(3, 1, n + 1) plt.ylabel(f'{plot_col} in Wh/m^2') plt.plot(self.input_indices, scaler.inverse_transform( inputs[n, :, plot_col_index].numpy().reshape(-1, 1)), label='Inputs', marker='.', zorder=-10) if self.label_columns: label_col_index = self.label_columns_indices.get( plot_col, None) else: label_col_index = plot_col_index if label_col_index is None: continue plt.scatter(self.label_indices, scaler.inverse_transform( labels[n, :, label_col_index].numpy().reshape(-1, 1)), edgecolors='k', label='Labels', c='#2ca02c', s=64) if model is not None: predictions = tm.get_predictions(model, inputs, labels, scaler) plt.scatter(self.label_indices, predictions[n, :], marker='X', edgecolors='k', label='Predictions', c='#ff7f0e', s=64) if n == 0: plt.legend() plt.xlabel('Time [h]') plt.show()
def get_metrics(self, model, scaler, city='unknown'): pred = [] label = [] weight = [] err = [] for data in self.test: inputs, labels = data labels = labels.numpy() # labels = labels[:, :, 0].numpy() predictions = tm.get_predictions(model, inputs.numpy(), labels, scaler) pred.extend(predictions) label.extend(labels) weight.extend(determine_weight(labels)) err_help = scaler.inverse_transform(labels) - predictions err_help[labels == 0] = float('NaN') err.extend(err_help) pred = np.array(pred) label = scaler.inverse_transform(np.array(label)) # print(model.model_type) # err_test = label-pred err = np.array(err) skewness = skew(err, nan_policy='omit') # if model.model_type == 'lstm_conv': # plt.hist(err[:, 5], bins=50) # plt.title('LSTMconv') # plt.xlabel('error') # plt.ylabel('frequency') # plt.show() if cfg.errors['error_to_excel']: writepath = 'saver/outputs/errors/' + city + '.xlsx' mode = 'a' if os.path.exists(writepath) else 'w' sheet = model.model_type err_df = pd.DataFrame(err) err_df.columns = [ 'hour' + str(i) for i in range(cfg.prediction['num_predictions']) ] with pd.ExcelWriter(writepath, mode=mode) as writer: # if sheet in writer.book.sheetnames: # writer.book.remove(writer.book[sheet]) err_df.to_excel(writer, sheet, float_format='%.5f') writer.save() rmse = mean_squared_error(label, pred, sample_weight=weight, multioutput='raw_values', squared=False) # rmse = mean_squared_error(label, pred, multioutput='raw_values', squared=False) mae = mean_absolute_error(label, pred, sample_weight=weight, multioutput='raw_values') # mae = mean_absolute_error(label, pred, multioutput='raw_values') return rmse, mae, skewness