Java中使用arima预测未来数据

news2024/11/26 23:45:49

看着已经存在的曲线图数据,想预估下后面曲线图的数据。


import java.util.Vector;

public class AR {

    double[] stdoriginalData={};
    int p;
    ARMAMath armamath=new ARMAMath();

    /**
     * AR模型
     * @param stdoriginalData
     * @param p //p为MA模型阶数
     */
    public AR(double [] stdoriginalData,int p)
    {
        this.stdoriginalData=stdoriginalData;
        this.p=p;
    }
    /**
     * 返回AR模型参数
     * @return
     */
    public Vector<double[]> ARmodel()
    {
        Vector<double[]> v=new Vector<double[]>();
        v.add(armamath.parcorrCompute(stdoriginalData, p, 0));
        return v;//得到了自回归系数

        //还要估计方差项吗?
    }

}
package com.xxx.xxx.xxx.util.arima;

import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Vector;


public class ARIMA {

    double[] originalData={};
    ARMAMath armamath=new ARMAMath();
    double stderrDara=0;
    double avgsumData=0;
    Vector<double[]> armaARMAcoe=new Vector<double[]>();
    Vector<double[]> bestarmaARMAcoe=new Vector<double[]>();

    /**
     * 构造函数
     * @param originalData 原始时间序列数据
     */
    public ARIMA(double [] originalData)
    {
        this.originalData=originalData;
    }
    /**
     * 原始数据标准化处理:一阶季节性差分
     * @return 差分过后的数据
     */
    public double[] preDealDif()
    {

        //seasonal Difference:Peroid=7
        double []tempData=new double[originalData.length-7];
        for(int i=0;i<originalData.length-7;i++)
        {
            tempData[i]=originalData[i+7]-originalData[i];
        }

        return tempData;
    }
    /**
     * 原始数据标准化处理:Z-Score归一化
     *  待处理数据
     * @return 归一化过后的数据
     */
    public double[] preDealNor(double[] tempData)
    {
        //Z-Score
        avgsumData=armamath.avgData(tempData);
        stderrDara=armamath.stderrData(tempData);

        for(int i=0;i<tempData.length;i++)
        {
            tempData[i]=(tempData[i]-avgsumData)/stderrDara;
        }

        return tempData;
    }
    /**
     * 得到ARMA模型=[p,q]
     * @return ARMA模型的阶数信息
     */
    public int[] getARIMAmodel()
    {
        double[] stdoriginalData=this.preDealDif();//原始数据差分处理

        int paraType=0;
        double minAIC=9999999;
        int bestModelindex=0;
        int[][] model=new int[][]{{0,1},{1,0},{1,1},{0,2},{2,0},{2,2},{1,2},{2,1}};//,{3,0},{0,3},{3,1},{1,3},{3,2},{2,3},{3,3}};//,{4,0},{0,4},{4,1},{1,4},{4,2},{2,4},{4,3},{3,4},{4,4}};
        //对8种模型进行迭代,选出AIC值最小的模型作为我们的模型
        for(int i=0;i<model.length;i++)
        {
            if(model[i][0]==0)
            {
                MA ma=new MA(stdoriginalData, model[i][1]);
                armaARMAcoe=ma.MAmodel(); //拿到ma模型的参数
                paraType=1;
            }
            else if(model[i][1]==0)
            {
                AR ar=new AR(stdoriginalData, model[i][0]);
                armaARMAcoe=ar.ARmodel(); //拿到ar模型的参数
                paraType=2;
            }
            else
            {
                ARMA arma=new ARMA(stdoriginalData, model[i][0], model[i][1]);
                armaARMAcoe=arma.ARMAmodel();//拿到arma模型的参数
                paraType=3;
            }


            double temp=getmodelAIC(armaARMAcoe,stdoriginalData,paraType);
            //System.out.println("AIC of these model="+temp);
            if (temp<minAIC)
            {
                bestModelindex=i;
                minAIC=temp;
                bestarmaARMAcoe=armaARMAcoe;
            }
        }

        return model[bestModelindex];
    }
    /**
     * 计算ARMA模型的AIC
     * @param para 装载模型的参数信息
     * @param stdoriginalData   预处理过后的原始数据
     * @param type 1:MA;2:AR;3:ARMA
     * @return 模型的AIC值
     */
    public double getmodelAIC(Vector<double[]> para,double[] stdoriginalData,int type)
    {
        double temp=0;
        double temp2=0;
        double sumerr=0;
        int p=0;//ar1,ar2,...,sig2
        int q=0;//sig2,ma1,ma2...
        int n=stdoriginalData.length;
        Random random=new Random();

        if(type==1)
        {
            double[] maPara=para.get(0);
            q=maPara.length;
            double[] err=new double[q];  //error(t),error(t-1),error(t-2)...
            for(int k=q-1;k<n;k++)
            {
                temp=0;

                for(int i=1;i<q;i++)
                {
                    temp+=maPara[i]*err[i];
                }

                //产生各个时刻的噪声
                for(int j=q-1;j>0;j--)
                {
                    err[j]=err[j-1];
                }
                err[0]=random.nextGaussian()*Math.sqrt(maPara[0]);

                //估计的方差之和
                sumerr+=(stdoriginalData[k]-(temp))*(stdoriginalData[k]-(temp));

            }
            //return  (n-(q-1))*Math.log(sumerr/(n-(q-1)))+(q)*Math.log(n-(q-1));//AIC 最小二乘估计
            return (n-(q-1))*Math.log(sumerr/(n-(q-1)))+(q+1)*2;
        }
        else if(type==2)
        {
            double[] arPara=para.get(0);
            p=arPara.length;
            for(int k=p-1;k<n;k++)
            {
                temp=0;
                for(int i=0;i<p-1;i++)
                {
                    temp+=arPara[i]*stdoriginalData[k-i-1];
                }
                //估计的方差之和
                sumerr+=(stdoriginalData[k]-temp)*(stdoriginalData[k]-temp);
            }
            return (n-(q-1))*Math.log(sumerr/(n-(q-1)))+(p+1)*2;
            //return (n-(p-1))*Math.log(sumerr/(n-(p-1)))+(p)*Math.log(n-(p-1));//AIC 最小二乘估计
        }
        else
        {
            double[] arPara=para.get(0);
            double[] maPara=para.get(1);
            p=arPara.length;
            q=maPara.length;
            double[] err=new double[q];  //error(t),error(t-1),error(t-2)...

            for(int k=p-1;k<n;k++)
            {
                temp=0;
                temp2=0;
                for(int i=0;i<p-1;i++)
                {
                    temp+=arPara[i]*stdoriginalData[k-i-1];
                }

                for(int i=1;i<q;i++)
                {
                    temp2+=maPara[i]*err[i];
                }

                //产生各个时刻的噪声
                for(int j=q-1;j>0;j--)
                {
                    err[j]=err[j-1];
                }
                //System.out.println("predictBeforeDiff="+1);
                err[0]=random.nextGaussian()*Math.sqrt(maPara[0]);
                //估计的方差之和
                sumerr+=(stdoriginalData[k]-(temp2+temp))*(stdoriginalData[k]-(temp2+temp));
            }
            return (n-(q-1))*Math.log(sumerr/(n-(q-1)))+(p+q)*2;
            //return (n-(p-1))*Math.log(sumerr/(n-(p-1)))+(p+q-1)*Math.log(n-(p-1));//AIC 最小二乘估计
        }
    }
    /**
     * 对预测值进行反差分处理
     * @param predictValue 预测的值
     * @return 反差分过后的预测值
     */
    public int aftDeal(int predictValue)
    {
        //System.out.println("predictBeforeDiff="+predictValue);
        return (int)(predictValue+originalData[originalData.length-7]);
    }
    /**
     * 进行一步预测
     * @param p ARMA模型的AR的阶数
     * @param q ARMA模型的MA的阶数
     * @return 预测值
     */
    public int predictValue(int p,int q)
    {
        int predict=0;
        double[] stdoriginalData=this.preDealDif();
        int n=stdoriginalData.length;
        double temp=0,temp2=0;
        double[] err=new double[q+1];

        Random random=new Random();
        if(p==0)
        {
            double[] maPara=bestarmaARMAcoe.get(0);
            for(int k=q;k<n;k++)
            {
                temp=0;
                for(int i=1;i<=q;i++)
                {
                    temp+=maPara[i]*err[i];
                }
                //产生各个时刻的噪声
                for(int j=q;j>0;j--)
                {
                    err[j]=err[j-1];
                }
                err[0]=random.nextGaussian()*Math.sqrt(maPara[0]);
            }
            predict=(int)(temp); //产生预测
        }
        else if(q==0)
        {
            double[] arPara=bestarmaARMAcoe.get(0);
            for(int k=p;k<n;k++)
            {
                temp=0;
                for(int i=0;i<p;i++)
                {
                    temp+=arPara[i]*stdoriginalData[k-i-1];
                }
            }
            predict=(int)(temp);
        }
        else
        {

            double[] arPara=bestarmaARMAcoe.get(0);
            double[] maPara=bestarmaARMAcoe.get(1);
            err=new double[q+1];  //error(t),error(t-1),error(t-2)...
            for(int k=p;k<n;k++)
            {
                temp=0;
                temp2=0;
                for(int i=0;i<p;i++)
                {
                    temp+=arPara[i]*stdoriginalData[k-i-1];
                }

                for(int i=1;i<=q;i++)
                {
                    temp2+=maPara[i]*err[i];
                }

                //产生各个时刻的噪声
                for(int j=q;j>0;j--)
                {
                    err[j]=err[j-1];
                }

                err[0]=random.nextGaussian()*Math.sqrt(maPara[0]);
            }

            predict=(int)(temp2+temp);

        }


        return predict;
    }
    /**
     * 计算MA模型的参数
     * @param autocorData 自相关系数Grma
     * @param q MA模型的阶数
     * @return 返回MA模型的参数
     */
    public double[] getMApara(double[] autocorData,int q)
    {
        double[] maPara=new double[q+1];//第一个存放噪声参数,后面q个存放ma参数sigma2,ma1,ma2...
        double[] tempmaPara=maPara;
        double temp=0;
        boolean iterationFlag=true;
        //解方程组
        //迭代法解方程组
        //System.out.println("autocorData[0]"+autocorData[0]);
        while(iterationFlag)
        {
            for(int i=1;i<maPara.length;i++)
            {
                temp+=maPara[i]*maPara[i];
            }
            tempmaPara[0]=autocorData[0]/(1+temp);

            for(int i=1;i<maPara.length;i++)
            {
                temp=0;
                for(int j=1;j<maPara.length-i;j++)
                {
                    temp+=maPara[j]*maPara[j+i];
                }
                tempmaPara[i]=-(autocorData[i]/tempmaPara[0]-temp);
            }
            iterationFlag=false;
            for(int i=0;i<maPara.length;i++)
            {
                if(maPara[i]!=tempmaPara[i])
                {
                    iterationFlag=true;
                    break;
                }
            }

            maPara=tempmaPara;
        }

        return maPara;
    }
    public static int[] generator(int size, List<Double> arraylist){

        int[] returnArray=new int[size];

        for (int i = 0; i <size ; i++) {
            double[] dataArray=new double[arraylist.size()];
            for(int j=0;j<arraylist.size()-1;j++) {
                dataArray[j] = arraylist.get(j);
            }
            //使用当前数据训练ARIMA模型
            ARIMA arima=new ARIMA(dataArray);
            //获得ARIM模型
            int []model=arima.getARIMAmodel();
            //System.out.println("Best model is [p,q]="+"["+model[0]+" "+model[1]+"]");
            //System.out.println("最佳模型是[p,q]="+"["+model[0]+" "+model[1]+"]");
            int deal = arima.aftDeal(arima.predictValue(model[0], model[1]));
            //System.out.println("Predict value="+deal);
            //System.out.println("预测值="+deal);
            //System.out.println("Predict error="+(deal-arraylist.get(arraylist.size()-1))/arraylist.get(arraylist.size()-1)*100+"%");
            //System.out.println("预测差值="+(deal-arraylist.get(arraylist.size()-1))/arraylist.get(arraylist.size()-1)*100+"%");
            arraylist.add(deal+0.0);
            returnArray[i]=deal;
        }
        //System.out.println(JSON.toJSON(arraylist));
        //System.out.println(JSON.toJSON(returnArray));
        return returnArray;
    }


