Перейти к содержанию

Параметры факторов

Mongo-фильтр

filter — это запрос, который используется для предварительной фильтрации датасета.

FAAS использует синтаксис запросов mongo, так что загляните в туториал по запросам mongo и справочник операторов запросов.

В этом примере будут агрегированы только документы, у которых поле price меньше 145000.0:

config = {
    ...
    'filter': {'price': {'$lt': 145000.0}},
}

Более сложный пример фильтра:

config = {
    ...
    'filter': {
        'price': {'$ne': null},
        'rooms': {'$gte': 10},
        'area': {'$nin': [null, NaN, '']},
        'address': {'$regex': ".*London.*"},
    }
}

Можно задать runtime-фильтр, то есть фильтр, зависящий от рассчитываемой точки. Такой фильтр выбрасывает точки датасета, у которых id == point.id:

config = {
    ...
    'filter': {'id': {'$ne': '{point.id}'}},
}

Агрегация

Поддерживаемые функции агрегации:

  1. sum — сумма значений;
  2. min — минимальное значение;
  3. max — максимальное значение;
  4. mean — среднее значение;
  5. median — медианное значение;
  6. count — количество значений;
  7. nunique — количество уникальных значений.
config = {
    ...
    'agg': 'sum',
}

Примечание: для агрегаций count и nunique fillna фактора по умолчанию равен 0.

Метрики

Поддерживаемые метрики:

  1. dist — расстояние по прямой, м
  2. foot — время пешком, мин
  3. foot_dist — расстояние пешком, м
  4. car_in — время на машине до точки, мин
  5. car_out — время на машине от точки, мин
  6. car_in_dist — расстояние на машине до точки, м
  7. car_out_dist — расстояние на машине от точки, м
  8. bike — время на велосипеде, мин
feature = {
    ...
    'metric': 'car_in',
}

Регионы

Регион задаётся в конфиге, по умолчанию 'cis'.

Метрические функции

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

Пример:

Допустим, мы считаем сумму квартир в 10-минутной изохроне, и в изохрону попадают три дома.

house id apartments metric
1 100 8
2 120 5
3 150 1

По умолчанию значения просто суммируются: \(100 + 120 + 150 = 370\)

Теперь представим, что дома на краю изохроны мы хотим учитывать с линейно меньшим весом. Тогда нужно применить линейную метрическую функцию, которая задаст вес для каждого дома в зависимости от расстояния в минутах от рассчитываемой точки. При применении linear(10) получаются такие веса:

house id apartments metric weight
1 100 8 0.2
2 120 5 0.5
3 150 1 0.9

И значения суммируются после умножения на веса: \(0.2 * 100 + 0.5 * 120 + 0.9 * 150 = 215\)

Обычно применяется только одна метрическая функция:

feature = {
    ...
    'metric_funcs': [
        {'func': 'sigmoid', 'coef': 2.0, 'shift': 1.0},
    ],
}

Тем не менее, можно применить несколько метрических функций последовательно. Этот пример эквивалентен \(donut(sigmoid(metric, coef, shift), limit\_from, limit\_to)\):

feature = {
    ...
    'metric_funcs': [
        {'func': 'sigmoid', 'coef': 2.0, 'shift': 1.0},
        {'func': 'donut', 'limit_from': 5, 'limit_to': 10},
    ],
}

Доступные метрические функции (\(mt\) — значение метрики):

функция формула веса параметры и значения по умолчанию график
linear \(max(0, 1 - \frac{mt}{limit})\) limit linear
sigmoid \((1 - \frac{1}{1 + e^{-coef(mt - shift)}})\) coef=1
shift=0
sigmoid
normal \(e^{-\frac{1}{2} (\frac{mt}{sigma})^{power}}\) sigma=1
power=2
normal
exp \(e^{log(\frac{1}{2}) * \frac{mt}{half\_limit}}\)
\(1\) при \(mt=0\)
\(\frac{1}{2}\) при \(mt=half\_limit\)
half_limit exp
sqrt \(max(0, 1 - \sqrt{\frac{mt}{limit}})\) limit sqrt
pow \(max(0, 1 - (\frac{mt}{limit})^{power})\) power
limit
pow
circle \(1\) при \(0 < mt < limit\)
\(0\) иначе
limit circle
donut \(1\) при \(limit_{from} < mt < limit_{to}\)
\(0\) иначе
limit_from
limit_to=np.inf
donut
huffnet \(y(x) = \frac{\sum_i y_i \cdot \exp\left( -\frac{(x - x_i)^2}{\text{scale}^2} \right)}{\sum_i \exp\left( -\frac{(x - x_i)^2}{\text{scale}^2} \right)}\) params
limit
scale=None
start_from=1
inverse=False
параметризованная монотонная функция

Функции влияния

Влияние (influence) — это значение, которое используется для расчёта вероятности в huff-факторах.

По умолчанию используется функция влияния linear, но в конфиге фактора можно задать другую:

feature = {
    ...
    'infl_func': [
        {'func': 'pow', 'pow_coef': 2.0},
    ],
}

Доступные функции влияния (\(mt\) — значение метрики, \(wt\) — значение веса):

функция формула влияния параметры и значения по умолчанию
linear \(\frac{wt}{mt}\)
pow \(\frac{wt}{mt^{\frac{pow\_coef}{(1 + wt)^{weight\_pow}}}}\) pow_coef=1
weight_pow=0
sigmoid \(wt \cdot (1 - \frac{1}{1 + e^{-coef(mt - shift)}})\) coef=1
shift=0
normal \(wt \cdot e^{-\frac{1}{2} (\frac{mt}{sigma})^{power}}\) sigma=1
power=2
huffnet параметризованная монотонная функция \(y(x) = \frac{\sum_i y_i \cdot \exp\left( -\frac{(x - x_i)^2}{\text{scale}^2} \right)}{\sum_i \exp\left( -\frac{(x - x_i)^2}{\text{scale}^2} \right)}\) params
limit
scale=None
start_from=1
inverse=False

Фильтры геометрии

Поддерживаемые фильтры геометрии:

  1. cross_right — учитывать только те LineString, где точка лежит справа относительно направления движения;
  2. cross_left — учитывать только те LineString, где точка лежит слева относительно направления движения;

Примечание: для обоих модификаторов тип геометрии датасета должен быть geojson LineString.

config = {
    ...
    'type': 'near',
    'geometry_filter': 'cross_right',
}

Формула вместо поля

Для всех факторов вместо агрегации одного поля можно вычислить выражение по нескольким полям и затем агрегировать его.

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

feature = {
    ...
    'field': 'price / apartment_area',
}

Выражение формулы должно использовать синтаксис numexpr.

Примечание: имена полей с пробелами не допускаются.

Примечание: для фактора Near dropna и dropzero будут применены к вычисленному полю формулы.

Виртуальные единицы

Иногда полезно выполнить агрегацию без учёта какого-либо конкретного поля. Например, чтобы посчитать huff-факторы для отдельных объектов и агрегировать влияние каждого дома. Для таких случаев можно использовать виртуальное поле единиц. Оно обозначается как _ones и может использоваться в formula field.

feature = {
    ...
    'field': '_ones',
}

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