2010-03-25 59 views
8

插值大型數據集插值大型數據集上飛

我有較某一天的過程中,美元/英鎊之間的匯率大約0.5million記錄的大型數據集。

我有一個應用程序想要能夠繪製這些數據或可能是一個子集。由於顯而易見的原因,我不想在我的圖上繪製50萬個點。

我需要的是一個較小的數據集(100分左右),它準確地(儘可能)代表給定的數據。有誰知道這種數據可以實現的任何有趣和高性能的方式嗎?

乾杯,卡爾

+1

你能澄清「代表」 - 你的意思只是視覺上,或爲了執行計算的目的? – Carl 2010-03-25 12:07:41

+0

最終結果將是一個類型的數據集,然後可以進行處理和繪製 – Karl 2010-03-25 12:35:07

+1

聽起來像R的工作! – Joel 2010-03-29 16:37:15

回答

3

一個想到的就是使用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如何優化它,可能會更有效地在具有分段時間值的臨時表上運行查詢。

1

類似RRDTool會自動執行所需操作 - tutorial應該讓您開始,drraw會繪製數據圖表。

我在工作中使用它來處理像錯誤圖表這樣的事情,在6個月的時間段內,我不需要1分鐘的分辨率,只需要最近的幾個小時。之後,我有幾個小時的1小時解決方案,然後幾個月的1天解決方案。

1

如果你想寫自己的,一個顯而易見的解決方案是將你的記錄集打破成固定的點數塊,其值將是平均值(平均值,中值,...選擇一個) 。這有可能成爲最快的優勢,並顯示整體趨勢。

但它缺乏價格蜱的戲劇性。更好的解決方案可能涉及尋找拐點,然後使用滑動窗口在其中選擇。這具有更好地顯示當天的實際事件的優點,但會更慢。

4

有幾種統計方法可以將大型數據集簡化爲更小,更易於可視化的數據集。從你的問題來看,你不清楚你想要什麼總結統計。我剛纔假設你想知道匯率如何隨時間而變化,但也許你對匯率高於一定值的頻率感興趣,或者我不考慮其他一些統計數據。

(上scatter plot smoothing從文檔)總結趨勢隨時間

這裏使用lowess方法的示例在R

> 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 

那你得到的數據對象包含傳遞到LOWESS功能命名爲x和y的條目,其中對應於x和y的值。在這種情況下,x和y代表速度和dist。

0

如何使枚舉/迭代器包裝。我不熟悉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); 
    } 
} 
1

簡易方法是簡單地計算每個時間間隔對應於像素的平均值。

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

這並不表明flunctuations。我建議還計算每個時間間隔的標準偏差並繪製(也就是使每個像素高於一個像素)。我找不到一個例子,但我知道Gnuplot可以做到這一點(但不是用Java編寫的)。

+0

這個天真的解決方案就是簡單地獲取每個第N個值。我期望服用如100k數據集中的每100個值仍能提供關於測量值歷史的非常好的圖像,並且沒有其他方法可以在性能方面觸及它。 – 2010-04-04 21:23:19

+0

是的。看起來速度比像素精度更重要。 – 2010-04-05 06:59:33

+0

這個答案似乎很奇怪......很熟悉。 ;] – CPerkins 2010-04-05 11:44:28