Java时间特定平均值

Java时间特定平均值,java,time,average,Java,Time,Average,我有一个文本文件: DATE 20090105 1 2.25 1.5 3 3.6 0.099 4 3.6 0.150 6 3.6 0.099 8 3.65 0.0499 DATE 20090105 DATE 20090106 1 2.4 1.40 2 3.0 0.5 5 3.3 0.19 7 2.75 0.5 10 2.75 0.25 DATE 20090106 DATE 20090107 2 3.0 0.5 2 3.3 0.19 9 2.75 0.5 DATE 20100107 每天我都有:

我有一个文本文件:

DATE 20090105
1 2.25 1.5
3 3.6 0.099
4 3.6 0.150
6 3.6 0.099
8 3.65 0.0499
DATE 20090105
DATE 20090106
1 2.4 1.40
2 3.0 0.5
5 3.3 0.19
7 2.75 0.5
10 2.75 0.25
DATE 20090106
DATE 20090107
2 3.0 0.5
2 3.3 0.19
9 2.75 0.5
DATE 20100107
每天我都有:

Time Rating Variance
我想计算出最大时间尺度上特定时间的平均方差

该文件是巨大的,这只是一个小的编辑样本。这意味着我不知道最近的时间和最早的时间(大约2600),最近的时间可能在50000左右

例如,在所有的日子里,在t=1时,我只有1个值,因此这是当时的平均方差

在t=2时,第一天,t=2时的方差取值1.5,直到t=3,第二天取值=0.5,第三天取值((0.5+0.18)/2)。所以t=2时所有天数的平均方差是当时所有方差之和除以当时不同方差的数量

对于一天中的最后一次,时间刻度为t=1

我只是想知道我会怎么做


作为一个完全的初学者,我发现这相当复杂。我是一名大学生,但大学已经结束了,我正在努力学习Java来帮助我爸爸在暑假里做生意。因此,我们非常感谢您对解决方案的任何帮助。

您必须遵循以下步骤

  • 创建具有日期和trv属性的类
  • 请列出以上班级的名单
  • 使用IO类读取文件
  • 分块读取并转换为字符串
  • 按“日期”拆分整个字符串并修剪
  • 按空格(“”)拆分
  • 第一项是你的约会
  • 将所有其他项目转换为浮动并找到平均值
  • 将其添加到列表中。现在你有了一个每日平均值的列表
  • 您可以将其保存到磁盘并查询所需数据
编辑 你已经编辑了你的问题,现在看起来完全不同了。
我想你需要帮助解析文件。如果我错了,请纠正我。

如果我没有弄错,您是在寻找根据数据流计算的移动平均值。 我编写的以下类提供了一些此类统计信息

  • 移动平均线
  • 衰减平均值(反映最后几个样本的平均值,基于衰减因子)
  • 移动方差
  • 衰减方差
  • 最小值和最大值
希望能有帮助

/**
 * omry 
 * Jul 2, 2006
 * 
 * Calculates:
 * 1. running average 
 * 2. running standard deviation.
 * 3. minimum
 * 4. maximum
 */
public class Statistics
{
    private double m_lastValue;
    private double m_average = 0;
    private double m_stdDevSqr = 0;

    private int m_n = 0;
    private double m_max = Double.NEGATIVE_INFINITY;
    private double m_min = Double.POSITIVE_INFINITY;

    private double m_total;

    // decay factor.
    private double m_d;
    private double m_decayingAverage;
    private double m_decayingStdDevSqr;

    public Statistics()
    {
        this(2);
    }

    public Statistics(float d)
    {
        m_d = d;
    }

    public void addValue(double value)
    {
        m_lastValue = value;
        m_total += value;

        // see http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance
        m_n++;
        double delta = value - m_average;
        m_average = m_average + delta / (float)m_n;
        double md = (1/m_d);
        if (m_n == 1)
        {
            m_decayingAverage = value;
        }
        m_decayingAverage = (md * m_decayingAverage + (1-md)*value);

        // This expression uses the new value of mean
        m_stdDevSqr = m_stdDevSqr + delta*(value - m_average);

        m_decayingStdDevSqr = m_decayingStdDevSqr + delta*(value - m_decayingAverage);

        m_max = Math.max(m_max, value);
        m_min = Math.min(m_min, value);     
    }

