朱莉娅DataFrames相当于熊猫pct_change()

时间:2019-05-27 11:30:41

标签: 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])/input[i-1])
    end
    return result
end

这按预期工作。但是想知道是否有类似于熊猫pct_change的Julia DataFrames内置函数可以直接使用?还是我可以对上面的功能进行任何其他更好的方式或改进?

1 个答案:

答案 0 :(得分:2)

这是一个非常特定的功能,未在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

返回正确的值。