Skip to main content

To optimization load DataFrame from databases

Project description

Pandas-sql-loader

Модуль, реализующий функцию sql_load, которая копирует функционал
функции pandas.read_sql(), но оптимизирует потребление памяти. Пытается проставить минимально возможный тип данных для каждого столбца.
(float64 -> float16, int64 -> uint8 и т.д)

Интерфейс метода полностью совместим с pandas.read_sql(), однако присутствуют дополнительные опциональные параметры.

sql_load interface

sql_load(sql,
         con,
         index_col=None,
         coerce_float=True,
         params=None,
         parse_dates=None,
         columns=None,
         chunksize=None,
         need_downcast=False,
         column_types=None,
         iterator=True)

Все стандартные параметры есть в документации, опишу только новые и chunksize:

chunksize: int, default None

Если задан, то:

  1. если iterator=True, тогда вернет вернет итератор
  2. если iterator=False, тогда чанками загрузит датафреймы, объединит их в один и вернет его как результат.

need_downcast: bool, default False

Флаг, устанавливающий нужна оптимизация памяти или нет.

column_types: list, default None

Список numpy типов, к которым нужно привести столбцы.
Если в столбце есть значение, превыщающее заданный тип, то тип будет проигнорирован. Если длина списка меньше, чем кол-во столбцов, то список будет автоматически расширен типами uint8. Если не задан, то каждый столбец попытается привести к uint8.

На самом дел довольно бесполезная штука. Изначально думал, что даункаст будет сильно медленнее стандартного метода, но на деле плюс минус одинаково. Возможно, в следующих версиях будет приводить к данным типам насильно?

iterator: bool, default True

Флаг, устанавливающий должен ли вернуться итератор или уже собранный из чанков DataFrame при установленном chunksize.

Рекомендация

Для датасетов, размер которых в полтора раза меньше чем доступная память и более, настоятельно рекомендуется использовать загрузку чанками, тк прежде чем сдаункастить типы, в память будет загружен DataFrame средствами самого пандас (т.е. с жирными типами)

Пример

Чтобы получить готовый оптимизированный DataFrame, но загруженный чанками:

from pd_sql_loader import sql_load

df = sql_load(query, con, chunksize=10000, need_downcast=True, iterator=False)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for pd-sql-loader, version 1.4.2
Filename, size File type Python version Upload date Hashes
Filename, size pd_sql_loader-1.4.2-py3-none-any.whl (15.0 kB) File type Wheel Python version py3 Upload date Hashes View hashes
Filename, size pd_sql_loader-1.4.2.tar.gz (10.6 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page