0

たとえば、次の形式のサブ要素を持つリスト: ['mm,dd,yyyy,hh,mm' 'value']:

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']] 
        }, ...

        ]

私にとってこの問題の全体的な苦痛は、それぞれの集計タイプの欠落している月、日、または年の値を埋めることです。たとえば、集計タイプが年で、すべての「ジュース」値を集計している場合、次のようになります。

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

同じことが月と日の値の問題です。重要なのは、すべての値 ('apple'、'juice' など) が同じ長さのシリーズを持つ必要があることです。つまり、2011 年と 2013 年に 'ferrari' が存在しない場合、そのシリーズは ['2011' になります。 , '0'] および ['2013', '0']. 同様に、'ferrari' が 6 月 ('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']
 ]

..そして同じことが日にも当てはまります..

ここで私ができる最善の戦略は何ですか? どうもありがとう。

4

1 に答える 1

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 のような方法でデータを取得することができます。後者の場合、最適なアルゴリズムが何であるかはよくわかりません。

于 2013-08-17T04:29:31.297 に答える