2014-07-23 35 views
1

我是d3.jsdc.js的新手,我花了一周的最佳时间阅读tutorialsAPI。它有一个相对陡峭的学习曲线,但是我(慢慢地)熟悉单个操作。这就是说我仍然缺乏构建我所需要的实践经验。使用d3.js和dc.js将记录拆分并分组到每日集合

我有一个包含以下数据结构的JSON文件(该记录集比较大〜2个亿个对象):

[ 
    { 
     "index": "device_1", 
     "state": -1, 
     "frequencies": [ 
      "800PS" 
     ], 
     "events": [ 
      { 
       "start": "04/07/2014 04:24:19", 
       "end": "07/21/2014 08:53:19", 
       "name": "event_1234" 
      } 
     ] 
    }, 
    { 
     "index": "device_2", 
     "state": 1, 
     "frequencies": [ 
      "2100AWS", 
      "1900PCS" 
     ], 
     "events": [ 
      { 
       "start": "02/20/2014 04:03:20", 
       "end": "04/30/2014 07:24:35", 
       "name": "event_3456" 
      }, 
      { 
       "start": "04/30/2014 07:25:37", 
       "end": "07/01/2014 06:35:44", 
       "name": "event_766" 
      }, 
      { 
       "start": "06/02/2014 00:02:16", 
       "end": "06/02/2014 00:04:25", 
       "name": "event_8967" 
      }, 
      { 
       "start": "06/11/2014 15:38:59", 
       "end": "06/11/2014 15:41:15", 
       "name": "event_385" 
      }, 
      { 
       "start": "06/28/2014 07:37:00", 
       "end": "06/28/2014 07:39:34", 
       "name": "event_8959" 
      }, 
      { 
       "start": "07/01/2014 07:06:06", 
       "end": "07/03/2014 03:27:55", 
       "name": "event_2654" 
      }, 
      { 
       "start": "07/03/2014 04:16:55", 
       "end": "07/21/2014 08:53:19", 
       "name": "event_94768" 
      } 
     ] 
    }, 
... 
] 

我所试图实现的是对数据进行组织,所以我可以创建一个每天的正常运行时间每台设备的报告,我收集每台设备每天的累计事件时间。

有效我想原始数据(上图)转换成一个新的数据集,看起来是这样的:

[ 
     {"device":"device_1", "date": "01/01/2014", "cumulative": 2530}, 
     {"device":"device_2", "date": "01/01/2014", "cumulative": 1234}, 
     {"device":"device_1", "date": "01/02/2014", "cumulative": 456}, 
     {"device":"device_2", "date": "01/02/2014", "cumulative": 198}, 
     ... 
    ] 

* *累积*是几秒钟,所有累积事件的数量那天发生在那台设备上。

一旦我到达那个阶段,我可以使用类似于:d3.nest().key().rollup().entries()来对数据进行排序和分组以准备显示。

我怀疑D3有一个内置的机制来处理这种情况,但我目前的做法如下:

  • 导入数据集

    d3.json("data.json", function(error, json_data) { 
    if (error)return console.warn(error); 
    ... 
    } 
    
  • 转换琴弦日期对象

    var dateFormat = d3.time.format("%m/%d/%Y %H:%M:%S"); 
    json_data.forEach(function(d) { 
    
         d.dstart = d.events.map(function(x) { 
          return dateFormat.parse(x.start); 
         }); 
    
         d.dend = d.events.map(function(x) { 
          return dateFormat.parse(x.end); 
         }); 
    
        }); 
    
  • 指定开始结束日期范围为每日一班

  • 确定事件横跨超过1天跨越,如果是的话打破了事件成若干段
  • 总和的累计时间报告日常设备事件

(NB我确实可以控制JSON数据格式!我可以从技术上直接创建最终的数据集。然而,目前的格式在其他报告中非常有用,我很希望避免两个数据文件,因为它们是< 20MB每个所以最好我需要避免改变JSON设计。)

+0

可能有其他库可以帮助解决这个问题,但d3并不是真正的数据预处理库。我认为你在正确的轨道上。而且,除非文件大小减慢,否则不需要更改格式。 – Gordon

+0

你有没有偶然遇到一个可能能够实现这个目标的图书馆? – tarka

回答

1

自带的数据结构想到的是一个区间树。我还没有试过这个库,但它可能会有所帮助 - interval tree

否则,至少你可以跳过最后一步,只是白天休息一下。积累是交叉过滤器的优点 - 使用reduceSum