2016-09-11 5 views
4

私は、列の値が累積的に少なくとも5つ上がったか、または累積的に少なくとも5つ下がった行を抽出し、これらの累積的変化の兆候(up_or_down)を得ることに興味があります。pandas:変更が累積されたすべての行のみをしきい値で保持しますか?

df = pd.DataFrame({'x': range(16), 'y': [1,10,14,12,13,9,4,2,6,7,10,11,16,17,14,11]}) 

それは得られるはず:たとえば

、のは、私は次のように列yにこれを適用するとしましょう

x y  # up_or_down 
1 10  # +1 
6 4  # -1 
10 10  # +1 
12 16  # +1 
15 11  # -1 

私のデータフレームがかなり大きいので、私は期待していたことがありますiterrows()でそれを繰り返すのではなく、パンダのAPIを使ってこれをネイティブに行う素晴らしいベクター化された方法です。

答えて

1

pandasが公開している標準機能でベクトル化することはできません:n-1thから+/- 5だけ移動するn番目の点は動的に見つかり、n-1thの位置に依存しますn-2個の最初に動的に決定された点上にある。したがって、このダイナミズムを必要とするベクトル空間にあなたを投影することができる関数のセットを展開または拡張することに関連する数学はありません。ですから、あなたは随時繰り返し書く必要があります。

2

これは、その後、あなたがこの

slc = np.array(list(big_diff(df.y))) 
df_slcd = pd.DataFrame(df.values[slc[:, 0]], df.index[slc[:, 0]], df.columns) 
signs = pd.Series(slc[:, 1], df.index[slc[:, 0]], name='up_or_down') 

df_slcd 

enter image description here

signs 

1  1 
6 -1 
10 1 
12 1 
15 -1 
Name: up_or_down, dtype: int64 

pd.concat([df_slcd, signs], axis=1) 
のような何かを行うことができます解決

def big_diff(y): 
    val = y.values 
    r = val[0] 
    for i, x in enumerate(val): 
     d = r - x 
     if abs(d) >= 5: 
      yield i, 1 if d < 0 else -1 
      r = x 

の中核であります

enter image description here

関連する問題