Мы можем подключиться к реляционным базам данных для анализа данных, используя библиотеку pandas, а также другую дополнительную библиотеку для реализации подключения к базе данных. Этот пакет называется sqlalchemy, который обеспечивает полную функциональность языка SQL для использования в python.
Установка SQLAlchemy
Установка очень проста с использованием Anaconda, которую мы обсуждали в главе Data Science Environment . Предполагая, что вы установили Anaconda, как описано в этой главе, выполните следующую команду в окне приглашения Anaconda, чтобы установить пакет SQLAlchemy.
conda install sqlalchemy
Чтение реляционных таблиц
Мы будем использовать Sqlite3 в качестве нашей реляционной базы данных, поскольку она очень легкая и простая в использовании. Хотя библиотека SQLAlchemy может подключаться к различным реляционным источникам, включая MySql, Oracle, Postgresql и Mssql. Сначала мы создаем ядро базы данных, а затем подключаемся к ядру базы данных с помощью функции to_sql библиотеки SQLAlchemy.
В приведенном ниже примере мы создаем реляционную таблицу с помощью функции to_sql из фрейма данных, уже созданного чтением файла CSV. Затем мы используем функцию read_sql_query из pandas для выполнения и захвата результатов различных 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)
Когда мы выполняем приведенный выше код, он дает следующий результат.
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
Вставка данных в реляционные таблицы
Мы также можем вставить данные в реляционные таблицы, используя функцию sql.execute, доступную в pandas. В приведенном ниже коде мы использовали предыдущий csv-файл в качестве набора входных данных, сохраняем его в реляционной таблице и затем вставляем другую запись, используя 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)
Когда мы выполняем приведенный выше код, он дает следующий результат.
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
Удаление данных из реляционных таблиц
Мы также можем удалить данные в реляционные таблицы, используя функцию sql.execute, доступную в pandas. Приведенный ниже код удаляет строку на основе заданного условия ввода.
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)
Когда мы выполняем приведенный выше код, он дает следующий результат.