2017-01-21 1 views
2

私は10列のデータフレーム(df)を持っています。インデックスにはさまざまな日付がありますが、複数の同一の日付があります(日付別にソートされています)。さらに、この問題の重要な列はdf ['Weight']とdf ['Price']です。ここ私はパンダのデータフレームのそれぞれの日付を見て、日付ごとに別の列の条件に基づいて1つの列(重み)を調整しています

のみ1指標値(2017年1月21日)のために2列のデータの一例であり、実際には複数の重みを有する複数の日付がある等

  Weight Price 
1/21/2017 0.1  12 
1/21/2017 0.04 21 
1/21/2017 0.03 13 
1/21/2017 0.02 22 
1/21/2017 0.2  27 
1/21/2017 0.001 30 
1/21/2017 0.1  34 
1/21/2017 0.21 21 
1/21/2017 0.003 12 
1/21/2017 0.01 32 
1/21/2017 0.04 21 
1/21/2017 0.005 12 
1/21/2017 0.05 10 
1/21/2017 0.1  3 
1/21/2017 0.091 24 

重みが最大追加1を指定します。これは、索引の一意の日付ごとに適用されます。

ここでは、特定の日付のPriceの各値のパーセントランクに基づく列df ['adjusted weight']を作成しようとしています。

特定の日付の他の価格に対して中程度の価格であるdf ['adjusted weight']はdf ['Weight']に等しくなります。

特定の日付の価格の下位10%の場合、df ['調整された重み']はdf ['重量']/2になります。

任意の日付の価格の上位10%の場合、私たちは、その日付の新しいDF [調整された重みが ']今1

等しい。これは、分割することによって行われることになるなるように調整された重みを調整する必要があります価格が上位10%価格の現在の合計で日付の上位10%にあるすべての重量と、その数自体と下位10から切り落とされた重量の合計%、それを再び1にする。ここで

私が望んで出力されます:

  Weight Price Percent rank Adjusted Weight 
1/21/2017 0.1  12 0.142 0.1 
1/21/2017 0.04 21 0.428 0.04 
1/21/2017 0.03 13 0.357 0.03 
1/21/2017 0.02 22 0.642 0.02 
1/21/2017 0.2  27 0.785 0.2 
1/21/2017 0.001 30 0.857 0.001 
1/21/2017 0.1  34 1  **0.168181818** 
1/21/2017 0.21 21 0.428 0.21 
1/21/2017 0.003 12 0.142 0.003 
1/21/2017 0.01 32 0.928 **0.016818182** 
1/21/2017 0.04 21 0.428 0.04 
1/21/2017 0.005 12 0.142 0.005 
1/21/2017 0.05 10 0.071 **0.025** 
1/21/2017 0.1  3 0  **0.05** 
1/21/2017 0.091 24 0.714 0.091 

私が変更されている値の周り**入れている、とcoincedentally下位10%のPCTランクで2つの値と2つの値は上位10%ですランク。 (E11 + E8 + E15 + E14-(H15 + H14))ここで、表の下の2つの値については、 D1からH16に及ぶ。

それはかなりトリッキーな問題ですが、私は妥当な方法で尋ねたがっています。誰かがアドバイスして助けてくれたら、私はそれをとても感謝します。読んでいただきありがとうございます。私が得たアイデアを聞くのが大好きです。さらに、データセットが大きいので、各日付で同じ作業を行う必要があるので、どれくらい時間がかかるかわかりません。

調整された重量は元の重量と一緒に存在する新しい列にしたいと思います。さらに、価格だけでなく他の列でも機能するものは素晴らしいでしょう。

ご協力いただきありがとうございます。

最高の願い。

答えて

0
def adjust(df): 
    df = df.copy() 
    b, t = df.Price.quantile([.1, .9]) 
    ltb = df.Price.lt(b) 
    get = df.Price.ge(t) 
    bsum = df.Weight[ltb].sum() 
    tsum = df.Weight[get].sum() 
    df.loc[ltb, 'Weight'] /= 2 
    df.loc[get, 'Weight'] *= (bsum/2 + tsum)/tsum 
    return df 

df.groupby(level=0).apply(adjust).reset_index(0, drop=True) 

       Weight Price 
2017-01-21 0.100000  12 
2017-01-21 0.040000  21 
2017-01-21 0.030000  13 
2017-01-21 0.020000  22 
2017-01-21 0.200000  27 
2017-01-21 0.001000  30 
2017-01-21 0.168182  34 
2017-01-21 0.210000  21 
2017-01-21 0.003000  12 
2017-01-21 0.016818  32 
2017-01-21 0.040000  21 
2017-01-21 0.005000  12 
2017-01-21 0.025000  10 
2017-01-21 0.050000  3 
2017-01-21 0.091000  24 
+0

ありがとうございます。私はこのコードを使用しましたが、私が苦労して尋ねたいのは、既存の重みテーブルを置き換えるのではなく、これを別の列として追加する方法と、価格だけでなく他の列にも関数を使用しようとします同じように出てくる。私はあなたの答えに本当に感謝しています - – MysterioProgrammer91

関連する問題