Python 按月、年或日的合计值

Python 按月、年或日的合计值,python,numpy,Python,Numpy,例如,具有子元素的列表的格式为:['mm,dd,yyyy,hh,mm''值']: 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'],

例如,具有子元素的列表的格式为:['mm,dd,yyyy,hh,mm''值']:

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)和年份(最大年到最小年)以及月天数(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']] 
        }, ...

        ]
对我来说,这一问题的全部痛苦在于为各自的聚合类型填充缺少的月、日或年值。因此,例如,如果聚合类型为year,并且我正在聚合所有“juice”值,那么:

    out = [
        {
        'name': 'juice',
        'series': [['2011', '1'],['2012', '11'],['2013', '0']] 
        },..
月和日值的问题也是如此。关键是所有值(“苹果”、“果汁”等)都应该有长度相等的系列,这意味着如果2011年和2013年不存在“法拉利”,那么其系列应该有['2011'、'0']和['2013'、'0']。同样,如果“法拉利”在除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']
 ]
…几天的情况也是如此


我在这里能采取的最好策略是什么?非常感谢。

因此,如果您想要使用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的方式获取数据。对于后者,我不太确定最优算法是什么。

好吧,你似乎对这个问题有一个相当完整的描述。您是否尝试为此编写代码,但遇到了问题?如果是这样的话,把代码贴出来,告诉我们你为什么被卡住了。如果没有,继续编码!这就是我正在做的:-)但是以防万一,如果有更好的例子出现的话…它可能会有助于从一个更好的数据结构开始,例如,
[09,02,2011,09,34,'apple']
而不是
['09,022011,09,34''apple']
(特别是因为像这样并排放置两个字符串只是将它们连接起来). 然后,您可以通过任何索引进行排序、分组等,只需简单的理解。同时,不要预先填充缺少的值;只需在预期的范围内迭代,而不是在结构上迭代,在匹配值存在时提取匹配值,在不存在时使用默认值。如果您在要聚合的字段上建立一个dict键,那么
dict.get
方法一步就完成了整个“找到正确的值,如果没有,就给我这个默认值”。您所说的“最佳可能策略”是什么意思?你有多少数据?如果使用numpy(正如您在标签中所做的那样)是一个好主意,那么这就足够了吗?