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