diff --git a/CI/update_badge.sh b/CI/update_badge.sh index c8b11015d27f509faeb4b26b5d88ec7df5a4e675..45e50f49377ed34350ff4d15fc03ca5e2eae6164 100644 --- a/CI/update_badge.sh +++ b/CI/update_badge.sh @@ -71,10 +71,10 @@ printf "%s\n" "${SHIELDS_IO_NAME//\#/%23}" SHIELDS_IO_NAME="$( echo -e "${SHIELDS_IO_NAME//\_/__}" )" SHIELDS_IO_NAME="$( echo -e "${SHIELDS_IO_NAME//\#/%23}")" -curl "https://img.shields.io/badge/${SHIELDS_IO_NAME}" > ${BADGE_FILENAME} +curl "https://img.shields.io/badge/${SHIELDS_IO_NAME}" > "${BADGE_FILENAME}" echo "https://img.shields.io/badge/${SHIELDS_IO_NAME}" SHIELDS_IO_NAME_RECENT="RECENT:${SHIELDS_IO_NAME}" -curl "https://img.shields.io/badge/${SHIELDS_IO_NAME_RECENT}" > ${RECENT_BADGE_FILENAME} +curl "https://img.shields.io/badge/${SHIELDS_IO_NAME_RECENT}" > "${RECENT_BADGE_FILENAME}" echo "${SHIELDS_IO_NAME_RECENT}" > testRecentName.txt # @@ -82,10 +82,10 @@ if [[ ! -d ./badges ]]; then # Control will enter here if $DIRECTORY doesn't exist. mkdir badges/ fi -mv ${BADGE_FILENAME} ./badges/. +mv "${BADGE_FILENAME}" ./badges/. # replace outdated recent badge by new badge -mv ${RECENT_BADGE_FILENAME} ./badges/${RECENT_BADGE_FILENAME} +mv "${RECENT_BADGE_FILENAME}" "./badges/${RECENT_BADGE_FILENAME}" # set status to failed, this will be overwritten if job ended with exitcode 0 echo "failed" > status.txt diff --git a/src/model_modules/linear_model.py b/src/model_modules/linear_model.py index 933a108c1b06e1786f75e7f4ebd9b220fbe812dd..e556f0358a2a5e5247f7b6cc7d416af25a8a664d 100644 --- a/src/model_modules/linear_model.py +++ b/src/model_modules/linear_model.py @@ -1,25 +1,47 @@ +"""Calculate ordinary least squared model.""" + __author__ = "Felix Kleinert, Lukas Leufen" __date__ = '2019-12-11' - import numpy as np import statsmodels.api as sm class OrdinaryLeastSquaredModel: + """ + Implementation of an ordinary least squared model (OLS). + + Inputs and outputs are retrieved from a generator. This generator needs to return in xarray format and has to be + iterable. OLS is calculated on initialisation using statsmodels package. Train your personal OLS using: + + .. code-block:: python + + # next(train_data) should be return (x, y) + my_ols_model = OrdinaryLeastSquaredModel(train_data) + + After calculation, use your OLS model with + + .. code-block:: python + + # input_data needs to be structured like train data + result_ols = my_ols_model.predict(input_data) + + :param generator: generator object returning a tuple containing inputs and outputs as xarrays + """ def __init__(self, generator): + """Set up OLS model.""" self.x = [] self.y = [] self.generator = generator - self.model = self.train_ols_model_from_generator() + self.model = self._train_ols_model_from_generator() - def train_ols_model_from_generator(self): - self.set_x_y_from_generator() + def _train_ols_model_from_generator(self): + self._set_x_y_from_generator() self.x = sm.add_constant(self.x) return self.ordinary_least_squared_model(self.x, self.y) - def set_x_y_from_generator(self): + def _set_x_y_from_generator(self): data_x = None data_y = None for item in self.generator: @@ -31,16 +53,19 @@ class OrdinaryLeastSquaredModel: self.y = data_y def predict(self, data): + """Apply OLS model on data.""" data = sm.add_constant(self.reshape_xarray_to_numpy(data), has_constant="add") return np.atleast_2d(self.model.predict(data)) @staticmethod def reshape_xarray_to_numpy(data): + """Reshape xarray data to numpy data and flatten.""" shape = data.values.shape res = data.values.reshape(shape[0], shape[1] * shape[3]) return res @staticmethod def ordinary_least_squared_model(x, y): + """Calculate ols model using statsmodels.""" ols_model = sm.OLS(y, x) return ols_model.fit()