{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "D4Yal6HOyyBt" }, "source": [ "# Importing Libraries & loading data" ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "id": "Sesct3fTzQVW" }, "outputs": [], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from sklearn.preprocessing import LabelEncoder, StandardScaler, OneHotEncoder\n", "import xgboost as xgb\n", "from sklearn.model_selection import train_test_split, GridSearchCV\n", "import numpy as np\n", "from sklearn.metrics import mean_squared_error\n", "from xgboost import XGBRegressor\n", "import calendar\n", "import pickle" ] }, { "cell_type": "markdown", "metadata": { "id": "h5D2aP28yyBw" }, "source": [ "# Checking the data for null values" ] }, { "cell_type": "code", "execution_count": 85, "metadata": { "id": "WGqXaM-XzQVX" }, "outputs": [], "source": [ "parent_df = pd.read_csv(\"/content/monatszahlen2412_verkehrsunfaelle_06_12_24.csv\")\n" ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "id": "zBBpsXqszQVY", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "a61d9595-6efe-4111-9192-529e54dd7fe3" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\n", "RangeIndex: 2254 entries, 0 to 2253\n", "Data columns (total 9 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 MONATSZAHL 2254 non-null object \n", " 1 AUSPRAEGUNG 2254 non-null object \n", " 2 JAHR 2254 non-null int64 \n", " 3 MONAT 2254 non-null object \n", " 4 WERT 2086 non-null float64\n", " 5 VORJAHRESWERT 2086 non-null float64\n", " 6 VERAEND_VORMONAT_PROZENT 1924 non-null float64\n", " 7 VERAEND_VORJAHRESMONAT_PROZENT 2001 non-null float64\n", " 8 ZWOELF_MONATE_MITTELWERT 1932 non-null float64\n", "dtypes: float64(5), int64(1), object(3)\n", "memory usage: 158.6+ KB\n", "None\n", "MONATSZAHL 0\n", "AUSPRAEGUNG 0\n", "JAHR 0\n", "MONAT 0\n", "WERT 168\n", "VORJAHRESWERT 168\n", "VERAEND_VORMONAT_PROZENT 330\n", "VERAEND_VORJAHRESMONAT_PROZENT 253\n", "ZWOELF_MONATE_MITTELWERT 322\n", "dtype: int64\n" ] } ], "source": [ "print(parent_df.info())\n", "print(parent_df.isna().sum())\n" ] }, { "cell_type": "markdown", "source": [ "# Only using the 5 columns since only they are deemed important in the instructions\n", "\n", "Important are the first 5 columns:\n", "Category\n", "Accident-type (insgesamt means total for all subcategories)\n", "Year\n", "Month\n", "Value\n" ], "metadata": { "id": "3beiNb3QAS_M" } }, { "cell_type": "code", "source": [ "parent_df = parent_df[['MONATSZAHL', 'AUSPRAEGUNG', 'JAHR', 'MONAT', 'WERT']]\n", "\n", "print(f\"Unqiue values of MONATSZAHL: {parent_df['MONATSZAHL'].unique()}\")\n", "print(f\"Unqiue values of AUSPRAEGUNG: {parent_df['AUSPRAEGUNG'].unique()}\")\n", "print(f\"Unqiue valus of JAHR: {parent_df['JAHR'].unique()}\")\n", "print(f\"Unqiue valus of MONAT: {parent_df['MONAT'].unique()}\")\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "xTZE4w5qASTn", "outputId": "60696fe6-ee69-4ca6-b947-5d491b91a1b7" }, "execution_count": 87, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Unqiue values of MONATSZAHL: ['Alkoholunfälle' 'Fluchtunfälle' 'Verkehrsunfälle']\n", "Unqiue values of AUSPRAEGUNG: ['insgesamt' 'Verletzte und Getötete' 'mit Personenschäden']\n", "Unqiue valus of JAHR: [2024 2023 2022 2021 2020 2019 2018 2017 2016 2015 2014 2013 2012 2011\n", " 2010 2009 2008 2007 2006 2005 2004 2003 2002 2001 2000]\n", "Unqiue valus of MONAT: ['202401' '202402' '202403' '202404' '202405' '202406' '202407' '202408'\n", " '202409' '202410' '202411' '202412' '202301' '202302' '202303' '202304'\n", " '202305' '202306' '202307' '202308' '202309' '202310' '202311' '202312'\n", " 'Summe' '202201' '202202' '202203' '202204' '202205' '202206' '202207'\n", " '202208' '202209' '202210' '202211' '202212' '202101' '202102' '202103'\n", " '202104' '202105' '202106' '202107' '202108' '202109' '202110' '202111'\n", " '202112' '202001' '202002' '202003' '202004' '202005' '202006' '202007'\n", " '202008' '202009' '202010' '202011' '202012' '201901' '201902' '201903'\n", " '201904' '201905' '201906' '201907' '201908' '201909' '201910' '201911'\n", " '201912' '201801' '201802' '201803' '201804' '201805' '201806' '201807'\n", " '201808' '201809' '201810' '201811' '201812' '201701' '201702' '201703'\n", " '201704' '201705' '201706' '201707' '201708' '201709' '201710' '201711'\n", " '201712' '201601' '201602' '201603' '201604' '201605' '201606' '201607'\n", " '201608' '201609' '201610' '201611' '201612' '201501' '201502' '201503'\n", " '201504' '201505' '201506' '201507' '201508' '201509' '201510' '201511'\n", " '201512' '201401' '201402' '201403' '201404' '201405' '201406' '201407'\n", " '201408' '201409' '201410' '201411' '201412' '201301' '201302' '201303'\n", " '201304' '201305' '201306' '201307' '201308' '201309' '201310' '201311'\n", " '201312' '201201' '201202' '201203' '201204' '201205' '201206' '201207'\n", " '201208' '201209' '201210' '201211' '201212' '201101' '201102' '201103'\n", " '201104' '201105' '201106' '201107' '201108' '201109' '201110' '201111'\n", " '201112' '201001' '201002' '201003' '201004' '201005' '201006' '201007'\n", " '201008' '201009' '201010' '201011' '201012' '200901' '200902' '200903'\n", " '200904' '200905' '200906' '200907' '200908' '200909' '200910' '200911'\n", " '200912' '200801' '200802' '200803' '200804' '200805' '200806' '200807'\n", " '200808' '200809' '200810' '200811' '200812' '200701' '200702' '200703'\n", " '200704' '200705' '200706' '200707' '200708' '200709' '200710' '200711'\n", " '200712' '200601' '200602' '200603' '200604' '200605' '200606' '200607'\n", " '200608' '200609' '200610' '200611' '200612' '200501' '200502' '200503'\n", " '200504' '200505' '200506' '200507' '200508' '200509' '200510' '200511'\n", " '200512' '200401' '200402' '200403' '200404' '200405' '200406' '200407'\n", " '200408' '200409' '200410' '200411' '200412' '200301' '200302' '200303'\n", " '200304' '200305' '200306' '200307' '200308' '200309' '200310' '200311'\n", " '200312' '200201' '200202' '200203' '200204' '200205' '200206' '200207'\n", " '200208' '200209' '200210' '200211' '200212' '200101' '200102' '200103'\n", " '200104' '200105' '200106' '200107' '200108' '200109' '200110' '200111'\n", " '200112' '200001' '200002' '200003' '200004' '200005' '200006' '200007'\n", " '200008' '200009' '200010' '200011' '200012']\n" ] } ] }, { "cell_type": "markdown", "source": [ "# Dropping the rows where the year value is after 2020" ], "metadata": { "id": "-6-k9bkqAeCn" } }, { "cell_type": "code", "execution_count": 88, "metadata": { "id": "r5SG6rjMzQVY", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "9a45ba3d-234c-49ca-e722-bb97db5348d3" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Unqiue values of JAHR: [2019 2018 2017 2016 2015 2014 2013 2012 2011 2010 2009 2008 2007 2006\n", " 2005 2004 2003 2002 2001 2000]\n" ] } ], "source": [ "parent_df = parent_df[parent_df['JAHR']<2020]\n", "\n", "print(f\"Unqiue values of JAHR: {parent_df['JAHR'].unique()}\")" ] }, { "cell_type": "code", "source": [ "parent_df.head(2)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 112 }, "id": "jWNecV_uAkkq", "outputId": "501a5e7a-6f21-4fc2-8137-d562e0b6bd5d" }, "execution_count": 89, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " MONATSZAHL AUSPRAEGUNG JAHR MONAT WERT\n", "63 Alkoholunfälle insgesamt 2019 Summe 434.0\n", "64 Alkoholunfälle insgesamt 2019 201901 22.0" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
MONATSZAHLAUSPRAEGUNGJAHRMONATWERT
63Alkoholunfälleinsgesamt2019Summe434.0
64Alkoholunfälleinsgesamt201920190122.0
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "parent_df", "summary": "{\n \"name\": \"parent_df\",\n \"rows\": 1813,\n \"fields\": [\n {\n \"column\": \"MONATSZAHL\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"Alkoholunf\\u00e4lle\",\n \"Fluchtunf\\u00e4lle\",\n \"Verkehrsunf\\u00e4lle\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"AUSPRAEGUNG\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"insgesamt\",\n \"Verletzte und Get\\u00f6tete\",\n \"mit Personensch\\u00e4den\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"JAHR\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 5,\n \"min\": 2000,\n \"max\": 2019,\n \"num_unique_values\": 20,\n \"samples\": [\n 2019,\n 2002,\n 2004\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"MONAT\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 241,\n \"samples\": [\n \"201812\",\n \"201906\",\n \"200106\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"WERT\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 4565.788307713133,\n \"min\": 0.0,\n \"max\": 46988.0,\n \"num_unique_values\": 903,\n \"samples\": [\n 74.0,\n 4074.0,\n 951.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 89 } ] }, { "cell_type": "code", "source": [ "parent_df.reset_index(drop=True, inplace=True)\n", "\n", "parent_df" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 424 }, "id": "vYRSRdsCAmRY", "outputId": "7810682a-213e-4df6-e32a-15a3fecc1b67" }, "execution_count": 90, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " MONATSZAHL AUSPRAEGUNG JAHR MONAT WERT\n", "0 Alkoholunfälle insgesamt 2019 Summe 434.0\n", "1 Alkoholunfälle insgesamt 2019 201901 22.0\n", "2 Alkoholunfälle insgesamt 2019 201902 28.0\n", "3 Alkoholunfälle insgesamt 2019 201903 34.0\n", "4 Alkoholunfälle insgesamt 2019 201904 36.0\n", "... ... ... ... ... ...\n", "1808 Verkehrsunfälle Verletzte und Getötete 2000 200008 647.0\n", "1809 Verkehrsunfälle Verletzte und Getötete 2000 200009 675.0\n", "1810 Verkehrsunfälle Verletzte und Getötete 2000 200010 615.0\n", "1811 Verkehrsunfälle Verletzte und Getötete 2000 200011 578.0\n", "1812 Verkehrsunfälle Verletzte und Getötete 2000 200012 515.0\n", "\n", "[1813 rows x 5 columns]" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
MONATSZAHLAUSPRAEGUNGJAHRMONATWERT
0Alkoholunfälleinsgesamt2019Summe434.0
1Alkoholunfälleinsgesamt201920190122.0
2Alkoholunfälleinsgesamt201920190228.0
3Alkoholunfälleinsgesamt201920190334.0
4Alkoholunfälleinsgesamt201920190436.0
..................
1808VerkehrsunfälleVerletzte und Getötete2000200008647.0
1809VerkehrsunfälleVerletzte und Getötete2000200009675.0
1810VerkehrsunfälleVerletzte und Getötete2000200010615.0
1811VerkehrsunfälleVerletzte und Getötete2000200011578.0
1812VerkehrsunfälleVerletzte und Getötete2000200012515.0
\n", "

