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: object

Classe 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

PandasSQLite, PandasSQLAlchemy

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.PandasSQL

Classe 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

PandasSQL, PandasSQLite

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'...'
close()[source]

Permet de fermer le connecteur SQL.

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.PandasSQL

Classe 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

PandasSQL, PandasSQLAlchemy

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
get_cursor()[source]

Renvoit un cursor si la connexion avec la base est établie.

info_database()[source]

Retourne sous un dictionnaire les informations de la base.

Returns:
outdict

dict au format {table_name: {field_name: field_type}}