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

时间:2018-04-06 17:13:05

标签: julia

所以我使用指标包和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 # │ 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()到数组时:

    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。因为它被包装到数据阵列结构中,所以我无法将其传递给仅为Float64设置的SMA功能。

我是否正确地说因为数据阵列结构不能正常工作以及为什么我无法将其直接用于数据框?

当我使用包CSV中的read.CSV()时,我的调用工作正常,但它开始抛出null错误并覆盖其他文件。所以我暂时放弃了CSV包。

dt = CSV.read("SPY.csv", types=[String; fill(Float64, 5); Int])

这里我有能力指定类型,我能够将df列运行到sma()函数。

1 个答案:

答案 0 :(得分:4)

你的问题还有很多,但我相信它归结为:为什么你不能用sma来调用你定义的DataArray函数?

嗯,这是因为您要求sma函数仅适用于Array{Float64},并且只能返回Array{Float64}的内容。 DataArray{Float64},您发现 Array{Float64}。它是另一种数组(带有小写" a"数组)。但是,它是AbstractArray{Float64}。已经实现了许多自定义数组对象,其外观,行为和行为与内置Array类似,但具有特殊属性。在这种情况下,特殊属性是对缺失值的专门处理。

所以你有两个选择:

  • 您可以实现您的方法以接受并可能返回任何AbstractArray{Float64}。如果您不依赖于任何特殊的内部行为,并且仅使用索引作为数组中的API,这通常被认为是好的风格。
  • 或者,您可以在致电之前将DataArray明确转换为Array。您可以使用convert(Array{Float64}, A)执行此操作 - 但请注意,如果缺少任何元素,则会抛出错误。