Julia 数据类型-Data.array和array之间的差异

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

所以我使用的是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 # │ 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])