Построить несколько строк с отсортированными полями DataFrame по отметке времени - PullRequest
0 голосов
/ 11 февраля 2019

Я ищу элегантное решение для построения линий с помощью Plots.jl, отсортированного по отметке времени

Я хочу, чтобы каждая строка представляла поле данных closeAsk (Float64) по разному году, судя по году отметки времени, т.е., 2002, 2003 и т. Д.

Итак, если у нас есть метка данных с 2002 по 2019 в качестве приведенного ниже примера, у нас должно быть 18 линий на графике.

julia> df2 = df[[:closeAsk, :time]]  
5000×2 DataFrame  
│ Row  │ closeAsk │ time                        │  
│      │ Float64  │ String                      │  
├──────┼──────────┼─────────────────────────────┤  
│ 1    │ 0.9949   │ 2002-11-28T22:00:00.000000Z │  
│ 2    │ 0.995    │ 2002-11-30T22:00:00.000000Z │  
⋮  
│ 4998 │ 1.13414  │ 2019-02-06T22:00:00.000000Z │  
│ 4999 │ 1.13244  │ 2019-02-07T22:00:00.000000Z │  
│ 5000 │ 1.13251  │ 2019-02-10T22:00:00.000000Z │  

Я думаю о том, чтобы использовать понимание для создания набора DataFrames, представляющего поле closeAsk для каждого года, который мы передаем на график (x, y), где y - массив этих разделенных на блоки DataFrames.

Заранее спасибо.

1 Ответ

0 голосов
/ 11 февраля 2019

Проще всего использовать StatsPlots.jl следующим образом:

using StatsPlots, Dates
d = Date.(first.(df2.time, 10))
df2.year = year.(d)
df2.day = @. dayofyear(d) + ((!isleapyear(d)) & (month(d) > 2))
@df df2 plot(:day, :closeAsk, group=:year)

Обратите внимание, что я создаю :day таким образом, чтобы правильно выровнять комбинации месяца и дня по оси x (с учетом факта).что в разные годы у вас может быть разный набор торговых дней и внесение поправок в високосный год, где это необходимо).

РЕДАКТИРОВАТЬ

Объяснение @. dayofyear(d) + ((!isleapyear(d)) & (month(d) > 2)):

  1. @. передает все функции, следующие за этим знаком
  2. dayofyear(d): возвращает номер дня в данном году;обратите внимание, что високосные годы имеют 366 дней, а другие годы имеют 365 дней
  3. ((!isleapyear(d)) & (month(d) > 2)): добавьте 1 к номеру дня, если год не високосный, а дата - конец февраля, таким образом мы нормализуем вселет, чтобы иметь 366 дней (так что одни и те же дни в формате Месяц-День имеют один и тот же номер дня - обратите внимание, что мы должны сдвинуться на +1, начиная с 1 марта по 31 декабря)

Вот краткий пример (обратите внимание, что 2020 - это високосный год, а 2021 - нет):

julia>  d = Date.(["2020-02-28", "2020-02-29", "2020-03-01", "2021-02-28", "2021-03-01"])
5-element Array{Date,1}:
 2020-02-28
 2020-02-29
 2020-03-01
 2021-02-28
 2021-03-01

julia> @. dayofyear(d) + ((!isleapyear(d)) & (month(d) > 2))
5-element Array{Int64,1}:
 59
 60
 61
 59
 61

Таким образом, для одного и того же значения на оси x на вашем графике у вас всегда будет один и тот же день годана все годы.

...