Julia - 数据切片在 for 循环中不起作用 - 但在没有 for 循环的情况下工作

时间:2021-04-16 23:31:17

标签: julia julia-dataframe

我正在尝试通过 for 循环从所有股票的数据中提取特定股票代码的数据。当我在 for 循环外使用代码时,代码正在运行,而相同的代码在 for 循环中不起作用。

下面是代码-

工作 -

df = fh_5[fh_5.symbol .== "GOOG", ["date","close"]]

不工作 -

for s in unique!(fh_5.symbol)
    df = fh_5[fh_5.symbol .== s, ["date","close"]]
    date_range = leftjoin(date_range, df, on =:"dates" => :"date")
end

错误

ERROR: BoundsError: attempt to access 6852038×8 DataFrame at index [Bool[1, 0, 0, 0, 0, 0, 0, 0, 0, 0  …  0, 0, 0, 0, 0, 0, 0, 0, 0, 0], ["date", "close"]]
Stacktrace:
 [1] getindex(df::DataFrame, row_inds::BitVector, col_inds::Vector{String})
   @ DataFrames ~\.julia\packages\DataFrames\3mEXm\src\dataframe\dataframe.jl:448
 [2] top-level scope
   @ .\REPL[349]:2

在我运行 for 循环后,在 for 循环外工作的代码不起作用,我必须重新导入 csv 文件 - 如果我先运行 for 循环外的代码,则它可以工作。我在运行 for 循环时是否更改了基础数据集 fh_5?

只是添加可重现的示例 - Data for the example

以下是使用的代码 -

using DataFrames
using DataFramesMeta
using CSV
using Dates
using Query


fh_5 = CSV.read("D:\\Julia_Dataframe\\JuliaCon2020-DataFrames-Tutorial\\fh_5yrs.csv", DataFrame)

min_date = minimum(fh_5[:, "date"])
max_date = maximum(fh_5[:, "date"])
date_seq = string.(collect(Dates.Date(min_date) : Dates.Day(1) : Dates.Date(max_date)))
date_range = df = DataFrame(dates = date_seq)
date_range.dates = Date.(date_range.dates, "yyyy-mm-dd")

for s in unique(fh_5.symbol)
    df = fh_5[fh_5.symbol .== s, ["date","close"]]
    date_range = leftjoin(date_range, df, on =:"dates" => :"date")
    rename!(date_range, Dict(:close => s))
end

1 个答案:

答案 0 :(得分:2)

不要为此使用 unique!,因为这会改变 fh_5.symbol 列。换句话说,unique! 从该列中删除重复值,这将更改该列的长度。请改用 unique。所以,像这样:

for s in unique(fh_5.symbol)
    df = fh_5[fh_5.symbol .== s, ["date","close"]]
    date_range = leftjoin(date_range, df, on =:"dates" => :"date")
end

在 Julia 中,按照惯例,名称以 ! 结尾的函数将改变它们的(部分)参数。