我有一个这样生成的字典列表:
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])
现在,我想进行此求和,但要按部门分组-即,我想按部门获得一个汇总的时间序列,并以某种明智的方式进行存储。我可以轻松地针对一个选择的硬编码扇区执行此操作,但是您能想到一种更灵活的方式进行此操作的好方法吗?
我想理想情况下,我会得到一个数据帧,每个总计扇区有一列?
答案 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()
感谢灵感!