繁体   English   中英

数据类型-data.array和array之间的区别

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM