diff --git a/demo_mvlr.ipynb b/demo_mvlr.ipynb index 0b26460..8215be3 100644 --- a/demo_mvlr.ipynb +++ b/demo_mvlr.ipynb @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -42,774 +42,19 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "with open('data/mvlr/sample_solar.json', 'r') as f:\n", + "with open('data/mvlr/sample_gas.json', 'r') as f:\n", " input_data = MultiVariableRegressionInput.model_validate_json(f.read())" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'timezone': 'Europe/Brussels',\n", - " 'independent_variables': [{'name': 'temperatureEquivalent',\n", - " 'variants': ['HDD_16.5', 'CDD_24', 'HDD_15', 'FDD_0']},\n", - " {'name': 'solarRadiation', 'variants': []},\n", - " {'name': 'windPower', 'variants': []}],\n", - " 'dependent_variable': 'energyProduction/solarPhotovoltaic',\n", - " 'frame': {'columns': ['energyProduction/solarPhotovoltaic',\n", - " 'temperatureEquivalent',\n", - " 'solarRadiation',\n", - " 'windPower'],\n", - " 'index': [datetime.datetime(2021, 1, 1, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 2, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 3, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 4, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 5, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 6, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 7, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 8, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 9, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 10, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 11, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 12, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 13, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 14, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 15, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 16, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 17, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 18, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 19, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 20, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 21, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 22, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 23, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 24, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 25, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 26, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 27, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 28, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 29, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 30, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 1, 31, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 1, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 2, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 3, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 4, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 5, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 6, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 7, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 8, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 9, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 10, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 11, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 12, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 13, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 14, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 15, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 16, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 17, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 18, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 19, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 20, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 21, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 22, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 23, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 24, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 25, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 26, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 27, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 2, 28, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 1, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 2, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 3, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 4, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 5, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 6, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 7, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 8, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 9, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 10, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 11, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 12, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 13, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 14, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 15, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 16, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 17, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 18, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 19, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 20, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 21, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 22, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 23, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 24, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 25, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 26, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 27, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 28, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 3, 29, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 3, 30, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 3, 31, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 1, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 2, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 3, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 4, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 5, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 6, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 7, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 8, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 9, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 10, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 11, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 12, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 13, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 14, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 15, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 16, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 17, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 18, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 19, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 20, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 21, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 22, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 23, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 24, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 25, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 26, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 27, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 28, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 29, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 4, 30, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 1, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 2, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 3, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 4, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 5, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 6, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 7, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 8, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 9, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 10, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 11, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 12, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 13, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 14, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 15, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 16, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 17, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 18, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 19, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 20, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 21, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 22, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 23, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 24, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 25, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 26, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 27, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 28, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 29, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 30, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 5, 31, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 1, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 2, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 3, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 4, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 5, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 6, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 7, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 8, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 9, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 10, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 11, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 12, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 13, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 14, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 15, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 16, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 17, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 18, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 19, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 20, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 21, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 22, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 23, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 24, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 25, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 26, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 27, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 28, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 29, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 6, 30, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 1, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 2, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 3, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 4, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 5, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 6, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 7, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 8, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 9, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 10, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 11, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 12, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 13, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 14, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 15, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 16, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 17, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 18, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 19, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 20, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 21, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 22, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 23, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 24, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 25, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 26, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 27, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 28, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 29, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 30, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 7, 31, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 1, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 2, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 3, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 4, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 5, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 6, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 7, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 8, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 9, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 10, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 11, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 12, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 13, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 14, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 15, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 16, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 17, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 18, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 19, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 20, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 21, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 22, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 23, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 24, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 25, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 26, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 27, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 28, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 29, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 30, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 8, 31, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 1, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 2, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 3, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 4, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 5, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 6, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 7, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 8, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 9, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 10, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 11, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 12, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 13, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 14, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 15, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 16, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 17, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 18, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 19, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 20, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 21, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 22, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 23, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 24, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 25, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 26, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 27, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 28, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 29, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 9, 30, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 1, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 2, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 3, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 4, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 5, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 6, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 7, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 8, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 9, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 10, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 11, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 12, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 13, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 14, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 15, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 16, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 17, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 18, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 19, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 20, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 21, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 22, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 23, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 24, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 25, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 26, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 27, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 28, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 29, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 30, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 10, 31, 0, 0, tzinfo=TzInfo(+02:00)),\n", - " datetime.datetime(2021, 11, 1, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 2, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 3, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 4, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 5, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 6, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 7, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 8, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 9, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 10, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 11, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 12, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 13, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 14, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 15, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 16, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 17, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 18, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 19, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 20, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 21, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 22, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 23, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 24, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 25, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 26, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 27, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 28, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 29, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 11, 30, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 1, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 2, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 3, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 4, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 5, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 6, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 7, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 8, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 9, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 10, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 11, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 12, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 13, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 14, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 15, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 16, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 17, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 18, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 19, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 20, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 21, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 22, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 23, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 24, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 25, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 26, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 27, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 28, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 29, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 30, 0, 0, tzinfo=TzInfo(+01:00)),\n", - " datetime.datetime(2021, 12, 31, 0, 0, tzinfo=TzInfo(+01:00))],\n", - " 'data': [[3.982, 1.95, 583.87, 5.83],\n", - " [1.188, 2.02, 583.87, 6.86],\n", - " [0.528, 2.43, 583.87, 24.39],\n", - " [0.316, 2.17, 583.87, 50.65],\n", - " [0.241, 2.04, 583.87, 42.88],\n", - " [0.826, 2.17, 583.87, 19.68],\n", - " [1.887, 1.85, 583.87, 24.39],\n", - " [1.133, 1.55, 583.87, 15.62],\n", - " [3.164, -0.26, 583.87, 0.73],\n", - " [0.0, -0.46, 583.87, 2.74],\n", - " [0.0, 1.81, 583.87, 140.61],\n", - " [0.0, 4.11, 583.87, 74.09],\n", - " [0.0, 3.34, 583.87, 13.82],\n", - " [0.0, 2.02, 583.87, 32.77],\n", - " [0.0, 0.99, 583.87, 17.58],\n", - " [0.0, 0.25, 583.87, 46.66],\n", - " [0.0, 2.19, 583.87, 17.58],\n", - " [0.0, 3.47, 583.87, 64.0],\n", - " [0.0, 5.1, 583.87, 405.22],\n", - " [0.0, 7.33, 583.87, 438.98],\n", - " [0.698, 7.61, 583.87, 438.98],\n", - " [3.993, 5.48, 583.87, 29.79],\n", - " [0.586, 3.86, 583.87, 46.66],\n", - " [3.476, 2.02, 583.87, 42.88],\n", - " [3.802, 1.97, 583.87, 19.68],\n", - " [4.398, 2.39, 583.87, 59.32],\n", - " [0.403, 3.07, 583.87, 50.65],\n", - " [0.718, 6.51, 583.87, 79.51],\n", - " [2.941, 8.29, 583.87, 125.0],\n", - " [1.049, 5.16, 583.87, 85.18],\n", - " [4.999, 2.18, 583.87, 50.65],\n", - " [0.758, 2.73, 1775.0, 10.65],\n", - " [1.133, 6.11, 1775.0, 97.34],\n", - " [0.859, 8.47, 1775.0, 103.82],\n", - " [4.355, 8.2, 1775.0, 39.3],\n", - " [4.539, 7.96, 1775.0, 19.68],\n", - " [1.581, 6.25, 1775.0, 50.65],\n", - " [0.0, 1.15, 1775.0, 46.66],\n", - " [0.0, -3.32, 1775.0, 64.0],\n", - " [0.0, -5.36, 1775.0, 74.09],\n", - " [0.0, -5.43, 1775.0, 64.0],\n", - " [0.0, -4.61, 1775.0, 32.77],\n", - " [0.015, -4.63, 1775.0, 97.34],\n", - " [0.018, -3.95, 1775.0, 97.34],\n", - " [0.04, -1.35, 1775.0, 157.46],\n", - " [0.828, 2.38, 1775.0, 157.46],\n", - " [6.109, 6.75, 1775.0, 125.0],\n", - " [5.287, 8.84, 1775.0, 132.65],\n", - " [3.371, 8.49, 1775.0, 238.33],\n", - " [7.054, 7.88, 1775.0, 110.59],\n", - " [9.622, 10.81, 1775.0, 343.0],\n", - " [10.322, 12.25, 1775.0, 125.0],\n", - " [5.864, 13.2, 1775.0, 97.34],\n", - " [9.279, 14.14, 1775.0, 175.62],\n", - " [10.757, 14.52, 1775.0, 132.65],\n", - " [5.821, 13.29, 1775.0, 27.0],\n", - " [8.869, 9.68, 1775.0, 27.0],\n", - " [3.32, 5.71, 1775.0, 12.17],\n", - " [9.023, 5.58, 1775.0, 50.65],\n", - " [7.415, 5.71, 2874.19, 35.94],\n", - " [9.457, 7.88, 2874.19, 12.17],\n", - " [8.527, 9.94, 2874.19, 8.0],\n", - " [0.385, 7.52, 2874.19, 17.58],\n", - " [10.775, 4.55, 2874.19, 54.87],\n", - " [11.43, 2.89, 2874.19, 27.0],\n", - " [10.235, 2.46, 2874.19, 24.39],\n", - " [10.598, 3.78, 2874.19, 4.1],\n", - " [1.597, 4.89, 2874.19, 13.82],\n", - " [4.373, 6.05, 2874.19, 185.19],\n", - " [6.888, 8.28, 2874.19, 571.79],\n", - " [3.479, 7.68, 2874.19, 328.51],\n", - " [6.811, 7.29, 2874.19, 357.91],\n", - " [7.032, 6.3, 2874.19, 59.32],\n", - " [4.97, 6.23, 2874.19, 110.59],\n", - " [2.533, 5.65, 2874.19, 13.82],\n", - " [4.519, 5.52, 2874.19, 64.0],\n", - " [3.259, 5.12, 2874.19, 17.58],\n", - " [14.839, 5.08, 2874.19, 91.12],\n", - " [15.496, 5.02, 2874.19, 21.95],\n", - " [4.528, 5.67, 2874.19, 64.0],\n", - " [3.804, 5.93, 2874.19, 12.17],\n", - " [13.591, 7.21, 2874.19, 21.95],\n", - " [15.311, 8.82, 2874.19, 27.0],\n", - " [4.958, 8.93, 2874.19, 19.68],\n", - " [7.954, 8.92, 2874.19, 140.61],\n", - " [9.586, 7.74, 2874.19, 110.59],\n", - " [10.822, 9.23, 2874.19, 132.65],\n", - " [16.768, 12.1, 2874.19, 68.92],\n", - " [16.417, 14.6, 2874.19, 12.17],\n", - " [16.023, 16.23, 2874.19, 6.86],\n", - " [14.546, 15.04, 4316.67, 35.94],\n", - " [12.786, 9.79, 4316.67, 97.34],\n", - " [9.26, 7.61, 4316.67, 79.51],\n", - " [4.949, 6.32, 4316.67, 12.17],\n", - " [7.953, 4.46, 4316.67, 132.65],\n", - " [5.199, 2.06, 4316.67, 59.32],\n", - " [3.337, 1.83, 4316.67, 68.92],\n", - " [11.566, 3.71, 4316.67, 27.0],\n", - " [12.213, 7.05, 4316.67, 24.39],\n", - " [2.012, 7.37, 4316.67, 15.62],\n", - " [7.027, 5.51, 4316.67, 74.09],\n", - " [12.185, 3.76, 4316.67, 12.17],\n", - " [13.994, 3.9, 4316.67, 6.86],\n", - " [9.301, 4.83, 4316.67, 15.62],\n", - " [8.998, 5.17, 4316.67, 19.68],\n", - " [13.642, 6.12, 4316.67, 42.88],\n", - " [17.361, 7.21, 4316.67, 54.87],\n", - " [17.893, 8.23, 4316.67, 15.62],\n", - " [10.701, 8.43, 4316.67, 8.0],\n", - " [14.958, 10.11, 4316.67, 5.83],\n", - " [15.312, 10.92, 4316.67, 46.66],\n", - " [17.779, 9.34, 4316.67, 54.87],\n", - " [18.86, 9.01, 4316.67, 39.3],\n", - " [17.982, 9.36, 4316.67, 74.09],\n", - " [15.819, 8.5, 4316.67, 91.12],\n", - " [18.878, 8.71, 4316.67, 50.65],\n", - " [17.577, 10.14, 4316.67, 21.95],\n", - " [15.945, 12.09, 4316.67, 24.39],\n", - " [4.529, 9.36, 4316.67, 39.3],\n", - " [8.24, 7.43, 4316.67, 9.26],\n", - " [11.391, 6.96, 4712.9, 13.82],\n", - " [13.257, 6.99, 4712.9, 12.17],\n", - " [14.998, 8.69, 4712.9, 97.34],\n", - " [5.86, 9.52, 4712.9, 389.02],\n", - " [13.067, 8.42, 4712.9, 54.87],\n", - " [12.078, 7.55, 4712.9, 21.95],\n", - " [14.887, 7.77, 4712.9, 21.95],\n", - " [6.353, 10.65, 4712.9, 175.62],\n", - " [12.653, 15.9, 4712.9, 205.38],\n", - " [11.3, 16.64, 4712.9, 125.0],\n", - " [8.679, 14.61, 4712.9, 6.86],\n", - " [13.005, 12.81, 4712.9, 12.17],\n", - " [11.173, 11.78, 4712.9, 15.62],\n", - " [10.723, 11.65, 4712.9, 13.82],\n", - " [6.17, 11.01, 4712.9, 35.94],\n", - " [12.0, 11.13, 4712.9, 35.94],\n", - " [7.821, 11.05, 4712.9, 85.18],\n", - " [13.932, 11.51, 4712.9, 27.0],\n", - " [10.391, 10.88, 4712.9, 17.58],\n", - " [12.928, 11.38, 4712.9, 85.18],\n", - " [11.481, 12.38, 4712.9, 328.51],\n", - " [4.348, 11.2, 4712.9, 195.11],\n", - " [13.775, 11.56, 4712.9, 125.0],\n", - " [8.087, 10.92, 4712.9, 117.65],\n", - " [7.623, 10.35, 4712.9, 64.0],\n", - " [11.307, 10.77, 4712.9, 35.94],\n", - " [5.679, 11.38, 4712.9, 39.3],\n", - " [16.522, 12.37, 4712.9, 12.17],\n", - " [17.938, 14.58, 4712.9, 29.79],\n", - " [19.6, 15.78, 4712.9, 29.79],\n", - " [18.676, 17.31, 4712.9, 19.68],\n", - " [19.882, 18.51, 5206.67, 21.95],\n", - " [19.384, 20.08, 5206.67, 13.82],\n", - " [0.233, 20.72, 5206.67, 19.68],\n", - " [12.601, 19.76, 5206.67, 8.0],\n", - " [3.941, 16.19, 5206.67, 19.68],\n", - " [19.415, 15.88, 5206.67, 12.17],\n", - " [19.779, 16.91, 5206.67, 13.82],\n", - " [14.922, 18.58, 5206.67, 4.1],\n", - " [16.949, 19.23, 5206.67, 5.83],\n", - " [19.119, 19.82, 5206.67, 10.65],\n", - " [18.627, 19.91, 5206.67, 13.82],\n", - " [11.461, 18.36, 5206.67, 35.94],\n", - " [19.592, 17.68, 5206.67, 5.83],\n", - " [19.387, 19.88, 5206.67, 13.82],\n", - " [15.95, 20.8, 5206.67, 21.95],\n", - " [18.692, 22.61, 5206.67, 8.0],\n", - " [14.741, 24.06, 5206.67, 46.66],\n", - " [15.524, 24.14, 5206.67, 85.18],\n", - " [6.214, 20.99, 5206.67, 27.0],\n", - " [13.365, 20.06, 5206.67, 27.0],\n", - " [3.943, 17.49, 5206.67, 39.3],\n", - " [4.796, 14.84, 5206.67, 64.0],\n", - " [7.661, 13.96, 5206.67, 21.95],\n", - " [8.117, 15.05, 5206.67, 13.82],\n", - " [7.841, 15.28, 5206.67, 17.58],\n", - " [10.987, 17.25, 5206.67, 3.38],\n", - " [9.203, 18.95, 5206.67, 13.82],\n", - " [8.973, 19.43, 5206.67, 5.83],\n", - " [10.515, 18.48, 5206.67, 17.58],\n", - " [2.625, 15.32, 5206.67, 24.39],\n", - " [5.075, 14.26, 4416.13, 15.62],\n", - " [11.833, 16.37, 4416.13, 6.86],\n", - " [6.917, 17.73, 4416.13, 15.62],\n", - " [9.081, 17.52, 4416.13, 4.91],\n", - " [8.687, 17.21, 4416.13, 24.39],\n", - " [10.78, 17.22, 4416.13, 166.38],\n", - " [14.771, 17.64, 4416.13, 29.79],\n", - " [11.934, 18.02, 4416.13, 4.1],\n", - " [12.367, 17.57, 4416.13, 8.0],\n", - " [7.516, 17.18, 4416.13, 3.38],\n", - " [14.63, 16.9, 4416.13, 4.91],\n", - " [8.459, 18.14, 4416.13, 4.91],\n", - " [3.909, 17.64, 4416.13, 29.79],\n", - " [1.852, 16.57, 4416.13, 110.59],\n", - " [0.998, 16.02, 4416.13, 79.51],\n", - " [7.21, 16.08, 4416.13, 27.0],\n", - " [17.438, 18.21, 4416.13, 32.77],\n", - " [18.423, 20.28, 4416.13, 29.79],\n", - " [17.635, 20.29, 4416.13, 10.65],\n", - " [17.707, 19.86, 4416.13, 9.26],\n", - " [18.308, 19.87, 4416.13, 8.0],\n", - " [17.164, 20.02, 4416.13, 13.82],\n", - " [18.673, 19.73, 4416.13, 32.77],\n", - " [4.226, 19.2, 4416.13, 19.68],\n", - " [12.032, 18.96, 4416.13, 15.62],\n", - " [8.156, 18.42, 4416.13, 32.77],\n", - " [8.638, 18.12, 4416.13, 39.3],\n", - " [11.336, 17.95, 4416.13, 85.18],\n", - " [14.571, 17.55, 4416.13, 64.0],\n", - " [10.709, 17.54, 4416.13, 110.59],\n", - " [11.947, 16.67, 4416.13, 39.3],\n", - " [6.173, 15.65, 3790.32, 8.0],\n", - " [8.968, 15.56, 3790.32, 4.1],\n", - " [12.084, 15.94, 3790.32, 4.1],\n", - " [10.696, 16.69, 3790.32, 4.1],\n", - " [12.848, 18.21, 3790.32, 15.62],\n", - " [10.534, 17.88, 3790.32, 74.09],\n", - " [12.856, 17.03, 3790.32, 85.18],\n", - " [10.948, 16.05, 3790.32, 117.65],\n", - " [9.849, 15.99, 3790.32, 50.65],\n", - " [7.875, 16.47, 3790.32, 13.82],\n", - " [16.017, 17.03, 3790.32, 8.0],\n", - " [12.19, 18.75, 3790.32, 3.38],\n", - " [11.637, 19.13, 3790.32, 15.62],\n", - " [14.761, 18.75, 3790.32, 9.26],\n", - " [14.892, 19.43, 3790.32, 21.95],\n", - " [5.65, 16.6, 3790.32, 39.3],\n", - " [3.462, 14.42, 3790.32, 17.58],\n", - " [4.148, 15.44, 3790.32, 19.68],\n", - " [6.134, 16.4, 3790.32, 21.95],\n", - " [6.86, 17.74, 3790.32, 12.17],\n", - " [11.957, 18.72, 3790.32, 9.26],\n", - " [6.425, 17.74, 3790.32, 35.94],\n", - " [2.67, 17.49, 3790.32, 35.94],\n", - " [0.0, 17.2, 3790.32, 50.65],\n", - " [0.0, 16.96, 3790.32, 35.94],\n", - " [0.0, 16.17, 3790.32, 39.3],\n", - " [0.0, 15.51, 3790.32, 39.3],\n", - " [0.0, 16.03, 3790.32, 39.3],\n", - " [0.0, 15.65, 3790.32, 39.3],\n", - " [0.0, 16.56, 3790.32, 54.87],\n", - " [0.0, 16.95, 3790.32, 42.88],\n", - " [0.0, 16.63, 3480.0, 13.82],\n", - " [12.591, 16.86, 3480.0, 24.39],\n", - " [15.797, 17.98, 3480.0, 24.39],\n", - " [7.974, 17.64, 3480.0, 21.95],\n", - " [15.584, 18.61, 3480.0, 8.0],\n", - " [13.86, 19.03, 3480.0, 4.91],\n", - " [16.132, 19.99, 3480.0, 10.65],\n", - " [17.074, 20.49, 3480.0, 15.62],\n", - " [13.371, 20.68, 3480.0, 39.3],\n", - " [6.374, 19.5, 3480.0, 21.95],\n", - " [5.126, 17.88, 3480.0, 17.58],\n", - " [9.232, 16.69, 3480.0, 10.65],\n", - " [13.953, 16.46, 3480.0, 15.62],\n", - " [7.901, 17.37, 3480.0, 21.95],\n", - " [4.598, 17.49, 3480.0, 13.82],\n", - " [10.663, 16.38, 3480.0, 5.83],\n", - " [14.849, 16.08, 3480.0, 4.91],\n", - " [13.948, 16.83, 3480.0, 12.17],\n", - " [11.153, 16.67, 3480.0, 4.91],\n", - " [12.411, 15.54, 3480.0, 19.68],\n", - " [14.304, 13.88, 3480.0, 10.65],\n", - " [13.469, 13.6, 3480.0, 2.74],\n", - " [11.021, 14.41, 3480.0, 19.68],\n", - " [7.983, 15.89, 3480.0, 24.39],\n", - " [11.76, 16.47, 3480.0, 6.86],\n", - " [7.841, 17.27, 3480.0, 32.77],\n", - " [3.586, 16.21, 3480.0, 79.51],\n", - " [12.913, 14.49, 3480.0, 46.66],\n", - " [7.499, 12.79, 3480.0, 68.92],\n", - " [5.514, 11.55, 3480.0, 54.87],\n", - " [4.238, 12.54, 1806.45, 166.38],\n", - " [3.929, 13.7, 1806.45, 226.98],\n", - " [1.879, 13.25, 1806.45, 64.0],\n", - " [9.631, 13.28, 1806.45, 148.88],\n", - " [4.098, 12.73, 1806.45, 175.62],\n", - " [2.991, 11.6, 1806.45, 59.32],\n", - " [6.885, 11.41, 1806.45, 2.2],\n", - " [9.178, 11.62, 1806.45, 12.17],\n", - " [10.019, 11.59, 1806.45, 8.0],\n", - " [7.863, 11.17, 1806.45, 4.91],\n", - " [4.766, 11.14, 1806.45, 9.26],\n", - " [3.537, 10.45, 1806.45, 17.58],\n", - " [4.669, 9.52, 1806.45, 4.1],\n", - " [4.118, 10.18, 1806.45, 17.58],\n", - " [3.939, 10.44, 1806.45, 13.82],\n", - " [7.577, 9.39, 1806.45, 5.83],\n", - " [5.708, 9.81, 1806.45, 9.26],\n", - " [6.164, 11.27, 1806.45, 85.18],\n", - " [2.164, 14.71, 1806.45, 140.61],\n", - " [2.034, 15.89, 1806.45, 262.14],\n", - " [4.537, 11.84, 1806.45, 140.61],\n", - " [4.459, 9.14, 1806.45, 29.79],\n", - " [5.794, 8.78, 1806.45, 10.65],\n", - " [5.162, 8.94, 1806.45, 74.09],\n", - " [3.371, 9.97, 1806.45, 50.65],\n", - " [4.856, 11.1, 1806.45, 54.87],\n", - " [4.689, 12.25, 1806.45, 64.0],\n", - " [4.195, 12.39, 1806.45, 166.38],\n", - " [3.681, 12.77, 1806.45, 226.98],\n", - " [1.062, 12.39, 1806.45, 110.59],\n", - " [3.01, 12.01, 1806.45, 157.46],\n", - " [3.859, 10.39, 796.67, 117.65],\n", - " [2.21, 8.14, 796.67, 21.95],\n", - " [3.786, 6.85, 796.67, 6.86],\n", - " [2.545, 6.27, 796.67, 10.65],\n", - " [2.477, 6.91, 796.67, 9.26],\n", - " [2.096, 7.33, 796.67, 85.18],\n", - " [2.819, 8.63, 796.67, 59.32],\n", - " [3.879, 7.53, 796.67, 4.91],\n", - " [3.377, 6.82, 796.67, 9.26],\n", - " [2.788, 5.73, 796.67, 4.91],\n", - " [2.218, 5.87, 796.67, 4.1],\n", - " [3.979, 6.55, 796.67, 50.65],\n", - " [1.592, 8.95, 796.67, 29.79],\n", - " [1.267, 9.22, 796.67, 21.95],\n", - " [0.167, 7.4, 796.67, 19.68],\n", - " [0.271, 5.79, 796.67, 2.74],\n", - " [1.645, 6.1, 796.67, 12.17],\n", - " [3.011, 7.05, 796.67, 29.79],\n", - " [0.927, 9.12, 796.67, 10.65],\n", - " [0.43, 8.95, 796.67, 13.82],\n", - " [1.209, 7.72, 796.67, 17.58],\n", - " [1.568, 5.62, 796.67, 50.65],\n", - " [1.567, 4.44, 796.67, 1.0],\n", - " [0.747, 5.25, 796.67, 2.2],\n", - " [0.964, 4.6, 796.67, 3.38],\n", - " [0.615, 4.02, 796.67, 79.51],\n", - " [2.529, 2.77, 796.67, 15.62],\n", - " [1.384, 2.68, 796.67, 17.58],\n", - " [2.386, 2.49, 796.67, 27.0],\n", - " [0.296, 5.44, 796.67, 140.61],\n", - " [0.964, 6.84, 435.48, 175.62],\n", - " [1.167, 4.07, 435.48, 17.58],\n", - " [1.045, 2.92, 435.48, 103.82],\n", - " [0.429, 3.64, 435.48, 32.77],\n", - " [1.205, 3.75, 435.48, 19.68],\n", - " [1.274, 3.02, 435.48, 39.3],\n", - " [2.041, 3.57, 435.48, 166.38],\n", - " [2.256, 4.48, 435.48, 148.88],\n", - " [0.888, 4.01, 435.48, 85.18],\n", - " [0.302, 2.57, 435.48, 64.0],\n", - " [2.226, 3.44, 435.48, 21.95],\n", - " [0.297, 6.32, 435.48, 79.51],\n", - " [0.391, 8.02, 435.48, 29.79],\n", - " [0.71, 7.89, 435.48, 21.95],\n", - " [0.537, 8.15, 435.48, 17.58],\n", - " [1.747, 7.83, 435.48, 1.33],\n", - " [0.338, 6.6, 435.48, 15.62],\n", - " [0.314, 6.04, 435.48, 17.58],\n", - " [0.256, 5.71, 435.48, 9.26],\n", - " [0.759, 5.27, 435.48, 9.26],\n", - " [1.256, 1.82, 435.48, 8.0],\n", - " [2.673, -0.1, 435.48, 13.82],\n", - " [1.07, 1.64, 435.48, 85.18],\n", - " [0.561, 5.44, 435.48, 24.39],\n", - " [0.392, 4.46, 435.48, 29.79],\n", - " [1.533, 4.27, 435.48, 19.68],\n", - " [0.742, 6.76, 435.48, 79.51],\n", - " [0.753, 8.71, 435.48, 205.38],\n", - " [0.38, 9.83, 435.48, 68.92],\n", - " [1.224, 12.11, 435.48, 157.46],\n", - " [1.102, 12.63, 435.48, 85.18]]},\n", - " 'granularities': [, ],\n", - " 'allow_negative_predictions': False,\n", - " 'validation_parameters': {'rsquared': 0.75,\n", - " 'f_pvalue': 0.05,\n", - " 'pvalues': 0.05}}" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "input_data.model_dump()" ] @@ -825,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -834,69 +79,19 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'dependent_variable': 'energyProduction/solarPhotovoltaic',\n", - " 'independent_variables': [{'name': 'solarRadiation',\n", - " 'coef': 0.0024924735991862625,\n", - " 't_stat': 12.250914745542833,\n", - " 'p_value': 2.404202661661546e-07,\n", - " 'std_err': 0.0002034520401909647,\n", - " 'confidence_interval': {'confidence': 0.95,\n", - " 'lower': 0.0020391542039252418,\n", - " 'upper': 0.0029457929944472832}}],\n", - " 'r2': 0.9375331511967008,\n", - " 'r2_adj': 0.9312864663163709,\n", - " 'f_stat': 150.08491210255892,\n", - " 'prob_f_stat': 2.40420266166154e-07,\n", - " 'intercept': {'name': 'Intercept',\n", - " 'coef': 2.733302450232918,\n", - " 't_stat': 0.13401884485997137,\n", - " 'p_value': 0.8960465198298829,\n", - " 'std_err': 20.39491127601338,\n", - " 'confidence_interval': {'confidence': 0.95,\n", - " 'lower': -42.70939174623032,\n", - " 'upper': 48.175996646696156}},\n", - " 'granularity': ,\n", - " 'frame': {'columns': ['energyProduction/solarPhotovoltaic', 'solarRadiation'],\n", - " 'index': [Timestamp('2021-01-01 00:00:00+0100', tz='Europe/Brussels'),\n", - " Timestamp('2021-02-01 00:00:00+0100', tz='Europe/Brussels'),\n", - " Timestamp('2021-03-01 00:00:00+0100', tz='Europe/Brussels'),\n", - " Timestamp('2021-04-01 00:00:00+0200', tz='Europe/Brussels'),\n", - " Timestamp('2021-05-01 00:00:00+0200', tz='Europe/Brussels'),\n", - " Timestamp('2021-06-01 00:00:00+0200', tz='Europe/Brussels'),\n", - " Timestamp('2021-07-01 00:00:00+0200', tz='Europe/Brussels'),\n", - " Timestamp('2021-08-01 00:00:00+0200', tz='Europe/Brussels'),\n", - " Timestamp('2021-09-01 00:00:00+0200', tz='Europe/Brussels'),\n", - " Timestamp('2021-10-01 00:00:00+0200', tz='Europe/Brussels'),\n", - " Timestamp('2021-11-01 00:00:00+0100', tz='Europe/Brussels'),\n", - " Timestamp('2021-12-01 00:00:00+0100', tz='Europe/Brussels')],\n", - " 'data': [[40.328, 18099.97],\n", - " [108.824, 49700.0],\n", - " [264.38, 89099.89],\n", - " [360.802, 129500.1],\n", - " [357.702, 146099.9],\n", - " [374.439, 156200.1],\n", - " [342.98199999999997, 136900.03],\n", - " [219.634, 117499.92],\n", - " [318.481, 104400.0],\n", - " [150.203, 55999.950000000004],\n", - " [58.608, 23900.1],\n", - " [30.832, 13499.880000000001]]}}" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "result.model_dump()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/openenergyid/__init__.py b/openenergyid/__init__.py index 69fdcc8..40660c6 100644 --- a/openenergyid/__init__.py +++ b/openenergyid/__init__.py @@ -1,6 +1,6 @@ """Open Energy ID Python SDK.""" -__version__ = "0.1.7" +__version__ = "0.1.8" from .enums import Granularity from .models import TimeSeries diff --git a/openenergyid/mvlr/main.py b/openenergyid/mvlr/main.py index 9094b29..aa855e2 100644 --- a/openenergyid/mvlr/main.py +++ b/openenergyid/mvlr/main.py @@ -17,6 +17,7 @@ def find_best_mvlr( y=data.dependent_variable, granularity=granularity, allow_negative_predictions=data.allow_negative_predictions, + single_use_exog_prefixes=data.single_use_exog_prefixes, ) mvlr.do_analysis() if mvlr.validate( diff --git a/openenergyid/mvlr/models.py b/openenergyid/mvlr/models.py index f67b431..e4e80d1 100644 --- a/openenergyid/mvlr/models.py +++ b/openenergyid/mvlr/models.py @@ -67,6 +67,12 @@ class MultiVariableRegressionInput(BaseModel): validation_parameters: ValidationParameters = Field( alias="validationParameters", default=ValidationParameters() ) + single_use_exog_prefixes: Optional[List[str]] = Field( + # default=["HDD", "CDD", "FDD"], + default=None, + alias="singleUseExogPrefixes", + description="List of prefixes to be used as single-use exogenous variables.", + ) def model_post_init(self, __context: Any) -> None: """Post init hook.""" diff --git a/openenergyid/mvlr/mvlr.py b/openenergyid/mvlr/mvlr.py index 78c0ffb..8ec9ea6 100644 --- a/openenergyid/mvlr/mvlr.py +++ b/openenergyid/mvlr/mvlr.py @@ -40,6 +40,7 @@ def __init__( cross_validation: bool = False, allow_negative_predictions: bool = False, granularity: Granularity = None, + single_use_exog_prefixes: list[str] = None, ): """Parameters ---------- @@ -62,6 +63,15 @@ def __init__( If True, allow predictions to be negative. For gas consumption or PV production, this is not physical so allow_negative_predictions should be False + granularity : Granularity, default=None + Granularity of the data. Is only used for the output of the model. + If None, the granularity is not set. + single_use_exog_prefixes : list of str, default=None + List of variable prefixes that indicate a variable type that should only be used once. + For example, if the list contains "HDD", only one of the columns "HDD1", "HDD2", "HDD3" etc. + will be used as an independent variable. + Once the best fit using a variable with a given prefix is found, the other variables with the same + prefix will not be used as independent variables. """ self.data = data.copy() if y not in self.data.columns: @@ -76,6 +86,7 @@ def __init__( self.cross_validation = cross_validation self.allow_negative_predictions = allow_negative_predictions self.granularity = granularity + self.single_use_exog_prefixes = single_use_exog_prefixes self._fit = None self._list_of_fits = [] self.list_of_cverrors = [] @@ -166,6 +177,18 @@ def _do_analysis_no_cross_validation(self): else: self._list_of_fits.append(best_fit) all_model_terms_dict.pop(best_x) + + # Check if `best_x` starts with a prefix that should only be used once + # If so, remove all other variables with the same prefix from the list of candidates + if self.single_use_exog_prefixes: + for prefix in self.single_use_exog_prefixes: + if best_x.startswith(prefix): + all_model_terms_dict = { + k: v + for k, v in all_model_terms_dict.items() + if not k.startswith(prefix) + } + self._fit = self._list_of_fits[-1] def _do_analysis_cross_validation(self): @@ -237,6 +260,17 @@ def _do_analysis_cross_validation(self): # next iteration with the found exog removed all_model_terms_dict.pop(best_x) + # Check if `best_x` starts with a prefix that should only be used once + # If so, remove all other variables with the same prefix from the list of candidates + if self.single_use_exog_prefixes: + for prefix in self.single_use_exog_prefixes: + if best_x.startswith(prefix): + all_model_terms_dict = { + k: v + for k, v in all_model_terms_dict.items() + if not k.startswith(prefix) + } + self._fit = self._list_of_fits[-1] def _prune(self, fit: fm.ols, p_max: float) -> fm.ols: