在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