9

大きなデータセットの補間

特定の 1 日の間の USD / GBP 間の為替レートを表す約 50 万件のレコードの大規模なデータ セットがあります。

このデータまたはサブセットをグラフ化できるようにしたいアプリケーションがあります。明らかな理由から、グラフに 50 万点をプロットしたくありません。

私が必要としているのは、与えられたデータを (可能な限り) 正確に表す小さなデータ セット (100 ポイント程度) です。このデータを取得できる興味深いパフォーマンスの高い方法を知っている人はいますか?

乾杯、カール

4

6 に答える 6

4

大規模なデータセットをより小さく、視覚化しやすいデータセットに縮小するための統計的方法がいくつかあります。あなたの質問からは、どの要約統計量が必要かは明確ではありません。為替レートが時間の関数としてどのように変化するかを見たいと思っていると仮定しましたが、為替レートが特定の値を超える頻度や、私が考慮していない他の統計に興味があるかもしれません。

時間の経過に伴う傾向の要約

Rでlowessメソッドを使用した例を次に示します (散布図の平滑化に関するドキュメントから)。

> library(graphics)
# print out the first 10 rows of the cars dataset
> cars[1:10,]
   speed dist
1      4    2
2      4   10
3      7    4
4      7   22
5      8   16
6      9   10
7     10   18
8     10   26
9     10   34
10    11   17

# plot the original data
> plot(cars, main = "lowess(cars)")
# fit a loess-smoothed line to the points
> lines(lowess(cars), col = 2)
# plot a finger-grained loess-smoothed line to the points
> lines(lowess(cars, f=.2), col = 3)

パラメーター f は、回帰がデータにどの程度適合するかを制御します。過適合せずにデータに正確に適合するものが必要なため、これにはある程度の注意を払ってください。速度と距離ではなく、為替レートと時間をプロットできます。

平滑化の結果にアクセスするのも簡単です。その方法は次のとおりです。

> data = lowess( cars$speed, cars$dist )
> data
$x
 [1]  4  4  7  7  8  9 10 10 10 11 11 12 12 12 12 13 13 13 13 14 14 14 14 15 15 15 16 16 17 17 17 18 18 18 18 19 19
[38] 19 20 20 20 20 20 22 23 24 24 24 24 25

$y
 [1]  4.965459  4.965459 13.124495 13.124495 15.858633 18.579691 21.280313 21.280313 21.280313 24.129277 24.129277
[12] 27.119549 27.119549 27.119549 27.119549 30.027276 30.027276 30.027276 30.027276 32.962506 32.962506 32.962506
[23] 32.962506 36.757728 36.757728 36.757728 40.435075 40.435075 43.463492 43.463492 43.463492 46.885479 46.885479
[34] 46.885479 46.885479 50.793152 50.793152 50.793152 56.491224 56.491224 56.491224 56.491224 56.491224 67.585824
[45] 73.079695 78.643164 78.643164 78.643164 78.643164 84.328698

返されるデータ オブジェクトには x および y という名前のエントリが含まれており、これらは lowess 関数に渡された x および y の値に対応しています。この場合、x と y は速度と距離を表します。

于 2010-04-02T21:35:21.653 に答える
3

1 つの考えは、DBMS を使用して、適切なクエリを使用してデータを圧縮することです。特定の範囲の中央値を取るという行に沿ったもの、疑似クエリ:

SELECT truncate_to_hour(rate_ts), median(rate) FROM exchange_rates 
WHERE rate_ts >= start_ts AND rate_ts <= end_ts
GROUP BY truncate_to_hour(rate_ts)
ORDER BY truncate_to_hour(rate_ts)

truncate_to_hour は、DBMS に適したものです。または、時間を一意のブロックに分割する何らかの関数 (最も近い 5 分間隔に丸めるなど)、または中央値の代わりに適切なグループを集計する別の数学関数を使用した同様のアプローチ。時間セグメント化手順の複雑さと DBMS の最適化方法を考慮すると、セグメント化された時間値を使用して一時テーブルでクエリを実行する方が効率的である場合があります。

于 2010-03-25T11:50:42.627 に答える
1

独自に作成したい場合、明確な解決策の 1 つは、レコード セットを一定数のポイントのチャンクに分割することです。このチャンクの値は平均 (平均、中央値、... 1 つを選択) になります。これにはおそらく最速であるという利点があり、全体的な傾向を示しています。

しかし、それは価格ティックのドラマを欠いています. より良い解決策は、おそらく変曲点を探してから、スライディング ウィンドウを使用してそれらの中から選択することです。これには、その日の実際のイベントをより適切に表示できるという利点がありますが、遅くなります。

于 2010-04-02T16:59:00.927 に答える
1

RRDToolのようなものは、必要なことを自動的に実行します。チュートリアルを開始すると、drarawがデータをグラフ化します。

私はこれを仕事でエラー グラフなどに使用しています。6 か月間の 1 分単位の解像度は必要ありません。直近の数時間だけです。その後、数日間は 1 時間で解決し、数か月間は 1 日で解決します。

于 2010-04-02T16:03:39.107 に答える
1

素朴なアプローチは、ピクセルに対応する時間間隔ごとの平均を単純に計算することです。

http://commons.wikimedia.org/wiki/File:Euro_exchange_rate_to_AUD.svg

これは変動を示しません。また、各時間間隔で標準偏差を計算し、それもプロットすることをお勧めします(基本的に、各ピクセルを1ピクセルより高くします)。例を見つけることができませんでしたが、Gnuplot がこれを実行できることは知っています (ただし Java で書かれていません)。

于 2010-04-04T10:16:24.920 に答える
0

enumeration/iterator ラッパーを作ってみませんか。私はJavaに精通していませんが、次のように見えるかもしれません:

class MedianEnumeration implements Enumeration<Double>
{
    private Enumeration<Double> frameEnum;
    private int frameSize;

    MedianEnumeration(Enumeration<Double> e, int len) {
        frameEnum = e;
        frameSize = len;
    }

    public boolean hasMoreElements() {
        return frameEnum.hasMoreElements();
    }

    public Double nextElement() {
        Double sum = frameEnum.nextElement();

        int i;
        for(i=1; (i < frameSize) && (frameEnum.hasMoreElements()); ++i) {
            sum += (Double)frameEnum.nextElement();
        }

        return (sum / i);
    }
}
于 2010-04-04T07:39:51.247 に答える