    public static int[] arimaLists(List<Double> arraylist) {
        if (arraylist.size()<10){
            System.out.println("创建ARIMA模型数据最少10条");
            return new int[]{0,0,0,0,0,0,0};
        }
        int[] ints = generator(7, arraylist);
        return ints;
    }
}
package com.xxx.xxx.xxx.util.arima;

import java.util.ArrayList;
import java.util.Vector;

public class ARMA {

    double[] stdoriginalData={};
    int p;
    int q;
    ARMAMath armamath=new ARMAMath();

    /**
     * ARMA模型
     * @param stdoriginalData
     * @param p,q //p,q为MA模型阶数
     */
    public ARMA(double [] stdoriginalData,int p,int q)
    {
        this.stdoriginalData=stdoriginalData;
        this.p=p;
        this.q=q;
    }
    public Vector<double[]> ARMAmodel()
    {

        double[] arcoe=armamath.parcorrCompute(stdoriginalData, p, q);

        double[] autocorData=getautocorofMA(p, q, stdoriginalData, arcoe);

        double[] macoe=armamath.getMApara(autocorData, q);//得到MA模型里面的参数值
//		for(int i=0;i<macoe.length;i++)
//			{
//				System.out.println(macoe[i]);
//			}
//		System.out.println();
        Vector<double[]> v=new Vector<double[]>();
        v.add(arcoe);
        v.add(macoe);
        return v;
    }

