Джулия DataFrames эквивалент панды pct_change () - PullRequest
1 голос
/ 27 мая 2019

В настоящее время я написал следующую функцию для расчета процентного изменения:

function pct_change(input::AbstractVector{<:Number})::AbstractVector{Number}
    result = [NaN]
    for i in 2:length(input)
        push!(result, (input[i] - input[i-1])/input[i-1])
    end
    return result
end

Это работает как ожидалось. Но хотелось бы узнать, есть ли встроенная функция для Julia DataFrames, аналогичная pandas pct_change, которую я могу использовать напрямую? Или каким-либо другим лучшим способом или улучшениями, которые я могу внести в мою функцию выше?

1 Ответ

2 голосов
/ 27 мая 2019

Это очень специфическая функция, которая не предоставляется в DataFrames.jl, а, скорее, TimeSeries.jl. Вот пример:

julia> using TimeSeries, Dates

julia> ta = TimeArray(Date(2018, 1, 1):Day(1):Date(2018, 12, 31), 1:365);

julia> percentchange(ta);

(есть еще несколько вариантов того, что следует рассчитывать)

Недостатком является то, что он принимает только TimeArray объекты и отбрасывает периоды, для которых процентные изменения не могут быть рассчитаны (так как они сохраняются в Python).

Если вы хотите, чтобы ваше пользовательское определение обозначало первое значение как missing, а не NaN, как missing. Также ваша функция не даст наиболее точного представления чисел (например, если вы хотите использовать BigFloat или точные вычисления с использованием типа Rational, они будут преобразованы в Float64). Вот примеры альтернативных реализаций функций, которые позволяют избежать этих проблем:

function pct_change(input::AbstractVector{<:Number})
    res = @view(input[2:end]) ./ @view(input[1:end-1]) .- 1
    [missing; res]
end

или

function pct_change(input::AbstractVector{<:Number})
    [i == 1 ? missing : (input[i]-input[i-1])/input[i-1] for i in eachindex(input)]
end

А теперь у вас в обоих случаях:

julia> pct_change(1:10)
10-element Array{Union{Missing, Float64},1}:
  missing
 1.0
 0.5
 0.33333333333333326
 0.25
 0.19999999999999996
 0.16666666666666674
 0.1428571428571428
 0.125
 0.11111111111111116

julia> pct_change(big(1):10)
10-element Array{Union{Missing, BigFloat},1}:
  missing
 1.0
 0.50
 0.3333333333333333333333333333333333333333333333333333333333333333333333333333391
 0.25
 0.2000000000000000000000000000000000000000000000000000000000000000000000000000069
 0.1666666666666666666666666666666666666666666666666666666666666666666666666666609
 0.1428571428571428571428571428571428571428571428571428571428571428571428571428547
 0.125
 0.111111111111111111111111111111111111111111111111111111111111111111111111111113

julia> pct_change(1//1:10)
10-element Array{Union{Missing, Rational{Int64}},1}:
   missing
 1//1
 1//2
 1//3
 1//4
 1//5
 1//6
 1//7
 1//8
 1//9

с верными значениями.

...