{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 106,
   "id": "8218d7f1-4f97-4fad-9c21-5fa89f1a1070",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.144108Z",
     "iopub.status.busy": "2024-12-17T14:12:12.143762Z",
     "iopub.status.idle": "2024-12-17T14:12:12.148257Z",
     "shell.execute_reply": "2024-12-17T14:12:12.147539Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.144080Z"
    }
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from pandas import Series\n",
    "from pandas import DataFrame"
   ]
  },
  {
   "cell_type": "raw",
   "id": "19ef0d92-35f1-4861-8126-158cd0edfd6e",
   "metadata": {},
   "source": [
    "Der Schwierigkeitsgrad einiger Teile dieser Wochenaufgabe ist sehr hoch. Eine Teilaufgabe (1.2.4) ist mit Ihren Mitteln nicht lösbar. Selbstverständlich werden Abwandlungen der zu schwierigen Teilaufgaben nicht Bestandteil der Klausur. Wir ve\n",
    "\n",
    "Zunächst lesen wir die Daten de Theaters ein:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "id": "78336189-95fd-4ea2-a396-503c6ffce017",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.150043Z",
     "iopub.status.busy": "2024-12-17T14:12:12.149499Z",
     "iopub.status.idle": "2024-12-17T14:12:12.349434Z",
     "shell.execute_reply": "2024-12-17T14:12:12.348328Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.150015Z"
    }
   },
   "outputs": [],
   "source": [
    "bestellungenDf=pd.read_csv(\"https://data.hsbo.de/theater_bestellungen.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "id": "b4a7df04-ff7b-4e36-9776-17bb9c6c2063",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.350580Z",
     "iopub.status.busy": "2024-12-17T14:12:12.350309Z",
     "iopub.status.idle": "2024-12-17T14:12:12.387684Z",
     "shell.execute_reply": "2024-12-17T14:12:12.386865Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.350554Z"
    }
   },
   "outputs": [],
   "source": [
    "positionenDf=pd.read_csv(\"https://data.hsbo.de/theater_positionen.csv\")"
   ]
  },
  {
   "cell_type": "raw",
   "id": "e3b639f3-ffe6-4dd0-9a34-2f776eeeb987",
   "metadata": {},
   "source": [
    "Mit bestellungenDf.head() bzw. positionenDf.head() schauen wir uns die Struktur der Daten an:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "id": "9014764b-f1aa-4a98-8782-9bc24103b378",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.390081Z",
     "iopub.status.busy": "2024-12-17T14:12:12.389231Z",
     "iopub.status.idle": "2024-12-17T14:12:12.399821Z",
     "shell.execute_reply": "2024-12-17T14:12:12.399153Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.390051Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>BestellNr</th>\n",
       "      <th>Bestelldatum</th>\n",
       "      <th>Bestelluhrzeit</th>\n",
       "      <th>Gesamtbetrag</th>\n",
       "      <th>Verkaufskanal</th>\n",
       "      <th>Zahlungsmethoden</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10300</td>\n",
       "      <td>2024-08-02</td>\n",
       "      <td>20:51:44</td>\n",
       "      <td>5</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10301</td>\n",
       "      <td>2024-08-02</td>\n",
       "      <td>20:55:46</td>\n",
       "      <td>17</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10302</td>\n",
       "      <td>2024-08-07</td>\n",
       "      <td>20:29:39</td>\n",
       "      <td>36</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10303</td>\n",
       "      <td>2024-08-08</td>\n",
       "      <td>21:03:50</td>\n",
       "      <td>48</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10304</td>\n",
       "      <td>2024-08-09</td>\n",
       "      <td>13:11:27</td>\n",
       "      <td>36</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   BestellNr Bestelldatum Bestelluhrzeit  Gesamtbetrag Verkaufskanal  \\\n",
       "0      10300   2024-08-02       20:51:44             5   Online-Shop   \n",
       "1      10301   2024-08-02       20:55:46            17   Online-Shop   \n",
       "2      10302   2024-08-07       20:29:39            36   Online-Shop   \n",
       "3      10303   2024-08-08       21:03:50            48   Online-Shop   \n",
       "4      10304   2024-08-09       13:11:27            36   Online-Shop   \n",
       "\n",
       "  Zahlungsmethoden  \n",
       "0           PayPal  \n",
       "1           PayPal  \n",
       "2           PayPal  \n",
       "3           PayPal  \n",
       "4           PayPal  "
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestellungenDf.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "id": "96eee8f4-a4d9-45f9-9669-2d5029d71963",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.401265Z",
     "iopub.status.busy": "2024-12-17T14:12:12.400830Z",
     "iopub.status.idle": "2024-12-17T14:12:12.412406Z",
     "shell.execute_reply": "2024-12-17T14:12:12.411715Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.401237Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>BestellNr</th>\n",
       "      <th>Position</th>\n",
       "      <th>Vorstellung</th>\n",
       "      <th>Datum</th>\n",
       "      <th>Sitzbereich</th>\n",
       "      <th>Sitzplatz</th>\n",
       "      <th>Sitzreihe</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10300</td>\n",
       "      <td>1</td>\n",
       "      <td>Hexenjagd, Arthur Miller</td>\n",
       "      <td>2024-09-21 19:30:00</td>\n",
       "      <td>Tribüne</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10301</td>\n",
       "      <td>1</td>\n",
       "      <td>Hexenjagd, Arthur Miller</td>\n",
       "      <td>2024-09-21 19:30:00</td>\n",
       "      <td>Tribüne</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10301</td>\n",
       "      <td>2</td>\n",
       "      <td>Hexenjagd, Arthur Miller</td>\n",
       "      <td>2024-09-21 19:30:00</td>\n",
       "      <td>Tribüne</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10302</td>\n",
       "      <td>1</td>\n",
       "      <td>Hexenjagd, Arthur Miller</td>\n",
       "      <td>2024-09-27 19:30:00</td>\n",
       "      <td>Tribüne</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10302</td>\n",
       "      <td>2</td>\n",
       "      <td>Hexenjagd, Arthur Miller</td>\n",
       "      <td>2024-09-27 19:30:00</td>\n",
       "      <td>Tribüne</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   BestellNr  Position               Vorstellung                Datum  \\\n",
       "0      10300         1  Hexenjagd, Arthur Miller  2024-09-21 19:30:00   \n",
       "1      10301         1  Hexenjagd, Arthur Miller  2024-09-21 19:30:00   \n",
       "2      10301         2  Hexenjagd, Arthur Miller  2024-09-21 19:30:00   \n",
       "3      10302         1  Hexenjagd, Arthur Miller  2024-09-27 19:30:00   \n",
       "4      10302         2  Hexenjagd, Arthur Miller  2024-09-27 19:30:00   \n",
       "\n",
       "  Sitzbereich  Sitzplatz  Sitzreihe  \n",
       "0     Tribüne        1.0        1.0  \n",
       "1     Tribüne        2.0        1.0  \n",
       "2     Tribüne        3.0        1.0  \n",
       "3     Tribüne        1.0        2.0  \n",
       "4     Tribüne        2.0        2.0  "
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "positionenDf.head()"
   ]
  },
  {
   "cell_type": "raw",
   "id": "74914952-d3e6-4f3a-b591-ee4effc4b492",
   "metadata": {},
   "source": [
    "Nun sind wir bereit für die erste Aufgabe :-). Jede Teilaufgabe der Wochenaufgabe werden wir mit einer eigenen Funktion lösen."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f5daf17c-aed8-4fa2-a5ab-c320585ac900",
   "metadata": {},
   "source": [
    "<h3> Lösung 1.1.1 </h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "id": "22329b28-0775-40cd-ac2b-73d7621cbed2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.413805Z",
     "iopub.status.busy": "2024-12-17T14:12:12.413269Z",
     "iopub.status.idle": "2024-12-17T14:12:12.417270Z",
     "shell.execute_reply": "2024-12-17T14:12:12.416571Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.413778Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeAnzahlTheaterstuecke(df):\n",
    "    vorstellungSeries=df['Vorstellung']\n",
    "    anzahlUnterschiedlicherWerte=vorstellungSeries.nunique()\n",
    "    return anzahlUnterschiedlicherWerte"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "id": "451ce663-7568-4000-8a37-1cf0e7511a29",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.418660Z",
     "iopub.status.busy": "2024-12-17T14:12:12.418210Z",
     "iopub.status.idle": "2024-12-17T14:12:12.423142Z",
     "shell.execute_reply": "2024-12-17T14:12:12.422483Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.418632Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeAnzahlTheaterstuecke(positionenDf)"
   ]
  },
  {
   "cell_type": "raw",
   "id": "545d3662-23f0-477a-afe1-64daca45216d",
   "metadata": {},
   "source": [
    "Der Name unserer Funktion ist \"bestimmeAnzahlTheaterstuecke\". Diese Funktion erwartet den Dataframe, den sie auswerten soll. \n",
    "Wir rufen die Funktion daher mit:\n",
    "\n",
    "    bestimmeAnzahlTheaterstuecke(positionenDf)\n",
    "\n",
    "auf. Die gesuchte Anzahl Theaterstücke ist die Anzahl unterschiedlicher Werte in der Spalte \"Vorstellung\". Im ersten Schritt extrahieren wir eine Series mit ebendieser Spalte aus dem Dataframe. Der Dataframe heißt in der Funktion df. Die Series erhalten wir also mit:\n",
    "\n",
    "    vorstellungSeries=df['Vorstellung']\n",
    "\n",
    "Zur Bestimmung der unterschiedlichen Werte einer Series gibt es die Funktion nunique (vgl. https://pandas.pydata.org/docs/reference/series.html). Daher erhalten wir die unterschiedlichen Werte mit:\n",
    "\n",
    "    anzahlUnterschiedlicherWerte=vorstellungSeries.nunique()\n",
    "\n",
    "Zum Schluss geben wir die Werte zurück:\n",
    "\n",
    "    return anzahlUnterschiedlicherWerte\n",
    "\n",
    "Natürlich können wir auch alle Zwischenschritte weglassen und die notwendigen Anweisungen direkt verketten:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "id": "5d98ef3c-c852-41e8-9d69-f40bfb4eeeb8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.424364Z",
     "iopub.status.busy": "2024-12-17T14:12:12.424098Z",
     "iopub.status.idle": "2024-12-17T14:12:12.427577Z",
     "shell.execute_reply": "2024-12-17T14:12:12.426949Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.424339Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeAnzahlTheaterstueckeKuerzer(df):\n",
    "    return df['Vorstellung'].nunique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "id": "73d5bd32-d580-416f-8fea-78925b4e6254",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.430563Z",
     "iopub.status.busy": "2024-12-17T14:12:12.429961Z",
     "iopub.status.idle": "2024-12-17T14:12:12.434973Z",
     "shell.execute_reply": "2024-12-17T14:12:12.434267Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.430534Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeAnzahlTheaterstueckeKuerzer(positionenDf)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2944c6d7-bd83-45fc-8005-3a0aaff4b2b9",
   "metadata": {},
   "source": [
    "<h3> Lösung 1.1.2 </h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "id": "26302ddc-1796-4036-a6c7-9a49e6686fbd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.436414Z",
     "iopub.status.busy": "2024-12-17T14:12:12.435766Z",
     "iopub.status.idle": "2024-12-17T14:12:12.439981Z",
     "shell.execute_reply": "2024-12-17T14:12:12.439322Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.436381Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeDurchschnittProAuffuehrung(df):\n",
    "    dfGruppiertNachVorstellung=df.groupby('Vorstellung')\n",
    "    dfGruppiertNachVorstellungDavonDatum=dfGruppiertNachVorstellung['Datum']\n",
    "    gesamtAnzahlTicketsProTheaterstueckSeries=dfGruppiertNachVorstellungDavonDatum.count()\n",
    "    anzahlUnterschiedlicherDatumsProTheaterstueckSeries=dfGruppiertNachVorstellungDavonDatum.nunique()\n",
    "    return gesamtAnzahlTicketsProTheaterstueckSeries/anzahlUnterschiedlicherDatumsProTheaterstueckSeries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "id": "d5b748ba-1111-46a1-91cd-b71c2fb8ed8e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.441138Z",
     "iopub.status.busy": "2024-12-17T14:12:12.440877Z",
     "iopub.status.idle": "2024-12-17T14:12:12.448072Z",
     "shell.execute_reply": "2024-12-17T14:12:12.447404Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.441113Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Vorstellung\n",
       "Der zerbrochne Krug, Heinrich von Kleist    16.250000\n",
       "Die Räuber, Friedrich Schiller              16.250000\n",
       "Drei Männer im Schnee, Erich Kästner        59.000000\n",
       "Hexenjagd, Arthur Miller                    50.428571\n",
       "Viel Lärm um nichts, William Shakespeare     6.000000\n",
       "Name: Datum, dtype: float64"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeDurchschnittProAuffuehrung(positionenDf)"
   ]
  },
  {
   "cell_type": "raw",
   "id": "9ea4bf46-477a-4d08-b6b1-6476c26bd60d",
   "metadata": {},
   "source": [
    "In dieser Aufgabe sollen wir ausrechnen, wieviel Tickets pro Aufführung eines Theaterstück im Schnitt über alle Aufführungen des jeweiligen Theaterstücks verkauft werden. \n",
    "Um das zu machen müssen wir zunächst die Gesamtanzahl der verkauften Tickets pro Theaterstück bestimmen. Jetzt entspricht aber jeder Datensatz in der Datei \"theater_positionen.csv\" einem verkauften Ticket. Diese Datei haben wir auf den Dataframe \"positionenDf\" eingelesen. Jede Zeile in \"positionenDf\" ist also ein Ticket. Die Anzahl Zeilen pro Theaterstück in unserem Dataframe ist also die Gesamtanzahl verkaufter Tickets für die jeweiligen Theaterstücke.\n",
    "\n",
    "Wir benötigen also nur noch die Anzahl Vorstellungen. Woran erkennen wir eine Vorstellung? Jeder unterschiedliche Eintrag in der Spalte Datum ist eine Aufführung. Und die Anzahl unterschiedlicher Einträge in Datum bei gleichem Eintrag in Vorstellung (dort stehen ja die Theaterstücke) ist die Anzahl Aufführungen für das jeweilige Theaterstück.\n",
    "\n",
    "Betrachten wir jetzt die Realisiserung. Unsere Funktion heißt \"bestimmeDurchschnittProAuffuehrung\" und wird mit bestimmeDurchschnittProAuffuehrung(positionenDf) aufgerufen. In der Funktion heißt der Dataframe mit den Positionen dann df.\n",
    "\n",
    "Zunächst gruppieren wir den Dataframe nach der Spalte \"Vorstellung\".\n",
    "\n",
    "    dfGruppiertNachVorstellung=df.groupby('Vorstellung')\n",
    "\n",
    "Die unterschiedlichen Einträge in der Spalte \"Vorstellung\" sind ja die unterschiedlichen Theaterstücke und mit der Gruppierung haben wir die Zeilen pro Theaterstück im Zugriff. Als nächstes reduzieren wir die Gruppierung auf die Spalte \"Datum\". \n",
    "\n",
    "    dfGruppiertNachVorstellungDavonDatum=dfGruppiertNachVorstellung['Datum']\n",
    "\n",
    "Wenn wir die Datensätze jetzt zählen lassen, haben wir nach unseren Vorüberlegungen die Gesamtanzahl verkaufter Tickets pro Theaterstück. Das geht mit \"count\":\n",
    "\n",
    "    gesamtAnzahlTicketsProTheaterstueckSeries=dfGruppiertNachVorstellungDavonDatum.count()\n",
    "\n",
    "Fehlt noch die Anzahl Aufführungen pro Theaterstück. Aber das sind ja die unterschiedlichen Einträge in Datum und die erhalten wir wieder mit der Funktion nunique:\n",
    "\n",
    "    anzahlUnterschiedlicherDatumsProTheaterstueckSeries=dfGruppiertNachVorstellungDavonDatum.nunique()\n",
    "\n",
    "Nun müssen wir nur noch teilen und das Ergebnis zurückgeben:\n",
    "\n",
    "    return gesamtAnzahlTicketsProTheaterstueckSeries/anzahlUnterschiedlicherDatumsProTheaterstueckSeries\n",
    "\n",
    "Wenn Sie sich Zwischenergebnisse anschaue wollen, können Sie das mit print machen. Wenn Sie z.B. nach \n",
    "\n",
    "    gesamtAnzahlTicketsProTheaterstueckSeries=dfGruppiertNachVorstellungDavonDatum.count()\n",
    "\n",
    "die Zeile \n",
    "\n",
    "    print(gesamtAnzahlTicketsProTheaterstueckSeries)\n",
    "\n",
    "einfügen, sehen Sie die Anzahl verkaufter Tickets pro Theaterstück.\n",
    "\n",
    "Wie meistens können wir uns die Schritte über die Zwischenvariablen schenken und die Funktion stark verkürzen:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "id": "4206a890-0dbf-4c2f-b541-660119a50b9b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.449505Z",
     "iopub.status.busy": "2024-12-17T14:12:12.448940Z",
     "iopub.status.idle": "2024-12-17T14:12:12.452826Z",
     "shell.execute_reply": "2024-12-17T14:12:12.452142Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.449476Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeDurchschnittProAuffuehrungKuerzer(df):    \n",
    "    return df.groupby('Vorstellung')['Datum'].count()/df.groupby('Vorstellung')['Datum'].nunique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "id": "8f6d7da6-0e5a-4a17-8acb-27ef9fc55ecf",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.454020Z",
     "iopub.status.busy": "2024-12-17T14:12:12.453754Z",
     "iopub.status.idle": "2024-12-17T14:12:12.461439Z",
     "shell.execute_reply": "2024-12-17T14:12:12.460778Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.453994Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Vorstellung\n",
       "Der zerbrochne Krug, Heinrich von Kleist    16.250000\n",
       "Die Räuber, Friedrich Schiller              16.250000\n",
       "Drei Männer im Schnee, Erich Kästner        59.000000\n",
       "Hexenjagd, Arthur Miller                    50.428571\n",
       "Viel Lärm um nichts, William Shakespeare     6.000000\n",
       "Name: Datum, dtype: float64"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeDurchschnittProAuffuehrungKuerzer(positionenDf)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "72f9394a-bdf8-4cc4-bcc2-1d0ea3613a92",
   "metadata": {},
   "source": [
    "<h3> Lösung 1.1.3 </h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "id": "46c154e0-69f8-4811-8186-8d1d057d9938",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.462895Z",
     "iopub.status.busy": "2024-12-17T14:12:12.462297Z",
     "iopub.status.idle": "2024-12-17T14:12:12.466589Z",
     "shell.execute_reply": "2024-12-17T14:12:12.465922Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.462867Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeVerkaufskanalMitMeistenBestellungen(df):\n",
    "    bestellungenDfGruppiertNachVerkaufskanal=df.groupby(\"Verkaufskanal\")\n",
    "    bestellungenDfGruppiertNachVerkaufskanalReduziert=bestellungenDfGruppiertNachVerkaufskanal['BestellNr']\n",
    "    gesamtAnzahlBestellungenNachVerkaufskanalSeries=bestellungenDfGruppiertNachVerkaufskanalReduziert.count()\n",
    "    return gesamtAnzahlBestellungenNachVerkaufskanalSeries.idxmax()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "id": "444f8074-ba5f-4af6-bff9-2f457cf801a0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.467800Z",
     "iopub.status.busy": "2024-12-17T14:12:12.467409Z",
     "iopub.status.idle": "2024-12-17T14:12:12.472930Z",
     "shell.execute_reply": "2024-12-17T14:12:12.472262Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.467772Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Online-Shop'"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeVerkaufskanalMitMeistenBestellungen(bestellungenDf)"
   ]
  },
  {
   "cell_type": "raw",
   "id": "4620ae7a-1efb-44ac-a563-29e9a07dfd41",
   "metadata": {},
   "source": [
    "Jeder Datensatz in der Datei \"theater_bestellungen.csv\" ist eine Bestellung. Diese Datei haben wir auf den Dataframe \"bestellungenDf\" eingelesen. Jede Zeile in \"bestellungenDf\" ist also eine Bestellung. Die Anzahl Zeilen pro Verkaufskanal in unserem Dataframe ist also die Gesamtanzahl Bestellung für die jeweiligen Verkaufskanäle. Wir müssen also nur \"bestellungenDf\" nach \"Verkaufskanal\" gruppieren, die Datensätze dann zählen (das ist dann die Gesamtanzahl Bestellungen pro Vetriebskanal) und davon dann den Index des Maximums bestimmen.\n",
    "\n",
    "Betrachten wir jetzt die Realisiserung. Unsere Funktion heißt \"bestimmeVerkaufskanalMitMeistenBestellungen\" und wird mit bestimmeVerkaufskanalMitMeistenBestellungen(bestellungenDf) aufgerufen. In der Funktion heißt der Dataframe mit den Bestellungen dann df.\n",
    "\n",
    "Wir gruppieren zunächst nach Verkaufskanal:\n",
    "\n",
    "    bestellungenDfGruppiertNachVerkaufskanal=bestellungenDf.groupby(\"Verkaufskanal\")\n",
    "\n",
    "Danach reduzieren wir die Gruppierung wieder auf eine Spalte, damit wir nach dem Zählen eine Series erhalten, deren Index des Maximums dann wie gewünscht ein Wert ist:\n",
    "\n",
    "    bestellungenDfGruppiertNachVerkaufskanalReduziert=bestellungenDfGruppiertNachVerkaufskanal['BestellNr']\n",
    "\n",
    "Nun zählen wir die Bestellungen der einzelnen Verkaufskanäle:\n",
    "\n",
    "    gesamtAnzahlBestellungenNachVerkaufskanalSeries=bestellungenDfGruppiertNachVerkaufskanalReduziert.count()\n",
    "\n",
    "und geben dann den Index des Maximums zurück:\n",
    "\n",
    "    return gesamtAnzahlBestellungenNachVerkaufskanalSeries.idxmax()\n",
    "\n",
    "Auch hier sollten Sie sich die Zwischenergebnisse einmal anschauen (mit print, wie oben beschrieben). Natürlich können wir uns die Schritte über die Zwischenvariablen schenken und die Funktion stark verkürzen:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "id": "4280b6de-1d6f-4aeb-8226-816cca486f57",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.473957Z",
     "iopub.status.busy": "2024-12-17T14:12:12.473696Z",
     "iopub.status.idle": "2024-12-17T14:12:12.477409Z",
     "shell.execute_reply": "2024-12-17T14:12:12.476752Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.473930Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeVerkaufskanalMitMeistenBestellungenKuerzer(df):    \n",
    "    return df.groupby(\"Verkaufskanal\")['BestellNr'].count().idxmax()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "id": "f0628831-13fc-461a-b631-19a0055aa1a6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.478852Z",
     "iopub.status.busy": "2024-12-17T14:12:12.478362Z",
     "iopub.status.idle": "2024-12-17T14:12:12.483618Z",
     "shell.execute_reply": "2024-12-17T14:12:12.482979Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.478825Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Online-Shop'"
      ]
     },
     "execution_count": 122,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeVerkaufskanalMitMeistenBestellungenKuerzer(bestellungenDf)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6848b4d5-f4d3-45b0-99c8-47f920cd776e",
   "metadata": {},
   "source": [
    "<h3> Lösung 1.1.4 </h3>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "id": "d7e94a31-d841-4e74-b7ba-45926325dcb9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.484680Z",
     "iopub.status.busy": "2024-12-17T14:12:12.484401Z",
     "iopub.status.idle": "2024-12-17T14:12:12.488662Z",
     "shell.execute_reply": "2024-12-17T14:12:12.487985Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.484653Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeWochentagMitMeistenTickets(df):\n",
    "    veranstaltungsterminAlsDatumSeries=pd.to_datetime(df['Datum'])\n",
    "    df['Veranstaltungstag']=veranstaltungsterminAlsDatumSeries.dt.day_name()\n",
    "    dfGruppiertNachVeranstaltungstag=df.groupby('Veranstaltungstag')\n",
    "    dfGruppiertNachVeranstaltungstagReduziert=dfGruppiertNachVeranstaltungstag['BestellNr']\n",
    "    gesamtZahlTicketsProVeranstaltungstagSeries=dfGruppiertNachVeranstaltungstagReduziert.count()\n",
    "    return gesamtZahlTicketsProVeranstaltungstagSeries.idxmax()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "id": "b60d1307-d0ef-401d-8054-5c45440c4ff2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.489988Z",
     "iopub.status.busy": "2024-12-17T14:12:12.489717Z",
     "iopub.status.idle": "2024-12-17T14:12:12.497718Z",
     "shell.execute_reply": "2024-12-17T14:12:12.497061Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.489963Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Friday'"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeWochentagMitMeistenTickets(positionenDf)"
   ]
  },
  {
   "cell_type": "raw",
   "id": "a92704bd-5d02-4aff-ba35-35c2fb06eb00",
   "metadata": {},
   "source": [
    "Hier nutzen wir im Prinzip die gleiche Vorgehensweise wie bei der vorherigen Aufgabe. Wir benötigen im Unterschied den Dataframe positionenDf, da die Tickets die Datensätze dieses Dataframes sind. Die Wochentage, nach denen wir gruppieren müssen, sind im Urzustand nicht Bestandteil des Dataframes, die müssen wir bestimmen und dem Dataframe hinzufügen. Dafür nutzen wir die Datumsfunktionen von pandas. Dann gruppieren wir nach Wochentagen, reduzieren die Gruppierung auf eine Spalte, zählen pro Wochentag und holen dann den Index des Maximums, wie in Lösung 1.1.3.\n",
    "\n",
    "Betrachten wir jetzt die Realisiserung. Unsere Funktion heißt \"bestimmeWochentagMitMeistenTickets\" und wird mit bestimmeWochentagMitMeistenTickets(positionenDf) aufgerufen. In der Funktion heißt der Dataframe mit den Bestellungen dann df.\n",
    "\n",
    "Zunächst erzeugen wir aus der Datumspalte des Dataframes ein pandas datetime. Dies speichern wir auf einer Series:\n",
    "\n",
    "    veranstaltungsterminAlsDatumSeries=pd.to_datetime(df['Datum'])\n",
    "\n",
    "Hieraus erzeugen wir die Wochentage der Ticketverkäufes und fügen dies dem Dataframe hinzu:\n",
    "\n",
    "    df['Veranstaltungstag']=veranstaltungsterminAlsDatumSeries.dt.day_name()\n",
    "\n",
    "Jetzt geht es weiter wie in Lösung 1.1.3. Wir gruppieren nach Wochentag und reduzieren die Gruppierung auf eine Spalte:\n",
    "\n",
    "    dfGruppiertNachVeranstaltungstag=df.groupby('Veranstaltungstag')\n",
    "    dfGruppiertNachVeranstaltungstagReduziert=dfGruppiertNachVeranstaltungstag['BestellNr']\n",
    "\n",
    "Nun bestimmen wir über count die Anzahl der verkauften Tickets pro Wochentag, die ja wie in Lösung 1.1.2 bereits dargestellt, der Anzahl der Datensätze pro Wochentag entspricht:\n",
    "\n",
    "    gesamtZahlTicketsProVeranstaltungstagSeries=dfGruppiertNachVeranstaltungstagReduziert.count()\n",
    "\n",
    "Wir geben den Wochentag des maximalen Werts zurück:\n",
    "\n",
    "    return gesamtZahlTicketsProVeranstaltungstagSeries.idxmax()\n",
    "\n",
    "Natürlich können wir diese Funktion stark verkürzen:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "id": "17bb18a5-04b3-48a1-a9f5-477382f74fa8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.498781Z",
     "iopub.status.busy": "2024-12-17T14:12:12.498515Z",
     "iopub.status.idle": "2024-12-17T14:12:12.502506Z",
     "shell.execute_reply": "2024-12-17T14:12:12.501870Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.498754Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeWochentagMitMeistenTicketsKuerzer(df):\n",
    "    df['Veranstaltungstag']=pd.to_datetime(df['Datum']).dt.day_name()\n",
    "    return df.groupby('Veranstaltungstag')['BestellNr'].count().idxmax()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "id": "8aec3309-9ef0-4d92-b84c-715df9ebb240",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.503865Z",
     "iopub.status.busy": "2024-12-17T14:12:12.503350Z",
     "iopub.status.idle": "2024-12-17T14:12:12.511184Z",
     "shell.execute_reply": "2024-12-17T14:12:12.510544Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.503838Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Friday'"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeWochentagMitMeistenTicketsKuerzer(positionenDf)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6582513d-daab-4adc-9638-71d53e512085",
   "metadata": {},
   "source": [
    "<h2> Lösungen 1.2</h2>"
   ]
  },
  {
   "cell_type": "raw",
   "id": "0a915ea5-62be-4a7b-b7b6-dcebd75fbe3c",
   "metadata": {},
   "source": [
    "Um diese Aufgaben lösen zu können, benötigen wir Daten aus Bestellungen und Positionen. Diese haben wir zur Zeit auf 2 getrennten Dataframes, positionenDf und bestellungenDf. Im ersten Schritt erzeugen wir aus diesen beiden Dataframes einen Dataframe mit den Gesamtdaten, indem wir positionenDf und bestellungenDf über die BestellNr zu einem Dataframe verbinden:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "id": "492fc5a6-b873-4749-88db-06aef1617084",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.512665Z",
     "iopub.status.busy": "2024-12-17T14:12:12.512042Z",
     "iopub.status.idle": "2024-12-17T14:12:12.519172Z",
     "shell.execute_reply": "2024-12-17T14:12:12.518453Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.512636Z"
    }
   },
   "outputs": [],
   "source": [
    "bestellungenMitpositionenDf=bestellungenDf.merge(positionenDf)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "id": "f7049bf9-f2b5-4cbc-9787-2c7a3c9eaa7e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.520577Z",
     "iopub.status.busy": "2024-12-17T14:12:12.519971Z",
     "iopub.status.idle": "2024-12-17T14:12:12.532843Z",
     "shell.execute_reply": "2024-12-17T14:12:12.532263Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.520549Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>BestellNr</th>\n",
       "      <th>Bestelldatum</th>\n",
       "      <th>Bestelluhrzeit</th>\n",
       "      <th>Gesamtbetrag</th>\n",
       "      <th>Verkaufskanal</th>\n",
       "      <th>Zahlungsmethoden</th>\n",
       "      <th>Position</th>\n",
       "      <th>Vorstellung</th>\n",
       "      <th>Datum</th>\n",
       "      <th>Sitzbereich</th>\n",
       "      <th>Sitzplatz</th>\n",
       "      <th>Sitzreihe</th>\n",
       "      <th>Veranstaltungstag</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10300</td>\n",
       "      <td>2024-08-02</td>\n",
       "      <td>20:51:44</td>\n",
       "      <td>5</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>1</td>\n",
       "      <td>Hexenjagd, Arthur Miller</td>\n",
       "      <td>2024-09-21 19:30:00</td>\n",
       "      <td>Tribüne</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>Saturday</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10301</td>\n",
       "      <td>2024-08-02</td>\n",
       "      <td>20:55:46</td>\n",
       "      <td>17</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>1</td>\n",
       "      <td>Hexenjagd, Arthur Miller</td>\n",
       "      <td>2024-09-21 19:30:00</td>\n",
       "      <td>Tribüne</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>Saturday</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10301</td>\n",
       "      <td>2024-08-02</td>\n",
       "      <td>20:55:46</td>\n",
       "      <td>17</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>2</td>\n",
       "      <td>Hexenjagd, Arthur Miller</td>\n",
       "      <td>2024-09-21 19:30:00</td>\n",
       "      <td>Tribüne</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>Saturday</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10302</td>\n",
       "      <td>2024-08-07</td>\n",
       "      <td>20:29:39</td>\n",
       "      <td>36</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>1</td>\n",
       "      <td>Hexenjagd, Arthur Miller</td>\n",
       "      <td>2024-09-27 19:30:00</td>\n",
       "      <td>Tribüne</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Friday</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10302</td>\n",
       "      <td>2024-08-07</td>\n",
       "      <td>20:29:39</td>\n",
       "      <td>36</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>2</td>\n",
       "      <td>Hexenjagd, Arthur Miller</td>\n",
       "      <td>2024-09-27 19:30:00</td>\n",
       "      <td>Tribüne</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Friday</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   BestellNr Bestelldatum Bestelluhrzeit  Gesamtbetrag Verkaufskanal  \\\n",
       "0      10300   2024-08-02       20:51:44             5   Online-Shop   \n",
       "1      10301   2024-08-02       20:55:46            17   Online-Shop   \n",
       "2      10301   2024-08-02       20:55:46            17   Online-Shop   \n",
       "3      10302   2024-08-07       20:29:39            36   Online-Shop   \n",
       "4      10302   2024-08-07       20:29:39            36   Online-Shop   \n",
       "\n",
       "  Zahlungsmethoden  Position               Vorstellung                Datum  \\\n",
       "0           PayPal         1  Hexenjagd, Arthur Miller  2024-09-21 19:30:00   \n",
       "1           PayPal         1  Hexenjagd, Arthur Miller  2024-09-21 19:30:00   \n",
       "2           PayPal         2  Hexenjagd, Arthur Miller  2024-09-21 19:30:00   \n",
       "3           PayPal         1  Hexenjagd, Arthur Miller  2024-09-27 19:30:00   \n",
       "4           PayPal         2  Hexenjagd, Arthur Miller  2024-09-27 19:30:00   \n",
       "\n",
       "  Sitzbereich  Sitzplatz  Sitzreihe Veranstaltungstag  \n",
       "0     Tribüne        1.0        1.0          Saturday  \n",
       "1     Tribüne        2.0        1.0          Saturday  \n",
       "2     Tribüne        3.0        1.0          Saturday  \n",
       "3     Tribüne        1.0        2.0            Friday  \n",
       "4     Tribüne        2.0        2.0            Friday  "
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestellungenMitpositionenDf.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "47262ec8-521f-4a2c-baed-23d37586a286",
   "metadata": {},
   "source": [
    "<h3> Lösung 1.2.1 </h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "id": "d2e895ff-b5c3-4a8c-b0cf-4f3067a02586",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.536211Z",
     "iopub.status.busy": "2024-12-17T14:12:12.536012Z",
     "iopub.status.idle": "2024-12-17T14:12:12.539556Z",
     "shell.execute_reply": "2024-12-17T14:12:12.538982Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.536192Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmedurchschnittlicheAnzahlTicketsProBestellung(df):\n",
    "    dfGruppiertNachBestellNr=df.groupby('BestellNr')\n",
    "    dfGruppiertNachBestellNrReduziert=dfGruppiertNachBestellNr['Position']\n",
    "    gesamtZahlTicketsProBestellungSeries=dfGruppiertNachBestellNrReduziert.count()\n",
    "    return gesamtZahlTicketsProBestellungSeries.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "id": "2d4e75d1-4188-46e9-85b1-ae250447a582",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.540317Z",
     "iopub.status.busy": "2024-12-17T14:12:12.540130Z",
     "iopub.status.idle": "2024-12-17T14:12:12.545037Z",
     "shell.execute_reply": "2024-12-17T14:12:12.544421Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.540299Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(2.3434343434343434)"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmedurchschnittlicheAnzahlTicketsProBestellung(bestellungenMitpositionenDf)"
   ]
  },
  {
   "cell_type": "raw",
   "id": "657cc691-7958-45a9-b977-8749b87f5e58",
   "metadata": {},
   "source": [
    "Um diese Aufgabe zu lösen, müssen wir die Anzahl Tickets pro Bestellung ermitteln. In unserem neuen Dataframe bestellungenMitpositionenDf entspricht aber jede Zeile einem bestellten Ticket. Überlegen Sie, warum das so ist! Vergleichen Sie dazu die Anzahl der Zeilen in bestellungenMitpositionenDf mit der Anzahl der Zeilen in positionenDf. \n",
    "\n",
    "Wenn wir also bestellungenMitpositionenDf nach BestellNr gruppieren und dann pro BestellNr zählen, erhalten wir also die Anzahl Tickets pro Bestellung. Wenn wir darüber den Mittelwert bilden, ist die Aufgabe gelöst.\n",
    "\n",
    "Betrachten wir jetzt die Realisiserung. Unsere Funktion heißt \"bestimmedurchschnittlicheAnzahlTicketsProBestellung\" und wird mit bestimmedurchschnittlicheAnzahlTicketsProBestellung(bestellungenMitpositionenDf) aufgerufen. In der Funktion heißt der Dataframe mit den zusammengefügten Bestellungen und Positionen dann df.\n",
    "\n",
    "Zuerst gruppieren wir nach BestellNr:\n",
    "\n",
    "    dfGruppiertNachBestellNr=df.groupby('BestellNr')\n",
    "\n",
    "Danach reduzieren wir die Gruppierung auf eine Spalte, damit wir nach dem Zählen eine Series erhalten und das Ergebnis der Mittelwertbildung eine Zahl ist. \n",
    "\n",
    "    dfGruppiertNachBestellNrReduziert=dfGruppiertNachBestellNr['Position']\n",
    "\n",
    "Dann zählen wir:\n",
    "\n",
    "    gesamtZahlTicketsProBestellungSeries=dfGruppiertNachBestellNrReduziert.count()\n",
    "\n",
    "und geben den Mittelwert zurück:\n",
    "\n",
    "    return gesamtZahlTicketsProBestellungSeries.mean()\n",
    "\n",
    "Um die Lösung besser zu verstehen, lassen Sie sich die gesamtZahlTicketsProBestellungSeries ausgeben (indem Sie die Zeile \n",
    "\n",
    "    print(gesamtZahlTicketsProBestellungSeries)\n",
    "\n",
    "nach \n",
    "\n",
    "    gesamtZahlTicketsProBestellungSeries=dfGruppiertNachBestellNrReduziert.count()\n",
    "\n",
    "einfügen.\n",
    "\n",
    "Schauen Sie sich auch an, was Sie von der Funktion zurückbekommen, wenn Sie auf die Reduzierung verzichten und direkt auf dem gruppierten Dataframe zählen. Also\n",
    "\n",
    "    dfGruppiertNachBestellNrReduziert=dfGruppiertNachBestellNr['Position'] \n",
    "\n",
    "weglassen und direkt\n",
    "\n",
    "    gesamtZahlTicketsProBestellungSeries=dfGruppiertNachBestellNr.count()\n",
    "\n",
    "ausführen und wieder mit print ausgeben. Ist dieses Ergebnis eine Series? Und was ensteht, wenn Sie darauf mean anwenden?\n",
    "\n",
    "Natürlich können wir diese Funktion stark verkürzen:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "id": "405dd68a-f1ac-4eb2-a8ab-4a10b035650a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.546037Z",
     "iopub.status.busy": "2024-12-17T14:12:12.545668Z",
     "iopub.status.idle": "2024-12-17T14:12:12.548902Z",
     "shell.execute_reply": "2024-12-17T14:12:12.548316Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.546016Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmedurchschnittlicheAnzahlTicketsProBestellungKuerzer(df):    \n",
    "    return df.groupby('BestellNr')['Position'].count().mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "id": "11ac169a-c69c-4650-bad8-06e7640c644e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.549845Z",
     "iopub.status.busy": "2024-12-17T14:12:12.549539Z",
     "iopub.status.idle": "2024-12-17T14:12:12.554113Z",
     "shell.execute_reply": "2024-12-17T14:12:12.553564Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.549826Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(2.3434343434343434)"
      ]
     },
     "execution_count": 132,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmedurchschnittlicheAnzahlTicketsProBestellungKuerzer(bestellungenMitpositionenDf)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "043dd543-b1e4-480e-bd7f-906c8e40d5b2",
   "metadata": {},
   "source": [
    "<h3> Lösung 1.2.2 </h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "id": "fecd101e-48b8-45a2-8423-936704a84865",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.555247Z",
     "iopub.status.busy": "2024-12-17T14:12:12.554792Z",
     "iopub.status.idle": "2024-12-17T14:12:12.558020Z",
     "shell.execute_reply": "2024-12-17T14:12:12.557464Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.555227Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeVerkaufteTicketsproVorstellungstermin(df):\n",
    "    dfGruppiertNachVorstellungstermin=df.groupby('Datum')\n",
    "    dfGruppiertNachVorstellungsterminReduziert=dfGruppiertNachVorstellungstermin['BestellNr']\n",
    "    return dfGruppiertNachVorstellungsterminReduziert.count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "id": "4a192d09-b1fa-4db1-85f0-a689f7d8f8b0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.559141Z",
     "iopub.status.busy": "2024-12-17T14:12:12.558659Z",
     "iopub.status.idle": "2024-12-17T14:12:12.564323Z",
     "shell.execute_reply": "2024-12-17T14:12:12.563775Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.559120Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Datum\n",
       "2024-09-20 19:30:00    45\n",
       "2024-09-21 19:30:00    53\n",
       "2024-09-22 19:30:00    18\n",
       "2024-09-27 19:30:00    59\n",
       "2024-09-29 19:30:00    60\n",
       "2024-10-03 19:30:00    54\n",
       "2024-10-04 19:30:00    64\n",
       "2024-11-14 20:00:00     2\n",
       "2024-11-15 20:00:00    18\n",
       "2024-11-16 20:00:00    27\n",
       "2024-11-19 20:00:00    18\n",
       "2024-12-06 19:30:00    78\n",
       "2024-12-07 19:30:00    40\n",
       "2025-02-07 19:30:00    30\n",
       "2025-02-08 19:30:00    19\n",
       "2025-02-09 18:00:00     7\n",
       "2025-02-14 19:30:00     9\n",
       "2025-02-15 19:30:00    29\n",
       "2025-02-16 18:00:00     9\n",
       "2025-02-20 19:30:00     9\n",
       "2025-02-21 19:30:00    18\n",
       "2025-03-27 19:00:00     4\n",
       "2025-03-28 19:00:00     9\n",
       "2025-03-30 17:00:00     8\n",
       "2025-04-05 19:00:00     7\n",
       "2025-04-08 19:00:00     2\n",
       "Name: BestellNr, dtype: int64"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeVerkaufteTicketsproVorstellungstermin(positionenDf)"
   ]
  },
  {
   "cell_type": "raw",
   "id": "a8df2f6e-8f65-4b15-bdd3-4e8a966a8204",
   "metadata": {},
   "source": [
    "Diese Aufgabe ist einfach. Wir benötigen auch nur den dataframe positionenDf. Und hier brauchen wir nur nach Datum gruppieren, die Gruppierung auf eine Spalte reduzieren und dann zählen. Damit dürfte die Funktion selbsterklärend sein.\n",
    "\n",
    "Geht selbstverständlich auch kürzer:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "id": "7264f7e8-e28d-40b5-bc5b-15626c22b8b5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.565160Z",
     "iopub.status.busy": "2024-12-17T14:12:12.564973Z",
     "iopub.status.idle": "2024-12-17T14:12:12.567982Z",
     "shell.execute_reply": "2024-12-17T14:12:12.567418Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.565143Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeVerkaufteTicketsproVorstellungsterminKuerzer(df):\n",
    "    return df.groupby('Datum')['BestellNr'].count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "id": "2fb68d9e-a751-41d2-9852-dec66a33df3c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.568809Z",
     "iopub.status.busy": "2024-12-17T14:12:12.568605Z",
     "iopub.status.idle": "2024-12-17T14:12:12.574116Z",
     "shell.execute_reply": "2024-12-17T14:12:12.573545Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.568792Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Datum\n",
       "2024-09-20 19:30:00    45\n",
       "2024-09-21 19:30:00    53\n",
       "2024-09-22 19:30:00    18\n",
       "2024-09-27 19:30:00    59\n",
       "2024-09-29 19:30:00    60\n",
       "2024-10-03 19:30:00    54\n",
       "2024-10-04 19:30:00    64\n",
       "2024-11-14 20:00:00     2\n",
       "2024-11-15 20:00:00    18\n",
       "2024-11-16 20:00:00    27\n",
       "2024-11-19 20:00:00    18\n",
       "2024-12-06 19:30:00    78\n",
       "2024-12-07 19:30:00    40\n",
       "2025-02-07 19:30:00    30\n",
       "2025-02-08 19:30:00    19\n",
       "2025-02-09 18:00:00     7\n",
       "2025-02-14 19:30:00     9\n",
       "2025-02-15 19:30:00    29\n",
       "2025-02-16 18:00:00     9\n",
       "2025-02-20 19:30:00     9\n",
       "2025-02-21 19:30:00    18\n",
       "2025-03-27 19:00:00     4\n",
       "2025-03-28 19:00:00     9\n",
       "2025-03-30 17:00:00     8\n",
       "2025-04-05 19:00:00     7\n",
       "2025-04-08 19:00:00     2\n",
       "Name: BestellNr, dtype: int64"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeVerkaufteTicketsproVorstellungsterminKuerzer(positionenDf)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87cb5749-c1e6-4002-912b-cf2f7a9af49d",
   "metadata": {},
   "source": [
    "<h3> Lösung 1.2.3 </h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "id": "771313ba-53a0-4be6-b3f4-0398730e7aae",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.575154Z",
     "iopub.status.busy": "2024-12-17T14:12:12.574772Z",
     "iopub.status.idle": "2024-12-17T14:12:12.578338Z",
     "shell.execute_reply": "2024-12-17T14:12:12.577780Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.575133Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeWochentagMitMeistenVerkauefen(df):\n",
    "    verkaufsterminAlsDatumSeries=pd.to_datetime(df['Bestelldatum'])\n",
    "    df['Verkaufstag']=verkaufsterminAlsDatumSeries.dt.day_name()\n",
    "    dfGruppiertNachVerkaufstag=df.groupby('Verkaufstag')\n",
    "    dfGruppiertNachVerkaufstagReduziert=dfGruppiertNachVerkaufstag['BestellNr']\n",
    "    gesamtZahlTicketsProVerkaufstagSeries=dfGruppiertNachVerkaufstagReduziert.count()\n",
    "    return gesamtZahlTicketsProVerkaufstagSeries.idxmax()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "id": "45e2d3e4-03e2-42c3-96e2-2de8bc510a83",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.579470Z",
     "iopub.status.busy": "2024-12-17T14:12:12.578984Z",
     "iopub.status.idle": "2024-12-17T14:12:12.585498Z",
     "shell.execute_reply": "2024-12-17T14:12:12.584914Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.579449Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Tuesday'"
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeWochentagMitMeistenVerkauefen(bestellungenMitpositionenDf)"
   ]
  },
  {
   "cell_type": "raw",
   "id": "692ade6e-6740-480d-b586-a977c1ad40c7",
   "metadata": {},
   "source": [
    "Betrachten wir jetzt die Realisiserung. Unsere Funktion heißt \"bestimmeWochentagMitMeistenVerkauefen\" und wird mit bestimmeWochentagMitMeistenVerkauefen(bestellungenMitpositionenDf) aufgerufen. In der Funktion heißt der Dataframe mit den zusammengefügten Bestellungen und Positionen dann df.\n",
    "\n",
    "Diese Funktion gibt den Wochentag mit den meisten verkauften Tickets zurück. Auf eine Diskussion verzichte ich, diese Lösung entspricht der Lösung 1.1.4, sie müssen nur Veranstaltungstag durch Verkaufstag und die Spalte Datum durch Bestelldatum ersetzen. \n",
    "\n",
    "Möchten Sie nicht nur einen Wochentag sondern mehrere verkaufsstarke Wochentage sehen, ändern Sie die Rückgabe (also die Zeile mit return) wie folgt:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "id": "5217932c-8d29-407f-9398-f29e2429bfe7",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.586640Z",
     "iopub.status.busy": "2024-12-17T14:12:12.586146Z",
     "iopub.status.idle": "2024-12-17T14:12:12.589825Z",
     "shell.execute_reply": "2024-12-17T14:12:12.589269Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.586620Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeWochentageMitMeistenVerkauefen(df):\n",
    "    verkaufsterminAlsDatumSeries=pd.to_datetime(df['Bestelldatum'])\n",
    "    df['Verkaufstag']=verkaufsterminAlsDatumSeries.dt.day_name()\n",
    "    dfGruppiertNachVerkaufstag=df.groupby('Verkaufstag')\n",
    "    dfGruppiertNachVerkaufstagReduziert=dfGruppiertNachVerkaufstag['BestellNr']\n",
    "    gesamtZahlTicketsProVerkaufstagSeries=dfGruppiertNachVerkaufstagReduziert.count()\n",
    "    return gesamtZahlTicketsProVerkaufstagSeries.sort_values(ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "id": "15bbc8c5-24af-45be-9816-db4efcdf9b32",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.590767Z",
     "iopub.status.busy": "2024-12-17T14:12:12.590571Z",
     "iopub.status.idle": "2024-12-17T14:12:12.597504Z",
     "shell.execute_reply": "2024-12-17T14:12:12.596952Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.590748Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Verkaufstag\n",
       "Tuesday      144\n",
       "Friday       117\n",
       "Monday       107\n",
       "Saturday      91\n",
       "Thursday      88\n",
       "Sunday        84\n",
       "Wednesday     65\n",
       "Name: BestellNr, dtype: int64"
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeWochentageMitMeistenVerkauefen(bestellungenMitpositionenDf)"
   ]
  },
  {
   "cell_type": "raw",
   "id": "1499614b-eae2-4a11-be34-87cea59a357e",
   "metadata": {},
   "source": [
    "Durch die Zeile\n",
    "\n",
    "return gesamtZahlTicketsProVerkaufstagSeries.sort_values(ascending=False)\n",
    "\n",
    "wird die Series der Verkäufe an Wochentagen absteigend sortiert zurückgegeben (vgl. https://pandas.pydata.org/docs/reference/api/pandas.Series.sort_values.html)."
   ]
  },
  {
   "cell_type": "raw",
   "id": "9715ecaa-db49-47e3-a114-42c9340e9a0f",
   "metadata": {},
   "source": [
    "Natürlich können wir diese Funktionen auch verkürzen:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "id": "ad579673-33f3-44f9-97ce-c0304d1ff144",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.598307Z",
     "iopub.status.busy": "2024-12-17T14:12:12.598102Z",
     "iopub.status.idle": "2024-12-17T14:12:12.601436Z",
     "shell.execute_reply": "2024-12-17T14:12:12.600862Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.598285Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeWochentagMitMeistenVerkauefenKuerzer(df):\n",
    "    df['Verkaufstag']=pd.to_datetime(df['Bestelldatum']).dt.day_name()    \n",
    "    return df.groupby('Verkaufstag')['BestellNr'].count().idxmax()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "id": "c2044c2e-95f5-46f5-8e8b-cb254fd0dd6c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.602280Z",
     "iopub.status.busy": "2024-12-17T14:12:12.602088Z",
     "iopub.status.idle": "2024-12-17T14:12:12.608396Z",
     "shell.execute_reply": "2024-12-17T14:12:12.607850Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.602262Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Tuesday'"
      ]
     },
     "execution_count": 142,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeWochentagMitMeistenVerkauefenKuerzer(bestellungenMitpositionenDf)"
   ]
  },
  {
   "cell_type": "raw",
   "id": "cbe41249-3a8e-403c-889f-5f5fe95d076b",
   "metadata": {},
   "source": [
    "bzw.:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "id": "eef1b1db-1c56-498c-b35a-c4a0eb578bf8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.609251Z",
     "iopub.status.busy": "2024-12-17T14:12:12.609063Z",
     "iopub.status.idle": "2024-12-17T14:12:12.612401Z",
     "shell.execute_reply": "2024-12-17T14:12:12.611847Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.609234Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeWochentageMitMeistenVerkauefenKuerzer(df):\n",
    "    df['Verkaufstag']=pd.to_datetime(df['Bestelldatum']).dt.day_name()    \n",
    "    return df.groupby('Verkaufstag')['BestellNr'].count().sort_values(ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "id": "914e4be7-4409-4f9d-abd9-d790efba7493",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.613510Z",
     "iopub.status.busy": "2024-12-17T14:12:12.613050Z",
     "iopub.status.idle": "2024-12-17T14:12:12.620065Z",
     "shell.execute_reply": "2024-12-17T14:12:12.619508Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.613491Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Verkaufstag\n",
       "Tuesday      144\n",
       "Friday       117\n",
       "Monday       107\n",
       "Saturday      91\n",
       "Thursday      88\n",
       "Sunday        84\n",
       "Wednesday     65\n",
       "Name: BestellNr, dtype: int64"
      ]
     },
     "execution_count": 144,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeWochentageMitMeistenVerkauefenKuerzer(bestellungenMitpositionenDf)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ed7e3311-ff75-404c-b6bd-d60d6d4e8dec",
   "metadata": {},
   "source": [
    "<h3> Lösung 1.2.4 </h3>"
   ]
  },
  {
   "cell_type": "raw",
   "id": "8c80d5d4-dcf7-4c2c-b0f4-e10f23cf8f25",
   "metadata": {},
   "source": [
    "Die Aufgabe selber ist für Sie mit den Mitteln, die Sie bisher gelernt haben, nicht lösbar. Sie erfordert Gruppierung nach mehreren Spalten, was wir nicht behandelt haben.\n",
    "\n",
    "Wir zeigen eine Vorgehensweise, wie wir \"mit Hand\" zumindest eine Annäherung erreichen können: \n",
    "\n",
    "Zunächst schauen wir uns an, welche Verkaufskanäle es gibt. Die Verkaufskanäle finden wir in der Spalte Verkaufskanal:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "id": "810fd0b6-b743-45bf-8241-f2a1d973ba6f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T16:20:28.661317Z",
     "iopub.status.busy": "2024-12-17T16:20:28.661013Z",
     "iopub.status.idle": "2024-12-17T16:20:28.666212Z",
     "shell.execute_reply": "2024-12-17T16:20:28.665655Z",
     "shell.execute_reply.started": "2024-12-17T16:20:28.661292Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['Online-Shop', 'Vorverkaufsstellen'], dtype=object)"
      ]
     },
     "execution_count": 160,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestellungenMitpositionenDf['Verkaufskanal'].unique()"
   ]
  },
  {
   "cell_type": "raw",
   "id": "76c1c134-e7f6-4a4c-a729-f481c89b214a",
   "metadata": {},
   "source": [
    "Wir haben also nur zwei Verkaufskanäle: Online-Shop und Vorverkaufsstellen. Wir erzeugen nun für jeden Verkaufskanal einen auf diesen Verkaufskanal eingeschränkten Dataframe:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "id": "2d891003-0886-4e6a-9359-39d1d7c22eec",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T16:21:07.507731Z",
     "iopub.status.busy": "2024-12-17T16:21:07.507371Z",
     "iopub.status.idle": "2024-12-17T16:21:07.513484Z",
     "shell.execute_reply": "2024-12-17T16:21:07.512739Z",
     "shell.execute_reply.started": "2024-12-17T16:21:07.507703Z"
    }
   },
   "outputs": [],
   "source": [
    "bestellungenMitpositionenDfOnlineShop=bestellungenMitpositionenDf[bestellungenMitpositionenDf['Verkaufskanal']=='Online-Shop']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "id": "00cfec4f-aa7f-4701-8c57-671693ff5daf",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T16:21:15.620089Z",
     "iopub.status.busy": "2024-12-17T16:21:15.619365Z",
     "iopub.status.idle": "2024-12-17T16:21:15.623921Z",
     "shell.execute_reply": "2024-12-17T16:21:15.623504Z",
     "shell.execute_reply.started": "2024-12-17T16:21:15.620059Z"
    }
   },
   "outputs": [],
   "source": [
    "bestellungenMitpositionenDfVorverkaufsstellen=bestellungenMitpositionenDf[bestellungenMitpositionenDf['Verkaufskanal']=='Vorverkaufsstellen']"
   ]
  },
  {
   "cell_type": "raw",
   "id": "c313460e-ea86-4b7c-b620-4ee8f33dd02d",
   "metadata": {},
   "source": [
    "Nun bestimmen wir auf beiden Dataframes getrennt die verkaufsstärksten Tage. Dazu benutzen wir eine verkürzte Version der Lösung von 1.2.3, weil der Verkaufstag dort bereits der Lösung hinzugefügt wurde: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "id": "89d7a79a-d5f5-41f9-861d-e06decbbd113",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T16:21:48.259358Z",
     "iopub.status.busy": "2024-12-17T16:21:48.258995Z",
     "iopub.status.idle": "2024-12-17T16:21:48.263820Z",
     "shell.execute_reply": "2024-12-17T16:21:48.263079Z",
     "shell.execute_reply.started": "2024-12-17T16:21:48.259329Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeWochentageMitMeistenVerkauefenVerkaufstagBekannt(df):    \n",
    "    return df.groupby('Verkaufstag')['BestellNr'].count().sort_values(ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "id": "f4195992-a2c0-4503-8fbe-0c55d54c4d99",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T16:21:55.410374Z",
     "iopub.status.busy": "2024-12-17T16:21:55.410019Z",
     "iopub.status.idle": "2024-12-17T16:21:55.417409Z",
     "shell.execute_reply": "2024-12-17T16:21:55.416843Z",
     "shell.execute_reply.started": "2024-12-17T16:21:55.410347Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Verkaufstag\n",
       "Tuesday      106\n",
       "Friday        87\n",
       "Sunday        84\n",
       "Monday        80\n",
       "Thursday      77\n",
       "Saturday      59\n",
       "Wednesday     45\n",
       "Name: BestellNr, dtype: int64"
      ]
     },
     "execution_count": 164,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeWochentageMitMeistenVerkauefenVerkaufstagBekannt(bestellungenMitpositionenDfOnlineShop)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "id": "ffe7d616-eb4a-48d0-8c73-20fd5fac4954",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T16:22:28.435753Z",
     "iopub.status.busy": "2024-12-17T16:22:28.435400Z",
     "iopub.status.idle": "2024-12-17T16:22:28.443460Z",
     "shell.execute_reply": "2024-12-17T16:22:28.442770Z",
     "shell.execute_reply.started": "2024-12-17T16:22:28.435724Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Verkaufstag\n",
       "Tuesday      38\n",
       "Saturday     32\n",
       "Friday       30\n",
       "Monday       27\n",
       "Wednesday    20\n",
       "Thursday     11\n",
       "Name: BestellNr, dtype: int64"
      ]
     },
     "execution_count": 165,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeWochentageMitMeistenVerkauefenVerkaufstagBekannt(bestellungenMitpositionenDfVorverkaufsstellen)"
   ]
  },
  {
   "cell_type": "raw",
   "id": "67e1fe90-911a-4f14-9db0-a065d94f15f2",
   "metadata": {},
   "source": [
    "Das an beiden Wochenendtagen prozentual mehr Online-Käufe getätigt werden, können wir nicht bestätigen. Der Samstag ist an den Vorverkaufsstellen ein starker Tag, online nicht so. Am Sonntag hingegen wird an Vorverkaufsstellen - wenig überraschend - nichts verkauft."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3c42f715-9862-4b52-92c1-dac310673140",
   "metadata": {},
   "source": [
    "<h3> Lösung 1.2.5 </h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "id": "b9d2e21b-9f0a-4257-83bb-5987687e975f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.621207Z",
     "iopub.status.busy": "2024-12-17T14:12:12.620751Z",
     "iopub.status.idle": "2024-12-17T14:12:12.624047Z",
     "shell.execute_reply": "2024-12-17T14:12:12.623483Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.621186Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeFruehestenVorstellungstermin(df):\n",
    "    dfGruppiertNachBestellung=df.groupby('BestellNr')\n",
    "    dfGruppiertNachBestellungReduziert=dfGruppiertNachBestellung['Datum']\n",
    "    return dfGruppiertNachBestellungReduziert.min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "id": "007f4406-647a-4a96-94a3-96a4f3d38cd5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.624979Z",
     "iopub.status.busy": "2024-12-17T14:12:12.624787Z",
     "iopub.status.idle": "2024-12-17T14:12:12.644432Z",
     "shell.execute_reply": "2024-12-17T14:12:12.643986Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.624961Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "BestellNr\n",
       "10300    2024-09-21 19:30:00\n",
       "10301    2024-09-21 19:30:00\n",
       "10302    2024-09-27 19:30:00\n",
       "10303    2024-10-04 19:30:00\n",
       "10304    2024-09-27 19:30:00\n",
       "                ...         \n",
       "10595    2025-03-30 17:00:00\n",
       "10596    2025-02-07 19:30:00\n",
       "10597    2025-02-07 19:30:00\n",
       "10598    2025-02-07 19:30:00\n",
       "10600    2025-02-21 19:30:00\n",
       "Name: Datum, Length: 297, dtype: object"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeFruehestenVorstellungstermin(bestellungenMitpositionenDf)"
   ]
  },
  {
   "cell_type": "raw",
   "id": "2ce382c1-2e43-4a9b-95d8-4c1e1c078aba",
   "metadata": {},
   "source": [
    "Diese Lösung müsste nach den bisherigen Aufgaben selbsterklärend sein. Wir gruppieren nach BestellNr, reduzieren auf die Spalte Datum und bestimmen davon das Minimum.\n",
    "Die Lösung in kürzer:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "id": "a6632297-c3ab-4828-b4cb-c9ddf95929e7",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.645023Z",
     "iopub.status.busy": "2024-12-17T14:12:12.644904Z",
     "iopub.status.idle": "2024-12-17T14:12:12.647440Z",
     "shell.execute_reply": "2024-12-17T14:12:12.647000Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.645012Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeFruehestenVorstellungsterminKuerzer(df):    \n",
    "    return df.groupby('BestellNr')['Datum'].min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "id": "368786a5-486a-4da5-a121-61591f821ab9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.648021Z",
     "iopub.status.busy": "2024-12-17T14:12:12.647905Z",
     "iopub.status.idle": "2024-12-17T14:12:12.661779Z",
     "shell.execute_reply": "2024-12-17T14:12:12.661323Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.648011Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "BestellNr\n",
       "10300    2024-09-21 19:30:00\n",
       "10301    2024-09-21 19:30:00\n",
       "10302    2024-09-27 19:30:00\n",
       "10303    2024-10-04 19:30:00\n",
       "10304    2024-09-27 19:30:00\n",
       "                ...         \n",
       "10595    2025-03-30 17:00:00\n",
       "10596    2025-02-07 19:30:00\n",
       "10597    2025-02-07 19:30:00\n",
       "10598    2025-02-07 19:30:00\n",
       "10600    2025-02-21 19:30:00\n",
       "Name: Datum, Length: 297, dtype: object"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeFruehestenVorstellungsterminKuerzer(bestellungenMitpositionenDf)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d0e8c954-ba9e-4ae2-9cfb-38ef1f0c5c56",
   "metadata": {},
   "source": [
    "<h3> Lösung 1.2.6 </h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "id": "5da47f70-a759-4301-8d02-11c8ff720967",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.662312Z",
     "iopub.status.busy": "2024-12-17T14:12:12.662196Z",
     "iopub.status.idle": "2024-12-17T14:12:12.664952Z",
     "shell.execute_reply": "2024-12-17T14:12:12.664482Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.662301Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeTageVorabProVeranstaltung(df):\n",
    "    differenzDatumSeries=pd.to_datetime(df['Datum'])-pd.to_datetime(df['Bestelldatum'])\n",
    "    differenzDatumInTagenSeries=differenzDatumSeries.dt.days\n",
    "    df['TageVorab']=differenzDatumInTagenSeries\n",
    "    dfGruppiertNachVorstellung=df.groupby('Datum')\n",
    "    dfGruppiertNachVorstellungReduziert=dfGruppiertNachVorstellung['TageVorab']\n",
    "    return dfGruppiertNachVorstellungReduziert.mean()    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "id": "3d986347-598d-4cd9-b3c9-5fd513540f97",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.665524Z",
     "iopub.status.busy": "2024-12-17T14:12:12.665407Z",
     "iopub.status.idle": "2024-12-17T14:12:12.671511Z",
     "shell.execute_reply": "2024-12-17T14:12:12.671070Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.665514Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Datum\n",
       "2024-09-20 19:30:00     11.311111\n",
       "2024-09-21 19:30:00     13.188679\n",
       "2024-09-22 19:30:00      9.500000\n",
       "2024-09-27 19:30:00     17.949153\n",
       "2024-09-29 19:30:00     15.150000\n",
       "2024-10-03 19:30:00     12.185185\n",
       "2024-10-04 19:30:00     15.875000\n",
       "2024-11-14 20:00:00      0.000000\n",
       "2024-11-15 20:00:00     14.388889\n",
       "2024-11-16 20:00:00     13.111111\n",
       "2024-11-19 20:00:00      6.944444\n",
       "2024-12-06 19:30:00     16.653846\n",
       "2024-12-07 19:30:00     13.050000\n",
       "2025-02-07 19:30:00     66.600000\n",
       "2025-02-08 19:30:00     69.000000\n",
       "2025-02-09 18:00:00     67.285714\n",
       "2025-02-14 19:30:00     75.111111\n",
       "2025-02-15 19:30:00     76.482759\n",
       "2025-02-16 18:00:00     78.111111\n",
       "2025-02-20 19:30:00     76.333333\n",
       "2025-02-21 19:30:00     84.055556\n",
       "2025-03-27 19:00:00    115.000000\n",
       "2025-03-28 19:00:00    114.111111\n",
       "2025-03-30 17:00:00    114.000000\n",
       "2025-04-05 19:00:00    120.428571\n",
       "2025-04-08 19:00:00    121.000000\n",
       "Name: TageVorab, dtype: float64"
      ]
     },
     "execution_count": 150,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeTageVorabProVeranstaltung(bestellungenMitpositionenDf)"
   ]
  },
  {
   "cell_type": "raw",
   "id": "dd2155f9-1f8e-48c1-b3f5-f83f42ee260f",
   "metadata": {},
   "source": [
    "Betrachten wir jetzt die Realisiserung. Unsere Funktion heißt \"bestimmeTageVorabProVeranstaltung\" und wird mit bestimmeTageVorabProVeranstaltung(bestellungenMitpositionenDf) aufgerufen. In der Funktion heißt der Dataframe mit den zusammengefügten Bestellungen und Positionen dann df.\n",
    "\n",
    "Das Datum der eigentlichen Aufführung finden wir im Feld Datum, das Bestelldatum im Feld Bestelldatum.\n",
    "Nun gehen wir genau wie im Hinweis beschrieben vor: Wir wandeln das Aufführungs- und das Bestelldatum in den Datentyp datetime64 um und bilden die Differenz. Diese speichern wir in der Variablen differenzDatumSeries:\n",
    "\n",
    "    differenzDatumSeries=pd.to_datetime(df['Datum'])-pd.to_datetime(df['Bestelldatum'])\n",
    "\n",
    "Wir erzeugen die Differenz in Tagen:\n",
    "\n",
    "    differenzDatumInTagenSeries=differenzDatumSeries.dt.days\n",
    "\n",
    "und schreiben das Resultat in unseren dataframe zurück:\n",
    "\n",
    "    df['TageVorab']=differenzDatumInTagenSeries\n",
    "\n",
    "Nun geht es mit der bekannten Vorgehensweise weiter. Wir gruppieren zuächst nach Datum (das sind ja unsere Aufführungen oder Vorstellungen)\n",
    "\n",
    "    dfGruppiertNachVorstellung=df.groupby('Datum')    \n",
    "\n",
    "und reduzieren den so gewonnenen gruppierten Dataframe auf die Information, die wir brauchen (TageVorab):\n",
    "\n",
    "    dfGruppiertNachVorstellungReduziert=dfGruppiertNachVorstellung['TageVorab']\n",
    "\n",
    "Danach geben wir den Mittelwert (anderes Wort für Schnitt) zurück.\n",
    "\n",
    "    return dfGruppiertNachVorstellungReduziert.mean()    \n",
    "\n",
    "Natürlich können wir diese Funktion stark verkürzen:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "id": "2c65c318-d5c9-426a-a248-a3552b58820e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.672106Z",
     "iopub.status.busy": "2024-12-17T14:12:12.671987Z",
     "iopub.status.idle": "2024-12-17T14:12:12.674611Z",
     "shell.execute_reply": "2024-12-17T14:12:12.674168Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.672096Z"
    }
   },
   "outputs": [],
   "source": [
    "def bestimmeTageVorabProVeranstaltungKuerzer(df):\n",
    "    df['TageVorab']=(pd.to_datetime(df['Datum'])-pd.to_datetime(df['Bestelldatum'])).dt.days    \n",
    "    return df.groupby('Datum')['TageVorab'].mean()    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "id": "677e923d-b741-498e-bb9d-fc440c1b846a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.675200Z",
     "iopub.status.busy": "2024-12-17T14:12:12.675082Z",
     "iopub.status.idle": "2024-12-17T14:12:12.681019Z",
     "shell.execute_reply": "2024-12-17T14:12:12.680558Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.675190Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Datum\n",
       "2024-09-20 19:30:00     11.311111\n",
       "2024-09-21 19:30:00     13.188679\n",
       "2024-09-22 19:30:00      9.500000\n",
       "2024-09-27 19:30:00     17.949153\n",
       "2024-09-29 19:30:00     15.150000\n",
       "2024-10-03 19:30:00     12.185185\n",
       "2024-10-04 19:30:00     15.875000\n",
       "2024-11-14 20:00:00      0.000000\n",
       "2024-11-15 20:00:00     14.388889\n",
       "2024-11-16 20:00:00     13.111111\n",
       "2024-11-19 20:00:00      6.944444\n",
       "2024-12-06 19:30:00     16.653846\n",
       "2024-12-07 19:30:00     13.050000\n",
       "2025-02-07 19:30:00     66.600000\n",
       "2025-02-08 19:30:00     69.000000\n",
       "2025-02-09 18:00:00     67.285714\n",
       "2025-02-14 19:30:00     75.111111\n",
       "2025-02-15 19:30:00     76.482759\n",
       "2025-02-16 18:00:00     78.111111\n",
       "2025-02-20 19:30:00     76.333333\n",
       "2025-02-21 19:30:00     84.055556\n",
       "2025-03-27 19:00:00    115.000000\n",
       "2025-03-28 19:00:00    114.111111\n",
       "2025-03-30 17:00:00    114.000000\n",
       "2025-04-05 19:00:00    120.428571\n",
       "2025-04-08 19:00:00    121.000000\n",
       "Name: TageVorab, dtype: float64"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestimmeTageVorabProVeranstaltungKuerzer(bestellungenMitpositionenDf)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0b3891ce-fa5e-4ab6-b1d1-e27f66cf4277",
   "metadata": {},
   "source": [
    "<h3>Lösung 1.2.7 </h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "id": "6508c2e6-7bb0-415f-8b02-c9b0ea1456b1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.681553Z",
     "iopub.status.busy": "2024-12-17T14:12:12.681441Z",
     "iopub.status.idle": "2024-12-17T14:12:12.684216Z",
     "shell.execute_reply": "2024-12-17T14:12:12.683751Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.681543Z"
    }
   },
   "outputs": [],
   "source": [
    "def zahlungsGebuehr(betrag, art):\n",
    "    if art==\"PayPal\":\n",
    "        gebuehrenInProzent=0.01\n",
    "    elif art==\"Vorverkaufsstelle\":\n",
    "        gebuehrenInProzent=0.05\n",
    "    elif art==\"Kreditkarte über Stripe\":\n",
    "        gebuehrenInProzent=0.10\n",
    "    else:\n",
    "        gebuehrenInProzent=0\n",
    "    return betrag*gebuehrenInProzent\n",
    "    \n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "id": "6b604dab-c4a4-4a20-99f6-d62e3fb13ca1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.684737Z",
     "iopub.status.busy": "2024-12-17T14:12:12.684614Z",
     "iopub.status.idle": "2024-12-17T14:12:12.688196Z",
     "shell.execute_reply": "2024-12-17T14:12:12.687735Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.684727Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "zahlungsGebuehr(100, 'PayPal')"
   ]
  },
  {
   "cell_type": "raw",
   "id": "10e9acee-e71e-451c-b08e-be86e80a3e49",
   "metadata": {},
   "source": [
    "Kommen wir zur Realsisierung:\n",
    "\n",
    "Zunächst müssen wir uns einen Überblick über die Zahlungsarten verschaffen. Denn die erste Frage, die sich stellt, ist, wie wir die unterschiedlichen Zahlungsarten erkennen. Zunächst finden wir die Zahlungsarten offenbar in der Spalte Zahlungsmethoden. Wir schauen uns also an, was für unterschiedliche Zahlungsarten wir eigentlich in unseren Daten haben:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "id": "2aa9ea48-8ba0-4d58-bd56-004a9d7a9277",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.688773Z",
     "iopub.status.busy": "2024-12-17T14:12:12.688659Z",
     "iopub.status.idle": "2024-12-17T14:12:12.692084Z",
     "shell.execute_reply": "2024-12-17T14:12:12.691630Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.688763Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['PayPal', 'Vorverkaufsstelle', 'Manuelle Zahlung', nan,\n",
       "       'Wertgutschein / Geschenkgutschein', 'Kreditkarte über Stripe',\n",
       "       'Wertgutschein / Geschenkgutschein, PayPal', 'KulturPass'],\n",
       "      dtype=object)"
      ]
     },
     "execution_count": 155,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestellungenDf['Zahlungsmethoden'].unique()"
   ]
  },
  {
   "cell_type": "raw",
   "id": "26601fd8-cef8-46fe-abf9-d0f9a1ee3fe5",
   "metadata": {},
   "source": [
    "PayPal an sich ist einfach, die Zahlungsmethode heißt auch 'PayPal'. Kreditkarten sind 'Kreditkarte über Stripe' und Vorverkaufszahlungen heißen 'Vorverkaufsstelle' in unseren Daten.\n",
    "Bleibt noch 'Wertgutschein / Geschenkgutschein, PayPal'. Dies sind offenbar Bestellungen, die über 'Wertgutschein / Geschenkgutschein' erfolgt sind, aber ein Rest mit PayPal bezahlt wurde. Hier können wir den Daten nicht entnehmen für wieviel vom Gesamtbetrag wir Gebühren nehmen müssten. Konsequenterweise können wir in diesem Fall daher gar keine Gebühren nehmen. Überlegen Sie sich, wie Sie ermitteln können, ob dies ein größeres Problem ist!\n",
    "\n",
    "Mit diesen Vorüberlegungen können wir unsere Funktion nun schreiben. Zunächst bestimmen wir mit einem if/elif-Konstrukt die Gebühren in Prozent:\n",
    "\n",
    "    if art==\"PayPal\":\n",
    "        gebuehrenInProzent=0.01\n",
    "    elif art==\"Vorverkaufsstelle\":\n",
    "        gebuehrenInProzent=0.05\n",
    "    elif art==\"Kreditkarte über Stripe\":\n",
    "        gebuehrenInProzent=0.10\n",
    "    else:\n",
    "        gebuehrenInProzent=0\n",
    "\n",
    "Dann multiplizieren wir den Betrag der Bestellung mit den ermittelten Gebühren und geben das Ergebnis zurück:\n",
    "\n",
    "    return betrag*gebuehrenInProzent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ba137431-df88-4867-9e4a-c39b12a67a1f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "6a11bc6a-5316-4a86-9b34-cd1380189e36",
   "metadata": {},
   "source": [
    "<h3>Lösung 1.2.8</h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "id": "4c4d7918-7ee1-4e73-8af1-78584380db4e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.692682Z",
     "iopub.status.busy": "2024-12-17T14:12:12.692560Z",
     "iopub.status.idle": "2024-12-17T14:12:12.695380Z",
     "shell.execute_reply": "2024-12-17T14:12:12.694923Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.692672Z"
    }
   },
   "outputs": [],
   "source": [
    "def erstelleSpalteGebuehr(df):\n",
    "    for i in df.index:\n",
    "        betrag=df.loc[i, 'Gesamtbetrag']\n",
    "        zahlungsmethode=df.loc[i, 'Zahlungsmethoden']\n",
    "        gebuehr=zahlungsGebuehr(betrag, zahlungsmethode)\n",
    "        df.loc[i,'Gebuehr']=gebuehr\n",
    "    return df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "id": "16f8682b-f17a-4161-9ff2-35249edffec2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T14:12:12.695866Z",
     "iopub.status.busy": "2024-12-17T14:12:12.695756Z",
     "iopub.status.idle": "2024-12-17T14:12:12.742202Z",
     "shell.execute_reply": "2024-12-17T14:12:12.741729Z",
     "shell.execute_reply.started": "2024-12-17T14:12:12.695856Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>BestellNr</th>\n",
       "      <th>Bestelldatum</th>\n",
       "      <th>Bestelluhrzeit</th>\n",
       "      <th>Gesamtbetrag</th>\n",
       "      <th>Verkaufskanal</th>\n",
       "      <th>Zahlungsmethoden</th>\n",
       "      <th>Gebuehr</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10300</td>\n",
       "      <td>2024-08-02</td>\n",
       "      <td>20:51:44</td>\n",
       "      <td>5</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10301</td>\n",
       "      <td>2024-08-02</td>\n",
       "      <td>20:55:46</td>\n",
       "      <td>17</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10302</td>\n",
       "      <td>2024-08-07</td>\n",
       "      <td>20:29:39</td>\n",
       "      <td>36</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.36</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10303</td>\n",
       "      <td>2024-08-08</td>\n",
       "      <td>21:03:50</td>\n",
       "      <td>48</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.48</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10304</td>\n",
       "      <td>2024-08-09</td>\n",
       "      <td>13:11:27</td>\n",
       "      <td>36</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.36</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>292</th>\n",
       "      <td>10595</td>\n",
       "      <td>2024-12-09</td>\n",
       "      <td>15:15:04</td>\n",
       "      <td>48</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.48</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>293</th>\n",
       "      <td>10596</td>\n",
       "      <td>2024-12-09</td>\n",
       "      <td>17:55:07</td>\n",
       "      <td>36</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.36</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>294</th>\n",
       "      <td>10597</td>\n",
       "      <td>2024-12-09</td>\n",
       "      <td>23:03:43</td>\n",
       "      <td>48</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.48</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>295</th>\n",
       "      <td>10598</td>\n",
       "      <td>2024-12-10</td>\n",
       "      <td>08:33:16</td>\n",
       "      <td>24</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>296</th>\n",
       "      <td>10600</td>\n",
       "      <td>2024-12-10</td>\n",
       "      <td>11:46:50</td>\n",
       "      <td>24</td>\n",
       "      <td>Vorverkaufsstellen</td>\n",
       "      <td>Vorverkaufsstelle</td>\n",
       "      <td>1.20</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>297 rows × 7 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     BestellNr Bestelldatum Bestelluhrzeit  Gesamtbetrag       Verkaufskanal  \\\n",
       "0        10300   2024-08-02       20:51:44             5         Online-Shop   \n",
       "1        10301   2024-08-02       20:55:46            17         Online-Shop   \n",
       "2        10302   2024-08-07       20:29:39            36         Online-Shop   \n",
       "3        10303   2024-08-08       21:03:50            48         Online-Shop   \n",
       "4        10304   2024-08-09       13:11:27            36         Online-Shop   \n",
       "..         ...          ...            ...           ...                 ...   \n",
       "292      10595   2024-12-09       15:15:04            48         Online-Shop   \n",
       "293      10596   2024-12-09       17:55:07            36         Online-Shop   \n",
       "294      10597   2024-12-09       23:03:43            48         Online-Shop   \n",
       "295      10598   2024-12-10       08:33:16            24         Online-Shop   \n",
       "296      10600   2024-12-10       11:46:50            24  Vorverkaufsstellen   \n",
       "\n",
       "      Zahlungsmethoden  Gebuehr  \n",
       "0               PayPal     0.05  \n",
       "1               PayPal     0.17  \n",
       "2               PayPal     0.36  \n",
       "3               PayPal     0.48  \n",
       "4               PayPal     0.36  \n",
       "..                 ...      ...  \n",
       "292             PayPal     0.48  \n",
       "293             PayPal     0.36  \n",
       "294             PayPal     0.48  \n",
       "295             PayPal     0.24  \n",
       "296  Vorverkaufsstelle     1.20  \n",
       "\n",
       "[297 rows x 7 columns]"
      ]
     },
     "execution_count": 157,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "erstelleSpalteGebuehr(bestellungenDf)"
   ]
  },
  {
   "cell_type": "raw",
   "id": "384fe47e-d91b-4bca-83c0-60e972151044",
   "metadata": {},
   "source": [
    "Betrachten wir jetzt die Realisiserung. Unsere Funktion heißt \"erstelleSpalteGebuehr\" und wird mit erstelleSpalteGebuehr(bestellungenDf) aufgerufen. In der Funktion heißt der Dataframe dann df.\n",
    "\n",
    "Um die Aufgabe zu lösen, müssen wir unsere Funktion zahlungsGebuehr aus Lösung 1.2.7 auf jede Zeile des Dataframe bestellungenDf anwenden. \n",
    "\n",
    "Wir erinnern uns daran, dass der Zeilenindex des Dataframe df eine Series ist, die wir über df.index erreichen. Mit einer for-Schleife können wir dann über den Index iterieren. \n",
    "\n",
    "Betrachten wir die Lösung im Einzelnen:\n",
    "\n",
    "Die Zeile \n",
    "\n",
    "    for i in df.index:\n",
    "\n",
    "ist die for-Schleife über den Index. Sie bewirkt, dass die Variable i jeden Wert des Zeilenindexes annimmt. Das bedeutet, im ersten Schleifendurchlauf hat i den Wert 0, dann 1, dann 2 und am Ende 296 (vgl Tabelle über diesem Text, der Index ist die fette erste Spalte).\n",
    "\n",
    "Das bedeutet, dass wir in jedem Schleifendurchlauf eine Zeile des Dataframe bearbeiten können.\n",
    "\n",
    "In der Schleife (das bedeutet für jede Zeile) lesen wir dann die Werte aus, die wir für die Berechnung der Gebühr benötigen:\n",
    "\n",
    "        betrag=df.loc[i, 'Gesamtbetrag']\n",
    "        zahlungsmethode=df.loc[i, 'Zahlungsmethoden']\n",
    "\n",
    "Dann rufen wir unsere Funktion zahlungsGebuehr aus Lösung 1.2.7 auf und speichern das Ergebnis in der Variablen gebuehr.\n",
    "\n",
    "        gebuehr=zahlungsGebuehr(betrag, zahlungsmethode)\n",
    "\n",
    "Im nächsten Schritt schreiben wir das Ergebnis in die neue Spalte Gebuehr des Dataframe. \n",
    "\n",
    "        df.loc[i,'Gebuehr']=gebuehr\n",
    "\n",
    "Die Spalte Gebuehr muss dafür nicht existieren. Beim ersten Durchlauf der Schleife (also für den Index 0) erzeugt pandas die neue Spalte Gebuehr des Dataframe und schreibt den ersten Wert (0.05 s. Tabelle oberhalb) auf den Index 0 der Spalte. Die Werte der übrigen Zeilen werden mit nan initialsisert. Bei jedem weiteren Schleifendurchlauf wird dann der nan-Wert der Spalte Gebuehr durch den ausgerechneten Wert überschrieben.\n",
    "\n",
    "Zum Schluss geben wir den Dataframe mit der neuen Spalte zurück.\n",
    "\n",
    "    return df\n",
    "\n",
    "Wie meistens können wir uns die Schritte über die Zwischenvariablen schenken und die Funktion stark verkürzen:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "id": "802794e7-e513-4310-b703-ca1b9f915db6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T15:29:29.659741Z",
     "iopub.status.busy": "2024-12-17T15:29:29.659486Z",
     "iopub.status.idle": "2024-12-17T15:29:29.663167Z",
     "shell.execute_reply": "2024-12-17T15:29:29.662655Z",
     "shell.execute_reply.started": "2024-12-17T15:29:29.659728Z"
    }
   },
   "outputs": [],
   "source": [
    "def erstelleSpalteGebuehrKuerzer(df):\n",
    "    for i in df.index:        \n",
    "        df.loc[i,'Gebuehr']=zahlungsGebuehr(df.loc[i, 'Gesamtbetrag'], df.loc[i, 'Zahlungsmethoden'])\n",
    "    return df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "id": "8d694090-5675-43b1-82ac-c8b589ada4c3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-12-17T15:29:45.361672Z",
     "iopub.status.busy": "2024-12-17T15:29:45.361324Z",
     "iopub.status.idle": "2024-12-17T15:29:45.447284Z",
     "shell.execute_reply": "2024-12-17T15:29:45.446647Z",
     "shell.execute_reply.started": "2024-12-17T15:29:45.361644Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>BestellNr</th>\n",
       "      <th>Bestelldatum</th>\n",
       "      <th>Bestelluhrzeit</th>\n",
       "      <th>Gesamtbetrag</th>\n",
       "      <th>Verkaufskanal</th>\n",
       "      <th>Zahlungsmethoden</th>\n",
       "      <th>Gebuehr</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10300</td>\n",
       "      <td>2024-08-02</td>\n",
       "      <td>20:51:44</td>\n",
       "      <td>5</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10301</td>\n",
       "      <td>2024-08-02</td>\n",
       "      <td>20:55:46</td>\n",
       "      <td>17</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10302</td>\n",
       "      <td>2024-08-07</td>\n",
       "      <td>20:29:39</td>\n",
       "      <td>36</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.36</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10303</td>\n",
       "      <td>2024-08-08</td>\n",
       "      <td>21:03:50</td>\n",
       "      <td>48</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.48</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10304</td>\n",
       "      <td>2024-08-09</td>\n",
       "      <td>13:11:27</td>\n",
       "      <td>36</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.36</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>292</th>\n",
       "      <td>10595</td>\n",
       "      <td>2024-12-09</td>\n",
       "      <td>15:15:04</td>\n",
       "      <td>48</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.48</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>293</th>\n",
       "      <td>10596</td>\n",
       "      <td>2024-12-09</td>\n",
       "      <td>17:55:07</td>\n",
       "      <td>36</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.36</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>294</th>\n",
       "      <td>10597</td>\n",
       "      <td>2024-12-09</td>\n",
       "      <td>23:03:43</td>\n",
       "      <td>48</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.48</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>295</th>\n",
       "      <td>10598</td>\n",
       "      <td>2024-12-10</td>\n",
       "      <td>08:33:16</td>\n",
       "      <td>24</td>\n",
       "      <td>Online-Shop</td>\n",
       "      <td>PayPal</td>\n",
       "      <td>0.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>296</th>\n",
       "      <td>10600</td>\n",
       "      <td>2024-12-10</td>\n",
       "      <td>11:46:50</td>\n",
       "      <td>24</td>\n",
       "      <td>Vorverkaufsstellen</td>\n",
       "      <td>Vorverkaufsstelle</td>\n",
       "      <td>1.20</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>297 rows × 7 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     BestellNr Bestelldatum Bestelluhrzeit  Gesamtbetrag       Verkaufskanal  \\\n",
       "0        10300   2024-08-02       20:51:44             5         Online-Shop   \n",
       "1        10301   2024-08-02       20:55:46            17         Online-Shop   \n",
       "2        10302   2024-08-07       20:29:39            36         Online-Shop   \n",
       "3        10303   2024-08-08       21:03:50            48         Online-Shop   \n",
       "4        10304   2024-08-09       13:11:27            36         Online-Shop   \n",
       "..         ...          ...            ...           ...                 ...   \n",
       "292      10595   2024-12-09       15:15:04            48         Online-Shop   \n",
       "293      10596   2024-12-09       17:55:07            36         Online-Shop   \n",
       "294      10597   2024-12-09       23:03:43            48         Online-Shop   \n",
       "295      10598   2024-12-10       08:33:16            24         Online-Shop   \n",
       "296      10600   2024-12-10       11:46:50            24  Vorverkaufsstellen   \n",
       "\n",
       "      Zahlungsmethoden  Gebuehr  \n",
       "0               PayPal     0.05  \n",
       "1               PayPal     0.17  \n",
       "2               PayPal     0.36  \n",
       "3               PayPal     0.48  \n",
       "4               PayPal     0.36  \n",
       "..                 ...      ...  \n",
       "292             PayPal     0.48  \n",
       "293             PayPal     0.36  \n",
       "294             PayPal     0.48  \n",
       "295             PayPal     0.24  \n",
       "296  Vorverkaufsstelle     1.20  \n",
       "\n",
       "[297 rows x 7 columns]"
      ]
     },
     "execution_count": 159,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "erstelleSpalteGebuehrKuerzer(bestellungenDf)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "13a17e13-ef51-4e60-b990-8c9012461e4b",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
