代码之家  ›  专栏  ›  技术社区  ›  Andrew Bannerman

数据类型-数据之间的差异。数组和数组

  •  0
  • Andrew Bannerman  · 技术社区  · 7 年前

    所以我使用的是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是一种允许缺失值的数据结构,因此我在这里阅读:

    https://github.com/JuliaStats/DataArrays.jl

    我导入了以下数据:

    df = readtable("SPY.csv", header=true) 
    

    所以不确定它是如何转换为数据的。数组结构。

    当我将数据帧列拉入向量并将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)时

    朱莉娅>showcols(df)
    62587数据帧。数据帧
    –Col–Name–Eltype–Missing–缺少
    ·
    1日期日期0
    –2–开放–浮动64–0–0
    –3–高–浮动64–0–0
    4低浮动64 0
    –5–关闭–浮动64–0–0
    –6–调整关闭–浮动64–0–0
    7卷Int64 0
    

    eltype为Float64。因为它被包装到datarray结构中,所以我无法将其传递给SMA函数,该函数仅为Float64设置。

    我说它不工作是因为datarray结构,以及为什么我不能让它直接工作到数据帧中,对吗?

    我使用read时,这个电话工作正常。CSV(),但它开始抛出空错误并覆盖其他文件。所以我暂时放弃了CSV包。

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

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

    1 回复  |  直到 7 年前
        1
  •  4
  •   mbauman    7 年前

    你的问题有很多,但我相信可以归结为:为什么你不能打电话给你的 sma 使用定义的函数 DataArray ?

    因为你要求 sma公司 函数仅适用于 Array{Float64} 它必须只返回 数组{Float64} DataArray{Float64} ,正如您所发现的 数组{Float64} 。这是另一种数组(带有小写“a”数组)。然而,这是一个 AbstractArray{Float64} 。已经实现了许多自定义数组对象,它们的外观、行为和行为与内置对象一样 Array 但有特殊的性质。在这种情况下,特殊属性是对缺失值的专门处理。

    因此,您有两种选择:

    • 您可以实现您的方法来接受并可能返回任何 抽象数组{Float64} 。如果您不依赖任何特殊的内部行为,只使用索引作为数组的API,则通常认为这是一种好的样式。
    • 或者可以显式转换 数据阵列 大堆 在你给他们打电话之前。你可以用 convert(Array{Float64}, A) 但请注意,如果缺少任何元素,它将抛出一个错误。