在Julia中旋转数组

在Julia中旋转数组,julia,Julia,假设我有一个数组 dt = Array([77 1 2 3 4;20210101 0.1 0.1 0.2 0.3;20210102 -0.1 0.05 0.2 0.3; 20210103 0 0.05 0.7 0.3]) 第一行是公司ID(可以忽略[1,1]中的77)。因此,数组表示三天内(从2021年1月1日到2021年1月3日)三家公司(1、2、3和4)的数据 我要做的是旋转此阵列,使其看起来像: 这里的3列分别是日期、公司ID和数据 为此,我的代码如下 data_names = Ve

假设我有一个数组

dt = Array([77 1 2 3 4;20210101 0.1 0.1 0.2 0.3;20210102 -0.1 0.05 0.2 0.3; 20210103 0 0.05 0.7 0.3])

第一行是公司ID(可以忽略[1,1]中的77)。因此,数组表示三天内(从2021年1月1日到2021年1月3日)三家公司(1、2、3和4)的数据

我要做的是旋转此阵列,使其看起来像:

这里的3列分别是日期、公司ID和数据

为此,我的代码如下

data_names = Vector(dt[1,:])
dt = DataFrame(dt[2:end,:])
rename!(dt,Symbol.(data_names))
dt = stack(dt:size(dt))
dt = Matrix(dt)
然而,在这些步骤之后,第二列的类型似乎是CategoricalValue,我不知道如何转换它。


有什么方法可以更容易地做到这一点吗?

完全按照你的要求去做,你可以有

function process(dt)
    dates = dt[2:end, 1]
    ids   = dt[1, 2:end]

    A = zeros(length(dates) * length(ids), 3)
    A[:, 1] = vcat(fill.(ids, length(dates))...)
    A[:, 2] = repeat(dates, length(ids))
    A[:, 3] = Iterators.flatten(dt[2:end, 2:end]) |> collect

    A
end
但是,就个人而言,我希望ID为Int,日期为a。如果您打算以这种方式使用数据,我建议您使用它们并将数据作为
DataFrame
保存。这可能看起来像这样(我不经常使用
DataFrames
,因此可能有一种更为优化的方法,但这就是想法):

这会给你类似的东西:

julia> better_process(dt)
12×3 DataFrame
 Row │ id     date        value   
     │ Int64  Date        Float64 
─────┼────────────────────────────
   1 │     1  2021-01-01     0.1
   2 │     1  2021-01-02    -0.1
   3 │     1  2021-01-03     0.0
   4 │     2  2021-01-01     0.1
   5 │     2  2021-01-02     0.05
   6 │     2  2021-01-03     0.05
   7 │     3  2021-01-01     0.2
   8 │     3  2021-01-02     0.2
   9 │     3  2021-01-03     0.7
  10 │     4  2021-01-01     0.3
  11 │     4  2021-01-02     0.3
  12 │     4  2021-01-03     0.3

然后您可以使用它玩另一种方法,使用@RolfePower的
函数split_date(x)

julia> better_process(dt)
12×3 DataFrame
 Row │ id     date        value   
     │ Int64  Date        Float64 
─────┼────────────────────────────
   1 │     1  2021-01-01     0.1
   2 │     1  2021-01-02    -0.1
   3 │     1  2021-01-03     0.0
   4 │     2  2021-01-01     0.1
   5 │     2  2021-01-02     0.05
   6 │     2  2021-01-03     0.05
   7 │     3  2021-01-01     0.2
   8 │     3  2021-01-02     0.2
   9 │     3  2021-01-03     0.7
  10 │     4  2021-01-01     0.3
  11 │     4  2021-01-02     0.3
  12 │     4  2021-01-03     0.3
julia> using DataFrames, Tables, AxisKeys

julia> ka = wrapdims(dt[2:end, 2:end]; day = split_date.(dt[2:end,1]), ID = Int.(dt[1,2:end]))
2-dimensional KeyedArray(NamedDimsArray(...)) with keys:
↓   day ∈ 3-element Vector{Date}
→   ID ∈ 4-element Vector{Int64}
And data, 3×4 Matrix{Float64}:
                        (1)    (2)     (3)    (4)
   Date("2021-01-01")     0.1    0.1     0.2    0.3
   Date("2021-01-02")    -0.1    0.05    0.2    0.3
   Date("2021-01-03")     0.0    0.05    0.7    0.3

julia> df = DataFrame(Tables.columns(ka));

julia> sort(df, :ID)
12×3 DataFrame
 Row │ day         ID     value   
     │ Date        Int64  Float64 
─────┼────────────────────────────
   1 │ 2021-01-01      1     0.1
   2 │ 2021-01-02      1    -0.1
   3 │ 2021-01-03      1     0.0
   4 │ 2021-01-01      2     0.1
   5 │ 2021-01-02      2     0.05
   6 │ 2021-01-03      2     0.05
   7 │ 2021-01-01      3     0.2
   8 │ 2021-01-02      3     0.2
   9 │ 2021-01-03      3     0.7
  10 │ 2021-01-01      4     0.3
  11 │ 2021-01-02      4     0.3
  12 │ 2021-01-03      4     0.3