2

pandas DataFrame をクエリした後、クエリで選択したインデックスの前に 3 つのエントリを取得したいと考えています。

以下のコードは機能しますが、ダーティで効率的ではないと思います。パンダでそれを行うより良い方法があるとしか思えません。

誰かが私を助けることができますか?

import pandas as pd
import numpy as np

dates = pd.date_range('1/1/2015', periods=50)
df = pd.DataFrame(np.random.randn(50, 4), index=dates, columns=['A', 'B', 'C', 'D'])

x = (df['B'] > df['A']) & \
        ((df['B'].shift(+1) > df['A'].shift(+1)) == False) & \
        (df['B'].shift(+2) > df['A'].shift(+2)) & \
        (df['C'] < df['C'].shift(+2)) & \
        (df['D'] < df['D'].shift(+1))


for d in df[x].index.values:
    idx = df.index.get_loc(d)
    print df.iloc[idx - 3:idx]

上記のコードのサンプル出力:

                   A         B         C         D
2015-01-02 -0.600371 -1.088227 -1.213046 -0.000058
2015-01-03 -2.373683 -0.455126 -0.852127  0.311744
2015-01-04  0.240301 -1.957885  0.184642  0.690865
                   A         B         C         D
2015-01-05 -0.833244 -0.787022 -1.490983 -0.540114
2015-01-06  0.569680  1.798457  1.253075  0.835848
2015-01-07 -0.245731 -0.365678  1.452985  2.007146

Process finished with exit code 0

私が持っているもう1つの質問は、Pythonを使用する代わりに、クエリ内で「Pandas Language」で「shift」を使用できるかどうかです。

助けてくれてありがとう!

4

1 に答える 1

0

私の知る限り、query()メソッドは、列に適用できる関数とメソッドを受け入れません-少なくとも私はそれを機能させることができませんでした

eval()メソッドを使用できます-少し見栄えが良くなります:

In [168]: %paste
mask = (df.eval('B > A')
        & df.shift(1).eval('B <= A')
        & df.shift(2).eval('B > A')
        & (df.C < df.C.shift(2))
        & (df.D < df.D.shift(1)))

df.ix[np.concatenate([np.arange(i-2, i+1) for i in mask.reset_index(name='bool').query('bool').index])]
## -- End pasted text --
Out[168]:
                   A         B         C         D
2015-01-03  0.027326  1.896523  1.052508  0.279496
2015-01-04 -0.226720 -1.465787  2.459746  0.089118
2015-01-05  0.323047  1.707117 -1.760567 -0.066462
2015-01-31 -1.059314  1.991725  0.819225 -1.212651
2015-02-01  1.372391  0.247049  0.408600  0.908394
2015-02-02 -0.777752 -0.326590 -0.062228 -0.226803
2015-02-16 -0.192333  0.562463  0.126509 -0.342867
2015-02-17 -0.363513 -1.582659 -0.903556  0.973706
2015-02-18 -0.796225 -0.575127  0.078172 -2.182067

説明:

In [162]: mask.reset_index(name='bool').query('bool')
Out[162]:
        index  bool
4  2015-01-05  True
32 2015-02-02  True
48 2015-02-18  True

In [163]: mask.reset_index(name='bool').query('bool').index
Out[163]: Int64Index([4, 32, 48], dtype='int64')

In [164]: [np.arange(i-2, i+1) for i in mask.reset_index(name='bool').query('bool').index]
Out[164]:
[array([2, 3, 4], dtype=int64),
 array([30, 31, 32], dtype=int64),
 array([46, 47, 48], dtype=int64)]

In [165]: np.concatenate([np.arange(i-2, i+1) for i in mask.reset_index(name='bool').query('bool').index])
Out[165]: array([ 2,  3,  4, 30, 31, 32, 46, 47, 48], dtype=int64)
于 2016-07-30T21:18:21.913 に答える