1813 rows × 5 columns

\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", " \n", " \n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "parent_df", "summary": "{\n \"name\": \"parent_df\",\n \"rows\": 1813,\n \"fields\": [\n {\n \"column\": \"MONATSZAHL\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"Alkoholunf\\u00e4lle\",\n \"Fluchtunf\\u00e4lle\",\n \"Verkehrsunf\\u00e4lle\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"AUSPRAEGUNG\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"insgesamt\",\n \"Verletzte und Get\\u00f6tete\",\n \"mit Personensch\\u00e4den\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"JAHR\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 5,\n \"min\": 2000,\n \"max\": 2019,\n \"num_unique_values\": 20,\n \"samples\": [\n 2019,\n 2002,\n 2004\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"MONAT\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 241,\n \"samples\": [\n \"201812\",\n \"201906\",\n \"200106\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"WERT\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 4565.788307713133,\n \"min\": 0.0,\n \"max\": 46988.0,\n \"num_unique_values\": 903,\n \"samples\": [\n 74.0,\n 4074.0,\n 951.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 90 } ] }, { "cell_type": "markdown", "metadata": { "id": "mixK8LmRyyBx" }, "source": [ "# Since its a regression task, it always helps to remove outliers from the dataset. it will just exclude values that dont lie near the rest of the data points, making the distribution even more better" ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "id": "jJVSlcgGzQVZ" }, "outputs": [], "source": [ "columns = parent_df.select_dtypes(include=[np.number]).columns\n", "\n", "df = parent_df.copy()\n", "\n", "for col in columns:\n", " z_scores = np.abs((df[col] - df[col].mean()) / df[col].std())\n", " df = df[z_scores < 3]" ] }, { "cell_type": "code", "execution_count": 92, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "hYPXBmXfzQVa", "outputId": "7686e12f-d8eb-48c2-91ae-2060e2d0bef0" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array(['Summe', '201901', '201902', '201903', '201904', '201905',\n", " '201906', '201907', '201908', '201909', '201910', '201911',\n", " '201912', '201801', '201802', '201803', '201804', '201805',\n", " '201806', '201807', '201808', '201809', '201810', '201811',\n", " '201812', '201701', '201702', '201703', '201704', '201705',\n", " '201706', '201707', '201708', '201709', '201710', '201711',\n", " '201712', '201601', '201602', '201603', '201604', '201605',\n", " '201606', '201607', '201608', '201609', '201610', '201611',\n", " '201612', '201501', '201502', '201503', '201504', '201505',\n", " '201506', '201507', '201508', '201509', '201510', '201511',\n", " '201512', '201401', '201402', '201403', '201404', '201405',\n", " '201406', '201407', '201408', '201409', '201410', '201411',\n", " '201412', '201301', '201302', '201303', '201304', '201305',\n", " '201306', '201307', '201308', '201309', '201310', '201311',\n", " '201312', '201201', '201202', '201203', '201204', '201205',\n", " '201206', '201207', '201208', '201209', '201210', '201211',\n", " '201212', '201101', '201102', '201103', '201104', '201105',\n", " '201106', '201107', '201108', '201109', '201110', '201111',\n", " '201112', '201001', '201002', '201003', '201004', '201005',\n", " '201006', '201007', '201008', '201009', '201010', '201011',\n", " '201012', '200901', '200902', '200903', '200904', '200905',\n", " '200906', '200907', '200908', '200909', '200910', '200911',\n", " '200912', '200801', '200802', '200803', '200804', '200805',\n", " '200806', '200807', '200808', '200809', '200810', '200811',\n", " '200812', '200701', '200702', '200703', '200704', '200705',\n", " '200706', '200707', '200708', '200709', '200710', '200711',\n", " '200712', '200601', '200602', '200603', '200604', '200605',\n", " '200606', '200607', '200608', '200609', '200610', '200611',\n", " '200612', '200501', '200502', '200503', '200504', '200505',\n", " '200506', '200507', '200508', '200509', '200510', '200511',\n", " '200512', '200401', '200402', '200403', '200404', '200405',\n", " '200406', '200407', '200408', '200409', '200410', '200411',\n", " '200412', '200301', '200302', '200303', '200304', '200305',\n", " '200306', '200307', '200308', '200309', '200310', '200311',\n", " '200312', '200201', '200202', '200203', '200204', '200205',\n", " '200206', '200207', '200208', '200209', '200210', '200211',\n", " '200212', '200101', '200102', '200103', '200104', '200105',\n", " '200106', '200107', '200108', '200109', '200110', '200111',\n", " '200112', '200001', '200002', '200003', '200004', '200005',\n", " '200006', '200007', '200008', '200009', '200010', '200011',\n", " '200012'], dtype=object)" ] }, "metadata": {}, "execution_count": 92 } ], "source": [ "df['MONAT'].unique()" ] }, { "cell_type": "markdown", "source": [ "# Observing how values i.e 'WERT' is distributed based on different columns" ], "metadata": { "id": "nN0BPCJfDrz-" } }, { "cell_type": "code", "source": [ "df['MONATSZAHL'].hist(bins=30, alpha=0.7)\n", "plt.title('distribution of accident categories')\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 452 }, "id": "myFIxEpkDtT5", "outputId": "aa5259a4-20b1-48b4-d9a0-75b26c930d45" }, "execution_count": 93, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkcAAAGzCAYAAAAlqLNlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABIv0lEQVR4nO3de1wVdeL/8TcgHAQ9IIYgqWh2UVLzVkpq3hBUbNNYS9cUy7R11VK+2a67pYCtllvZDS+1BGa6lV2s1BQ0M1O8Z5mamVlWCnhDVBQOML8/+jE7R0C5HNLW1/Px4PFgPvOZz3xmznzOeTOXg5thGIYAAAAgSXK/3B0AAAC4khCOAAAALAhHAAAAFoQjAAAAC8IRAACABeEIAADAgnAEAABgQTgCAACwIBwBAABYEI5w2cTHx8vNzc2prGnTpho5cmSNr/uHH36Qm5ubUlNTzbKRI0eqTp06Nb7uEm5uboqPj//N1lcVW7du1e233y5fX1+5ublp586dl7tLpooeK6mpqXJzc9MPP/xQ431CxfTo0UM9evS43N0AykU4wu/eihUrrtiQcSX37VIcDocGDx6sEydOaPbs2Vq4cKFCQ0Mvd7euSHl5eYqPj9enn356Va0b+F9V63J3ALDat2+f3N0rl9lXrFihpKSkSoWQ0NBQnTt3Tp6enpXsYeVcrG/nzp1TrVpX7hA8cOCAfvzxR7366qt68MEHL3d3SqnKsVJT8vLylJCQIEm/+RmRy7nuqkpLS7vcXQAu6sp9Z8ZVyWaz1Wj7hYWFKi4ulpeXl7y9vWt0XZdyudd/KdnZ2ZIkf3//y9uRctT0sQLXy8vLk4+Pj7y8vC53V4CLujL+7ML/vM8//1y33nqrvL291bx5c82fP7/MehfeR+JwOJSQkKAbbrhB3t7eql+/vrp27ar09HRJv94nlJSUJOnXe3hKfqT/3lf0zDPP6Pnnn1fz5s1ls9m0Z8+eMu85KvH9998rKipKvr6+CgkJUWJiogzDMOd/+umncnNzK3UZ48I2L9a3krILzyh98cUX6tevn+x2u+rUqaPevXtr06ZNTnVK7qHZsGGD4uLiFBgYKF9fXw0aNEhHjx4t+wW4wCeffKJu3brJ19dX/v7+uuuuu7R3715z/siRI9W9e3dJ0uDBg+Xm5nbRsxInTpzQo48+qtatW6tOnTqy2+3q16+fvvzyy1J1z58/r/j4eN14443y9vZWw4YNdffdd+vAgQNmneLiYr3wwgtq3bq1vL29FRgYqL59+2rbtm1mnbLuOdq9e7d69eql2rVrq1GjRnryySdVXFxcZp8//vhjcx/UrVtX0dHR2r17t1OdkvvQfvnlFw0cOFB16tRRYGCgHn30URUVFUn69XUPDAyUJCUkJJiv86XOZObk5GjSpElq2rSpbDabGjVqpBEjRujYsWOSpIKCAk2dOlUdOnSQn5+ffH191a1bN61du9ZsoyLr/uabb/THP/5RAQEB8vb2VseOHfXhhx+W6s9XX32l7t27O+27lJSUMu/XmjNnjm6++WbZbDaFhIRo3LhxysnJcarTo0cPtWrVStu3b9cdd9whHx8f/f3vfzfnXXg85efna9q0abr++utls9nUuHFjPfbYY8rPz3eql56erq5du8rf31916tTRTTfdZLYLuApnjlDjdu3apcjISAUGBio+Pl6FhYWaNm2agoKCLrlsfHy8Zs6cqQcffFC33XabcnNztW3bNu3YsUN9+vTRQw89pMOHDys9PV0LFy4ss42UlBSdP39eY8aMkc1mU0BAQLkfmEVFRerbt686d+6sWbNmaeXKlZo2bZoKCwuVmJhYqe2uSN+sdu/erW7duslut+uxxx6Tp6en5s+frx49emjdunXq1KmTU/0JEyaoXr16mjZtmn744Qc9//zzGj9+vN56662Lrmf16tXq16+frrvuOsXHx+vcuXN66aWX1KVLF+3YsUNNmzbVQw89pGuvvVYzZszQww8/rFtvvfWir9f333+vpUuXavDgwWrWrJmysrI0f/58de/eXXv27FFISIikX/fvgAEDtGbNGg0ZMkSPPPKITp8+rfT0dH399ddq3ry5JGnUqFFKTU1Vv3799OCDD6qwsFDr16/Xpk2b1LFjxzL7kJmZqZ49e6qwsFB/+9vf5Ovrq1deeUW1a9cuVXfhwoWKjY1VVFSUnn76aeXl5Wnu3Lnq2rWrvvjiCzVt2tSsW1RUpKioKHXq1EnPPPOMVq9erWeffVbNmzfX2LFjFRgYqLlz52rs2LEaNGiQ7r77bklSmzZtyt1fZ86cUbdu3bR371498MADat++vY4dO6YPP/xQP//8s6655hrl5ubq3//+t4YOHarRo0fr9OnTSk5OVlRUlLZs2aK2bdtect27d+9Wly5ddO2115r75O2339bAgQP17rvvatCgQZKkX375RT179pSbm5umTJkiX19f/fvf/y7z7Fx8fLwSEhIUERGhsWPHat++fZo7d662bt2qDRs2OF2qPn78uPr166chQ4bovvvuK/cYKi4u1h/+8Ad9/vnnGjNmjFq2bKldu3Zp9uzZ+vbbb7V06VJzewYMGKA2bdooMTFRNptN3333nTZs2FDuvgaqxABq2MCBAw1vb2/jxx9/NMv27NljeHh4GBcegqGhoUZsbKw5fcsttxjR0dEXbX/cuHGl2jEMwzh48KAhybDb7UZ2dnaZ81JSUsyy2NhYQ5IxYcIEs6y4uNiIjo42vLy8jKNHjxqGYRhr1641JBlr1669ZJvl9c0wDEOSMW3aNHN64MCBhpeXl3HgwAGz7PDhw0bdunWNO+64wyxLSUkxJBkRERFGcXGxWT5p0iTDw8PDyMnJKXN9Jdq2bWs0aNDAOH78uFn25ZdfGu7u7saIESPMspLtXLJkyUXbMwzDOH/+vFFUVORUdvDgQcNmsxmJiYlm2WuvvWZIMp577rlSbZRsyyeffGJIMh5++OFy6xhG6WNl4sSJhiRj8+bNZll2drbh5+dnSDIOHjxoGIZhnD592vD39zdGjx7t1HZmZqbh5+fnVF5yTFi3wTAMo127dkaHDh3M6aNHj5Z6PS9m6tSphiTjvffeK3cbCwsLjfz8fKd5J0+eNIKCgowHHnigQuvu3bu30bp1a+P8+fNO7d9+++3GDTfcYJZNmDDBcHNzM7744guz7Pjx40ZAQIDTvsvOzja8vLyMyMhIp9f75ZdfNiQZr732mlnWvXt3Q5Ixb968Uv3q3r270b17d3N64cKFhru7u7F+/XqnevPmzTMkGRs2bDAMwzBmz55tSDLHIlBTuKyGGlVUVKRVq1Zp4MCBatKkiVnesmVLRUVFXXJ5f39/7d69W/v3769yH2JiYsxLDxUxfvx483c3NzeNHz9eBQUFWr16dZX7cClFRUVKS0vTwIEDdd1115nlDRs21J/+9Cd9/vnnys3NdVpmzJgxTpfpunXrpqKiIv3444/lrufIkSPauXOnRo4cqYCAALO8TZs26tOnj1asWFGl/ttsNvPm6KKiIh0/fty85LFjxw6z3rvvvqtrrrlGEyZMKNVGyba8++67cnNz07Rp08qtU5YVK1aoc+fOuu2228yywMBADRs2zKleenq6cnJyNHToUB07dsz88fDwUKdOnZwuW5X485//7DTdrVs3ff/99+X25VLeffdd3XLLLeaZG6uSbfTw8DDvzSkuLtaJEydUWFiojh07Ou3T8pw4cUKffPKJ7rnnHp0+fdrczuPHjysqKkr79+/XL7/8IklauXKlwsPD1bZtW3P5gICAUvtu9erVKigo0MSJE51uhh89erTsdruWL1/uVN9ms+n++++/ZF+XLFmili1bqkWLFk6vSa9evSTJfE1K7n/74IMPyj37C7gC4Qg16ujRozp37pxuuOGGUvNuuummSy6fmJionJwc3XjjjWrdurUmT56sr776qlJ9aNasWYXruru7O4UTSbrxxhslqUa/J+fo0aPKy8src5+0bNlSxcXF+umnn5zKrWFTkurVqydJOnnyZLnrKQlO5a3n2LFjOnv2bKX7X1xcrNmzZ+uGG26QzWbTNddco8DAQH311Vc6deqUWe/AgQO66aabLvqU3oEDBxQSEuIU3irixx9/rNBxVhK0e/XqpcDAQKeftLQ080b0EiX3PFnVq1fvovv5Ug4cOKBWrVpdst6CBQvUpk0b8367wMBALV++3Gmflue7776TYRh64oknSm1nSfAs2dYff/xR119/fak2Liwr7/jx8vLSddddVyqYX3vttRW6+Xr//v3avXt3qX6WjL2Sft57773q0qWLHnzwQQUFBWnIkCF6++23CUpwOe45whXtjjvu0IEDB/TBBx8oLS1N//73vzV79mzNmzevwo+Xl3XPSXWUd/ai5Abd34qHh0eZ5Ybl5vHfyowZM/TEE0/ogQce0PTp0xUQECB3d3dNnDjxivvgKunPwoULFRwcXGr+hcGtvP1c09544w2NHDlSAwcO1OTJk9WgQQN5eHho5syZTjevl6dkOx999NFyz9KWFYhcqaJjr7i4WK1bt9Zzzz1X5vzGjRub7X322Wdau3atli9frpUrV+qtt95Sr169lJaWdtleK/zvIRyhRgUGBqp27dplXhbbt29fhdoICAjQ/fffr/vvv19nzpzRHXfcofj4eDMcXexSS2UVFxfr+++/N/9ilaRvv/1WksybdEvO0Fz4dE5Zl7Mq2rfAwED5+PiUuU+++eYbubu7mx8Q1VHyJY7lreeaa66Rr69vpdt955131LNnTyUnJzuV5+Tk6JprrjGnmzdvrs2bN8vhcJT7HVPNmzfXqlWrdOLEiUqdPQoNDa3QcVZy03eDBg0UERFR4fYvprLHYPPmzfX1119ftM4777yj6667Tu+9955T+xdebixv3SVnQD09PS+5naGhofruu+9KlV9YZj1+rGdYCwoKdPDgwSrvz+bNm+vLL79U7969L7kv3d3d1bt3b/Xu3VvPPfecZsyYoX/84x9au3aty15PgMtqqFEeHh6KiorS0qVLdejQIbN87969WrVq1SWXP378uNN0nTp1dP311zs93lvyYX5hWKmql19+2fzdMAy9/PLL8vT0VO/evSX9+gHh4eGhzz77zGm5OXPmlGqron3z8PBQZGSkPvjgA6fLd1lZWVq8eLG6du0qu91exS36r4YNG6pt27ZasGCBU5++/vprpaWlqX///lVq18PDo9QZqyVLlpj3tJSIiYnRsWPHnPZxiZLlY2JiZBiG+cWGZdUpS//+/bVp0yZt2bLFLDt69KgWLVrkVC8qKkp2u10zZsyQw+Eo1U5Fvw7BysfHR1LFj8GYmBh9+eWXev/990vNK9nGkrMg1m3evHmzMjIyKrTuBg0aqEePHpo/f76OHDlSaj3W7YyKilJGRobTv4c5ceJEqX0XEREhLy8vvfjii079Sk5O1qlTpxQdHX2xzS7XPffco19++UWvvvpqqXnnzp0zL/WeOHGi1PyS+6QufOQfqA7OHKHGJSQkaOXKlerWrZv+8pe/qLCwUC+99JJuvvnmS94/FBYWph49eqhDhw4KCAjQtm3b9M477zjdNN2hQwdJ0sMPP6yoqCh5eHhoyJAhVeqrt7e3Vq5cqdjYWHXq1Ekff/yxli9frr///e/mfSd+fn4aPHiwXnrpJbm5ual58+ZatmxZqXtVKtu3J5980vwOl7/85S+qVauW5s+fr/z8fM2aNatK21OWf/3rX+rXr5/Cw8M1atQo81F+Pz+/Kv+rkwEDBigxMVH333+/br/9du3atUuLFi0qdf/WiBEj9PrrrysuLk5btmxRt27ddPbsWa1evVp/+ctfdNddd6lnz54aPny4XnzxRe3fv199+/ZVcXGx1q9fr549ezq99laPPfaYFi5cqL59++qRRx4xH+UPDQ11Os7sdrvmzp2r4cOHq3379hoyZIgCAwN16NAhLV++XF26dCkzvF1M7dq1FRYWprfeeks33nijAgIC1KpVq3LvK5o8ebLeeecdDR48WA888IA6dOigEydO6MMPP9S8efN0yy23aMCAAXrvvfc0aNAgRUdH6+DBg5o3b57CwsJ05syZCq07KSlJXbt2VevWrTV69Ghdd911ysrKUkZGhn7++Wfze6gee+wxvfHGG+rTp48mTJhgPsrfpEkTnThxwjybExgYqClTpighIUF9+/bVH/7wB+3bt09z5szRrbfeqvvuu69S+63E8OHD9fbbb+vPf/6z1q5dqy5duqioqEjffPON3n77ba1atUodO3ZUYmKiPvvsM0VHRys0NFTZ2dmaM2eOGjVqpK5du1Zp3UCZLtdjcri6rFu3zujQoYPh5eVlXHfddca8efOMadOmXfJR/ieffNK47bbbDH9/f6N27dpGixYtjH/+859GQUGBWaewsNCYMGGCERgYaLi5uZltljxa/69//atUf8p7lN/X19c4cOCAERkZafj4+BhBQUHGtGnTSj2mfvToUSMmJsbw8fEx6tWrZzz00EPG119/XarN8vpmGKUf5TcMw9ixY4cRFRVl1KlTx/Dx8TF69uxpbNy40alOyaP8W7dudSov7ysGyrJ69WqjS5cuRu3atQ273W7ceeedxp49e8psr6KP8v/f//2f0bBhQ6N27dpGly5djIyMjFKPbBuGYeTl5Rn/+Mc/jGbNmhmenp5GcHCw8cc//tHpKwwKCwuNf/3rX0aLFi0MLy8vIzAw0OjXr5+xfft2s86Fx4phGMZXX31ldO/e3fD29jauvfZaY/r06UZycrLT4+jW7YuKijL8/PwMb29vo3nz5sbIkSONbdu2mXVKjokLlXXsbty40TzGy3ptL3T8+HFj/PjxxrXXXmt4eXkZjRo1MmJjY41jx44ZhvHrI/czZswwQkNDDZvNZrRr185YtmyZERsba4SGhlZ43QcOHDBGjBhhBAcHG56ensa1115rDBgwwHjnnXec2vjiiy+Mbt26GTabzWjUqJExc+ZM48UXXzQkGZmZmU51X375ZaNFixaGp6enERQUZIwdO9Y4efKkU53u3bsbN998c5nbXtZxUVBQYDz99NPGzTffbNhsNqNevXpGhw4djISEBOPUqVOGYRjGmjVrjLvuussICQkxvLy8jJCQEGPo0KHGt99+e9F9DVSWm2Fchrs3AQBXvIkTJ2r+/Pk6c+YMNzvjqsI9RwAAnTt3zmn6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bTAGgcvvah+HbsaV/jwdAADAb4j/rQYAAGBBOAIAALAgHAEAAFgQjgAAACwuSzj69NNP5ebmppycHElSampqtb7U8cL2qsrNzU1Lly6tVhtliY+PV1BQkFP7bdu2VXx8vH744Qe5ublp586d5falvDqAq/To0UMTJ050WXvx8fFq27aty9qrLMMwNGbMGAUEBDiNHX9/f6Wmppb5nnHhOHPV+wpQVa5476+pzzVXyMvLU0xMjOx2uznWcnJy5Obmpk8//bTMbODq/FCeGn2UPyMjQ127dlXfvn21fPnymlzVFWvv3r1KSEjQ+++/r86dO6tevXqSpDVr1shms6l27do6cuSIrrnmmsvcU/yvGzlypBYsWFCqfP/+/ZehN78GsrZt2+r55593edsrV640Q9B1111njq9vv/1WdevWlYeHh44cOfK7+KZeXPnuvPNOORwOrVy5stS89evX64477tCXX36pNm3aXIbeXbkWLFig9evXa+PGjbrmmmvM8XjkyBEFBASoU6dO6t+//2XpW42Go+TkZE2YMEHJyck6fPjwFf+/VGrCgQMHJEl33XWX0/+Bq1+/vvl7Wf8yBagJffv2VUpKilNZYGDgZepNzTlw4IAaNmyo22+/3am8QYMG5u+MO7jKqFGjFBMTo59//lmNGjVympeSkqKOHTtWOhgVFBS4sosVZhiGioqKVKtWzX8N4oEDB9SyZUu1atXKqdw6NmvXrl3j/ShLjV1WO3PmjN566y2NHTtW0dHRSk1NrfCyR48eVceOHTVo0CDl5+crPz9fDz/8sBo0aCBvb2917dpVW7duLbXc9u3b1bFjR/n4+Oj222/Xvn37nObPnTtXzZs3l5eXl2666SYtXLiw3D6UdUp9586dcnNz0w8//CDpv6fzVq1apZYtW6pOnTrq27evjhw5IunXSwt33nmnJMnd3d0MRxs3blRERITq168vPz8/9ejRQzt27Kjw/pGkr7/+Wv369VOdOnUUFBSk4cOH69ixY5VqA1cfm82m4OBgpx8PD49S9co6FV9ySarEzz//rKFDhyogIEC+vr7q2LGjNm/e7LTMwoUL1bRpU/n5+WnIkCE6ffq0pF/PYq1bt04vvPCC3NzczHFV1inypUuXOv1hUXLJ7mJtT5gwQYcOHZKbm5uaNm0qSfroo4/UpUsX+fv7q379+howYID5x0tFff755+rWrZtq166txo0b6+GHH9bZs2cr1Qb+9wwYMECBgYGlPufOnDmjJUuWaNSoUZc8dpo2barp06drxIgRstvtGjNmTKn1FBUV6YEHHlCLFi106NAhSdIHH3yg9u3by9vbW9ddd50SEhJUWFjotNyxY8c0aNAg+fj46IYbbtCHH35oziv5rPv444/VoUMH2Ww2ff755/ryyy/Vs2dP1a1bV3a7XR06dNC2bdsklX3Z/PnnnzfHmvTrOBw4cKCeeeYZNWzYUPXr19e4cePkcDgk/Xrm+Nlnn9Vnn30mNzc39ejRQ9KvYbJDhw6qU6eOgoODNWzYMGVnZ1fq9ajIPrmUGgtHb7/9tlq0aKGbbrpJ9913n1577TVV5Psmf/rpJ3Xr1k2tWrXSO++8I5vNpscee0zvvvuuFixYoB07duj6669XVFSUTpw44bTsP/7xDz377LPatm2batWqpQceeMCc9/777+uRRx7R//3f/+nrr7/WQw89pPvvv19r166t1nbm5eXpmWee0cKFC/XZZ5/p0KFDevTRRyVJjz76qPlX+pEjR8zQdObMGT3wwAPauHGjMjIydP3116t///7mm/ul5OTkqFevXmrXrp22bdumlStXKisrS/fcc0+1tgWoqDNnzqh79+765Zdf9OGHH+rLL7/UY489puLiYrPOgQMHtHTpUi1btkzLli3TunXr9NRTT0mSXnjhBYWHh2v06NHm2GjcuHGF13+pthMTE9WoUSMdOXLE/EMqLy9PkydP1rZt27R69Wq5u7tr0KBBTn2+1Dr79u2rmJgYffXVV3rrrbf0+eefa/z48RXuN/431apVSyNGjFBqaqrT59ySJUtUVFSk8PDwCh07zzzzjG655RZ98cUXeuKJJ5zm5efna/Dgwdq5c6fWr1+vJk2aaP369RoxYoQeeeQR7dmzR/Pnz1dqaqr++c9/Oi2bkJCge+65R1999ZX69++vYcOGlfr8/Nvf/qannnpKe/fuVZs2bTRs2DA1atRIW7du1fbt2/W3v/1Nnp6eldova9eu1YEDB7R27VotWLBAqampZoB87733NHr0aIWHh+vIkSN67733JEkOh0MzZszQV199pffff18HDx7UyJEjK7zOiu6TSzJqyO233248//zzhmEYhsPhMK655hpj7dq1hmEYxtq1aw1JxsmTJw3DMIyUlBTDz8/P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p07y8fHR3//+dx04cECLFy+u1JOu5alXr57q16+vV155Rd99950++eQTxcXFVaqNv/71r9q4caPGjx+vnTt3av/+/frggw+4IRumOnXq6N5779WUKVN05MgR80ZiVxw7EyZM0JNPPqkBAwaYwX7q1Kl6/fXXlZCQoN27d2vv3r1688039fjjj1drO86dO6fx48fr008/1Y8//qgNGzZo69atatmypaRfnzQ7evSoZs2apQMHDigpKUkff/xxtdYp/XoWzcvLSy+99JK+//57ffjhh5o+fXql2nDVPnF5OEpOTlZERESZX64WExOjbdu26auvvip3+Vq1auk///mPbr75ZvXq1UvZ2dl66qmnFBMTo+HDh6t9+/b67rvvtGrVKvOMTkUMHDhQL7zwgp555hndfPPNmj9/vlJSUszHBy/k6emp//znP/rmm2/Upk0bPf3003ryyScrvL6LSU5O1smTJ9W+fXsNHz7c/JqCigoJCdGGDRtUVFSkyMhItW7dWhMnTpS/v795ORCojmeffVaNGzdWt27d9Kc//UmPPvqofHx8zPleXl5KS0tTgwYN1L9/f7Vu3VpPPfVUmV8LUJ5HH31UHh4eCgsLM0+fBwQE6I033tCKFSvUunVr/ec//1F8fHy1t8fd3V1vvvmmtm/frlatWmnSpEn617/+Vak22rRpo3Xr1unbb79Vt27d1K5dO02dOvWq/P42lG/UqFE6efKkoqKizGPDVcfOxIkTlZCQoP79+2vjxo2KiorSsmXLlJaWpltvvVWdO3fW7NmzzassVeXh4aHjx49rxIgRuvHGG3XPPfeoX79+SkhIkPTrlZg5c+YoKSlJt9xyi7Zs2VLuiYbKKPk6hCVLligsLExPPfWUnnnmmUq14ap94mZc6gYZAACAqwinGQAAACwIRwAAABaEIwAAAAvCEQAAgAXhCAAAwIJwBAAAYEE4AgAAsCAcAQAAWBCOAAAALAhHAAAAFoQjAAAAi/8HSbWohTE9QT4AAAAASUVORK5CYII=\n" }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "df['AUSPRAEGUNG'].hist(bins=30, alpha=0.7)\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 430 }, "id": "qI8yKHJgDw6p", "outputId": "c364e179-1c6e-49fe-cb1c-3a7e4addc341" }, "execution_count": 94, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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s3v3bjNs2DDTuXNnU1lZacrKysycOXOMw+Ewhw8fNocPHzbHjh376X4BsMXEiRNN+/btPV7UX3jhBdOsWTNTXFxs9u3bZ4KDg83s2bPNnj17zIcffmi6d+9uRo4caZWvOpE9+eSTZt++fWbfvn3VAtd3331nWrVqZbKyssyuXbvM1q1bTWJiorn++uuNMcYUFxcbp9NpRo0aZR1fFRUVpri42Fo+fPiwGTdunImIiDCHDx823377rWndurWZNm2atd0Yc159PtP5Bi6Hw2GmTJli9uzZY1588UXj4+NjcnNzjTE/nBSvuOIKM3DgQLNt2zazevVq07179x8NXN98843x8fExM2bMOK/fV0JCgrnpppvMpk2bzJ49e8x//dd/mZYtW5pvv/3WnDhxwvzXf/2Xufzyy62fx4kTJ8ypU6dMt27dTL9+/czmzZvN+vXrTc+ePa2xna1eXfd3rno4t/79+5vmzZub6dOnmz179pjp06ebJk2amMGDB5vnnnvOOme3bNnSHD9+3BjjGbhqc76uKXDNmjXLSDIlJSXm5ZdfNtHR0eb11183n3/+uXn99ddNeHi4WbhwoTHmP4Grbdu2VplDhw6ZIUOGmMTERPPJJ5+Y/fv3m3feecesXr3aGGPMV199ZYKCgsy9995rdu3aZd58801zySWXeASqc803Y859nD3yyCMmJCTE3HrrrWb79u1mzZo1Jioqyvz5z382xhhz6NAh07RpUzNr1ixz4MAB88knn5js7GzrZ/XMM8+YwMBAM2fOHLN7926zceNGM3v2bGv/kkzr1q3NokWLzN69e819991nQkJCrP2XlpaaKVOmmE2bNpnPP//cvPzyyyYoKMi89tprVhtPPPGEadGihXn99dfNzp07TXp6umnevLnH+ejRRx81nTp1MsuWLTP79+83OTk5JiAgwKxatcrjd9+7d2+zatUqs2PHDnPttdeaa6655ryON2s8tSptozMD129/+1trW2VlpYmIiLCuCIwdO9YMGDDA40WsynvvvWeaNm1qvTgYY6pd4frf//1f07FjR4/6ZWVlplmzZmb58uXm22+/NZKsH/b5uPzyy828efOs5TPHcPjwYSPJPPzww9a6/Px8I8nqa00TExe3Xbt2WVeMqlx77bXWsZGenm7uuecejzpr1641vr6+5vvvvzfG/HAsDRs2zKPMmYFr+vTpJikpyaPMwYMHjSSze/duY4znHKvJ66+/bgIDA80HH3xgrYuLi/M4AZ5vn890voGrX79+HmWuuuoq8+CDDxpjjFm+fLlp2rSp+fe//21tf++99340cK1fv95IMm+88YbH+pYtW5rg4GATHBxsHnjgAWsMDofDnDx50qNs+/btrSvsVX/Rny43N9c0adLEFBQUWOt27NhhJJmNGzeetV5d93c+9fDjzjzWKioqTHBwsBkxYoS1ruqcnZ+fb4zxDFzGnP/5+sxye/bsMR06dDC9evUyxvzwe6u6YFBl+vTpxul0GmP+M9fPvHLTpUsXM2XKlBr3+ec//7naa1x2drYJCQkxp06dqvFnYIznfDvf4zMoKMjjitbEiRNN7969jTHGbNmyxUiy3h06U0xMjHnooYdq3GbMD4Fr0qRJ1nJpaamRZN57772z1snIyDApKSnWcnR0tJk5c6a17Ha7TevWra3z0cmTJ01QUJBZt26dRzvp6enmzjvvNMZ4XuGq8u677xpJZz3n1aTB3MN1ptPvbfHx8VFUVJR1k+HIkSOVmJiojh07atCgQbrxxhuVlJQkSdq9e7diY2M93mu/+uqrPdr++OOPtW/fPjVv3txj/cmTJ7V//34lJSVp5MiRSk5OVmJiohISEnT77bcrOjpaklRaWqopU6bo3Xff1eHDh1VRUaHvv/9eBQUFZx1D1VcWdenSpdq6oqKiOt8bgIatU6dOuuaaa/TCCy/ouuuu0759+7R27VpNmzZN0g/H4ieffKJXXnnFqmOMUWVlpQ4cOKDOnTtLknr16vWj+/n444/1/vvvKyQkpNq2/fv3q0OHDj9a/6OPPtKIESP09NNPq2/fvufc1/n0uS7OvKctOjramve7du1SbGysYmJirO11/bL7jRs3qrKyUqmpqSorK5P0w7hKS0vVsmVLj7Lff/+99u/ff9a2qvoVGxtrrYuPj1dYWJh27dqlq666qsZ6dd1fXevB0+nHWpMmTdSyZcuznp8v1NGjRxUSEqLKykqdPHlS/fr10//8z//o+PHj2r9/v9LT0zVq1CirfEVFhXVzfpUzzwH33XefRo8erdzcXCUkJCglJcUa065du+R0OuXj42OV79u3r0pLS/XVV1+pTZs21X4Gkud8O9/jrG3bth6vpae3ceWVV2rgwIHq0qWLkpOTlZSUpF//+tdq0aKFioqKdOjQIQ0cOPBHf3an9zE4OFgOh8Pjd5Kdna0XXnhBBQUF+v7771VeXm49aHL06FEdPnxYvXv3tso3bdpUvXr1kvm/L9nZt2+fTpw4ocTERI/9lpeXq3v37mftS1UeKCoqsn6e59JgA9eZNwT6+PiosrJSktSjRw8dOHBA7733nlasWKHbb79dCQkJ+uc//3lebZeWlqpnz54eLxhVWrVqJemHm5rvu+8+LVu2TK+99pomTZqkvLw89enTR/fff7/y8vL05JNP6tJLL1WzZs3061//utrNzKePoerAr2ld1bjw85Senq6xY8cqOztbOTk5at++vfr37y/ph2PxD3/4g+67775q9U6fxMHBwT+6j9LSUt1000164oknqm2rOjGcjcvl0s0336zf//73Sk9PP+d4zrfPp/P19bVOcFXcbne1cj827+vi0ksvlY+Pj3bv3u2x/pe//KUkz5vbS0tLFR0drVWrVlVrx46nh+u6v5+6nz9XNR1rdp2fmzdvrq1bt8rX11fR0dHWcVdYWChJev755z1CgfRDCDzdmeeA3//+90pOTta7776r3NxczZgxQ0899ZTGjh173v36sfl2vsfZj7XRpEkT5eXlad26dcrNzdW8efP00EMPacOGDbrkkksuuI+vvvqq7r//fj311FNyOp1q3ry5/vrXv2rDhg3n1XbVOCXp3Xff1S9+8QuPbWd+j+SFHh8NNnCdi8Ph0B133KE77rhDv/71rzVo0CAdOXJEHTt21MGDB1VYWGj9hVL1yGiVHj166LXXXlNERIQcDsdZ99G9e3d1795dWVlZcjqdWrRokfr06aMPP/xQI0eO1C233CLph1/YF198ccFj8vf316lTpy64HTQst99+u8aNG6dFixbppZde0ujRo63J2qNHD+3cuVOXXnrpBe2jR48eev3119W2bVs1bVrztK7p+Dp58qSGDh2qTp06adasWedVpy59btWqlT799FOPddu2bavVk1adO3fWwYMHdfjwYStErl+//kfrtGzZUomJiXr66ac1duzYHw2uPXr0kMvlUtOmTa3P9TlTTT+Pqn4dPHjQusq1c+dOFRcXKz4+/qz16rq/86kH+9XmfO3r61vjfImMjFRMTIw+//xzpaam1roPsbGx+uMf/6g//vGPysrK0vPPP6+xY8eqc+fOev3112WMsc41H374oZo3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\n" }, "metadata": {} } ] }, { "cell_type": "markdown", "source": [ "# i observed that values are distributed almost uniformly for col JAHR but for column MONAT its a different case" ], "metadata": { "id": "KDJVmnwkD3RV" } }, { "cell_type": "code", "source": [ "df['JAHR'].value_counts()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 743 }, "id": "vbmMkR5pD2i6", "outputId": "65e87d35-7952-44aa-80e2-67568eecb6cf" }, "execution_count": 95, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "JAHR\n", "2019 90\n", "2018 90\n", "2001 90\n", "2002 90\n", "2003 90\n", "2004 90\n", "2005 90\n", "2006 90\n", "2007 90\n", "2008 90\n", "2009 90\n", "2010 90\n", "2011 90\n", "2012 90\n", "2013 90\n", "2014 90\n", "2015 90\n", "2016 90\n", "2017 90\n", "2000 84\n", "Name: count, dtype: int64" ], "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
JAHR
201990
201890
200190
200290
200390
200490
200590
200690
200790
200890
200990
201090
201190
201290
201390
201490
201590
201690
201790
200084
\n", "

