Crossfilter 多维数据过滤与分析库 API 详解
概述
Crossfilter 是一个强大的 JavaScript 库,专门用于处理多维数据集的高效过滤和分析。它能够在浏览器中对大规模数据集进行即时交互式操作,特别适合构建数据可视化仪表盘。
核心概念
Crossfilter 的核心思想是通过维度(Dimension)和分组(Group)来组织和分析数据:
- 维度:数据的某个属性或特征,如日期、金额等
- 分组:基于维度值对数据进行分类和聚合
主要 API 详解
1. Crossfilter 构造函数
var payments = crossfilter([
{date: "2011-11-14T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab"},
// 更多数据记录...
]);
- 创建 Crossfilter 实例,可传入初始数据记录
- 数据可以是任何 JavaScript 对象或原始值数组
- 版本信息可通过
crossfilter.version
获取
2. 数据操作方法
添加数据
payments.add(newRecords);
移除数据
payments.remove(); // 移除所有匹配当前过滤条件的记录
获取数据量
payments.size(); // 返回总记录数,不受过滤器影响
3. 维度操作
创建维度
var paymentsByTotal = payments.dimension(function(d) { return d.total; });
- 维度值必须是可自然排序的类型(数字、字符串、日期等)
- 不支持
NaN
和undefined
等不可比较值 - 维度值访问函数应该是确定性的
维度过滤方法
Crossfilter 提供多种过滤方式:
- 精确过滤:
paymentsByTotal.filterExact(120);
- 范围过滤:
paymentsByTotal.filterRange([100, 200]);
- 函数过滤:
paymentsByTotal.filterFunction(function(d) { return d % 2; });
- 清除过滤:
paymentsByTotal.filterAll();
数据检索
- 获取前N条记录:
var topPayments = paymentsByTotal.top(4);
- 获取后N条记录:
var bottomPayments = paymentsByTotal.bottom(4);
4. 分组与聚合
创建分组
var paymentGroupsByTotal = paymentsByTotal.group(function(total) {
return Math.floor(total / 100);
});
- 可指定分组值函数,默认为恒等函数
- 分组值必须与维度值排序一致
聚合计算
- 自定义聚合:
group.reduce(
function add(p, v) { return p + v.total; }, // 添加记录时的聚合
function remove(p, v) { return p - v.total; }, // 移除记录时的聚合
function initial() { return 0; } // 初始值
);
- 计数聚合:
group.reduceCount();
- 求和聚合:
group.reduceSum(function(d) { return d.total; });
分组排序与查询
- 设置排序依据:
group.order(function(p) { return p.total; });
- 获取前N个分组:
var topGroups = group.top(5);
- 获取所有分组:
var allGroups = group.all();
5. 全局聚合
var allPayments = payments.groupAll();
var totalSum = allPayments.reduceSum(function(d) { return d.total; }).value();
- 对所有记录进行单一聚合
- 不受关联维度过滤器影响
性能优化建议
- 维度数量控制在32个以内,过多会影响性能
- 不再使用的维度应及时释放:
dimension.dispose();
- 分组对象不再使用时也应释放:
group.dispose();
实际应用示例
支付数据分析
// 创建维度
var byType = payments.dimension(d => d.type);
var byTotal = payments.dimension(d => d.total);
// 分组聚合
var typeCount = byType.group();
var totalSumByType = byType.group().reduceSum(d => d.total);
// 过滤与查询
byTotal.filterRange([100, 200]);
var topTypes = totalSumByType.top(3);
Crossfilter 的强大之处在于能够实时响应过滤条件的变化,自动更新所有相关的分组聚合结果,非常适合构建交互式的数据分析应用。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考