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