タイムスタンプインデックスを持つパンダデータフレームが与えられ、ソートされます。ラベルがあり、そのラベルに最も近いインデックスを見つける必要があります。また、小さいタイムスタンプを見つける必要があるため、検索はマイナータイムスタンプで計算する必要があります。これが私のコードです:
import pandas as pd
import datetime
data = [i for i in range(100)]
dates = pd.date_range(start="01-01-2018", freq="min", periods=100)
dataframe = pd.DataFrame(data, dates)
label = "01-01-2018 00:10:01"
method = "pad"
tol = datetime.timedelta(seconds=60)
idx = dataframe.index.get_loc(key=label, method="pad", tolerance=tol)
print("Closest idx:"+str(idx))
print("Closest date:"+str(dataframe.index[idx]))
検索が遅すぎます。それを改善する方法はありますか?
パフォーマンスを向上させるために、検索対象を変換することをお勧めします。を使用する代わりにget_loc
、DateTimeIndex
をUnix Timeに変換np.searchsorted
し、基になるnumpy
配列で使用できます(名前が示すように、これにはソートされたインデックスが必要です)。
get_loc
:(あなたの現在のアプローチ)
label = "01-01-2018 00:10:01"
tol = datetime.timedelta(seconds=60)
idx = dataframe.index.get_loc(key=label, method="pad", tolerance=tol)
print(dataframe.iloc[idx])
0 10
Name: 2018-01-01 00:10:00, dtype: int64
そしてそれはタイミングです:
%timeit dataframe.index.get_loc(key=label, method="pad", tolerance=tol)
2.03 ms ± 81.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
np.searchsorted
:arr = df.index.astype(int)//10**9
l = pd.to_datetime(label).timestamp()
idx = np.max(np.searchsorted(arr, l, side='left')-1, 0)
print(dataframe.iloc[idx])
0 10
Name: 2018-01-01 00:10:00, dtype: int64
そしてタイミング:
%timeit np.max(np.searchsorted(arr, l, side='left')-1, 0)
56.6 µs ± 979 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
(最初の配列作成は一度行う必要があるため、セットアップコストは含めませんでした。その後、すべてのクエリに使用しますが、セットアップコストを含めたとしても、この方法の方が高速です):
%%timeit
arr = df.index.astype(int)//10**9
l = pd.to_datetime(label).timestamp()
np.max(np.searchsorted(arr, l, side='left')-1, 0)
394 µs ± 3.84 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
上記の方法では、の許容範囲は強制されませんが60s
、これを確認するのは簡単です。
>>> np.abs(arr[idx]-l)<60
True
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加