{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Dans ce notebook nous verrons comment utiliser pandas et sqlite3 ensemble \n", "ainsi que l'impct sur les performances des GroupBy des index dans SQLite3." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sqlite3\n", "import pandas " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On crée une base de données en mémoire:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "!rm test.db\n", "db = sqlite3.connect(\"test.db\") " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On va créer un générateur pour peupler la table de donner artificielle. \n", "On utilise simplement des entiers et des congruences modulo pour avoir des données variée mais pas trop." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def generateur(size):\n", " for i in range(size):\n", " yield (i%1001, i%1003, i%1007)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut faire varier la taille du dataset en changeant l'argument du générateur. \n", "Ici on fait en sorte d'avoir une base de de donnée qui ne tient pas en mémoire, \n", "pour l'exercice. La génération de la table prend un certain temps" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 1min 47s, sys: 1.11 s, total: 1min 48s\n", "Wall time: 1min 54s\n" ] } ], "source": [ "%%time \n", "db.execute(\"CREATE TABLE A(x, y, z)\") # On crée une table avec 3 colonnes\n", "db.executemany(\"INSERT INTO A values (?, ?, ?)\", generateur(100000000))\n", "db.commit() # La base de donnée fait ~ 2go. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pandas et SQL intégration\n", "Il est possible de faire communiquer Pandas et SQL facilement.\n", "Par exemple, pour rappatrier une table SQLite dans une data frame. \n", "Par contre, attention si la table ne tient pas en mémoire." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "df = pandas.read_sql(\"SELECT * FROM A LIMIT 1000\", db) # Charge en mémoire la table (ouch si ça tient pas !) " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", " | x | \n", "y | \n", "z | \n", "
---|---|---|---|
0 | \n", "0 | \n", "0 | \n", "0 | \n", "
1 | \n", "1 | \n", "1 | \n", "1 | \n", "
2 | \n", "2 | \n", "2 | \n", "2 | \n", "
3 | \n", "3 | \n", "3 | \n", "3 | \n", "
4 | \n", "4 | \n", "4 | \n", "4 | \n", "
... | \n", "... | \n", "... | \n", "... | \n", "
995 | \n", "995 | \n", "995 | \n", "995 | \n", "
996 | \n", "996 | \n", "996 | \n", "996 | \n", "
997 | \n", "997 | \n", "997 | \n", "997 | \n", "
998 | \n", "998 | \n", "998 | \n", "998 | \n", "
999 | \n", "999 | \n", "999 | \n", "999 | \n", "
1000 rows × 3 columns
\n", "x | \n", "0 | \n", "1 | \n", "2 | \n", "3 | \n", "4 | \n", "5 | \n", "6 | \n", "7 | \n", "8 | \n", "9 | \n", "... | \n", "991 | \n", "992 | \n", "993 | \n", "994 | \n", "995 | \n", "996 | \n", "997 | \n", "998 | \n", "999 | \n", "1000 | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
y | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
0 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "... | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "
1 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "... | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "
2 | \n", "99 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "... | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "
3 | \n", "100 | \n", "99 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "... | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "
4 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "... | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "
... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
998 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "... | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "
999 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "... | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "100 | \n", "100 | \n", "
1000 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "... | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "100 | \n", "
1001 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "... | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "
1002 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "100 | \n", "... | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "100 | \n", "99 | \n", "
1003 rows × 1001 columns
\n", "