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

Конфиг FAAS

Схема конфига:

config = {
    'points': str | [],
    'competitors': str | [],
    'features': {str: feature},
    'precision': int,
    'infl_limits': {str: float},
    'region': str,
}

Точки

points — это либо список словарей, либо датасет, содержащий набор точек. Для большого количества точек рекомендуется использовать датасет.

Поля точки:

id
int, у каждой точки должен быть уникальный id;
geopos
dict, геометрия точки в формате geojson;
wt:*
float, у точки могут быть разные веса (используются в huff-факторах). Каждое поле веса должно начинаться с wt:.
collect:*
list[dict], опциональные списки точек для collect-факторов (подробнее в collect-факторе).

Пример:

{
    'id': 1,
    'geopos': {'type': 'Point', 'coordinates': [30.32, 60.07]},
    'wt:area': 0.9,
    'wt:none': 1.0,
}

Конкуренты

competitors — опциональное поле, которое используется в huff-факторах. Оно содержит точки (списком словарей или датасетом), которые должны учитываться только как конкуренты, — факторы для них не считаются. Поля точек в competitors те же, что и в points.

Факторы

features — обязательное поле, словарь {str: feature}, где str — имя задаваемого фактора, а feature — конфиг фактора. Подробное описание доступных факторов смотрите в разделе типы факторов.

Precision

precision — опциональное поле, которое задаёт точность расчёта метрик роутера. Чем выше precision, тем точнее расчёт, но он может занять существенно больше времени, если вы считаете много факторов. Не следует задавать значения выше 22 и ниже 15; обычно значения по умолчанию (19) достаточно.

Что такое геофилд?

Расчёт времени между двумя точками с помощью роутера (любая метрика, кроме dist) — довольно дорогая операция, и посчитанное время не всегда напрямую влияет на результат. Например, для крупных гипермаркетов без конкуренции, ради которых люди готовы ехать издалека, нет смысла считать расстояние от каждой квартиры до магазина — влияние будет минимальным, а время расчёта огромным. Вместо этого можно снизить точность расчётов и увеличить радиус покрытия. С другой стороны, в плотной городской застройке, где кофейни стоят каждые 100 метров, нужна высокая точность расчёта. Здесь важна уже каждая минута, и погрешность в несколько минут может всё изменить.

Чтобы оптимизировать процесс расчёта времени в пути, можно использовать геофилд.

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

Precision сетки определяет размер ячейки, деля экватор на \(2^{precision}\) равных частей. Чем выше precision, тем меньше размер ячейки.

Пример геофилда

Механизм работает так:

  1. Берём исходную точку и точку назначения для расчёта времени
  2. Определяем, в какой ячейке находится точка назначения
  3. Определяем центр этой ячейки
  4. Считаем время роутера между исходной точкой и центром ячейки точки назначения
  5. Кэшируем (сохраняем в памяти) время для данной пары исходной точки и ячейки назначения
  6. В следующий раз для точки назначения в той же ячейке и той же исходной точки время можно будет взять из кэша, а не считать заново
precision размер ячейки
15 1.2 км
16 611 м
17 306 м
18 153 м
19 76 м
20 38 м
21 19 м
22 9 м

Infl_limits

infl_limits — опциональный словарь пар {metric: limit}, который используется в huff-факторах. Он задаёт «круг влияния» каждой точки, то есть точки на расстоянии >= 2 * limit метров не считаются конкурентами. Обычно это поле задавать не нужно.

Region

region — опциональное поле, которое задаёт регион роутера. Некоторые метрики доступны только в определённом регионе. По умолчанию cis.

Полный пример

config = {
    'points': 'client/points',
    'competitors': 'client/competitors',
    'precision': 19,
    'infl_limits': {'foot': 1000, 'car_in': 20000},
    'region': 'cis',
    'features': {
        'price_avg_r1000': {
            'type': 'circle',
            'dataset': 'ru-pub-households/apartments',
            'agg': 'mean',
            'field': 'price',
            'limit': 1000,
        },
        'metro_distance': {
            'type': 'distance',
            'dataset': 'ru-pub-transport/metro',
            'metric': 'foot',
            'limit': 30,
        },
        'new_buildings_huff_f10': {
            'type': 'huff',
            'dataset': 'ru-pub-households/new_buildings',
            'agg': 'sum',
            'field': 'apartments',
            'fillna': 0,
            'limit': 10,
            'metric': 'foot',
        },
    },
}