duanhe1965 2019-08-08 08:04
浏览 41

如何仅使用最后一条情节线后面的数据来计算高图中的预测(预测)?

I have a code for standard area-spline highchart where I made a function for prediction based on previous data. Prediction / forecasting is showing next 4 values in a trendline where the first prediction point is counting with real data, second point with real data plus first prediction point and the next two points about the same plus previous predictions. Otherwise it would be only a line with same values. But my data are increasing so the forecasting must be about the same.

Data in highchart are connected to Microsoft SQL Server.

Prediction is based on this code, just with few changes: Forecast formula from Excel in Javascript

The highchart is now showing increasing data (values of resistance) as a decimal in yAxis and datetime in xAxis. Prediction is working as well but the thing is that not all data are relevant.There is always a point which is very different (lower than previous) and thats the place from where I need to count new prediction. The plotline is generated in the last high value, then starting the new (low) - and that is from where I need to count.

So here is what I do have:

-the function 'average' is counting average from values

-second function 'forecast' as you can expect is counting the forecasting (based on the code from link above)

-third function 'test' is already putting all together

-the 'results' (2,3,4) are the counted points of prediction

-'vlastnidata' are the data from mssql

-'datumek' is for the date

Now the condition for plotline (as you can see there) is that the previous point in chart must be 20 higher and then the plotline is generated - this is also working, just need to find a way how to count only with new data behind the plotline.

And here you can reach the connection function to mssql in php - if needed Is there a way how to dynamically create a plotline in highchart when the value is lower than previous one?

As I said everything is working, plotlines and the prediction. But to see clear prediction I need to count only with relevant data.

Hope everything is clear. Thank you in advance for any recommendations.

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]]
            }]
    });                            
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 基于卷积神经网络的声纹识别
    • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
    • ¥100 为什么这个恒流源电路不能恒流?
    • ¥15 有偿求跨组件数据流路径图
    • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
    • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
    • ¥15 CSAPPattacklab
    • ¥15 一直显示正在等待HID—ISP
    • ¥15 Python turtle 画图
    • ¥15 stm32开发clion时遇到的编译问题