{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "73478e1e",
   "metadata": {},
   "source": [
    "# Moduł 4: Data Governance i mini-katalog metadanych\n",
    "\n",
    "**Wersja:** uczestnika  \n",
    "**Cel:** zbudować kontrolowany katalog pól i wykryć luki w definicji, odpowiedzialności i regułach jakości  \n",
    "**Czas orientacyjny:** 35–45 min  \n",
    "**Dane:** metadata_catalog_seed.csv  \n",
    "**Artefakt końcowy:** mini-katalog + lista luk governance + RACI dla działania\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": "daf43457",
   "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": "c3eaa66c",
   "metadata": {},
   "source": [
    "## Granice interpretacji\n",
    "\n",
    "- Data Owner ma mandat do decyzji dotyczących znaczenia i akceptacji ryzyka w swojej domenie; szczegółowy podział ról zależy od organizacji.\n",
    "- Katalog nie zastępuje procesu eskalacji. Ma dostarczać kontekst potrzebny do decyzji.\n",
    "- Lokalna poprawka w notebooku może być zabezpieczeniem eksperymentu, ale nie usuwa źródłowej przyczyny."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2714e0d3",
   "metadata": {},
   "source": [
    "## Reguła operacyjna laboratorium\n",
    "RACI jest przypisane do działania, nie na stałe do stanowiska. W ćwiczeniu Data Owner odpowiada biznesowo za znaczenie i akceptację reguły, Data Steward prowadzi jakość operacyjną, Data Custodian/Data Engineer realizuje kontrolę techniczną, a Data Scientist nie przejmuje automatycznie odpowiedzialności za semantykę danych."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "585d3cd1",
   "metadata": {},
   "source": [
    "## Dane wejściowe i manifest\n",
    "Dane: `metadata_catalog_seed.csv`.  \n",
    "Opis kolumn i reguł laboratoryjnych: `manifests/M04_data_manifest.csv` w paczce zbiorczej albo `data_manifest.csv` w paczce modułowej."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "86f1c508",
   "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": "ad803f35",
   "metadata": {},
   "source": [
    "## 1. Wczytaj katalog i oceń kompletność metadanych\n",
    "\n",
    "Sprawdź, które pola nie mają definicji, Data Ownera, Data Stewarda albo reguły jakości."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a4adf957",
   "metadata": {
    "tags": [
     "exercise"
    ]
   },
   "outputs": [],
   "source": [
    "catalog = pd.read_csv(DATA_DIR/'metadata_catalog_seed.csv').fillna('')\n",
    "# TODO: gap flags"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c5fea7b",
   "metadata": {},
   "source": [
    "## 2. Zapytania do katalogu\n",
    "\n",
    "Znajdź pola używane przez scoring, które mają co najmniej jedną lukę metadata/governance."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0cde8f99",
   "metadata": {
    "tags": [
     "exercise"
    ]
   },
   "outputs": [],
   "source": [
    "# TODO: scoring_gaps"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dd197ad1",
   "metadata": {},
   "source": [
    "## 3. RACI dla konkretnego działania\n",
    "\n",
    "Zbuduj RACI dla trzech działań związanych z polem `age` i regułą laboratoryjną 18–110:\n",
    "1. zatwierdzenie definicji i reguły biznesowej,\n",
    "2. implementacja walidatora,\n",
    "3. obsługa i zamknięcie incydentu jakości.\n",
    "\n",
    "W tej wersji ćwiczenia Data Owner pozostaje odpowiedzialny biznesowo za regułę, Data Steward prowadzi jakość, a Data Custodian/Data Engineer implementuje kontrolę techniczną. Data Scientist może być konsultowany, ale nie przejmuje automatycznie semantyki pola. Każde działanie ma dokładnie jedno `A`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "58edd7a6",
   "metadata": {
    "tags": [
     "exercise"
    ]
   },
   "outputs": [],
   "source": [
    "raci = pd.DataFrame(columns=['action','R','A','C','I'])\n",
    "# TODO: dodaj 3 działania i przypisz role.\n",
    "# Kontrola: każde działanie ma R i dokładnie jedno A; C/I tylko gdy są potrzebne.\n",
    "display(raci)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2175af52",
   "metadata": {},
   "source": [
    "## Zadanie rozszerzające\n",
    "\n",
    "Dodaj do katalogu pole opisujące historię zmian albo wersję definicji i wyjaśnij, kiedy jest potrzebne."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "afa7fb2b",
   "metadata": {},
   "source": [
    "## Kryteria akceptacji ćwiczenia\n",
    "- wykrywasz luki definicji, Data Ownera, Data Stewarda i reguły jakości\n",
    "- dla ćwiczenia age używasz jednej reguły 18–110\n",
    "- każde działanie w RACI ma wykonawcę R i dokładnie jedną odpowiedzialność końcową A\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": "d55cc55c",
   "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": 4,
   "variant": "participant"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.x"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