    /**
     * 得到MA的自相关系数
     * @param p
     * @param q
     * @param stdoriginalData
     * @param autoRegress
     * @return
     */
    public double[] getautocorofMA(int p,int q,double[] stdoriginalData,double[] autoRegress)
    {
        int temp=0;
        double[] errArray=new double[stdoriginalData.length-p];
        int count=0;
        for(int i=p;i<stdoriginalData.length;i++)
        {
            temp=0;
            for(int j=1;j<=p;j++)
                temp+=stdoriginalData[i-j]*autoRegress[j-1];
            errArray[count++]=stdoriginalData[i]-temp;//保存估计残差序列
        }
        return armamath.autocorGrma(errArray, q);
    }


}


package com.xxx.xxx.xxx.util.arima;


import Jama.Matrix;

public class ARMAMath
{
    public double avgData(double[] dataArray)
    {
        return this.sumData(dataArray)/dataArray.length;
    }

    public double sumData(double[] dataArray)
    {
        double sumData=0;
        for(int i=0;i<dataArray.length;i++)
        {
            sumData+=dataArray[i];
        }
        return sumData;
    }

    public double stderrData(double[] dataArray)
    {
        return Math.sqrt(this.varerrData(dataArray));
    }

    public double varerrData(double[] dataArray)
    {
        double variance=0;
        double avgsumData=this.avgData(dataArray);

        for(int i=0;i<dataArray.length;i++)
        {
            dataArray[i]-=avgsumData;
            variance+=dataArray[i]*dataArray[i];
        }
        return variance/dataArray.length;//variance error;
    }

