我试图使用在JavaScript中将数据转换为OHLC (开放、高、低、关闭)?中的脚本将一些图表数据转换为OHLC。唯一的一点是,我的数据与原始数据略有不同(http://api.bitcoincharts.com/v1/csv/localbtcDKK.csv.gz -显示了所有在丹麦进行的比特币交易),那么我将如何修改代码呢?
原始数据
var data = [{"tid": 283945, "date": 1384934366, "amount": "0.08180000", "price": "501.30"}, {"tid": 283947, "date": 1384934066, "amount": "0.06110000", "price": "490.66"}, ...];新数据
// 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/):
// 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));发布于 2017-09-26 08:16:53
您必须做的最重要的事情是将头添加到该数据中。如下所示:
var data = `date,price,amount
1366383202,748.680000000000,1.000000000000
1366471506,777.440000000000,2.700000000000
//etc...没有标头,所有这些属性都无法工作。
而且,这里不需要jQuery。您可以简单地使用D3:
var parsedArray = d3.csvParse(data)如果由于任何原因无法更改数据以添加标头,则可以在代码中添加:
var headers = ["date", "price", "amount"];
var parsedArray = d3.csvParse(headers + "\n" + data)下面是这些更改的演示:
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))<script src="//d3js.org/d3.v4.min.js"></script>
https://stackoverflow.com/questions/46420571
复制相似问题