Итамар Тернер-Трауринг
Перевод: Лао Ци
Рекомендуемая книга, связанная с этой статьей: «Изучайте Python по-старому: анализ данных».
Давайте представим, что у вас есть набор данных настолько большой, что чтение его в память вызовет переполнение, но вы хотите обработать его часть в Pandas, если в какой-то момент вы просто захотите загрузить часть набора данных, вы можете использовать метод блочный метод.
Если набор данных разделить на несколько частей и загрузить по отдельности, в конечном итоге он будет очень медленным.
Решением на данном этапе является создание поискового индекса, который можно легко решить с помощью SQLite.
Первый способ: дробление
Давайте представим конкретный пример: вы баллотируетесь на определенные выборы, и для этого вы нашли CSV-файл с информацией о каждом избирателе в вашем городе. Таким образом, вы отправляете людей от двери к двери, приглашая всех зарегистрированных избирателей на определенной улице проголосовать.
Теперь у объекта Pandas DataFrame есть индекс, но данные должны быть считаны в память, но файл CSV слишком велик, чтобы поместиться в памяти, поэтому вы можете загружать только те записи, которые вам нужны.
Это первый метод, чтобы заблокировать.
import pandas as pd
def get_voters_on_street(name):
return pd.concat(
df[df["street"] == name] for df in
pd.read_csv("voters.csv", chunksize=1000)
)
Загрузите файл CSV фрагментами, отфильтруйте по названию улицы и объедините полученные записи в одну.
При загрузке построчно основное внимание уделяется относительно небольшому подмножеству, поэтому требуются некоторые накладные расходы. Например, для набора данных размером всего 70 КБ выполнение вышеуказанной функции на моем компьютере занимает 574 мс. В 2018 году в Нью-Йорке было зарегистрировано 4,6 миллиона избирателей, а поиск по улицам занимает 30 секунд.
Неважно, делаем ли мы это только один раз, этот метод не оптимален, если нам нужно делать это неоднократно.
Создать индексный объект
Индексы - это резюме, есть поговорка, что если вам это интересно, вы можете найти здесь много данных. В нашем примере мы хотим создать индекс на основе названий улиц, чтобы мы могли быстро загрузить улицы, на которых находятся избиратели.
Если вы беспокоитесь, что данные индекса также превысят объем памяти, то базу данных можно использовать как контейнер для их сохранения, например, PostgreSQL, MySQL и другие базы данных. О, вам не нравится устанавливать и поддерживать эти надоедливые сервисы, ну, SQLite здесь.
SQLite — это полнофункциональная реляционная база данных, которая работает как любая другая база данных, но не требует сервера. Python поддерживает такие базы данных по умолчанию. SQLite сохраняет данные в отдельных файлах, вам больше нужно управлять файлом данных SQLite вместо файла CSV.
Хранение данных с помощью SQLite
Ниже показано, как работать с SQLite с Pandas:
1. Загрузите данные в SQLite и создайте индексы
База данных SQLite может хранить несколько таблиц данных.Во-первых, загрузите данные файла voicers.csv в SQLite и сохраните их как файл pollers.sqlite.В этом файле мы создаем таблицу с именем избиратели.
Далее создайте индекс улиц в SQLite.
Просто сделайте следующее:
import sqlite3
# Create a new database file:
db = sqlite3.connect("voters.sqlite")
# Load the CSV in chunks:
for c in pd.read_csv("voters.csv", chunksize=1000):
# Append all rows to a new database table, which
# we name 'voters':
c.to_sql("voters", db, if_exists="append")
# Add an index on the 'street' column:
db.execute("CREATE INDEX street ON voters(street)")
db.close()
Хотя мы создаем только один индекс, мы также можем создавать другие индексы для других столбцов или нескольких столбцов, что позволяет нам быстро выполнять поиск в базе данных, используя эти столбцы.
2. Перепишите функцию запроса
Теперь, когда все данные загружены в SQLite, мы можем искать по улицам.
def get_voters_for_street(street_name):
conn = sqlite3.connect("voters.sqlite")
q = "SELECT * FROM voters WHERE street = ?"
values = (street_name,)
return pd.read_sql_query(q, conn, values)
Выполняя вышеуказанную функцию, SQLite загружает только те строки, которые соответствуют запросу, и сохраняет их как объекты DataFrame через Pandas.
в 50 раз быстрее
Этот CSV-файл, содержащий 70 000 строк записей, который раньше занимал 574 мс, теперь занимает всего 10 мс.
В 50+ раз быстрее, потому что нужно загружать только те строки, которые нам нужны, а не каждую строку в CSV-файле.
Оригинальная ссылка:Pythonspeed.com/articles/in…
Найдите общедоступный номер технических вопросов и ответов: класс Лао Ци
Ответ в публичном аккаунте:Лао Ципросмотреть все статьи, книги, курсы.
Если вы считаете, что это выглядит хорошо, пожалуйста, поставьте лайк и перешлите его