    /**
     * 计算自相关的函数 Tho(k)=Grma(k)/Grma(0)
     * @param dataArray 数列
     * @param order 阶数
     * @return
     */
    public double[] autocorData(double[] dataArray,int order)
    {
        double[] autoCor=new double[order+1];
        double varData=this.varerrData(dataArray);//标准化过后的方差

        for(int i=0;i<=order;i++)
        {
            autoCor[i]=0;
            for(int j=0;j<dataArray.length-i;j++)
            {
                autoCor[i]+=dataArray[j+i]*dataArray[j];
            }
            autoCor[i]/=dataArray.length;
            autoCor[i]/=varData;
        }
        return autoCor;
    }

    /**
     * Grma
     * @param dataArray
     * @param order
     * @return 序列的自相关系数
     */
    public double[] autocorGrma(double[] dataArray,int order)
    {
        double[] autoCor=new double[order+1];
        for(int i=0;i<=order;i++)
        {
            autoCor[i]=0;
            for(int j=0;j<dataArray.length-i;j++)
            {
                autoCor[i]+=dataArray[j+i]*dataArray[j];
            }
            autoCor[i]/=(dataArray.length-i);

        }
        return autoCor;
    }

    /**
     * 求偏自相关系数
     * @param dataArray
     * @param order
     * @return
     */
    public double[] parautocorData(double[] dataArray,int order)
    {
        double parautocor[]=new double[order];

        for(int i=1;i<=order;i++)
        {
            parautocor[i-1]=this.parcorrCompute(dataArray, i,0)[i-1];
        }
        return parautocor;
    }
    /**
     * 产生Toplize矩阵
     * @param dataArray
     * @param order
     * @return
     */
    public double[][] toplize(double[] dataArray,int order)
    {//返回toplize二维数组
        double[][] toplizeMatrix=new double[order][order];
        double[] atuocorr=this.autocorData(dataArray,order);

        for(int i=1;i<=order;i++)
        {
            int k=1;
            for(int j=i-1;j>0;j--)
            {
                toplizeMatrix[i-1][j-1]=atuocorr[k++];
            }
            toplizeMatrix[i-1][i-1]=1;
            int kk=1;
            for(int j=i;j<order;j++)
            {
                toplizeMatrix[i-1][j]=atuocorr[kk++];
            }
        }
        return toplizeMatrix;
    }