    public double getAverage()
    {
        return round(m_average);
    }

    public double getDAverage()
    {
        return round(m_decayingAverage);
    }   

    public double getMin()
    {
        return m_min;
    }

    public double getMax()
    {
        return m_max;
    }

    public double getVariance()
    {
        if (m_n > 1)
        {
            return round(Math.sqrt(m_stdDevSqr/(m_n - 1)));
        }
        else
        {
            return 0;
        }
    }


    public double getDVariance()
    {
        if (m_n > 1)
        {
            return round(Math.sqrt(m_decayingStdDevSqr/(m_n - 1)));
        }
        else
        {
            return 0;
        }
    }

    public int getN()
    {
        return m_n;
    }

    public double getLastValue()
    {
        return m_lastValue;
    }

    public void reset()
    {
        m_lastValue = 0;
        m_average = 0;
        m_stdDevSqr = 0;
        m_n = 0;
        m_max = Double.NEGATIVE_INFINITY;
        m_min = Double.POSITIVE_INFINITY;
        m_decayingAverage = 0;
        m_decayingStdDevSqr = 0;
        m_total = 0;
    }

    public double getTotal()
    {
        return round(m_total);
    }

    private double round(double d)
    {
        return Math.round((d * 100))/100.0;
    }
}

我想我明白了。你想

  • 求出每天给定时间
    t
    的平均方差,该方差由当天小于
    t
    的最高时间戳给出
  • 处理同时读取多个读数的情况,取其平均值
  • 查找在时间
    t
  • 所以我建议,一旦您按照@Manjoor的建议解析数据,那么,(伪代码!)

    函数getAverageAt(int t) 浮动lastvariance=0;//从什么价值开始, //如果在第1天t=1时未指定差异 //如果多个值同时存在,也充当累加器 //时间戳 float allDaysTotal=0;//所有天数在时间t的方差累积和 每天{ 浮动时间[],评级[],差异[]; //从表中读出这些 int found=0;//今天在时间t找到了多少个值 对于(int i=0;i1)lastvariance/=found;//计算多个同时变量的平均值 //读数,如果今天在时间t处发现多个值。 //注意:如果find==0,这意味着您使用的是上一个 //时间戳的值。 //还要注意的是,如果t=1时有两个方差值,则 //平均值不会持续到时间t。 //你可以很容易地重新实现,如果这是你想要的行为,
    //代码是相似的,但是把时间放在好的,我有一个代码可以工作。但是它需要很长的时间(大约7个月的时间,每天30000个变化),因为它必须循环这么多次。还有其他更好的建议吗

    我的意思是,这个代码,对于一些看似简单的东西,大约需要24-28小时

    包装包装

    导入java.io.BufferedReader; 导入java.io.FileReader; 导入java.util.ArrayList

    公共类ReadText{

    public static void main(String[] args) throws Exception {
        String inputFileName="C:\\MFile";
    
    
        ArrayList<String> fileLines = new ArrayList<String>();
        FileReader fr;
        BufferedReader br;
    
        // Time
        int t = 1;
    
    
        fr = new FileReader(inputFileName);
        br = new BufferedReader(fr);
        String line;
    
    
        while ((line=br.readLine())!=null) {
         fileLines.add(line);
        }
    
        AvgVar myVar = new AvgVar(fileLines);
    
        for(t=1; t<10; t++){ 
        System.out.print("Average Var at Time t=" + t + " = " + myVar.avgVar(t)+"\n");
    
    }

    返回n

    }
    
    private ArrayList<double[]> avgDuplicateVars(ArrayList<String> varData){
    
     ArrayList<double[]> avgData = new ArrayList<double[]>();
    
     double[] varValue = new double[86400];
     double[] varCount = new double[86400];
    
     int n = 0;
     int flag = 0;
    
    }
    专用ArrayList avgDuplicateVars(ArrayList varData){
    ArrayList avgData=新的ArrayList();
    double[]varValue=新的双精度[86400];
    double[]varCount=新的双精度[86400];
    int n=0;
    int标志=0;
    
    for(字符串行:varData){

    String[]nLine=iLine.split(“”);
    如果(nLine[0]。等于(“日期”)&&flag==0){
    
    对于(int i=0;我认为您没有得到任何答案,因为您的问题描述很难理解。请尝试让我们这些凡人更清楚一点!此外,您希望得到什么样的输出?您希望为每个可能的时间编写一个带有变化的文件吗?或者您将查询特定的时间并希望查找或删除计算当时的答案?在第7天,你的第一次是2。那么你在第1次的方差应该是什么样的呢?第7天,第1次的方差是0,这应该是平均值的一部分,即对于时间t=1,平均值应该是(1.5+1.4+0)/3.但是,在一天中,如果没有在特定时间声明差异,这是因为它仍然需要差异的最后一个时间值。谢谢你的回答,但我不认为这正是我想要的。我想要的是在特定时间的平均值,所有天的平均值。例如,周一商店的顾客9:00am 5 9:05am 10 9:1上午15点星期二上午9:00上午1点9:05上午2点9点10分1所以一个平均模型来预测有多少人会在商店在这些时间是如下。9:00上午3时9:05AM 6 9:10AM 8当我采取了平均人数的商店在那个时候。删除文件并将数据传输到数据库(例如mySQL),然后您可以使用您的参数来查询它。实际上,我没有ide
    public double avgVar(int time){
    
     double avgVar = 0;
    
     ArrayList<double[]> avgData = avgDuplicateVars(inputData);
    
     for(double[] arrVar : avgData){
     avgVar += arrVar[time-1];
     //System.out.print(arrVar[time-1] + "," + arrVar[time] + "," + arrVar[time+1] + "\n");
     //System.out.print(avgVar + "\n");
     }
    
     avgVar /= numDays(inputData);
    
     return avgVar;
    }
    
    private int numDays(ArrayList<String> varData){
    
     int n = 0;
     int flag = 0;
    
    String[] myData = line.split(" ");
    
    if(myData[0].equals("DATE") && flag == 0){
    
        flag = 1;
    
       }
       else if(myData[0].equals("DATE") && flag == 1){
    
        n = n + 1;
        flag = 0;
    
       }
    
    }
    
    private ArrayList<double[]> avgDuplicateVars(ArrayList<String> varData){
    
     ArrayList<double[]> avgData = new ArrayList<double[]>();
    
     double[] varValue = new double[86400];
     double[] varCount = new double[86400];
    
     int n = 0;
     int flag = 0;
    
    String[] nLine = iLine.split(" ");
       if(nLine[0].equals("DATE") && flag == 0){
    
        for (int i=0; i<86400; i++){
        varCount[i] = 0;
        varValue[i] = 0;
        }
    
        flag = 1;
    
       }
       else if(nLine[0].equals("DATE") && flag == 1){
    
        for (int i=0; i<86400; i++){
        if (varCount[i] != 0){
        varValue[i] /= varCount[i];
        }
        }
    
        varValue = fillBlankSpreads(varValue, 86400);
    
        avgData.add(varValue.clone());
    
        flag = 0;
    
       }
       else{
    
        n = Integer.parseInt(nLine[0])-1;
    
        varValue[n] += Double.parseDouble(nLine[2]);
        varCount[n] += 1;
    
       }
    
    }
    
    private double[] fillBlankSpreads(double[] varValue, int numSpread){
    //Filling the Data with zeros to make the code faster
     for (int i=1; i<numSpread; i++){
     if(varValue[i] == 0){
     varValue[i] = varValue[i-1];
     }
     }
    
     return varValue;
    }