Интерполировать "пропущенные годы" в JavaScript? - PullRequest
0 голосов
/ 10 июня 2011

До:

id   year  value
SE   1950  67
SE   1960  71
SE   1965  82
NO   1975  65
NO   1985  75

После того, как:

data : {
    SE : {
        data : {
             1950 : 67,
             1951 : 67.4,
             1952 : 67.8,
             [...]
             1965 : 82
        },
        min_year : 1950,
        max_year : 1965

    }    
    NO : {
        data : {
             [...]
        },
        [...]   
    }    
} 

Так в принципе, каков наиболее эффективный способ заполнения пробелов / интерполяции на основе смежных значений в JS?

Ответы [ 2 ]

0 голосов
/ 10 июня 2011

JS как язык не имеет инструментов, которые могут помочь вам напрямую.

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

Линейная интерполяция проще, хотя в целом я бы предположил, что это не такдать такую ​​же точную оценку, как и полиномиальную интерполяцию более высокой степени.

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

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

Трудно сказать, так как степень точности, диапазон данных и масштаб проекта имеют значениекакой тип интерполяции вам нужен, если это можно сделать на стороне сервера / клиента и т. д.

0 голосов
/ 10 июня 2011

Если вы просто хотите прямую линейную интерполяцию, тогда задайте n_0 и n_1 в качестве индексов, для которых вы делаете знаете значения:

val[n] = val[n_0] + (n - n_0) * (val[n_1] - val[n_0]) / (n_1 - n_0);

С учетом ваших данных для SEНапример, интерполированное значение для 1960 года будет:

67.8 + (1960 - 1952) * (82 - 67.8) / (1965 - 1952)

, т.е. около 76.5

...