2014-12-19 4 views
4

Есть ли простой способ/модуль для групповой работы в python для слишком больших наборов данных для размещения в памяти?Группа Операция для большого набора данных

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

+0

[this] (http://stackoverflow.com/questions/773/how-do-i-use-pythons-itertools-groupby) и [this] (https: // docs. python.org/2/library/itertools.html). – Ujjwal

+1

Возможно, вы можете использовать sqlite3.exe для агрегирования данных из-за ядра – steboc

ответ

5

В комментарии @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 для перебора групп данных.

3

Проект Blaze с удовольствием управляет большими наборами данных, разбивая набор данных, а затем используя Pandas на каждом куске. Может заинтересовать вас Blaze out-of-core docs. И вот explicit example в наборе данных такси NYC.

Если вы предпочитаете более медленное, чисто-питонное решение, то проект toolz может вас заинтересовать. Вот его документы: streaming analytics

+0

Хороший пример того, почему ссылки только для ссылок являются устаревшими. только 1 из трех из этих ссылок сохраняется с интервалом 18 месяцев. Возможно: http://blaze.readthedocs.io/en/latest/index.html –

 Смежные вопросы

  • Нет связанных вопросов^_^