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()