Repository: Aarhus-Psychiatry-Research/timeseriesflattener

Issue:
refactor: remove mentions of dw_ek_borger (waiting for no open PRs, very likely to cause conflicts)
1. Rename all occurences of "dw_ek_borger" to "entity_id"
2. Remove it as a default in Timeseriesflattener

Discussion:

Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2d9d748..5ba85d0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,13 +2,6 @@
 
 <!--next-version-placeholder-->
 
-## v0.19.0 (2022-12-08)
-### Feature
-* More informative errors ([`3141487`](https://github.com/Aarhus-Psychiatry-Research/timeseriesflattener/commit/3141487a04cb815ac492e632a601265c5c72d65f))
-
-### Documentation
-* More docstrings ([`e1134d4`](https://github.com/Aarhus-Psychiatry-Research/timeseriesflattener/commit/e1134d40949af8ca5f547f9f015ea57e5ea6ee4c))
-
 ## v0.18.0 (2022-12-08)
 ### Feature
 * Take multiple features as long format ([`7f771e4`](https://github.com/Aarhus-Psychiatry-Research/timeseriesflattener/commit/7f771e4ece71bff5bbf24a2718121709ead1792b))
diff --git a/pyproject.toml b/pyproject.toml
index 4fb4b4e..87da589 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "timeseriesflattener"
-version = "0.19.0"
+version = "0.18.0"
 description = "A package for converting time series data from e.g. electronic health records into wide format data."
 readme = "README.md"
 authors = ["Martin Bernstorff", "Kenneth Enevoldsen", "Jakob Grøhn Damgaard", "Frida Hæstrup", "Lasse Hansen"]
diff --git a/src/timeseriesflattener/feature_spec_objects.py b/src/timeseriesflattener/feature_spec_objects.py
index e739fa9..b498393 100644
--- a/src/timeseriesflattener/feature_spec_objects.py
+++ b/src/timeseriesflattener/feature_spec_objects.py
@@ -229,7 +229,7 @@ class TemporalSpec(AnySpec):
     allowed_nan_value_prop: float = 0.0
     # If NaN is higher than this in the input dataframe during resolution, raise an error.
 
-    id_col_name: str = "dw_ek_borger"
+    id_col_name: str = "id"
     # Col name for ids in the input dataframe.
 
     timestamp_col_name: str = "timestamp"
diff --git a/src/timeseriesflattener/flattened_dataset.py b/src/timeseriesflattener/flattened_dataset.py
index 83c5d85..fa5dba2 100644
--- a/src/timeseriesflattener/flattened_dataset.py
+++ b/src/timeseriesflattener/flattened_dataset.py
@@ -89,7 +89,7 @@ class TimeseriesFlattener:  # pylint: disable=too-many-instance-attributes
         prediction_times_df: DataFrame,
         drop_pred_times_with_insufficient_look_distance: bool,  # noqa
         cache: Optional[FeatureCache] = None,
-        id_col_name: str = "dw_ek_borger",
+        id_col_name: str = "id",
         timestamp_col_name: str = "timestamp",
         predictor_col_name_prefix: str = "pred",
         outcome_col_name_prefix: str = "outc",
@@ -122,7 +122,7 @@ class TimeseriesFlattener:  # pylint: disable=too-many-instance-attributes
         Args:
             prediction_times_df (DataFrame): Dataframe with prediction times, required cols: patient_id, .
             cache (Optional[FeatureCache], optional): Object for feature caching. Should be initialised when passed to init. Defaults to None.
-            id_col_name (str, optional): Column namn name for patients ids. Is used across outcome and predictors. Defaults to "dw_ek_borger".
+            id_col_name (str, optional): Column namn name for patients ids. Is used across outcome and predictors. Defaults to "id".
             timestamp_col_name (str, optional): Column name name for timestamps. Is used across outcomes and predictors. Defaults to "timestamp".
             predictor_col_name_prefix (str, optional): Prefix for predictor col names. Defaults to "pred_".
             outcome_col_name_prefix (str, optional): Prefix for outcome col names. Defaults to "outc_".
@@ -324,7 +324,7 @@ class TimeseriesFlattener:  # pylint: disable=too-many-instance-attributes
             DataFrame
         """
         # Generate df with one row for each prediction time x event time combination
-        # Drop dw_ek_borger for faster merge
+        # Drop id for faster merge
         df = pd.merge(
             left=prediction_times_with_uuid_df,
             right=output_spec.values_df,
@@ -332,7 +332,7 @@ class TimeseriesFlattener:  # pylint: disable=too-many-instance-attributes
             on=id_col_name,
             suffixes=("_pred", "_val"),
             validate="m:m",
-        ).drop("dw_ek_borger", axis=1)
+        ).drop(id_col_name, axis=1)
 
         # Drop prediction times without event times within interval days
         if isinstance(output_spec, OutcomeSpec):
diff --git a/src/timeseriesflattener/utils.py b/src/timeseriesflattener/utils.py
index 2ef4adb..7913759 100644
--- a/src/timeseriesflattener/utils.py
+++ b/src/timeseriesflattener/utils.py
@@ -22,7 +22,7 @@ PROJECT_ROOT = Path(__file__).resolve().parents[2]
 
 def split_df_and_register_to_dict(
     df: pd.DataFrame,
-    id_col_name: str = "dw_ek_borger",
+    id_col_name: str = "id",
     timestamp_col_name: str = "timestamp",
     value_col_name: str = "value",
     value_names_col_name: str = "value_names",
@@ -33,7 +33,7 @@ def split_df_and_register_to_dict(
 
     Args:
         df (pd.DataFrame): A dataframe in long format containing the values to be grouped into a catalogue.
-        id_col_name (str): Name of the column containing the patient id for each value. Defaults to "dw_ek_borger".
+        id_col_name (str): Name of the column containing the patient id for each value. Defaults to "id".
         timestamp_col_name (str): Name of the column containing the timestamp for each value. Defaults to "timestamp".
         value_col_name (str): Name of the column containing the value for each value. Defaults to "values".
         value_names_col_name (str): Name of the column containing the names of the different types of values for each value. Defaults to "value_names".
diff --git a/tutorials/01_basic.ipynb b/tutorials/01_basic.ipynb
index 4616fb1..ceecc96 100644
--- a/tutorials/01_basic.ipynb
+++ b/tutorials/01_basic.ipynb
@@ -56,7 +56,7 @@
                                    "│ ┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━┓  │\n",
                                    "│ ┃<span style=\"font-weight: bold\"> column_name         </span>┃<span style=\"font-weight: bold\"> NA   </span>┃<span style=\"font-weight: bold\"> NA %    </span>┃<span style=\"font-weight: bold\"> mean    </span>┃<span style=\"font-weight: bold\"> sd      </span>┃<span style=\"font-weight: bold\"> p0   </span>┃<span style=\"font-weight: bold\"> p25     </span>┃<span style=\"font-weight: bold\"> p75     </span>┃<span style=\"font-weight: bold\"> p100     </span>┃<span style=\"font-weight: bold\"> hist      </span>┃  │\n",
                                    "│ ┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━┩  │\n",
-                                   "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">dw_ek_borger       </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   5000</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   2900</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   2500</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   7400</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   10000</span> │ <span style=\"color: #008000; text-decoration-color: #008000\"> █████▇  </span> │  │\n",
+                                   "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">id       </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   5000</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   2900</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   2500</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   7400</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   10000</span> │ <span style=\"color: #008000; text-decoration-color: #008000\"> █████▇  </span> │  │\n",
                                    "│ └─────────────────────┴──────┴─────────┴─────────┴─────────┴──────┴─────────┴─────────┴──────────┴───────────┘  │\n",
                                    "│ <span style=\"font-style: italic\">                                                   datetime                                                   </span>  │\n",
                                    "│ ┏━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓  │\n",
@@ -80,7 +80,7 @@
                                    "│ ┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━┓  │\n",
                                    "│ ┃\u001b[1m \u001b[0m\u001b[1mcolumn_name        \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA %   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mmean   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1msd     \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp0  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp25    \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp75    \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp100    \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mhist     \u001b[0m\u001b[1m \u001b[0m┃  │\n",
                                    "│ ┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━┩  │\n",
-                                   "│ │ \u001b[38;5;141mdw_ek_borger       \u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[36m   5000\u001b[0m │ \u001b[36m   2900\u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m   2500\u001b[0m │ \u001b[36m   7400\u001b[0m │ \u001b[36m   10000\u001b[0m │ \u001b[32m █████▇  \u001b[0m │  │\n",
+                                   "│ │ \u001b[38;5;141mid       \u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[36m   5000\u001b[0m │ \u001b[36m   2900\u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m   2500\u001b[0m │ \u001b[36m   7400\u001b[0m │ \u001b[36m   10000\u001b[0m │ \u001b[32m █████▇  \u001b[0m │  │\n",
                                    "│ └─────────────────────┴──────┴─────────┴─────────┴─────────┴──────┴─────────┴─────────┴──────────┴───────────┘  │\n",
                                    "│ \u001b[3m                                                   datetime                                                   \u001b[0m  │\n",
                                    "│ ┏━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓  │\n",
@@ -115,7 +115,7 @@
                                    "  <thead>\n",
                                    "    <tr style=\"text-align: right;\">\n",
                                    "      <th></th>\n",
-                                   "      <th>dw_ek_borger</th>\n",
+                                   "      <th>id</th>\n",
                                    "      <th>timestamp</th>\n",
                                    "    </tr>\n",
                                    "  </thead>\n",
@@ -181,7 +181,7 @@
                                    "</div>"
                               ],
                               "text/plain": [
-                                   "      dw_ek_borger           timestamp\n",
+                                   "      id           timestamp\n",
                                    "0             9903 1968-05-09 21:24:00\n",
                                    "1             7465 1966-05-24 01:23:00\n",
                                    "2             6447 1967-09-25 18:08:00\n",
@@ -240,7 +240,7 @@
                                    "│ ┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓  │\n",
                                    "│ ┃<span style=\"font-weight: bold\"> column_name        </span>┃<span style=\"font-weight: bold\"> NA   </span>┃<span style=\"font-weight: bold\"> NA %    </span>┃<span style=\"font-weight: bold\"> mean   </span>┃<span style=\"font-weight: bold\"> sd     </span>┃<span style=\"font-weight: bold\"> p0         </span>┃<span style=\"font-weight: bold\"> p25    </span>┃<span style=\"font-weight: bold\"> p75    </span>┃<span style=\"font-weight: bold\"> p100     </span>┃<span style=\"font-weight: bold\"> hist     </span>┃  │\n",
                                    "│ ┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩  │\n",
-                                   "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">dw_ek_borger      </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  5000</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  2900</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">         0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  2500</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  7500</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   10000</span> │ <span style=\"color: #008000; text-decoration-color: #008000\"> ██████ </span> │  │\n",
+                                   "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">id      </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  5000</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  2900</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">         0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  2500</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  7500</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   10000</span> │ <span style=\"color: #008000; text-decoration-color: #008000\"> ██████ </span> │  │\n",
                                    "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">value             </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">     5</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   2.9</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0.00015</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   2.5</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   7.5</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      10</span> │ <span style=\"color: #008000; text-decoration-color: #008000\"> ██████ </span> │  │\n",
                                    "│ └────────────────────┴──────┴─────────┴────────┴────────┴────────────┴────────┴────────┴──────────┴──────────┘  │\n",
                                    "│ <span style=\"font-style: italic\">                                                   datetime                                                   </span>  │\n",
@@ -266,7 +266,7 @@
                                    "│ ┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓  │\n",
                                    "│ ┃\u001b[1m \u001b[0m\u001b[1mcolumn_name       \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA %   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mmean  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1msd    \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp0        \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp25   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp75   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp100    \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mhist    \u001b[0m\u001b[1m \u001b[0m┃  │\n",
                                    "│ ┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩  │\n",
-                                   "│ │ \u001b[38;5;141mdw_ek_borger      \u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[36m  5000\u001b[0m │ \u001b[36m  2900\u001b[0m │ \u001b[36m         0\u001b[0m │ \u001b[36m  2500\u001b[0m │ \u001b[36m  7500\u001b[0m │ \u001b[36m   10000\u001b[0m │ \u001b[32m ██████ \u001b[0m │  │\n",
+                                   "│ │ \u001b[38;5;141mid      \u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[36m  5000\u001b[0m │ \u001b[36m  2900\u001b[0m │ \u001b[36m         0\u001b[0m │ \u001b[36m  2500\u001b[0m │ \u001b[36m  7500\u001b[0m │ \u001b[36m   10000\u001b[0m │ \u001b[32m ██████ \u001b[0m │  │\n",
                                    "│ │ \u001b[38;5;141mvalue             \u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[36m     5\u001b[0m │ \u001b[36m   2.9\u001b[0m │ \u001b[36m   0.00015\u001b[0m │ \u001b[36m   2.5\u001b[0m │ \u001b[36m   7.5\u001b[0m │ \u001b[36m      10\u001b[0m │ \u001b[32m ██████ \u001b[0m │  │\n",
                                    "│ └────────────────────┴──────┴─────────┴────────┴────────┴────────────┴────────┴────────┴──────────┴──────────┘  │\n",
                                    "│ \u001b[3m                                                   datetime                                                   \u001b[0m  │\n",
@@ -302,7 +302,7 @@
                                    "  <thead>\n",
                                    "    <tr style=\"text-align: right;\">\n",
                                    "      <th></th>\n",
-                                   "      <th>dw_ek_borger</th>\n",
+                                   "      <th>id</th>\n",
                                    "      <th>timestamp</th>\n",
                                    "      <th>value</th>\n",
                                    "    </tr>\n",
@@ -380,7 +380,7 @@
                                    "</div>"
                               ],
                               "text/plain": [
-                                   "       dw_ek_borger           timestamp     value\n",
+                                   "       id           timestamp     value\n",
                                    "0              9476 1969-03-05 08:08:00  0.816995\n",
                                    "1              4631 1967-04-10 22:48:00  4.818074\n",
                                    "2              3890 1969-12-15 14:07:00  2.503789\n",
@@ -438,7 +438,7 @@
                                    "│ ┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━┓  │\n",
                                    "│ ┃<span style=\"font-weight: bold\"> column_name         </span>┃<span style=\"font-weight: bold\"> NA   </span>┃<span style=\"font-weight: bold\"> NA %    </span>┃<span style=\"font-weight: bold\"> mean    </span>┃<span style=\"font-weight: bold\"> sd      </span>┃<span style=\"font-weight: bold\"> p0   </span>┃<span style=\"font-weight: bold\"> p25     </span>┃<span style=\"font-weight: bold\"> p75     </span>┃<span style=\"font-weight: bold\"> p100     </span>┃<span style=\"font-weight: bold\"> hist      </span>┃  │\n",
                                    "│ ┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━┩  │\n",
-                                   "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">dw_ek_borger       </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   5000</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   2900</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   2500</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   7500</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   10000</span> │ <span style=\"color: #008000; text-decoration-color: #008000\"> ██████  </span> │  │\n",
+                                   "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">id       </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   5000</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   2900</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   2500</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   7500</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   10000</span> │ <span style=\"color: #008000; text-decoration-color: #008000\"> ██████  </span> │  │\n",
                                    "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">female             </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    0.5</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    0.5</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      1</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">       1</span> │ <span style=\"color: #008000; text-decoration-color: #008000\"> █    █  </span> │  │\n",
                                    "│ └─────────────────────┴──────┴─────────┴─────────┴─────────┴──────┴─────────┴─────────┴──────────┴───────────┘  │\n",
                                    "╰────────────────────────────────────────────────────── End ──────────────────────────────────────────────────────╯\n",
@@ -457,7 +457,7 @@
                                    "│ ┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━┓  │\n",
                                    "│ ┃\u001b[1m \u001b[0m\u001b[1mcolumn_name        \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA %   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mmean   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1msd     \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp0  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp25    \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp75    \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp100    \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mhist     \u001b[0m\u001b[1m \u001b[0m┃  │\n",
                                    "│ ┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━┩  │\n",
-                                   "│ │ \u001b[38;5;141mdw_ek_borger       \u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[36m   5000\u001b[0m │ \u001b[36m   2900\u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m   2500\u001b[0m │ \u001b[36m   7500\u001b[0m │ \u001b[36m   10000\u001b[0m │ \u001b[32m ██████  \u001b[0m │  │\n",
+                                   "│ │ \u001b[38;5;141mid       \u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[36m   5000\u001b[0m │ \u001b[36m   2900\u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m   2500\u001b[0m │ \u001b[36m   7500\u001b[0m │ \u001b[36m   10000\u001b[0m │ \u001b[32m ██████  \u001b[0m │  │\n",
                                    "│ │ \u001b[38;5;141mfemale             \u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[36m    0.5\u001b[0m │ \u001b[36m    0.5\u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[36m      1\u001b[0m │ \u001b[36m       1\u001b[0m │ \u001b[32m █    █  \u001b[0m │  │\n",
                                    "│ └─────────────────────┴──────┴─────────┴─────────┴─────────┴──────┴─────────┴─────────┴──────────┴───────────┘  │\n",
                                    "╰────────────────────────────────────────────────────── End ──────────────────────────────────────────────────────╯\n"
@@ -487,7 +487,7 @@
                                    "  <thead>\n",
                                    "    <tr style=\"text-align: right;\">\n",
                                    "      <th></th>\n",
-                                   "      <th>dw_ek_borger</th>\n",
+                                   "      <th>id</th>\n",
                                    "      <th>female</th>\n",
                                    "    </tr>\n",
                                    "  </thead>\n",
@@ -553,7 +553,7 @@
                                    "</div>"
                               ],
                               "text/plain": [
-                                   "      dw_ek_borger  female\n",
+                                   "      id  female\n",
                                    "0                0       0\n",
                                    "1                1       1\n",
                                    "2                2       1\n",
@@ -616,7 +616,7 @@
                                    "│ ┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━┓  │\n",
                                    "│ ┃<span style=\"font-weight: bold\"> column_name         </span>┃<span style=\"font-weight: bold\"> NA   </span>┃<span style=\"font-weight: bold\"> NA %    </span>┃<span style=\"font-weight: bold\"> mean    </span>┃<span style=\"font-weight: bold\"> sd      </span>┃<span style=\"font-weight: bold\"> p0   </span>┃<span style=\"font-weight: bold\"> p25     </span>┃<span style=\"font-weight: bold\"> p75     </span>┃<span style=\"font-weight: bold\"> p100     </span>┃<span style=\"font-weight: bold\"> hist      </span>┃  │\n",
                                    "│ ┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━┩  │\n",
-                                   "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">dw_ek_borger       </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   5000</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   2900</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   4</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   2500</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   7600</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   10000</span> │ <span style=\"color: #008000; text-decoration-color: #008000\"> ██▇███  </span> │  │\n",
+                                   "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">id       </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   5000</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   2900</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   4</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   2500</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   7600</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   10000</span> │ <span style=\"color: #008000; text-decoration-color: #008000\"> ██▇███  </span> │  │\n",
                                    "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">value              </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      1</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   1</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      1</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      1</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">       1</span> │ <span style=\"color: #008000; text-decoration-color: #008000\">     █   </span> │  │\n",
                                    "│ └─────────────────────┴──────┴─────────┴─────────┴─────────┴──────┴─────────┴─────────┴──────────┴───────────┘  │\n",
                                    "│ <span style=\"font-style: italic\">                                                   datetime                                                   </span>  │\n",
@@ -641,7 +641,7 @@
                                    "│ ┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━┓  │\n",
                                    "│ ┃\u001b[1m \u001b[0m\u001b[1mcolumn_name        \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA %   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mmean   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1msd     \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp0  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp25    \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp75    \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp100    \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mhist     \u001b[0m\u001b[1m \u001b[0m┃  │\n",
                                    "│ ┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━┩  │\n",
-                                   "│ │ \u001b[38;5;141mdw_ek_borger       \u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[36m   5000\u001b[0m │ \u001b[36m   2900\u001b[0m │ \u001b[36m   4\u001b[0m │ \u001b[36m   2500\u001b[0m │ \u001b[36m   7600\u001b[0m │ \u001b[36m   10000\u001b[0m │ \u001b[32m ██▇███  \u001b[0m │  │\n",
+                                   "│ │ \u001b[38;5;141mid       \u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[36m   5000\u001b[0m │ \u001b[36m   2900\u001b[0m │ \u001b[36m   4\u001b[0m │ \u001b[36m   2500\u001b[0m │ \u001b[36m   7600\u001b[0m │ \u001b[36m   10000\u001b[0m │ \u001b[32m ██▇███  \u001b[0m │  │\n",
                                    "│ │ \u001b[38;5;141mvalue              \u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[36m      1\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[36m   1\u001b[0m │ \u001b[36m      1\u001b[0m │ \u001b[36m      1\u001b[0m │ \u001b[36m       1\u001b[0m │ \u001b[32m     █   \u001b[0m │  │\n",
                                    "│ └─────────────────────┴──────┴─────────┴─────────┴─────────┴──────┴─────────┴─────────┴──────────┴───────────┘  │\n",
                                    "│ \u001b[3m                                                   datetime                                                   \u001b[0m  │\n",
@@ -677,7 +677,7 @@
                                    "  <thead>\n",
                                    "    <tr style=\"text-align: right;\">\n",
                                    "      <th></th>\n",
-                                   "      <th>dw_ek_borger</th>\n",
+                                   "      <th>id</th>\n",
                                    "      <th>timestamp</th>\n",
                                    "      <th>value</th>\n",
                                    "    </tr>\n",
@@ -755,7 +755,7 @@
                                    "</div>"
                               ],
                               "text/plain": [
-                                   "      dw_ek_borger           timestamp  value\n",
+                                   "      id           timestamp  value\n",
                                    "1                4 1965-06-20 16:29:00      1\n",
                                    "3                7 1968-10-16 01:46:00      1\n",
                                    "6               12 1965-04-17 07:17:00      1\n",
@@ -860,7 +860,7 @@
                     "\n",
                     "How to handle multiple outcome values within interval days depends on your use case. In this case, we choose that any prediction time with at least one outcome (a timestamp labelled 1) within interval days is \"positive\". I.e., if there is both a 0 and a 1 within interval days, the prediction time should be labelled with a 1. We set resolve_multiple_fn = maximum to accomplish this.\n",
                     "\n",
-                    "We also specify that the outcome is not incident. This means that each entity id (dw_ek_borger) can experience the outcome more than once. \n",
+                    "We also specify that the outcome is not incident. This means that each entity id (id) can experience the outcome more than once. \n",
                     "\n",
                     "If the outcome was marked as incident, all prediction times after the entity experiences the outcome are dropped.\n",
                     "\n",
@@ -942,7 +942,7 @@
                               "  <thead>\n",
                               "    <tr style=\"text-align: right;\">\n",
                               "      <th></th>\n",
-                              "      <th>dw_ek_borger</th>\n",
+                              "      <th>id</th>\n",
                               "      <th>female</th>\n",
                               "    </tr>\n",
                               "  </thead>\n",
@@ -1008,7 +1008,7 @@
                               "</div>"
                          ],
                          "text/plain": [
-                              "      dw_ek_borger  female\n",
+                              "      id  female\n",
                               "0                0       0\n",
                               "1                1       1\n",
                               "2                2       1\n",
@@ -1070,7 +1070,7 @@
                     "\n",
                     "ts_flattener = TimeseriesFlattener(\n",
                     "    prediction_times_df=df_prediction_times,\n",
-                    "    id_col_name=\"dw_ek_borger\",\n",
+                    "    id_col_name=\"id\",\n",
                     "    timestamp_col_name=\"timestamp\",\n",
                     "    n_workers=1,\n",
                     "    drop_pred_times_with_insufficient_look_distance=True,\n",
@@ -1133,7 +1133,7 @@
                                    "│ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━┳━━━━━━━━┳━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━┳━━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━━┓  │\n",
                                    "│ ┃<span style=\"font-weight: bold\"> column_name                </span>┃<span style=\"font-weight: bold\"> NA  </span>┃<span style=\"font-weight: bold\"> NA %   </span>┃<span style=\"font-weight: bold\"> mean    </span>┃<span style=\"font-weight: bold\"> sd     </span>┃<span style=\"font-weight: bold\"> p0      </span>┃<span style=\"font-weight: bold\"> p25    </span>┃<span style=\"font-weight: bold\"> p75   </span>┃<span style=\"font-weight: bold\"> p100   </span>┃<span style=\"font-weight: bold\"> hist    </span>┃  │\n",
                                    "│ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━╇━━━━━━━━╇━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━╇━━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━━━━┩  │\n",
-                                   "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">dw_ek_borger              </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">     0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   5000</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  2900</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      3</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  2600</span> │ <span style=\"color: #008080; text-decoration-color: #008080\"> 7500</span> │ <span style=\"color: #008080; text-decoration-color: #008080\"> 10000</span> │ <span style=\"color: #008000; text-decoration-color: #008000\">█████▇ </span> │  │\n",
+                                   "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">id              </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">     0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   5000</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  2900</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      3</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  2600</span> │ <span style=\"color: #008080; text-decoration-color: #008080\"> 7500</span> │ <span style=\"color: #008080; text-decoration-color: #008080\"> 10000</span> │ <span style=\"color: #008000; text-decoration-color: #008000\">█████▇ </span> │  │\n",
                                    "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">pred_predictor_name_      </span> │ <span style=\"color: #008080; text-decoration-color: #008080\"> 72</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   1.8</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      5</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   1.6</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  0.097</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   3.9</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    6</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   9.9</span> │ <span style=\"color: #008000; text-decoration-color: #008000\">▁▃██▃▁ </span> │  │\n",
                                    "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">outc_outcome_name_wi      </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">     0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  0.064</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  0.25</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">     0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">     1</span> │ <span style=\"color: #008000; text-decoration-color: #008000\">█    ▁ </span> │  │\n",
                                    "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">pred_female               </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">     0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0.49</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0.5</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">     0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    1</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">     1</span> │ <span style=\"color: #008000; text-decoration-color: #008000\">█    █ </span> │  │\n",
@@ -1168,7 +1168,7 @@
                                    "│ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━┳━━━━━━━━┳━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━┳━━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━━┓  │\n",
                                    "│ ┃\u001b[1m \u001b[0m\u001b[1mcolumn_name               \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA %  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mmean   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1msd    \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp0     \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp25   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp75  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp100  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mhist   \u001b[0m\u001b[1m \u001b[0m┃  │\n",
                                    "│ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━╇━━━━━━━━╇━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━╇━━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━━━━┩  │\n",
-                                   "│ │ \u001b[38;5;141mdw_ek_borger              \u001b[0m │ \u001b[36m  0\u001b[0m │ \u001b[36m     0\u001b[0m │ \u001b[36m   5000\u001b[0m │ \u001b[36m  2900\u001b[0m │ \u001b[36m      3\u001b[0m │ \u001b[36m  2600\u001b[0m │ \u001b[36m 7500\u001b[0m │ \u001b[36m 10000\u001b[0m │ \u001b[32m█████▇ \u001b[0m │  │\n",
+                                   "│ │ \u001b[38;5;141mid              \u001b[0m │ \u001b[36m  0\u001b[0m │ \u001b[36m     0\u001b[0m │ \u001b[36m   5000\u001b[0m │ \u001b[36m  2900\u001b[0m │ \u001b[36m      3\u001b[0m │ \u001b[36m  2600\u001b[0m │ \u001b[36m 7500\u001b[0m │ \u001b[36m 10000\u001b[0m │ \u001b[32m█████▇ \u001b[0m │  │\n",
                                    "│ │ \u001b[38;5;141mpred_predictor_name_      \u001b[0m │ \u001b[36m 72\u001b[0m │ \u001b[36m   1.8\u001b[0m │ \u001b[36m      5\u001b[0m │ \u001b[36m   1.6\u001b[0m │ \u001b[36m  0.097\u001b[0m │ \u001b[36m   3.9\u001b[0m │ \u001b[36m    6\u001b[0m │ \u001b[36m   9.9\u001b[0m │ \u001b[32m▁▃██▃▁ \u001b[0m │  │\n",
                                    "│ │ \u001b[38;5;141moutc_outcome_name_wi      \u001b[0m │ \u001b[36m  0\u001b[0m │ \u001b[36m     0\u001b[0m │ \u001b[36m  0.064\u001b[0m │ \u001b[36m  0.25\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[36m     0\u001b[0m │ \u001b[36m    0\u001b[0m │ \u001b[36m     1\u001b[0m │ \u001b[32m█    ▁ \u001b[0m │  │\n",
                                    "│ │ \u001b[38;5;141mpred_female               \u001b[0m │ \u001b[36m  0\u001b[0m │ \u001b[36m     0\u001b[0m │ \u001b[36m   0.49\u001b[0m │ \u001b[36m   0.5\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[36m     0\u001b[0m │ \u001b[36m    1\u001b[0m │ \u001b[36m     1\u001b[0m │ \u001b[32m█    █ \u001b[0m │  │\n",
@@ -1212,7 +1212,7 @@
                                    "  <thead>\n",
                                    "    <tr style=\"text-align: right;\">\n",
                                    "      <th></th>\n",
-                                   "      <th>dw_ek_borger</th>\n",
+                                   "      <th>id</th>\n",
                                    "      <th>timestamp</th>\n",
                                    "      <th>prediction_time_uuid</th>\n",
                                    "      <th>pred_predictor_name_within_730_days_mean_fallback_nan</th>\n",
@@ -1326,7 +1326,7 @@
                                    "</div>"
                               ],
                               "text/plain": [
-                                   "      dw_ek_borger           timestamp      prediction_time_uuid  \\\n",
+                                   "      id           timestamp      prediction_time_uuid  \\\n",
                                    "0             9903 1968-05-09 21:24:00  9903-1968-05-09-21-24-00   \n",
                                    "1             6447 1967-09-25 18:08:00  6447-1967-09-25-18-08-00   \n",
                                    "2             4927 1968-06-30 12:13:00  4927-1968-06-30-12-13-00   \n",
diff --git a/tutorials/02_advanced.ipynb b/tutorials/02_advanced.ipynb
index 3f86125..b6f538f 100644
--- a/tutorials/02_advanced.ipynb
+++ b/tutorials/02_advanced.ipynb
@@ -1,751 +1,743 @@
 {
- "cells": [
-  {
-   "attachments": {},
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "In the basic tutorial we covered how to add static features, predictors and outcomes.\n",
-    "In this tutorial, we'll expand on that, covering how to effectively add many features by:\n",
-    "1. Utilising data loaders in a data_loaders registry,\n",
-    "2. Populating a dictionary from a long format dataframe,\n",
-    "3. Creating feature combinations from specifcations,\n",
-    "4. Using caching, so you can iterate on your datasets without having to complete full computations every time\n"
-   ]
-  },
-  {
-   "attachments": {},
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "# Using data loaders\n",
-    "Until now, we've loaded our data first and then created combinations. But what if your data lies in an SQL database, and you don't want to save it to disk?\n",
-    "\n",
-    "Time to introduce feature loaders. All feature spec objects can resolve from a loader function. The only requirement of that loader function is that it should return a values dataframe, which should contain an ID column, a timestamp column and a list of vlaues. This means you can have loaders that load from REDIS, SQL databases, or just from disk. Whatever you prefer.\n",
-    "\n",
-    "This function is then called when you initialise a specification.\n",
-    "\n",
-    "This loader is specified in the values_loader key like so:\n"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from skimpy import skim\n",
-    "from timeseriesflattener.testing.load_synth_data import load_synth_predictor_float\n",
-    "from timeseriesflattener.resolve_multiple_functions import mean\n",
-    "from timeseriesflattener.feature_spec_objects import PredictorSpec\n",
-    "from pprint import pprint\n",
-    "import numpy as np"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/html": [
-       "<div>\n",
-       "<style scoped>\n",
-       "    .dataframe tbody tr th:only-of-type {\n",
-       "        vertical-align: middle;\n",
-       "    }\n",
-       "\n",
-       "    .dataframe tbody tr th {\n",
-       "        vertical-align: top;\n",
-       "    }\n",
-       "\n",
-       "    .dataframe thead th {\n",
-       "        text-align: right;\n",
-       "    }\n",
-       "</style>\n",
-       "<table border=\"1\" class=\"dataframe\">\n",
-       "  <thead>\n",
-       "    <tr style=\"text-align: right;\">\n",
-       "      <th></th>\n",
-       "      <th>dw_ek_borger</th>\n",
-       "      <th>timestamp</th>\n",
-       "      <th>value</th>\n",
-       "    </tr>\n",
-       "  </thead>\n",
-       "  <tbody>\n",
-       "    <tr>\n",
-       "      <th>0</th>\n",
-       "      <td>9476</td>\n",
-       "      <td>1969-03-05 08:08:00</td>\n",
-       "      <td>0.816995</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>1</th>\n",
-       "      <td>4631</td>\n",
-       "      <td>1967-04-10 22:48:00</td>\n",
-       "      <td>4.818074</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>2</th>\n",
-       "      <td>3890</td>\n",
-       "      <td>1969-12-15 14:07:00</td>\n",
-       "      <td>2.503789</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>3</th>\n",
-       "      <td>1098</td>\n",
-       "      <td>1965-11-19 03:53:00</td>\n",
-       "      <td>3.515041</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>4</th>\n",
-       "      <td>1626</td>\n",
-       "      <td>1966-05-03 14:07:00</td>\n",
-       "      <td>4.353115</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>...</th>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>99995</th>\n",
-       "      <td>4542</td>\n",
-       "      <td>1968-06-01 17:09:00</td>\n",
-       "      <td>9.616722</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>99996</th>\n",
-       "      <td>4839</td>\n",
-       "      <td>1966-11-24 01:13:00</td>\n",
-       "      <td>0.235124</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>99997</th>\n",
-       "      <td>8168</td>\n",
-       "      <td>1969-07-30 01:45:00</td>\n",
-       "      <td>0.929738</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>99998</th>\n",
-       "      <td>9328</td>\n",
-       "      <td>1965-12-22 10:53:00</td>\n",
-       "      <td>5.124424</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>99999</th>\n",
-       "      <td>6582</td>\n",
-       "      <td>1965-02-10 09:52:00</td>\n",
-       "      <td>7.414466</td>\n",
-       "    </tr>\n",
-       "  </tbody>\n",
-       "</table>\n",
-       "<p>100000 rows × 3 columns</p>\n",
-       "</div>"
-      ],
-      "text/plain": [
-       "       dw_ek_borger           timestamp     value\n",
-       "0              9476 1969-03-05 08:08:00  0.816995\n",
-       "1              4631 1967-04-10 22:48:00  4.818074\n",
-       "2              3890 1969-12-15 14:07:00  2.503789\n",
-       "3              1098 1965-11-19 03:53:00  3.515041\n",
-       "4              1626 1966-05-03 14:07:00  4.353115\n",
-       "...             ...                 ...       ...\n",
-       "99995          4542 1968-06-01 17:09:00  9.616722\n",
-       "99996          4839 1966-11-24 01:13:00  0.235124\n",
-       "99997          8168 1969-07-30 01:45:00  0.929738\n",
-       "99998          9328 1965-12-22 10:53:00  5.124424\n",
-       "99999          6582 1965-02-10 09:52:00  7.414466\n",
-       "\n",
-       "[100000 rows x 3 columns]"
-      ]
-     },
-     "execution_count": 2,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "pred_spec_batch = PredictorSpec(\n",
-    "    values_loader=load_synth_predictor_float,\n",
-    "    lookbehind_days=730,\n",
-    "    fallback=np.nan,\n",
-    "    resolve_multiple_fn=mean,\n",
-    "    feature_name=\"predictor_name\",\n",
-    ")\n",
-    "\n",
-    "pred_spec_batch.values_df"
-   ]
-  },
-  {
-   "attachments": {},
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "## The data loaders registry\n",
-    "If you inspect the source code of load_synth_predictor_float, you'll see that it is decorated with @data_loaders.register(\"synth_predictor_float\")."
-   ]
-  },
-  {
-   "attachments": {},
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "```python\n",
-    "@data_loaders.register(\"synth_predictor_float\")\n",
-    "def load_synth_predictor_float(\n",
-    "    n_rows: Optional[int] = None,\n",
-    ") -> pd.DataFrame:\n",
-    "    \"\"\"Load synth predictor data.\".\n",
-    "\n",
-    "    Args:\n",
-    "        n_rows: Number of rows to return. Defaults to None which returns entire coercion data view.\n",
-    "\n",
-    "    Returns:\n",
-    "        pd.DataFrame\n",
-    "    \"\"\"\n",
-    "    return load_raw_test_csv(\"synth_raw_float_1.csv\", n_rows=n_rows)\n",
-    "```"
-   ]
-  },
-  {
-   "attachments": {},
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "This registers it in the data_loaders registry under the \"synth_predictor_float\" key."
-   ]
-  },
-  {
-   "attachments": {},
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "When you initialise a feature specification, it will look at the type of its `values_loader` attribute. If its type is a string, it will look for that string as a key in the data loaders registry. If it finds it, it'll resolve it to the value, in this case the `load_synth_predictor_float` function, and call that function.\n",
-    "\n",
-    "The same concept applies for the resolve multiple functions.\n",
-    "This is super handy if you e.g. want to parse a config file, and therefore prefer to specify your data loaders as strings."
-   ]
-  },
-  {
-   "attachments": {},
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "# Creating feature combinations\n",
-    "Manually specifying a handful of features one at a time is rather straightforward, but what if you want to generate hundreds of features? Or want to have multiple different lookbehind windows, e.g. a month, 6 months and a year? Then the amount of code you'll have to write will grow quite substantially and becomes time consuming and hard to navigate.\n",
-    "\n",
-    "To solve this problem, we implemented feature group specifications. They allow you to combinatorially create features. Let's look at an example:\n"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from timeseriesflattener.feature_spec_objects import PredictorGroupSpec\n",
-    "from timeseriesflattener.resolve_multiple_functions import maximum"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "pred_spec_batch = PredictorGroupSpec(\n",
-    "    values_loader=[\"synth_predictor_float\"],\n",
-    "    lookbehind_days=[365, 730],\n",
-    "    fallback=[np.nan],\n",
-    "    resolve_multiple_fn=[mean, maximum],\n",
-    ").create_combinations()"
-   ]
-  },
-  {
-   "attachments": {},
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "You'll note that:\n",
-    "\n",
-    "1. All attributes are now required to be lists. This makes iteration easier when creating the combinations.\n",
-    "2. We require values_loaders to be strings that can be resolved from the registry. This string is also used when creating the column names - otherwise we wouldn't know what to call the columns.\n",
-    "\n",
-    "Let's check that the results look good."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "––––––––– We created 4 combinations of predictors. ––––––––––\n",
-      "[{'feature_name': 'synth_predictor_float',\n",
-      "  'lookbehind_days': 365,\n",
-      "  'resolve_multiple_fn': 'mean'},\n",
-      " {'feature_name': 'synth_predictor_float',\n",
-      "  'lookbehind_days': 730,\n",
-      "  'resolve_multiple_fn': 'mean'},\n",
-      " {'feature_name': 'synth_predictor_float',\n",
-      "  'lookbehind_days': 365,\n",
-      "  'resolve_multiple_fn': 'maximum'},\n",
-      " {'feature_name': 'synth_predictor_float',\n",
-      "  'lookbehind_days': 730,\n",
-      "  'resolve_multiple_fn': 'maximum'}]\n"
-     ]
-    }
-   ],
-   "source": [
-    "# Create a small summary to highlight the generated predictors\n",
-    "pred_spec_batch_summary = [\n",
-    "    {\n",
-    "        \"feature_name\": pred_spec.feature_name,\n",
-    "        \"lookbehind_days\": pred_spec.lookbehind_days,\n",
-    "        \"resolve_multiple_fn\": pred_spec.key_for_resolve_multiple,\n",
-    "    }\n",
-    "    for pred_spec in pred_spec_batch\n",
-    "]\n",
-    "print(\n",
-    "    f\"––––––––– We created {len(pred_spec_batch)} combinations of predictors. ––––––––––\"\n",
-    ")\n",
-    "pprint(pred_spec_batch_summary)"
-   ]
-  },
-  {
-   "attachments": {},
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "Now we know how to create a bunch of feature specifications quickly! But with more features comes more computation. Let's look at caching next, so we can iterate on our datasets more quickly."
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "# Caching"
-   ]
-  },
-  {
-   "attachments": {},
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "Timeseriesflattener ships with a class that allows for caching to disk. Let's look at an example of that:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 6,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from skimpy import skim\n",
-    "from timeseriesflattener.testing.load_synth_data import load_synth_prediction_times\n",
-    "from timeseriesflattener.feature_cache.cache_to_disk import DiskCache\n",
-    "from timeseriesflattener.flattened_dataset import TimeseriesFlattener\n",
-    "from pathlib import Path"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 7,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "ts_flattener = TimeseriesFlattener(\n",
-    "    prediction_times_df=load_synth_prediction_times(),\n",
-    "    id_col_name=\"dw_ek_borger\",\n",
-    "    timestamp_col_name=\"timestamp\",\n",
-    "    n_workers=4,\n",
-    "    cache=DiskCache(feature_cache_dir=Path(\".tmp\") / \"feature_cache\"),\n",
-    "    drop_pred_times_with_insufficient_look_distance=True,\n",
-    ")"
-   ]
-  },
-  {
-   "attachments": {},
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "All we need to specify is that we use the DiskCache class, and which directory to save the feature cache to.\n",
-    "\n",
-    "The first time we create features, this will just save them to disk and won't make any difference to performance. But say we want to add two more features - then it'll load the features that it has already computed from disk, and then only compute the two new features.\n",
-    "\n",
-    "Note that DiskCache is an instance of the abstract class FeatureCache. If you want to implement your own cache, for example using REDIS or SQL, all you'll need is to implement the 3 methods in that class. Now, let's compute a dataframe to check that everything works."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 8,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "ts_flattener.add_spec(pred_spec_batch)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 9,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "2022-12-08 14:14:12 [INFO] There were unprocessed specs, computing...\n",
-      "2022-12-08 14:14:12 [INFO] _drop_pred_time_if_insufficient_look_distance: Dropped 4038 (0.4%) rows\n",
-      "100%|██████████| 4/4 [00:01<00:00,  3.08it/s]\n",
-      "2022-12-08 14:14:13 [INFO] Starting concatenation. Will take some time on performant systems, e.g. 30s for 100 features. This is normal.\n",
-      "2022-12-08 14:14:13 [INFO] Concatenation took 0.018 seconds\n",
-      "2022-12-08 14:14:13 [INFO] Merging with original df\n"
-     ]
-    }
-   ],
-   "source": [
-    "df = ts_flattener.get_df()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 10,
-   "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/html": [
-       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">╭──────────────────────────────────────────────── skimpy summary ─────────────────────────────────────────────────╮\n",
-       "│ <span style=\"font-style: italic\">         Data Summary         </span> <span style=\"font-style: italic\">      Data Types       </span>                                                          │\n",
-       "│ ┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┓ ┏━━━━━━━━━━━━━┳━━━━━━━┓                                                          │\n",
-       "│ ┃<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> dataframe         </span>┃<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> Values </span>┃ ┃<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> Column Type </span>┃<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> Count </span>┃                                                          │\n",
-       "│ ┡━━━━━━━━━━━━━━━━━━━╇━━━━━━━━┩ ┡━━━━━━━━━━━━━╇━━━━━━━┩                                                          │\n",
-       "│ │ Number of rows    │ 5962   │ │ float64     │ 4     │                                                          │\n",
-       "│ │ Number of columns │ 7      │ │ int64       │ 1     │                                                          │\n",
-       "│ └───────────────────┴────────┘ │ datetime64  │ 1     │                                                          │\n",
-       "│                                │ string      │ 1     │                                                          │\n",
-       "│                                └─────────────┴───────┘                                                          │\n",
-       "│ <span style=\"font-style: italic\">                                                    number                                                    </span>  │\n",
-       "│ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━━┓  │\n",
-       "│ ┃<span style=\"font-weight: bold\"> column_name               </span>┃<span style=\"font-weight: bold\"> NA    </span>┃<span style=\"font-weight: bold\"> NA %   </span>┃<span style=\"font-weight: bold\"> mean   </span>┃<span style=\"font-weight: bold\"> sd    </span>┃<span style=\"font-weight: bold\"> p0        </span>┃<span style=\"font-weight: bold\"> p25   </span>┃<span style=\"font-weight: bold\"> p75   </span>┃<span style=\"font-weight: bold\"> p100   </span>┃<span style=\"font-weight: bold\"> hist    </span>┃  │\n",
-       "│ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━━━━┩  │\n",
-       "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">dw_ek_borger             </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">     0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  5000</span> │ <span style=\"color: #008080; text-decoration-color: #008080\"> 2900</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">        0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\"> 2500</span> │ <span style=\"color: #008080; text-decoration-color: #008080\"> 7400</span> │ <span style=\"color: #008080; text-decoration-color: #008080\"> 10000</span> │ <span style=\"color: #008000; text-decoration-color: #008000\">█▇███▇ </span> │  │\n",
-       "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">pred_synth_predictor     </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  820</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    14</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   6.6</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  2.6</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  0.00039</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  4.8</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  8.8</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    10</span> │ <span style=\"color: #008000; text-decoration-color: #008000\">▁▂▃▄▆█ </span> │  │\n",
-       "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">pred_synth_predictor     </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  820</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    14</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">     5</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  2.1</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  0.00039</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  3.5</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  6.4</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    10</span> │ <span style=\"color: #008000; text-decoration-color: #008000\">▂▄██▄▂ </span> │  │\n",
-       "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">pred_synth_predictor     </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  110</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   1.8</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   7.7</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  2.1</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    0.058</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  6.7</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  9.3</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    10</span> │ <span style=\"color: #008000; text-decoration-color: #008000\"> ▁▁▂▄█ </span> │  │\n",
-       "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">pred_synth_predictor     </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  110</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   1.8</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">     5</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  1.7</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    0.058</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  3.9</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  6.1</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   9.9</span> │ <span style=\"color: #008000; text-decoration-color: #008000\">▁▃██▃▁ </span> │  │\n",
-       "│ └───────────────────────────┴───────┴────────┴────────┴───────┴───────────┴───────┴───────┴────────┴─────────┘  │\n",
-       "│ <span style=\"font-style: italic\">                                                   datetime                                                   </span>  │\n",
-       "│ ┏━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓  │\n",
-       "│ ┃<span style=\"font-weight: bold\"> column_name      </span>┃<span style=\"font-weight: bold\"> NA   </span>┃<span style=\"font-weight: bold\"> NA %    </span>┃<span style=\"font-weight: bold\"> first                      </span>┃<span style=\"font-weight: bold\"> last                       </span>┃<span style=\"font-weight: bold\"> frequency    </span>┃  │\n",
-       "│ ┡━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━┩  │\n",
-       "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">timestamp       </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #800000; text-decoration-color: #800000\">   1967-01-02 01:16:00    </span> │ <span style=\"color: #800000; text-decoration-color: #800000\">   1969-12-31 21:42:00    </span> │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">None        </span> │  │\n",
-       "│ └──────────────────┴──────┴─────────┴────────────────────────────┴────────────────────────────┴──────────────┘  │\n",
-       "│ <span style=\"font-style: italic\">                                                    string                                                    </span>  │\n",
-       "│ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓  │\n",
-       "│ ┃<span style=\"font-weight: bold\"> column_name                           </span>┃<span style=\"font-weight: bold\"> NA    </span>┃<span style=\"font-weight: bold\"> NA %      </span>┃<span style=\"font-weight: bold\"> words per row            </span>┃<span style=\"font-weight: bold\"> total words         </span>┃  │\n",
-       "│ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━┩  │\n",
-       "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">prediction_time_uuid                 </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">        0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">                       1</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">               6000</span> │  │\n",
-       "│ └───────────────────────────────────────┴───────┴───────────┴──────────────────────────┴─────────────────────┘  │\n",
-       "╰────────────────────────────────────────────────────── End ──────────────────────────────────────────────────────╯\n",
-       "</pre>\n"
-      ],
-      "text/plain": [
-       "╭──────────────────────────────────────────────── skimpy summary ─────────────────────────────────────────────────╮\n",
-       "│ \u001b[3m         Data Summary         \u001b[0m \u001b[3m      Data Types       \u001b[0m                                                          │\n",
-       "│ ┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┓ ┏━━━━━━━━━━━━━┳━━━━━━━┓                                                          │\n",
-       "│ ┃\u001b[1;36m \u001b[0m\u001b[1;36mdataframe        \u001b[0m\u001b[1;36m \u001b[0m┃\u001b[1;36m \u001b[0m\u001b[1;36mValues\u001b[0m\u001b[1;36m \u001b[0m┃ ┃\u001b[1;36m \u001b[0m\u001b[1;36mColumn Type\u001b[0m\u001b[1;36m \u001b[0m┃\u001b[1;36m \u001b[0m\u001b[1;36mCount\u001b[0m\u001b[1;36m \u001b[0m┃                                                          │\n",
-       "│ ┡━━━━━━━━━━━━━━━━━━━╇━━━━━━━━┩ ┡━━━━━━━━━━━━━╇━━━━━━━┩                                                          │\n",
-       "│ │ Number of rows    │ 5962   │ │ float64     │ 4     │                                                          │\n",
-       "│ │ Number of columns │ 7      │ │ int64       │ 1     │                                                          │\n",
-       "│ └───────────────────┴────────┘ │ datetime64  │ 1     │                                                          │\n",
-       "│                                │ string      │ 1     │                                                          │\n",
-       "│                                └─────────────┴───────┘                                                          │\n",
-       "│ \u001b[3m                                                    number                                                    \u001b[0m  │\n",
-       "│ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━━┓  │\n",
-       "│ ┃\u001b[1m \u001b[0m\u001b[1mcolumn_name              \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA %  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mmean  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1msd   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp0       \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp25  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp75  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp100  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mhist   \u001b[0m\u001b[1m \u001b[0m┃  │\n",
-       "│ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━━━━┩  │\n",
-       "│ │ \u001b[38;5;141mdw_ek_borger             \u001b[0m │ \u001b[36m    0\u001b[0m │ \u001b[36m     0\u001b[0m │ \u001b[36m  5000\u001b[0m │ \u001b[36m 2900\u001b[0m │ \u001b[36m        0\u001b[0m │ \u001b[36m 2500\u001b[0m │ \u001b[36m 7400\u001b[0m │ \u001b[36m 10000\u001b[0m │ \u001b[32m█▇███▇ \u001b[0m │  │\n",
-       "│ │ \u001b[38;5;141mpred_synth_predictor     \u001b[0m │ \u001b[36m  820\u001b[0m │ \u001b[36m    14\u001b[0m │ \u001b[36m   6.6\u001b[0m │ \u001b[36m  2.6\u001b[0m │ \u001b[36m  0.00039\u001b[0m │ \u001b[36m  4.8\u001b[0m │ \u001b[36m  8.8\u001b[0m │ \u001b[36m    10\u001b[0m │ \u001b[32m▁▂▃▄▆█ \u001b[0m │  │\n",
-       "│ │ \u001b[38;5;141mpred_synth_predictor     \u001b[0m │ \u001b[36m  820\u001b[0m │ \u001b[36m    14\u001b[0m │ \u001b[36m     5\u001b[0m │ \u001b[36m  2.1\u001b[0m │ \u001b[36m  0.00039\u001b[0m │ \u001b[36m  3.5\u001b[0m │ \u001b[36m  6.4\u001b[0m │ \u001b[36m    10\u001b[0m │ \u001b[32m▂▄██▄▂ \u001b[0m │  │\n",
-       "│ │ \u001b[38;5;141mpred_synth_predictor     \u001b[0m │ \u001b[36m  110\u001b[0m │ \u001b[36m   1.8\u001b[0m │ \u001b[36m   7.7\u001b[0m │ \u001b[36m  2.1\u001b[0m │ \u001b[36m    0.058\u001b[0m │ \u001b[36m  6.7\u001b[0m │ \u001b[36m  9.3\u001b[0m │ \u001b[36m    10\u001b[0m │ \u001b[32m ▁▁▂▄█ \u001b[0m │  │\n",
-       "│ │ \u001b[38;5;141mpred_synth_predictor     \u001b[0m │ \u001b[36m  110\u001b[0m │ \u001b[36m   1.8\u001b[0m │ \u001b[36m     5\u001b[0m │ \u001b[36m  1.7\u001b[0m │ \u001b[36m    0.058\u001b[0m │ \u001b[36m  3.9\u001b[0m │ \u001b[36m  6.1\u001b[0m │ \u001b[36m   9.9\u001b[0m │ \u001b[32m▁▃██▃▁ \u001b[0m │  │\n",
-       "│ └───────────────────────────┴───────┴────────┴────────┴───────┴───────────┴───────┴───────┴────────┴─────────┘  │\n",
-       "│ \u001b[3m                                                   datetime                                                   \u001b[0m  │\n",
-       "│ ┏━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓  │\n",
-       "│ ┃\u001b[1m \u001b[0m\u001b[1mcolumn_name     \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA %   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mfirst                     \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mlast                      \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mfrequency   \u001b[0m\u001b[1m \u001b[0m┃  │\n",
-       "│ ┡━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━┩  │\n",
-       "│ │ \u001b[38;5;141mtimestamp       \u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[31m   1967-01-02 01:16:00    \u001b[0m │ \u001b[31m   1969-12-31 21:42:00    \u001b[0m │ \u001b[38;5;141mNone        \u001b[0m │  │\n",
-       "│ └──────────────────┴──────┴─────────┴────────────────────────────┴────────────────────────────┴──────────────┘  │\n",
-       "│ \u001b[3m                                                    string                                                    \u001b[0m  │\n",
-       "│ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓  │\n",
-       "│ ┃\u001b[1m \u001b[0m\u001b[1mcolumn_name                          \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA %     \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mwords per row           \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mtotal words        \u001b[0m\u001b[1m \u001b[0m┃  │\n",
-       "│ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━┩  │\n",
-       "│ │ \u001b[38;5;141mprediction_time_uuid                 \u001b[0m │ \u001b[36m    0\u001b[0m │ \u001b[36m        0\u001b[0m │ \u001b[36m                       1\u001b[0m │ \u001b[36m               6000\u001b[0m │  │\n",
-       "│ └───────────────────────────────────────┴───────┴───────────┴──────────────────────────┴─────────────────────┘  │\n",
-       "╰────────────────────────────────────────────────────── End ──────────────────────────────────────────────────────╯\n"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
+    "cells": [{
+            "attachments": {},
+            "cell_type": "markdown",
+            "metadata": {},
+            "source": [
+                "In the basic tutorial we covered how to add static features, predictors and outcomes.\n",
+                "In this tutorial, we'll expand on that, covering how to effectively add many features by:\n",
+                "1. Utilising data loaders in a data_loaders registry,\n",
+                "2. Populating a dictionary from a long format dataframe,\n",
+                "3. Creating feature combinations from specifcations,\n",
+                "4. Using caching, so you can iterate on your datasets without having to complete full computations every time\n"
+            ]
+        },
+        {
+            "attachments": {},
+            "cell_type": "markdown",
+            "metadata": {},
+            "source": [
+                "# Using data loaders\n",
+                "Until now, we've loaded our data first and then created combinations. But what if your data lies in an SQL database, and you don't want to save it to disk?\n",
+                "\n",
+                "Time to introduce feature loaders. All feature spec objects can resolve from a loader function. The only requirement of that loader function is that it should return a values dataframe, which should contain an ID column, a timestamp column and a list of vlaues. This means you can have loaders that load from REDIS, SQL databases, or just from disk. Whatever you prefer.\n",
+                "\n",
+                "This function is then called when you initialise a specification.\n",
+                "\n",
+                "This loader is specified in the values_loader key like so:\n"
+            ]
+        },
+        {
+            "cell_type": "code",
+            "execution_count": 1,
+            "metadata": {},
+            "outputs": [],
+            "source": [
+                "from skimpy import skim\n",
+                "from timeseriesflattener.testing.load_synth_data import load_synth_predictor_float\n",
+                "from timeseriesflattener.resolve_multiple_functions import mean\n",
+                "from timeseriesflattener.feature_spec_objects import PredictorSpec\n",
+                "from pprint import pprint\n",
+                "import numpy as np"
+            ]
+        },
+        {
+            "cell_type": "code",
+            "execution_count": 2,
+            "metadata": {},
+            "outputs": [{
+                "data": {
+                    "text/html": [
+                        "<div>\n",
+                        "<style scoped>\n",
+                        "    .dataframe tbody tr th:only-of-type {\n",
+                        "        vertical-align: middle;\n",
+                        "    }\n",
+                        "\n",
+                        "    .dataframe tbody tr th {\n",
+                        "        vertical-align: top;\n",
+                        "    }\n",
+                        "\n",
+                        "    .dataframe thead th {\n",
+                        "        text-align: right;\n",
+                        "    }\n",
+                        "</style>\n",
+                        "<table border=\"1\" class=\"dataframe\">\n",
+                        "  <thead>\n",
+                        "    <tr style=\"text-align: right;\">\n",
+                        "      <th></th>\n",
+                        "      <th>id</th>\n",
+                        "      <th>timestamp</th>\n",
+                        "      <th>value</th>\n",
+                        "    </tr>\n",
+                        "  </thead>\n",
+                        "  <tbody>\n",
+                        "    <tr>\n",
+                        "      <th>0</th>\n",
+                        "      <td>9476</td>\n",
+                        "      <td>1969-03-05 08:08:00</td>\n",
+                        "      <td>0.816995</td>\n",
+                        "    </tr>\n",
+                        "    <tr>\n",
+                        "      <th>1</th>\n",
+                        "      <td>4631</td>\n",
+                        "      <td>1967-04-10 22:48:00</td>\n",
+                        "      <td>4.818074</td>\n",
+                        "    </tr>\n",
+                        "    <tr>\n",
+                        "      <th>2</th>\n",
+                        "      <td>3890</td>\n",
+                        "      <td>1969-12-15 14:07:00</td>\n",
+                        "      <td>2.503789</td>\n",
+                        "    </tr>\n",
+                        "    <tr>\n",
+                        "      <th>3</th>\n",
+                        "      <td>1098</td>\n",
+                        "      <td>1965-11-19 03:53:00</td>\n",
+                        "      <td>3.515041</td>\n",
+                        "    </tr>\n",
+                        "    <tr>\n",
+                        "      <th>4</th>\n",
+                        "      <td>1626</td>\n",
+                        "      <td>1966-05-03 14:07:00</td>\n",
+                        "      <td>4.353115</td>\n",
+                        "    </tr>\n",
+                        "    <tr>\n",
+                        "      <th>...</th>\n",
+                        "      <td>...</td>\n",
+                        "      <td>...</td>\n",
+                        "      <td>...</td>\n",
+                        "    </tr>\n",
+                        "    <tr>\n",
+                        "      <th>99995</th>\n",
+                        "      <td>4542</td>\n",
+                        "      <td>1968-06-01 17:09:00</td>\n",
+                        "      <td>9.616722</td>\n",
+                        "    </tr>\n",
+                        "    <tr>\n",
+                        "      <th>99996</th>\n",
+                        "      <td>4839</td>\n",
+                        "      <td>1966-11-24 01:13:00</td>\n",
+                        "      <td>0.235124</td>\n",
+                        "    </tr>\n",
+                        "    <tr>\n",
+                        "      <th>99997</th>\n",
+                        "      <td>8168</td>\n",
+                        "      <td>1969-07-30 01:45:00</td>\n",
+                        "      <td>0.929738</td>\n",
+                        "    </tr>\n",
+                        "    <tr>\n",
+                        "      <th>99998</th>\n",
+                        "      <td>9328</td>\n",
+                        "      <td>1965-12-22 10:53:00</td>\n",
+                        "      <td>5.124424</td>\n",
+                        "    </tr>\n",
+                        "    <tr>\n",
+                        "      <th>99999</th>\n",
+                        "      <td>6582</td>\n",
+                        "      <td>1965-02-10 09:52:00</td>\n",
+                        "      <td>7.414466</td>\n",
+                        "    </tr>\n",
+                        "  </tbody>\n",
+                        "</table>\n",
+                        "<p>100000 rows × 3 columns</p>\n",
+                        "</div>"
+                    ],
+                    "text/plain": [
+                        "       id           timestamp     value\n",
+                        "0              9476 1969-03-05 08:08:00  0.816995\n",
+                        "1              4631 1967-04-10 22:48:00  4.818074\n",
+                        "2              3890 1969-12-15 14:07:00  2.503789\n",
+                        "3              1098 1965-11-19 03:53:00  3.515041\n",
+                        "4              1626 1966-05-03 14:07:00  4.353115\n",
+                        "...             ...                 ...       ...\n",
+                        "99995          4542 1968-06-01 17:09:00  9.616722\n",
+                        "99996          4839 1966-11-24 01:13:00  0.235124\n",
+                        "99997          8168 1969-07-30 01:45:00  0.929738\n",
+                        "99998          9328 1965-12-22 10:53:00  5.124424\n",
+                        "99999          6582 1965-02-10 09:52:00  7.414466\n",
+                        "\n",
+                        "[100000 rows x 3 columns]"
+                    ]
+                },
+                "execution_count": 2,
+                "metadata": {},
+                "output_type": "execute_result"
+            }],
+            "source": [
+                "pred_spec_batch = PredictorSpec(\n",
+                "    values_loader=load_synth_predictor_float,\n",
+                "    lookbehind_days=730,\n",
+                "    fallback=np.nan,\n",
+                "    resolve_multiple_fn=mean,\n",
+                "    feature_name=\"predictor_name\",\n",
+                ")\n",
+                "\n",
+                "pred_spec_batch.values_df"
+            ]
+        },
+        {
+            "attachments": {},
+            "cell_type": "markdown",
+            "metadata": {},
+            "source": [
+                "## The data loaders registry\n",
+                "If you inspect the source code of load_synth_predictor_float, you'll see that it is decorated with @data_loaders.register(\"synth_predictor_float\")."
+            ]
+        },
+        {
+            "attachments": {},
+            "cell_type": "markdown",
+            "metadata": {},
+            "source": [
+                "```python\n",
+                "@data_loaders.register(\"synth_predictor_float\")\n",
+                "def load_synth_predictor_float(\n",
+                "    n_rows: Optional[int] = None,\n",
+                ") -> pd.DataFrame:\n",
+                "    \"\"\"Load synth predictor data.\".\n",
+                "\n",
+                "    Args:\n",
+                "        n_rows: Number of rows to return. Defaults to None which returns entire coercion data view.\n",
+                "\n",
+                "    Returns:\n",
+                "        pd.DataFrame\n",
+                "    \"\"\"\n",
+                "    return load_raw_test_csv(\"synth_raw_float_1.csv\", n_rows=n_rows)\n",
+                "```"
+            ]
+        },
+        {
+            "attachments": {},
+            "cell_type": "markdown",
+            "metadata": {},
+            "source": [
+                "This registers it in the data_loaders registry under the \"synth_predictor_float\" key."
+            ]
+        },
+        {
+            "attachments": {},
+            "cell_type": "markdown",
+            "metadata": {},
+            "source": [
+                "When you initialise a feature specification, it will look at the type of its `values_loader` attribute. If its type is a string, it will look for that string as a key in the data loaders registry. If it finds it, it'll resolve it to the value, in this case the `load_synth_predictor_float` function, and call that function.\n",
+                "\n",
+                "The same concept applies for the resolve multiple functions.\n",
+                "This is super handy if you e.g. want to parse a config file, and therefore prefer to specify your data loaders as strings."
+            ]
+        },
+        {
+            "attachments": {},
+            "cell_type": "markdown",
+            "metadata": {},
+            "source": [
+                "# Creating feature combinations\n",
+                "Manually specifying a handful of features one at a time is rather straightforward, but what if you want to generate hundreds of features? Or want to have multiple different lookbehind windows, e.g. a month, 6 months and a year? Then the amount of code you'll have to write will grow quite substantially and becomes time consuming and hard to navigate.\n",
+                "\n",
+                "To solve this problem, we implemented feature group specifications. They allow you to combinatorially create features. Let's look at an example:\n"
+            ]
+        },
+        {
+            "cell_type": "code",
+            "execution_count": 3,
+            "metadata": {},
+            "outputs": [],
+            "source": [
+                "from timeseriesflattener.feature_spec_objects import PredictorGroupSpec\n",
+                "from timeseriesflattener.resolve_multiple_functions import maximum"
+            ]
+        },
+        {
+            "cell_type": "code",
+            "execution_count": 4,
+            "metadata": {},
+            "outputs": [],
+            "source": [
+                "pred_spec_batch = PredictorGroupSpec(\n",
+                "    values_loader=[\"synth_predictor_float\"],\n",
+                "    lookbehind_days=[365, 730],\n",
+                "    fallback=[np.nan],\n",
+                "    resolve_multiple_fn=[mean, maximum],\n",
+                ").create_combinations()"
+            ]
+        },
+        {
+            "attachments": {},
+            "cell_type": "markdown",
+            "metadata": {},
+            "source": [
+                "You'll note that:\n",
+                "\n",
+                "1. All attributes are now required to be lists. This makes iteration easier when creating the combinations.\n",
+                "2. We require values_loaders to be strings that can be resolved from the registry. This string is also used when creating the column names - otherwise we wouldn't know what to call the columns.\n",
+                "\n",
+                "Let's check that the results look good."
+            ]
+        },
+        {
+            "cell_type": "code",
+            "execution_count": 5,
+            "metadata": {},
+            "outputs": [{
+                "name": "stdout",
+                "output_type": "stream",
+                "text": [
+                    "––––––––– We created 4 combinations of predictors. ––––––––––\n",
+                    "[{'feature_name': 'synth_predictor_float',\n",
+                    "  'lookbehind_days': 365,\n",
+                    "  'resolve_multiple_fn': 'mean'},\n",
+                    " {'feature_name': 'synth_predictor_float',\n",
+                    "  'lookbehind_days': 730,\n",
+                    "  'resolve_multiple_fn': 'mean'},\n",
+                    " {'feature_name': 'synth_predictor_float',\n",
+                    "  'lookbehind_days': 365,\n",
+                    "  'resolve_multiple_fn': 'maximum'},\n",
+                    " {'feature_name': 'synth_predictor_float',\n",
+                    "  'lookbehind_days': 730,\n",
+                    "  'resolve_multiple_fn': 'maximum'}]\n"
+                ]
+            }],
+            "source": [
+                "# Create a small summary to highlight the generated predictors\n",
+                "pred_spec_batch_summary = [\n",
+                "    {\n",
+                "        \"feature_name\": pred_spec.feature_name,\n",
+                "        \"lookbehind_days\": pred_spec.lookbehind_days,\n",
+                "        \"resolve_multiple_fn\": pred_spec.key_for_resolve_multiple,\n",
+                "    }\n",
+                "    for pred_spec in pred_spec_batch\n",
+                "]\n",
+                "print(\n",
+                "    f\"––––––––– We created {len(pred_spec_batch)} combinations of predictors. ––––––––––\"\n",
+                ")\n",
+                "pprint(pred_spec_batch_summary)"
+            ]
+        },
+        {
+            "attachments": {},
+            "cell_type": "markdown",
+            "metadata": {},
+            "source": [
+                "Now we know how to create a bunch of feature specifications quickly! But with more features comes more computation. Let's look at caching next, so we can iterate on our datasets more quickly."
+            ]
+        },
+        {
+            "cell_type": "markdown",
+            "metadata": {},
+            "source": [
+                "# Caching"
+            ]
+        },
+        {
+            "attachments": {},
+            "cell_type": "markdown",
+            "metadata": {},
+            "source": [
+                "Timeseriesflattener ships with a class that allows for caching to disk. Let's look at an example of that:"
+            ]
+        },
+        {
+            "cell_type": "code",
+            "execution_count": 6,
+            "metadata": {},
+            "outputs": [],
+            "source": [
+                "from skimpy import skim\n",
+                "from timeseriesflattener.testing.load_synth_data import load_synth_prediction_times\n",
+                "from timeseriesflattener.feature_cache.cache_to_disk import DiskCache\n",
+                "from timeseriesflattener.flattened_dataset import TimeseriesFlattener\n",
+                "from pathlib import Path"
+            ]
+        },
+        {
+            "cell_type": "code",
+            "execution_count": 7,
+            "metadata": {},
+            "outputs": [],
+            "source": [
+                "ts_flattener = TimeseriesFlattener(\n",
+                "    prediction_times_df=load_synth_prediction_times(),\n",
+                "    id_col_name=\"id\",\n",
+                "    timestamp_col_name=\"timestamp\",\n",
+                "    n_workers=4,\n",
+                "    cache=DiskCache(feature_cache_dir=Path(\".tmp\") / \"feature_cache\"),\n",
+                "    drop_pred_times_with_insufficient_look_distance=True,\n",
+                ")"
+            ]
+        },
+        {
+            "attachments": {},
+            "cell_type": "markdown",
+            "metadata": {},
+            "source": [
+                "All we need to specify is that we use the DiskCache class, and which directory to save the feature cache to.\n",
+                "\n",
+                "The first time we create features, this will just save them to disk and won't make any difference to performance. But say we want to add two more features - then it'll load the features that it has already computed from disk, and then only compute the two new features.\n",
+                "\n",
+                "Note that DiskCache is an instance of the abstract class FeatureCache. If you want to implement your own cache, for example using REDIS or SQL, all you'll need is to implement the 3 methods in that class. Now, let's compute a dataframe to check that everything works."
+            ]
+        },
+        {
+            "cell_type": "code",
+            "execution_count": 8,
+            "metadata": {},
+            "outputs": [],
+            "source": [
+                "ts_flattener.add_spec(pred_spec_batch)"
+            ]
+        },
+        {
+            "cell_type": "code",
+            "execution_count": 9,
+            "metadata": {},
+            "outputs": [{
+                "name": "stderr",
+                "output_type": "stream",
+                "text": [
+                    "2022-12-08 14:14:12 [INFO] There were unprocessed specs, computing...\n",
+                    "2022-12-08 14:14:12 [INFO] _drop_pred_time_if_insufficient_look_distance: Dropped 4038 (0.4%) rows\n",
+                    "100%|██████████| 4/4 [00:01<00:00,  3.08it/s]\n",
+                    "2022-12-08 14:14:13 [INFO] Starting concatenation. Will take some time on performant systems, e.g. 30s for 100 features. This is normal.\n",
+                    "2022-12-08 14:14:13 [INFO] Concatenation took 0.018 seconds\n",
+                    "2022-12-08 14:14:13 [INFO] Merging with original df\n"
+                ]
+            }],
+            "source": [
+                "df = ts_flattener.get_df()"
+            ]
+        },
+        {
+            "cell_type": "code",
+            "execution_count": 10,
+            "metadata": {},
+            "outputs": [{
+                    "data": {
+                        "text/html": [
+                            "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">╭──────────────────────────────────────────────── skimpy summary ─────────────────────────────────────────────────╮\n",
+                            "│ <span style=\"font-style: italic\">         Data Summary         </span> <span style=\"font-style: italic\">      Data Types       </span>                                                          │\n",
+                            "│ ┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┓ ┏━━━━━━━━━━━━━┳━━━━━━━┓                                                          │\n",
+                            "│ ┃<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> dataframe         </span>┃<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> Values </span>┃ ┃<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> Column Type </span>┃<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\"> Count </span>┃                                                          │\n",
+                            "│ ┡━━━━━━━━━━━━━━━━━━━╇━━━━━━━━┩ ┡━━━━━━━━━━━━━╇━━━━━━━┩                                                          │\n",
+                            "│ │ Number of rows    │ 5962   │ │ float64     │ 4     │                                                          │\n",
+                            "│ │ Number of columns │ 7      │ │ int64       │ 1     │                                                          │\n",
+                            "│ └───────────────────┴────────┘ │ datetime64  │ 1     │                                                          │\n",
+                            "│                                │ string      │ 1     │                                                          │\n",
+                            "│                                └─────────────┴───────┘                                                          │\n",
+                            "│ <span style=\"font-style: italic\">                                                    number                                                    </span>  │\n",
+                            "│ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━━┓  │\n",
+                            "│ ┃<span style=\"font-weight: bold\"> column_name               </span>┃<span style=\"font-weight: bold\"> NA    </span>┃<span style=\"font-weight: bold\"> NA %   </span>┃<span style=\"font-weight: bold\"> mean   </span>┃<span style=\"font-weight: bold\"> sd    </span>┃<span style=\"font-weight: bold\"> p0        </span>┃<span style=\"font-weight: bold\"> p25   </span>┃<span style=\"font-weight: bold\"> p75   </span>┃<span style=\"font-weight: bold\"> p100   </span>┃<span style=\"font-weight: bold\"> hist    </span>┃  │\n",
+                            "│ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━━━━┩  │\n",
+                            "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">id             </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">     0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  5000</span> │ <span style=\"color: #008080; text-decoration-color: #008080\"> 2900</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">        0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\"> 2500</span> │ <span style=\"color: #008080; text-decoration-color: #008080\"> 7400</span> │ <span style=\"color: #008080; text-decoration-color: #008080\"> 10000</span> │ <span style=\"color: #008000; text-decoration-color: #008000\">█▇███▇ </span> │  │\n",
+                            "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">pred_synth_predictor     </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  820</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    14</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   6.6</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  2.6</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  0.00039</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  4.8</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  8.8</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    10</span> │ <span style=\"color: #008000; text-decoration-color: #008000\">▁▂▃▄▆█ </span> │  │\n",
+                            "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">pred_synth_predictor     </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  820</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    14</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">     5</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  2.1</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  0.00039</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  3.5</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  6.4</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    10</span> │ <span style=\"color: #008000; text-decoration-color: #008000\">▂▄██▄▂ </span> │  │\n",
+                            "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">pred_synth_predictor     </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  110</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   1.8</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   7.7</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  2.1</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    0.058</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  6.7</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  9.3</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    10</span> │ <span style=\"color: #008000; text-decoration-color: #008000\"> ▁▁▂▄█ </span> │  │\n",
+                            "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">pred_synth_predictor     </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  110</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   1.8</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">     5</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  1.7</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    0.058</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  3.9</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">  6.1</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   9.9</span> │ <span style=\"color: #008000; text-decoration-color: #008000\">▁▃██▃▁ </span> │  │\n",
+                            "│ └───────────────────────────┴───────┴────────┴────────┴───────┴───────────┴───────┴───────┴────────┴─────────┘  │\n",
+                            "│ <span style=\"font-style: italic\">                                                   datetime                                                   </span>  │\n",
+                            "│ ┏━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓  │\n",
+                            "│ ┃<span style=\"font-weight: bold\"> column_name      </span>┃<span style=\"font-weight: bold\"> NA   </span>┃<span style=\"font-weight: bold\"> NA %    </span>┃<span style=\"font-weight: bold\"> first                      </span>┃<span style=\"font-weight: bold\"> last                       </span>┃<span style=\"font-weight: bold\"> frequency    </span>┃  │\n",
+                            "│ ┡━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━┩  │\n",
+                            "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">timestamp       </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">   0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">      0</span> │ <span style=\"color: #800000; text-decoration-color: #800000\">   1967-01-02 01:16:00    </span> │ <span style=\"color: #800000; text-decoration-color: #800000\">   1969-12-31 21:42:00    </span> │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">None        </span> │  │\n",
+                            "│ └──────────────────┴──────┴─────────┴────────────────────────────┴────────────────────────────┴──────────────┘  │\n",
+                            "│ <span style=\"font-style: italic\">                                                    string                                                    </span>  │\n",
+                            "│ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓  │\n",
+                            "│ ┃<span style=\"font-weight: bold\"> column_name                           </span>┃<span style=\"font-weight: bold\"> NA    </span>┃<span style=\"font-weight: bold\"> NA %      </span>┃<span style=\"font-weight: bold\"> words per row            </span>┃<span style=\"font-weight: bold\"> total words         </span>┃  │\n",
+                            "│ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━┩  │\n",
+                            "│ │ <span style=\"color: #af87ff; text-decoration-color: #af87ff\">prediction_time_uuid                 </span> │ <span style=\"color: #008080; text-decoration-color: #008080\">    0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">        0</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">                       1</span> │ <span style=\"color: #008080; text-decoration-color: #008080\">               6000</span> │  │\n",
+                            "│ └───────────────────────────────────────┴───────┴───────────┴──────────────────────────┴─────────────────────┘  │\n",
+                            "╰────────────────────────────────────────────────────── End ──────────────────────────────────────────────────────╯\n",
+                            "</pre>\n"
+                        ],
+                        "text/plain": [
+                            "╭──────────────────────────────────────────────── skimpy summary ─────────────────────────────────────────────────╮\n",
+                            "│ \u001b[3m         Data Summary         \u001b[0m \u001b[3m      Data Types       \u001b[0m                                                          │\n",
+                            "│ ┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┓ ┏━━━━━━━━━━━━━┳━━━━━━━┓                                                          │\n",
+                            "│ ┃\u001b[1;36m \u001b[0m\u001b[1;36mdataframe        \u001b[0m\u001b[1;36m \u001b[0m┃\u001b[1;36m \u001b[0m\u001b[1;36mValues\u001b[0m\u001b[1;36m \u001b[0m┃ ┃\u001b[1;36m \u001b[0m\u001b[1;36mColumn Type\u001b[0m\u001b[1;36m \u001b[0m┃\u001b[1;36m \u001b[0m\u001b[1;36mCount\u001b[0m\u001b[1;36m \u001b[0m┃                                                          │\n",
+                            "│ ┡━━━━━━━━━━━━━━━━━━━╇━━━━━━━━┩ ┡━━━━━━━━━━━━━╇━━━━━━━┩                                                          │\n",
+                            "│ │ Number of rows    │ 5962   │ │ float64     │ 4     │                                                          │\n",
+                            "│ │ Number of columns │ 7      │ │ int64       │ 1     │                                                          │\n",
+                            "│ └───────────────────┴────────┘ │ datetime64  │ 1     │                                                          │\n",
+                            "│                                │ string      │ 1     │                                                          │\n",
+                            "│                                └─────────────┴───────┘                                                          │\n",
+                            "│ \u001b[3m                                                    number                                                    \u001b[0m  │\n",
+                            "│ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━━┓  │\n",
+                            "│ ┃\u001b[1m \u001b[0m\u001b[1mcolumn_name              \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA %  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mmean  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1msd   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp0       \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp25  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp75  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mp100  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mhist   \u001b[0m\u001b[1m \u001b[0m┃  │\n",
+                            "│ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━━━━┩  │\n",
+                            "│ │ \u001b[38;5;141mid             \u001b[0m │ \u001b[36m    0\u001b[0m │ \u001b[36m     0\u001b[0m │ \u001b[36m  5000\u001b[0m │ \u001b[36m 2900\u001b[0m │ \u001b[36m        0\u001b[0m │ \u001b[36m 2500\u001b[0m │ \u001b[36m 7400\u001b[0m │ \u001b[36m 10000\u001b[0m │ \u001b[32m█▇███▇ \u001b[0m │  │\n",
+                            "│ │ \u001b[38;5;141mpred_synth_predictor     \u001b[0m │ \u001b[36m  820\u001b[0m │ \u001b[36m    14\u001b[0m │ \u001b[36m   6.6\u001b[0m │ \u001b[36m  2.6\u001b[0m │ \u001b[36m  0.00039\u001b[0m │ \u001b[36m  4.8\u001b[0m │ \u001b[36m  8.8\u001b[0m │ \u001b[36m    10\u001b[0m │ \u001b[32m▁▂▃▄▆█ \u001b[0m │  │\n",
+                            "│ │ \u001b[38;5;141mpred_synth_predictor     \u001b[0m │ \u001b[36m  820\u001b[0m │ \u001b[36m    14\u001b[0m │ \u001b[36m     5\u001b[0m │ \u001b[36m  2.1\u001b[0m │ \u001b[36m  0.00039\u001b[0m │ \u001b[36m  3.5\u001b[0m │ \u001b[36m  6.4\u001b[0m │ \u001b[36m    10\u001b[0m │ \u001b[32m▂▄██▄▂ \u001b[0m │  │\n",
+                            "│ │ \u001b[38;5;141mpred_synth_predictor     \u001b[0m │ \u001b[36m  110\u001b[0m │ \u001b[36m   1.8\u001b[0m │ \u001b[36m   7.7\u001b[0m │ \u001b[36m  2.1\u001b[0m │ \u001b[36m    0.058\u001b[0m │ \u001b[36m  6.7\u001b[0m │ \u001b[36m  9.3\u001b[0m │ \u001b[36m    10\u001b[0m │ \u001b[32m ▁▁▂▄█ \u001b[0m │  │\n",
+                            "│ │ \u001b[38;5;141mpred_synth_predictor     \u001b[0m │ \u001b[36m  110\u001b[0m │ \u001b[36m   1.8\u001b[0m │ \u001b[36m     5\u001b[0m │ \u001b[36m  1.7\u001b[0m │ \u001b[36m    0.058\u001b[0m │ \u001b[36m  3.9\u001b[0m │ \u001b[36m  6.1\u001b[0m │ \u001b[36m   9.9\u001b[0m │ \u001b[32m▁▃██▃▁ \u001b[0m │  │\n",
+                            "│ └───────────────────────────┴───────┴────────┴────────┴───────┴───────────┴───────┴───────┴────────┴─────────┘  │\n",
+                            "│ \u001b[3m                                                   datetime                                                   \u001b[0m  │\n",
+                            "│ ┏━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓  │\n",
+                            "│ ┃\u001b[1m \u001b[0m\u001b[1mcolumn_name     \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA %   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mfirst                     \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mlast                      \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mfrequency   \u001b[0m\u001b[1m \u001b[0m┃  │\n",
+                            "│ ┡━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━┩  │\n",
+                            "│ │ \u001b[38;5;141mtimestamp       \u001b[0m │ \u001b[36m   0\u001b[0m │ \u001b[36m      0\u001b[0m │ \u001b[31m   1967-01-02 01:16:00    \u001b[0m │ \u001b[31m   1969-12-31 21:42:00    \u001b[0m │ \u001b[38;5;141mNone        \u001b[0m │  │\n",
+                            "│ └──────────────────┴──────┴─────────┴────────────────────────────┴────────────────────────────┴──────────────┘  │\n",
+                            "│ \u001b[3m                                                    string                                                    \u001b[0m  │\n",
+                            "│ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓  │\n",
+                            "│ ┃\u001b[1m \u001b[0m\u001b[1mcolumn_name                          \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mNA %     \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mwords per row           \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mtotal words        \u001b[0m\u001b[1m \u001b[0m┃  │\n",
+                            "│ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━┩  │\n",
+                            "│ │ \u001b[38;5;141mprediction_time_uuid                 \u001b[0m │ \u001b[36m    0\u001b[0m │ \u001b[36m        0\u001b[0m │ \u001b[36m                       1\u001b[0m │ \u001b[36m               6000\u001b[0m │  │\n",
+                            "│ └───────────────────────────────────────┴───────┴───────────┴──────────────────────────┴─────────────────────┘  │\n",
+                            "╰────────────────────────────────────────────────────── End ──────────────────────────────────────────────────────╯\n"
+                        ]
+                    },
+                    "metadata": {},
+                    "output_type": "display_data"
+                },
+                {
+                    "data": {
+                        "text/html": [
+                            "<div>\n",
+                            "<style scoped>\n",
+                            "    .dataframe tbody tr th:only-of-type {\n",
+                            "        vertical-align: middle;\n",
+                            "    }\n",
+                            "\n",
+                            "    .dataframe tbody tr th {\n",
+                            "        vertical-align: top;\n",
+                            "    }\n",
+                            "\n",
+                            "    .dataframe thead th {\n",
+                            "        text-align: right;\n",
+                            "    }\n",
+                            "</style>\n",
+                            "<table border=\"1\" class=\"dataframe\">\n",
+                            "  <thead>\n",
+                            "    <tr style=\"text-align: right;\">\n",
+                            "      <th></th>\n",
+                            "      <th>id</th>\n",
+                            "      <th>timestamp</th>\n",
+                            "      <th>prediction_time_uuid</th>\n",
+                            "      <th>pred_synth_predictor_float_within_365_days_maximum_fallback_nan</th>\n",
+                            "      <th>pred_synth_predictor_float_within_365_days_mean_fallback_nan</th>\n",
+                            "      <th>pred_synth_predictor_float_within_730_days_maximum_fallback_nan</th>\n",
+                            "      <th>pred_synth_predictor_float_within_730_days_mean_fallback_nan</th>\n",
+                            "    </tr>\n",
+                            "  </thead>\n",
+                            "  <tbody>\n",
+                            "    <tr>\n",
+                            "      <th>0</th>\n",
+                            "      <td>9903</td>\n",
+                            "      <td>1968-05-09 21:24:00</td>\n",
+                            "      <td>9903-1968-05-09-21-24-00</td>\n",
+                            "      <td>0.154981</td>\n",
+                            "      <td>0.154981</td>\n",
+                            "      <td>2.194319</td>\n",
+                            "      <td>0.990763</td>\n",
+                            "    </tr>\n",
+                            "    <tr>\n",
+                            "      <th>1</th>\n",
+                            "      <td>6447</td>\n",
+                            "      <td>1967-09-25 18:08:00</td>\n",
+                            "      <td>6447-1967-09-25-18-08-00</td>\n",
+                            "      <td>8.930256</td>\n",
+                            "      <td>5.396017</td>\n",
+                            "      <td>9.774050</td>\n",
+                            "      <td>5.582745</td>\n",
+                            "    </tr>\n",
+                            "    <tr>\n",
+                            "      <th>2</th>\n",
+                            "      <td>4927</td>\n",
+                            "      <td>1968-06-30 12:13:00</td>\n",
+                            "      <td>4927-1968-06-30-12-13-00</td>\n",
+                            "      <td>6.730694</td>\n",
+                            "      <td>4.957251</td>\n",
+                            "      <td>6.730694</td>\n",
+                            "      <td>4.957251</td>\n",
+                            "    </tr>\n",
+                            "    <tr>\n",
+                            "      <th>3</th>\n",
+                            "      <td>5475</td>\n",
+                            "      <td>1967-01-09 03:09:00</td>\n",
+                            "      <td>5475-1967-01-09-03-09-00</td>\n",
+                            "      <td>9.497229</td>\n",
+                            "      <td>6.081539</td>\n",
+                            "      <td>9.497229</td>\n",
+                            "      <td>5.999336</td>\n",
+                            "    </tr>\n",
+                            "    <tr>\n",
+                            "      <th>4</th>\n",
+                            "      <td>3157</td>\n",
+                            "      <td>1969-10-07 05:01:00</td>\n",
+                            "      <td>3157-1969-10-07-05-01-00</td>\n",
+                            "      <td>5.243176</td>\n",
+                            "      <td>5.068323</td>\n",
+                            "      <td>5.243176</td>\n",
+                            "      <td>5.068323</td>\n",
+                            "    </tr>\n",
+                            "    <tr>\n",
+                            "      <th>...</th>\n",
+                            "      <td>...</td>\n",
+                            "      <td>...</td>\n",
+                            "      <td>...</td>\n",
+                            "      <td>...</td>\n",
+                            "      <td>...</td>\n",
+                            "      <td>...</td>\n",
+                            "      <td>...</td>\n",
+                            "    </tr>\n",
+                            "    <tr>\n",
+                            "      <th>5957</th>\n",
+                            "      <td>4228</td>\n",
+                            "      <td>1967-02-26 05:45:00</td>\n",
+                            "      <td>4228-1967-02-26-05-45-00</td>\n",
+                            "      <td>6.844010</td>\n",
+                            "      <td>4.353579</td>\n",
+                            "      <td>6.844010</td>\n",
+                            "      <td>3.792014</td>\n",
+                            "    </tr>\n",
+                            "    <tr>\n",
+                            "      <th>5958</th>\n",
+                            "      <td>9745</td>\n",
+                            "      <td>1969-02-04 01:18:00</td>\n",
+                            "      <td>9745-1969-02-04-01-18-00</td>\n",
+                            "      <td>3.858509</td>\n",
+                            "      <td>3.858509</td>\n",
+                            "      <td>3.858509</td>\n",
+                            "      <td>2.394074</td>\n",
+                            "    </tr>\n",
+                            "    <tr>\n",
+                            "      <th>5959</th>\n",
+                            "      <td>3385</td>\n",
+                            "      <td>1967-07-17 19:18:00</td>\n",
+                            "      <td>3385-1967-07-17-19-18-00</td>\n",
+                            "      <td>9.370554</td>\n",
+                            "      <td>5.463267</td>\n",
+                            "      <td>9.370554</td>\n",
+                            "      <td>5.769484</td>\n",
+                            "    </tr>\n",
+                            "    <tr>\n",
+                            "      <th>5960</th>\n",
+                            "      <td>1421</td>\n",
+                            "      <td>1968-04-15 15:53:00</td>\n",
+                            "      <td>1421-1968-04-15-15-53-00</td>\n",
+                            "      <td>8.972364</td>\n",
+                            "      <td>8.972364</td>\n",
+                            "      <td>8.972364</td>\n",
+                            "      <td>7.732447</td>\n",
+                            "    </tr>\n",
+                            "    <tr>\n",
+                            "      <th>5961</th>\n",
+                            "      <td>1940</td>\n",
+                            "      <td>1968-05-17 10:49:00</td>\n",
+                            "      <td>1940-1968-05-17-10-49-00</td>\n",
+                            "      <td>NaN</td>\n",
+                            "      <td>NaN</td>\n",
+                            "      <td>7.448374</td>\n",
+                            "      <td>4.846514</td>\n",
+                            "    </tr>\n",
+                            "  </tbody>\n",
+                            "</table>\n",
+                            "<p>5962 rows × 7 columns</p>\n",
+                            "</div>"
+                        ],
+                        "text/plain": [
+                            "      id           timestamp      prediction_time_uuid  \\\n",
+                            "0             9903 1968-05-09 21:24:00  9903-1968-05-09-21-24-00   \n",
+                            "1             6447 1967-09-25 18:08:00  6447-1967-09-25-18-08-00   \n",
+                            "2             4927 1968-06-30 12:13:00  4927-1968-06-30-12-13-00   \n",
+                            "3             5475 1967-01-09 03:09:00  5475-1967-01-09-03-09-00   \n",
+                            "4             3157 1969-10-07 05:01:00  3157-1969-10-07-05-01-00   \n",
+                            "...            ...                 ...                       ...   \n",
+                            "5957          4228 1967-02-26 05:45:00  4228-1967-02-26-05-45-00   \n",
+                            "5958          9745 1969-02-04 01:18:00  9745-1969-02-04-01-18-00   \n",
+                            "5959          3385 1967-07-17 19:18:00  3385-1967-07-17-19-18-00   \n",
+                            "5960          1421 1968-04-15 15:53:00  1421-1968-04-15-15-53-00   \n",
+                            "5961          1940 1968-05-17 10:49:00  1940-1968-05-17-10-49-00   \n",
+                            "\n",
+                            "      pred_synth_predictor_float_within_365_days_maximum_fallback_nan  \\\n",
+                            "0                                              0.154981                 \n",
+                            "1                                              8.930256                 \n",
+                            "2                                              6.730694                 \n",
+                            "3                                              9.497229                 \n",
+                            "4                                              5.243176                 \n",
+                            "...                                                 ...                 \n",
+                            "5957                                           6.844010                 \n",
+                            "5958                                           3.858509                 \n",
+                            "5959                                           9.370554                 \n",
+                            "5960                                           8.972364                 \n",
+                            "5961                                                NaN                 \n",
+                            "\n",
+                            "      pred_synth_predictor_float_within_365_days_mean_fallback_nan  \\\n",
+                            "0                                              0.154981              \n",
+                            "1                                              5.396017              \n",
+                            "2                                              4.957251              \n",
+                            "3                                              6.081539              \n",
+                            "4                                              5.068323              \n",
+                            "...                                                 ...              \n",
+                            "5957                                           4.353579              \n",
+                            "5958                                           3.858509              \n",
+                            "5959                                           5.463267              \n",
+                            "5960                                           8.972364              \n",
+                            "5961                                                NaN              \n",
+                            "\n",
+                            "      pred_synth_predictor_float_within_730_days_maximum_fallback_nan  \\\n",
+                            "0                                              2.194319                 \n",
+                            "1                                              9.774050                 \n",
+                            "2                                              6.730694                 \n",
+                            "3                                              9.497229                 \n",
+                            "4                                              5.243176                 \n",
+                            "...                                                 ...                 \n",
+                            "5957                                           6.844010                 \n",
+                            "5958                                           3.858509                 \n",
+                            "5959                                           9.370554                 \n",
+                            "5960                                           8.972364                 \n",
+                            "5961                                           7.448374                 \n",
+                            "\n",
+                            "      pred_synth_predictor_float_within_730_days_mean_fallback_nan  \n",
+                            "0                                              0.990763             \n",
+                            "1                                              5.582745             \n",
+                            "2                                              4.957251             \n",
+                            "3                                              5.999336             \n",
+                            "4                                              5.068323             \n",
+                            "...                                                 ...             \n",
+                            "5957                                           3.792014             \n",
+                            "5958                                           2.394074             \n",
+                            "5959                                           5.769484             \n",
+                            "5960                                           7.732447             \n",
+                            "5961                                           4.846514             \n",
+                            "\n",
+                            "[5962 rows x 7 columns]"
+                        ]
+                    },
+                    "execution_count": 10,
+                    "metadata": {},
+                    "output_type": "execute_result"
+                }
+            ],
+            "source": [
+                "skim(df)\n",
+                "df"
+            ]
+        }
+    ],
+    "metadata": {
+        "kernelspec": {
+            "display_name": "Python 3.10.7 ('.venv': poetry)",
+            "language": "python",
+            "name": "python3"
+        },
+        "language_info": {
+            "codemirror_mode": {
+                "name": "ipython",
+                "version": 3
+            },
+            "file_extension": ".py",
+            "mimetype": "text/x-python",
+            "name": "python",
+            "nbconvert_exporter": "python",
+            "pygments_lexer": "ipython3",
+            "version": "3.10.7"
+        },
+        "orig_nbformat": 4,
+        "vscode": {
+            "interpreter": {
+                "hash": "d2b49c0af2d95979144de75823f7cfbb268839811992fdd0cb17fc1bb54ce815"
+            }
+        }
     },
-    {
-     "data": {
-      "text/html": [
-       "<div>\n",
-       "<style scoped>\n",
-       "    .dataframe tbody tr th:only-of-type {\n",
-       "        vertical-align: middle;\n",
-       "    }\n",
-       "\n",
-       "    .dataframe tbody tr th {\n",
-       "        vertical-align: top;\n",
-       "    }\n",
-       "\n",
-       "    .dataframe thead th {\n",
-       "        text-align: right;\n",
-       "    }\n",
-       "</style>\n",
-       "<table border=\"1\" class=\"dataframe\">\n",
-       "  <thead>\n",
-       "    <tr style=\"text-align: right;\">\n",
-       "      <th></th>\n",
-       "      <th>dw_ek_borger</th>\n",
-       "      <th>timestamp</th>\n",
-       "      <th>prediction_time_uuid</th>\n",
-       "      <th>pred_synth_predictor_float_within_365_days_maximum_fallback_nan</th>\n",
-       "      <th>pred_synth_predictor_float_within_365_days_mean_fallback_nan</th>\n",
-       "      <th>pred_synth_predictor_float_within_730_days_maximum_fallback_nan</th>\n",
-       "      <th>pred_synth_predictor_float_within_730_days_mean_fallback_nan</th>\n",
-       "    </tr>\n",
-       "  </thead>\n",
-       "  <tbody>\n",
-       "    <tr>\n",
-       "      <th>0</th>\n",
-       "      <td>9903</td>\n",
-       "      <td>1968-05-09 21:24:00</td>\n",
-       "      <td>9903-1968-05-09-21-24-00</td>\n",
-       "      <td>0.154981</td>\n",
-       "      <td>0.154981</td>\n",
-       "      <td>2.194319</td>\n",
-       "      <td>0.990763</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>1</th>\n",
-       "      <td>6447</td>\n",
-       "      <td>1967-09-25 18:08:00</td>\n",
-       "      <td>6447-1967-09-25-18-08-00</td>\n",
-       "      <td>8.930256</td>\n",
-       "      <td>5.396017</td>\n",
-       "      <td>9.774050</td>\n",
-       "      <td>5.582745</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>2</th>\n",
-       "      <td>4927</td>\n",
-       "      <td>1968-06-30 12:13:00</td>\n",
-       "      <td>4927-1968-06-30-12-13-00</td>\n",
-       "      <td>6.730694</td>\n",
-       "      <td>4.957251</td>\n",
-       "      <td>6.730694</td>\n",
-       "      <td>4.957251</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>3</th>\n",
-       "      <td>5475</td>\n",
-       "      <td>1967-01-09 03:09:00</td>\n",
-       "      <td>5475-1967-01-09-03-09-00</td>\n",
-       "      <td>9.497229</td>\n",
-       "      <td>6.081539</td>\n",
-       "      <td>9.497229</td>\n",
-       "      <td>5.999336</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>4</th>\n",
-       "      <td>3157</td>\n",
-       "      <td>1969-10-07 05:01:00</td>\n",
-       "      <td>3157-1969-10-07-05-01-00</td>\n",
-       "      <td>5.243176</td>\n",
-       "      <td>5.068323</td>\n",
-       "      <td>5.243176</td>\n",
-       "      <td>5.068323</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>...</th>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>5957</th>\n",
-       "      <td>4228</td>\n",
-       "      <td>1967-02-26 05:45:00</td>\n",
-       "      <td>4228-1967-02-26-05-45-00</td>\n",
-       "      <td>6.844010</td>\n",
-       "      <td>4.353579</td>\n",
-       "      <td>6.844010</td>\n",
-       "      <td>3.792014</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>5958</th>\n",
-       "      <td>9745</td>\n",
-       "      <td>1969-02-04 01:18:00</td>\n",
-       "      <td>9745-1969-02-04-01-18-00</td>\n",
-       "      <td>3.858509</td>\n",
-       "      <td>3.858509</td>\n",
-       "      <td>3.858509</td>\n",
-       "      <td>2.394074</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>5959</th>\n",
-       "      <td>3385</td>\n",
-       "      <td>1967-07-17 19:18:00</td>\n",
-       "      <td>3385-1967-07-17-19-18-00</td>\n",
-       "      <td>9.370554</td>\n",
-       "      <td>5.463267</td>\n",
-       "      <td>9.370554</td>\n",
-       "      <td>5.769484</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>5960</th>\n",
-       "      <td>1421</td>\n",
-       "      <td>1968-04-15 15:53:00</td>\n",
-       "      <td>1421-1968-04-15-15-53-00</td>\n",
-       "      <td>8.972364</td>\n",
-       "      <td>8.972364</td>\n",
-       "      <td>8.972364</td>\n",
-       "      <td>7.732447</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>5961</th>\n",
-       "      <td>1940</td>\n",
-       "      <td>1968-05-17 10:49:00</td>\n",
-       "      <td>1940-1968-05-17-10-49-00</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>7.448374</td>\n",
-       "      <td>4.846514</td>\n",
-       "    </tr>\n",
-       "  </tbody>\n",
-       "</table>\n",
-       "<p>5962 rows × 7 columns</p>\n",
-       "</div>"
-      ],
-      "text/plain": [
-       "      dw_ek_borger           timestamp      prediction_time_uuid  \\\n",
-       "0             9903 1968-05-09 21:24:00  9903-1968-05-09-21-24-00   \n",
-       "1             6447 1967-09-25 18:08:00  6447-1967-09-25-18-08-00   \n",
-       "2             4927 1968-06-30 12:13:00  4927-1968-06-30-12-13-00   \n",
-       "3             5475 1967-01-09 03:09:00  5475-1967-01-09-03-09-00   \n",
-       "4             3157 1969-10-07 05:01:00  3157-1969-10-07-05-01-00   \n",
-       "...            ...                 ...                       ...   \n",
-       "5957          4228 1967-02-26 05:45:00  4228-1967-02-26-05-45-00   \n",
-       "5958          9745 1969-02-04 01:18:00  9745-1969-02-04-01-18-00   \n",
-       "5959          3385 1967-07-17 19:18:00  3385-1967-07-17-19-18-00   \n",
-       "5960          1421 1968-04-15 15:53:00  1421-1968-04-15-15-53-00   \n",
-       "5961          1940 1968-05-17 10:49:00  1940-1968-05-17-10-49-00   \n",
-       "\n",
-       "      pred_synth_predictor_float_within_365_days_maximum_fallback_nan  \\\n",
-       "0                                              0.154981                 \n",
-       "1                                              8.930256                 \n",
-       "2                                              6.730694                 \n",
-       "3                                              9.497229                 \n",
-       "4                                              5.243176                 \n",
-       "...                                                 ...                 \n",
-       "5957                                           6.844010                 \n",
-       "5958                                           3.858509                 \n",
-       "5959                                           9.370554                 \n",
-       "5960                                           8.972364                 \n",
-       "5961                                                NaN                 \n",
-       "\n",
-       "      pred_synth_predictor_float_within_365_days_mean_fallback_nan  \\\n",
-       "0                                              0.154981              \n",
-       "1                                              5.396017              \n",
-       "2                                              4.957251              \n",
-       "3                                              6.081539              \n",
-       "4                                              5.068323              \n",
-       "...                                                 ...              \n",
-       "5957                                           4.353579              \n",
-       "5958                                           3.858509              \n",
-       "5959                                           5.463267              \n",
-       "5960                                           8.972364              \n",
-       "5961                                                NaN              \n",
-       "\n",
-       "      pred_synth_predictor_float_within_730_days_maximum_fallback_nan  \\\n",
-       "0                                              2.194319                 \n",
-       "1                                              9.774050                 \n",
-       "2                                              6.730694                 \n",
-       "3                                              9.497229                 \n",
-       "4                                              5.243176                 \n",
-       "...                                                 ...                 \n",
-       "5957                                           6.844010                 \n",
-       "5958                                           3.858509                 \n",
-       "5959                                           9.370554                 \n",
-       "5960                                           8.972364                 \n",
-       "5961                                           7.448374                 \n",
-       "\n",
-       "      pred_synth_predictor_float_within_730_days_mean_fallback_nan  \n",
-       "0                                              0.990763             \n",
-       "1                                              5.582745             \n",
-       "2                                              4.957251             \n",
-       "3                                              5.999336             \n",
-       "4                                              5.068323             \n",
-       "...                                                 ...             \n",
-       "5957                                           3.792014             \n",
-       "5958                                           2.394074             \n",
-       "5959                                           5.769484             \n",
-       "5960                                           7.732447             \n",
-       "5961                                           4.846514             \n",
-       "\n",
-       "[5962 rows x 7 columns]"
-      ]
-     },
-     "execution_count": 10,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "skim(df)\n",
-    "df"
-   ]
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3.10.7 ('.venv': poetry)",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.10.7"
-  },
-  "orig_nbformat": 4,
-  "vscode": {
-   "interpreter": {
-    "hash": "d2b49c0af2d95979144de75823f7cfbb268839811992fdd0cb17fc1bb54ce815"
-   }
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
+    "nbformat": 4,
+    "nbformat_minor": 2
+}
\ No newline at end of file


Test patch:
diff --git a/src/timeseriesflattener/testing/load_synth_data.py b/src/timeseriesflattener/testing/load_synth_data.py
index 2e75797..4e0f7b0 100644
--- a/src/timeseriesflattener/testing/load_synth_data.py
+++ b/src/timeseriesflattener/testing/load_synth_data.py
@@ -88,7 +88,7 @@ def load_synth_outcome(
     """
     # Get first row for each id
     df = load_raw_test_csv("synth_raw_binary_2.csv", n_rows=n_rows)
-    df = df.groupby("dw_ek_borger").last().reset_index()
+    df = df.groupby("id").last().reset_index()
 
     # Drop all rows with a value equal to 1
     df = df[df["value"] == 1]
diff --git a/src/timeseriesflattener/testing/utils_for_testing.py b/src/timeseriesflattener/testing/utils_for_testing.py
index 0b08985..0e06344 100644
--- a/src/timeseriesflattener/testing/utils_for_testing.py
+++ b/src/timeseriesflattener/testing/utils_for_testing.py
@@ -120,7 +120,7 @@ def assert_flattened_data_as_expected(
 @data_loaders.register("load_event_times")
 def load_event_times():
     """Load event times."""
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                     1,2021-12-30 00:00:01, 1
                     1,2021-12-29 00:00:02, 2
                     """
@@ -168,7 +168,7 @@ def long_df():
 
     df = pd.melt(
         synth_df,
-        id_vars=["dw_ek_borger", "timestamp"],
+        id_vars=["id", "timestamp"],
         value_vars=["value_name_1", "value_name_2"],
         var_name="value_names",
         value_name="value",
diff --git a/tests/test_data/raw/create_synth_prediction_times.py b/tests/test_data/raw/create_synth_prediction_times.py
index 5c13cbb..387a301 100644
--- a/tests/test_data/raw/create_synth_prediction_times.py
+++ b/tests/test_data/raw/create_synth_prediction_times.py
@@ -10,7 +10,7 @@ if __name__ == "__main__":
     # Get project root directory
 
     column_specs = {
-        "dw_ek_borger": {
+        "id": {
             "column_type": "uniform_int",
             "min": 0,
             "max": 10_000,
diff --git a/tests/test_data/raw/create_synth_raw_binary.py b/tests/test_data/raw/create_synth_raw_binary.py
index d8c2825..703d6f2 100644
--- a/tests/test_data/raw/create_synth_raw_binary.py
+++ b/tests/test_data/raw/create_synth_raw_binary.py
@@ -12,7 +12,7 @@ if __name__ == "__main__":
 
     column_specs = [
         {
-            "dw_ek_borger": {
+            "id": {
                 "column_type": "uniform_int",
                 "min": 0,
                 "max": 10_000,
diff --git a/tests/test_data/raw/create_synth_raw_float.py b/tests/test_data/raw/create_synth_raw_float.py
index 5ec80a8..60d2dd8 100644
--- a/tests/test_data/raw/create_synth_raw_float.py
+++ b/tests/test_data/raw/create_synth_raw_float.py
@@ -11,7 +11,7 @@ if __name__ == "__main__":
 
     column_specs = [
         {
-            "dw_ek_borger": {
+            "id": {
                 "column_type": "uniform_int",
                 "min": 0,
                 "max": 10_000,
diff --git a/tests/test_data/raw/create_synth_sex.py b/tests/test_data/raw/create_synth_sex.py
index 2dcc715..43f6d2c 100644
--- a/tests/test_data/raw/create_synth_sex.py
+++ b/tests/test_data/raw/create_synth_sex.py
@@ -12,7 +12,7 @@ if __name__ == "__main__":
 
     column_specs = [
         {
-            "dw_ek_borger": {
+            "id": {
                 "column_type": "uniform_int",
                 "min": 0,
                 "max": 10_000,
@@ -26,7 +26,7 @@ if __name__ == "__main__":
         n_samples=100_000,
     )
 
-    df = df.groupby("dw_ek_borger").last().reset_index()
+    df = df.groupby("id").last().reset_index()
 
     df.to_csv(
         project_root / "tests" / "test_data" / "raw" / "synth_sex.csv",
diff --git a/tests/test_data/raw/synth_prediction_times.csv b/tests/test_data/raw/synth_prediction_times.csv
index abfc292..ee4ad94 100644
--- a/tests/test_data/raw/synth_prediction_times.csv
+++ b/tests/test_data/raw/synth_prediction_times.csv
@@ -1,4 +1,4 @@
-dw_ek_borger,timestamp
+id,timestamp
 9903,1968-05-09 21:24:00
 7465,1966-05-24 01:23:00
 6447,1967-09-25 18:08:00
diff --git a/tests/test_data/raw/synth_raw_binary_1.csv b/tests/test_data/raw/synth_raw_binary_1.csv
index 5c1f13f..df58e60 100644
--- a/tests/test_data/raw/synth_raw_binary_1.csv
+++ b/tests/test_data/raw/synth_raw_binary_1.csv
@@ -1,4 +1,4 @@
-dw_ek_borger,timestamp,value
+id,timestamp,value
 3824,1968-10-30 00:01:00,1
 3986,1967-04-08 04:15:00,0
 3703,1968-09-06 09:43:00,0
diff --git a/tests/test_data/raw/synth_raw_binary_2.csv b/tests/test_data/raw/synth_raw_binary_2.csv
index 2c1e502..a205167 100644
--- a/tests/test_data/raw/synth_raw_binary_2.csv
+++ b/tests/test_data/raw/synth_raw_binary_2.csv
@@ -1,4 +1,4 @@
-dw_ek_borger,timestamp,value
+id,timestamp,value
 2704,1965-01-13 18:07:00,1
 4109,1965-09-13 21:31:00,1
 9007,1969-10-31 22:16:00,1
diff --git a/tests/test_data/raw/synth_raw_float_1.csv b/tests/test_data/raw/synth_raw_float_1.csv
index 7c81325..79fc243 100644
--- a/tests/test_data/raw/synth_raw_float_1.csv
+++ b/tests/test_data/raw/synth_raw_float_1.csv
@@ -1,4 +1,4 @@
-dw_ek_borger,timestamp,value
+id,timestamp,value
 9476,1969-03-05 08:08:00,0.816995277512742
 4631,1967-04-10 22:48:00,4.818073558614815
 3890,1969-12-15 14:07:00,2.503788597933241
diff --git a/tests/test_data/raw/synth_raw_float_2.csv b/tests/test_data/raw/synth_raw_float_2.csv
index 86ac2be..f2392fe 100644
--- a/tests/test_data/raw/synth_raw_float_2.csv
+++ b/tests/test_data/raw/synth_raw_float_2.csv
@@ -1,4 +1,4 @@
-dw_ek_borger,timestamp,value
+id,timestamp,value
 8746,1965-07-19 19:15:00,0.8741283361419971
 640,1967-01-08 12:54:00,0.14687069332971703
 455,1965-02-16 03:35:00,1.7365701890154461
diff --git a/tests/test_data/raw/synth_sex.csv b/tests/test_data/raw/synth_sex.csv
index 4d37366..dd1bec8 100644
--- a/tests/test_data/raw/synth_sex.csv
+++ b/tests/test_data/raw/synth_sex.csv
@@ -1,4 +1,4 @@
-dw_ek_borger,female
+id,female
 0,0
 1,1
 2,1
diff --git a/tests/test_data/raw/synth_txt_data.csv b/tests/test_data/raw/synth_txt_data.csv
index a40fd9f..ca10f2c 100644
--- a/tests/test_data/raw/synth_txt_data.csv
+++ b/tests/test_data/raw/synth_txt_data.csv
@@ -1,4 +1,4 @@
-,dw_ek_borger,timestamp,text
+,id,timestamp,text
 0,,1972-07-19 00:22:00,"The patient went into a medically induced coma on October 5th, 1995. I was extremely sick for a long time. I tried for six months and three times. I did not believe that the brain would not be the same when the patients was taken off the hospital bed without any help. One was taken to a morgue at an unspecified location in Ohio, then on to the US Coast Guard which was a massive operation at that time. The other was taken to a hospital in New Jersey where he died. The patients who died were of the same family which had always brought me to this facility and took to work. But they were a long way from the patients I tried so many times to save but they were never a real problem. It was simply a matter of time until they were placed down and in a room that was completely devoid of any help but to whom care was not being given.
 
 To my mind that was enough to get the family to leave Ohio. Now that they were being cared for, I wanted to bring me back to the home where I was born and raised. The home seemed to be so full of happiness - I was happy with my life and all that. It wasn't until I got back to New Braunfels State, NY that I realized that I had found a family without help and it must feel like a miracle.
diff --git a/tests/test_feature_cache/test_cache_to_disk.py b/tests/test_feature_cache/test_cache_to_disk.py
index 6355c6b..cc7cfaa 100644
--- a/tests/test_feature_cache/test_cache_to_disk.py
+++ b/tests/test_feature_cache/test_cache_to_disk.py
@@ -23,7 +23,7 @@ def test_write_and_check_feature(
     cache = DiskCache(
         feature_cache_dir=tmp_path,
         pred_time_uuid_col_name="pred_time_uuid",
-        id_col_name="dw_ek_borger",
+        id_col_name="id",
         cache_file_suffix="csv",
         prediction_times_df=pd.DataFrame(
             {"uuid": [1, 2, 3], "pred_time_uuid": [1, 2, 3]},
@@ -32,7 +32,7 @@ def test_write_and_check_feature(
 
     values_df = pd.DataFrame(
         {
-            "dw_ek_borger": [1, 2, 3],
+            "id": [1, 2, 3],
             "pred_time_uuid": [1, 2, 3],
             "timestamp": [1, 2, 3],
             "value": [1, 2, 3],
@@ -50,7 +50,7 @@ def test_write_and_check_feature(
 
     generated_df = pd.DataFrame(
         {
-            "dw_ek_borger": [1, 2, 3],
+            "id": [1, 2, 3],
             "pred_time_uuid": [1, 2, 3],
             "timestamp": [1, 2, 3],
             f"{test_spec.get_col_str()}": [1, 2, 3],
@@ -78,17 +78,17 @@ def test_read_feature(tmp_path):
     cache = DiskCache(
         feature_cache_dir=tmp_path,
         pred_time_uuid_col_name="pred_time_uuid",
-        id_col_name="dw_ek_borger",
+        id_col_name="id",
         timestamp_col_name="timestamp",
         cache_file_suffix="csv",
         prediction_times_df=pd.DataFrame(
-            {"pred_time_uuid": [1, 2, 3], "dw_ek_borger": [1, 2, 3]},
+            {"pred_time_uuid": [1, 2, 3], "id": [1, 2, 3]},
         ),
     )
 
     values_df = pd.DataFrame(
         {
-            "dw_ek_borger": [1, 2, 3, 4, 5],
+            "id": [1, 2, 3, 4, 5],
             "timestamp": [1, 2, 3, 4, 5],
             "value": [1, 2, 3, 4, 5],
         },
@@ -105,7 +105,7 @@ def test_read_feature(tmp_path):
 
     generated_df = pd.DataFrame(
         {
-            "dw_ek_borger": [
+            "id": [
                 1,
                 2,
                 3,
diff --git a/tests/test_timeseriesflattener/test_flattened_dataset/test_add_values.py b/tests/test_timeseriesflattener/test_flattened_dataset/test_add_values.py
index 0d3a5a8..4f34c98 100644
--- a/tests/test_timeseriesflattener/test_flattened_dataset/test_add_values.py
+++ b/tests/test_timeseriesflattener/test_flattened_dataset/test_add_values.py
@@ -23,12 +23,12 @@ from timeseriesflattener.testing.utils_for_testing import (
 # Predictors
 def test_predictor_after_prediction_time():
     prediction_times_df = str_to_df(
-        """dw_ek_borger,timestamp,
+        """id,timestamp,
     1,2021-12-31 00:00:00
     """,
     )
     predictor_df = str_to_df(
-        """dw_ek_borger,timestamp,value,
+        """id,timestamp,value,
     1,2022-01-01 00:00:01, 1.0
     """,
     )
@@ -47,10 +47,10 @@ def test_predictor_after_prediction_time():
 
 
 def test_predictor_before_prediction():
-    prediction_times_df = """dw_ek_borger,timestamp,
+    prediction_times_df = """id,timestamp,
                             1,2021-12-31 00:00:00
                             """
-    predictor_df_str = """dw_ek_borger,timestamp,value,
+    predictor_df_str = """id,timestamp,value,
                         1,2021-12-30 22:59:59, 1
                         """
 
@@ -68,14 +68,14 @@ def test_predictor_before_prediction():
 
 
 def test_multiple_citizens_predictor():
-    prediction_times_df_str = """dw_ek_borger,timestamp,
+    prediction_times_df_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             1,2022-01-02 00:00:00
                             5,2022-01-02 00:00:00
                             5,2022-01-05 00:00:00
                             6,2022-01-05 00:00:00
                             """
-    predictor_df_str = """dw_ek_borger,timestamp,value,
+    predictor_df_str = """id,timestamp,value,
                         1,2021-12-30 00:00:01, 0
                         1,2022-01-01 00:00:00, 1
                         5,2022-01-01 00:00:00, 0
@@ -98,10 +98,10 @@ def test_multiple_citizens_predictor():
 
 # Outcomes
 def test_event_after_prediction_time():
-    prediction_times_df_str = """dw_ek_borger,timestamp,
+    prediction_times_df_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             """
-    outcome_df_str = """dw_ek_borger,timestamp,value,
+    outcome_df_str = """id,timestamp,value,
                         1,2022-01-01 00:00:01, 1
                         """
 
@@ -120,10 +120,10 @@ def test_event_after_prediction_time():
 
 
 def test_event_before_prediction():
-    prediction_times_df_str = """dw_ek_borger,timestamp,
+    prediction_times_df_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             """
-    outcome_df_str = """dw_ek_borger,timestamp,value,
+    outcome_df_str = """id,timestamp,value,
                         1,2021-12-30 23:59:59, 1.0
                         """
 
@@ -142,13 +142,13 @@ def test_event_before_prediction():
 
 
 def test_multiple_citizens_outcome():
-    prediction_times_df_str = """dw_ek_borger,timestamp,
+    prediction_times_df_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             1,2022-01-02 00:00:00
                             5,2025-01-02 00:00:00
                             5,2025-08-05 00:00:00
                             """
-    outcome_df_str = """dw_ek_borger,timestamp,value
+    outcome_df_str = """id,timestamp,value
                         1,2021-12-31 00:00:01, 1.0
                         1,2023-01-02 00:00:00, 1.0
                         5,2025-01-03 00:00:00, 1.0
@@ -170,10 +170,10 @@ def test_multiple_citizens_outcome():
 
 
 def test_citizen_without_outcome():
-    prediction_times_df_str = """dw_ek_borger,timestamp,
+    prediction_times_df_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             """
-    outcome_df_str = """dw_ek_borger,timestamp,value,
+    outcome_df_str = """id,timestamp,value,
                         0,2021-12-31 00:00:01, 1.0
                         """
 
@@ -196,12 +196,12 @@ def test_static_predictor():
     feature_name = "date_of_birth"
     output_col_name = f"{prefix}_{feature_name}"
 
-    prediction_times_df = """dw_ek_borger,timestamp,
+    prediction_times_df = """id,timestamp,
                             1,2021-12-31 00:00:00
                             1,2021-12-31 00:00:01
                             1,2021-12-31 00:00:02
                             """
-    static_predictor = f"""dw_ek_borger,{feature_name}
+    static_predictor = f"""id,{feature_name}
                         1,1994-12-31 00:00:01
                         """
 
@@ -237,12 +237,12 @@ def test_static_predictor():
 
 
 def test_add_age():
-    prediction_times_df = """dw_ek_borger,timestamp,
+    prediction_times_df = """id,timestamp,
                             1,1994-12-31 00:00:00
                             1,2021-12-30 00:00:00
                             1,2021-12-31 00:00:00
                             """
-    static_predictor = """dw_ek_borger,date_of_birth
+    static_predictor = """id,date_of_birth
                         1,1994-12-31 00:00:00
                         """
 
@@ -277,12 +277,12 @@ def test_add_age():
 
 
 def test_add_age_error():
-    prediction_times_df = """dw_ek_borger,timestamp,
+    prediction_times_df = """id,timestamp,
                             1,1994-12-31 00:00:00
                             1,2021-11-28 00:00:00
                             1,2021-12-31 00:00:00
                             """
-    static_predictor = """dw_ek_borger,date_of_birth
+    static_predictor = """id,date_of_birth
                         1,94-12-31 00:00:00
                         """
 
@@ -299,7 +299,7 @@ def test_add_age_error():
 
 
 def test_incident_outcome_removing_prediction_times():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             1,2023-12-31 00:00:00
                             2,2021-12-31 00:00:00
@@ -307,12 +307,12 @@ def test_incident_outcome_removing_prediction_times():
                             3,2023-12-31 00:00:00
                             """
 
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2021-12-31 00:00:01, 1
                         2,2021-12-31 00:00:01, 1
                         """
 
-    expected_df_str = """dw_ek_borger,timestamp,outc_value_within_2_days_max_fallback_nan_dichotomous,
+    expected_df_str = """id,timestamp,outc_value_within_2_days_max_fallback_nan_dichotomous,
                         1,2021-12-31 00:00:00, 1.0
                         2,2021-12-31 00:00:00, 1.0
                         3,2023-12-31 00:00:00, 0.0
@@ -325,7 +325,7 @@ def test_incident_outcome_removing_prediction_times():
     flattened_dataset = TimeseriesFlattener(
         prediction_times_df=prediction_times_df,
         timestamp_col_name="timestamp",
-        id_col_name="dw_ek_borger",
+        id_col_name="id",
         n_workers=4,
         drop_pred_times_with_insufficient_look_distance=False,
     )
@@ -352,7 +352,7 @@ def test_incident_outcome_removing_prediction_times():
 
 
 def test_add_multiple_static_predictors():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             1,2023-12-31 00:00:00
                             2,2021-12-31 00:00:00
@@ -360,23 +360,23 @@ def test_add_multiple_static_predictors():
                             3,2023-12-31 00:00:00
                             """
 
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2021-12-31 00:00:01, 1
                         2,2021-12-31 00:00:01, 1
                         """
 
-    expected_df_str = """dw_ek_borger,timestamp,outc_value_within_2_days_max_fallback_0_dichotomous,pred_age_in_years,pred_male
+    expected_df_str = """id,timestamp,outc_value_within_2_days_max_fallback_0_dichotomous,pred_age_in_years,pred_male
                         1,2021-12-31 00:00:00, 1.0,22.00,1
                         2,2021-12-31 00:00:00, 1.0,22.00,0
                         3,2023-12-31 00:00:00, 0.0,23.99,1
                         """
 
-    birthdates_df_str = """dw_ek_borger,date_of_birth,
+    birthdates_df_str = """id,date_of_birth,
     1,2000-01-01,
     2,2000-01-02,
     3,2000-01-03"""
 
-    male_df_str = """dw_ek_borger,male,
+    male_df_str = """id,male,
     1,1
     2,0
     3,1"""
@@ -390,7 +390,7 @@ def test_add_multiple_static_predictors():
     flattened_dataset = TimeseriesFlattener(
         prediction_times_df=prediction_times_df,
         timestamp_col_name="timestamp",
-        id_col_name="dw_ek_borger",
+        id_col_name="id",
         n_workers=4,
         drop_pred_times_with_insufficient_look_distance=False,
     )
@@ -424,7 +424,7 @@ def test_add_multiple_static_predictors():
     outcome_df = flattened_dataset.get_df()
 
     for col in (
-        "dw_ek_borger",
+        "id",
         "timestamp",
         "outc_value_within_2_days_max_fallback_0_dichotomous",
         "pred_age_in_years",
@@ -438,23 +438,23 @@ def test_add_multiple_static_predictors():
 
 
 def test_add_temporal_predictors_then_temporal_outcome():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-11-05 00:00:00
                             2,2021-11-05 00:00:00
                             """
 
-    predictors_df_str = """dw_ek_borger,timestamp,value,
+    predictors_df_str = """id,timestamp,value,
                         1,2020-11-05 00:00:01, 1
                         2,2020-11-05 00:00:01, 1
                         2,2021-01-15 00:00:01, 3
                         """
 
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2021-11-05 00:00:01, 1
                         2,2021-11-05 00:00:01, 1
                         """
 
-    expected_df_str = """dw_ek_borger,timestamp,prediction_time_uuid
+    expected_df_str = """id,timestamp,prediction_time_uuid
                             2,2021-11-05,2-2021-11-05-00-00-00
                             1,2021-11-05,1-2021-11-05-00-00-00
                         """
@@ -467,7 +467,7 @@ def test_add_temporal_predictors_then_temporal_outcome():
     flattened_dataset = TimeseriesFlattener(
         prediction_times_df=prediction_times_df,
         timestamp_col_name="timestamp",
-        id_col_name="dw_ek_borger",
+        id_col_name="id",
         n_workers=4,
         drop_pred_times_with_insufficient_look_distance=False,
     )
@@ -493,8 +493,8 @@ def test_add_temporal_predictors_then_temporal_outcome():
         ],
     )
 
-    outcome_df = flattened_dataset.get_df().set_index("dw_ek_borger").sort_index()
-    expected_df = expected_df.set_index("dw_ek_borger").sort_index()
+    outcome_df = flattened_dataset.get_df().set_index("id").sort_index()
+    expected_df = expected_df.set_index("id").sort_index()
 
     for col in expected_df.columns:
         pd.testing.assert_series_equal(
@@ -506,13 +506,13 @@ def test_add_temporal_predictors_then_temporal_outcome():
 
 
 def test_add_temporal_incident_binary_outcome():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-11-05 00:00:00
                             1,2021-11-01 00:00:00
                             1,2023-11-05 00:00:00
                             """
 
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2021-11-06 00:00:01, 1
                         """
 
@@ -527,7 +527,7 @@ def test_add_temporal_incident_binary_outcome():
     flattened_dataset = TimeseriesFlattener(
         prediction_times_df=prediction_times_df,
         timestamp_col_name="timestamp",
-        id_col_name="dw_ek_borger",
+        id_col_name="id",
         n_workers=4,
         drop_pred_times_with_insufficient_look_distance=False,
     )
diff --git a/tests/test_timeseriesflattener/test_flattened_dataset/test_cache.py b/tests/test_timeseriesflattener/test_flattened_dataset/test_cache.py
index 88c600b..f9ce4c7 100644
--- a/tests/test_timeseriesflattener/test_flattened_dataset/test_cache.py
+++ b/tests/test_timeseriesflattener/test_flattened_dataset/test_cache.py
@@ -53,7 +53,7 @@ def test_cache_hitting(
 
     cache = DiskCache(
         feature_cache_dir=tmp_path,
-        id_col_name="dw_ek_borger",
+        id_col_name="id",
     )
 
     # Create the cache
diff --git a/tests/test_timeseriesflattener/test_flattened_dataset/test_errors.py b/tests/test_timeseriesflattener/test_flattened_dataset/test_errors.py
index dbee053..d8bfb56 100644
--- a/tests/test_timeseriesflattener/test_flattened_dataset/test_errors.py
+++ b/tests/test_timeseriesflattener/test_flattened_dataset/test_errors.py
@@ -12,7 +12,7 @@ from timeseriesflattener.testing.utils_for_testing import (
 
 
 def test_col_does_not_exist_in_prediction_times():
-    prediction_times_str = """dw_ek_borger,
+    prediction_times_str = """id,
                             1,
                             """
 
@@ -22,17 +22,17 @@ def test_col_does_not_exist_in_prediction_times():
         TimeseriesFlattener(  # noqa
             prediction_times_df=prediction_times_df,
             timestamp_col_name="timestamp",
-            id_col_name="dw_ek_borger",
+            id_col_name="id",
             drop_pred_times_with_insufficient_look_distance=False,
         )
 
 
 def test_col_does_not_exist():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             """
 
-    event_times_str = """dw_ek_borger,val,
+    event_times_str = """id,val,
                         1, 1
                         1, 2
                         """
@@ -43,7 +43,7 @@ def test_col_does_not_exist():
     flattened_df = TimeseriesFlattener(
         prediction_times_df=prediction_times_df,
         timestamp_col_name="timestamp",
-        id_col_name="dw_ek_borger",
+        id_col_name="id",
         drop_pred_times_with_insufficient_look_distance=False,
     )
 
@@ -61,7 +61,7 @@ def test_col_does_not_exist():
 
 def test_duplicate_prediction_times():
     with pytest.raises(ValueError, match=r".*Duplicate.*"):
-        prediction_times_df_str = """dw_ek_borger,timestamp,
+        prediction_times_df_str = """id,timestamp,
                                 1,2021-12-30 00:00:00
                                 1,2021-12-30 00:00:00
                                 """
diff --git a/tests/test_timeseriesflattener/test_flattened_dataset/test_flattened_dataset.py b/tests/test_timeseriesflattener/test_flattened_dataset/test_flattened_dataset.py
index 3c29c1f..7eea49e 100644
--- a/tests/test_timeseriesflattener/test_flattened_dataset/test_flattened_dataset.py
+++ b/tests/test_timeseriesflattener/test_flattened_dataset/test_flattened_dataset.py
@@ -91,7 +91,7 @@ def test_compute_specs(
         fallback=np.nan,
     )
     static_spec = StaticSpec(
-        values_df=synth_outcome[["value", "dw_ek_borger"]],
+        values_df=synth_outcome[["value", "id"]],
         feature_name="static",
         prefix="pred",
     )
@@ -108,7 +108,7 @@ def test_drop_pred_time_if_insufficient_look_distance():
     # Create a sample DataFrame with some test data
     pred_time_df = pd.DataFrame(
         {
-            "dw_ek_borger": [1, 1, 1, 1],
+            "id": [1, 1, 1, 1],
             "timestamp": ["2022-01-01", "2022-01-02", "2022-01-03", "2022-01-04"],
         },
     )
@@ -120,7 +120,7 @@ def test_drop_pred_time_if_insufficient_look_distance():
 
     pred_val_df = pd.DataFrame(
         {
-            "dw_ek_borger": [1],
+            "id": [1],
             "timestamp": ["2022-01-01"],
             "value": [1],
         },
@@ -137,7 +137,7 @@ def test_drop_pred_time_if_insufficient_look_distance():
 
     out_val_df = pd.DataFrame(
         {
-            "dw_ek_borger": [1],
+            "id": [1],
             "timestamp": ["2022-01-05"],
             "value": [4],
         },
diff --git a/tests/test_timeseriesflattener/test_resolve_multiple.py b/tests/test_timeseriesflattener/test_resolve_multiple.py
index 409bf50..59b19ae 100644
--- a/tests/test_timeseriesflattener/test_resolve_multiple.py
+++ b/tests/test_timeseriesflattener/test_resolve_multiple.py
@@ -12,10 +12,10 @@ from timeseriesflattener.testing.utils_for_testing import (
 
 def test_resolve_multiple_catalogue():
     """Test that resolve_multiple functions can be retrieved from catalogue."""
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             """
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2022-01-01 00:00:01, 1
                         1,2022-01-01 00:00:02, 2
                         """
@@ -35,10 +35,10 @@ def test_resolve_multiple_catalogue():
 
 
 def test_resolve_multiple_max():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             """
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2022-01-01 00:00:01, 1
                         1,2022-01-01 00:00:02, 2
                         """
@@ -58,10 +58,10 @@ def test_resolve_multiple_max():
 
 
 def test_resolve_multiple_min():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             """
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2022-01-01 00:00:01, 1
                         1,2022-01-01 00:00:02, 2
                         """
@@ -81,10 +81,10 @@ def test_resolve_multiple_min():
 
 
 def test_resolve_multiple_avg():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 08:00:00
                             """
-    predictor_df_str = """dw_ek_borger,timestamp,value,
+    predictor_df_str = """id,timestamp,value,
                         1,2021-12-30 00:00:01, 1
                         1,2021-12-30 00:00:02, 2
                         """
@@ -103,11 +103,11 @@ def test_resolve_multiple_avg():
 
 
 def test_resolve_multiple_latest():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             2,2021-12-31 00:00:00
                             """
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2022-01-01 00:00:01, 1
                         1,2022-01-01 00:00:03, 3
                         1,2022-01-01 00:00:02, 2
@@ -131,11 +131,11 @@ def test_resolve_multiple_latest():
 
 
 def test_resolve_multiple_latest_no_values():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             2,2021-12-31 00:00:00
                             """
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2022-01-01 00:00:01, 1
                         1,2022-01-01 00:00:02, 2
                         """
@@ -155,10 +155,10 @@ def test_resolve_multiple_latest_no_values():
 
 
 def test_resolve_multiple_latest_one_vlaue():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             """
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2022-01-01 00:00:01, 1
                         """
 
@@ -177,11 +177,11 @@ def test_resolve_multiple_latest_one_vlaue():
 
 
 def test_resolve_multiple_earliest():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             2,2021-12-31 00:00:00
                             """
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2022-01-01 00:00:03, 3
                         1,2022-01-01 00:00:01, 1
                         1,2022-01-01 00:00:02, 2
@@ -205,10 +205,10 @@ def test_resolve_multiple_earliest():
 
 
 def test_resolve_multiple_sum():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             """
-    predictor_df_str = """dw_ek_borger,timestamp,value,
+    predictor_df_str = """id,timestamp,value,
                         1,2021-12-30 00:00:01, 1
                         1,2021-12-30 00:00:02, 2
                         """
@@ -227,10 +227,10 @@ def test_resolve_multiple_sum():
 
 
 def test_resolve_multiple_count():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             """
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2022-01-01 00:00:01, 1
                         1,2022-01-01 00:00:02, 2
                         """
@@ -250,11 +250,11 @@ def test_resolve_multiple_count():
 
 
 def test_resolve_multiple_bool():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             2,2021-12-31 00:00:00
                             """
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2022-01-01 00:00:01, 1
                         1,2022-01-01 00:00:02, 2
                         """
@@ -274,11 +274,11 @@ def test_resolve_multiple_bool():
 
 
 def test_resolve_multiple_change_per_day():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             2,2021-12-31 00:00:00
                             """
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2022-01-01 00:00:00, 1
                         1,2022-01-02 00:00:00, 2
                         2,2022-01-01 00:00:00, 1
@@ -300,11 +300,11 @@ def test_resolve_multiple_change_per_day():
 
 
 def test_resolve_multiple_change_per_day_unordered():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             2,2021-12-31 00:00:00
                             """
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2022-01-02 00:00:00, 2
                         1,2022-01-01 00:00:00, 1
                         2,2022-01-02 00:00:00, 2
@@ -326,11 +326,11 @@ def test_resolve_multiple_change_per_day_unordered():
 
 
 def test_resolve_multiple_change_per_day_negative():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             2,2021-12-31 00:00:00
                             """
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2022-01-02 00:00:00, 2
                         1,2022-01-01 00:00:00, 1
                         2,2022-01-02 00:00:00, 1
@@ -352,11 +352,11 @@ def test_resolve_multiple_change_per_day_negative():
 
 
 def test_resolve_multiple_change_per_day_too_few_datapoints():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             2,2021-12-31 00:00:00
                             """
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2022-01-01 00:00:00, 1
                         1,2022-01-02 00:00:00, 2
                         2,2022-01-01 00:00:00, 1
@@ -378,11 +378,11 @@ def test_resolve_multiple_change_per_day_too_few_datapoints():
 
 
 def test_resolve_multiple_variance():
-    prediction_times_str = """dw_ek_borger,timestamp,
+    prediction_times_str = """id,timestamp,
                             1,2021-12-31 00:00:00
                             2,2021-12-31 00:00:00
                             """
-    event_times_str = """dw_ek_borger,timestamp,value,
+    event_times_str = """id,timestamp,value,
                         1,2022-01-01 00:00:00, 1
                         1,2022-01-02 00:00:00, 2
                         2,2022-01-01 00:00:00, 1