2

私は日中の時間とパンダの見積もりデータを扱っており、重み付けされた中間価格を計算する良い方法を見つけるのに苦労しています. 現在、データは 4 つのデータフレーム (bid_price、bid_quantity、ask_price、ask_quantity) として表されており、各データフレームの列は個々の商品であり、インデックスはタイムスタンプです。(したがって、単一の入札価格は次のように参照できます。

bid_price['AAPL'][datetime(2013,1,1,9,30,0,0)]

私が適用したいミッドポイント式は、商品のビッド/アスク スプレッドに依存します。現在のスプレッドが最小ティック増分よりも広い場合、ミッドポイントはその時点でのビッド価格とアスク価格の単純平均になります。スプレッドが最小値に等しい場合、ミッドポイントはビッドとアスクの量に基づいて加重されます。

現在のコードは次のとおりです。

def get_midprice(bid_price, bid_quantity, ask_price, ask_quantity, tick_increment=0.01):
    if (ask_price - bid_price) > tick_increment:
        return (ask_price + bid_price) / 2
    else:
        return ((bid_price * ask_quantity) + (ask_price * bid_quantity)) / (bid_quantity + ask_quantity)

これは単一のデータポイントで機能し、パンダの以前のバージョンでは、4 つのデータフレームを渡したときにも機能しました。現在、4 つのデータフレームで例外が発生します。

raise ValueError("Cannot call bool() on DataFrame.")
ValueError: Cannot call bool() on DataFrame.

これは、この変更によるものだと思います: https://github.com/pydata/pandas/pull/1073

この問題は明らかにループによって解決できますが、大規模なデータセットでは、これは非常に遅くなります。より良い方法はありますか?

4

1 に答える 1

1

私がコメントで伝えようとしたように、試みてifいる方法でブランチをベクトル化することはできません。そのため、コードは過去に例外を発生させなかったでしょうが、ほぼ確実にあなたが望むことをしていませんでした。に。そのため、このバグを回避するために、 が呼び出されたときにarrays (および現在はDataFrames) が代わりにエラーを出力します。bool()

DataFrameこれを回避する1つの方法は、(効果的に)圧縮された対応する要素に関数を適用することから新しいを構築する適用要素ごとの関数です。私は使っていませんが、あるかもしれません。(追加することをサポートします。便利な場合もあります。独自の n 次元 C# ライブラリには、一致した要素に適用する関数があります。)

通常、この pre-pandas のようなことをする必要があるときは、両方の分岐を計算してから結果を結合しました (False ~ 0 と True ~ 1 という事実を利用して):

>>> a = np.arange(10)
>>> a > 3
array([False, False, False, False,  True,  True,  True,  True,  True,  True], dtype=bool)
>>> w = a > 3
>>> (a**2) * w + (1000) * (1-w)
array([1000, 1000, 1000, 1000,   16,   25,   36,   49,   64,   81])

ただし、両方numpypandasを使用することもできるwhereため、コードの 1 つのバージョンは次のようになります。

def get_midprice(bp, bq, ap, aq, ti):

    above = (ap + bp)/2
    not_above = ((bp*aq) + (ap*bq))/(bq+aq)
    use_above = (ap - bp) > ti

    combined = not_above.where(use_above, above)

    return combined

このアプローチの欠点は、両方の分岐を計算する必要があり、メモリを少し多く使用することです。実際には、問題を引き起こすことはめったにありませんが、YMMV. 代わりに乗算を使用することの小さな利点の 1 つ (少し遅くなりますが)whereは、スカラーが渡された場合にも機能することに注意してください。

最後に、おそらく階層型マルチインデックスを使用して、情報をまとめるためにフォーマットを変更することも検討できますが、私はその経験があまりありません。

于 2013-04-18T15:12:30.103 に答える