Julia - 数据切片在 for 循环中不起作用 - 但在没有 for 循环的情况下工作
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\DataFramesmEXm\src\dataframe\dataframe.jl:448
[2] top-level scope
@ .\REPL[349]:2
在我 运行 for 循环之后,在 for 循环之外工作的代码不起作用,我必须重新导入 csv 文件 - 如果我 运行 先说吧。我在 运行 循环 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
不要为此使用 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 中,按照惯例,名称以 !
结尾的函数将改变它们的(某些)参数。
我试图通过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\DataFramesmEXm\src\dataframe\dataframe.jl:448
[2] top-level scope
@ .\REPL[349]:2
在我 运行 for 循环之后,在 for 循环之外工作的代码不起作用,我必须重新导入 csv 文件 - 如果我 运行 先说吧。我在 运行 循环 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
不要为此使用 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 中,按照惯例,名称以 !
结尾的函数将改变它们的(某些)参数。