crossfilter - 计算具有 属性 的所有记录的百分比
crossfilter - calculating percent of all records with a property
这是我的问题:
我正在使用 python flask 服务器从 mongo 数据库获取 json 数据,并在其中指定 import.This 数据在 json 格式,并且只能像那样获取。一旦通过 graphs.js 中的交叉过滤器,是否可以对这些字段进行转换?例如我有一个状态属性,它可以取值 "Pass"、"In Progress"、"on Hold" 或 "Fail"。我基本上想做一个指标来告诉我失败百分比。所以理想情况下,我必须对数据进行一些计算。请大家指教。
Sample data (in tabular form for clarity) looks like:
TrialLocation | Subject Status
Site A | In progress
Site A | Pass
Site B | In progress
Site A | In progress
Site B | On Hold
Site A | Screen Failure
在这种情况下,我应该得到一个在 x 轴和 y 轴上带有站点名称的条形图,我应该得到计算失败百分比的指标。在这种情况下是
站点 A 为 25%,站点 B 为 0%。
所以我首先创建了图表,它给出了每个站点的主题数。
var siteName = ndx.dimension(function(d) { return d["TrialLocation"];});
var numSubjectsBySite = siteName.group();
var siteLevelChart = dc.barChart("#site-level-count", "subjectView");
最后是图表:
siteLevelChart
.width(2000)
.height(200)
.transitionDuration(1000)
.dimension(siteName)
.group(numSubjectsBySite)
.ordering(function(d){return d.value;})
所以我想,我会计算 SubjectStatus = "Screen Failure" 的行数,然后除以总行数,在这种情况下,总行数是 "numSubjectsBySite" 变量
然后当我介绍这段代码时:
var countScreenFailures = ndx.dimension(function(d){ return d["SubjectStatus"];});
countScreenFailures.filter("Off Study");
我的条形图仅显示主题状态 ="ScreenFailure".
的行
如何计算屏幕故障率然后使用?请帮帮我?
非常感谢。
安摩尔
您需要构建自定义 grouping/reduce 函数来跟踪每个状态的计数以及总计数。然后你可以在图表中除以计算你的百分比。如果您有兴趣使用 Reductio,您可以执行以下操作:
var reducer = reductio().count(true);
// Do this as many times as you need for different status counts. Each
// call of reducer.value will add a new property to your groups where
// you can store the count for that status.
reducer.value("ScreenFailure").sum(
function(d) {
// This counts records with SubjectStatus = "Screen Failure"
return d["SubjectStatus"] === "Screen Failure" ? 1 : 0;
});
// Build the group with the Reductio reducers.
var numSubjectsBySite = reducer(siteName.group());
// In your dc.js chart, calculate the % using a value accessor.
siteLevelChart
.width(2000)
.height(200)
.transitionDuration(1000)
.dimension(siteName)
.group(numSubjectsBySite)
.valueAccessor(function(p) { return p.value.ScreenFailure.sum / p.value.count; })
.ordering(function(d){return d.value;})
您可以为此使用自定义 groupAll。这是一个直接的交叉过滤器解决方案,基于您在后面的问题中提供的 jsfiddle。
(使用 fiddle 来回答更容易!)
var all = ndx.groupAll();
var failurePercentGroup = all.reduce(
function(p, v) {
++p.count;
p.failures += (v.Status === 'Screen Failure' ? 1 : 0);
p.failPercent = p.count ? p.failures/p.count : 0;
return p;
},
function(p, v) {
--p.count;
p.failures -= (v.Status === 'Screen Failure' ? 1 : 0);
p.failPercent = p.count ? p.failures/p.count : 0;
return p;
},
function() {
return {
count: 0,
failures: 0,
failPercent: 0
};
}
);
failurePercent.valueAccessor(function (x) {
return x.failPercent;
})
.group(failurePercentGroup);
@Ethan 的回答看起来应该有效,但您在其他地方评论说您无法使其有效。
已更新 fiddle 此处:http://jsfiddle.net/gordonwoodhull/vct0dzou/8/
我没有将它格式化为百分比,所以它只显示了一个比率,但你应该能够弄清楚那部分。
这是我的问题:
我正在使用 python flask 服务器从 mongo 数据库获取 json 数据,并在其中指定 import.This 数据在 json 格式,并且只能像那样获取。一旦通过 graphs.js 中的交叉过滤器,是否可以对这些字段进行转换?例如我有一个状态属性,它可以取值 "Pass"、"In Progress"、"on Hold" 或 "Fail"。我基本上想做一个指标来告诉我失败百分比。所以理想情况下,我必须对数据进行一些计算。请大家指教。
Sample data (in tabular form for clarity) looks like:
TrialLocation | Subject Status
Site A | In progress
Site A | Pass
Site B | In progress
Site A | In progress
Site B | On Hold
Site A | Screen Failure
在这种情况下,我应该得到一个在 x 轴和 y 轴上带有站点名称的条形图,我应该得到计算失败百分比的指标。在这种情况下是 站点 A 为 25%,站点 B 为 0%。
所以我首先创建了图表,它给出了每个站点的主题数。
var siteName = ndx.dimension(function(d) { return d["TrialLocation"];});
var numSubjectsBySite = siteName.group();
var siteLevelChart = dc.barChart("#site-level-count", "subjectView");
最后是图表:
siteLevelChart
.width(2000)
.height(200)
.transitionDuration(1000)
.dimension(siteName)
.group(numSubjectsBySite)
.ordering(function(d){return d.value;})
所以我想,我会计算 SubjectStatus = "Screen Failure" 的行数,然后除以总行数,在这种情况下,总行数是 "numSubjectsBySite" 变量 然后当我介绍这段代码时:
var countScreenFailures = ndx.dimension(function(d){ return d["SubjectStatus"];});
countScreenFailures.filter("Off Study");
我的条形图仅显示主题状态 ="ScreenFailure".
的行如何计算屏幕故障率然后使用?请帮帮我?
非常感谢。 安摩尔
您需要构建自定义 grouping/reduce 函数来跟踪每个状态的计数以及总计数。然后你可以在图表中除以计算你的百分比。如果您有兴趣使用 Reductio,您可以执行以下操作:
var reducer = reductio().count(true);
// Do this as many times as you need for different status counts. Each
// call of reducer.value will add a new property to your groups where
// you can store the count for that status.
reducer.value("ScreenFailure").sum(
function(d) {
// This counts records with SubjectStatus = "Screen Failure"
return d["SubjectStatus"] === "Screen Failure" ? 1 : 0;
});
// Build the group with the Reductio reducers.
var numSubjectsBySite = reducer(siteName.group());
// In your dc.js chart, calculate the % using a value accessor.
siteLevelChart
.width(2000)
.height(200)
.transitionDuration(1000)
.dimension(siteName)
.group(numSubjectsBySite)
.valueAccessor(function(p) { return p.value.ScreenFailure.sum / p.value.count; })
.ordering(function(d){return d.value;})
您可以为此使用自定义 groupAll。这是一个直接的交叉过滤器解决方案,基于您在后面的问题中提供的 jsfiddle。
(使用 fiddle 来回答更容易!)
var all = ndx.groupAll();
var failurePercentGroup = all.reduce(
function(p, v) {
++p.count;
p.failures += (v.Status === 'Screen Failure' ? 1 : 0);
p.failPercent = p.count ? p.failures/p.count : 0;
return p;
},
function(p, v) {
--p.count;
p.failures -= (v.Status === 'Screen Failure' ? 1 : 0);
p.failPercent = p.count ? p.failures/p.count : 0;
return p;
},
function() {
return {
count: 0,
failures: 0,
failPercent: 0
};
}
);
failurePercent.valueAccessor(function (x) {
return x.failPercent;
})
.group(failurePercentGroup);
@Ethan 的回答看起来应该有效,但您在其他地方评论说您无法使其有效。
已更新 fiddle 此处:http://jsfiddle.net/gordonwoodhull/vct0dzou/8/
我没有将它格式化为百分比,所以它只显示了一个比率,但你应该能够弄清楚那部分。