Exploitation de base de données par Pandas¶
Classes pour simplifier l’exploitation des bases SQL par Pandas.
Created on Mon Nov 23 09:23:52 2020
@author: Cyrile Delestre
-
class
dstk.data._pandas_sql.PandasSQL(conn: sqlite3.Connection)[source]¶ Bases:
objectClasse de manipulation Pandas pour attaquer une base SQL. Gère toutes les connexions aux bases de données compatibles avec la méthode Pandas pandas.read_sql_query :
- Parameters:
- connsqlite3.Connection
connecteur vers une base SQL.
See also
Notes
Attention si vous utilisez la méthode close() le connecteur sera perdu. Il fraudra alors réinstancier la classe PandasSQL avec un nouveau connecteur.
Attention cette classe n’est pas Picklelisable, car les connecteurs sont des objets non binarisables. Dans ce cas utiliser PandasSQLite ou PandasSQLAlchemy avec un context manager avec le mot clef “with”.
Examples
>>> import sqlite3 >>> from dstk.data import PandasSQL
Si on considère une base SLQLite3 “base.db” dans le répertoire data du projet et que cette base possède une table “base_name”.
>>> df = PandasSQL(sqlite3.connect("data/base.db")) >>> df("SELECT * FROM base_name;") field_name_1 field_name_2 0 d 1 1 e 2 2 f 3
>>> gen = df.gen_data("SELECT * FROM base_name;") >>> type(gen) >>> generator >>> next(gen) ('d', 1)
>>> df.close() >>> df("SELECT * FROM base_name;") AttributeError: L'instance PandasSQL n'a pas de connecteur. Ceci est peut-être du au fait que vous avez fermé la connexion avec la méthode close.
La classe PandasSQL n’est pas binarisable, elle est donc inutilisable dans un context multi-processing (voir PandasSQLite ou PandasSQLAlchemy).
>>> import pickle >>> df = PandasSQL(sqlite3.connect("data/base.db")) >>> pickle.dumps(df) TypeError: can't pickle sqlite3.Connection objects
-
close()[source]¶ Permet de fermer le connecteur SQL. Attention en fonction du connecteur cette méthode peut ne pas fonctionner. Il faudra alors la surcharger.
-
conn: sqlite3.Connection¶
-
gen_data(cmd: str)[source]¶ Générateur de la commande SQL. Attention en fonction du connecteur cette méthode peut ne pas fonctionner. Il faudra alors la surcharger.
- Parameters:
- cmdstr
commande SQL
- Returns:
- data:
générateur ..
-
read_data(cmd: str, **sql_opt)[source]¶ Permet de lire les données à partir de la commande SQL cmd.
- Parameters:
- cmdstr
commande SQL
- **sql_opt :
arguments de pandas.read_sql_query
- Returns:
- df:
DataFrame Pandas ..
-
class
dstk.data._pandas_sql.PandasSQLAlchemy(path_sql: str, **kargs_sql)[source]¶ Bases:
dstk.data._pandas_sql.PandasSQLClasse de manipulation Pandas pour attaquer une base SQL. Utilise le moteur SQLAlchemy. L’avantage de cette librairie est d’être compatible avec beaucoup de bases de données.
- Parameters:
- path_sqlstr
- URL de connexion SQLAlchemy. L’URL de connexion est définit par :
“dialect+driver://usernam:password@host:port/database”
- kargs_sqlDict[str, Any]
- arguments d’entrée au connecteur SQLAlchemy :
sqlalchemy.create_engine(path_sql, **kargs_sql)
See also
Notes
Contrairement à PandasSQL cette classe est binarisable car ne fait pas d’effet de bord sur les connecteurs. Il faut l’utiliser dans un contexte manager avec le mot clef “with”.
Cette classe nécessite SQLAlchemy, si ce package n’est pas présent dans votre environnement il suffit d’ajouter le package “sqlalchemy” au fichier environment.yml et de lancer le script bash bash_install_env.sh dans le répertoire shell du projet.
Examples
>>> from dstk.data import PandasSQLAlchemy
Si on considère une base SLQLite3 “base.db” dans le répertoire data du projet.
>>> df = PandasSQLAlchemy("sqlite:///data/base.db") >>> >>> with df: >>> info = df.info_database() >>> info {'base_name': {'field_name_1': 'TEXT'}, {'field_name_2': 'TEXT'}}
>>> with df: >>> out = df("SELECT * FROM base_name;") >>> out field_name_1 field_name_2 0 riri picsou 1 fifi donald 2 loulou mickey
>>> with df: >>> gen = df.gen_data("SELECT * FROM base_name;") >>> type(gen) generator >>> next(gen) ('riri', 'picsou')
Cette classe est bien binarisable.
>>> import pickle >>> pickle.dumps(df) b'...'
-
gen_data(cmd: str)[source]¶ Générateur de la commande SQL.
- Parameters:
- cmdstr
commande SQL
- Returns:
- datagenerator
générateur sur la data en sortie de la commande appliqué sur la base.
-
get_engine()[source]¶ Méthode qui permet de récupérer l’engine SQLAlchemy. Attention il faut que la connection se fasse explicitement dans la classe (path_sql non None et engine = ‘sqlalchemy’.
-
info_database()[source]¶ Retourne sous un dictionnaire les informations de la base.
- Returns:
- outdict
dict au format {table_name: {field_name: field_type}}
-
kargs_sql: Dict[str, Any] = Field(name=None,type=None,default=<dataclasses._MISSING_TYPE object>,default_factory=<class 'dict'>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),_field_type=None)¶
-
path_sql: str¶
-
class
dstk.data._pandas_sql.PandasSQLite(path_sql: Union[str, sqlite3.Connection], **kargs_sql)[source]¶ Bases:
dstk.data._pandas_sql.PandasSQLClasse de manipulation Pandas pour attaquer une base SQL. Utilise le moteur SQLite3 de Python. Elle n’est compatible que SQLite mais ne nécessite pas d’installation de package supplémentaire.
- Parameters:
- path_sqlUnion[str, sqlite3.Connection]
chemin vers une base SQLite3 (utilisation recommendé). Peut être également un connecteur SQLite3.
- kargs_sql :
- arguments d’entrée au connecteur SQLite3 :
sqlite3.connect(path_sql, **kargs_sql)
See also
Notes
Contrairement à PandasSQL cette classe est binarisable car ne fait pas d’effet de bord sur les connecteurs. Il faut l’utiliser dans un contexte manager avec le mot clef “with”.
Attention si vous utilisez un connecteur SQLite3 a la place de d’un chemin vers la base, l’objet n’est plus binarisable !
Examples
>>> from dstk.data import PandasSQLite
Si on considère une base SLQLite3 “base.db” dans le répertoire data du projet.
>>> df = PandasSQLite("data/base.db") >>> >>> with df: >>> info = df.info_database() >>> info {'base_name': {'field_name_1': 'INTEGER'}, {'field_name_2': 'TEXT'}}
>>> with df: >>> out = df("SELECT * FROM base_name;") >>> out field_name_1 field_name_2 0 31 janvier 1 29 février 2 31 mars
>>> with df: >>> gen = df.gen_data("SELECT * FROM base_name;") >>> type(gen) generator >>> next(gen) (31, 'janvier')
Cette classe est bien binarisable.
>>> import pickle >>> pickle.dumps(df) b'...'
-
conn: sqlite3.Connection¶