2013-08-16 5 views
0

Par exemple, une liste ayant des sous-éléments sous la forme: [ 'mm, dd, yyyy, hh, mm' valeur '']:valeurs agrégées par mois, année ou jour

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

Je suis recherche d'une stratégie d'agrégation solide qui permet d'agréger les valeurs en utilisant les mois (1-12) et l'année (max_year à min_year) et les jours mensuels (0-30). Plus précisément en indiquant, pour chacune des valeurs dans les sous-éléments liste:

Ainsi, si le type d'agrégation est année, alors:

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

     ] 

Si le type d'agrégation est le mois, puis:

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

     ] 

Et si le type d'agrégation est fourni jours, puis:

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

     ] 

la douleur entière dans ce issu Pour moi, e consiste à remplir les valeurs du mois, du jour ou de l'année manquantes pour les types d'agrégation respectifs. Ainsi, par exemple, si le type d'agrégation est l'année, et j'agrège toutes les valeurs « jus », puis:

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

et même est la question pour les mois et les jours. L'essentiel est que toutes les valeurs ('pomme', 'jus', etc.) aient des longueurs égales, ce qui signifie que si 'ferrari' n'existe pas en 2011 et 2013, alors sa série devrait avoir ['2011' , '0'] et ['2013', '0']. De même, si « ferrari » n'existe pas dans un mois, sauf juin (« 06 »), alors la série devrait ressembler à:

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

..et même est le cas pour les jours ..

Quelle est la meilleure stratégie possible que je puisse avoir ici? Merci beaucoup.

+2

Eh bien, vous semblez avoir une description assez complète du problème. Avez-vous essayé de coder quelque chose pour cela et êtes-vous coincé? Si oui, postez le code et dites-nous pourquoi vous êtes bloqué. Sinon, continuez à coder! – Brionius

+0

C'est ce que je fais :-) mais juste au cas où il y aurait un meilleur exemple là-bas ... – user2480542

+0

Il serait probablement utile de commencer avec une bien meilleure structure de données - par exemple, [09, 02, 2011, 09, 34, 'apple'] 'au lieu de' ['09, 02,2011,09,34 '' apple '] '(surtout que mettre deux chaînes côte à côte comme ça ne fait que les concaténer). Ensuite, vous pouvez trier, grouper, etc. par n'importe quel index avec une compréhension triviale. – abarnert

Répondre

1

Donc, si vous voulez une solution à l'aide Numpy, voici un peu compact de code pour elle:

# 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 

Essentiellement, cela convertit vos données dans des tableaux numpy, ce qui vous permet d'utiliser l'indexation avancée pour agréger facilement la Les données. D contient les dates, V les valeurs, donc, par exemple, V [D [..., 1] == 2] vous donne chaque valeur qui a un jour (colonne 1) de 2.

Notez que cela La version n'est pas nécessairement à jeun. En particulier, la conversion en tableaux numpy est probablement un peu lente pour les grands ensembles de données, et la méthode d'itération sur les valeurs potentielles est très compacte mais pas nécessairement la méthode la plus rapide. Pour le premier, vous pouvez soit créer des tableaux vides et les remplir avec vos données, ou obtenir vos données d'une manière plus adaptée à quelque chose comme des chaînes ou loadtxt. Pour ce dernier, je ne suis pas sûr de savoir quel serait l'algorithme optimal.

Questions connexes