Dataframe Julia数据帧相当于pandas pct_change()

Dataframe Julia数据帧相当于pandas pct_change(),dataframe,julia,Dataframe,Julia,目前,我已经编写了以下用于百分比变化计算的函数: function pct_change(input::AbstractVector{<:Number})::AbstractVector{Number} result = [NaN] for i in 2:length(input) push!(result, (input[i] - input[i-1])/abs(input[i-1])) end return result end 函数p

目前,我已经编写了以下用于百分比变化计算的函数:

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

函数pct_change(input::AbstractVector{这是一个非常具体的函数,在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中)

如果您需要自定义定义,请考虑将第一个值表示为<代码>缺失<代码>,而不是<代码>楠<代码>,如<代码>缺少< /代码>。您的函数也不会产生最精确的数字表示。(例如,如果您想使用

BigFloat
或使用
Rational
类型的精确计算,它们将转换为
Float64
)。以下是避免这些问题的示例替代函数实现:

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

返回正确的值。

感谢您提出这些备选方案。由于我们处理的是数字类型,使用NaN而不是在自定义函数中丢失不是更好吗?有两个注意事项。首先,并非所有数字类型都支持
NaN
,另外,为了类型稳定性,最好使用
NaN
适当的类型-当然,如果您想最终使用
Float64
,这并不重要。第二个考虑因素是,例如
0/0
产生
NaN
,因此您无法区分“由于缺少数据而导致的缺失”和“由于算术运算结果而导致的缺失”。再次-如果这对您不重要,您可以按照您的建议使用
NaN
。在这种情况下,操作会快一点(根据我的经验,大约10%)。
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