" ] }, "metadata": {}, "execution_count": 95 } ] }, { "cell_type": "code", "source": [ "df['MONAT'].value_counts()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 490 }, "id": "cJyIFAQ1D6iU", "outputId": "c443171e-8f63-4b30-e756-b773706c23fb" }, "execution_count": 96, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "MONAT\n", "Summe 114\n", "200901 7\n", "200709 7\n", "200710 7\n", "200711 7\n", " ... \n", "201201 7\n", "201202 7\n", "201203 7\n", "201204 7\n", "200012 7\n", "Name: count, Length: 241, dtype: int64" ], "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
MONAT
Summe114
2009017
2007097
2007107
2007117
......
2012017
2012027
2012037
2012047
2000127
\n", "

241 rows × 1 columns

\n", "

" ] }, "metadata": {}, "execution_count": 96 } ] }, { "cell_type": "markdown", "source": [ "# Since MONAT includes values like '200703' i.e contains year+month values. We can probly remove the year since we already have that feature in 'JAHR' column. Ill just slice to extract the month values" ], "metadata": { "id": "1kjnie9KDgJw" } }, { "cell_type": "code", "source": [ "def convert_date(data, column_name='MONAT', special_value='Summe'):\n", "\n", " day_mapping = {\n", " '01': 'January',\n", " '02': 'February',\n", " '03': 'March',\n", " '04': 'April',\n", " '05': 'May',\n", " '06': 'June',\n", " '07': 'July',\n", " '08': 'August',\n", " '09': 'September',\n", " '10': 'October',\n", " '11': 'November',\n", " '12': 'December'\n", " }\n", "\n", " data_copy = data.copy()\n", " data_copy[column_name] = data_copy[column_name].apply(lambda x: day_mapping[x[4:]] if x != special_value else x)\n", "\n", " return data_copy\n", "\n", "df = convert_date(df, 'MONAT')" ], "metadata": { "id": "Jvv6y70NzDYB" }, "execution_count": 97, "outputs": [] }, { "cell_type": "code", "source": [ "df['MONAT'].unique()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "1zsJV0d5D96Y", "outputId": "c63ae632-16de-4eb3-ee2d-2a1c7ac4ecf6" }, "execution_count": 98, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array(['Summe', 'January', 'February', 'March', 'April', 'May', 'June',\n", " 'July', 'August', 'September', 'October', 'November', 'December'],\n", " dtype=object)" ] }, "metadata": {}, "execution_count": 98 } ] }, { "cell_type": "code", "source": [ "df['MONAT'].value_counts()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 523 }, "id": "EEWdkVDQBFG4", "outputId": "5c965b3c-fa8e-4e60-df43-dab476a49a11" }, "execution_count": 99, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "MONAT\n", "January 140\n", "February 140\n", "March 140\n", "April 140\n", "May 140\n", "June 140\n", "July 140\n", "August 140\n", "September 140\n", "October 140\n", "November 140\n", "December 140\n", "Summe 114\n", "Name: count, dtype: int64" ], "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
MONAT
January140
February140
March140
April140
May140
June140
July140
August140
September140
October140
November140
December140
Summe114
\n", "

