目前,我已经编写了以下用于百分比变化计算的函数:
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内置函数可以直接使用?还是我可以对上面的功能进行任何其他更好的方式或改进?
答案 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
返回正确的值。