{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ad9863f8",
   "metadata": {},
   "source": [
    "# Esame Laboratorio di Programmazione II\n",
    "\n",
    "Scrivete chiaramente sul notebook il vostro nome e matricola e salvate il file con il nome della vostra matricola.\n",
    "\n",
    "Per ogni funzione o metodo che richiede un campionamento rispetto ad una distribuzione, settate il seed a 0: `np.random.seed(0)`.\n",
    "\n",
    "Stampate il risultato delle domande e consegnate il compito eseguito: ogni cella deve avere il corrispondente output. Ad esempio, NON scrivete solo:\n",
    "\n",
    "```python\n",
    "lista = np.array([1, 2, 3])\n",
    "```\n",
    "\n",
    "ma:\n",
    "\n",
    "```python\n",
    "lista = np.array([1, 2, 3])\n",
    "print('lista =', lista)\n",
    "```\n",
    "\n",
    "NB: se l'output è una matrice molto grande, non dovete stamparla integralmente.\n",
    "\n",
    "Sarà valutata anche la presentazione: ad esempio, un plot senza titolo o senza etichette sugli assi sarà considerato incompleto.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2c821388",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Qui potete mettere gli import delle librerie \n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "057f3daf",
   "metadata": {},
   "source": [
    "## Esercizio 1\n",
    "\n",
    "Un gruppo di supereroi ha ottenuto i seguenti punteggi di energia dopo una missione:\n",
    "\n",
    "`72, 85, 61, 90, 77, 88, 54, 69, 95, 81, 73, 66`\n",
    "\n",
    "1. Crea un array NumPy `energia` con questi valori e calcola la **media**.\n",
    "2. Tutti i valori **strettamente minori di 70** devono essere aumentati di 8 punti. Aggiorna l'array in-place e stampa il nuovo array.\n",
    "3. Calcola quanti valori, dopo la correzione, sono **compresi tra 75 e 90 inclusi**.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "090f39a8",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "1a8ebee3",
   "metadata": {},
   "source": [
    "## Esercizio 2\n",
    "\n",
    "Un supereroe affronta una missione. L'esito della missione può essere:\n",
    "\n",
    "- `successo`, con probabilità 0.65;\n",
    "- `successo_parziale`, con probabilità 0.25;\n",
    "- `fallimento`, con probabilità 0.10.\n",
    "\n",
    "1. Scrivi una funzione `simula_missioni(N)` che simula `N` missioni e restituisce un array NumPy con gli esiti ottenuti.\n",
    "2. Per valori di `N = 50, 100, 150, ..., 500`, esegui una simulazione e calcola la frequenza relativa di `successo` e di `fallimento`.\n",
    "3. Rappresenta graficamente le frequenze relative di `successo` e `fallimento` in funzione di `N` e confrontale con i valori teorici.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fec7960b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "886730e1",
   "metadata": {},
   "source": [
    "## Esercizio 3\n",
    "\n",
    "1. Genera una matrice NumPy di dimensioni 6 × 8, con valori estratti da una distribuzione normale con media = 50 e deviazione standard = 10.\n",
    "\n",
    "2. Per ogni riga, individua il valore massimo e il valore minimo.\n",
    "\n",
    "3. Costruisci un array contenente, per ogni riga, la differenza tra il valore massimo e il valore minimo.\n",
    "\n",
    "4. Calcola quante righe hanno una differenza maggiore di 20."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ceb2583c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "94af6714",
   "metadata": {},
   "source": [
    "## Esercizio 4\n",
    "\n",
    "Utilizza il dataset `heroes.csv`, che contiene le seguenti colonne:\n",
    "\n",
    "`hero_id`, `hero`, `universe`, `strength`, `speed`, `intelligence`, `missions`, `success_rate`, `power_type`.\n",
    "\n",
    "1. Verifica la presenza di **valori mancanti per colonna** ed elimina le righe che ne contengono.\n",
    "\n",
    "2. Crea una nuova colonna `mission_score` definita come:\n",
    "\n",
    "   $$\n",
    "   \\texttt{mission\\_score}\n",
    "   =\n",
    "   \\texttt{missions}\n",
    "   \\times\n",
    "   \\texttt{success\\_rate}\n",
    "   $$\n",
    "\n",
    "3. Calcola il valore medio di `mission_score` per ciascun universo (`Marvel` e `DC`) e determina quale universo ha il valore medio più elevato.\n",
    "\n",
    "4. Crea un **grafico a barre** che mostri il valore medio di `mission_score` per ciascun universo.\n",
    "\n",
    "5. Crea uno **scatter plot** con:\n",
    "   - asse x = `strength`\n",
    "   - asse y = `success_rate`\n",
    "   - colore dei punti = `mission_score`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "44a51157",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "a865eddb",
   "metadata": {},
   "source": [
    "## Esercizio 5\n",
    "\n",
    "**Prima di svolgere questo esercizio, ricaricare il dataset originale `heroes.csv`.**\n",
    "\n",
    "Si utilizzi di nuovo il dataset `heroes.csv`.\n",
    "\n",
    "Svolgere le seguenti richieste:\n",
    "\n",
    "1. Determinare il numero di righe e di colonne del dataset ed eliminare la colonna `hero_id`.\n",
    "2. Individuare il `power_type` più frequente nel dataset.\n",
    "3. Calcolare la media di `success_rate` per ciascun `power_type` e ordinare i risultati dal valore medio più alto al più basso.\n",
    "4. Rappresentare la distribuzione di `success_rate` per ciascun `power_type` mediante un boxplot.\n",
    "5. Calcolare la percentuale di eroi con `success_rate >= 90` e con `success_rate < 90` **usando una list comprehension**, e rappresentare tali percentuali con un grafico a torta (pie chart).\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2d359775",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "732bb164",
   "metadata": {},
   "source": [
    "## Esercizio 6\n",
    "\n",
    "Hai a disposizione il dataset di coppie `(x, y)` qui sotto riportato.\n",
    "\n",
    "1. Stima i parametri della retta del tipo\n",
    "\n",
    "   $$\n",
    "   y = a \\cdot x + b\n",
    "   $$\n",
    "\n",
    "   usando `scipy.optimize.curve_fit`.\n",
    "2. Plotta i punti originali e la retta ottenuta.\n",
    "3. Calcola **MAE** (Mean Absolute Error) e **RMSE** (Root Mean Squared Error) tra i valori reali `y` e quelli stimati dal modello, dove:\n",
    "\n",
    "   $$\n",
    "   \\text{MAE} = \\frac{1}{n}\\sum_{i=1}^{n} \\lvert y_i - \\hat{y}_i \\rvert\n",
    "   $$  \n",
    "\n",
    "   $$\n",
    "   \\text{RMSE} = \\sqrt{\\frac{1}{n}\\sum_{i=1}^{n} (y_i - \\hat{y}_i)^2}\n",
    "   $$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "563e358b",
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.array([\n",
    "    0.0, 0.5, 1.0, 1.5, 2.0, 2.5,\n",
    "    3.0, 3.5, 4.0, 4.5, 5.0, 5.5,\n",
    "    6.0, 6.5, 7.0, 7.5, 8.0, 8.5,\n",
    "    9.0, 9.5, 10.0\n",
    "])\n",
    "\n",
    "y = np.array([\n",
    "    2.1, 3.2, 4.7, 6.0, 7.5, 8.8,\n",
    "    10.2, 12.0, 13.1, 14.9, 16.3, 17.8,\n",
    "    19.0, 20.7, 22.1, 23.6, 25.2, 26.4,\n",
    "    28.0, 29.3, 31.1\n",
    "])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "192acf1b",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "mio_ambiente",
   "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.11.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
