{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "f395a81e",
   "metadata": {},
   "source": [
    "# Moduł 3: Cykl życia danych i źródła problemów jakości\n",
    "\n",
    "**Wersja:** uczestnika  \n",
    "**Cel:** zlokalizować mechanizm problemu w cyklu życia i pokazać utratę semantyki w transformacji  \n",
    "**Czas orientacyjny:** 35–45 min  \n",
    "**Dane:** customer360_lifecycle_raw.csv  \n",
    "**Artefakt końcowy:** porównanie przed/po ETL + tabela RCA\n",
    "\n",
    "Notebook jest częścią wspólnego case'u **Customer 360**. Dane są syntetyczne i służą wyłącznie ćwiczeniu."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b1ce3a6c",
   "metadata": {},
   "source": [
    "## Jak pracować\n",
    "\n",
    "1. Uruchamiaj komórki od góry do dołu.\n",
    "2. Najpierw zapisz obserwację z danych. Dopiero później formułuj hipotezę o przyczynie.\n",
    "3. W rekomendacji wskaż dowód, właściciela działania i warunek ponownej oceny.\n",
    "4. Wynik statystyczny jest sygnałem diagnostycznym. Sam nie przesądza o zatrzymaniu modelu, zmianie progu ani retrainingu."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "15480154",
   "metadata": {},
   "source": [
    "## Granice interpretacji\n",
    "\n",
    "- Objaw, np. Income=0 albo opóźnione zdarzenie, nie wskazuje automatycznie fazy powstania problemu.\n",
    "- Scalenie kilku statusów do jednej kategorii może być technicznie poprawne, a jednocześnie usuwać informację potrzebną do celu analitycznego.\n",
    "- W RCA zapisuj dowód potwierdzający mechanizm, a nie tylko nazwę etapu."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "01f34e16",
   "metadata": {},
   "source": [
    "## Reguła operacyjna laboratorium\n",
    "Latencję licz na kolejnych punktach cyklu życia, aby nie przypisywać całego opóźnienia jednemu etapowi. Próg 48 h jest parametrem ćwiczenia. Wniosek RCA wymaga dowodu z logów, harmonogramów lub metadanych procesu."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ac344ef9",
   "metadata": {},
   "source": [
    "## Dane wejściowe i manifest\n",
    "Dane: `customer360_lifecycle_raw.csv`.  \n",
    "Opis kolumn i reguł laboratoryjnych: `manifests/M03_data_manifest.csv` w paczce zbiorczej albo `data_manifest.csv` w paczce modułowej."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "58661224",
   "metadata": {
    "tags": [
     "setup"
    ]
   },
   "outputs": [],
   "source": [
    "from pathlib import Path\n",
    "import sys\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "DATA_DIR = Path('data')\n",
    "if not DATA_DIR.exists():\n",
    "    DATA_DIR = Path('..') / 'data'\n",
    "assert DATA_DIR.exists(), 'Nie znaleziono katalogu data. Uruchom notebook z katalogu paczki lub zachowaj strukturę ZIP.'\n",
    "print('Python:', sys.version.split()[0])\n",
    "print('pandas:', pd.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6073481a",
   "metadata": {},
   "source": [
    "## 1. Latencja na etapach cyklu życia\n",
    "\n",
    "Policz trzy odcinki czasu:\n",
    "- `event_time → recorded_time`,\n",
    "- `recorded_time → processed_time`,\n",
    "- `event_time → available_time`.\n",
    "\n",
    "Wskaż rekordy dostępne po więcej niż 48 h. To próg diagnostyczny ćwiczenia, nie ogólny standard SLA."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "583c3d24",
   "metadata": {
    "tags": [
     "exercise"
    ]
   },
   "outputs": [],
   "source": [
    "events = pd.read_csv(\n",
    "    DATA_DIR/'customer360_lifecycle_raw.csv',\n",
    "    parse_dates=['event_time','recorded_time','processed_time','available_time']\n",
    ")\n",
    "\n",
    "# TODO:\n",
    "# 1) oblicz event_to_record_h\n",
    "# 2) oblicz record_to_process_h\n",
    "# 3) oblicz event_to_available_h\n",
    "# 4) zbuduj latency_summary i delayed (>48 h)\n",
    "latency_summary = pd.DataFrame()\n",
    "delayed = pd.DataFrame()\n",
    "display(latency_summary)\n",
    "display(delayed)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3076fe35",
   "metadata": {},
   "source": [
    "## 2. Symulacja utraty semantyki w ETL\n",
    "\n",
    "Zmapuj szczegółowe statusy reklamacji do dwóch ogólnych klas i porównaj liczbę odrębnych wartości przed oraz po transformacji."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8546045d",
   "metadata": {
    "tags": [
     "exercise"
    ]
   },
   "outputs": [],
   "source": [
    "# TODO: utworz complaint_status_etl wedlug mapowania\n",
    "status_map = {}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0ceb9ca7",
   "metadata": {},
   "source": [
    "## 3. Mini-RCA\n",
    "\n",
    "Oddziel obserwację, etap cyklu życia, hipotezę mechanizmu i dowód potrzebny do potwierdzenia. Dla opóźnień wykorzystaj `dominant_stage`, ale nie traktuj go jako potwierdzonej przyczyny bez logów procesu."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "10f4edba",
   "metadata": {
    "tags": [
     "exercise"
    ]
   },
   "outputs": [],
   "source": [
    "rca = pd.DataFrame(columns=['observation','lifecycle_stage','hypothesis','evidence_needed'])\n",
    "# TODO: dodaj co najmniej 2 wiersze, w tym jeden dotyczący latencji per etap.\n",
    "display(rca)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "28e54914",
   "metadata": {},
   "source": [
    "## Zadanie rozszerzające\n",
    "\n",
    "Zaproponuj kontrolę shift-left dla jednego z problemów, ale wskaż dokładnie miejsce jej wykonania."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a106fcfe",
   "metadata": {},
   "source": [
    "## Kryteria akceptacji ćwiczenia\n",
    "- liczysz event→record, record→process i event→available w godzinach\n",
    "- wskazujesz rekordy przekraczające demonstracyjny próg 48 h\n",
    "- mini-RCA rozdziela obserwację, etap cyklu życia, hipotezę i dowód potrzebny do potwierdzenia\n",
    "\n",
    "Przed oddaniem wykonaj **Restart Kernel and Run All**. Notebook nie powinien zależeć od ręcznie ustawionego stanu poprzednich komórek."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0088d348",
   "metadata": {},
   "source": [
    "## Co oddajesz\n",
    "\n",
    "Zachowaj tabelę lub wykres będący wynikiem ćwiczenia oraz krótki komentarz: **obserwacja → hipoteza → potrzebny dowód → rekomendacja / dalszy krok**. Jeżeli nie da się rozstrzygnąć przyczyny na podstawie danych z notebooka, oznacz ją jako hipotezę i wskaż brakujący artefakt."
   ]
  }
 ],
 "metadata": {
  "course": {
   "generated": "2026-08-28",
   "module": 3,
   "variant": "participant"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.x"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
