2014-10-01 32 views
2

我试图将分组数据降采样到每日平均值,计算每组,并绘制在一个图中得到的时间序列。 我的出发点是以下pd.DataFrameGroupd下采样和绘图pd.DataFrame

value  time  type 
0.1234  2013-04-03 A 
0.2345  2013-04-05 A 
0.34564  2013-04-07 A 
...   ...  ... 
0.2345  2013-04-03 B 
0.1234  2013-04-05 B 
0.2345  2013-04-07 C 
0.34564  2013-04-07 C 

我想每天计算装置,每种类型的内容,并绘制时间序列这些日常手段的单一情节。

目前,我有这个...

names = list(test['type'].unique()) 
types = [] 
for name in names: 
    single = df.loc[df.type == name] 
    single = single.set_index(single.time, drop=False) 
    single = single.resample("D") 
    types.append(single) 

for single, name in zip(types, names): 
    single.rename(columns={"value":name}, inplace=True) 

combined = pd.concat(types, axis=1) 
combined.plot() 

...产生含有所需的输出组合数据帧和下面的情节: What it should look like

在我看来,这可能是通过在初始数据帧上使用groupby更容易实现,但到目前为止,我还无法使用此方法重现所需的绘图。

什么是“聪明的方式”来做到这一点?

编辑: 更大的数据样本(CSV,1000行)在:http://pastebin.com/gi16nZdh

感谢, 马蒂亚斯

+0

您能否提供更大的示例数据集?在csv格式的pastebin中。 – Ffisegydd 2014-10-01 12:46:23

+0

从数据框中添加1k行csv随机样本。 – Matthias 2014-10-01 13:06:44

+1

它当然有帮助,谢谢。我必须将整个数据集的'pivot'转换为'pivot_table',但您肯定指出了正确的方向。 – Matthias 2014-10-01 13:38:52

回答

2

您可以使用pandas.DataFrame.pivot容易做你想要什么,我创建了一个随机例如数据帧然后使用df.pivot按需要排列表。

注意:我已经重新采样为每周一次,因为每天只有一个数据值,请不要忘记更改数据。

import pandas as pd 
import matplotlib.pyplot as plt 

dates = pd.date_range('2013-04-03', periods = 50, freq='D') 
dfs = [pd.DataFrame(dict(time=dates, value=pd.np.random.randn(len(dates)), type=i)) for i in ['A', 'B', 'C', 'D']] 
df = pd.concat(dfs) 

pivoted = df.pivot(index='time', columns='type', values='value') 

pivoted.resample('W') 

print(pivoted.head(10)) 
# type    A   B   C   D 
# time 
# 2013-04-03 0.161839 0.509179 0.055078 -2.072243 
# 2013-04-04 0.323308 0.891982 -1.266360 1.950389 
# 2013-04-05 -2.542464 -0.441849 -2.686183 0.717737 
# 2013-04-06 0.750871 0.438343 -0.002004 0.478821 
# 2013-04-07 -0.118890 1.026121 1.283397 -1.306257 
# 2013-04-08 -0.396373 -1.078925 -0.539617 -1.625549 
# 2013-04-09 0.328076 1.964779 0.194198 0.232702 
# 2013-04-10 -0.178683 0.177359 0.500873 -0.729988 
# 2013-04-11 0.762800 1.576662 -0.456480 0.526162 
# 2013-04-12 -1.301265 -0.586977 -0.903313 0.162008 

pivoted.plot() 

plt.show() 

此代码创建一个名为pivoted其中每一列现在type pivot_table和数据是索引。然后我们简单地使用pivoted.resample('W')对其进行重新采样。

Example plot

+1

这解决了这个小例子的问题。对于整个数据,'df.pivot(...)'方法失败,因为有重复的键,即在同一时间点的几个观测值。但是,'df.pivot_table(...)'使用与您提供的参数相同的参数。 – Matthias 2014-10-01 13:37:53