{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": "# 01 · Che cos’è una tabella?\n\nAl termine saprai individuare una riga, una colonna e una cella, spiegare che cosa rappresenta una riga e riconoscere una struttura che nasconde una variabile.\n\nEsegui il notebook dall’inizio alla fine in una nuova sessione Python su Kaggle. Servono pandas, scikit-learn, PySpark e una versione compatibile di Java. Se PySpark manca, installalo con `%pip install pyspark` in una cella di preparazione con Internet abilitato. I dati della lezione sono già disponibili.",
      "id": "cell-01"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": "## 1. Tabella\n\nUna tabella organizza osservazioni correlate in righe e colonne. Useremo un piccolo registro delle bevande ordinate in un bar.\n\nLa cella successiva importa pandas e PySpark. Una `SparkSession` è il punto di accesso alle tabelle Spark. `getOrCreate()` avvia una sessione o ne riusa una già attiva. `createDataFrame()` converte la nostra piccola tabella pandas in un DataFrame Spark. `show(3)` stampa fino a tre righe. Ritroverai questi strumenti nei notebook 2 e 3.",
      "id": "cell-02"
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": "import pandas as pd\nfrom pyspark.sql import SparkSession\n\nspark = SparkSession.builder.master(\"local[2]\").appName(\"01-what-is-a-table\").getOrCreate()\n\ncafe_pandas = pd.DataFrame(\n    [\n        (101, \"tea\", 2),\n        (101, \"coffee\", 1),\n        (102, \"tea\", 1),\n    ],\n    columns=[\"order_id\", \"drink\", \"quantity\"],\n)\ncafe = spark.createDataFrame(cafe_pandas)\ncafe.show(3)",
      "execution_count": null,
      "outputs": [],
      "id": "cell-03"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": "## 2. Riga\n\nLeggi una riga da sinistra a destra per vedere un’osservazione. La riga con `101`, `tea` e `2` registra due tè nell’ordine 101.\n\n## 3. Colonna\n\nLeggi una colonna dall’alto in basso per vedere i valori della stessa variabile. La colonna `quantity` indica quante unità della bevanda sono state ordinate in ogni riga.\n\n## 4. Cella\n\nUna cella si trova all’incrocio tra una riga e una colonna. All’incrocio tra la riga del caffè dell’ordine 101 e la colonna `quantity` trovi il valore `1`.\n\n## 5. Valore atomico\n\nUn valore atomico è un singolo valore rispetto alla domanda a cui risponde la colonna. In questo esempio ogni cella di `drink` indica una bevanda. Una cella con `tea, coffee` raggrupperebbe due bevande e renderebbe ambiguo come associare una quantità a ciascuna.\n\n## 6. Grana\n\nLa grana indica che cosa rappresenta una riga. In questa tabella ogni riga rappresenta **una riga d’ordine per una bevanda**. L’ordine 101 compare due volte perché ha due righe. In tutto ci sono tre righe d’ordine e due ordini.\n\n## 7. Dati ordinati\n\nNei dati ordinati (*tidy data*), ogni variabile ha una propria colonna, ogni osservazione ha una propria riga e ogni cella contiene un valore. La tabella del bar è ordinata alla grana della riga d’ordine. Una struttura con colonne `tea_qty` e `coffee_qty` codifica la variabile bevanda nelle intestazioni. Per tornare alla struttura per righe d’ordine, metti il nome della bevanda in `drink` e il numero di unità in `quantity`, con una riga per ogni riga d’ordine.",
      "id": "cell-04"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": "## Prova con una tabella pubblica\n\nScikit-learn include una copia del dataset pubblico Iris. `load_iris(as_frame=True).frame` lo carica come tabella pandas. Convertilo in Spark e osserva una piccola anteprima.",
      "id": "cell-05"
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": "from sklearn.datasets import load_iris\n\niris_pandas = load_iris(as_frame=True).frame\niris = spark.createDataFrame(iris_pandas)\niris.show(3)",
      "execution_count": null,
      "outputs": [],
      "id": "cell-06"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": "## Verifica la comprensione\n\n1. Quale colonna della tabella del bar indica il numero di unità in una riga?\n2. Perché l’ordine 101 può comparire due volte?\n3. Qual è la grana della tabella Iris? Che cosa rappresenta una cella di una colonna di misure?\n\n### Risposte\n\n1. `quantity`.\n2. Ogni riga rappresenta una riga d’ordine. L’ordine 101 ha una riga per il tè e una per il caffè.\n3. Ogni riga rappresenta un esemplare di iris. Una cella di misura contiene una misura di quell’esemplare in centimetri.",
      "id": "cell-07"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}
