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