2013-11-24 47 views
1

我每天的交易數據的格式如下列表:轉型的交易,以numpy的陣列

人,itemCode,transDate,量

我想用的人,itemCode總結量柱將我的結果轉換爲一個numpy數組。我正在刪除日期字段。我有1.5GB的數據,所以更有效地我能做到這一點的更好...

這裏的去的我怎麼想的算法的一個小例子:

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]] 

任何關於如何思考有效地總結這些記錄將不勝感激!

編輯:這是我到目前爲止的代碼:

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 GB的txt文件,它並不是一個非常大的數據量,所以即使是一個不理想的解決方案也能在合理的時間內運行。 – leeladam

+0

是的,去大熊貓或把它扔進一個數據庫,並使用一些老式的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數組,你可以使用values屬性:

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

感謝羅馬 - 這看起來比我想要做的要容易得多,我不得不花一點時間在Pandas的語法上,但是基於所有看起來像是要走的方式! – flyingmeatball

+0

@flyingmeatball是的,絕對看看,數據轉換變得很有趣:) –