我正在尝试对组对象执行以下操作:
获取到达时间
设置范围,标记为vectorized where
在内部时间获得积累
def deltat(g):
try:
g['tavg'] = g[ g['alert_v']==1 ]['timeindex'].diff(1)
g['iqt'] = np.where( g['value'] > g['value'].quantile(.90) or g['value']< g['value'].quantile(.10),1,0)
#pd.to_datetime(g[['tavg']], format='%H:%M:%S')
#print type(g['tavg'] )
g['cumt'] = g['tavg'].cumsum(0) #pd.rolling_sum(g['tavg'],2,0).shift(1)
print g.head()
return g
except:
pass
d.sort_index(axis=0, inplace=True)
d=d.groupby(['source','subject_id','alert_t','variable'],as_index=False,group_keys=False).apply(lambda x: deltat(x))
error:
我收到StopIteration错误。是什么导致这个?为什么异常不仅仅是通过?
cumsum
我是否正确使用了cumsum,还是需要使用rolling_sum来获取列中每个后续两个时间值行的总和?
- 非常感谢帮助
- 编辑: 这是一些示例输入:
d = pd.DataFrame({'alert_v': [1]*4 + [0]*4,
'value': np.random.rand(0,4)*3 + np.random.rand(0,4),
'timeindex': pd.date_range(end='6/20/2012',periods=8)
})
我需要的是输出列:
tavg
这是alert_v
为1的后续时间差异。
iqt
需要为高于/低于分位数水平的任何值设置1或0
cumt
这是每个后续tavg值的累积和,即cumsum
alert_v value timeindex tavg iqt cumt
1 3.1 6/13 NaN 0 NaN
1 2.9 6/14 1 0 1
0 .3 6/15 Nan 0 NaN
1 3.3 6/16 2 0 3
0 .3 6/17 NaN 0 NaN
0 .5 6/18 NaN 0 NaN
0 .2 6/19 NaN 1 NaN
1 3.8 6/20 4 1 7
尝试向量化仍然会产生StopIteration
错误:
`gg['cumt'] = gg.apply(lambda x: pd.rolling_sum(x['tavg'],2, min_periods=2).shift(1) )`
或
gg['cumt'] = gg.apply( lambda x: x['tavg'] + x['tavg'].shift(1)[1:] )
对于tavg和iqt,我使用这两种方法,但是在两个不同的函数中......将它们放在一个函数中会导致问题。
g['tavg'] = g[ g['alert_v']==1 ]['timeindex'].diff(1)
g['iqt'] = g['value'].map(lambda x: x > g['value'].quantile(.90) and 1 or x < g['value'].quantile(.10) and 1 or 0)
alert_v value tavg iqt
timeindex
1984-12-12 13:33:00 0 86 NaT NaN
1984-12-12 14:08:00 0 85 NaT 1
1984-12-12 14:08:00 0 85 NaT 1
1984-12-12 14:08:00 0 84 NaT 1
1984-12-12 14:08:00 0 84 NaT 1
1984-12-12 14:08:00 1 82 NaT 1
1984-12-12 14:25:00 1 83 00:17:00 1
1984-12-12 14:47:00 1 83 00:22:00 1
1984-12-12 16:37:00 0 88 01:50:00 1
1984-12-12 16:37:00 1 82 01:50:00 1
1984-12-12 16:37:00 0 90 01:50:00 1
1984-12-12 17:52:00 0 85 01:15:00 0
1984-12-12 17:52:00 1 95 01:15:00 0
1984-12-12 19:29:00 1 91 01:37:00 0
1984-12-12 19:29:00 0 95 01:37:00 0
无论如何,我如何将cumsum放在过滤的行上? (感谢矢量化技巧)