Это очень специфическая функция, которая не предоставляется в 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
с верными значениями.