Как стать автором
Обновить

Комментарии 2

Я здесь крокодил мимо, но все-таки, не смог понять: почему запрос:

ta[findall(x -> month(x) == 1, ta.timestamp)]

вернет данные за январь именно 2024 года? А не за январи всех предшествующих лет (включая 2024), за которые есть данные?


И, пользуясь случаем (раз уж Вы взвалили на себя ношу ликбеза), подскажите, пожалуйста:

1) Я правильно понимаю, что дата везде подразумевается обобщенная (т.е. она может включать и время тоже)? Если да, то какой синтаксис принято использовать для долей секунды?

Например, если у меня есть ряд с частотой 100Гц,

то как правильно перевести на Julia  примерно вот такой псевдокод:

dates = Date(2023, 1, 1, 0, 0, 0.0):Secоnds(0.01):Date(2024, 12, 31,23,59,59.99)

Подстава тут в том, что real-числа имеют ограниченную точность представления, и для длинных рядов такой синтаксис будет глючить. Или в Julia-датах секунды целые, а потом идут отдельные поля для мс, мкс и нс?

2) Как устроено хранение timestamp "под капотом"? Там реально хранится каждая дата, или же там указаны только инициализирующие параметры вроде вот этих: (ДАТА_НАЧАЛА, ШАГ, ДАТА КОНЦА)?

В первом варианте на массив дат не накладываются вообще никакие ограничения... но тогда на хранение сигнала, представленного, скажем, двухбайтовыми целыми, нам придется потратить впятеро больше места в зависимости от интервала допустимых дат и требуемой точности записи времени. А главное, совместные операции с данными из двух разных структур (с несовпадающими timestamp-ами) будут жутко неэффективными, так как придется на каждом шаге

анализировать даты

Да даже при простой агрегации данных уже придется даты анализировать. Т.к. в одном месяце может быть 5 значений, в другом 13, в третьем 31. Пока у нас ряд с опросом раз в сутки, это на производительности особо не скажется, но уже при частоте 1 Гц будет тяжко...

А во втором варианте непонятно, как хранить данные с нерегулярным опросом...
Или в библиотеке предусмотрены оба способа организации данных?


3) Что произойдет, если в конструкторе по умолчанию

ta = TimeArray(dates, values, ["Price"])

массивы dates и values отличаются по размеру?

Это ошибка, или

недостающие значения values будут заполнены Nan-ами, а недостающие значения dates дополнены до нужного количества с тем же шагом, как раньше? Разумеется, если этот шаг постоянный?

Почему спрашиваю:

очень часто ряды данных "приходят" в виде огромного файла, для которого известна дата начала сигналов и частота опроса. И попробуй, рассчитай, какая там у этих сигналов дата конца...

4) Какой синтаксис используется, если, к примеру, у меня был ряд с ежесуточными значениями, а я хочу получить агрегированный ряд среднемесячных январских значений за несколько лет (допустим, нужны только январи)?

Или сначала надо получить ряд среднемесячных значений, и только потом можно выбрать из него январи?


5) Как обрабатываются ряды с Nan? Например, если я хочу посчитать среднее или сумму значений в "строке"? То есть, хочу сложить несколько рядов (=колонок =столбцов) друг с другом? Но при этом отдельные значения в некоторых колонках равны Nan. Какое значение получится в колонке результата? С точки зрения логики, при суммировании колонок вроде бы логично получить Nan в эту дату. А вот для среднего вполне осмысленным будет осреднение имеющихся непустых значений. А что будет на самом деле?

Или это как-то настраивается?

Если настраивается, можете показать синтаксис? Я имею в виду примерно такие операции (на псевдокоде):

tsum.values =ta.values + tb.values1 + tb.values2

tsredn.values =СРЕДНЕЕ(ta.values, tb)

где под tb я бы хотел понимать сразу все колонки данных структуры tb

6) И аналогичный вопрос: что будет, если я считаю что-то

по одному ряду в скользящем окне

Например, мне нужно скользящее среднее или что-то подобное. Если я пошлю на вход библиотечной функции ряд с большим количеством Nan, то что получится на выходе? Потенциально тут может быть два варианта:
а) если при некотором положении окна там оказалось хотя бы одно Nan-значение, то для этого момента времени значение ряда-результата будет равно Nan;
б) если при некотором положении окна внутри него есть хотя бы одно не-Nan-значение, то скользящее среднее будет рассчитано по имеющимся данным

Какой их этих подходов принят сейчас в Julia в качестве стандарта? Или все это настраивается при вызове функции? Или для каждого варианта есть своя отдельная библиотечная функция?

7) И последний вопрос - про объединение двух колонок в одну. Если у меня есть две структуры с аналогичными данными, отличающимися только

интервалом времени, за который есть данные

Например, в одной структуре у меня данные за 1913-2000 годы (некоторых лет нету, там Nan), а в другой - данные за 1917-2023, тоже с пропусками. И я хочу построить сводный ряд за 1913-2023. В который бы попали все уникальные данные (которые есть только в одном из рядов), а если за какой-то год есть данные в обоих рядах, то результат должен быть равен их среднему.

Какой будет синтаксис у операции слияния двух этих колонок (структур) в одну более длинную (с учетом времени, разумеется)?


P.S. Прошу прощения, если вопросы глупые. Честно скажу, что я никогда Julia  не изучал и не использовал, т.к. работаю в другой среде. Но интересно: а как это устроено у соседей?

Питон тоже позволяет достичь скоростей сравнимых с С (медленее в Х раз, значит сравним), сложнее найти язык который не может быть сравним.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий