MethodError при попытке получить строку из фрейма данных Arrow в Julia

У меня есть набор данных, который выглядит следующим образом:  введите описание изображения здесь

Я беру CSV-файл, конвертирую его в Parquet, а затем отправляю в Arrow. Есть причина, по которой я так делаю. Моя цель - получить доступ к информации в строке "Algeria". Это мой код:

df = CSV.read("temp.csv", DataFrame)
write_parquet("data_file.parquet", df)
df = DataFrame(read_parquet("data_file.parquet"))
Arrow.write("data_file.arrow", df)
df = DataFrame(Arrow.Table("data_file.arrow"))

dates = names(df)[5:end]
countries = unique(df[:, :"Country/Region"])

algeria = df[df."Country/Region" .== "Algeria", 4:end]
# Print(sum(eachcol(algeria)))
Print(Statistics.mean(eachcol(algeria)))

Но последняя часть, которая пытается получить данные из Arrow, выдает эту ошибку:

MethodError: no method matching +(::Float64, ::String)

Closest candidates are:

+(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:538

+(::Float64, !Matched::Float64) at float.jl:401

+(!Matched::ChainRulesCore.One, ::Any) at /home/onur/.julia/packages/ChainRulesCore/7d1hl/src/differential_arithmetic.jl:94

Что я делаю неправильно?

Вот что я получаю, когда набираю Алжир в REPL.

введите описание изображения здесь

Обновление: реализация предложения Габриэля:

begin
    algeria = df[df."Country/Region" .== "Algeria", 4:end]
    
    for i = 1:size(algeria, 2)
        if eltype(algeria[!, i]) == String
            algeria[!, i] = parse.(Float64, algeria[!, i])
        end
    end
    
    Statistics.mean(eachcol(algeria))
end

Это ошибка:

MethodError: no method matching +(::Float64, ::String)

Closest candidates are:

+(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:538

+(::Float64, !Matched::Float64) at float.jl:401

+(!Matched::ChainRulesCore.One, ::Any) at /home/onur/.julia/packages/ChainRulesCore/7d1hl/src/differential_arithmetic.jl:94

person oo92    schedule 17.03.2021    source источник
comment
Удалите блоки begin end, характерные для Плутона, и сделайте ненужным чтение вашего кода другими людьми.   -  person Przemyslaw Szufel    schedule 18.03.2021
comment
Можете ли вы показать нам, что выводится, когда вы вводите algeria в REPL?   -  person Gabriel Hassler    schedule 18.03.2021
comment
@GabrielHassler Проверить правки   -  person oo92    schedule 18.03.2021
comment
@ oo92 Извините за непонятность, я надеялся увидеть тип каждого столбца в algeria, который обычно выводится в REPL (хотя, по-видимому, не в вашем конкретном редакторе). Чтобы mean работал, все элементы в algeria должны быть типа Float64. Попробуйте это: all(eltype.(df[!, i] for i = 1:size(df, 2)) .== Float64), чтобы увидеть, возвращает ли он true. Если нет, выясните, какие столбцы имеют неправильный тип с помощью findall(eltype.(df[!, i] for i = 1:size(df, 2)) .!= Float64), и используйте какую-нибудь версию parse(x, Float64), чтобы преобразовать их в правильный тип.   -  person Gabriel Hassler    schedule 18.03.2021


Ответы (2)


Вам необходимо векторизовать mean, см. Код ниже:

julia> df = DataFrame(a=1:3, b=1.5:1:3.5)
3×2 DataFrame
 Row │ a      b
     │ Int64  Float64
─────┼────────────────
   1 │     1      1.5
   2 │     2      2.5
   3 │     3      3.5

julia> Statistics.mean.(eachcol(df))
2-element Vector{Float64}:
 2.0
 2.5
person Przemyslaw Szufel    schedule 17.03.2021
comment
Конечно, но я застрял не в этом - person oo92; 18.03.2021
comment
Вы написали последний кусок, и это был код, и он был неправильным с точки зрения векторизации. Возможно, в этом случае вы могли бы сделать MWE, чтобы более четко показать, что вам нужно :-) - person Przemyslaw Szufel; 18.03.2021
comment
Вот что вызывает упомянутую ошибку: algeria = df[df."Country/Region" .== "Algeria", 4:end] - person oo92; 18.03.2021
comment
Здесь нет никакого дополнения (+). Может быть, причиной была закомментированная строка? - person Przemyslaw Szufel; 18.03.2021
comment
Неа. Просто удалил это и без разницы. - person oo92; 18.03.2021
comment
Кстати. Ваш код не сильно отличается. Оказывается, это мой Print(Statistics.mean(eachcol(algeria))) вызывал ошибку. Я пытался вычислить среднее всех значений в Алжире, но получал ошибку, указанную выше. - person oo92; 18.03.2021
comment
Я не верю, что можно сказать что-то большее с моей стороны без MWE. Вы можете рассчитать средние по строкам, написав: mean(Matrix(df),dims=2) - person Przemyslaw Szufel; 18.03.2021
comment
Почему вы используете df? Это весь фрейм данных. Я только пытаюсь вычислить одну строку из этого df - person oo92; 18.03.2021

Таким образом, похоже, что один из столбцов в algeria содержит строки, а не числа с плавающей запятой.

Попробуйте сделать это перед вычислением среднего:

for i = 1:size(algeria, 2)
    if eltype(algeria[!, i]) == String
        algeria[!, i] = parse.(Float64, algeria[!, i])
    end
end
person Gabriel Hassler    schedule 18.03.2021
comment
Проверьте правки. Я попытался реализовать вашу логику и получил ту же ошибку. - person oo92; 18.03.2021
comment
Вы пробовали findall(eltype.(df[!, i] for i = 1:size(df, 2)) .!= Float64), чтобы увидеть, есть ли столбцы неправильного типа? В конечном итоге mean пытается добавить Float64 к String, поэтому где-то должен быть String. - person Gabriel Hassler; 18.03.2021
comment
Он просто возвращает список целых чисел от 1 до n, где n - размер строки. - person oo92; 19.03.2021