Как получить X значений растянутого графика?

#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()
  

Если мы построим этот список, мы получим:

график точек от 1 до 30

Затем определите функцию нормализации (в основном такую же, как у вас, но она не затрагивает значение y)

 def normalize( xylist, days ) {
  xylist.collect { x, y -> [ x * ( days / xylist.size() ), y ] }
}
  

Тогда мы можем нормализовать наш список до 28 дней

 def normalxy = normalize( xy, 28 )
  

Теперь, если мы построим эти точки, мы получим

график точек от 1 до 28

Как вы можете видеть, оба графика имеют одинаковую форму, они просто разной ширины…

Я пропустил суть?

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

1. Вы попали в точку. Это чрезвычайно полезно, большое вам спасибо!