Próbuję wydobyć dane konkretnego symbolu zapasów z danych wszystkich zapasów za pośrednictwem pętli. Kiedy korzystam z kodu z pętli, którego kod działa, podczas gdy ten sam kod nie działa w pętli.

Poniżej znajduje się kod -

Praca -

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

Nie działa -

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

Błąd

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

A po uruchomieniu pętli kod, który pracował poza pętlą, który nie działa, muszę ponownie zaimportować plik CSV - kod poza pracą pętli, jeśli najpierw go uruchomię. Czy zmieniam podstawową bazę danych FH_5, gdy biegam pętli?

Tylko po to, aby dodać powtarzalny przykład - Dane dla przykładu

Poniżej znajduje się używany kod -

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
3
Harneet.Lamba 17 kwiecień 2021, 02:31

1 odpowiedź

Najlepsza odpowiedź

Nie używaj dla tego unique!, ponieważ zamuścił kolumnę fh_5.symbol. Innymi słowy, unique! usuwa zduplikowane wartości z tej kolumny, co zmieni długość tej kolumny. Zamiast tego użyj unique. Więc coś takiego:

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

W Julii, przez konwencję, funkcje z nazwami, które kończą się ! zmutują (niektóre) ich argumenty.

2
Cameron Bieganek 17 kwiecień 2021, 02:16