查找事件之间的持续时间

时间:2014-08-15 14:14:28

标签: python pandas

我想计算持续时间(在变化之间的几周内)。例如,p在第1,2,3周相同,在第4期更改为1.11。因此持续时间为3.现在持续时间是在从R移植的循环中计算的。它可以工作但速度很慢。任何建议如何改善这一点将不胜感激。

raw['duration']=np.nan
id=raw['unique_id'].unique()
for i in range(0,len(id)):
        pos1= abs(raw['dp'])>0
        pos2= raw['unique_id']==id[i]
        pos= np.where(pos1 & pos2)[0]
        raw['duration'][pos[0]]=raw['week'][pos[0]]-1
        for j in  range(1,len(pos)):
            raw['duration'][pos[j]]=raw['week'][pos[j]]-raw['week'][pos[j-1]]

数据框是原始的,特定unique_id的值如下所示。

date         week p    change    duration
2006-07-08    27  1.05 -0.07         1
2006-07-15    28  1.05  0.00       NaN
2006-07-22    29  1.05  0.00       NaN
2006-07-29    30  1.11  0.06         3
...          ...   ...   ...       ...
2010-06-05   231  1.61  0.09         1
2010-06-12   232  1.63  0.02         1
2010-06-19   233  1.57 -0.06         1
2010-06-26   234  1.41 -0.16         1
2010-07-03   235  1.35 -0.06         1
2010-07-10   236  1.43  0.08         1
2010-07-17   237  1.59  0.16         1
2010-07-24   238  1.59  0.00       NaN
2010-07-31   239  1.59  0.00       NaN
2010-08-07   240  1.59  0.00       NaN
2010-08-14   241  1.59  0.00       NaN
2010-08-21   242  1.61  0.02         5

##

3 个答案:

答案 0 :(得分:0)

计算duratiosn一旦你的日期顺序列表是微不足道的:迭代列表,跟踪自上次更改为p以来的时间。如果缓慢来自您获取该列表的方式,那么您还没有提供足够的信息来获取帮助。

答案 1 :(得分:0)

您可以简单地获取有更改的周数列表,然后计算它们的差异,最后将这些差异重新加入到原始DataFrame中。

weeks = raw.query('change != 0.0')[['week']]
weeks['duration'] = weeks.week.diff()
pd.merge(raw, weeks, on='week', how='left')

答案 2 :(得分:0)

raw2=raw.ix[raw['change'] !=0,['week','unique_id']]
data2=raw2.groupby('unique_id')
raw2['duration']=data2['week'].transform(lambda x: x.diff())
raw2.drop('unique_id',1)
raw=pd.merge(raw,raw2,on=['unique_id','week'],how='left')

谢谢大家。我修改了建议并得到了与复杂循环相同的答案。 10,000。观察,它的速度并不快,但代码似乎更紧凑。

我没有对Nan进行任何更改,因为在没有进行任何更改时,持续时间似乎未定义。但是零也会起作用。使用上面的代码,NaN通过合并自动输入。在任何情况下, 我想分别计算非变更组的统计数据。