{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": "# Lernwerkstatt 01 — Erste Schritte mit Daten\n\n**Wirtschaftsinformatik · Brick-Flow AG · Wintersemester 2026/27**\n\n> **Leitfrage der Woche:** *Wovon hängt es ab, ob wir eine Frage aus unseren Daten beantworten können?*\n\nIn dieser Lernwerkstatt lernt ihr\n\n1. wie man ein Notebook bedient (Zellen ausführen),\n2. wie man mit Python **rechnet** (die Preisformel),\n3. wie man echte **Daten lädt** und sich einen Überblick verschafft,\n4. dass eine **Fehlermeldung** kein Grund zur Panik ist.\n\n### Eine Regel vorweg\n\n> **Eine Fehlermeldung ist die kooperativste Reaktion, die ein Computer geben kann — sie sagt genau, wo er nicht weiterkommt.** Wir lesen sie, statt zu erschrecken.\n\nIhr müsst **nichts** vorher können. Ausprobieren ist erwünscht — kaputtmachen könnt ihr nichts."
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Teil 0 — Ein Notebook bedienen\n",
    "\n",
    "Ein Notebook besteht aus **Zellen**. Diese hier ist Text. Die nächste ist Code.\n",
    "\n",
    "Klickt die Code-Zelle an und drückt **Shift + Enter**, um sie auszuführen."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(\"Hallo Brick-Flow!\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Unter der Zelle erscheint das Ergebnis. Glückwunsch — das war eure erste Ausführung.\n",
    "\n",
    "**Mini-Aufgabe:** Ändert den Text in der Zelle oben und führt sie erneut aus."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Teil 1 — Rechnen wie ein Computer: die Preisformel\n",
    "\n",
    "Brick-Flow verkauft **Individual-Paletten**. Der Preis folgt einer einfachen Formel:\n",
    "\n",
    "$$\\text{Preis} = \\text{Basispreis} + n_{\\text{Premium}} \\times 0{,}02\\,\\text{€}$$\n",
    "\n",
    "Jeder Premiumstein (Weiß oder Schwarz) kostet 0,02 € Aufschlag.\n",
    "\n",
    "Wir speichern Werte in **Variablen** und rechnen damit:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "basispreis = 19.90      # Standard-Palette (250 Steine)\n",
    "n_premium  = 120        # Anzahl Premiumsteine\n",
    "\n",
    "preis = basispreis + n_premium * 0.02\n",
    "print(preis)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Heraus kommt (bis auf eine winzige Rundungsabweichung) **22.3**, also 22,30 €. Computer speichern Dezimalzahlen binär; daher steht dort `22.299999999999997`. Mit `round(preis, 2)` rundet man auf Cent. (Python schreibt außerdem den Dezimalpunkt statt Komma.)\n",
    "\n",
    "**Mini-Aufgaben** (jeweils Werte oben ändern und neu ausführen, oder eine neue Zelle nutzen):\n",
    "\n",
    "1. Wie teuer ist eine Standard-Palette **ohne** Premiumsteine?\n",
    "2. Wie teuer mit **250** Premiumsteinen (alle Steine premium)?\n",
    "3. Eine **Jumbo-Palette** hat Basispreis 66,90 €. Preis mit 400 Premiumsteinen?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Platz für eure Rechnungen:\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Python als Taschenrechner: weitere Rechenoperatoren\n",
    "\n",
    "Plus, Minus und Mal kennt ihr schon. Python kann noch mehr:\n",
    "\n",
    "| Operator | Bedeutung | Beispiel | Ergebnis |\n",
    "|---|---|---|---|\n",
    "| `/` | Division (immer mit Dezimalstellen) | `7 / 2` | `3.5` |\n",
    "| `//` | Ganzzahlige Division (nur der ganze Teil) | `7 // 2` | `3` |\n",
    "| `%` | Rest der Division (Modulo) | `7 % 2` | `1` |\n",
    "| `**` | Potenz | `2 ** 10` | `1024` |\n",
    "\n",
    "Auch die Wurzel ist damit kein Problem — sie ist nichts anderes als „hoch 0,5\":\n",
    "\n",
    "$$\\sqrt{x} = x^{0{,}5}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(2 ** 10)      # Potenz: 2 hoch 10\n",
    "print(16 ** 0.5)    # Wurzel: Quadratwurzel von 16\n",
    "print(100 // 6)     # Ganzzahlige Division: wie oft passt 6 in 100?\n",
    "print(100 % 6)      # Rest: was bleibt übrig?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Klammern zählen wie in der Mathematik** — Punkt-vor-Strich gilt auch hier, `**` bindet\n",
    "sogar stärker als `*` und `/`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(2 + 3 * 4)     # zuerst 3*4=12, dann +2 -> 14\n",
    "print((2 + 3) * 4)   # Klammer zuerst: 5*4 -> 20\n",
    "print(3 + 4 ** 2)    # zuerst 4**2=16, dann +3 -> 19 (nicht 7**2!)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Mini-Aufgaben:**\n",
    "\n",
    "1. Eine Lieferung bringt 100 Klemmbausteine. Wie viele volle **6er-Sets** ergeben sich,\n",
    "   und wie viele Steine bleiben übrig? (Tipp: `//` für die Sets, `%` für den Rest.)\n",
    "2. Was ist die Quadratwurzel von 225?\n",
    "3. Berechnet mit Python: Was ergibt `3 + 4 ** 2`? Und was `(3 + 4) ** 2`? Warum unterscheiden sich die Ergebnisse?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Platz für eure Rechnungen:\n",
    ""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Teil 2 — Echte Daten laden\n",
    "\n",
    "Jetzt holen wir die echten **Bestelldaten** von Brick-Flow. Dafür nutzen wir `pandas`,\n",
    "das Standard-Werkzeug, um Tabellen in Python zu bearbeiten."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Die erste Fehlermeldung — mit Absicht\n",
    "\n",
    "Führt die nächste Zelle aus. Sie wird **fehlschlagen** — das ist gewollt.\n",
    "Lest die **letzte Zeile** der Fehlermeldung: Sie sagt euch genau, was los ist."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv(\"bestellungen.csv\")   # falscher Dateiname -> FileNotFoundError"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ganz unten steht `FileNotFoundError: ... 'bestellungen.csv'`.\n",
    "Übersetzt: *„Diese Datei finde ich nicht.“* Kein Drama: Wir müssen Python nur sagen, wo die richtige Datei liegt.\n",
    "\n",
    "Die Datei `brickflow_bestellungen.csv` muss **im selben Ordner wie dieses Notebook** liegen. Auf dem **HS-Bochum-Jupyter-Cluster** (`jupyter.hs-bochum.de`) kopiert ihr sie dafür aus dem Kursordner dorthin oder ladet sie über den Upload-Knopf in der Dateiliste hoch.\n",
    "\n",
    "**Wo ist Python gerade, und was liegt dort?** Zwei Befehle verraten es:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "print(\"Arbeitsordner:\", os.getcwd())\n",
    "print(\"Dateien hier:\", os.listdir())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In der Liste muss `'brickflow_bestellungen.csv'` **genau so** stehen. Typische Abweichungen:\n",
    "\n",
    "- `brickflow_bestellungen (1).csv`: Die Datei wurde ein zweites Mal heruntergeladen. Umbenennen.\n",
    "- `brickflow_bestellungen.csv.csv`: Windows blendet Dateiendungen aus, die Endung wurde doppelt angehängt. Umbenennen.\n",
    "- Die Datei fehlt: Sie liegt in einem anderen Ordner als das Notebook. Hochladen oder verschieben."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv(\"brickflow_bestellungen.csv\")\n",
    "print(\"Zeilen:\", len(df))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ein erster Blick: `head()` und `info()`\n",
    "\n",
    "`head()` zeigt die ersten Zeilen, `info()` beschreibt die Spalten."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": "Ihr seht: **1.616 Zeilen** und **sechs Spalten** —\n`bestellnr`, `bestelldatum`, `kundennr`, `anzahl_pakete`, `bestellwert`, `code`.\n\n### Eine Frage aus der Vorlesung: die Farbe\n\n> *Welche Farbe verkauft sich am besten?*\n\n**Aufgabe:** Schaut die sechs Spaltennamen an. In welcher davon steht die **Farbe**?"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Tipp: so bekommt man nur die Spaltennamen\n",
    "list(df.columns)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Ergebnis:** Keine Spalte nennt eine Farbe. Die Frage ist mit *diesen* Daten\n",
    "**nicht beantwortbar** — nicht weil die Technik fehlt, sondern weil die Farbe nie\n",
    "erfasst wurde.\n",
    "\n",
    "> **Merksatz:** Eine Frage zu haben genügt nicht. Man braucht **Daten, die sie beantworten können.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Teil 3 — Lernwerkstattaufgaben (selbstständig)\n",
    "\n",
    "Arbeitet in eurem Tempo. Tutor:innen helfen. **Fehlermeldungen sind Hinweise, keine Niederlagen.**\n",
    "\n",
    "**Pflicht ist Aufgabe 3** (welche Fragen gehen, welche nicht). Die Aufgaben 1 und 2 (★) wiederholen die Preisformel aus Teil 1 und sind für alle, die schneller sind."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Aufgabe 1 (Sprinter ★) — Preise vergleichen.**\n",
    "Berechnet den Preis einer Standard-Palette (Basispreis 19,90 €) für **0**, **50** und\n",
    "**250** Premiumsteine. Was fällt beim Aufschlag auf?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Aufgabe 1:\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Aufgabe 2 (Sprinter ★) — Weitere Produkte.**\n",
    "Die Mini-Palette kostet 8,90 €, die Profi-Palette 36,90 € (Basispreis).\n",
    "Berechnet je einen Preis mit 30 Premiumsteinen."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Aufgabe 2:\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Aufgabe 3 — Welche Fragen gehen, welche nicht?**\n",
    "Ihr kennt jetzt die sechs Spalten. Notiert in der Zelle unten (als Kommentar oder Text)\n",
    "**zwei Fragen, die sich mit diesen Daten beantworten lassen**, und **zwei, die nicht gehen**.\n",
    "\n",
    "*Tipp zum Ausprobieren:* `df[\"bestellwert\"].sum()` summiert eine Spalte,\n",
    "`df[\"bestelldatum\"].min()` zeigt das früheste Datum."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Aufgabe 3 — probiert hier aus:\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Geschafft!\n",
    "\n",
    "Ihr habt heute\n",
    "\n",
    "- ein Notebook bedient und mit Variablen gerechnet,\n",
    "- echte Daten geladen und mit `head()` / `info()` erkundet,\n",
    "- eine Fehlermeldung gelesen, statt vor ihr zu erschrecken,\n",
    "- und gesehen, dass Daten nur beantworten, was jemand vorher erfasst hat.\n",
    "\n",
    "**Nächste Woche:** Was passiert eigentlich zwischen dem Klick auf „Bestellen“ und der\n",
    "Zahl im Monatsbericht? Wir folgen den Daten durch die Systeme."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.x"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
