第二部分:计算总和的结果是正数(或负数)的次数

时间:2016-09-19 11:28:03

标签: python pandas numpy

第二部分第一部分可在此处找到:Click me

大家好,我一直在练习你们帮助我创建的gg功能 - 请参阅第一部分。现在,我意识到函数的输出不是唯一的序列,而是一个总和:例如,一行中的一系列3个正数也显示为连续两个正数的2个系列和3个单个正数。

我们说我得到了这个:

df = pd.DataFrame(np.random.rand(15, 2), columns=["open", "close"])
df['test'] = df.close-df.open > 0

        open     close   test
0   0.769829  0.261478  False
1   0.770246  0.128516  False
2   0.266448  0.346099   True
3   0.302941  0.065790  False
4   0.747712  0.730082  False
5   0.382923  0.751792   True
6   0.028505  0.083543   True
7   0.137558  0.243148   True
8   0.456349  0.649780   True
9   0.041046  0.163488   True
10  0.291495  0.617486   True
11  0.046561  0.038747  False
12  0.782994  0.150166  False
13  0.435168  0.080925  False
14  0.679253  0.478050  False

df.test
Out[113]: 
0     False
1     False
2      True
3     False
4     False
5      True
6      True
7      True
8      True
9      True
10     True
11    False
12    False
13    False
14    False

作为输出,我希望连续的True系列的唯一数量;类似的东西:

1: 1
2: 0
3: 0
4: 0
5: 0
6: 1
7: 0
8: 0

到目前为止我已尝试过:

(green.rolling(x).sum()>x-1).sum() #gives me how many times there is a series of x True in a row; yet, this is not unique as explained beforehand

但是,我不认为滚动是这里的解决方案......

再次感谢您的帮助, CronosVirus00

1 个答案:

答案 0 :(得分:1)

您要找的是来自groupbyitertools函数和来自Counter的{​​{1}}。以下是如何实现您的目标:

collections

输出:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(15, 2), columns=["open", "close"])
df['test'] = df.close-df.open > 0 

from itertools import groupby
from collections import Counter
#we group each sequence of True and False
seq_len=[(k,len(list(g))) for k, g in groupby(list(df['test']))]
#we filter to keep only True sequence lenght
true_seq_len= [n for k,n in seq if k == True]
#we count each length
true_seq_count = Counter(true_seq_len)