[英]Data types - Difference between data.array and array
所以我正在使用指标包和sma函数。 sma函数的设置如下:
function sma(x::Array{Float64}; n::Int64=10)::Array{Float64}
return runmean(x, n=n, cumulative=false)
end
它的输入是Array {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是一种允许缺少值的数据结构,因此我在这里阅读:
https://github.com/JuliaStats/DataArrays.jl
我用以下数据导入了数据:
df = readtable("SPY.csv", header=true)
因此不确定如何将其转换为data.array结构。
当我将数据框列拉到向量并使用convert()到Array时:
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)
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 │
eltype是Float64。 因为它包装在datarray结构中,所以我无法将其传递给仅为Float64设置的SMA函数。
我是否正确地说是由于datarray结构而不起作用,以及为什么我无法使其直接在数据帧中起作用?
当我使用CSV包中的read.CSV()时,此调用工作正常,但是它开始引发null错误并覆盖了其他文件。 所以我暂时放弃了CSV程序包。
dt = CSV.read("SPY.csv", types=[String; fill(Float64, 5); Int])
在这里,我可以指定类型,并且可以对sma()函数运行df列。
您的问题有很多事情要做,但是我认为可以归结为:为什么您不能调用通过DataArray
定义的sma
函数?
好吧,这是因为您要求sma
函数仅适用于Array{Float64}
,并且只能返回Array{Float64}
。 您已经发现DataArray{Float64}
不是 Array{Float64}
。 这是另一种数组(带有小写的“ a”数组)。 但是,它是AbstractArray{Float64}
。 已经实现了许多自定义数组对象,它们的外观,行为和行为与内置Array
相似,但是具有特殊的属性。 在这种情况下,特殊属性是对缺失值的专门处理。
因此,您有两种选择:
AbstractArray{Float64}
。 如果您不依赖任何特殊的内部行为,而只是使用索引作为数组中的API,则通常将其视为一种好样式。 DataArray
显式转换为Array
。 您可以使用convert(Array{Float64}, A)
-但请注意,如果缺少任何元素,它将引发错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.