Julia 数据类型-Data.array和array之间的差异
所以我使用的是Indicators包和sma函数。sma功能的设置如下:Julia 数据类型-Data.array和array之间的差异,julia,Julia,所以我使用的是Indicators包和sma函数。sma功能的设置如下: function sma(x::Array{Float64}; n::Int64=10)::Array{Float64} return runmean(x, n=n, cumulative=false) end 它的输入是一个数组{Float64} 因此,我使用以下类型将数据加载到df中: julia> showcols(df) 6258×7 DataFrames.DataFrame │ Col # │ N
function sma(x::Array{Float64}; n::Int64=10)::Array{Float64}
return runmean(x, n=n, cumulative=false)
end
它的输入是一个数组{Float64}
因此,我使用以下类型将数据加载到df中:
julia> showcols(df)
6258×7 DataFrames.DataFrame
│ Col # │ Name │ Eltype │ Missing │
├───────┼───────────┼─────────┼─────────┤
│ 1 │ Date │ Date │ 0 │
│ 2 │ Open │ Float64 │ 0 │
│ 3 │ High │ Float64 │ 0 │
│ 4 │ Low │ Float64 │ 0 │
│ 5 │ Close │ Float64 │ 0 │
│ 6 │ Adj_Close │ Float64 │ 0 │
│ 7 │ Volume │ Int64 │ 0 │
然后,我尝试直接在数据框列上运行sma函数,如下所示:
df[:Close_200sma] = sma(df[:Close],n=200)
它报告说:
MethodError: no method matching sma(::DataArrays.DataArray{Float64,1}; n=200
我看到的类型是:
6258-element DataArrays.DataArray{Float64,1}
DataArrays是一种允许丢失值的数据结构,因此我在这里阅读:
我导入了以下数据:
df = readtable("SPY.csv", header=true)
所以不确定它是如何转换为data.array结构的
当我将数据帧列拉入向量并使用convert()转换为数组时:
Close = Float64[]
Close = vec(df[:Close]) #
6258-element DataArrays.DataArray{Float64,1}
# I use convert to direct array to drop the dataarray structure:
Close = convert(Array, Close) # Float64[6258]
我可以通过sma函数很好地运行它:
sma(Close,n=200)
当我检查showcols(df)时
eltype是Float64。因为它被包装到datarray结构中,所以我无法将其传递给仅为Float64设置的SMA函数
我说它不工作是因为datarray结构,这就是为什么我不能让它直接工作到数据帧中的原因,对吗
当我使用CSV包中的read.CSV()时,这个调用工作正常,但是它开始抛出null错误并覆盖其他文件。所以我暂时放弃了CSV软件包
dt = CSV.read("SPY.csv", types=[String; fill(Float64, 5); Int])
在这里,我能够指定类型,并且能够将df列运行到sma()函数 在你的问题中有很多问题,但我相信可以归结为:为什么你不能调用你用
数据数组定义的sma
函数
这是因为你要求你的sma
函数只对Array{Float64}
起作用,它必须只返回Array{Float64}
中的东西DataArray{Float64}
,正如您所发现的,它不是数组{Float64}
。它是另一种数组(带有小写的“a”数组)。然而,它是一个抽象数组{Float64}
。已经实现了许多自定义数组对象,它们的外观、行为和行为与内置的数组类似,但具有特殊的属性。在这种情况下,special属性专门处理缺少的值
所以你有两个选择:
- 您可以实现方法来接受并可能返回任何
抽象数组{Float64}
。如果您不依赖任何特殊的内部行为,并且只使用索引作为数组中的API,则通常认为这是一种好的样式
- 或者,您可以在调用
DataArray
之前将其显式转换为Array
。您可以使用convert(数组{Float64},A)
执行此操作,但请注意,如果缺少任何元素,它将抛出一个错误
在您的问题中有很多问题,但我相信它归结为:为什么不能调用您用
数据数组定义的sma
函数
这是因为你要求你的sma
函数只对Array{Float64}
起作用,它必须只返回Array{Float64}
中的东西DataArray{Float64}
,正如您所发现的,它不是数组{Float64}
。它是另一种数组(带有小写的“a”数组)。然而,它是一个抽象数组{Float64}
。已经实现了许多自定义数组对象,它们的外观、行为和行为与内置的数组类似,但具有特殊的属性。在这种情况下,special属性专门处理缺少的值
所以你有两个选择:
- 您可以实现方法来接受并可能返回任何
抽象数组{Float64}
。如果您不依赖任何特殊的内部行为,并且只使用索引作为数组中的API,则通常认为这是一种好的样式
- 或者,您可以在调用
DataArray
之前将其显式转换为Array
。您可以使用convert(数组{Float64},A)
执行此操作,但请注意,如果缺少任何元素,它将抛出一个错误
dt = CSV.read("SPY.csv", types=[String; fill(Float64, 5); Int])