首页 > 解决方案 > 如何仅使用最后一条情节线后面的数据计算高图中的预测(预测)?

问题描述

我有一个标准区域样条曲线高图的代码,我在其中创建了一个基于先前数据进行预测的函数。预测/预测在趋势线中显示接下来的 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]]
            }]
    });                            
}

标签: javascriptphp

解决方案


推荐阅读