    /**
     * 解MA模型的参数
     * @param autocorData
     * @param q
     * @return
     */
    public double[] getMApara(double[] autocorData,int q)
    {
        double[] maPara=new double[q+1];//第一个存放噪声参数,后面q个存放ma参数sigma2,ma1,ma2...
        double[] tempmaPara=maPara;
        double temp=0;
        boolean iterationFlag=true;
        //解方程组
        //迭代法解方程组
        maPara[0]=1;//初始化
        while(iterationFlag)
        {
            for(int i=1;i<maPara.length;i++)
            {
                temp+=maPara[i]*maPara[i];
            }
            tempmaPara[0]=autocorData[0]/(1+temp);

            for(int i=1;i<maPara.length;i++)
            {
                temp=0;
                for(int j=1;j<maPara.length-i;j++)
                {
                    temp+=maPara[j]*maPara[j+i];
                }
                tempmaPara[i]=-(autocorData[i]/maPara[0]-temp);
            }
            iterationFlag=false;
            for(int i=0;i<maPara.length;i++)
            {
                if(maPara[i]!=tempmaPara[i])
                {
                    iterationFlag=true;
                    break;
                }
            }

            maPara=tempmaPara;
        }

        return maPara;
    }
    /**
     * 计算自回归系数
     * @param dataArray
     * @param p
     * @param q
     * @return
     */
    public double[] parcorrCompute(double[] dataArray,int p,int q)
    {
        double[][] toplizeArray=new double[p][p];//p阶toplize矩阵;

        double[] atuocorr=this.autocorData(dataArray,p+q);//返回p+q阶的自相关函数
        double[] autocorrF=this.autocorGrma(dataArray, p+q);//返回p+q阶的自相关系数数
        for(int i=1;i<=p;i++)
        {
            int k=1;
            for(int j=i-1;j>0;j--)
            {
                toplizeArray[i-1][j-1]=atuocorr[q+k++];
            }
            toplizeArray[i-1][i-1]=atuocorr[q];
            int kk=1;
            for(int j=i;j<p;j++)
            {
                toplizeArray[i-1][j]=atuocorr[q+kk++];
            }
        }

        Matrix toplizeMatrix = new Matrix(toplizeArray);//由二位数组转换成二维矩阵
        Matrix toplizeMatrixinverse=toplizeMatrix.inverse();//矩阵求逆运算

        double[] temp=new double[p];
        for(int i=1;i<=p;i++)
        {
            temp[i-1]=atuocorr[q+i];
        }

        Matrix autocorrMatrix=new Matrix(temp, p);
        Matrix parautocorDataMatrix=toplizeMatrixinverse.times(autocorrMatrix); //  [Fi]=[toplize]x[autocorr]';
        //矩阵计算结果应该是按照[a b c]'  列向量存储的
        //System.out.println("row="+parautocorDataMatrix.getRowDimension()+"  Col="+parautocorDataMatrix.getColumnDimension());
        //parautocorDataMatrix.print(p, 2);//(输出几行,小数点后保留位数)
        //System.out.println(parautocorDataMatrix.get(p-1,0));

        double[] result=new double[parautocorDataMatrix.getRowDimension()+1];
        for(int i=0;i<parautocorDataMatrix.getRowDimension();i++)
        {
            result[i]=parautocorDataMatrix.get(i,0);
        }

        //估算sigmat2
        double sum2=0;
        for(int i=0;i<p;i++)
            for(int j=0;j<p;j++)
            {
                sum2+=result[i]*result[j]*autocorrF[Math.abs(i-j)];
            }
        result[result.length-1]=autocorrF[0]-sum2; //result数组最后一个存储干扰估计值


        return result;   //返回0列的最后一个就是k阶的偏自相关系数 pcorr[k]=返回值
    }


}
package com.xxx.xxx.xxx.util.arima;

