2017-07-20 9 views
0

価格と時間のあるパンダには時系列があります。私は1ヶ月の時間間隔で日付をグループ化し、毎月の価格の10-75%分位を計算し、これらの値を使用して元のデータフレームをフィルタリングします(したがって、10%と75%の間の価格だけが残るようにします)。 )。パンダ:クォンタイルを使用してグループ内のデータの下位10%と上位25%をフィルタリングする最良の方法

データフレームは次のようになります。

df =pd.DataFrame({'date':['01-01-16','02-05-16','01-06-16','01-03-16','01-04-16'],'price':[10,3,4,3,4]}) 
df['date'] = pd.to_datetime(df.date) 
df.index = df.date 

      date  price 
    date 
2016-01-01 2016-01-01 10 
2016-01-06 2016-01-06 3 
2016-01-03 2016-01-03 11 
2016-01-04 2016-01-04 9 
2016-02-05 2016-02-05 4 
2016-02-12 2016-02-12 3 
2016-02-15 2016-02-15 6 

そして、それぞれの月の分位は次のようなものになります。

dg = df.groupby(pd.TimeGrouper('1M')).quantile([0.1,0.75]) 


        price 
date   
2016-01-31 0.10 4.80 
      0.75 10.25 
2016-02-29 0.10 3.20 
      0.75 5.00 

はフィルタリングの後、私が見えるように、私の最後のデータフレームをしたいと思います:

   date  price 
    date 
2016-01-01 2016-01-01 10 
2016-01-04 2016-01-04 9 
2016-02-05 2016-02-05 4 

私はおそらく、これを行う簡単な方法は私が何をしているのかと推測しています思慮深く考えてください - どんな助けでも大歓迎です。

答えて

2

まず、シリーズは、指定された変位値の間にあるかどうかを確認する関数を定義する:

def in_qrange(ser, q): 
    return ser.between(*ser.quantile(q=q)) 

これはブール配列を返します。あなたはresample.transformにこれを渡す場合は、必要があります:

df.resample('1M')['price'].transform(in_qrange, q=[0.1, 0.75]) 
Out: 
date 
2016-01-01  True 
2016-01-03 False 
2016-01-04  True 
2016-01-06 False 
2016-02-05  True 
2016-02-12 False 
2016-02-15 False 
Name: price, dtype: bool 

あなたは、元のデータフレームをフィルタリングするためにこれを使用することができます:

df.loc[df.resample('1M')['price'].transform(in_qrange, q=[0.1, 0.75])] 
Out: 
        date price 
date       
2016-01-01 2016-01-01  10 
2016-01-04 2016-01-04  9 
2016-02-05 2016-02-05  4 
+0

うわー、あなたは素晴らしいです。ありがとうございました!私の配列dtypeは 'bool'ではなく' int64'であったので、私は 'df.loc [df.resample( '1M')['price']を追加したので変更しなければなりませんでしたtransform(in_qrange、q = [0.1、 0.75])astype(ブール)] 'それは魅力のように働いた! – qbzenker

+0

うまくいきました! :) – ayhan