До настоящего времени мы извлекали данные исключительно из csv-файлов, что является популярным способом, однако далеко не единственным. Pandas поддерживает работу с различными форматами, включая HTML, JSON, SQL, Excel, HDF5, Stata и другими. На данном этапе мы сосредоточимся на работе с данными, хранящимися в SQL базах данных.

In [1]:
import pandas as pd
import sqlite3

Чтение из SQL баз данных

Для загрузки данных из SQL базы данных можно использовать функцию pd.read_sql. Эта функция автоматически преобразует столбцы SQL в колонки DataFrame.

Функция read_sql принимает два параметра: SQL-запрос SELECT и объект соединения. Это позволяет читать данные из любой базы данных, будь то MySQL, SQLite, PostgreSQL и другие.

В приведенном примере мы взаимодействуем с базой данных SQLite. Для других баз процесс будет аналогичным. Файл для работы.

In [2]:
con = sqlite3.connect("data/weather_2012.sqlite")
df = pd.read_sql("SELECT * from weather_2012 LIMIT 3", con)
df
Out[2]:
id date_time temp
0 1 2012-01-01 00:00:00 -1.8
1 2 2012-01-01 01:00:00 -1.8
2 3 2012-01-01 02:00:00 -1.8

Функция read_sql не устанавливает первичный ключ (id) как индекс. Чтобы сделать это вручную, используйте аргумент index_col в read_sql.

Если вы ранее работали с read_csv, вы заметите, что у этой функции также есть аргумент index_col, который ведет себя аналогично.

In [3]:
df = pd.read_sql("SELECT * from weather_2012 LIMIT 3", con, index_col='id')
df
Out[3]:
date_time temp
id
1 2012-01-01 00:00:00 -1.8
2 2012-01-01 01:00:00 -1.8
3 2012-01-01 02:00:00 -1.8

Если необходимо, чтобы DataFrame был индексирован несколькими столбцами, укажите их список в index_col:

In [4]:
df = pd.read_sql("SELECT * from weather_2012 LIMIT 3", con,
                 index_col=['id', 'date_time'])
df
Out[4]:
temp
id date_time
1 2012-01-01 00:00:00 -1.8
2 2012-01-01 01:00:00 -1.8
3 2012-01-01 02:00:00 -1.8

Запись в базу

Данные можно записать в базу данных с использованием метода to_sql, который работает по аналогии с записью в CSV:

In [5]:
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)
Out[5]:
/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)

Теперь данные доступны для загрузки:

In [6]:
con = sqlite3.connect("data/test_db.sqlite")
df = pd.read_sql("SELECT * from weather_2012 LIMIT 3", con)
df
Out[6]:
index Date/Time Temp (C) Dew Point Temp (C) Rel Hum (%) Wind Spd (km/h) Visibility (km) Stn Press (kPa) Weather
0 0 2012-01-01 00:00:00 -1.8 -3.9 86 4 8.0 101.24 Fog
1 1 2012-01-01 01:00:00 -1.8 -3.7 87 4 8.0 101.24 Fog
2 2 2012-01-01 02:00:00 -1.8 -3.4 89 7 4.0 101.26 Freezing Drizzle,Fog

Одним из преимуществ хранения данных в базе является возможность использования SQL-запросов. Особенно полезно, если вы предпочитаете работать с данным языком. К примеру, можно легко отсортировать записи по колонке 'Weather' с применением SQL:

In [7]:
con = sqlite3.connect("data/test_db.sqlite")
df = pd.read_sql("SELECT * from weather_2012 ORDER BY Weather LIMIT 3", con)
df
Out[7]:
index Date/Time Temp (C) Dew Point Temp (C) Rel Hum (%) Wind Spd (km/h) Visibility (km) Stn Press (kPa) Weather
0 67 2012-01-03 19:00:00 -16.9 -24.8 50 24 25.0 101.74 Clear
1 114 2012-01-05 18:00:00 -7.1 -14.4 56 11 25.0 100.71 Clear
2 115 2012-01-05 19:00:00 -9.2 -15.4 61 7 25.0 100.80 Clear

Другие базы данных

Пример подключения к MySQL:

Перед использованием, убедитесь, что соответствующая база данных установлена на вашем устройстве

In [ ]:
import MySQLdb
con = MySQLdb.connect(host="localhost", db="test")

Подключение к PostgreSQL:

In [ ]:
import psycopg2
con = psycopg2.connect(host="localhost")

Вопросы для самопроверки:

  1. Как называется функция Pandas для загрузки данных из SQL базы данных?
  2. Какие параметры принимает функция загрузки данных из SQL?
  3. Как сделать столбец 'id' первичным ключом (индексом) DataFrame при чтении из базы данных?
  4. Как называется метод, который используется для записи данных в SQL базу данных?
  5. Какое преимущество дает хранение данных в базе данных, в отличие от CSV-файлов?