2013-08-16 52 views
0

例如,具有在表格的子元素的列表:[「毫米,DD,YYYY,HH,毫米」「值」]:聚合值或日

A = [ 
    ['09,02,2011,09,34' 'apple'], 
    ['09,05,2011,10,20' 'juice'], 
    ['06,04,2012,09,38' 'juice'], 
    ['06,04,2012,09,38' 'juice'], 
    ['06,04,2012,09,40' 'apple'], 
    ['06,04,2012,09,40' 'juice'], 
    ['06,04,2012,09,42' 'green'], 
    ['06,04,2012,23,08' 'juice'], 
    ['06,04,2012,23,10' 'juice'], 
    ['06,04,2012,23,10' 'ferrari'], 
    ['07,03,2012,20,12' 'juice'], 
    ['07,07,2012,21,03' 'people'], 
    ['07,07,2012,21,04' 'juice'], 
    ['07,07,2012,21,04' 'people'], 
    ['07,07,2012,21,04' 'lime'], 
    ['08,16,2012,08,55' 'juice'], 
    ['08,16,2012,08,55' 'juice'], 
    ['08,16,2012,08,55' 'lime'], 
    ['08,16,2012,08,55' 'lime'], 
    ['08,16,2012,08,56' 'juice'], 
    ['08,16,2012,08,57' 'juice'], 
    ['08,16,2012,08,57' 'andy'], 
    ['01,16,2013,03,20' 'people'], 
    ['02,10,2013,04,59' 'lime'] 
    ] 

我尋找一個可靠的聚合策略,可以使用月份(1-12)和年份(max_year到min_year)和月份天數(0-30)來彙總這些值。更確切的說明,每個值的列表中的子元素:

所以,如果聚合類型爲一年,那麼:

out = [ 
     { 
     'name': 'value1_name', 
     'series': [['min_year', 'count']...['max_year', 'count']] 
     }, 
     { 
     'name': 'value2_name', 
     'series':[['min_year', 'count']...['max_year', 'count']] 
     }, ... 

     ] 

如果聚合類型是一個月,那麼:

out = [ 
     { 
     'name': 'value1_name', 
     'series': [['01', 'count']...['12', 'count']] 
     }, 
     { 
     'name': 'value2_name', 
     'series':[['02', 'count']...['12', 'count']] 
     }, ... 

     ] 

而如果聚合類型設置爲天,那麼:

out = [ 
     { 
     'name': 'value1_name', 
     'series': [['01', 'count']...['30', 'count']] 
     }, 
     { 
     'name': 'value2_name', 
     'series':[['01', 'count']...['30', 'count']] 
     }, ... 

     ] 

在此ISSU整個疼痛對我而言,填寫缺失各自聚合類型的月份,日期或年份值。所以,舉例來說,如果聚合類型是一年,我聚集所有的「果汁」的價值觀,然後:

out = [ 
     { 
     'name': 'juice', 
     'series': [['2011', '1'],['2012', '11'],['2013', '0']] 
     },.. 

和同樣是月和天值的問題。關鍵是所有的價值觀('蘋果','果汁'等)應該有一系列具有相同的長度,這意味着如果'法拉利'在2011年和2013年不存在,那麼它的系列應該有''2011' ,'0']和['2013','0']。同樣,如果「法拉利」不,除了六月(「06」)的任何一個月中存在,那麼它的系列應該是這樣的:

'series': [ 
['01', '0'], 
['02', '0'], 
['03', '0'], 
['04', '0'], 
['05', '0'], 
['06', '1'], 
['07', '0'], 
['08', '0'], 
['09', '0'], 
['10', '0'], 
['11', '0'], 
['12', '0'] 
] 

..和同是天的情況下..

我可以在這裏完成的最佳策略是什麼?非常感謝。

+2

好吧,你似乎有一個相當完整的問題描述。你有沒有試過爲此編寫代碼並卡住?如果是這樣,發佈代碼,並告訴我們爲什麼你卡住了。如果沒有,請繼續編碼! – Brionius

+0

這就是我正在做的:-)但如果有更好的例子,那麼...... – user2480542

+0

這可能有助於從一個更好的數據結構開始 - 例如'[09,02,2011, 09,34,'apple']'而不是'['09,02,2011,09,34''apple']'(特別是因爲把兩個串並排放在一起就像連接它們一樣)。然後,您可以通過任何索引進行排序,分組等,只需一個簡單的理解。 – abarnert

回答

1

所以,如果你想使用numpy的解決方案,下面是代碼爲它的緊湊位:

# col is the column of your data to aggregate over 
# minval and maxval are the minimum and maximum (inclusive) 
# values they can take. Getting these to set automatically 
# is a trivial task. 
def agg(A, col, minval, maxval): 
    D = np.array([ [ int(x) for x in d.split(',') ] for d,t in A ]) 
    V = np.array([ t for d,t in A ]) 
    dvals = range(minval,maxval+1) 
    q = [] 
    for v in unique(V): 
     q.append({ 'name': v, 'series': 
       numpy.array([ [x,sum(V[D[...,col]==x]==v)] for x in dvals ]) }) 
    return q 

從本質上講,這是你的數據轉換成numpy的陣列,它允許您使用高級索引輕鬆彙總數據。 D包含日期,V的值,因此,例如,V [D [...,1] == 2]爲您提供每天(第1列)爲2的每個值。

請注意,此版本不一定是禁食。特別是,對於大數據集轉換爲numpy數組可能有點慢,並且迭代潛在值的方法非常緊湊,但不一定是最快的方法。對於前者,您可以創建空數組並使用數據填充它們,或者以更適合於來自fromString或loadtxt的方式獲取數據。對於後者,我不太確定最佳算法是什麼。