#groovy #graph #interpolation
#groovy #График #интерполяция
Вопрос:
Я пытаюсь каким-то образом «нормализовать» ежемесячные данные.
Я имею в виду, что мне нужно брать ежедневные значения и сверять данные за каждый месяц с данными за другой месяц.
Единственная проблема заключается в том, что некоторые месяцы длиннее других. Итак, я придумал способ, которым я хочу это сделать, но я немного смущен тем, как именно это сделать…
В принципе, я смотрю на этот сайт: http://paulbourke.net/miscellaneous/interpolation / и пытается преобразовать каждый набор координат в график с 31 значениями X и Y (я хотел бы использовать косинусный интерполятор, но я все еще пытаюсь понять, что с ним делать).
Теперь значения X имеют функцию. Я могу передать что-то вроде (1 ..28) и преобразовать его в 31 значение … достаточно простой код, что-то вроде этого работает для меня:
def total = (1..30)
def days = 28
def resize = {x, y->
result = []
x.each{ result << (it * (y/x.size())}
return result
}
resize(total,days)
Который возвращает список из 31 Y-значений, охватывающих от 0 до 28.
Мой вопрос: как мне преобразовать список соответствующих значений Y в эти значения? Мне очень сложно разобраться в концепции, и мне не помешала бы небольшая помощь.
Моей первой мыслью было также просто запустить значения Y через эту функцию, но это возвращает значения, которые все ниже, чем исходные входные данные.
Я ищу что-то, что сохранит значения в определенных точках, но просто растянет график по горизонтали.
Например, при значении x, равном (1/3) длины графика, значение должно быть таким же, как и при (1/3) длины исходного графика.
Кто-нибудь может мне помочь в этом? Это поставило меня в тупик.
Заранее спасибо!
Комментарии:
1. Как хранятся ваши данные x, y? Я думаю, вы показываете здесь только данные x в качестве примера…
2. Данные X — это все, чем я могу манипулировать на данный момент. Мои данные Y хранятся в списке, длина которого эквивалентна длине «итога». (Я могу ссылаться на каждую пару координат, выполнив [total,yValues].transpose(), если это облегчает задачу)
Ответ №1:
Не уверен, в чем проблема, поэтому я составил некоторые данные
Я думаю, что ваш алгоритм верен, и вам нужно только нормализовать ось x.
Я придумал этот код (и некоторые графики), чтобы продемонстрировать, что, по моему мнению, является ответом
Определите некоторые значения x и y:
def x = 1..30
def y = [1..15,15..1].flatten()
Затем сгенерируйте список значений xy в виде: [ [ x, y ], [ x, y ], ...
def xy = [x,y].transpose()
Если мы построим этот список, мы получим:
Затем определите функцию нормализации (в основном такую же, как у вас, но она не затрагивает значение y)
def normalize( xylist, days ) {
xylist.collect { x, y -> [ x * ( days / xylist.size() ), y ] }
}
Тогда мы можем нормализовать наш список до 28 дней
def normalxy = normalize( xy, 28 )
Теперь, если мы построим эти точки, мы получим
Как вы можете видеть, оба графика имеют одинаковую форму, они просто разной ширины…
Я пропустил суть?
Комментарии:
1. Вы попали в точку. Это чрезвычайно полезно, большое вам спасибо!