javascript - 如何仅使用最后一条情节线后面的数据计算高图中的预测(预测)?
问题描述
我有一个标准区域样条曲线高图的代码,我在其中创建了一个基于先前数据进行预测的函数。预测/预测在趋势线中显示接下来的 4 个值,其中第一个预测点使用真实数据计数,第二个点使用真实数据加上第一个预测点,接下来的两个点大致相同加上之前的预测。否则它将只是具有相同值的一行。但是我的数据正在增加,所以预测必须大致相同。
highchart 中的数据连接到 Microsoft SQL Server。
预测基于此代码,仅进行了少量更改: Javascript 中 Excel 中的预测公式
高图现在将增加的数据(阻力值)显示为 yAxis 中的小数和 xAxis 中的日期时间。预测也有效,但问题是并非所有数据都是相关的。总有一个点非常不同(低于以前的点),这就是我需要计算新预测的地方。情节线是在最后一个高值中生成的,然后开始新的(低)——这就是我需要计算的地方。
所以这就是我所拥有的:
- 函数“平均值”正在计算值的平均值
-第二个函数“预测”,正如您所料,计算预测(基于上面链接中的代码)
-第三个功能“测试”已经放在一起
-“结果”(2,3,4)是预测的计数点
-'vlastnidata' 是来自 mssql 的数据
-'datumek' 代表日期
现在情节线的条件(如您所见)是图表中的前一个点必须高出 20,然后生成情节线 - 这也有效,只需要找到一种方法如何仅使用后面的新数据进行计数情节主线。
在这里,您可以在 php 中访问到 mssql 的连接函数 - 如果需要 ,当值低于前一个值时,有没有办法在 highchart 中动态创建情节线?
正如我所说,一切正常,情节和预测。但要看到清晰的预测,我只需要计算相关数据即可。
希望一切都清楚。提前感谢您的任何建议。
function average(ar)
{
var r=0;
for (i=0;i<ar.length;i++)
{
r = r+ar[i];
}
return r/ar.length;
}
function forecast(x, ky, kx)
{
var i=0, nr=0, dr=0,ax=0,ay=0,a=0,b=0, result=0;
ax=average(kx);
ay=average(ky);
for (i=0;i<kx.length;i++)
{
nr = nr + ((kx[i]-ax) * (ky[i]-ay));
dr = dr + ((kx[i]-ax)*(kx[i]-ax))
}
b=nr/dr;
a=ay-b*ax;
result = (a+b*x);
return result;
}
function test(container,nazev,rtop,vlastnidata,colorSeries)
{
var result = 0, result2 = 0, result3 = 0, result4 = 0, datumek=[],hodnoty=[];
for (a=0;a<vlastnidata.length;a++)
{
datumek[a]=vlastnidata[a][0];
hodnoty[a]=vlastnidata[a][1];
}
kalkulace=(datumek[vlastnidata.length-1]-datumek[vlastnidata.length-2]);
hodnoty_nove=hodnoty;
datumek_nove=datumek;
result = forecast((datumek[vlastnidata.length-1]+kalkulace), hodnoty, datumek);
hodnoty_nove[hodnoty_nove.length]=result;
datumek_nove[datumek_nove.length]=(datumek[vlastnidata.length-1]+kalkulace);
result2 = forecast((datumek[vlastnidata.length-1]+2*kalkulace), hodnoty_nove, datumek_nove);
hodnoty_nove[hodnoty_nove.length]=result2;
datumek_nove[datumek_nove.length]=(datumek[vlastnidata.length-1]+2*kalkulace);
result3 = forecast((datumek[vlastnidata.length-1]+3*kalkulace), hodnoty_nove, datumek_nove);
hodnoty_nove[hodnoty_nove.length]=result3;
datumek_nove[datumek_nove.length]=(datumek[vlastnidata.length-1]+3*kalkulace);
result4 = forecast((datumek[vlastnidata.length-1]+4*kalkulace), hodnoty_nove, datumek_nove);
Highcharts.chart(container, {chart: {type: 'areaspline',
events: {
load:function(){
let points = this.series[0].points;
let plotLines = [];
console.log(this)
let previousPoint = points[0];
points.forEach(function(point) {
if(point.y < previousPoint.y/100*80) {
plotLines.push({
value: previousPoint.x,
color: 'red',
width: 3
});
}
previousPoint = point;
});
this.xAxis[0].update({
plotLines: plotLines
})
}
}
},
title: {text: 'Average of resistance per month, '+rtop},
legend: {layout: 'vertical',
align: 'left',
verticalAlign: 'top',
x: 150,
y: 100,
floating: true,
borderWidth: 1,
backgroundColor: (Highcharts.theme && Highcharts.theme.legendBackgroundColor) || '#FFFFFF'},
xAxis: { type: 'datetime'},
yAxis: {title: {text: 'Resistance: in ohms'}},
tooltip: {shared: true,valueSuffix: ' ohms',valueDecimals: 2},
credits: {enabled: false},
plotOptions: {areaspline: {fillOpacity: 0.5}},
series: [{ name: nazev,
color: colorSeries,
data: vlastnidata},
{name: 'Prediction',
color: '#001a33',
data: [[(datumek[vlastnidata.length-1]+kalkulace),result], [(datumek[vlastnidata.length-1]+2*kalkulace),result2], [(datumek[vlastnidata.length-1]+3*kalkulace),result3], [(datumek[vlastnidata.length-1]+4*kalkulace),result4]]
}]
});
}
解决方案
推荐阅读
- neo4j - 在 neo4j 中合并/创建 UNWIND
- sorting - 在 ONGR ElasticsearchDSL 中按距离对结果进行排序
- javascript - 隐藏位置相对父位置之外的绝对位置元素
- javascript - TypeScript 简写“如果”
- mongodb - 使用 --nsFrom 和 --nsTo 从未知数据库名称恢复到不同的数据库
- mongodb - 如何在没有猫鼬的情况下将 mongodb 与 graphql 连接
- angular - Angular 5 Webpack 编译成功但主页未加载
- java - 从 java 的 LinkedList 类中获取“sub-LinkedLlists”(用于 MergeSort 目的)
- c# - 如何从 twilio 跟踪用户消息和用户电话号码到我们的应用程序
- python - 当 2 个列表与 + 运算符连接时会创建多少个列表副本?