Python - Database relazionali

Possiamo connetterci a database relazionali per analizzare i dati utilizzando il pandaslibreria e un'altra libreria aggiuntiva per implementare la connettività del database. Questo pacchetto è denominato comesqlalchemy che fornisce funzionalità complete del linguaggio SQL da utilizzare in python.

Installazione di SQLAlchemy

L'installazione è molto semplice usando Anaconda di cui abbiamo discusso nel capitolo Data Science Environment . Supponendo che abbiate installato Anaconda come descritto in questo capitolo, eseguite il seguente comando nella finestra del prompt di Anaconda per installare il pacchetto SQLAlchemy.

conda install sqlalchemy

Lettura di tabelle relazionali

Useremo Sqlite3 come nostro database relazionale in quanto è molto leggero e facile da usare. Sebbene la libreria SQLAlchemy possa connettersi a una varietà di fonti relazionali tra cui MySql, Oracle, Postgresql e Mssql. Per prima cosa creiamo un motore di database e poi ci colleghiamo al motore di database utilizzando ilto_sql funzione della libreria SQLAlchemy.

Nell'esempio seguente creiamo la tabella relazionale utilizzando l'estensione to_sqlfunzione da un dataframe già creato leggendo un file csv. Quindi usiamo il fileread_sql_query funzione da panda per eseguire e acquisire i risultati di varie query SQL.

from sqlalchemy import create_engine
import pandas as pd

data = pd.read_csv('/path/input.csv')

# Create the db engine
engine = create_engine('sqlite:///:memory:')

# Store the dataframe as a table
data.to_sql('data_table', engine)

# Query 1 on the relational table
res1 = pd.read_sql_query('SELECT * FROM data_table', engine)
print('Result 1')
print(res1)
print('')

# Query 2 on the relational table
res2 = pd.read_sql_query('SELECT dept,sum(salary) FROM data_table group by dept', engine)
print('Result 2')
print(res2)

Quando eseguiamo il codice precedente, produce il seguente risultato.

Result 1
   index  id    name  salary  start_date        dept
0      0   1    Rick  623.30  2012-01-01          IT
1      1   2     Dan  515.20  2013-09-23  Operations
2      2   3   Tusar  611.00  2014-11-15          IT
3      3   4    Ryan  729.00  2014-05-11          HR
4      4   5    Gary  843.25  2015-03-27     Finance
5      5   6   Rasmi  578.00  2013-05-21          IT
6      6   7  Pranab  632.80  2013-07-30  Operations
7      7   8    Guru  722.50  2014-06-17     Finance

Result 2
         dept  sum(salary)
0     Finance      1565.75
1          HR       729.00
2          IT      1812.30
3  Operations      1148.00

Inserimento di dati nelle tabelle relazionali

Possiamo anche inserire dati in tabelle relazionali utilizzando la funzione sql.execute disponibile in panda. Nel codice seguente abbiamo il file csv precedente come set di dati di input, lo memorizziamo in una tabella relazionale e quindi inseriamo un altro record usando sql.execute.

from sqlalchemy import create_engine
from pandas.io import sql

import pandas as pd

data = pd.read_csv('C:/Users/Rasmi/Documents/pydatasci/input.csv')
engine = create_engine('sqlite:///:memory:')

# Store the Data in a relational table
data.to_sql('data_table', engine)

# Insert another row
sql.execute('INSERT INTO data_table VALUES(?,?,?,?,?,?)', engine, params=[('id',9,'Ruby',711.20,'2015-03-27','IT')])

# Read from the relational table
res = pd.read_sql_query('SELECT ID,Dept,Name,Salary,start_date FROM data_table', engine)
print(res)

Quando eseguiamo il codice precedente, produce il seguente risultato.

id        dept    name  salary  start_date
0   1          IT    Rick  623.30  2012-01-01
1   2  Operations     Dan  515.20  2013-09-23
2   3          IT   Tusar  611.00  2014-11-15
3   4          HR    Ryan  729.00  2014-05-11
4   5     Finance    Gary  843.25  2015-03-27
5   6          IT   Rasmi  578.00  2013-05-21
6   7  Operations  Pranab  632.80  2013-07-30
7   8     Finance    Guru  722.50  2014-06-17
8   9          IT    Ruby  711.20  2015-03-27

Eliminazione dei dati dalle tabelle relazionali

Possiamo anche eliminare i dati nelle tabelle relazionali utilizzando la funzione sql.execute disponibile in Panda. Il codice seguente elimina una riga in base alla condizione di input fornita.

from sqlalchemy import create_engine
from pandas.io import sql

import pandas as pd

data = pd.read_csv('C:/Users/Rasmi/Documents/pydatasci/input.csv')
engine = create_engine('sqlite:///:memory:')
data.to_sql('data_table', engine)

sql.execute('Delete from data_table where name = (?) ', engine,  params=[('Gary')])

res = pd.read_sql_query('SELECT ID,Dept,Name,Salary,start_date FROM data_table', engine)
print(res)

Quando eseguiamo il codice precedente, produce il seguente risultato.

id        dept    name  salary  start_date
0   1          IT    Rick   623.3  2012-01-01
1   2  Operations     Dan   515.2  2013-09-23
2   3          IT   Tusar   611.0  2014-11-15
3   4          HR    Ryan   729.0  2014-05-11
4   6          IT   Rasmi   578.0  2013-05-21
5   7  Operations  Pranab   632.8  2013-07-30
6   8     Finance    Guru   722.5  2014-06-17