pandas group StopIteration错误

时间:2014-07-04 03:41:23

标签: python pandas

我正在尝试对组对象执行以下操作:

  • 获取到达时间

  • 设置范围,标记为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放在过滤的行上? (感谢矢量化技巧)

0 个答案:

没有答案