Beispiel #1
0
    def get_X_sym(self, split_operator=Identity()):
        """
        gets the simbolic expression of X
        :return:
        """
        sym_X = self.X_operator(split_operator * self.sym_field, split_operator * self.sym_regressors if self.sym_regressors != [] else self.sym_regressors)

        return self.filter_ysymvars_in_Xsymvars(self.get_y_sym(split_operator), x_field=sym_X)
Beispiel #2
0
 def get_y_sym(self, split_operator=Identity()):
     """
     gets the simbolic expression of y
     :return:
     """
     return self.y_operator(split_operator * self.sym_field)
Beispiel #3
0
 def get_y_dframe(self, split_operator=Identity()):
     return self.get_y(split_operator).to_pandas()
Beispiel #4
0
 def get_y(self, split_operator=Identity()):
     return self.y_operator(split_operator * self.field)
Beispiel #5
0
 def get_X(self, split_operator=Identity()):
     X = self.X_operator(split_operator * self.field,
                         split_operator * self.regressors if self.sym_regressors != [] else self.regressors)
     return self.filter_yvars_in_Xvars(self.get_y(split_operator), x_field=X)
Beispiel #6
0
    def explore_phase_diagram(self, prediction_methods, derivative_in_y, derivatives_in_x, poly_degree, rational=False,
                              method_label_dict={}, reload=True, starting_point={"t": 0}, prediction_methods2plot=None,
                              getXfunc=get_x_operator_func):
        # ---------- save params of experiment ----------
        self.experiments.append({'explore_phase_diagram': {
            'date': datetime.now(),
            'prediction_methods': prediction_methods,
            'derivative_in_y': derivative_in_y,
            'derivatives_in_x': derivatives_in_x,
            'poly_degree': poly_degree}
        })

        subfolders = ['phase_diagram']

        # ----------------------------------------
        prediction_methods = list(sorted(prediction_methods))
        if prediction_methods2plot is None:
            prediction_methods2plot = prediction_methods

        data_manager = self.get_data_manager()
        data_manager.set_X_operator(getXfunc(derivatives_in_x, poly_degree, rational))
        data_manager.set_y_operator(get_y_operator_func(self.get_derivative_in_y(derivative_in_y, derivatives_in_x)))

        # ---------- fit eqdiff ----------
        pde_finder = self.fit_eqdifff(data_manager)

        base_name = 'dery{}_derx{}_poly{}'.format(derivative_in_y, derivatives_in_x, poly_degree)
        # pde_finder = self.load_fitsave_eqdifff(self, data_manager)
        with savefig('coeficients_{}_dery{}_derx{}_poly{}'.format('_'.join(prediction_methods), derivative_in_y,
                                                                  derivatives_in_x, poly_degree), self.experiment_name,
                     subfolders=subfolders):
            self.plot_coefficients(pde_finder)

        # ---------- predictions ----------
        predictions = load_csv('phase_diagram_predictions_data', self.experiment_name, subfolders=subfolders)
        if predictions is not None and not reload and predictions.method.isin(prediction_methods).any():
            predictions = predictions.loc[~predictions.method.isin(prediction_methods), :]

        for i, prediction_method in enumerate(prediction_methods):
            if not reload or (reload and prediction_method not in predictions.method.unique()):
                df_predictions = pde_finder.integrate2(dm=data_manager,
                                                       dery=derivatives_in_x - derivative_in_y if derivative_in_y < 0 else derivative_in_y,
                                                       starting_point=starting_point,
                                                       horizon=self.phase_diagram_horizon,
                                                       method=prediction_method)
                df_predictions['method'] = prediction_method
                predictions = pd.concat([predictions if predictions is not None else
                                         pd.DataFrame([], columns=df_predictions.columns)] + [df_predictions])

        real = evaluator.get_real_values([Identity()],
                                         dm=data_manager,
                                         starting_point=starting_point,
                                         domain_variable2predict='t',
                                         horizon=self.phase_diagram_horizon)
        real = pd.concat(real)
        real = real.reset_index()
        real['method'] = 'real'

        print(predictions)
        save_csv(real, 'phase_diagram_real_data', self.experiment_name, subfolders=subfolders)
        save_csv(predictions, 'phase_diagram_predictions_data', self.experiment_name, subfolders=subfolders)

        # if we want to append new methods.
        prediction_methods = set(predictions.method.unique()).intersection(set(prediction_methods2plot))
        method_colors = {pred_method: self.colors[i] for i, pred_method in enumerate(prediction_methods)}

        # ---------- evaluate statistics ----------
        for var in data_manager.field.data:
            var_name = var.get_full_name()

            # ---------- plot phase diagram ----------
            with savefig('phase_diagram_{}_{}'.format(var_name, '-'.join(prediction_methods)), self.experiment_name,
                         subfolders=subfolders):
                fig, allax = plt.subplots(nrows=len(prediction_methods),
                                          figsize=(15, len(prediction_methods) * 15), sharex=True)
                for i, (method, df) in enumerate(
                        predictions.loc[predictions.method.isin(prediction_methods), :].groupby('method')):
                    ax = allax if len(prediction_methods) == 1 else allax[i]
                    x, dx = self.plot_phase_diagram(real[var_name].values.ravel(),
                                                    dx=data_manager.domain.step_width['t'],
                                                    method='real', var_name=var_name, color='black', ax=ax)
                    ax.set_xlim((np.min(x) - (np.max(x) - np.min(x)) / 2, np.max(x) + (np.max(x) - np.min(x)) / 2))
                    ax.set_ylim(
                        (np.min(dx) - (np.max(dx) - np.min(dx)) / 2, np.max(dx) + (np.max(dx) - np.min(dx)) / 2))
                    self.plot_phase_diagram(df[var_name].values.ravel(), dx=data_manager.domain.step_width['t'],
                                            method=method, var_name=var_name,
                                            color=method_colors[method], ax=ax)
                    ax.legend()
            plt.close("all")

            # ---------- plot series ----------
            with savefig('predictions_{}_{}'.format(var_name, '-'.join(prediction_methods)), self.experiment_name,
                         subfolders=subfolders):
                fig, allax = plt.subplots(nrows=len(prediction_methods),
                                          figsize=(15, len(prediction_methods) * 15), sharex=True)
                for i, (method, df) in enumerate(
                        predictions.loc[predictions.method.isin(prediction_methods), :].groupby('method')):
                    ax = allax if len(prediction_methods) == 1 else allax[i]
                    real_series = real[var_name].values.ravel()
                    ax.plot(real['index'].values.ravel() * data_manager.domain.step_width['t'],
                            real[var_name].values.ravel(), label='real', c='black')
                    ax.set_ylim((np.min(real_series) - (np.max(real_series) - np.min(real_series)) / 2,
                                 np.max(real_series) + (np.max(real_series) - np.min(real_series)) / 2))
                    ax.plot(real['index'].values.ravel() * data_manager.domain.step_width['t'],
                            df[var_name].values.ravel(), label='model',
                            c=method_colors[method])

                    ax.set_xlabel(data_manager.domain.axis_names[0], fontsize=20)
                    ax.set_ylabel(varname2latex(var_name, derivative=0), fontsize=20, rotation=0)
                    ax.legend()
            plt.close("all")