Python: bases de datos relacionales
Podemos conectarnos a bases de datos relacionales para analizar datos utilizando el pandasbiblioteca, así como otra biblioteca adicional para implementar la conectividad de la base de datos. Este paquete se denominasqlalchemy que proporciona la funcionalidad completa del lenguaje SQL para su uso en Python.
Instalación de SQLAlchemy
La instalación es muy sencilla usando Anaconda que hemos discutido en el capítulo . Suponiendo que ha instalado Anaconda como se describe en este capítulo, ejecute el siguiente comando en la ventana de solicitud de Anaconda para instalar el paquete SQLAlchemy.
conda install sqlalchemy
Leer tablas relacionales
Usaremos Sqlite3 como nuestra base de datos relacional ya que es muy liviana y fácil de usar. Aunque la biblioteca SQLAlchemy puede conectarse a una variedad de fuentes relacionales, incluidas MySql, Oracle y Postgresql y Mssql. Primero creamos un motor de base de datos y luego nos conectamos al motor de base de datos usando elto_sql función de la biblioteca SQLAlchemy.
En el siguiente ejemplo, creamos la tabla relacional usando el to_sqlfunción de un marco de datos ya creado mediante la lectura de un archivo csv. Entonces usamos elread_sql_query función de pandas para ejecutar y capturar los resultados de varias consultas 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)
Cuando ejecutamos el código anterior, produce el siguiente resultado.
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
Insertar datos en tablas relacionales
También podemos insertar datos en tablas relacionales usando la función sql.execute disponible en pandas. En el siguiente código, el archivo csv previo como conjunto de datos de entrada, lo almacenamos en una tabla relacional y luego insertamos otro registro 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)
Cuando ejecutamos el código anterior, produce el siguiente resultado.
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
Eliminar datos de tablas relacionales
También podemos eliminar datos en tablas relacionales usando la función sql.execute disponible en pandas. El siguiente código elimina una fila según la condición de entrada dada.
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)
Cuando ejecutamos el código anterior, produce el siguiente resultado.
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