[英]Julia - data slicing not working in for loop - but working without for loop
我正在尝试通过 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
不要使用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 中,按照惯例,函数名称以!
将突变(部分)他们的 arguments。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.