从字典列表中汇总时间序列(Python)

时间:2018-07-27 13:22:44

标签: python pandas numpy dataframe aggregate

我有一个这样生成的字典列表:

all_series = []
    # loop
    ...
    all_series.append({"name": a.name, "sector": a.sector, "ts":a.ts})
    ...

名称和扇区是字符串,ts是按日期索引的熊猫时间序列。

对所有时间序列进行汇总,无论其名称/部门如何都很容易:

reduce(lambda x, y: x.add(y, fill_value=0), [a["ts"] for a in all_series])

现在,我想进行此求和,但要按部门分组-即,我想按部门获得一个汇总的时间序列,并以某种明智的方式进行存储。我可以轻松地针对一个选择的硬编码扇区执行此操作,但是您能想到一种更灵活的方式进行此操作的好方法吗?

我想理想情况下,我会得到一个数据帧,每个总计扇区有一列?

2 个答案:

答案 0 :(得分:1)

您可以使用默认的pd.DataFrame构造函数,在agg之后使用groupby这些系列,然后使用sum

pd.DataFrame(all_series).groupby('sector').ts.agg(tuple).transform(lambda k: sum(k)).T

sector                      sector1 sector2
2018-07-27 10:30:34.057044  102     40
2018-07-28 10:30:34.057044  91      36
2018-07-29 10:30:34.057044  153     163
2018-07-30 10:30:34.057044  119     114

使用示例数据(如果其他人想要尝试其他解决方案):

all_series = []
now = datetime.datetime.now()
all_series.append({"name": 'name1',
                   "sector": 'sector1', 
                   "ts": pd.Series(np.random.randint(100, size=4), 
                                   index=pd.date_range(start=now, freq='D',periods=4))})
all_series.append({"name": 'name1',
                   "sector": 'sector1', 
                   "ts": pd.Series(np.random.randint(100, size=4), 
                                   index=pd.date_range(start=now, freq='D',periods=4))})
all_series.append({"name": 'name2',
                   "sector": 'sector2', 
                   "ts": pd.Series(np.random.randint(100, size=4), 
                                   index=pd.date_range(start=now, freq='D',periods=4))})
all_series.append({"name": 'name2',
                   "sector": 'sector2', 
                   "ts": pd.Series(np.random.randint(100, size=4), 
                                   index=pd.date_range(start=now, freq='D',periods=4))})

答案 1 :(得分:0)

建议的答案毕竟没有用,因为它没有考虑各个时间序列的长度和开始/结束日期。

这是我最终解决它的方法:

pd.concat({(a.sector, a.name): a.ts for i, a in all_series.iterrows()}, axis=1).groupby(axis=1, level=0).sum()

感谢灵感!