我有一些JSON格式的数据,我想做一些可视化.数据(大约10MB的JSON)加载速度非常快,但是将其重新整形为可用的形式需要几分钟,而不到100,000行.我有一些有用的东西,但我认为它可以做得更好.
从我的示例数据开始可能最容易理解.
假设您在以下命令中运行以下命令/tmp:
curl http://public.west.spy.net/so/time-series.json.gz \
| gzip -dc - > time-series.json
Run Code Online (Sandbox Code Playgroud)
你应该能够在这里看到我想要的输出(一段时间后):
require(rjson)
trades <- fromJSON(file="/tmp/time-series.json")$rows
data <- do.call(rbind,
lapply(trades,
function(row)
data.frame(date=strptime(unlist(row$key)[2], "%FT%X"),
price=unlist(row$value)[1],
volume=unlist(row$value)[2])))
someColors <- colorRampPalette(c("#000099", "blue", "orange", "red"),
space="Lab")
smoothScatter(data, colramp=someColors, xaxt="n")
days <- seq(min(data$date), max(data$date), by = 'month')
smoothScatter(data, colramp=someColors, xaxt="n")
axis(1, at=days,
labels=strftime(days, "%F"),
tick=FALSE)
Run Code Online (Sandbox Code Playgroud)
你可以通过使用获得40倍的加速plyr.这是代码和基准比较.一旦你拥有了数据框,就可以完成到目前为止的转换,因此我已经从代码中删除了它,以便于进行逐项比较.我相信存在更快的解决方案.
f_ramnath = function(n) plyr::ldply(trades[1:n], unlist)[,-c(1, 2)]
f_dustin = function(n) do.call(rbind, lapply(trades[1:n],
function(row) data.frame(
date = unlist(row$key)[2],
price = unlist(row$value)[1],
volume = unlist(row$value)[2]))
)
f_mrflick = function(n) as.data.frame(do.call(rbind, lapply(trades[1:n],
function(x){
list(date=x$key[2], price=x$value[1], volume=x$value[2])})))
f_mbq = function(n) data.frame(
t(sapply(trades[1:n],'[[','key')),
t(sapply(trades[1:n],'[[','value')))
rbenchmark::benchmark(f_ramnath(100), f_dustin(100), f_mrflick(100), f_mbq(100),
replications = 50)
test elapsed relative
f_ramnath(100) 0.144 3.692308
f_dustin(100) 6.244 160.102564
f_mrflick(100) 0.039 1.000000
f_mbq(100) 0.074 1.897436
Run Code Online (Sandbox Code Playgroud)
编辑.MrFlick的解决方案可以带来3.5倍的加速.我已经更新了我的测试.
| 归档时间: |
|
| 查看次数: |
530 次 |
| 最近记录: |