import java.util.Vector;

public class MA {

    double[] stdoriginalData={};
    int q;
    ARMAMath armamath=new ARMAMath();

    /** MA模型
     * @param stdoriginalData //预处理过后的数据
     * @param q //q为MA模型阶数
     */
    public MA(double [] stdoriginalData,int q)
    {
        this.stdoriginalData=stdoriginalData;
        this.q=q;
    }
    /**
     * 返回MA模型参数
     * @return
     */
    public Vector<double[]> MAmodel()
    {
        Vector<double[]> v=new Vector<double[]>();
        v.add(armamath.getMApara(armamath.autocorGrma(stdoriginalData,q), q));
        return v;//拿到MA模型里面的参数值
    }


}
package com.xxx.xxx.xxx.util.arima;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

import static com.alibaba.druid.sql.ast.SQLPartitionValue.Operator.List;

public class Test1 {

    public static void main(String args[]) {
//		extracted();
        ArrayList<Double> arraylist = new ArrayList<Double>();
        arraylist.add(1.0d);
        arraylist.add(2.0d);
        arraylist.add(3.0d);
        arraylist.add(4.0d);
        arraylist.add(5.0d);
        arraylist.add(6.0d);
        arraylist.add(7.0d);
        arraylist.add(8.0d);
        arraylist.add(8.0d);
        arraylist.add(8.0d);
        arraylist.add(8.0d);
        arraylist.add(8.0d);
        int[] ints = ARIMA.arimaLists(arraylist);
        System.err.println(Arrays.toString(ints));
    }


}

以上是示例,传入已有的参数预估后面的值
在这里插入图片描述
当前时间为7.2号,后面一周的数据是根据之前一个月的数据预估的趋势。
页面上的趋势图只显示前后一周。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1897546.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Dungeonborne延迟高?降低Dungeonborne延迟的方法分享

