До настоящего времени мы извлекали данные исключительно из csv-файлов, что является популярным способом, однако далеко не единственным. Pandas поддерживает работу с различными форматами, включая HTML, JSON, SQL, Excel, HDF5, Stata и другими. На данном этапе мы сосредоточимся на работе с данными, хранящимися в SQL базах данных.
import pandas as pd
import sqlite3
Чтение из SQL баз данных
Для загрузки данных из SQL базы данных можно использовать функцию pd.read_sql
.
Эта функция автоматически преобразует столбцы SQL в колонки DataFrame.
Функция read_sql
принимает два параметра: SQL-запрос SELECT и объект
соединения. Это позволяет читать данные из любой базы данных, будь то MySQL, SQLite, PostgreSQL и другие.
В приведенном примере мы взаимодействуем с базой данных SQLite. Для других баз процесс будет аналогичным. Файл для работы.
con = sqlite3.connect("data/weather_2012.sqlite")
df = pd.read_sql("SELECT * from weather_2012 LIMIT 3", con)
df
Функция read_sql
не устанавливает первичный ключ (id) как индекс.
Чтобы сделать это вручную, используйте аргумент index_col в read_sql
.
Если вы ранее работали с read_csv, вы заметите, что у этой функции также есть аргумент index_col, который ведет себя аналогично.
df = pd.read_sql("SELECT * from weather_2012 LIMIT 3", con, index_col='id')
df
Если необходимо, чтобы DataFrame был индексирован несколькими столбцами, укажите их список в index_col:
df = pd.read_sql("SELECT * from weather_2012 LIMIT 3", con,
index_col=['id', 'date_time'])
df
Запись в базу
Данные можно записать в базу данных с использованием метода to_sql, который работает по аналогии с записью в CSV:
weather_df = pd.read_csv('data/weather_2012.csv')
con = sqlite3.connect("data/test_db.sqlite")
con.execute("DROP TABLE IF EXISTS weather_2012")
weather_df.to_sql("weather_2012", con)
/usr/local/lib/python3.5/dist-packages/pandas/core/generic.py:1345: UserWarning: The spaces in these column names will not be changed.
In pandas versions < 0.14, spaces were converted to underscores.
chunksize=chunksize, dtype=dtype)
Теперь данные доступны для загрузки:
con = sqlite3.connect("data/test_db.sqlite")
df = pd.read_sql("SELECT * from weather_2012 LIMIT 3", con)
df
Одним из преимуществ хранения данных в базе является возможность использования SQL-запросов. Особенно полезно, если вы предпочитаете работать с данным языком. К примеру, можно легко отсортировать записи по колонке 'Weather' с применением SQL:
con = sqlite3.connect("data/test_db.sqlite")
df = pd.read_sql("SELECT * from weather_2012 ORDER BY Weather LIMIT 3", con)
df
Другие базы данных
Пример подключения к MySQL:
Перед использованием, убедитесь, что соответствующая база данных установлена на вашем устройстве
import MySQLdb
con = MySQLdb.connect(host="localhost", db="test")
Подключение к PostgreSQL:
import psycopg2
con = psycopg2.connect(host="localhost")