Разные типы данных столбцов фрейма данных не поддерживаются для Impute (метода обработки пропущенных значений) в Julia

#dataframe #csv #julia

#фрейм данных #csv #julia

Вопрос:

Я провел один небольшой эксперимент, и я узнал, что это просто потому, что разные типы данных столбцов включены в CSV. пожалуйста, посмотрите следующий код

 julia> using DataFrames

julia> df = DataFrame(:a => [1.0, 2, missing, missing, 5.0], :b => [1.1, 2.2, 3, missing, 5],:c => [1,3,5,missing,6])
5×3 DataFrame
│ Row │ a        │ b        │ c       │
│     │ Float64? │ Float64? │ Int64?  │
├─────┼──────────┼──────────┼─────────┤
│ 1   │ 1.0      │ 1.1      │ 1       │
│ 2   │ 2.0      │ 2.2      │ 3       │
│ 3   │ missing  │ 3.0      │ 5       │
│ 4   │ missing  │ missing  │ missing │
│ 5   │ 5.0      │ 5.0      │ 6       │

julia> df
5×3 DataFrame
│ Row │ a        │ b        │ c       │
│     │ Float64? │ Float64? │ Int64?  │
├─────┼──────────┼──────────┼─────────┤
│ 1   │ 1.0      │ 1.1      │ 1       │
│ 2   │ 2.0      │ 2.2      │ 3       │
│ 3   │ missing  │ 3.0      │ 5       │
│ 4   │ missing  │ missing  │ missing │
│ 5   │ 5.0      │ 5.0      │ 6       │

julia> using Impute

julia> Impute.interp(df)
ERROR: InexactError: Int64(5.5)
Stacktrace:
 [1] Int64 at ./float.jl:710 [inlined]
 [2] convert at ./number.jl:7 [inlined]
 [3] convert at ./missing.jl:69 [inlined]
 [4] setindex! at ./array.jl:826 [inlined]
 [5] (::Impute.var"#58#59"{Int64,Array{Union{Missing, Int64},1}})(::Impute.Context) at /home/synerzip/.julia/packages/Impute/GmIMg/src/imputors/interp.jl:67
 [6] (::Impute.Context)(::Impute.var"#58#59"{Int64,Array{Union{Missing, Int64},1}}) at /home/synerzip/.julia/packages/Impute/GmIMg/src/context.jl:227
 [7] _impute!(::Array{Union{Missing, Int64},1}, ::Impute.Interpolate) at /home/synerzip/.julia/packages/Impute/GmIMg/src/imputors/interp.jl:49
 [8] impute!(::Array{Union{Missing, Int64},1}, ::Impute.Interpolate) at /home/synerzip/.julia/packages/Impute/GmIMg/src/imputors.jl:84
 [9] impute!(::DataFrame, ::Impute.Interpolate) at /home/synerzip/.julia/packages/Impute/GmIMg/src/imputors.jl:172
 [10] #impute#17 at /home/synerzip/.julia/packages/Impute/GmIMg/src/imputors.jl:76 [inlined]
 [11] impute at /home/synerzip/.julia/packages/Impute/GmIMg/src/imputors.jl:76 [inlined]
 [12] _impute(::DataFrame, ::Type{Impute.Interpolate}) at /home/synerzip/.julia/packages/Impute/GmIMg/src/imputors.jl:58
 [13] #interp#105 at /home/synerzip/.julia/packages/Impute/GmIMg/src/Impute.jl:84 [inlined]
 [14] interp(::DataFrame) at /home/synerzip/.julia/packages/Impute/GmIMg/src/Impute.jl:84
 [15] top-level scope at REPL[15]:1
  

и эта ошибка не возникает при запуске следующего кода

 julia> df = DataFrame(:a => [1.0, 2, missing, missing, 5.0], :b => [1.1, 2.2, 3, missing, 5])
5×2 DataFrame
│ Row │ a        │ b        │
│     │ Float64? │ Float64? │
├─────┼──────────┼──────────┤
│ 11.01.1      │
│ 22.02.2      │
│ 3missing3.0      │
│ 4missingmissing  │
│ 55.05.0      │

julia> Impute.interp(df)
5×2 DataFrame
│ Row │ a        │ b        │
│     │ Float64? │ Float64? │
├─────┼──────────┼──────────┤
│ 11.01.1      │
│ 22.02.2      │
│ 33.03.0      │
│ 44.04.0      │
│ 55.05.0 

теперь я знаю причину, но не понимаю, как ее решить. Я не могу использовать eltype при чтении CSV, потому что в моем наборе данных содержится 171 столбец, и он обычно имеет либо Int, либо Float. застрял на том, как преобразовать все столбцы в Float64.

Ответ №1:

Я предполагаю, что вы хотите:

  1. что-то простое, что не обязательно должно быть максимально эффективным
  2. все ваши столбцы являются числовыми (возможно, с пропущенными значениями)

Затем просто напишите:

 julia> df
5×3 DataFrame
│ Row │ a        │ b        │ c       │
│     │ Float64? │ Float64? │ Int64?  │
├─────┼──────────┼──────────┼─────────┤
│ 11.51.651       │
│ 23.03.33       │
│ 3missing4.55       │
│ 4missingmissingmissing │
│ 57.57.56       │

julia> float.(df)
5×3 DataFrame
│ Row │ a        │ b        │ c        │
│     │ Float64? │ Float64? │ Float64? │
├─────┼──────────┼──────────┼──────────┤
│ 11.51.651.0      │
│ 23.03.33.0      │
│ 3missing4.55.0      │
│ 4missingmissingmissing  │
│ 57.57.56.0 

Можно быть более эффективным (т. Е. преобразовывать только целочисленные столбцы в исходном фрейме данных, но для этого требуется больше кода — пожалуйста, прокомментируйте, если вам нужно такое решение)

Редактировать

Также обратите внимание, что CSV.jl имеет typemap аргумент ключевого слова, который должен позволить решить эту проблему при чтении данных.