{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "oZjUvODbqhaC" }, "source": [ "# Google Colaboratory" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "O4xiNThbqxY4" }, "source": [ "Uno Jupyter notebook è un insieme di celle che permettono sia di annotare informazioni (Celle di Testo) che di scrivere codice (Celle di Codice ). " ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "6QXcdFfbrhsK" }, "source": [ "## Text Cell \n", "\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "eic-gYY7viEU" }, "source": [ "Una cella di testo è una cella utilizzata per annotare appunti in modo semplice e veloce. Al fine di annotare velocemente informazioni si utilizza un astrazione del linguaggio html chiamato Markdown. Questo linguaggio permette velocemnte e in modo poco verbose di scrivere codice html. " ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "aiO2PUKjsQrZ" }, "source": [ "### Markdown \n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "MKpimnpTvmOm" }, "source": [ "Riassumiamo le principali caratteristiche del linguaggio Markdown che utilizzeremo per scrivere appunti nei nostri notebook.\n", "\n", "Maggiori informazioni sul linguaggio Markdown si posso trovare leggendo [Markdown Guide](https://colab.research.google.com/notebooks/markdown_guide.ipynb) e l'articolo [Mastering Markdown](https://guides.github.com/features/mastering-markdown/)." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "RhLSUwhPtjzm" }, "source": [ "#### Headers\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "xWWtTmM1vpx-" }, "source": [ "> \n", " # h1\n", " ## h2\n", " ### h3\n", " #### h4\n", " #### h5\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "mOv-rVVfu_Q3" }, "source": [ "#### Bold e Italic\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "NWs9RM85vsRG" }, "source": [ "> **bold text** , *italicized text* ~~strikethrough~~\n", "> \n", " **bold text** , *italicized text* , ~~strikethrough~~\n", "\n", "\n", " \n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "UFaEWX_gvxZW" }, "source": [ "#### Blockquote\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "-QyRQUKiwbDE" }, "source": [ "\n", "> 1 blockquote\n", ">> 2 blockquote\n", "\n", "\n", "> \n", " > 1 blockquote\n", " >> 2 blockquote\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "UHXClGV2whAN" }, "source": [ "#### Liste" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "jvAdkhsmwdwA" }, "source": [ "Ordinate\n", "1. First item\n", "2. Second item\n", "3. Third item\n", "\n", "---\n", "\n", "Non ordinate\n", "> \n", " - First item\n", " - Second item\n", " - Third item\n", "\n", "\n", "- First item\n", "- Second item\n", "- Third item\n", "\n", "Lista di Task da fare\n", ">\n", " - [x] Write the press release\n", " - [ ] Update the website\n", " - [ ] Contact the media\n", "\n", "- [x] Write the press release\n", "- [ ] Update the website\n", "- [ ] Contact the media\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "gl2Wvji42X8V" }, "source": [ "#### Latex Math formula\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "mSqBaT7v0DyP" }, "source": [ "\n", "> \n", " 1. $\\sqrt{3x-1}+(1+x)^2.$\n", " 2. $y=x^2$\n", " 3. $e^{i\\pi} + 1 = 0$\n", " 4. $e^x=\\sum_{i=0}^\\infty \\frac{1}{i!}x^i$\n", " 5. $\\frac{n!}{k!(n-k)!} = {n \\choose k}$\n", " 6. $A_{m,n} =\\begin{pmatrix}\n", " a_{1,1} & a_{1,2} & \\cdots & a_{1,n} \\\\\n", " a_{2,1} & a_{2,2} & \\cdots & a_{2,n} \\\\\n", " \\vdots & \\vdots & \\ddots & \\vdots \\\\\n", " a_{m,1} & a_{m,2} & \\cdots & a_{m,n}\n", " \\end{pmatrix}$\n", "\n", "\n", "> 1) $\\sqrt{3x-1}+(1+x)^2.$\n", "\n", "> 2) $y=x^2$\n", "\n", "> 3) $e^{i\\pi} + 1 = 0$\n", "\n", "> 4) $e^x=\\sum_{i=0}^\\infty \\frac{1}{i!}x^i$\n", "\n", "> 5) $\\frac{n!}{k!(n-k)!} = {n \\choose k}$\n", "\n", "> 6) $A_{m,n} =\n", " \\begin{pmatrix}\n", " a_{1,1} & a_{1,2} & \\cdots & a_{1,n} \\\\\n", " a_{2,1} & a_{2,2} & \\cdots & a_{2,n} \\\\\n", " \\vdots & \\vdots & \\ddots & \\vdots \\\\\n", " a_{m,1} & a_{m,2} & \\cdots & a_{m,n}\n", " \\end{pmatrix}$\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "A23Asms-wz6T" }, "source": [ "#### Codice\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "vd92w1JFxddU" }, "source": [ ">\n", " ```\n", " codice\n", " ```\n", " \n", "```python\n", "import numpy as np\n", "a = np.array[1,2,3,4]\n", "print(\"Vettore:\", a)\n", "s = np.sum()\n", "print(\"Somma degli elementi del vettore: \" + s)\n", "```" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "MX9wOmgKxyBw" }, "source": [ "#### Link\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "wQZTXBkZyOzK" }, "source": [ "> \n", " [Github Repository](https://github.com/visiont3lab/tecnologie_data_science)\n", "\n", "[Github Repository](https://github.com/visiont3lab/tecnologie_data_science)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "THFS-ugLyKDz" }, "source": [ "#### Image" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "vr6NPQjGyqj7" }, "source": [ "> \n", " ![visionlab](https://raw.githubusercontent.com/visiont3lab/tecnologie_data_science/master/book/logo.png)\n", "\n", "![visionlab](https://raw.githubusercontent.com/visiont3lab/tecnologie_data_science/master/book/logo.png)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "CdJECheqzBUc" }, "source": [ "#### Table\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "UJxDXBqZzM19" }, "source": [ ">\n", "\t| Syntax | Description |\n", " | ----------- | ----------- |\n", " | Header | Title |\n", " | Paragraph | Text |\n", "\n", "| Syntax | Description |\n", "| ----------- | ----------- |\n", "| Header | Title |\n", "| Paragraph | Text |" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "GTvSPLUE2k-A" }, "source": [ "## Code Cell\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Fk2UDy_U36OM" }, "source": [ "Una cella di codice serve per eseguire un programma scritto in linguaggio python. In particolare utilizzeremo sempre Python 3 Jupyter notebook.\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "xKoClhZ337Ft" }, "source": [ "### Shortcut per eseguire codice\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "NPlE2u6P47eQ" }, "source": [ "* Cliccando l'icona di **Play** della cella il codice contenuto in essa viene eseguito.\n", "* Cliccando **Cmd/Ctrl+Enter** viene eseguito il codice della cella evidenziata.\n", "* Cliccando **Shift+Enter** viene eseguito il codice della cella evidenziata e il focus passa alla cella sucessiva.\n", "* Cliccando **Alt+Enter** viene eseguito il codice della cella e viene inserita anche un nuovo blocco di codice.\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "HhqD7dvQ5epq" }, "source": [ "### Suggerimenti e auto-completamento\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "_K6xnHAT5jWM" }, "source": [ "Google Colab ha un sistema di suggerimenti che viene triggerato schicciando Tab mentre si scrive codice. Esso è utile per scrivere velocemente codice ed evitare errori di sintassi." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "mvgNkjkU33sE" }, "outputs": [], "source": [ "# Importare la libreria numpy\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "jwNLfCxU7HND" }, "outputs": [], "source": [ "np.random. \n", "# Se si prova a scrivere np.random. vedremo\n", "# apparire dei suggerimenti\n", "# Se premiamo Tab apparirà anche la documentazione\n", "# associata alla funzione" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "KslBi0ea53P5" }, "outputs": [], "source": [ "np.random?\n", "# Premendo Shift-Enter viene aperta la documentazione\n", "# Il punto interrogativo alla fine chiama\n", "# la documentazione quando il codice viene \n", "# eseguito" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "oFEj2Tdc7m0o" }, "source": [ "### Esecuzione di comandi \n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "uuduJjV58f54" }, "source": [ "Google Colaboratory ci permette mediante uno Jupyter Notebook di eseguire il nostro codice Python e Mardown. Tuttavia è possibile che vi sia la necessità di installare programmi sul computer che ospita il nostro notebook. Per face ciò è necessario create una cella di codice e inserire il punto esclamativo **!** davanti all'istruzione che si vuole eseguire. Quest'ultima sarà un instruzione di sistema. Siccome la macchina che ospita il nostro notebook è una macchina linux è comune utilizzare il linguaggio **bash** per eseguire comando.\n", "\n", "Jupyter notebbok fornisce una lista di comandi che possono essere utilizzati per scrivere codice javascript (**%%javascript**), nascondere gli ouput del codice eseguito (**%%capture**) o creare un file utilizzando il notebook (**%%writefile**). Tali comandi vanno inseriti all'inizio del blocco di codice. La lista completa dei comandi si trova [Built-in-Magics Commands](https://ipython.readthedocs.io/en/stable/interactive/magics.html#cell-magics) " ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 33 }, "colab_type": "code", "id": "kKxrV6Ba-MX7", "outputId": "7c788d8a-06b3-40a1-ae6c-048a026358e8" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/content\n" ] } ], "source": [ "# Percorso file a cui sono\n", "!pwd" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 33 }, "colab_type": "code", "id": "nzaid7yf9aY_", "outputId": "0ffd722f-9fc0-4a3e-b842-5c081c9c89c3" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sample_data\n" ] } ], "source": [ "# Elencare i file contenuti in una cartella\n", "!ls" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 83 }, "colab_type": "code", "id": "bU9Od1Oi9a66", "outputId": "a2671dce-7b1c-46fe-a543-80cce022f985" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "anscombe.json\t\t mnist_test.csv\n", "california_housing_test.csv mnist_train_small.csv\n", "california_housing_train.csv README.md\n", "/content/sample_data\n" ] } ], "source": [ "# Elencare i file contenuti in una cartella\n", "!cd sample_data && ls " ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 33 }, "colab_type": "code", "id": "DUQS50tz9oXb", "outputId": "51c3e0d1-fe80-4cf7-f2d7-8bf643022ac3" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/content/sample_data\n" ] } ], "source": [ "# Entrare in un cartella\n", "%cd sample_data/ " ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 33 }, "colab_type": "code", "id": "3aNomQb-9xxF", "outputId": "f3827920-7da3-4a57-a880-a5ffd3644c2e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/content\n" ] } ], "source": [ "# Muovermi nella cartella superiore\n", "%cd .." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "f44jon7X-2fR" }, "outputs": [], "source": [ "# Nascondere l'output di un comando.\n", "# I comandi di installazione generano output verbosi che si \n", "# possono nascondere aggiungendo alla cella il comando\n", "%%capture\n", "\n", "# Installare un pacchetto python usando\n", "# pip package manager\n", "# !pip list # elencare i pacchetti installati\n", "!pip install names \n", "!apt-get -qq install -y libfluidsynth1" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 133 }, "colab_type": "code", "id": "sWag_S9cAu_K", "outputId": "7121e532-15a7-4365-c253-4d160502d389" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cloning into 'tecnologie_data_science'...\n", "remote: Enumerating objects: 41, done.\u001b[K\n", "remote: Counting objects: 100% (41/41), done.\u001b[K\n", "remote: Compressing objects: 100% (33/33), done.\u001b[K\n", "remote: Total 41 (delta 8), reused 12 (delta 0), pack-reused 0\u001b[K\n", "Unpacking objects: 100% (41/41), done.\n", "sample_data tecnologie_data_science\n" ] } ], "source": [ "# Clonare un repositorio git \n", "!git clone https://github.com/visiont3lab/tecnologie_data_science.git && ls" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 33 }, "colab_type": "code", "id": "XBkfgDSX_BX9", "outputId": "568e0e40-4de4-4e17-dd5d-7316132a57cd" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting myLib.py\n" ] } ], "source": [ "# Creazione di un file python myLib.py\n", "%%writefile myLib.py\n", "import numpy as np\n", "import plotly.graph_objects as go\n", "from matplotlib import pyplot as plt\n", "\n", "def myplot(x,y):\n", " #fig = go.Figure()\n", " #fig.add_trace( go.Scatter(x=x,y=y, mode=\"lines+markers\", name=\"Line\") )\n", " fig = plt.plot(x,y)\n", " return fig\n" ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 264 }, "colab_type": "code", "id": "HxnRidB4JWdh", "outputId": "85177256-2ea4-46ec-b15a-a1a8712d4bac" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "# Utilizzo del file mylib.py creato\n", "from importlib import reload \n", "import myLib\n", "myLib = reload(myLib)\n", "\n", "x = np.arange(0.0, 2.0, 0.01)\n", "y = 1 + np.sin(2 * np.pi * x)\n", "fig = myLib.myplot(x,y)\n" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 183 }, "colab_type": "code", "id": "hkf_xNEwD7lH", "outputId": "40afdc4a-6756-426f-d7cc-fa4d34354313" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "m.txt\n", "myLib.py\n", "name.txt\n", "__pycache__\n", "sample_data\n", "tecnologie_data_science\n", "test.py\n", "1\n", "2\n", "3\n" ] } ], "source": [ "%%script bash\n", "# È possibile scrivere codice bash\n", "ls > name.txt;\n", "cat name.txt\n", "for i in 1 2 3; do\n", " echo $i\n", "done" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "dtAVg2sDKS4O" }, "source": [ "## Montare Google Drive come hard disk esterno" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "uk-pQLgBLT7O" }, "source": [ "Una delle qualità di Google Colaboratory è il fatto che esso è connesso a Google Drive. Questo fa si che i notebook che vengono creati utilizzando Google Colab vengano automaticamente salvati nel drive dell'utente. Inoltre è possibile accedere al prorpio drive e lavorare con dei file contenuti in esso. Questo approccio è estramente interessante in quanto permette di combinare l'abilità di scrivere codice di Google Colab con le capacità di archiviazione file fornite da Google Drive. Di seguito `è riporatata la sequenza di comandi necessaria per montare il drive dell'utente all'interno di Google Colab. \n", "\n", "La sequenza di instruzioni sucessiva equivale al bottone chiamata **Mount Drive** che si a sinistra nel gruppo **Files**." ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 120 }, "colab_type": "code", "id": "n4LgN1RMKaFv", "outputId": "fda156fb-b770-4fa6-a7e9-825a8bb7cdeb" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly\n", "\n", "Enter your authorization code:\n", "··········\n", "Mounted at /content/drive\n" ] } ], "source": [ "from google.colab import drive\n", "drive.mount('/content/drive')" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 66 }, "colab_type": "code", "id": "LBpIP587KvUD", "outputId": "418997a7-9bfb-4dc3-8fc9-8297b3f68347" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/content/drive/My Drive/lessons/tecnologie_data_science\n", "_Dani Market-Basket-Analysis-master _template_PySpark\n", "_Manu tecnologie_data_science.xlsx\n" ] } ], "source": [ "%cd /content/drive/My Drive/lessons/tecnologie_data_science\n", "!ls" ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "google-colab.ipynb", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "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.6.9" } }, "nbformat": 4, "nbformat_minor": 1 }