1

ボケを使用してプロットする前にダウンサンプリングする必要がある測定データ (Datetime、温度) の大きなセットがあります (スムーズなユーザー インターフェイスを維持するため)。

見たい不規則な物理現象があるため、データをリサンプリングしたり、4 (または 10) で 1 つのサンプルを取得したりすることはできません。サンプルを保持する必要があるかどうかを判断するには、よりスマートなアプローチが必要です。

私の考えは、参照サンプルを取得し、参照サンプルに近い限り (参照サンプル値の周囲のウィンドウ内に) 次のサンプルをドロップすることです。サンプルが窓の外にある場合、それは保持され、次のサンプルの新しい参照サンプルになります。頻度のないデータセットを取得しますが、問題ではないと思います。

次のコードは、データの動作をかなり適切に再現するカスタム/ファジー ダウンサンプリングの実装です。

import numpy as np
import pandas as pd

# DataFrame / pandas serie creation
size = 300000
index = pd.date_range('01/12/2017 08:15:49', periods=size, freq="3s")
s = 10*np.sin(np.arange(0, 2*np.pi, (2*np.pi/size)))
noise = np.random.random(size)
val = s + noise
serie = pd.Series(data=val, index=index)

# fuzzy downsampling
window = 0.5
def fuzz():
    i = serie.index[0]
    fuzzy_index = [i]
    ref = serie.loc[i]
    for ind, val in serie.iteritems():
        if abs(val - ref) > window:
            fuzzy_index.append(ind)
            ref = serie.loc[ind]
    return serie.loc[fuzzy_index]

# compute downsampling
sub_serie = fuzz()

このコードは機能していますが、遅いです:

%timeit fuzz()
1 loop, best of 3: 8.45 s per loop

窓は測温精度に関係するのであまりいじることができません。

私のサンプル サイズは現在 300000 ですが、近い将来には数百万に増える可能性があります。

このコードを最適化/高速化する方法はありますか?

たぶん、物理的な意味を持つダウンサンプリングを行う方法を他に考えていますか?

たぶん、bokeh server で直接解決策がありますか? 理想的にはユーザーのズームに依存しますか?

4

0 に答える 0