2013-11-24 5 views
1

У меня есть список ежедневных транзакционных данных в следующем формате:Трансформации сделок Numpy массива

люди, Артикул, transDate, количество

Я хотел бы суммировать столбец суммы лица и Артикулом и преобразуйте мои результаты в массив numpy. Я отбрасываю поле даты. У меня есть 1,5 ГБ данных, поэтому более эффективно, я могу сделать это, тем лучше ...

Вот небольшой пример того, как я хотел бы алгоритм, чтобы пойти:

print input 
A, 1, 2013-10-10, .5 
A, 1, 2013-10-18, .75 
A, 2, 2013-10-20, 2.5 
B, 1, 2013-10-09, .25 
B, 2, 2014-10-20, .8 

myArray = transform(input) 
print myArray 
[[1.25,2.5],[.25,.8]] 

Любые мысли о том, как эффективно суммировать эти записи, будем очень благодарны!

EDIT: Вот мой код до сих пор:

from collections import defaultdict 

dictObj = {} 

rawData = 'subset.txt' 

with open(rawData) as infile: 
for line in infile: 
    parts = line.split(',') 
    key = (parts[0],parts[1]) 
    val = float(parts[3]) 
    if key in dictObj: 
     dictObj[key] += val 
    else: 
     dictObj[key] = val 
print dictObj 
+2

Вы, привязано к 'numpy'? Я нахожу, что ['pandas'] (http://pandas.pydata.org) имеет тенденцию быть более удобным для такого рода операций с групповой суммой. – DSM

+0

Пожалуйста, покажите, что вы пробовали до сих пор и как оно недостаточно эффективно. Обратите внимание: если у вас есть файл размером 1,5 ГБ, это не очень большой объем данных, поэтому даже субоптимальное решение будет работать в разумные сроки. – leeladam

+0

Да, пойдите для Pandas или бросьте его в базу данных и используйте какой-то хороший старомодный SQL – YXD

ответ

2

Как сказал @DSM, это операция является выглядит как работа для pandas:

>>> from StringIO import StringIO 
>>> import pandas as pd 
>>> data = '''A, 1, 2013-10-10, .5 
... A, 1, 2013-10-18, .75 
... A, 2, 2013-10-20, 2.5 
... B, 1, 2013-10-09, .25 
... B, 2, 2014-10-20, .8''' 
... 
>>> df = pd.read_csv(StringIO(data), names=['person','itemCode','transDate','amount'], skiprows=0) 
>>> df 
    person itemCode transDate amount 
0  A   1 2013-10-10 0.50 
1  A   1 2013-10-18 0.75 
2  A   2 2013-10-20 2.50 
3  B   1 2013-10-09 0.25 
4  B   2 2014-10-20 0.80 
>>> grouped = df.groupby(['person']) 
>>> res = df.groupby(['person']).apply(lambda x: pd.Series(x.groupby('itemCode').sum()['amount'])) 
>>> res 
itemCode  1 2 
person    
A   1.25 2.5 
B   0.25 0.8 

Результатом является pandas.DataFrame, но если вы хотите чтобы получить его в виде массива numpy, вы можете использовать атрибут :

>>> res.values 
array([[ 1.25, 2.5 ], 
     [ 0.25, 0.8 ]]) 
+0

Спасибо, Роман. Это выглядит намного проще, чем то, что я собираюсь попробовать. Мне придется потратить немного времени на синтаксис для Pandas, но на основе всех комментариев, которые кажутся способными! – flyingmeatball

+0

@flyingmeatball да, определенно взгляните, преобразования данных становятся очень забавными :) –

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