Dungeonborne是Mithril Interactive开发并发行的一款沉浸式第一人称 PvPvE 地下城探险游戏。Dungeonborne的魅力并不仅仅在于战斗和冒险。游戏中的剧情设计同样引人入胜&#xff0c;每个NPC都有自己独特的故事和背景&#xff0c;玩家在与他们交流的过程中&#xff0c;不仅能了解…

Tomcat(+Servlet)笔记+代码

Tomcat安装和配置 安装在不含中文的路径&#xff0c;路径不能太长 Apache 官网&#x1f447; Apache Tomcat - Welcome! 配置部分 点击下图红框处&#xff0c;找到Tomcat安装位置 添加项目的文件 配好的话&#xff0c;红框这里有个猫 代码部分 新建jsp文件&#xff0c;里…

【码银送书第二十二期】《Python数据分析从入门到精通(第2版)》

&#x1f490;大家好&#xff01;我是码银~&#xff0c;欢迎关注&#x1f490;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 前言 &#x1f340;丛书说明&#xff1a;“软件开发视频大讲堂‘’丛书第1版于2008年8月出版&#xff0c;因其编写细腻、易学实用…

字符串函数5-9题(30 天 Pandas 挑战)

字符串函数 1. 相关知识点1.5 字符串的长度条件判断1.6 apply映射操作1.7 python大小写转换1.8 正则表达式匹配2.9 包含字符串查询 2. 题目2.5 无效的推文2.6 计算特殊奖金2.7 修复表中的名字2.8 查找拥有有效邮箱的用户2.9 患某种疾病的患者 1. 相关知识点 1.5 字符串的长度条…

Orangepi配合IIC驱动OLED屏幕

目录 一、OLED屏幕 二、Orangepi的IIC接口及OLED屏幕硬件接线 2.1 Orangepi的IIC接口&#xff1a; 2.2 Orangepi与OLED屏幕硬件接线&#xff1a; 三、wiringPi库示例代码 3.1 wiringPi库OLED屏幕示例代码&#xff1a; 3.2 OLED显示自己想要的字符&#xff1a; 一、OLED屏…

E2.【C语言】练习:static部分

#include <stdio.h> int sum(int a) {int c 0;static int b 3;c 1;b 2;return (a b c); } int main() {int i;int a 2;for (i 0; i < 5;i){printf("%d ", sum(a));} } 求执行结果 c是auto类变量(普通的局部变量)&#xff0c;自动产生&#xff0c…

第26篇 寻找最大数<一>

Q&#xff1a;如何设计一段汇编语言子程序并调用来寻找一组数中的最大数呢&#xff1f; A&#xff1a;基本原理&#xff1a;可以使用子程序LARGE实现找到列表中最大数的功能。主程序通过寄存器将列表的条目数和起始地址作为参数传递给子程序&#xff0c;子程序通过寄存器将最大…

qt 如果把像素点数据变成一个图片

1.概要 图像的本质是什么&#xff0c;就是一个个的像素点&#xff0c;对与显示器来说就是一个二维数组。无论多复杂的图片&#xff0c;对于显示器来说就是一个二维数组。 2.代码 #include "widget.h"#include <QApplication> #include <QImage> #incl…

Springboot学习之用EasyExcel4导入导出数据(基于MyBatisPlus)

一、POM依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><m…

Linux系统之安装Ninvaders太空入侵者小游戏

Linux系统之安装Ninvaders太空入侵者小游戏 一、Ninvaders小游戏介绍1.1 Ninvaders小游戏简介1.2 项目预览 二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍 三、检查系统镜像源3.1 检查系统镜像源3.2 更新软件列表 四、安装Ninvaders4.1 安装Ninvaders4.2 启动Ninvaders游戏…

Python酷库之旅-第三方库Pandas(004)

目录 一、用法精讲 5、pandas.DataFrame.to_csv函数 5-1、语法 5-2、参数 5-3、功能 5-4、返回值 5-5、说明 5-6、用法 5-6-1、代码示例 5-6-2、结果输出 6、pandas.read_fwf函数 6-1、语法 6-2、参数 6-3、功能 6-4、返回值 6-5、说明 6-6、用法 6-6-1、代码…

