【问题标题】:(Using Julia) How can I reduce my data matrix by averaging values from the same hour?(使用 Julia)如何通过对同一小时的值求平均值来减少我的数据矩阵?
【发布时间】:2018-12-23 13:43:18
【问题描述】:

我正在尝试减小数据的大小,但无法使其正常工作。我在 1 个月内每分钟采集一次数据点。我想将这些数据减少到每小时有一个样本。问题是:我的一些运行具有“NA”值,所以我删除了这些行。每小时不完全是 60 分 - 它会有所不同。

我有一个“时间戳”列。如果数据集具有相同的日期和小时,我已经使用它来制作具有相同值的“日期小时”列。我想平均所有具有相同“日期小时”值的值。

我该怎么做?我尝试过使用下面的 if 和 for 循环,但是运行需要很长时间。

感谢您的所有帮助!我是 Julia 的新手,具有 Matlab 背景。

======= 代码==========

uniquedatehour=unique(datehour,1)

index=[]
avedata=reshape([],0,length(alldata[1,:]))

for j in uniquedatehour
    for i in 1:length(datehour)

        if datehour[i]==j
            index=vcat(index,i)
        else
            rows=alldata[index,:]
            rows=convert(Array{Float64,2},rows)
            avehour=mean(rows,1)
            avedata=vcat(avedata,avehour)
            index=[]
            continue
        end
    end 
end

【问题讨论】:

    标签: matrix timestamp julia mean sample


    【解决方案1】:

    有几个层可以优化此代码。我假设您的数据在datehour 上排序(您的代码假设如此)。

    第一层:一般推荐

    将您的代码包装在一个函数中。在 Julia 中在全局范围内执行代码比在函数内执行代码要慢得多。通过包装它确保将数据作为参数传递给您的函数,或者如果数据在全局范围内,则应使用const;

    第二层:算法推荐

    1. [] 这样的语句创建了一个Any 类型的数组,这很慢,您应该使用像index=Int[] 这样的类型限定符来加快速度;
    2. index=vcat(index,i)这样使用vcat效率低下,不如在原地做push!(index, i)
    3. 最好预先分配avedata,例如fill(NA, length(uniquedatehour), size(alldata, 2)) 并将值分配给现有矩阵而不是对其执行 vcat
    4. 如果我没记错的话,您的代码将产生不正确的结果,因为它不会捕获 uniquedatehour 向量的最后一个条目(假设它只有一个元素并检查会发生什么 - avedata 将有零行)
    5. rows=convert(Array{Float64,2},rows) 行可能根本不需要。如果alldata不是Matrix{Float64}最好在开头转换成Matrix{Float64}(alldata);
    6. 您可以将rows=alldata[index,:] 行更改为view(alldata, index, :) 之类的视图以避免分配;
    7. 一般情况下,您可以避免创建index 向量,因为您只需记住相同值范围的开始s 和结束e 位置,然后使用范围s:e 选择您想要的行.

    如果您纠正了这些问题,请发布您更新的代码,也许我可以提供进一步的帮助,因为仍有改进的空间,但需要一些不同的算法方法(但为了简单起见,您可能更喜欢下面的选项)。

    第三层:我会怎么做

    我会使用DataFrames 包来处理这个问题:

    using DataFrames
    df = DataFrame(alldata) # assuming alldata is Matrix{Float64}, otherwise convert it here
    df[:grouping] = datehour
    agg = aggregate(df, :grouping, mean) # maybe this is all what you need if DataFrame is OK for you
    Matrix(agg[2:end]) # here is how you can convert DataFrame back to a matrix
    

    这不是最快的解决方案(因为它转换为 DataFrame 并返回,但对我来说要简单得多)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-06
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      相关资源
      最近更新 更多