Есть ли простой способ/модуль для групповой работы в python для слишком больших наборов данных для размещения в памяти?Группа Операция для большого набора данных
Обычно я использую панды, но это ломается для больших наборов данных.
Есть ли простой способ/модуль для групповой работы в python для слишком больших наборов данных для размещения в памяти?Группа Операция для большого набора данных
Обычно я использую панды, но это ломается для больших наборов данных.
В комментарии @steboc упоминается с использованием sqlite как возможного решения. Вы можете использовать любую базу данных в качестве бэкэнд для этого, но sqlite достаточно быстр и требует почти нулевой настройки. Вот пример написания кучи мусора, чтобы SQLITE затем ее обратно в группах:
Начните с загрузкой несколько пакетов и настройки среды:
import pandas as pd
import sqlite3
import string
## connect to a db. This db will be created if it does not exist
conn = sqlite3.connect('example.db')
c = conn.cursor()
np.random.seed(123)
## create some random data in a pandas dataframe
n = 1000000
c = 10
Давайте Переберите в 30 раз, и каждый раз, когда мы создадим блок данных с 1-миллиметровыми записями, 10 числовыми полями и ключом, который является просто буквой. Мы будем вызывать этот файл данных в базе данных sqlite. В конце цикла у нас будет 30 мм строк в нашей базе данных. Это занимает ~ 15 минут на мой MBP:
%%time
for i in arange(30):
df = pd.DataFrame(np.random.randn(n, c), columns=list(map(chr, range(65, 65+c))))
df['key'] = string.ascii_letters[i]
df.to_sql(name='test_table', if_exists='append', con=conn)
Теперь, если мы собирались делать операцию на всю эту группировку данных по значениям в поле key
мы сначала должны получить все уникальные значения для ключ. Один из способов сделать это:
%%time
keys_df = pd.read_sql(sql='SELECT DISTINCT key FROM test_table', con=conn)
keys_df
Теперь у нас есть keys_df
, который является dataframe с одной колонке, содержащей все уникальные значения для `ключ». Теперь мы можем перебирать каждую группу и извлекать только эту группу из базы данных и выполнять нашу сгруппированную операцию. Пример здесь делает тривиальный описать():
%%time
for row in keys_df.iterrows():
tempdf = pd.read_sql(sql='SELECT * FROM test_table WHERE key=\'' + row[1][0] + '\';', con=conn)
## do anything you want with your group here.
## we'll print describe just for fun
print tempdf.describe()
print ""
Очевидно, что в реальной жизни вы бы поставить значения в структуре данных.
Надеюсь, это поможет проиллюстрировать, как использовать sqlite и pandas для перебора групп данных.
Проект Blaze с удовольствием управляет большими наборами данных, разбивая набор данных, а затем используя Pandas на каждом куске. Может заинтересовать вас Blaze out-of-core docs. И вот explicit example в наборе данных такси NYC.
Если вы предпочитаете более медленное, чисто-питонное решение, то проект toolz
может вас заинтересовать. Вот его документы: streaming analytics
Хороший пример того, почему ссылки только для ссылок являются устаревшими. только 1 из трех из этих ссылок сохраняется с интервалом 18 месяцев. Возможно: http://blaze.readthedocs.io/en/latest/index.html –
[this] (http://stackoverflow.com/questions/773/how-do-i-use-pythons-itertools-groupby) и [this] (https: // docs. python.org/2/library/itertools.html). – Ujjwal
Возможно, вы можете использовать sqlite3.exe для агрегирования данных из-за ядра – steboc