2013-11-24 53 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是的,绝对看看,数据转换变得很有趣:) –