Параметры факторов¶
Mongo-фильтр¶
filter — это запрос, который используется для предварительной фильтрации датасета.
FAAS использует синтаксис запросов mongo, так что загляните в туториал по запросам mongo и справочник операторов запросов.
В этом примере будут агрегированы только документы, у которых поле price
меньше 145000.0:
Более сложный пример фильтра:
config = {
...
'filter': {
'price': {'$ne': null},
'rooms': {'$gte': 10},
'area': {'$nin': [null, NaN, '']},
'address': {'$regex': ".*London.*"},
}
}
Можно задать runtime-фильтр, то есть фильтр, зависящий от рассчитываемой точки.
Такой фильтр выбрасывает точки датасета, у которых id == point.id:
Агрегация¶
Поддерживаемые функции агрегации:
sum— сумма значений;min— минимальное значение;max— максимальное значение;mean— среднее значение;median— медианное значение;count— количество значений;nunique— количество уникальных значений.
Примечание: для агрегаций count и nunique fillna фактора по умолчанию равен 0.
Метрики¶
Поддерживаемые метрики:
dist— расстояние по прямой, мfoot— время пешком, минfoot_dist— расстояние пешком, мcar_in— время на машине до точки, минcar_out— время на машине от точки, минcar_in_dist— расстояние на машине до точки, мcar_out_dist— расстояние на машине от точки, мbike— время на велосипеде, мин
Регионы¶
Регион задаётся в конфиге, по умолчанию '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\)
Обычно применяется только одна метрическая функция:
Тем не менее, можно применить несколько метрических функций последовательно. Этот пример эквивалентен \(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 |
![]() |
| sigmoid | \((1 - \frac{1}{1 + e^{-coef(mt - shift)}})\) | coef=1shift=0 |
![]() |
| normal | \(e^{-\frac{1}{2} (\frac{mt}{sigma})^{power}}\) | sigma=1power=2 |
![]() |
| exp | \(e^{log(\frac{1}{2}) * \frac{mt}{half\_limit}}\) \(1\) при \(mt=0\) \(\frac{1}{2}\) при \(mt=half\_limit\) |
half_limit |
![]() |
| sqrt | \(max(0, 1 - \sqrt{\frac{mt}{limit}})\) | limit |
![]() |
| pow | \(max(0, 1 - (\frac{mt}{limit})^{power})\) | powerlimit |
![]() |
| circle | \(1\) при \(0 < mt < limit\) \(0\) иначе |
limit |
![]() |
| donut | \(1\) при \(limit_{from} < mt < limit_{to}\) \(0\) иначе |
limit_fromlimit_to=np.inf |
![]() |
| 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)}\) | paramslimitscale=Nonestart_from=1inverse=False |
параметризованная монотонная функция |
Функции влияния¶
Влияние (influence) — это значение, которое используется для расчёта вероятности в huff-факторах.
По умолчанию используется функция влияния linear, но в конфиге фактора можно
задать другую:
Доступные функции влияния (\(mt\) — значение метрики, \(wt\) — значение веса):
| функция | формула влияния | параметры и значения по умолчанию |
|---|---|---|
| linear | \(\frac{wt}{mt}\) | |
| pow | \(\frac{wt}{mt^{\frac{pow\_coef}{(1 + wt)^{weight\_pow}}}}\) | pow_coef=1weight_pow=0 |
| sigmoid | \(wt \cdot (1 - \frac{1}{1 + e^{-coef(mt - shift)}})\) | coef=1shift=0 |
| normal | \(wt \cdot e^{-\frac{1}{2} (\frac{mt}{sigma})^{power}}\) | sigma=1power=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)}\) | paramslimitscale=Nonestart_from=1inverse=False |
Фильтры геометрии¶
Поддерживаемые фильтры геометрии:
cross_right— учитывать только те LineString, где точка лежит справа относительно направления движения;cross_left— учитывать только те LineString, где точка лежит слева относительно направления движения;
Примечание: для обоих модификаторов тип геометрии датасета должен быть geojson LineString.
Формула вместо поля¶
Для всех факторов вместо агрегации одного поля можно вычислить выражение по нескольким полям и затем агрегировать его.
Допустим, мы знаем площадь квартир и их цену и хотим агрегировать цену за квадратный метр. В этом случае вместо одного поля можно использовать формулу:
Выражение формулы должно использовать синтаксис numexpr.
Примечание: имена полей с пробелами не допускаются.
Примечание: для фактора Near dropna и dropzero будут применены к
вычисленному полю формулы.
Виртуальные единицы¶
Иногда полезно выполнить агрегацию без учёта какого-либо конкретного
поля. Например, чтобы посчитать huff-факторы для отдельных объектов и агрегировать
влияние каждого дома. Для таких случаев можно использовать виртуальное поле единиц.
Оно обозначается как _ones и может использоваться в formula field.
Такое поле полностью эквивалентно полю из единиц, как если бы оно было в датасете. С ним можно без ограничений выполнять такие же операции в формулах.







