首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JavaScript中将CSV转换为OHLC (开放的、高的、低的、关闭的)?

在JavaScript中将CSV转换为OHLC (开放的、高的、低的、关闭的)?
EN

Stack Overflow用户
提问于 2017-09-26 07:46:06
回答 1查看 586关注 0票数 1

我试图使用在JavaScript中将数据转换为OHLC (开放、高、低、关闭)?中的脚本将一些图表数据转换为OHLC。唯一的一点是,我的数据与原始数据略有不同(http://api.bitcoincharts.com/v1/csv/localbtcDKK.csv.gz -显示了所有在丹麦进行的比特币交易),那么我将如何修改代码呢?

原始数据

代码语言:javascript
复制
var data = [{"tid": 283945, "date": 1384934366, "amount": "0.08180000", "price": "501.30"}, {"tid": 283947, "date": 1384934066, "amount": "0.06110000", "price": "490.66"}, ...];

新数据

代码语言:javascript
复制
// CSV format: UNIX timestamp, price, amount traded
// http://api.bitcoincharts.com/v1/csv/localbtcDKK.csv.gz
var data = `1366383202,748.680000000000,1.000000000000
1366471506,777.440000000000,2.700000000000
1368121200,685.740000000000,2.187400000000
...`

因为它是CSV,所以我已经包含了将数据转换为数组的jquery。下面是我的当前代码(https://jsfiddle.net/askhflajsf/mg9v89r2/5/):

代码语言:javascript
复制
// CSV format: UNIX timestamp, price, amount traded
// http://api.bitcoincharts.com/v1/csv/localbtcDKK.csv.gz

var data = `1366383202,748.680000000000,1.000000000000
1366471506,777.440000000000,2.700000000000
1368121200,685.740000000000,2.187400000000
1375783458,619.500000000000,1.000000000000
...`

function convertToOHLC(data) {
    data.sort((a,b)=>d3.ascending(a.date, b.date));
    var result = [];
    var format = d3.timeFormat("%Y-%m-%d");
    data.forEach(d=>d.date = format(new Date(d.date*1000)));
    var allDates = [...new Set(data.map(d=>d.date))];
    allDates.forEach(d=>{
        var tempObject = {};
        var filteredData = data.filter(e=>e.date === d);
        tempObject.date = d;
        tempObject.open = filteredData[0].price;
        tempObject.close = filteredData[filteredData.length-1].price;
        tempObject.high = d3.max(filteredData, e=>e.price);
        tempObject.low = d3.min(filteredData, e=>e.price);
        result.push(tempObject);
    })
  return result
}

// Parse multi-line CSV string into a 2D array
// https://github.com/evanplaice/jquery-csv

var dataArray = $.csv.toArrays(data);

// jquery-csv's arrays are made up of strings, but we need them to be numbers

// Trim whitespace and then convert to Number

var dataArrayNumbers = dataArray.map(row => row.map(el => Number(el.trim())));

console.log(convertToOHLC(dataArrayNumbers));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-26 08:16:53

您必须做的最重要的事情是将添加到该数据中。如下所示:

代码语言:javascript
复制
var data = `date,price,amount
1366383202,748.680000000000,1.000000000000
1366471506,777.440000000000,2.700000000000
//etc...

没有标头,所有这些属性都无法工作。

而且,这里不需要jQuery。您可以简单地使用D3:

代码语言:javascript
复制
var parsedArray = d3.csvParse(data)

如果由于任何原因无法更改数据以添加标头,则可以在代码中添加:

代码语言:javascript
复制
var headers = ["date", "price", "amount"];
var parsedArray = d3.csvParse(headers + "\n" + data)

下面是这些更改的演示:

代码语言:javascript
复制
var csv = `date,price,amount
1366383202,748.680000000000,1.000000000000
1366471506,777.440000000000,2.700000000000
1368121200,685.740000000000,2.187400000000
1375783458,619.500000000000,1.000000000000`;

var originalData = d3.csvParse(csv)

function convertToOHLC(data) {
    data.sort((a,b)=>d3.ascending(a.date, b.date));
    var result = [];
    var format = d3.timeFormat("%Y-%m-%d");
    data.forEach(d=>d.date = format(new Date(d.date*1000)));
    var allDates = [...new Set(data.map(d=>d.date))];
    allDates.forEach(d=>{
        var tempObject = {};
        var filteredData = data.filter(e=>e.date === d);
        tempObject.date = d;
        tempObject.open = filteredData[0].price;
        tempObject.close = filteredData[filteredData.length-1].price;
        tempObject.high = d3.max(filteredData, e=>e.price);
        tempObject.low = d3.min(filteredData, e=>e.price);
        result.push(tempObject);
    })
  return result
}

console.log(convertToOHLC(originalData))
代码语言:javascript
复制
<script src="//d3js.org/d3.v4.min.js"></script>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46420571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档