" ] }, "metadata": {}, "execution_count": 99 } ] }, { "cell_type": "markdown", "source": [ "# The distribution now seems better for MONAT column" ], "metadata": { "id": "PMO4-WmDEBUx" } }, { "cell_type": "code", "source": [ "plt.figure(figsize=(8,6))\n", "plt.hist(df['MONAT'], bins=13, edgecolor='black')\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 522 }, "id": "cg7JP1E-EC0M", "outputId": "463de13f-cedb-4718-d20d-fb2d49fb8535" }, "execution_count": 100, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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U5cuXRQcHKwbb7xR06ZNcxt+9OhR9erVSzfccINCQ0PVrFmzPPf9N954Q+XLl1dAQECu7fBnrouwGhISopCQEC1atEiZmZlX1daYMWP0yiuv6N///rdzYJg8ebLmz5+vTz75RJ9//rlefvllt2nmzp2rkiVLav369RowYID69u2rTp06qVGjRtq8ebPuuusude3a1Qm5R48eVbNmzVS7dm21adNGjRo10v79+/XUU09p8ODB2rhxo5YvXy4vLy916NAh11cE//jHP/TEE09oy5Ytuummm9SlS5d8fbI6duyYunXrpm+++UZr165V5cqV1bp1ax07dizXuujQoYO+++479ezZU5UqVdKePXvcxpk9e7Zq1qypYcOG6bHHHtOPP/6o1157TXPmzNH48ePdxh05cqQ6duyorVu3KjExUQ888IC2b9/uNs6TTz6pxx57TNu3b1dCQkKBLk+PHj1yHbT37NmjChUquH24mDVrVq7/rnb8+PHL2lYXLs/06dPVr18/9enTR999950+/vhjVapUyW2asWPHqnPnztq2bZtat26txMTEy7qSkZf33ntPVatWVZUqVfTXv/5Vs2bN0oU/rTxkyBC98MIL2rBhg2644Qa1bdvW7arIiRMnNHHiRL3xxhv64YcfVKpUqSuq5WpcuK2uZJv06tVL8+fPdztG/POf/9SNN96oZs2aXZsFuYiLbffzjxkbN25UUlKS9u/fr86dOxdy1X+uINb35ezPFzNv3jyNHz9eEydO1KZNmxQbG6vp06df9vQhISEKCgrSlClTNHLkSO3YsUNJSUm64447JJ27PSYsLEyxsbFaunSpVq9erYYNG6p58+Zu7+Fdu3bpvffe0+LFi5WUlKRvv/1Wjz76qCTpiSeeUOfOnd2+xWrUqJGysrKUkJCgYsWK6euvv9bq1asVEhKili1bul2hWrFihfbu3atVq1bpxRdf1OjRo9WmTRuVKFFC69at0yOPPKKHH35Yv//+u9uyDRkyRI8//ri+/PJLZWRkKC0tLdc5q2HDhurUqZN8fX2VkpKiOnXqaMGCBZo6darq1aun06dPKygoSKtXr9bUqVMlSTt27NC+ffs0ZcoUSdLQoUP14Ycfau7cudq8ebMqVaqkhISEXMe4vI5L2dnZ8vb21sCBA7VgwQI1b95c27Zt0xNPPCFJ6t+/vzZt2qTOnTsrKChIAQEBatOmjVwul26++WZJUmJiotavX+/2QfaHH37Qtm3b9OCDDzr7yahRozR+/Hht375dzzzzjEaOHKm5c+e61Th69GiNGDFCmzdvlo+Pjx588EENHTpUU6ZM0ddff61du3Zp1KhRbtMsX75c27dv18qVK7VgwQKtW7dOpUqVcj6M169fX//5z380efJkffHFF2rcuLGGDBmixYsXS5JzcSotLU0zZ87U4sWL1aRJE6f9/v37a82aNXrnnXe0bds2derUSS1bttTOnTudcU6cOKGpU6fqnXfeUVJSklauXKkOHTro008/1aeffqq3335br732mtsFJUl67rnnVLNmTX377bfOuW3ZsmXO8E6dOjkX+DZt2qQ6derkue9/+OGHWrhwYf7ukzbXiQ8++MCUKFHCBAQEmEaNGpnhw4ebrVu3GmOM2b17t5Fkvv32W2f8I0eOGEnmyy+/NMYY8+WXXxpJ5osvvnDGmTBhgpFkfv75Z6ffww8/bBISEpzuO++80zRu3NjpPnPmjAkODjZdu3Z1+u3bt89IMmvWrDHGGPPUU0+Zu+66yxhjTLdu3Uy7du1McnKykWR27NjhTHfgwAEjyXz33Xduy/HGG2844/zwww9Gktm+fbsxxpjRo0ebmjVruq2bl156yZQtW/ZP193Zs2dNsWLFzOLFi51+ksygQYPcxuvUqZORZAIDA01wcLAJDg42fn5+5uabbzbPPPOM27hvv/22KV26tFt7jzzyiNs4DRo0MH379nVbtsmTJ7uNU5DL88cffxhvb2+zbt06Y4wxXbt2NX5+fmbq1KnG39/f/Prrr+bXX381AQEB5sCBA6Zdu3amW7duec7zz7bVhcsTHR1t/vGPf/xp7ZLMiBEjnO6MjAwjySxduvRPp7mYRo0aOTVkZWWZkiVL5trn33nnHWf8Q4cOmcDAQPPuu+8aY4yZPXu2kWS2bNni1m7OfpvjzjvvNI899tgV1XgxOfNJTU296m1y8uRJU6JECWfZjDGmRo0aZsyYMQVWtzHGlC1b1rz00ktuw2vWrGlGjx7tdF9qu59/zMiR1zHD065kOT766CNjTMGs74vtz7NnzzZhYWFu43/00Ufm/NNcgwYNTL9+/dzGuf32292OMXnty+fvZ0888YSRlOe55uuvvzbe3t655lGxYkXz2muvGWPOHdO8vb3N77//7gxfunSp8fLyMvv27TPG5H5/GXPumFqlShWTnZ3t9MvMzDSBgYHms88+c6YrW7asOXv2rDNOlSpVzF/+8henO+cctWDBAmPMf49Vzz77rDHGmLVr1xpJJiIiwkycONEY477/vfjii0aS+fjjj40kM3v2bGe91a5d25lPzvHlyJEjTr+MjAzj6+tr5s2b5/Q7ffq0iY6ONpMmTXKbLq/j0p133mnatWtnevbsaUqVKmV69OhhjPnvdvby8jL333+/adGihSlbtqxp3769McaYIUOGmJtvvtlpr2bNmmbcuHFO9/Dhw02DBg3cttf8+fPd1v9TTz1l4uLi3NbZ+efiBQsWGElm+fLlTr8JEyaYKlWqONsmJibGhIeHm+PHjzvjTJ8+3fj4+Jhq1aqZ5cuXG0lm5cqVbvMuVqyYqVevnjHGmOrVqxtJZtGiReZCv/32m/H29jZ//PGHW//mzZub4cOHG2P+e0zftWuXM/zhhx82QUFB5tixY06/hIQE8/DDDzvdZcuWNS1btnRr9/777zetWrUyxpzb90NDQ82pU6fcxrlw3/f19TWpqam5ar+U6+LKqnTuPqK9e/fq448/VsuWLbVy5UrVqVMn3w+B1KhRw/k7MjJSQUFBqlChglu/1NTUP53G29tbERERuvXWW92mkeRMt3XrVn355ZcKCQnRvHnztGTJElWtWlWS1KdPH1WoUEGhoaHOV90XXs08f36lS5d2a/ty7N+/X71791blypUVFham0NBQZWRk5JpP3bp13bqDgoJUsmRJtWvXTlu2bNHEiRPl6+ur1NRUjRs3zrnCHRISot69e2vfvn1ut0zExcW5tRcXF5fryuqF8yzI5YmOjtbdd9+tWbNmSTr3FVt2drZ69uzpfMU4e/Zs3X333SpZsqTbtDt37lSXLl0uua3On2dqaqr27t2r5s2bX3R5zt++wcHBCg0Nzdf2zbFjxw6tX79eXbp0kST5+Pjo/vvv15tvvuk23vnbJTw8XFWqVHHbLn5+fm41FYYbbrjhqrdJQECAunbt6mzvzZs36/vvv7fmAa2Lbffzjxk5r5xjxvlXiGzi6fV9ufvzpdqoX7++W78Luy9l1KhRql69uvz8/JSRkaEPPvjAOdds3bpVZ8+e1euvv+62rXbv3u22nWJjY3XjjTc63XFxccrOztaOHTv+dL5bt27Vrl27VKxYMafd8PBwnTp1yq3t6tWry8vrv6f2yMhIt/NRzjnqwmPKhcfnihUrOseB8/e/J598UtK5q2iSFBER4Uxz2223XXTd/fzzz8rKytLtt9/u9PP19VX9+vVznQvyOi7lPKy1detWHT58WLNmzVJQUJAeeOABSVJ2dra2bdvmtJ9z/L399tu1c+dO52vtxMREzZ8/X9K5ez4XLFigxMRESee+ofn555/Vs2dPt2349NNP53qvXZgXJOU691+4nmvWrKmgoCC35Txz5ozOnDmjFStWSDp3K8r5DzEfO3bMuRKe80BzXufK7777TmfPntVNN93kVvtXX33lVntQUJAqVqzoVme5cuUUEhJy0dovdg7funWrMjIyFBERcdF9v2zZsrrhhhty1X4pPvmewmIBAQFq0aKFWrRooZEjR6pXr14aPXq0vv76a0ly+7roz27+9vX1df52uVxu3Tn9LvyqN69xLmxHkjNdRkaG2rZtq4kTJ2ro0KE6duyYpk+froSEBPn4+GjmzJmKjo5Wdna2brnlllw3IV+sbS8vr1xfi124rN26ddOhQ4c0ZcoUlS1bVv7+/oqLi8s1n+Dg4Fzrp2LFilq6dKlmzZqlpKQkdenSRf/85z81duxY3XvvvbnGz889KXnNs6CXp1evXuratateeukl7dq1SzfeeKOCgoLUo0cP5367C+/LkaS2bduqbNmyl9xW588zMDDwMtZA3vvTlTwt+uabb+rMmTOKjo52+hlj5O/vr1deeeWy2wkMDLTiSVtPbJNevXqpVq1a+v333zV79mw1a9ZMZcuWLdC6L2cfli6+3c8/Zlwo5wNrQbvc5TifJ9f3pfbnK6kvL5dqp1ixYtqyZYtWrlypzz//XB9++KGCg4M1cuRI9e/fX35+furSpYtGjBjh1sbVPpCYkZGh2267zbn3/Xznn/wvdT7K6fdnx5RKlSo5Aen8eefsfyNGjFBSUpImTpzo3DeaI69jbEHIyMhQ3759tW3bNvn6+uree+/Vo48+qp07dzoh+mL1dOnSRcOGDdPmzZt18uRJJScn6/7773falqSZM2fmurfV29vbrTuvc/GF/S732B0TE+M8NPbPf/5TUVFRbsNzPpz7+/srMzMzz2XLyMiQt7e3Nm3alKvW84Po1e4jecnIyFDp0qXd7o/Ncf6+f6X7yHUVVi908803a9GiRc4bed++fc4DGYX5m3J16tTRhx9+qHLlyik0NFTZ2dkqUaKEfvnlF82ZM8d583/zzTf5bvuGG25QSkqKjDHOm+fCZV29erVeffVVtW7dWtK5K4qX+6BGZGSkkpOTNX36dCUlJWnVqlX68ccftWPHjlz3Xl5o7dq1euihh9y6z39ApjCWp3Xr1goODtb06dP1xx9/qHHjxpLk3Afmcrly3Tt76NAh7dixQzNnzszXtipWrJjKlSun5cuXu90QXxDOnDmjt956Sy+88ILzoEOO9u3ba8GCBc6VubVr1zpP1R85ckQ//fSTqlWrVqD1XQlPbJNbb71VdevW1cyZMzV//vx8hfYrdcMNN2jfvn1Od3p6unbv3p2vNs4/Zvj4FM5h+0qWw1Pr+3L257Jly+rYsWM6fvy4c0K88FhRpUoVbdiwwe04dOHDPRcu59mzZ/X999+7vWd9fHwUHx+v+Ph4jR49WqGhoTLGqE6dOsrKypIx5qLHwz179mjv3r1O8F67dq28vLxUpUoVSee+zbjw4ZY6dero3XffValSpRQaGnqpVZZva9eu1R133KGIiAjFx8drxYoVztXGnP0vICBAixcv1kMPPaSEhARlZ2dr48aNio+Pz9Wen5+fJLktR8WKFeXn56fVq1c7H1qysrK0YcOGXA+15XVcqlevnlPPjz/+qJdfflm1atVSnTp1JJ0L2jfffHOun6xcvXq1brrpJifAlSlTRnfeeafmzZunkydPqkWLFs69+JGRkYqOjtYvv/ziLL8nbd26VSdPnnQuXuR8+/vggw+qZMmSevXVV7V///4/nXeFChX+NL/Url1bZ8+eVWpqqtuHCE9Zu3Ztru6cc0WdOnWcB67PfwDaU66LsHro0CF16tRJPXr0UI0aNVSsWDFt3LhRkyZNUrt27RQYGKiGDRvq2WefVfny5ZWamprrU++11K9fP82cOVNdunTRyZMnlZmZqfXr18vf31+vvfaaSpcurT179jhft+RHkyZNdODAAU2aNEn33XefkpKStHTpUreDW+XKlfX222+rbt26Sk9P15AhQy77ql/OU53Dhw9X5cqVFRcXp1GjRqlNmzaKjY3VfffdJy8vL23dulXff/+9nn76aWfa999/X3Xr1lXjxo01b948rV+//pJf4RX08nh7ezvLExoaqvDwcKd/ztcbF35CLVGihCIiIvT666/ne1uNGTNGjzzyiEqVKqVWrVrp2LFjWr16tQYMGHBZ01+uJUuW6MiRI+rZs6fCwsLchnXs2FFvvvmmnnvuOUnSuHHjFBERocjISP3jH/9QyZIlC/03HvPiqW3Sq1cv9e/fX8HBwerQoUOB192sWTPNmTNHbdu2VfHixTVq1Khc9V/K+ceMoUOHKjw8XLt27dI777yjN954I9/tXYkrXQ5PrO/L2Z8/++wzBQUF6f/+7/80cOBArVu3LtdtYAMGDFDv3r1Vt25dNWrUSO+++662bdvmdqtXs2bNNHjwYH3yySeqWLGiXnzxRefr50OHDqlZs2aqUaOG2rZtq+joaM2dO1fZ2dlOeC1VqpTef/99NW/eXLfccotOnDihpUuXqkOHDs5XtwEBAerWrZuef/55paena+DAgercubNzNa1cuXL67LPPtGPHDkVERCgsLEyJiYl67rnn1K5dO40bN05lypTRb7/9poULF2ro0KEqU6bMFa3bHNOmTVPlypVVrVo1hYeH6+zZs1qyZIn+8pe/qH379po2bZqqV6+uiIgI9erVSzt27FDFihXVo0cPTZ06VSdPntTvv/+u9957T507d1bZsmXlcrm0ZMkStW7dWoGBgQoJCVHfvn2dXyaIjY3VpEmTdOLECfXs2dOtnryOS7GxsUpPT9ewYcPUsGFDvfbaa2rVqpXz8Fb//v31+OOPq169eipWrJhSU1M1d+5cvfLKK25P80vnbgUYPXq0Tp8+rZdeeslt2NixYzVw4ECFhYWpZcuWyszM1MaNG3XkyBENHjz4itdxdna2Tp06pS5duuivf/2rFi9erLffflsVK1ZU9+7d5eXlpZiYGA0dOlT79u1TmzZt9Msvv+idd95RXFycxowZo27dumnLli2aMGGCunfvrjNnzujTTz/VsGHDdNNNNykxMVEPPfSQXnjhBdWuXVsHDhzQ8uXLVaNGjav+beLVq1dr0qRJat++vZYtW6b3339fn3zyiaRzv9IQFxen9u3ba9KkSbrpppu0d+9effLJJ277/hXL912uFjp16pR58sknTZ06dUxYWJgJCgoyVapUMSNGjDAnTpwwxhjz448/mri4OBMYGGhq1aplPv/88zwfsDr/ZvC8bti/8IGfvG7Gz+tBBJ334IExxvz000+mQ4cOxtfX13h5eZmqVauae++911SrVs34+/ubGjVqmJUrV7pNdzkPihlz7obtmJgYExwcbB566CEzfvx4tweSNm/ebOrWrWsCAgJM5cqVzfvvv5+r5gvrNea/N/3//PPPRpJzQ7wxxiQlJZlGjRqZwMBAExoaaurXr29ef/11t/amTZtmWrRoYfz9/U25cuXcHrzIa9kKenly5CzPbbfdluuhhvOd/5DFsmXL8r2tcsyYMcNUqVLF+Pr6mtKlS5sBAwZctM6wsDDnIYbL1aZNG9O6des8h61bt85IMlOmTDGSzOLFi0316tWNn5+fqV+/vvOwiDF5vweMufYPWP2Z/GyTHMeOHTNBQUHm0Ucf9Xi9Obp27Wo6duxojDEmLS3N3H///SY0NNTExMSYOXPmXPTBpBwXbvecY0bx4sVNYGCgqVq1qhk0aJDbAzc2Locn1vfl7M9bt241H330kalUqZIJDAw0bdq0Ma+//rq58DQ3btw4U7JkSRMSEmJ69OhhBg4caBo2bOgMP336tOnbt68JDw83pUqVMhMmTHD2s1OnTpnExEQTEhJiXC6XkWT8/f3Nvffe65xrNm3aZKKioowkI8lER0ebxMREs2fPHmPMf88hr776qomOjjYBAQHmvvvuM4cPH3ZqSE1NNS1atDAhISFux/d9+/aZhx56yJQsWdL4+/ubChUqmN69e5u0tDRjTN7vl0udo3KOVfPnzzf169d3HpqdP3++6datm4mMjHSOVRUqVDChoaHO/te/f38zaNAgU7p0aeNyuUxYWJiZNWuW27qOiooyLpfLeZ+ePHnSDBgwwFmG22+/3axfv96ZJudcnNdx6fzlW79+vWnRooUJCgpy1vX48eONMeceuPb19TXe3t4mNjbWPPfcc7n2myNHjhh/f/9cDxblmDdvnqlVq5bx8/MzJUqUMHfccYdZuHCh2zo7//h+qQzRrVs3p04vLy/jcrmMt7e3ueOOO5x9x5hz77O//OUvxsfHxxm3dOnS5v3333ebz6233mr8/PxMyZIlzb333utMf/r0aTNq1ChTrlw5Z7t16NDBbNu2LVdNOfJ6kPnCfals2bJm7NixplOnTiYoKMhERUWZKVOmuE2Tnp5uBgwYYKKjo42vr6+JiYnJc9+/Ei5j8vG7H/C4li1bqlKlStfk60hP+frrr9W8eXMlJyc7N5UXZdfb8lyulStXqmnTpjpy5Mg1+4F/G/z666+qWLGiNmzY4Hx96GlF8X2dF08sx7VY31ejRYsWioqK0ttvv31N5jdmzBgtWrTImn9vChQF18VtAEXRkSNHtHr1aq1cuTLPfyVpo8zMTB04cEBjxoxRp06dinywu96WBxeXlZWlQ4cOacSIEWrYsGGBBKei+L7OiyeW41qs7/w6ceKEZsyYoYSEBHl7e2vBggX64osv3H4rEoB9CKuFpEePHtqwYYMef/xxtWvXrrDLuSwLFixQz549VatWLb311luFXc5Vu96WBxe3evVqNW3aVDfddFOuH7v2lKL4vs6LJ5bjWqzv/HK5XPr00081fvx4nTp1SlWqVNGHH36Y5wNCAOzBbQAAAACw1nXzTwEAAABw/SGsAgAAwFqEVQAAAFiLsAoAAABrEVYBAABgLcIqAAAArEVYBQAAgLUIqwAAALDW/wPMVj0LZXJ4iAAAAABJRU5ErkJggg==\n" }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "df.head(5)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "3dqIKmKhEFoF", "outputId": "899a11a4-b688-4f51-b006-2ed00d10b51d" }, "execution_count": 101, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " MONATSZAHL AUSPRAEGUNG JAHR MONAT WERT\n", "0 Alkoholunfälle insgesamt 2019 Summe 434.0\n", "1 Alkoholunfälle insgesamt 2019 January 22.0\n", "2 Alkoholunfälle insgesamt 2019 February 28.0\n", "3 Alkoholunfälle insgesamt 2019 March 34.0\n", "4 Alkoholunfälle insgesamt 2019 April 36.0" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
MONATSZAHLAUSPRAEGUNGJAHRMONATWERT
0Alkoholunfälleinsgesamt2019Summe434.0
1Alkoholunfälleinsgesamt2019January22.0
2Alkoholunfälleinsgesamt2019February28.0
3Alkoholunfälleinsgesamt2019March34.0
4Alkoholunfälleinsgesamt2019April36.0
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "df", "summary": "{\n \"name\": \"df\",\n \"rows\": 1794,\n \"fields\": [\n {\n \"column\": \"MONATSZAHL\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"Alkoholunf\\u00e4lle\",\n \"Fluchtunf\\u00e4lle\",\n \"Verkehrsunf\\u00e4lle\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"AUSPRAEGUNG\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"insgesamt\",\n \"Verletzte und Get\\u00f6tete\",\n \"mit Personensch\\u00e4den\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"JAHR\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 5,\n \"min\": 2000,\n \"max\": 2019,\n \"num_unique_values\": 20,\n \"samples\": [\n 2019,\n 2002,\n 2004\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"MONAT\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 13,\n \"samples\": [\n \"November\",\n \"September\",\n \"Summe\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"WERT\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1674.8731821587605,\n \"min\": 0.0,\n \"max\": 11773.0,\n \"num_unique_values\": 884,\n \"samples\": [\n 56.0,\n 4209.0,\n 284.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 101 } ] }, { "cell_type": "markdown", "metadata": { "id": "dNRwBaKlyyBz" }, "source": [ "# I was confused between using label encoder or one hot encoder, but since the model performed better for one hot encoder, i decided to just go with it" ] }, { "cell_type": "code", "source": [ "columns_to_encode = df.columns[0:4]" ], "metadata": { "id": "tjvcKt7JcjUm" }, "execution_count": 102, "outputs": [] }, { "cell_type": "code", "source": [ "columns_to_encode" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "P7ctV8D1dIOe", "outputId": "86ace85a-f8d0-4ea2-d82f-16a00d2152cb" }, "execution_count": 105, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Index(['MONATSZAHL', 'AUSPRAEGUNG', 'JAHR', 'MONAT'], dtype='object')" ] }, "metadata": {}, "execution_count": 105 } ] }, { "cell_type": "code", "source": [ "def _one_hot(df):\n", " encoder = OneHotEncoder(sparse_output=False)\n", "\n", " one_hot_columns = df.columns[0:4]\n", "\n", " df_copy = df.copy()\n", "\n", " encoded_columns = encoder.fit_transform(df_copy[one_hot_columns])\n", "\n", " encoded_column_names = encoder.get_feature_names_out(one_hot_columns)\n", "\n", " encoded_df = pd.DataFrame(\n", " encoded_columns,\n", " columns=encoded_column_names,\n", " index=df_copy.index\n", " )\n", "\n", "\n", " final_df = pd.concat([\n", " df_copy.drop(columns=one_hot_columns),\n", " encoded_df\n", " ], axis=1)\n", "\n", " return final_df, encoder\n", "\n", "final_df, encoder = _one_hot(df)\n" ], "metadata": { "id": "h3rWO-QWY-Tn" }, "execution_count": 114, "outputs": [] }, { "cell_type": "code", "execution_count": 110, "metadata": { "id": "poFSghx08_ig", "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "outputId": "99da1f84-2ea1-4ff7-d458-0c77009c8c98" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "WERT 0\n", "MONATSZAHL_Alkoholunfälle 0\n", "MONATSZAHL_Fluchtunfälle 0\n", "MONATSZAHL_Verkehrsunfälle 0\n", "AUSPRAEGUNG_Verletzte und Getötete 0\n", "AUSPRAEGUNG_insgesamt 0\n", "AUSPRAEGUNG_mit Personenschäden 0\n", "JAHR_2000 0\n", "JAHR_2001 0\n", "JAHR_2002 0\n", "JAHR_2003 0\n", "JAHR_2004 0\n", "JAHR_2005 0\n", "JAHR_2006 0\n", "JAHR_2007 0\n", "JAHR_2008 0\n", "JAHR_2009 0\n", "JAHR_2010 0\n", "JAHR_2011 0\n", "JAHR_2012 0\n", "JAHR_2013 0\n", "JAHR_2014 0\n", "JAHR_2015 0\n", "JAHR_2016 0\n", "JAHR_2017 0\n", "JAHR_2018 0\n", "JAHR_2019 0\n", "MONAT_April 0\n", "MONAT_August 0\n", "MONAT_December 0\n", "MONAT_February 0\n", "MONAT_January 0\n", "MONAT_July 0\n", "MONAT_June 0\n", "MONAT_March 0\n", "MONAT_May 0\n", "MONAT_November 0\n", "MONAT_October 0\n", "MONAT_September 0\n", "MONAT_Summe 0\n", "dtype: int64" ], "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0
WERT0
MONATSZAHL_Alkoholunfälle0
MONATSZAHL_Fluchtunfälle0
MONATSZAHL_Verkehrsunfälle0
AUSPRAEGUNG_Verletzte und Getötete0
AUSPRAEGUNG_insgesamt0
AUSPRAEGUNG_mit Personenschäden0
JAHR_20000
JAHR_20010
JAHR_20020
JAHR_20030
JAHR_20040
JAHR_20050
JAHR_20060
JAHR_20070
JAHR_20080
JAHR_20090
JAHR_20100
JAHR_20110
JAHR_20120
JAHR_20130
JAHR_20140
JAHR_20150
JAHR_20160
JAHR_20170
JAHR_20180
JAHR_20190
MONAT_April0
MONAT_August0
MONAT_December0
MONAT_February0
MONAT_January0
MONAT_July0
MONAT_June0
MONAT_March0
MONAT_May0
MONAT_November0
MONAT_October0
MONAT_September0
MONAT_Summe0
\n", "

" ] }, "metadata": {}, "execution_count": 110 } ], "source": [ "final_df.isna().sum()" ] }, { "cell_type": "markdown", "metadata": { "id": "d2i8SDsSyyBz" }, "source": [ "# 3. finally training the model and downloading it as pkl to use in api" ] }, { "cell_type": "code", "source": [ "x = final_df.drop(columns=['WERT'])\n", "y = final_df['WERT']\n", "\n", "x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=10)\n" ], "metadata": { "id": "H5GezDyXB_In" }, "execution_count": 77, "outputs": [] }, { "cell_type": "code", "execution_count": 78, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 309 }, "id": "EVn2xhzhzQVa", "outputId": "5fbe46ae-20a7-439d-8f15-e396494dda1a" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Fitting 2 folds for each of 243 candidates, totalling 486 fits\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.10/dist-packages/xgboost/core.py:158: UserWarning: [15:56:52] WARNING: /workspace/src/common/error_msg.cc:27: The tree method `gpu_hist` is deprecated since 2.0.0. To use GPU training, set the `device` parameter to CUDA instead.\n", "\n", " E.g. tree_method = \"hist\", device = \"cuda\"\n", "\n", " warnings.warn(smsg, UserWarning)\n", "/usr/local/lib/python3.10/dist-packages/xgboost/core.py:158: UserWarning: [15:56:52] WARNING: /workspace/src/learner.cc:740: \n", "Parameters: { \"predictor\" } are not used.\n", "\n", " warnings.warn(smsg, UserWarning)\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "GridSearchCV(cv=2,\n", " estimator=XGBRegressor(base_score=None, booster=None,\n", " callbacks=None, colsample_bylevel=None,\n", " colsample_bynode=None,\n", " colsample_bytree=None, device=None,\n", " early_stopping_rounds=None,\n", " enable_categorical=False, eval_metric=None,\n", " feature_types=None, gamma=None,\n", " grow_policy=None, importance_type=None,\n", " interaction_constraints=None,\n", " learning_rate=None, m...\n", " min_child_weight=None, missing=nan,\n", " monotone_constraints=None,\n", " multi_strategy=None, n_estimators=None,\n", " n_jobs=None, num_parallel_tree=None,\n", " predictor='gpu_predictor', ...),\n", " n_jobs=-1,\n", " param_grid={'colsample_bytree': [0.6, 0.7, 0.8],\n", " 'learning_rate': [0.01, 0.05, 0.1],\n", " 'max_depth': [3, 5, 7],\n", " 'n_estimators': [100, 200, 300],\n", " 'subsample': [0.7, 0.8, 0.9]},\n", " scoring='neg_mean_squared_error', verbose=2)" ], "text/html": [ "
GridSearchCV(cv=2,\n",
              "             estimator=XGBRegressor(base_score=None, booster=None,\n",
              "                                    callbacks=None, colsample_bylevel=None,\n",
              "                                    colsample_bynode=None,\n",
              "                                    colsample_bytree=None, device=None,\n",
              "                                    early_stopping_rounds=None,\n",
              "                                    enable_categorical=False, eval_metric=None,\n",
              "                                    feature_types=None, gamma=None,\n",
              "                                    grow_policy=None, importance_type=None,\n",
              "                                    interaction_constraints=None,\n",
              "                                    learning_rate=None, m...\n",
              "                                    min_child_weight=None, missing=nan,\n",
              "                                    monotone_constraints=None,\n",
              "                                    multi_strategy=None, n_estimators=None,\n",
              "                                    n_jobs=None, num_parallel_tree=None,\n",
              "                                    predictor='gpu_predictor', ...),\n",
              "             n_jobs=-1,\n",
              "             param_grid={'colsample_bytree': [0.6, 0.7, 0.8],\n",
              "                         'learning_rate': [0.01, 0.05, 0.1],\n",
              "                         'max_depth': [3, 5, 7],\n",
              "                         'n_estimators': [100, 200, 300],\n",
              "                         'subsample': [0.7, 0.8, 0.9]},\n",
              "             scoring='neg_mean_squared_error', verbose=2)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ] }, "metadata": {}, "execution_count": 78 } ], "source": [ "xgb = XGBRegressor(\n", " tree_method='gpu_hist',\n", " predictor='gpu_predictor',\n", " verbosity=2\n", ")\n", "\n", "\n", "params = {\n", " 'n_estimators': [100, 200, 300],\n", " 'learning_rate': [0.01, 0.05, 0.1],\n", " 'max_depth': [3, 5, 7],\n", " 'subsample': [0.7, 0.8, 0.9],\n", " 'colsample_bytree': [0.6, 0.7, 0.8]\n", "}\n", "\n", "\n", "grid_search = GridSearchCV(\n", " estimator=xgb,\n", " param_grid=params,\n", " cv=2,\n", " scoring='neg_mean_squared_error',\n", " verbose=2,\n", " n_jobs=-1\n", ")\n", "\n", "grid_search.fit(x_train, y_train)" ] }, { "cell_type": "code", "source": [ "best_model = grid_search.best_estimator_\n", "y_pred = best_model.predict(x_test)\n", "\n", "mse = mean_squared_error(y_test, y_pred)\n", "print(\"Mean Squared Error on the test set: \", mse)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "G1aPfPxKIzYY", "outputId": "a8a91b18-7570-47d7-a483-881ddf7dd1d6" }, "execution_count": 79, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Mean Squared Error on the test set: 17201.635761885165\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.10/dist-packages/xgboost/core.py:158: UserWarning: [15:56:53] WARNING: /workspace/src/common/error_msg.cc:27: The tree method `gpu_hist` is deprecated since 2.0.0. To use GPU training, set the `device` parameter to CUDA instead.\n", "\n", " E.g. tree_method = \"hist\", device = \"cuda\"\n", "\n", " warnings.warn(smsg, UserWarning)\n", "/usr/local/lib/python3.10/dist-packages/xgboost/core.py:158: UserWarning: [15:56:53] WARNING: /workspace/src/common/error_msg.cc:58: Falling back to prediction using DMatrix due to mismatched devices. This might lead to higher memory usage and slower performance. XGBoost is running on: cuda:0, while the input data is on: cpu.\n", "Potential solutions:\n", "- Use a data structure that matches the device ordinal in the booster.\n", "- Set the device for booster before call to inplace_predict.\n", "\n", "This warning will only be shown once.\n", "\n", " warnings.warn(smsg, UserWarning)\n" ] } ] }, { "cell_type": "code", "source": [ "columns_to_encode" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "h23QhE7Gd3E4", "outputId": "12854042-465a-41ee-b49f-84e3375baab8" }, "execution_count": 112, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Index(['MONATSZAHL', 'AUSPRAEGUNG', 'JAHR', 'MONAT'], dtype='object')" ] }, "metadata": {}, "execution_count": 112 } ] }, { "cell_type": "code", "source": [ "def _inference(MONATSZAHL, AUSPRAEGUNG, JAHR, MONAT, encoder, columns_to_encode):\n", "\n", " temp_df = pd.DataFrame({\n", " 'MONATSZAHL': [MONATSZAHL],\n", " 'AUSPRAEGUNG': [AUSPRAEGUNG],\n", " 'JAHR': [JAHR],\n", " 'MONAT': [MONAT]\n", " })\n", "\n", " temp_df_copy = temp_df.copy()\n", "\n", " processed_df = convert_date(temp_df_copy)\n", "\n", " encoded_columns = encoder.transform(processed_df[columns_to_encode])\n", "\n", " encoded_column_names = encoder.get_feature_names_out(columns_to_encode)\n", "\n", " encoded_df = pd.DataFrame(encoded_columns, columns=encoded_column_names, index=processed_df.index)\n", "\n", " final_df = pd.concat([processed_df.drop(columns=columns_to_encode),encoded_df], axis=1)\n", "\n", " predictions = best_model.predict(final_df)\n", "\n", " return predictions\n", "\n", "result = _inference('Alkoholunfälle', 'Verletzte und Getötete', 2012, '201207', encoder, columns_to_encode)\n" ], "metadata": { "id": "ICDOC1WIX8As" }, "execution_count": 116, "outputs": [] }, { "cell_type": "code", "source": [ "result" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "u2ROrrC6fvo2", "outputId": "05bb5bb0-018a-4bb8-e06a-a53e383a9d58" }, "execution_count": 119, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([33.349915], dtype=float32)" ] }, "metadata": {}, "execution_count": 119 } ] }, { "cell_type": "markdown", "source": [ "# Storing the model & the encoder to be used in our api endpoint" ], "metadata": { "id": "zOa3pLT3a08b" } }, { "cell_type": "code", "execution_count": 118, "metadata": { "id": "EhSjmlIAOAGk" }, "outputs": [], "source": [ "with open('model.pkl', 'wb') as file:\n", " pickle.dump(best_model, file)\n", "\n", "with open('encoder.pkl', 'wb') as file:\n", " pickle.dump(encoder, file)" ] }, { "cell_type": "code", "source": [], "metadata": { "id": "JJsb2Rhve6CL" }, "execution_count": null, "outputs": [] } ], "metadata": { "accelerator": "GPU", "colab": { "gpuType": "T4", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "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.12.6" } }, "nbformat": 4, "nbformat_minor": 0 }