4

次の構造の DataFrame があります。

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 3333 entries, 2000-01-03 00:00:00+00:00 to 2012-11-21 00:00:00+00:00
Data columns:
open          3333  non-null values
high          3333  non-null values
low           3333  non-null values
close         3333  non-null values
volume        3333  non-null values
amount        3333  non-null values
pct_change    3332  non-null values
dtypes: float64(7)

pct_change列にはパーセント変化データが含まれます。

上記の DataFrame からフィルター処理された DatetimeIndex を指定すると、次のようになります。

<class 'pandas.tseries.index.DatetimeIndex'>
[2000-03-01 00:00:00, ..., 2012-11-01 00:00:00]
Length: 195, Freq: None, Timezone: UTC

日付エントリの開始をフィルタリングし、pct_change列が 0.015 未満の最初の行を返します。

私はこの解決策を思いつきましたが、非常に遅いです:

stops = []
#dates = DatetimeIndex
for d in dates:
    #check if pct_change is below -0.015 starting from date of signal. return date of first match
    match = df[df["pct_change"] < -0.015].ix[d:][:1].index

    stops.append([df.ix[d]["close"], df.ix[match]["close"].values[0]])

これを改善する方法について何か提案はありますか?

4

2 に答える 2

2

これはどう:

result = df[df.pct_change < -0.015].reindex(filtered_dates, method='bfill')

これに関する唯一の問題は、間隔に-0.015未満の値が含まれていない場合、将来の間隔から値を取得することです。各行の日付を確認できる日付を含む列を追加する場合、取得したタイムスタンプが次の「ビンエッジ」を超える場合は、行をNAに設定します。

于 2013-01-02T19:58:16.477 に答える
2

インデックスを列として抽出し、 と を使用する方が速い場合がありapplyますbfill
このようなもの:

df['datetime'] = df.index
df['stops'] = df.apply(lambda x: x['datetime']
                                 if x['pct_change'] < -0.015
                                 else np.nan,
                        axis=1)
df['stops'] = df['stops'].bfill()
于 2012-12-29T21:41:07.680 に答える