滚动过滤器/交叉在熊猫?

时间:2017-02-03 02:11:39

标签: python python-2.7 pandas

我有一个高度稀疏的数据帧(每行只有一个非零值),由非常规时间戳索引,我正在尝试执行以下操作。

对于给定列中的每个非零值,我想计算给定时间范围内其他列中其他非零值的数量。在某种程度上,我正在尝试计算类似于滚动 cross_tab的内容。

到目前为止我的解决方案是丑陋和缓慢的,因为我还没有想出如何使用切片和滚动来做到这一点。它看起来像:

delta = 1
values = pd.DataFrame(0,index= df.columns,columns= df.columns)
for j in df.columns:
    for i in range(len(df[df[j]!=0].index)-1):
        #min is used to avoid overlapping
        values[j] +=df[(df.index<min((df[df[j]!=0].index + pd.tseries.timedeltas.to_timedelta(delta, unit='h'))[i],df[df[j]!=0].index[i+1]))&(df.index>=df[df[j]!=0].index[i])].astype(bool).sum()
values = values.T

和玩具示例数据框是:

 df = pd.DataFrame.from_dict({"2016-01-01 10:00.00":[0,1],
                         "2016-01-01 10:30.00":[1,0],
                         "2016-01-01 12:00.00":[0,1],
                         "2016-01-01 14:00.00":[1,0]},
                        orient="index")
 df.columns=['a','b']
 df.index = pd.to_datetime(df.index)

                      a  b
 2016-01-01 10:00:00  0  1
 2016-01-01 10:30:00  1  0
 2016-01-01 12:00:00  0  1
 2016-01-01 14:00:00  1  0

所需的输出应该是这样的(计数取决于timedelta):

      a     b
a     1     0
b     1     1

1 个答案:

答案 0 :(得分:1)

很难说出你想要的是什么。但它听起来有点像这样

我想使用新功能pandas 0.19。时间意识rolling。为了使用它,我们需要一个排序索引。

d1 = df.sort_index()

现在,让我们假设我们想要在正负一小时内计算。让我们开始为索引的每个元素添加两个小时

d1.index = d1.index + pd.offsets.Hour(2)

然后我们会翻身,回顾四个小时。这将相对于原始指数向前看两小时和向后两小时。

d2 = d1.rolling('4H').sum()
d2.index = d2.index - pd.offsets.Hour(2)
d2

                       a    b
2016-01-01 10:00:00  0.0  1.0
2016-01-01 10:30:00  1.0  1.0
2016-01-01 12:00:00  1.0  2.0
2016-01-01 14:00:00  2.0  1.0