ループを回避し、ルックバック期間を制限する1つの方法です。あなたの例を使用して
:購入する株式を示す '1' で
>>>df['bought'] = np.where(df['Percentile'] >= 0.7, 1, np.nan)
>>>df['bought or sold'] = np.where(df['Percentile'] < 0.5, 0, df['bought'])
、「0:
import pandas as pd
import numpy as np
>>>df = pd.DataFrame([['1/1/2000', 'Apple', 0.010, 0.75],
['1/1/2000', 'IBM', 0.011, 0.4],
['1/1/2000', 'Google', 0.012, 0.45],
['1/1/2000', 'Nokia', 0.022, 0.81],
['2/1/2000', 'Apple', 0.014, 0.56],
['2/1/2000', 'Google', 0.015, 0.45],
['2/1/2000', 'Nokia', 0.016, 0.55],
['3/1/2000', 'Apple', 0.020, 0.52],
['3/1/2000', 'Google', 0.030, 0.51],
['3/1/2000', 'Nokia', 0.040, 0.47]],
columns=['Date', 'Stock', 'Weight', 'Percentile'])
まず、株式が開始または最終重量に追跡されて停止するときを識別所有していれば売る人。
これにより、その株式が所有されているかどうかを識別することができます。
>>>df['own'] = df.groupby('Stock')['bought or sold'].fillna(method='ffill').fillna(0)
'ffill'
前方売買日から所有権の状態を伝播する、埋める前進である:これは日付インデックスなしでデータフレームの上にそれを使用する任意の時点であれば、すでに、時系列に並べ替えることがデータフレームを必要とすることに注意してください。 .fillna(0)
は、データフレーム全体に対して.5と.7の間に残っている在庫をキャッチします。 はその後、
>>>df['Final Weight'] = df['own']*df['Weight']
乗算最終重量を計算df['own']
が身元またはゼロであることと、他のnp.whereより少し速いですし、同じ結果を与えます。
編集:
速度が懸念されるので、一つの列のすべてをやって、@cronosによって示唆されているように、私のテストでは20行で37%の改善を中心にでてくる、スピードブーストを提供しません、 2,000,000で18%。私は、中間カラムを格納することが何らかの種類のメモリ使用量のしきい値を超えた場合、または私が経験しなかったシステム特有のものがあった場合、後者をもっと大きく想像することができます。
これは次のようになります。
>>>df['Final Weight'] = np.where(df['Percentile'] >= 0.7, 1, np.nan)
>>>df['Final Weight'] = np.where(df['Percentile'] < 0.5, 0, df['Final Weight'])
>>>df['Final Weight'] = df.groupby('Stock')['Final Weight'].fillna(method='ffill').fillna(0)
>>>df['Final Weight'] = df['Final Weight']*df['Weight']
いずれかのこのメソッドを使用するか、中間フィールドを削除すると、結果与えるだろう:更なる向上のために
>>>df
Date Stock Weight Percentile Final Weight
0 1/1/2000 Apple 0.010 0.75 0.010
1 1/1/2000 IBM 0.011 0.40 0.000
2 1/1/2000 Google 0.012 0.45 0.000
3 1/1/2000 Nokia 0.022 0.81 0.022
4 2/1/2000 Apple 0.014 0.56 0.014
5 2/1/2000 Google 0.015 0.45 0.000
6 2/1/2000 Nokia 0.016 0.55 0.016
7 3/1/2000 Apple 0.020 0.52 0.020
8 3/1/2000 Google 0.030 0.51 0.000
9 3/1/2000 Nokia 0.040 0.47 0.000
を、私が設定する方法を追加することで、見てねストックが所有されている初期状態であり、続いてデータフレームを破棄してより小さいタイムフレームを見る。これは、それが認識されるようにして伝播する
>>>df['Final Weight'] = np.where((df['Percentile'] >= 0.7) | (df['Final Weight'] != 0), 1, np.nan)
のようなものに
>>>df['Final Weight'] = np.where(df['Percentile'] >= 0.7, 1, np.nan)
を変更し、その後、これらの小さなデータフレームの1でカバー期間の初期条件を追加することによって行うことができます。あなたの例のデータの最後の行で
私たちに見せたいコードはありますか? –
PiRSquaredesと非常に似ているコードは以下のように答えていますが、これは一日前にしか見えませんでしたので、データセットが巨大であるためループを使わないでいいパンダの方法が欲しかったです – MysterioProgrammer91