{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# Donn\u00e9es multidimensionnelles SQL - \u00e9nonc\u00e9\n", "\n", "Ce notebook propose l'utilisation de SQL avec [SQLite](https://sqlite.org/) pour manipuler les donn\u00e9es depuis un notebook (avec le module [sqlite3](https://docs.python.org/3.6/library/sqlite3.html))."]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["Populating the interactive namespace from numpy and matplotlib\n"]}, {"data": {"text/html": ["Plan\n", "
\n", ""], "text/plain": [""]}, "execution_count": 2, "metadata": {}, "output_type": "execute_result"}], "source": ["%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "plt.style.use('ggplot')\n", "import pyensae\n", "from pyquickhelper.helpgen import NbImage\n", "from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Repr\u00e9sentation"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Le module [pandas](http://pandas.pydata.org/) manipule des tables et c'est la fa\u00e7on la plus commune de repr\u00e9senter les donn\u00e9es. Lorsque les donn\u00e9es sont multidimensionnelles, on distingue les coordonn\u00e9es des valeurs :"]}, {"cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [{"data": {"image/png": "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\nMRfbUUpwsiYIs0/V6F+IlbeKiZ0xF9tRSnCyJgizT9XoX4iVt4qJnTEX21FKcLImCLNP1ehfiJW3\niomdMRfbUUpwsiYIs0/V6F+IlbeKiZ0xF9tRSnCyJgizT9XoX4iVt4qJnTEX21FKcLImCLNP1ehf\niJW3iomdMRfbUUpwsiYIs0/V6F+IlbeKiZ0xF9tRSnCyJgizT9XoX4iVt4qJnTEX21FKcLImiCP2\n+cdbuM7Gk09/0cpX4q9fXz5uAucAQyIlEugCvf1MKvz7f79/eoEXSbz8+HtVuQc0ISXDfH+13bm9\ndri4MV79QSp4hNWqsb/7TipIgbbkqTP6fHnjpzzEm2+kwuLAlJCSe+DrL361Hx5++UIuaQVyRS/s\nhtnn4/DPxycuX8bYCqAKKdmBWkgM4iVK7PPzO39XF/zaNTYbrSys1pqf0VF7oCF56owmP3576uea\nxs1I6hWA6SAlt8+3136dXZh9Bqk6/JndAE61z2Jp8GxHHALt8/JFhE5IiRCcAZeDT4azTyb54Lgv\nfv1ntBpXGHz3yAcvaEaeOqPJZp+vv2Yl4VDy9MPPVLg297ej/PuG1x/8hyezT7PPGZxlnxzoEMW9\nHt0+twQwpaZ9cpmnE2RMXlgtuGzjIL63FjXQiDx1xhD4Ltde4QbubUf5T0iwvvjuwexTap/+k/4m\nVcUbM/ZjfpAwH4yQlRWYu2e3y4hHHBLhmHJBkswbP1lv4ahUBs3cAxdIyQE4q8axPJ595vhk6jnH\nw2KVJCZfLuJuNdy31aqF+SnOqSKgEXnqFgXPkc/f/8jLf75/5kqLE2fJnx+euxpmnwGYDFKijoG1\n9q9tN8s0+4wM2ec7fzIoggglyl8ehcYVVpRF4QeZdSHU7fIolVeQJO95fA47vV3bPqmL5IW3aZ/k\nA4GwWnvIuMH4JegAbchTtyz1OVJgjai59vI2ArNBShQiXGtfDRfX7DOC78qqKIUJRc1F+lwfCrNP\n+vXZCPrPtJ4Tx2CoWaGvlikgulTlW+yXYRDdJLe2hb5j2oXminvjRs0CVUjJIOEzRHn3VF7EsH8A\n0IyUjNOyT0yyeV4sfXGvml+I+i5xO3GXukAb8tQtDP6ECJ4/UC7JGSUHvfPh2W9/0kvrAvNBSlQi\nWGt/SI2La/YZGbNP4hDoakmpW6/UkK0+c9X3kzr3t+t3W8u0NEmOWo4HejvTPkMaIbi5Ze3TRXMh\nGkATUjJOyz7TTiu2Fs5nmj1ZtXq9AmafM8AjiJPI1rEy/yFMF3buJMCckBKd7K21L8wM1ewz4tWq\nNMuallr58sxLgsyxHUZl5CPZD+12xD4FSTJc1Ns17dMFPX3WxFZ1/j2gASkZp2mf/Fhi0NVvxK59\n9i71gDbkqVubcKD0wRwrqX26sNNnBswHKdFKb629uRaGavYZmWyfxCMLR2kekjDa9lmf+dCxilsP\nJAlwXp63HejtTPssid8cix106AAK9UnJOB37BOgegPS42dut1lodO33OA1USovPaNhArm4MGYDJI\niV5aa+3LyZqafUam2+dGIX+hcyzcuxdQd0v11EfpDeIkownRyNsODPl69unwCexPI3dk3wHqk5Jx\n/EoNuJcwz7JaexJwces9uQO0IU/d6oRf5YTo/MBtRvkt2vLAVJASvTTWOrzX7YX+5YYk0Qu7occ+\nEd95PCqJBZ126/3p5YvNpTBayewnSbLaqEV/YMjXtU/8JDHoNyJmZDhqn615JpBqzUnAtdg/nVOg\nEXnq1iZ44RsvrJKjRutb0kWBqSAlWmmutdnnY9onqSCWNtKt18rOXTzCJFF5yyHXoi/szaHx9BlO\n2HsrWwD1Sck4Y/Yp3BJ1tUbDpq3uAq3IU7cy2e8zhC/Ger+14rHTZwFMBSnRyfBa28vbyFT7dOKV\nK1elcSj9VPXcV5u1dfUNr2YgSRfJ7UJWTA67vW1UX82yQA1S0mdbGtJnSJ4Mhzj3wFekBdCClIzj\nM6znzc0S95GlqiysFseYjR3fK+wtBAs0I0/duhB9DF+MRV/cBJeoZ/zxk5tR1bOBuSAlGtlbawaz\nz0hQHCYyFRt0pjIKNYy/gUAj77yyqEar8pAhNryBHAS9pcIYvHzDBVLSp700eVb8nG/Bp9EB2pAS\nIZ1dFO0NP0tVQT4VCasN1ZQADclTtypohLmAZr/b4P6J5xUmBD9ktAwwHaREH/trzWD2GZlqn7Ek\nRt0EqBSfHpKqbps/7FMfbWWGVzioa7LNQ952pDcgz7Bx5oMrpGSfeuDcK+LaSA5bCCkRIrFPZt25\nsYirbZD5GTxt50Br8tStCaon/QFa1Nn0vWY4pqTYf7u7FjAlpEQb0rUmmH3eFN6xKksI0nnMKq4P\npEpKtKE/w/OAsZOnzjAuwXaUEpysCeJO7dOfFJmDBR5TzD5noT/D84Cxk6fOMC7BdpQSnKwJ4q7t\ns3qPGt5Y1u9XlQK5khJt6M/wPGDs5KkzjEuwHaUEJ2uCuFP77P10zJFfUXgsIFtSog39GZ4HjJ08\ndYZxCbajlOBkTRD3ap8b9Y/LXvBzIo8CpExKtKE/w/OAsZOnzjAuwXaUEpysCeKu7fP20b8QK28V\nEztjLrajlOBkTRBmn6rRvxArbxUTO2MutqOU4GRNEGafqlG+EP/x638a5MEzjMOYfSpBap9/cwGN\nLSx2gxjJmuBcWFhY3FGgF3aD91i4gP/P4lFD+UJ4/8B/rBeLD99iepjwKgnhQph9qg6zT81h9mkx\nN0x4lYTZ5z2E2afmMPu0mBsmvErC7PMewuxTc5h9WswNE14lYfZ5D2H2qTnMPi3mhgmvkjD7vIcw\n+9QcZp8Wc8OEV0mYfd5DmH1qDrNPi7lhwqskzD7vIcw+NYfZp8XcMOFVEqKF+Pff/wdIN1XiuDSp\nlgAAAABJRU5ErkJggg==\n", "text/plain": [""]}, "execution_count": 3, "metadata": {}, "output_type": "execute_result"}], "source": ["NbImage(\"cube1.png\")"]}, {"cell_type": "markdown", "metadata": {"collapsed": true}, "source": ["Dans cet exemple, il y a :\n", " \n", "* 3 coordonn\u00e9es : Age, Profession, Ann\u00e9ee\n", "* 2 valeurs : Esp\u00e9rance de vie, Population\n", "\n", "On peut repr\u00e9senter les donn\u00e9s \u00e9galement comme ceci :"]}, {"cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [{"data": {"image/png": "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\nYII=\n", "text/plain": [""]}, "execution_count": 4, "metadata": {}, "output_type": "execute_result"}], "source": ["NbImage(\"cube2.png\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["C'est assez simple. Prenons un exemple : [table de mortalit\u00e9 de 1960 \u00e0 2010](http://www.data-publica.com/opendata/7098--population-et-conditions-sociales-table-de-mortalite-de-1960-a-2010) qu'on r\u00e9cup\u00e8re \u00e0 l'aide de la fonction [table_mortalite_euro_stat](http://www.xavierdupre.fr/app/actuariat_python/helpsphinx/actuariat_python/data/population.html#actuariat_python.data.population.table_mortalite_euro_stat). C'est assez long (4-5 minutes) sur l'ensemble des donn\u00e9es car elles doivent \u00eatre pr\u00e9trait\u00e9es (voir la documentation de la fonction). Pour \u00e9couter, il faut utiliser le param\u00e8tre *stop_at*."]}, {"cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [{"data": {"text/plain": ["'mortalite.txt'"]}, "execution_count": 5, "metadata": {}, "output_type": "execute_result"}], "source": ["from actuariat_python.data import table_mortalite_euro_stat \n", "table_mortalite_euro_stat()"]}, {"cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [{"data": {"text/plain": ["os.stat_result(st_mode=33206, st_ino=4222124650782732, st_dev=2797837379, st_nlink=1, st_uid=0, st_gid=0, st_size=105075819, st_atime=1453573270, st_mtime=1453573285, st_ctime=1453573270)"]}, "execution_count": 6, "metadata": {}, "output_type": "execute_result"}], "source": ["import os\n", "os.stat(\"mortalite.txt\")"]}, {"cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [{"data": {"text/html": ["\n", "
\n", " \n", " \n", " | \n", " annee | \n", " valeur | \n", " age | \n", " age_num | \n", " indicateur | \n", " genre | \n", " pays | \n", "
\n", " \n", " \n", " \n", " 0 | \n", " 2009 | \n", " 0.00080 | \n", " Y01 | \n", " 1 | \n", " DEATHRATE | \n", " F | \n", " AM | \n", "
\n", " \n", " 1 | \n", " 2008 | \n", " 0.00067 | \n", " Y01 | \n", " 1 | \n", " DEATHRATE | \n", " F | \n", " AM | \n", "
\n", " \n", " 2 | \n", " 2007 | \n", " 0.00052 | \n", " Y01 | \n", " 1 | \n", " DEATHRATE | \n", " F | \n", " AM | \n", "
\n", " \n", " 3 | \n", " 2006 | \n", " 0.00123 | \n", " Y01 | \n", " 1 | \n", " DEATHRATE | \n", " F | \n", " AM | \n", "
\n", " \n", " 4 | \n", " 2013 | \n", " 0.00016 | \n", " Y01 | \n", " 1 | \n", " DEATHRATE | \n", " F | \n", " AT | \n", "
\n", " \n", "
\n", "
"], "text/plain": [" annee valeur age age_num indicateur genre pays\n", "0 2009 0.00080 Y01 1 DEATHRATE F AM\n", "1 2008 0.00067 Y01 1 DEATHRATE F AM\n", "2 2007 0.00052 Y01 1 DEATHRATE F AM\n", "3 2006 0.00123 Y01 1 DEATHRATE F AM\n", "4 2013 0.00016 Y01 1 DEATHRATE F AT"]}, "execution_count": 7, "metadata": {}, "output_type": "execute_result"}], "source": ["import pandas\n", "df = pandas.read_csv(\"mortalite.txt\", sep=\"\\t\", encoding=\"utf8\", low_memory=False)\n", "df.head()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Les indicateurs pour deux \u00e2ges diff\u00e9rents :"]}, {"cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [{"data": {"text/html": ["\n", "
\n", " \n", " \n", " | \n", " annee | \n", " valeur | \n", " age | \n", " age_num | \n", " indicateur | \n", " genre | \n", " pays | \n", "
\n", " \n", " \n", " \n", " 86895 | \n", " 2000 | \n", " 0.00502 | \n", " Y60 | \n", " 60 | \n", " DEATHRATE | \n", " F | \n", " FR | \n", "
\n", " \n", " 88435 | \n", " 2000 | \n", " 0.00486 | \n", " Y61 | \n", " 61 | \n", " DEATHRATE | \n", " F | \n", " FR | \n", "
\n", " \n", " 482573 | \n", " 2000 | \n", " 25.80000 | \n", " Y60 | \n", " 60 | \n", " LIFEXP | \n", " F | \n", " FR | \n", "
\n", " \n", " 484098 | \n", " 2000 | \n", " 24.90000 | \n", " Y61 | \n", " 61 | \n", " LIFEXP | \n", " F | \n", " FR | \n", "
\n", " \n", " 876261 | \n", " 2000 | \n", " 0.00501 | \n", " Y60 | \n", " 60 | \n", " PROBDEATH | \n", " F | \n", " FR | \n", "
\n", " \n", " 877801 | \n", " 2000 | \n", " 0.00485 | \n", " Y61 | \n", " 61 | \n", " PROBDEATH | \n", " F | \n", " FR | \n", "
\n", " \n", " 1272615 | \n", " 2000 | \n", " 0.99499 | \n", " Y60 | \n", " 60 | \n", " PROBSURV | \n", " F | \n", " FR | \n", "
\n", " \n", " 1274155 | \n", " 2000 | \n", " 0.99515 | \n", " Y61 | \n", " 61 | \n", " PROBSURV | \n", " F | \n", " FR | \n", "
\n", " \n", " 1668215 | \n", " 2000 | \n", " 93076.00000 | \n", " Y60 | \n", " 60 | \n", " PYLIVED | \n", " F | \n", " FR | \n", "
\n", " \n", " 1669740 | \n", " 2000 | \n", " 92618.00000 | \n", " Y61 | \n", " 61 | \n", " PYLIVED | \n", " F | \n", " FR | \n", "
\n", " \n", " 2061149 | \n", " 2000 | \n", " 93310.00000 | \n", " Y60 | \n", " 60 | \n", " SURVIVORS | \n", " F | \n", " FR | \n", "
\n", " \n", " 2062674 | \n", " 2000 | \n", " 92843.00000 | \n", " Y61 | \n", " 61 | \n", " SURVIVORS | \n", " F | \n", " FR | \n", "
\n", " \n", " 2454128 | \n", " 2000 | \n", " 2405594.00000 | \n", " Y60 | \n", " 60 | \n", " TOTPYLIVED | \n", " F | \n", " FR | \n", "
\n", " \n", " 2455653 | \n", " 2000 | \n", " 2312517.00000 | \n", " Y61 | \n", " 61 | \n", " TOTPYLIVED | \n", " F | \n", " FR | \n", "
\n", " \n", "
\n", "
"], "text/plain": [" annee valeur age age_num indicateur genre pays\n", "86895 2000 0.00502 Y60 60 DEATHRATE F FR\n", "88435 2000 0.00486 Y61 61 DEATHRATE F FR\n", "482573 2000 25.80000 Y60 60 LIFEXP F FR\n", "484098 2000 24.90000 Y61 61 LIFEXP F FR\n", "876261 2000 0.00501 Y60 60 PROBDEATH F FR\n", "877801 2000 0.00485 Y61 61 PROBDEATH F FR\n", "1272615 2000 0.99499 Y60 60 PROBSURV F FR\n", "1274155 2000 0.99515 Y61 61 PROBSURV F FR\n", "1668215 2000 93076.00000 Y60 60 PYLIVED F FR\n", "1669740 2000 92618.00000 Y61 61 PYLIVED F FR\n", "2061149 2000 93310.00000 Y60 60 SURVIVORS F FR\n", "2062674 2000 92843.00000 Y61 61 SURVIVORS F FR\n", "2454128 2000 2405594.00000 Y60 60 TOTPYLIVED F FR\n", "2455653 2000 2312517.00000 Y61 61 TOTPYLIVED F FR"]}, "execution_count": 8, "metadata": {}, "output_type": "execute_result"}], "source": ["df [ ((df.age==\"Y60\") | (df.age==\"Y61\")) & (df.annee == 2000) & (df.pays==\"FR\") & (df.genre==\"F\")]"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Exercice 1 : filtre\n", "\n", "On veut comparer les esp\u00e9rances de vie pour deux pays et deux ann\u00e9es."]}, {"cell_type": "code", "execution_count": 8, "metadata": {"collapsed": true}, "outputs": [], "source": ["#"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Donn\u00e9es trop grosses pour tenir en m\u00e9moire : SQLite\n"]}, {"cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [{"data": {"text/plain": ["(2760921, 7)"]}, "execution_count": 10, "metadata": {}, "output_type": "execute_result"}], "source": ["df.shape"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Les donn\u00e9es sont trop grosses pour tenir dans une feuille Excel. Pour les consulter, il n'y a pas d'autres moyens que d'en regarder des extraits. Que passe quand m\u00eame ceci n'est pas possible ? Quelques solutions :\n", "\n", "* augmenter la m\u00e9moire de l'ordinateur, avec 20 Go, on peut faire beaucoup de choses\n", "* stocker les donn\u00e9es dans un serveur SQL\n", "* stocker les donn\u00e9es sur un syst\u00e8me distribu\u00e9 (cloud, Hadoop, ...)\n", "\n", "La seconde option n'est pas toujours simple, il faut installer un serveur SQL. Pour aller plus vite, on peut simplement utiliser [SQLite](https://www.sqlite.org/) qui est une fa\u00e7on de faire du SQL sans serveur (cela prend quelques minutes). On utilise la m\u00e9thode [to_sql](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html)."]}, {"cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": ["import sqlite3\n", "from pandas.io import sql\n", "cnx = sqlite3.connect('mortalite.db3')\n", "try:\n", " df.to_sql(name='mortalite', con=cnx)\n", "except ValueError as e:\n", " if \"Table 'mortalite' already exists\" not in str(e):\n", " # seulement si l'erreur ne vient pas du fait que cela \n", " # a d\u00e9j\u00e0 \u00e9t\u00e9 fait\n", " raise e\n", "# on peut ajouter d'autres dataframe \u00e0 la table comme si elle \u00e9tait cr\u00e9\u00e9e par morceau\n", "# voir le param\u00e8tre if_exists de la fonction to_sql"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On peut maintenant r\u00e9cup\u00e9rer un morceau avec la fonction [read_sql](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html?highlight=read_sql#pandas.read_sql)."]}, {"cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [{"data": {"text/html": ["\n", "
\n", " \n", " \n", " | \n", " index | \n", " annee | \n", " valeur | \n", " age | \n", " age_num | \n", " indicateur | \n", " genre | \n", " pays | \n", "
\n", " \n", " \n", " \n", " 0 | \n", " 69225 | \n", " 2009 | \n", " 0.00290 | \n", " Y50 | \n", " 50 | \n", " DEATHRATE | \n", " F | \n", " AM | \n", "
\n", " \n", " 1 | \n", " 69226 | \n", " 2008 | \n", " 0.00333 | \n", " Y50 | \n", " 50 | \n", " DEATHRATE | \n", " F | \n", " AM | \n", "
\n", " \n", " 2 | \n", " 69227 | \n", " 2007 | \n", " 0.00292 | \n", " Y50 | \n", " 50 | \n", " DEATHRATE | \n", " F | \n", " AM | \n", "
\n", " \n", " 3 | \n", " 69228 | \n", " 2006 | \n", " 0.00371 | \n", " Y50 | \n", " 50 | \n", " DEATHRATE | \n", " F | \n", " AM | \n", "
\n", " \n", " 4 | \n", " 69229 | \n", " 2013 | \n", " 0.00194 | \n", " Y50 | \n", " 50 | \n", " DEATHRATE | \n", " F | \n", " AT | \n", "
\n", " \n", "
\n", "
"], "text/plain": [" index annee valeur age age_num indicateur genre pays\n", "0 69225 2009 0.00290 Y50 50 DEATHRATE F AM\n", "1 69226 2008 0.00333 Y50 50 DEATHRATE F AM\n", "2 69227 2007 0.00292 Y50 50 DEATHRATE F AM\n", "3 69228 2006 0.00371 Y50 50 DEATHRATE F AM\n", "4 69229 2013 0.00194 Y50 50 DEATHRATE F AT"]}, "execution_count": 12, "metadata": {}, "output_type": "execute_result"}], "source": ["import pandas\n", "example = pandas.read_sql('select * from mortalite where age_num==50 limit 5', cnx)\n", "example"]}, {"cell_type": "markdown", "metadata": {}, "source": ["L'ensemble des donn\u00e9es restent sur le disque, seul le r\u00e9sultat de la requ\u00eate est charg\u00e9 en m\u00e9moire. Si on ne peut pas faire tenir les donn\u00e9es en m\u00e9moire, il faut soit en obtenir une vue partielle (un \u00e9chantillon al\u00e9atoire, un vue filtr\u00e9e), soit une vue agr\u00e9gr\u00e9e.\n", "\n", "Pour finir, il faut fermer la connexion pour laisser d'autres applications ou notebook modifier la base ou tout simplement supprimer le fichier."]}, {"cell_type": "code", "execution_count": 12, "metadata": {"collapsed": true}, "outputs": [], "source": ["cnx.close()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Sous Windows, on peut consulter la base avec le logiciel [SQLiteSpy](http://www.yunqa.de/delphi/doku.php/products/sqlitespy/index)."]}, {"cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": [""]}, "execution_count": 14, "metadata": {}, "output_type": "execute_result"}], "source": ["NbImage(\"sqlite.png\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Sous Linux ou Max, on peut utiliser une extension Firefox [SQLite Manager](https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/?src). Dans ce notebook, on utilisera la commande magique [%%SQL](http://www.xavierdupre.fr/app/pyensae/helpsphinx/notebooks/pyensae_sql_magic.html) du module [pyensae](http://www.xavierdupre.fr/app/pyensae/helpsphinx/) : "]}, {"cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [{"data": {"text/plain": [""]}, "execution_count": 15, "metadata": {}, "output_type": "execute_result"}], "source": ["%load_ext pyensae\n", "%SQL_connect mortalite.db3"]}, {"cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [{"data": {"text/plain": ["['mortalite']"]}, "execution_count": 16, "metadata": {}, "output_type": "execute_result"}], "source": ["%SQL_tables"]}, {"cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [{"data": {"text/plain": ["{0: ('index', int),\n", " 1: ('annee', int),\n", " 2: ('valeur', float),\n", " 3: ('age', str),\n", " 4: ('age_num', float),\n", " 5: ('indicateur', str),\n", " 6: ('genre', str),\n", " 7: ('pays', str)}"]}, "execution_count": 17, "metadata": {}, "output_type": "execute_result"}], "source": ["%SQL_schema mortalite"]}, {"cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [{"data": {"text/html": ["\n", "
\n", " \n", " \n", " | \n", " COUNT(*) | \n", "
\n", " \n", " \n", " \n", " 0 | \n", " 2760921 | \n", "
\n", " \n", "
\n", "
"], "text/plain": [" COUNT(*)\n", "0 2760921"]}, "execution_count": 18, "metadata": {}, "output_type": "execute_result"}], "source": ["%%SQL\n", "SELECT COUNT(*) FROM mortalite"]}, {"cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": ["%SQL_close"]}, {"cell_type": "markdown", "metadata": {"collapsed": true}, "source": ["### Exercice 2 : \u00e9chantillon al\u00e9atoire\n", "\n", "Si on ne peut pas faire tenir les donn\u00e9es en m\u00e9moire, on peut soit regarder les premi\u00e8res lignes soit prendre un \u00e9chantillon al\u00e9atoire. Deux options :\n", "\n", "* [Dataframe.sample](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sample.html)\n", "* [create_function](https://docs.python.org/3.4/library/sqlite3.html#sqlite3.Connection.create_function)\n", "\n", "La premi\u00e8re fonction est simple :"]}, {"cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [{"data": {"text/plain": ["((276092, 7), (2760921, 7))"]}, "execution_count": 20, "metadata": {}, "output_type": "execute_result"}], "source": ["sample = df.sample(frac=0.1)\n", "sample.shape, df.shape"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Je ne sais pas si cela peut \u00eatre r\u00e9alis\u00e9 sans charger les donn\u00e9es en m\u00e9moire. Si les donn\u00e9es p\u00e8sent 20 Go, cette m\u00e9thode n'aboutira pas. Pourtant, on veut juste un \u00e9chantillon pour commencer \u00e0 regarder les donn\u00e9es. On utilise la seconde option avec [create_function](https://docs.python.org/3.4/library/sqlite3.html#sqlite3.Connection.create_function) et la fonction suivante :"]}, {"cell_type": "code", "execution_count": 20, "metadata": {"collapsed": true}, "outputs": [], "source": ["import random #loi uniforme\n", "def echantillon(proportion):\n", " return 1 if random.random() < proportion else 0"]}, {"cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": ["import sqlite3\n", "from pandas.io import sql\n", "cnx = sqlite3.connect('mortalite.db3')"]}, {"cell_type": "code", "execution_count": 22, "metadata": {"collapsed": true}, "outputs": [], "source": ["cnx.create_function('echantillon', 1, echantillon)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Que faut-il \u00e9crire ici pour r\u00e9cup\u00e9rer 1% de la table ?"]}, {"cell_type": "code", "execution_count": 23, "metadata": {"collapsed": true}, "outputs": [], "source": ["import pandas\n", "#example = pandas.read_sql(' ??? ', cnx)\n", "#example"]}, {"cell_type": "code", "execution_count": 24, "metadata": {"collapsed": true}, "outputs": [], "source": ["cnx.close()"]}, {"cell_type": "markdown", "metadata": {"collapsed": true}, "source": ["### Pseudo Map/Reduce avec SQLite"]}, {"cell_type": "markdown", "metadata": {}, "source": ["La liste des [mots-cl\u00e9s du langage SQL utilis\u00e9s par SQLite](https://www.sqlite.org/keyword_index.html) n'est pas aussi riche que d'autres solutions de serveurs SQL. La m\u00e9diane ne semble pas en faire partie. Cependant, pour une ann\u00e9e, un genre, un \u00e2ge donn\u00e9, on voudrait calculer la m\u00e9diane de l'esp\u00e9rance de vie sur l'ensembles des pays."]}, {"cell_type": "code", "execution_count": 25, "metadata": {"collapsed": true}, "outputs": [], "source": ["import sqlite3, pandas\n", "from pandas.io import sql\n", "cnx = sqlite3.connect('mortalite.db3')"]}, {"cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [{"data": {"text/html": ["\n", "
\n", " \n", " \n", " | \n", " pays | \n", " count(*) | \n", "
\n", " \n", " \n", " \n", " 0 | \n", " AM | \n", " 7224 | \n", "
\n", " \n", " 1 | \n", " AT | \n", " 79464 | \n", "
\n", " \n", " 2 | \n", " AZ | \n", " 12642 | \n", "
\n", " \n", " 3 | \n", " BE | \n", " 97524 | \n", "
\n", " \n", " 4 | \n", " BG | \n", " 97524 | \n", "
\n", " \n", " 5 | \n", " BY | \n", " 5418 | \n", "
\n", " \n", " 6 | \n", " CH | \n", " 97524 | \n", "
\n", " \n", " 7 | \n", " CY | \n", " 37926 | \n", "
\n", " \n", " 8 | \n", " CZ | \n", " 97524 | \n", "
\n", " \n", " 9 | \n", " DE | \n", " 52374 | \n", "
\n", " \n", " 10 | \n", " DE_TOT | \n", " 97524 | \n", "
\n", " \n", " 11 | \n", " DK | \n", " 72240 | \n", "
\n", " \n", " 12 | \n", " EA16 | \n", " 35688 | \n", "
\n", " \n", " 13 | \n", " EA17 | \n", " 35688 | \n", "
\n", " \n", " 14 | \n", " EA18 | \n", " 21672 | \n", "
\n", " \n", " 15 | \n", " EA19 | \n", " 21672 | \n", "
\n", " \n", " 16 | \n", " EE | \n", " 97524 | \n", "
\n", " \n", " 17 | \n", " EEA30 | \n", " 21672 | \n", "
\n", " \n", " 18 | \n", " EEA31 | \n", " 21672 | \n", "
\n", " \n", " 19 | \n", " EFTA | \n", " 36120 | \n", "
\n", " \n", " 20 | \n", " EL | \n", " 95718 | \n", "
\n", " \n", " 21 | \n", " ES | \n", " 70434 | \n", "
\n", " \n", " 22 | \n", " EU27 | \n", " 21672 | \n", "
\n", " \n", " 23 | \n", " EU28 | \n", " 21672 | \n", "
\n", " \n", " 24 | \n", " FI | \n", " 61404 | \n", "
\n", " \n", " 25 | \n", " FR | \n", " 28896 | \n", "
\n", " \n", " 26 | \n", " FX | \n", " 48762 | \n", "
\n", " \n", " 27 | \n", " GE | \n", " 10836 | \n", "
\n", " \n", " 28 | \n", " HR | \n", " 23478 | \n", "
\n", " \n", " 29 | \n", " HU | \n", " 97524 | \n", "
\n", " \n", " 30 | \n", " IE | \n", " 50646 | \n", "
\n", " \n", " 31 | \n", " IS | \n", " 93912 | \n", "
\n", " \n", " 32 | \n", " IT | \n", " 52374 | \n", "
\n", " \n", " 33 | \n", " LI | \n", " 36120 | \n", "
\n", " \n", " 34 | \n", " LT | \n", " 79464 | \n", "
\n", " \n", " 35 | \n", " LU | \n", " 79464 | \n", "
\n", " \n", " 36 | \n", " LV | \n", " 21672 | \n", "
\n", " \n", " 37 | \n", " MD | \n", " 12642 | \n", "
\n", " \n", " 38 | \n", " ME | \n", " 16254 | \n", "
\n", " \n", " 39 | \n", " MK | \n", " 36120 | \n", "
\n", " \n", " 40 | \n", " MT | \n", " 50901 | \n", "
\n", " \n", " 41 | \n", " NL | \n", " 52374 | \n", "
\n", " \n", " 42 | \n", " NO | \n", " 97524 | \n", "
\n", " \n", " 43 | \n", " PL | \n", " 43344 | \n", "
\n", " \n", " 44 | \n", " PT | \n", " 97524 | \n", "
\n", " \n", " 45 | \n", " RO | \n", " 83076 | \n", "
\n", " \n", " 46 | \n", " RS | \n", " 25284 | \n", "
\n", " \n", " 47 | \n", " RU | \n", " 9030 | \n", "
\n", " \n", " 48 | \n", " SE | \n", " 83076 | \n", "
\n", " \n", " 49 | \n", " SI | \n", " 57792 | \n", "
\n", " \n", " 50 | \n", " SK | \n", " 97524 | \n", "
\n", " \n", " 51 | \n", " TR | \n", " 9030 | \n", "
\n", " \n", " 52 | \n", " UA | \n", " 10836 | \n", "
\n", " \n", " 53 | \n", " UK | \n", " 37926 | \n", "
\n", " \n", "
\n", "
"], "text/plain": [" pays count(*)\n", "0 AM 7224\n", "1 AT 79464\n", "2 AZ 12642\n", "3 BE 97524\n", "4 BG 97524\n", "5 BY 5418\n", "6 CH 97524\n", "7 CY 37926\n", "8 CZ 97524\n", "9 DE 52374\n", "10 DE_TOT 97524\n", "11 DK 72240\n", "12 EA16 35688\n", "13 EA17 35688\n", "14 EA18 21672\n", "15 EA19 21672\n", "16 EE 97524\n", "17 EEA30 21672\n", "18 EEA31 21672\n", "19 EFTA 36120\n", "20 EL 95718\n", "21 ES 70434\n", "22 EU27 21672\n", "23 EU28 21672\n", "24 FI 61404\n", "25 FR 28896\n", "26 FX 48762\n", "27 GE 10836\n", "28 HR 23478\n", "29 HU 97524\n", "30 IE 50646\n", "31 IS 93912\n", "32 IT 52374\n", "33 LI 36120\n", "34 LT 79464\n", "35 LU 79464\n", "36 LV 21672\n", "37 MD 12642\n", "38 ME 16254\n", "39 MK 36120\n", "40 MT 50901\n", "41 NL 52374\n", "42 NO 97524\n", "43 PL 43344\n", "44 PT 97524\n", "45 RO 83076\n", "46 RS 25284\n", "47 RU 9030\n", "48 SE 83076\n", "49 SI 57792\n", "50 SK 97524\n", "51 TR 9030\n", "52 UA 10836\n", "53 UK 37926"]}, "execution_count": 27, "metadata": {}, "output_type": "execute_result"}], "source": ["pandas.read_sql('select pays,count(*) from mortalite group by pays', cnx)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Il n'y a pas le m\u00eame nombre de donn\u00e9es selon les pays, il est probable que le nombre de pays pour lesquels il existe des donn\u00e9es varie selon les \u00e2ges et les ann\u00e9es."]}, {"cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": ["query = \"\"\"SELECT nb_country, COUNT(*) AS nb_rows FROM (\n", " SELECT annee,age,age_num, count(*) AS nb_country FROM mortalite \n", " WHERE indicateur==\"LIFEXP\" AND genre==\"F\"\n", " GROUP BY annee,age,age_num\n", " ) GROUP BY nb_country\"\"\"\n", "df = pandas.read_sql(query, cnx)"]}, {"cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [{"data": {"text/html": ["\n", "
\n", " \n", " \n", " | \n", " nb_country | \n", " nb_rows | \n", "
\n", " \n", " \n", " \n", " 37 | \n", " 104 | \n", " 5 | \n", "
\n", " \n", " 36 | \n", " 102 | \n", " 2 | \n", "
\n", " \n", "
\n", "
"], "text/plain": [" nb_country nb_rows\n", "37 104 5\n", "36 102 2"]}, "execution_count": 29, "metadata": {}, "output_type": "execute_result"}], "source": ["df.sort_values(\"nb_country\", ascending=False).head(n=2)"]}, {"cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [{"data": {"text/plain": [""]}, "execution_count": 30, "metadata": {}, "output_type": "execute_result"}], "source": ["df.plot(x=\"nb_country\", y=\"nb_rows\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Soit un nombre inconstant de pays. Le fait qu'on est 100 pays sugg\u00e8re qu'on ait une erreur \u00e9galement."]}, {"cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": ["query = \"\"\"SELECT annee,age,age_num, count(*) AS nb_country FROM mortalite \n", " WHERE indicateur==\"LIFEXP\" AND genre==\"F\"\n", " GROUP BY annee,age,age_num\n", " HAVING nb_country >= 100\"\"\"\n", "df = pandas.read_sql(query, cnx)"]}, {"cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [{"data": {"text/html": ["\n", "
\n", " \n", " \n", " | \n", " annee | \n", " age | \n", " age_num | \n", " nb_country | \n", "
\n", " \n", " \n", " \n", " 0 | \n", " 2006 | \n", " None | \n", " None | \n", " 104 | \n", "
\n", " \n", " 1 | \n", " 2007 | \n", " None | \n", " None | \n", " 104 | \n", "
\n", " \n", " 2 | \n", " 2008 | \n", " None | \n", " None | \n", " 104 | \n", "
\n", " \n", " 3 | \n", " 2009 | \n", " None | \n", " None | \n", " 104 | \n", "
\n", " \n", " 4 | \n", " 2010 | \n", " None | \n", " None | \n", " 104 | \n", "
\n", " \n", "
\n", "
"], "text/plain": [" annee age age_num nb_country\n", "0 2006 None None 104\n", "1 2007 None None 104\n", "2 2008 None None 104\n", "3 2009 None None 104\n", "4 2010 None None 104"]}, "execution_count": 32, "metadata": {}, "output_type": "execute_result"}], "source": ["df.head()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Ce sont des valeurs manquantes. Le probl\u00e8me pour calculer la m\u00e9diane pour chaque observation est qu'il faut d'abord regrouper les lignes de la table par indicateur puis choisir la m\u00e9diane dans chaque de ces petits groupes. On s'inspire pour cela de la logique Map/Reduce et de la fonction [create_aggregate](https://docs.python.org/3.4/library/sqlite3.html#sqlite3.Connection.create_aggregate)."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Exercice 3 : reducer SQL"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Il faut compl\u00e9ter le programme suivant."]}, {"cell_type": "code", "execution_count": 32, "metadata": {"collapsed": true}, "outputs": [], "source": ["class ReducerMediane:\n", " def __init__(self):\n", " # ???\n", " pass\n", " def step(self, value):\n", " # ???\n", " #\n", " pass\n", " def finalize(self):\n", " # ???\n", " # return ... //2 ]\n", " pass\n", " \n", "cnx.create_aggregate(\"ReducerMediane\", 1, ReducerMediane) "]}, {"cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": ["#query = \"\"\"SELECT annee,age,age_num, ...... AS mediane FROM mortalite \n", "# WHERE indicateur==\"LIFEXP\" AND genre==\"F\"\n", "# GROUP BY annee,age,age_num\"\"\"\n", "#df = pandas.read_sql(query, cnx)"]}, {"cell_type": "code", "execution_count": 34, "metadata": {"collapsed": true}, "outputs": [], "source": ["cnx.close()"]}, {"cell_type": "markdown", "metadata": {"collapsed": true}, "source": ["### Notion d'index"]}, {"cell_type": "markdown", "metadata": {}, "source": ["En SQL et pour de grandes tables, la notion d'index joue un r\u00f4le important pour acc\u00e9l\u00e9rer les op\u00e9rations de jointures (``JOIN``) ou de regroupement (``GROUP BY``). L'article [A thorough guide to SQLite database operations in Python](http://sebastianraschka.com/Articles/2014_sqlite_in_python_tutorial.html) montre comment faire les principales op\u00e9rations."]}, {"cell_type": "code", "execution_count": 35, "metadata": {"collapsed": true}, "outputs": [], "source": []}], "metadata": {"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.1"}}, "nbformat": 4, "nbformat_minor": 2}