LinearInterpolation 不适用于 DataFrames.jl 中的转换

Bog*_*ski 5 interpolation dataframe julia

我定义了以下线性插值器:

\n
julia> using DataFrames, Interpolations\n\njulia> xs = 1:0.2:5;\n\njulia> ys = log.(xs);\n\njulia> li = LinearInterpolation(xs, ys);\n
Run Code Online (Sandbox Code Playgroud)\n

并有一个数据框:

\n
julia> df = DataFrame(x=2:0.1:3)\n11\xc3\x971 DataFrame\n Row \xe2\x94\x82 x\n     \xe2\x94\x82 Float64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82     2.0\n   2 \xe2\x94\x82     2.1\n   3 \xe2\x94\x82     2.2\n   4 \xe2\x94\x82     2.3\n   5 \xe2\x94\x82     2.4\n   6 \xe2\x94\x82     2.5\n   7 \xe2\x94\x82     2.6\n   8 \xe2\x94\x82     2.7\n   9 \xe2\x94\x82     2.8\n  10 \xe2\x94\x82     2.9\n  11 \xe2\x94\x82     3.0\n
Run Code Online (Sandbox Code Playgroud)\n

我可以将:x数据框的列传递给li递给这样的:

\n
julia> li(df.x)\n11-element Vector{Float64}:\n 0.6931471805599453\n 0.7408022704621078\n 0.7884573603642704\n 0.831963048859085\n 0.8754687373538997\n 0.915490091190668\n 0.9555114450274363\n 0.9925654311042973\n 1.0296194171811581\n 1.0641158529246337\n 1.0986122886681098\n
Run Code Online (Sandbox Code Playgroud)\n

但是,当我尝试使用transform函数时,它失败了:

\n
julia> transform(df, :x => li => :y)\nERROR: ArgumentError: Unrecognized column selector: :x => (21-element extrapolate(scale(interpolate(::Vector{Float64}, BSpline(Linear())), (1.0:0.2:5.0,)), Throw()) with element type Float64:\n
Run Code Online (Sandbox Code Playgroud)\n

并抛出一个我不明白的奇怪错误。如何解决这个问题?

\n

Bog*_*ski 5

您遇到的问题是liLinearInterpolations.jl 没有定义为以下类型的子类型:Function

\n
julia> li isa Function\nfalse\n
Run Code Online (Sandbox Code Playgroud)\n

诸如此类的对象在 Julia 中li被称为仿函数,有时它们的作者不会选择将它们设为仿函数的子类型Function。在这种情况下,最简单的解决方案是使用匿名函数作为解决方法:

\n
julia> transform(df, :x => (x -> li(x)) => :y)\n11\xc3\x972 DataFrame\n Row \xe2\x94\x82 x        y\n     \xe2\x94\x82 Float64  Float64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82     2.0  0.693147\n   2 \xe2\x94\x82     2.1  0.740802\n   3 \xe2\x94\x82     2.2  0.788457\n   4 \xe2\x94\x82     2.3  0.831963\n   5 \xe2\x94\x82     2.4  0.875469\n   6 \xe2\x94\x82     2.5  0.91549\n   7 \xe2\x94\x82     2.6  0.955511\n   8 \xe2\x94\x82     2.7  0.992565\n   9 \xe2\x94\x82     2.8  1.02962\n  10 \xe2\x94\x82     2.9  1.06412\n  11 \xe2\x94\x82     3.0  1.09861\n
Run Code Online (Sandbox Code Playgroud)\n