使用 bin 中的第一行(而不是平均值)来计算百分比增益
Using the first row in bin (instead of average) to calculate percentage gain
在dc.jsNasdaq example中,percentageGain计算为:
(p.absGain / p.avgIndex) * 100
这里的 avgIndex 是所有日平均值的平均值。
我比较熟悉方程式:
A. (Price - Prev period's Close) / Prev period's Close * 100
我不确定这是否可行(设置过滤器等),crossfilter/dc 的工作方式。因此,另一个可能更适合 crossfilter/dc 并且仍然有意义的替代方程式可能是:
B. absGain of group / open of first day of group * 100
B 也意味着:如果仅在 Q1 上设置了滤波器,则仅考虑 Q1 的绝对增益。该组中的第一天是最旧年份中最旧的 Q1 日期。此外,除“年度”之外的包含季度、月份或星期几等组的图表应该能够显示此等式的值。例如在月份图表中,“六月”月份的值是通过第一个六月的第一天的开盘价来计算的。 absGain 取自所有 6 月份。 (当然要使用所有当前的过滤器)
问题: A and/or B 可以用 crossfilter/dc 的方式解决吗(例子)?
就算只能解出B(自然是crossfilter/dc),那也已经很好了。我想对具有相同基础数据结构(开盘价、收盘价、高价、低价、成交量)的其他股票使用 dc.js 示例
谢谢!
我同意方程 B 使用交叉滤波器更容易定义,所以我想出了一种方法。
方程式 A 可能有效,但不清楚应在过滤下使用哪一天的收盘价 - 最后一天在当前 bin 中 not?当前 bin 中第一天的前一天?
公式 B 需要当前 bin 的最早行,这需要维护每个 bin 的所有行的数组。这不是内置在 crossfilter 中,而是 it's a feature which we have talked about adding.
complex reduce example就是这样做的,我们可以重用它的一些代码。它根据落在每个 bin 中的行数组计算 median/mode/min/max 值,使用这些函数生成这些数组:
function groupArrayAdd(keyfn) {
var bisect = d3.bisector(keyfn);
return function(elements, item) {
var pos = bisect.right(elements, keyfn(item));
elements.splice(pos, 0, item);
return elements;
};
}
function groupArrayRemove(keyfn) {
var bisect = d3.bisector(keyfn);
return function(elements, item) {
var pos = bisect.left(elements, keyfn(item));
if(keyfn(elements[pos])===keyfn(item))
elements.splice(pos, 1);
return elements;
};
}
维护所有这些数组效率有点低,因此您可以测试它是否对您的应用程序有影响。 JS 非常快,所以除非你有大量数据,否则它可能并不重要。
不幸的是,除了在其中保留所有项目的数组外,没有其他方法可以计算垃圾箱的最小值。 (如果您试图只跟踪最低项或最低 N 项,当它们被移除时您会怎么做?)
在组 reduce-add 函数中使用这些数组:
(p, v) => {
++p.count;
p.rowsByDate = rbdAdd(p.rowsByDate, v);
p.absGain += v.close - v.open;
// ...
p.percentageGain = p.rowsByDate.length ? (p.absGain / p.rowsByDate[0].open) * 100 : 0;
return p;
},
在 reduce-remove 函数中它是
p.rowsByDate = rbdRemove(p.rowsByDate, v);
和相同的 percentageGain
变化。
这是笔记本中的演示:https://jsfiddle.net/gordonwoodhull/08bzcd4y/17/
我只看到气泡的Y位置有轻微变化;这些变化在工具提示中打印的值中更加明显。
在dc.jsNasdaq example中,percentageGain计算为:
(p.absGain / p.avgIndex) * 100
这里的 avgIndex 是所有日平均值的平均值。
我比较熟悉方程式:
A. (Price - Prev period's Close) / Prev period's Close * 100
我不确定这是否可行(设置过滤器等),crossfilter/dc 的工作方式。因此,另一个可能更适合 crossfilter/dc 并且仍然有意义的替代方程式可能是:
B. absGain of group / open of first day of group * 100
B 也意味着:如果仅在 Q1 上设置了滤波器,则仅考虑 Q1 的绝对增益。该组中的第一天是最旧年份中最旧的 Q1 日期。此外,除“年度”之外的包含季度、月份或星期几等组的图表应该能够显示此等式的值。例如在月份图表中,“六月”月份的值是通过第一个六月的第一天的开盘价来计算的。 absGain 取自所有 6 月份。 (当然要使用所有当前的过滤器)
问题: A and/or B 可以用 crossfilter/dc 的方式解决吗(例子)?
就算只能解出B(自然是crossfilter/dc),那也已经很好了。我想对具有相同基础数据结构(开盘价、收盘价、高价、低价、成交量)的其他股票使用 dc.js 示例
谢谢!
我同意方程 B 使用交叉滤波器更容易定义,所以我想出了一种方法。
方程式 A 可能有效,但不清楚应在过滤下使用哪一天的收盘价 - 最后一天在当前 bin 中 not?当前 bin 中第一天的前一天?
公式 B 需要当前 bin 的最早行,这需要维护每个 bin 的所有行的数组。这不是内置在 crossfilter 中,而是 it's a feature which we have talked about adding.
complex reduce example就是这样做的,我们可以重用它的一些代码。它根据落在每个 bin 中的行数组计算 median/mode/min/max 值,使用这些函数生成这些数组:
function groupArrayAdd(keyfn) {
var bisect = d3.bisector(keyfn);
return function(elements, item) {
var pos = bisect.right(elements, keyfn(item));
elements.splice(pos, 0, item);
return elements;
};
}
function groupArrayRemove(keyfn) {
var bisect = d3.bisector(keyfn);
return function(elements, item) {
var pos = bisect.left(elements, keyfn(item));
if(keyfn(elements[pos])===keyfn(item))
elements.splice(pos, 1);
return elements;
};
}
维护所有这些数组效率有点低,因此您可以测试它是否对您的应用程序有影响。 JS 非常快,所以除非你有大量数据,否则它可能并不重要。
不幸的是,除了在其中保留所有项目的数组外,没有其他方法可以计算垃圾箱的最小值。 (如果您试图只跟踪最低项或最低 N 项,当它们被移除时您会怎么做?)
在组 reduce-add 函数中使用这些数组:
(p, v) => {
++p.count;
p.rowsByDate = rbdAdd(p.rowsByDate, v);
p.absGain += v.close - v.open;
// ...
p.percentageGain = p.rowsByDate.length ? (p.absGain / p.rowsByDate[0].open) * 100 : 0;
return p;
},
在 reduce-remove 函数中它是
p.rowsByDate = rbdRemove(p.rowsByDate, v);
和相同的 percentageGain
变化。
这是笔记本中的演示:https://jsfiddle.net/gordonwoodhull/08bzcd4y/17/
我只看到气泡的Y位置有轻微变化;这些变化在工具提示中打印的值中更加明显。