извлечение из TimeArray другого по столбцам - PullRequest
3 голосов
/ 02 марта 2020

У меня есть Юлия TimeArray, скажем, ta, и я хочу построить sub_array TimeArray sub_ta, извлекая некоторые столбцы. Некоторое время спустя go я использовал симулятор кода для минимального примера ниже, но который больше не работает

import TimeSeries
import Dates
dates_index = [ Dates.Date(1970,1,day) for day in [1,2,3,4,5] ]
values = [ [1.0  2.0  3.0  4.0  5.0] ; [10.0  20.0  30.0  40.0  50.0] ; [ 100.0 200.0 300.0 400.0 500.0] ]
ta = TimeSeries.TimeArray( dates_index, transpose(values), [ :col1, :col2, :col3 ] )
sub_ta = ta[ [ :col1 , :col2 ] ]

ERROR: MethodError: no method matching getindex(::TimeSeries.TimeArray{Float64,2,Dates.Date,LinearAlgebra.Transpose{Float64,Array{Float64,2}}}, ::Array{Symbol,1})
Closest candidates are:
  getindex(::TimeSeries.TimeArray, ::Integer) at /home/guilhem/.julia/packages/TimeSeries/bbwst/src/timearray.jl:259
  getindex(::TimeSeries.TimeArray, ::UnitRange{#s30} where #s30<:Integer) at /home/guilhem/.julia/packages/TimeSeries/bbwst/src/timearray.jl:268
  getindex(::TimeSeries.TimeArray, ::AbstractArray{#s30,1} where #s30<:Integer) at /home/guilhem/.julia/packages/TimeSeries/bbwst/src/timearray.jl:276

Что мне кажется странным, так это то, что в источнике библиотеки TimeSeries есть источник (в файле timearray.jl) функция getindex, которая должна работать, если мы хотим работать со многими столбцами.

# array of columns by name
function getindex(ta::TimeArray, ss::Symbol...)
ns = [findcol(ta, s) for s in ss]
TimeArray(timestamp(ta), values(ta)[:, ns], collect(ss), meta(ta))  
end

Но я думаю, что я не смог правильно использовать ее, вероятно, из-за Оператор сплата, который я на самом деле не освоил

, проблема как на julia-1.1.0, так и на julia-1.3.1, с TimeSeries v0.14.0

Ответы [ 2 ]

3 голосов
/ 02 марта 2020

Наконец, я думаю, что нашел решение, я был довольно близок:

sub_ta = ta[ [:col1 , col2]...]

Лучшее введение, которое я нашел на ..., оператор сплат находится на этой странице (поиск "..." или "splat"): введите описание ссылки здесь

2 голосов
/ 02 марта 2020

Какую версию TimeSeries вы используете?

(tmp) pkg> status
    Status `/tmp/Project.toml`
  [9e3dc215] TimeSeries v0.16.1

В версии 0.16.1 оба упомянутых вами синтаксиса работают:

julia> ta
5×3 TimeSeries.TimeArray{Float64,2,Dates.Date,LinearAlgebra.Transpose{Float64,Array{Float64,2}}} 1970-01-01 to 1970-01-05
│            │ col1  │ col2  │ col3  │
├────────────┼───────┼───────┼───────┤
│ 1970-01-01 │ 1.0   │ 10.0  │ 100.0 │
│ 1970-01-02 │ 2.0   │ 20.0  │ 200.0 │
│ 1970-01-03 │ 3.0   │ 30.0  │ 300.0 │
│ 1970-01-04 │ 4.0   │ 40.0  │ 400.0 │
│ 1970-01-05 │ 5.0   │ 50.0  │ 500.0 │

julia> ta[[:col1, :col2]]
5×2 TimeSeries.TimeArray{Float64,2,Dates.Date,Array{Float64,2}} 1970-01-01 to 1970-01-05
│            │ col1  │ col2  │
├────────────┼───────┼───────┤
│ 1970-01-01 │ 1.0   │ 10.0  │
│ 1970-01-02 │ 2.0   │ 20.0  │
│ 1970-01-03 │ 3.0   │ 30.0  │
│ 1970-01-04 │ 4.0   │ 40.0  │
│ 1970-01-05 │ 5.0   │ 50.0  │

julia> ta[[:col1, :col2]...]
5×2 TimeSeries.TimeArray{Float64,2,Dates.Date,Array{Float64,2}} 1970-01-01 to 1970-01-05
│            │ col1  │ col2  │
├────────────┼───────┼───────┤
│ 1970-01-01 │ 1.0   │ 10.0  │
│ 1970-01-02 │ 2.0   │ 20.0  │
│ 1970-01-03 │ 3.0   │ 30.0  │
│ 1970-01-04 │ 4.0   │ 40.0  │
│ 1970-01-05 │ 5.0   │ 50.0  │

Обратите внимание, что это последнее версия является довольно запутанным способом написания ta[:col1, :col2]:

julia> ta[:col1, :col2]
5×2 TimeSeries.TimeArray{Float64,2,Dates.Date,Array{Float64,2}} 1970-01-01 to 1970-01-05
│            │ col1  │ col2  │
├────────────┼───────┼───────┤
│ 1970-01-01 │ 1.0   │ 10.0  │
│ 1970-01-02 │ 2.0   │ 20.0  │
│ 1970-01-03 │ 3.0   │ 30.0  │
│ 1970-01-04 │ 4.0   │ 40.0  │
│ 1970-01-05 │ 5.0   │ 50.0  │
...