3

我正在尝试通过 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?

只是添加可重现的示例-示例 的数据

以下是使用的代码 -

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
4

1 回答 1

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 中,按照惯例,名称以结尾的函数!将改变(某些)它们的参数。

于 2021-04-17T02:05:41.820 回答