视频共享融合赋能平台LnyonCVS国标视频监控平台包含哪些功能

随着国内视频监控应用的迅猛发展&#xff0c;系统接入规模不断扩大。不同平台提供商的接入协议各不相同&#xff0c;导致终端制造商在终端维护时需要针对不同平台的软件版本提供不同的维护&#xff0c;资源造成了极大的浪费。 为响应国家对重特大事件通过视频监控集中调阅来掌…

数字信号处理实验二(模拟信号采样与重构及频谱分析FFT)

模拟信号采样与重构及频谱分析FFT&#xff08;2学时&#xff09; 要求&#xff1a; 对一模拟信号进行采样&#xff1b;对该采样信号进行重构&#xff1b;分析它们的频谱特征。目的&#xff1a; 熟悉MATLAB命令和编辑、运行、调试环境&#xff1b;掌握采样定理及对信号的频谱分析…

springboot高校合同信息管理系统-计算机毕业设计源码02888

摘要 随着高校规模的不断扩大和合作伙伴关系的增加&#xff0c;高校合同管理变得更加复杂和重要。传统的人工合同管理方式已经无法满足高校庞大的合同数量和复杂的合同流程需求。因此&#xff0c;借助信息技术来构建一个高校合同信息管理系统&#xff0c;并结合数据统计功能&am…

【数据分析】评估清理数据实战【淘宝母婴购物数据集】

概述 Ali_Mum_Baby 是一个数据集&#xff0c;其中包含 900 多万条儿童信息&#xff08;生日和性别&#xff09;&#xff0c;这些信息由消费者提供&#xff0c;他们分享这些信息是为了获得更好的推荐或搜索结果。 数据说明 它包含消费者在淘宝或天猫上提供的 9,000,000 多个儿…

新港海岸NCS8822 低功耗DP转VGA 分辨率支持1920*1200*60HZ

NCS8822描述&#xff1a; NCS8822是一个低功耗显示端口到vga转换器。NCS8822集成了一个与DP1.2兼容的接收器和一个高速三通道视频DAC。对于DP1.2输入&#xff0c;NCS8822支持1车道/2车道&#xff0c;也支持车道交换功能。对于VGA输出NCS8822&#xff0c;在60Hz帧率下对WUXGA&a…

【Linux系统】CUDA的安装与graspnet环境配置遇到的问题

今天在安装环境时遇到报错&#xff1a; The detected CUDA version (10.1) mismatches the version that was used to compile PyTorch (11.8). Please make sure to use the same CUDA versions. 报错原因&#xff1a;安装的cuda版本不对应&#xff0c;我需要安装cuda的版本…

西门子PLC1200--与电脑S7通讯

硬件构成 PLC为西门子1211DCDCDC 电脑上位机用PYTHON编写 二者通讯用网线&#xff0c;通讯协议用S7 PLC上的数据 PLC上的数据是2个uint&#xff0c;在DB1&#xff0c;地址偏移分别是0和2 需要注意的是DB块要关闭优化的块访问&#xff0c;否则是没有偏移地址的 PLC中的数据内…

千万不能踏入的渠道管理五大误区!【附策略】

一、引言 在当今激烈的市场竞争环境中&#xff0c;有效的渠道管理是企业获得竞争优势的关键。然而&#xff0c;在实践过程中&#xff0c;不少企业因陷入管理误区而影响了市场拓展和品牌建设。本文旨在揭示渠道管理中常见的五大误区&#xff0c;并提供避免策略&#xff0c;帮助…

H2 Database Console未授权访问漏洞封堵

背景 H2 Database Console未授权访问&#xff0c;默认情况下自动创建不存在的数据库&#xff0c;从而导致未授权访问。各种未授权访问的教程&#xff0c;但是它怎么封堵呢&#xff1f; -ifExists 很简单&#xff0c;启动参数添加 -ifExists &#xff0c;它的含义&#xff1a…