熊猫组给出了分界点

时间:2016-07-19 14:50:20

标签: python pandas

我有一个pandas数据框,我需要分成几个组并在每个组中进行某些聚合。

我有一个datetime的列,我需要有效地使用给定的切割点列表将数据帧拆分成不同的组。

用简单的英语,我想找到今天的(0)数据作为第一个窗口,然后是前一天作为第二个窗口(1 ~ 7),等等。切割点中没有真正的模式,因此使用modulo并不是一件简单的事情。

切割点为cutover = [1, 7, 14, 30, 60, 90, 180]

这是我到目前为止所用的,但是每次使用for循环创建一个新窗口并不是最有效的方法:

result = []
for s,e in zip(cutover[:-1], cutover[1:]):
    print s, e
    date_start = date_latest - timedelta(e)
    date_end = date_latest - timedelta(s)
    df_window = df[(df.date > date_start) & (df.date <= date_end)] 
    avgInventory = df_window.qty.mean()
    ...
    result.append(...)

任何人都可以与我分享我可以用来做这种类型的自定义组的任何内置方法吗?

1 个答案:

答案 0 :(得分:0)

我为你制作了这个例子:

tidx = pd.date_range('2012-01-01', periods=4800, freq='H')
df = pd.DataFrame(np.exp(np.random.randn(4800, 2) / 100 + 0.0002) - 1, tidx, list('AB'))

无偿图表

df.add(1).cumprod().plot(legend=False)

enter image description here

解决方案

获取最近日期和所有其他日期之间的时差。根据这些差异,计算一天。最后,根据那些日期计数创建垃圾箱。

bins = [0, 1, 7, 14, 30, 60, 90, 180, 200]
cuts = pd.cut((df.index[-1] - df.index).days, bins)

df.groupby(cuts).agg(['mean', 'std', 'count'])

enter image description here