Чтение и запись SQL-файлов в Pandas
При изучении анализа данных, зачастую первое, на что стоит обратить внимание — это SQL и Pandas. Крайне важно иметь прочную основу для работы с SQL и Pandas для аналитику данных. Оба являются мощными инструментами, которые помогают аналитикам данных эффективно анализировать и манипулировать данными, хранящимися в базах данных.
Обзор SQL и Pandas
SQL (язык структурированных запросов) — это язык программирования, используемый для управления реляционными базами данных и манипулирования ими. С другой стороны, Pandas — это библиотека Python, используемая для манипулирования и анализа данных.
Анализ данных предполагает работу с большими объемами данных, и для хранения этих данных часто используются базы данных. SQL и Pandas предоставляют мощные инструменты для работы с базами данных, позволяющие аналитикам данных эффективно извлекать, манипулировать и анализировать данные. Используя эти инструменты, аналитики данных могут получить ценную информацию из данных, которые в противном случае было бы трудно получить.
В этой статье мы рассмотрим, как использовать SQL и Pandas для чтения и записи в базу данных.
Подключение к БД
Установка библиотек
Сначала мы должны установить необходимые библиотеки, прежде чем мы сможем подключиться к базе данных SQL с помощью Pandas. Требуются две основные библиотеки: Pandas и SQLAlchemy.
Pandas — это популярная библиотека манипулирования данными, которая, как упоминалось во введении, позволяет хранить большие структуры данных. Напротив, SQLAlchemy предоставляет API для подключения к базе данных SQL и взаимодействия с ней.
Мы можем установить обе библиотеки с помощью менеджера пакетов Python pip, выполнив следующие команды в командной строке.
$ pip install pandas $ pip install sqlalchemy
Установление связи
Установив библиотеки, мы теперь можем использовать Pandas для подключения к базе данных SQL.
Для начала мы создадим объект механизма SQLAlchemy с расширением create_engine()
. Функция create_engine()
подключает код Python к базе данных. В качестве аргумента он принимает строку подключения, в которой указывается тип базы данных и сведения о соединении. В этом примере мы будем использовать тип базы данных SQLite и путь к файлу базы данных.
Создайте объект механизма для базы данных SQLite, используя приведенный ниже пример:
import pandas as pd from sqlalchemy import create_engine # Create an engine object engine = create_engine('sqlite:///C/SQLite/student.db')
Если файл базы данных SQLite, в нашем случае Student.db, находится в том же каталоге, что и сценарий Python, мы можем напрямую использовать имя файла, как показано ниже.
engine = create_engine('sqlite:///student.db')
Чтение SQL-файлов с помощью Pandas
Давайте прочитаем данные теперь, когда мы установили соединение. В этом разделе мы рассмотрим функции read_sql
, read_sql_table
и read_sql_query
и то, как их использовать для работы с базой данных.
Выполнение SQL-запросов с использованием функции read_sql() Panda
Это read_sql()
функция библиотеки Pandas, которая позволяет нам выполнять SQL-запрос и получать результаты в кадр данных Pandas. Функция read_sql()
соединяет SQL и Python, позволяя нам воспользоваться возможностями обоих языков. Функция оборачивает read_sql_table()
и read_sql_query()
. Функция read_sql()
внутренне маршрутизируется на основе предоставленных входных данных. Это означает, что если входные данные предназначены для выполнения SQL-запроса, они будут перенаправлены в read_sql_query()
, а если это таблица базы данных, они будут перенаправлены в read_sql_table()
.
Синтаксис read_sql()
следующий:
pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)
Обязательны параметры SQL и con; остальные не являются обязательными. Однако мы можем манипулировать результатом, используя эти необязательные параметры. Давайте подробнее рассмотрим каждый параметр.
sql
: имя SQL-запроса или таблицы базы данных.con
: объект подключения или URL-адрес подключения.index_col
: этот параметр позволяет нам использовать один или несколько столбцов из результата запроса SQL в качестве индекса фрейма данных. Он может принимать либо один столбец, либо список столбцов.coerce_float
: этот параметр указывает, следует ли преобразовывать нечисловые значения в числа с плавающей запятой или оставить их в виде строк. По умолчанию установлено значение true. Если возможно, он преобразует нечисловые значения в типы с плавающей запятой.params
: параметры предоставляют безопасный метод передачи динамических значений в запрос SQL. Мы можем использовать параметр params для передачи словаря, кортежа или списка. В зависимости от базы данных синтаксис параметров различается.parse_dates
: это позволяет нам указать, какой столбец в результирующем кадре данных будет интерпретироваться как дата. Он принимает один столбец, список столбцов или словарь с ключом в качестве имени столбца и значением в качестве формата столбца.columns
: это позволяет нам выбирать только выбранные столбцы из списка.chunksize
: при работе с большим набором данных важен размер фрагмента. Он извлекает результат запроса меньшими порциями, повышая производительность.
Вот пример того, как использовать read_sql()
:
Код:
import pandas as pd from sqlalchemy import create_engine # Create an engine object engine = create_engine('sqlite:///C/SQLite/student.db') # Fetch all records from Student table and manipulate the result df = pd.read_sql("SELECT * FROM Student", engine, index_col='Roll Number', parse_dates='dateOfBirth') print(df) print("The Data type of dateOfBirth: ", df.dateOfBirth.dtype) # Close the Database connection engine.dispose()
Вывод:
firstName lastName email dateOfBirth rollNumber 1 Mark Simson marksimson@gmail.com 2000-02-23 2 Peter Griffen petergriffen@gmail.com 2001-04-15 3 Meg Aniston meganiston@gmail.com 2001-09-20 Date type of dateOfBirth: datetime64[ns]
После подключения к базе данных выполняем запрос, который возвращает все записи из таблицы Student
и сохраняет их в DataFrame df
. Столбец «Roll Number» преобразуется в индекс с помощью этого index_col
параметра, а тип данных «dateOfBirth» — «datetime64[ns]» из-за parse_dates
. Мы можем использовать его read_sql()
не только для получения данных, но и для выполнения других операций, таких как вставка, удаление и обновление. read_sql()
является общей функцией.
Загрузка определенных таблиц или представлений из БД
Загрузка определенной таблицы или представления с помощью Pandas read_sql_table()
— это еще один метод чтения данных из базы данных в кадр данных Pandas.
Что такое read_sql_table ?
Библиотека Pandas предоставляет read_sql_table
функцию, которая специально разработана для чтения всей таблицы SQL без выполнения каких-либо запросов и возврата результата в виде кадра данных Pandas.
Синтаксис read_sql_table()
следующий:
pandas.read_sql_table(table_name, con, schema=None, index_col=None, coerce_float=True, parse_dates=None, columns=None, chunksize=None)
За исключением table_name
и схемы, параметры объясняются так же, как и read_sql()
.
table_name
: параметрtable_name
представляет собой имя таблицы SQL в базе данных.schema
: этот необязательный параметр представляет собой имя схемы, содержащей имя таблицы.
После создания соединения с базой данных мы воспользуемся read_sql_table
функцией для загрузки Student
таблицы в DataFrame Pandas.
import pandas as pd from sqlalchemy import create_engine # Create an engine object engine = create_engine('sqlite:///C/SQLite/student.db') # Load Student Table from database df = pd.read_sql_table('Student', engine) print(df.head()) # Close the Database connection engine.dispose()
Вывод:
rollNumber firstName lastName email dateOfBirth 0 1 Mark Simson marksimson@gmail.com 2000-02-23 1 2 Peter Griffen petergriffen@gmail.com 2001-04-15 2 3 Meg Aniston meganiston@gmail.com 2001-09-20
Предположим, что это большая таблица, которая может занимать много памяти. Давайте рассмотрим, как мы можем использовать этот chunksize
параметр для решения этой проблемы.
Код:
import pandas as pd from sqlalchemy import create_engine # Create an engine object engine = create_engine('sqlite:///C/SQLite/student.db') # Load student table from database df_iterator = pd.read_sql_table('Student', engine, chunksize = 1) # Iterate the dataframe for df in df_iterator: print(df.head()) # Close the Database connection engine.dispose()
Вывод:
rollNumber firstName lastName email dateOfBirth 0 1 Mark Simson marksimson@gmail.com 2000-02-23 0 2 Peter Griffen petergriffen@gmail.com 2001-04-15 0 3 Meg Aniston meganiston@gmail.com 2001-09-20
Имейте в виду, что chunksize
я использую здесь значение 1, потому что в моей таблице только 3 записи.
Непосредственный запрос к БД с помощью синтаксиса SQL Pandas
Извлечение информации из базы данных является важной частью для аналитиков данных и ученых. Для этого мы воспользуемся этой read_sql_query()
функцией.
Что такое read_sql_query()?
Используя функцию Pandas read_sql_query()
, мы можем запускать SQL-запросы и получать результаты непосредственно в DataFrame. Функция read_sql_query()
создана специально для SELECT
операторов. Его нельзя использовать для каких-либо других операций, таких как DELETE
или UPDATE
.
Синтаксис:
pandas.read_sql_query(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, chunksize=None, dtype=None, dtype_backend=_NoDefault.no_default)
Все описания параметров такие же, как и у read_sql()
функции. Вот пример read_sql_query()
:
Код:
import pandas as pd from sqlalchemy import create_engine # Create an engine object engine = create_engine('sqlite:///C/SQLite/student.db') # Query the Student table df = pd.read_sql_query('Select firstName, lastName From Student Where rollNumber = 1', engine) print(df) # Close the Database connection engine.dispose()
Вывод:
firstName lastName 0 Mark Simson
Написание SQL-файлов с помощью Pandas
Предположим, что при анализе данных мы обнаружили, что необходимо изменить несколько записей или требуется новая таблица или представление с данными. Чтобы обновить или вставить новую запись, можно использовать read_sql()
и написать запрос. Однако этот метод может быть длительным. Pandas предоставляет отличный метод, предназначенный to_sql()
для подобных ситуаций.
В этом разделе мы сначала создадим новую таблицу в базе данных, а затем отредактируем существующую.
Создание новой таблицы в базе данных SQL
Прежде чем создавать новую таблицу, давайте сначала обсудим ее to_sql()
подробно.
Что такое to_sql() ?
Функция to_sql()
библиотеки Pandas позволяет нам писать или обновлять базу данных. Функция to_sql()
может сохранять данные DataFrame в базе данных SQL.
Синтаксис для to_sql()
:
DataFrame.to_sql(name, con, schema=None, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None, method=None)
Только параметры name и con обязательны для запуска to_sql(); однако другие параметры обеспечивают дополнительную гибкость и возможности настройки. Давайте подробно обсудим каждый параметр:
name
: имя таблицы SQL, которую необходимо создать или изменить.con
: объект подключения к базе данных.schema
: Схема таблицы (необязательно).if_exists
: Значение этого параметра по умолчанию — «не выполнено». Этот параметр позволяет нам решить, какое действие следует предпринять, если таблица уже существует. Возможные варианты: «провалить», «заменить» и «добавить».index
: параметр index принимает логическое значение. По умолчанию для него установлено значение True, что означает, что индекс DataFrame будет записан в таблицу SQL.index_label
: этот необязательный параметр позволяет нам указать метку столбца для индексных столбцов. По умолчанию индекс записывается в таблицу, но с помощью этого параметра можно задать конкретное имя.chunksize
: количество строк, которые будут записываться одновременно в базу данных SQL.dtype
: этот параметр принимает словарь с ключами в качестве имен столбцов и значениями в качестве типов данных.method
: параметр метода позволяет указать метод, используемый для вставки данных в SQL. По умолчанию для него установлено значение «Нет», что означает, что панды найдут наиболее эффективный способ на основе базы данных. Существует два основных варианта параметров метода:multi
: позволяет вставлять несколько строк в один SQL-запрос. Однако не все базы данных поддерживают многострочную вставку.- Вызываемая функция : здесь мы можем написать собственную функцию для вставки и вызывать ее, используя параметры метода.
Вот пример использования to_sql()
:
import pandas as pd from sqlalchemy import create_engine # Create an engine object engine = create_engine('sqlite:///C/SQLite/student.db') # Create a new Dataframe that will be our new table data = {'Name': ['Paul', 'Tom', 'Jerry'], 'Age': [9, 8, 7]} df = pd.DataFrame(data) # Create a new table called Customer df.to_sql('Customer', con=engine, if_exists='fail') # Close the Database connection engine.dispose()
В базе данных создается новая таблица «Клиент» с двумя полями «Имя» и «Возраст».
Снимок базы данных:
Обновление существующих таблиц с помощью фреймов данных Pandas
Обновление данных в базе данных — сложная задача, особенно при работе с большими данными. Однако использование этой to_sql()
функции в Pandas может значительно упростить эту задачу.
Чтобы обновить существующую таблицу в базе данных, to_sql()
функцию можно использовать с if_exists
параметром, установленным на «заменить». Это приведет к перезаписи существующей таблицы новыми данными.
Вот пример to_sql()
обновления ранее созданной Customer
таблицы. Предположим, в Customer
таблице мы хотим обновить возраст клиента по имени Пол с 9 до 10. Для этого сначала мы можем изменить соответствующую строку в DataFrame, а затем использовать функцию для обновления to_sql()
базы данных.
Код:
import pandas as pd from sqlalchemy import create_engine # Create a connection to the SQLite database engine = create_engine('sqlite:///C/SQLite/student.db') # Load Customer Table into a Dataframe df = pd.read_sql_table('Customer', engine) # Modify the age of the customer named Paul df.loc[df['Name'] == 'Paul', 'Age'] = 10 # Update the Customer table with the modified DataFrame df.to_sql('Customer', con=engine, if_exists='replace') # Close the Database connection engine.dispose()
В базе данных обновляется возраст Павла:
Заключение
В заключение отметим, что Pandas и SQL являются мощными инструментами для задач анализа данных, таких как чтение и запись данных в базу данных SQL. Pandas предоставляет простой способ подключения к базе данных SQL, чтения данных из базы данных в фрейм данных Pandas и записи данных фрейма данных обратно в базу данных.
Библиотека Pandas упрощает манипулирование данными в кадре данных, тогда как SQL предоставляет мощный язык для запроса данных в базе данных. Использование Pandas и SQL для чтения и записи данных может сэкономить время и усилия при выполнении задач анализа данных, особенно если данные очень большие. В целом совместное использование SQL и Pandas может помочь аналитикам данных и ученым оптимизировать свой рабочий процесс.