簡體   English   中英

增量價格圖近似

[英]Incremental price graph approximation

我需要顯示一個類似於CoinMarketCap所做的加密貨幣價格圖表: https ://coinmarketcap.com/currencies/bitcoin/

在很長一段時間內,一個貨幣對可能有數千兆字節的數據,因此不能選擇將所有數據發送到客戶端。 經過一些研究后,我最終使用道格拉斯 - 佩克爾線近似算法: https//www.codeproject.com/Articles/18936/AC-Implementation-of-Douglas-Peucker-Line-Appro它允許減少發送到客戶端的點但有一個問題:每次有新數據我都必須通過服務器上的所有數據,因為我想實時更新客戶端上的數據,需要大量資源。

所以我正在考慮一種漸進式算法,比方說,如果我需要顯示上個月的數據,我可以將數據分成5分鍾的間隔,只預處理最后一個間隔,當它完成時,刪除第一個。 我正在討論自定義Douglas-Peucker算法(但我不確定它是否適合這種情況)或者找到為此目的而設計的算法(任何提示都會受到高度贊賞)

當新數據到達時,不斷重新計算整個縮減點將不斷改變您的圖形。 該圖表缺乏一致性。 一個用戶看到的圖表與另一個用戶看到的圖表不同,當用戶刷新頁面時圖表會發生變化(這不應該發生!),即使在服務器/應用程序關閉的情況下,您的數據也需要與之前的情況保持一致。

  • 這就是我的方法:

你的減少積分應該是原樣。 假設您正在獲取每秒數據,並且您已經計算了5分鍾間隔圖的減少點,將這些數據點保存在限制隊列中。 現在收集接下來5分鍾的所有秒數據,並對這600個數據點執行還原操作,並將最終的減少點添加到限制隊列中。

我會使Queue同步,並且只要有API調用,主線程就會返回隊列中的數據點。 一旦整個5分鍾間隔的數據可用,工作線程就會計算5分鍾數據的縮減點。

我用樹。

子節點包含“精度”和“平均”值。

“精度”表示日期范圍。 例如:1分鍾,10分鍾,1天,1個月等。這也意味着樹中的級別。

“average”是最能代表范圍價格的值。 您可以使用簡單的平均值,線性回歸或任何您認為“最佳”的值。

因此,如果您需要600點(比如說您獲得窗口大小),您可以通過prec=total_date_range/600找到精度,並將一些四舍五入到現有范圍。

現在你有了'prec',你只需要檢索那個'prec`級別的節點。

作為千兆字節的數據,我將它們切成std :: vector對象。 樹會將id存儲到最低節點的這些向量。 其余節點也可以通過向量的索引來實現。

使用新數據更新僅需要更新分支(甚至創建新分支),從根開始,但沒有太多的子節點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM