API — как выгрузить эти данные себе

Загрузка…
Это обычные статические JSON-файлы на CDN. Никакой авторизации, ключей и лимитов — просто GET. Заголовок Access-Control-Allow-Origin: * стоит, поэтому можно дёргать прямо из браузерных приложений. Данные обновляются примерно раз в 15 минут, время снимка — в поле generated_at.

Одна оговорка про User-Agent. CDN режет запросы с Python-urllib — отдаёт 403. Это тот клиент, которым pandas ходит за URL внутри себя, поэтому pd.read_csv("https://…") напрямую не сработает: качайте файл через requests (примеры ниже уже так и написаны). curl, wget, requests и браузер работают без всяких заголовков.
Быстрый стартСписок эндпоинтов Что уже собраноВсе участки (true/false) ФедеральныеОдномандатные Итоги и местаДЭГВерсии протоколовВыгрузить всёСпорные участки

Быстрый старт


  

Сначала берём meta.json — там список регионов с их числовыми id. Эти id подставляются в адреса вида r<id>.json. Важно: id региона может смениться, когда добавляются новые собранные регионы (они отсортированы по алфавиту), поэтому сопоставляйте регион по имени, а не запоминайте номер.



  

Список эндпоинтов

АдресЧто внутри

Что уже собрано, а что нет

Общий прогресс

Сколько участков страны уже собрано, разрез по регионам, плюс действующие параметры правила «спорности». Маленький файл — удобно опрашивать.

Не путайте три счётчика. В разрезе по регионам collected — участки, у которых есть оба протокола, а federal и mandate — у которых есть соответствующий. Верхняя строка сайта и meta.json считают участки с хотя бы одним протоколом, поэтому там число чуть больше, чем collected_uiks: два протокола запрашиваются отдельно и приходят не всегда одновременно.


  

Все участки региона со статусом (true/false)

Полный перечень участков, включая ещё не обработанные

Содержит все участки региона, а не только собранные. Формат компактный: cols — названия колонок, rows — массивы значений.

КолонкаСмысл
guidидентификатор участка в системе ЦИК (стабильный)
name, num«УИК №123» и его номер
tikтерриториальная комиссия (район)
collectedtrue, если собраны оба протокола
federalесть федеральный протокол (партсписки)
mandateесть одномандатный протокол
suspiciousучасток помечен как спорный (см. ниже)

  

Только федеральные результаты (партийные списки)

JSON

По каждому собранному участку: votes — голоса в том же порядке, что массив parties; protocol — строки протокола в порядке protocolLines (1 — в списке, 9 — недействительные, 10 — действительные).

CSV (для Excel / pandas)

Разделитель ;, кодировка UTF-8 с BOM — Excel открывает без плясок. Колонки: region;tik;uik;uik_num;guid;registered;turnout;invalid;valid;suspicious, далее по одной колонке на каждую партию (заголовок — полное название партии).


  

Только одномандатные результаты

JSON

У каждого участка свой список candidates (ФИО, партия выдвижения, голоса) и номер округа district. Кандидаты различаются от округа к округу, поэтому единой «широкой» таблицы тут быть не может — в отличие от федеральных.

Важно: у одномандатного протокола своё число избирателей в списке. Оно может быть меньше федерального: «мобильным избирателям» из других округов окружной бюллетень не выдают. Не смешивайте явку из одного протокола с числом избирателей из другого.


  

Готовые итоги и распределение мест

Итог по стране (федеральный список)

Полные результаты региона (оба протокола сразу)

450 мест в Думе, три варианта подсчёта

В seats.json лежит variants с тремя наборами: orig (как в данных ЦИК), clean (без спорных участков), fixed (спорные заменены средними по региону). В каждом — federal[225], mandate[225] и подробности по округам с победителями.

Варианты с суффиксом _abs — гипотетика «не пришедшие как партия»; с суффиксом _deg — к бумаге прибавлен ДЭГ по округам; degonly — только ДЭГ.

Компактные точки для графиков

Одна строка — один участок: число избирателей, явка и голоса, свёрнутые по партиям, отдельно для федерального и одномандатного, плюс метка спорности. Колонки перечислены в поле cols. Поле extra — дополнительные колонки к тем же строкам (тот же порядок): недействительные (inv), досрочно (early), переносные ящики (mobile), недействительные окружного протокола (minv), номер округа (d), место партии на участке (rank_np, rank_kprf, rank_ldpr; 1 — первое место, 0 — нет голосов) и место кандидата «Умного голосования» (umg_rank).

ДЭГ — дистанционное электронное голосование

Итоги ДЭГ по округам, рядом с бумагой

ЦИК публикует итоги ДЭГ не по участкам, а по одномандатному округу целиком — как отдельную «комиссию ДЭГ» при окружной комиссии (тот же отчёт 242, но с параметром parentCommissionClassifierId). Проверено на данных: протокол округа = сумма его участков + ДЭГ, строка в строку. Поэтому во всех остальных файлах ДЭГ не учтён — суммы по участкам (region/*.json, fed/*, country.json.parties) это только бумага.

В deg.json для каждого округа: deg (голоса по партиям f, строки протокола fp, кандидаты m, окружной протокол mp) и paper — те же поля по сумме участков округа. Ещё ДЭГ лежит в region/r<id>.json.deg (по округам региона), country.json.deg (итог по стране) и regions.json (по регионам).

Версии протоколов

Участки, где протокол переписывали

Во всех остальных файлах снимка лежит последняя версия протокола. В changes.json — все версии таких участков: v=1 — первая опубликованная, у последней стоит cur:1. В версии: f — голоса по партиям (порядок как в meta.fedParties), p — строки протокола (порядок как в meta.protoLines), m — кандидаты (только окружной протокол), at — когда версия собрана. У участка в region/r<id>.json появляется поле nv — сколько всего версий. Счётчик: meta.changes.uiks.

Как выгрузить всё разом

Монолитного дампа на 90 тысяч участков намеренно нет: он менялся бы целиком каждые 15 минут и его пришлось бы перекачивать. Вместо этого данные нарезаны по регионам — забираются циклом и хорошо кэшируются.



  

Спорные участки — как они определяются

Загрузка параметров…

Метка suspicious проставлена у каждого участка во всех выгрузках — можно использовать её по-своему или пересчитать самостоятельно по сырым данным. Это эвристика, а не доказательство нарушений: она намеренно консервативна (нужны оба признака сразу, малые участки исключены), поэтому скорее пропустит сомнительный участок, чем пометит честный.

Актуальные числовые параметры всегда лежат в status.json в поле suspicious_rule — эта страница показывает именно их, так что при изменении правила описание обновится автоматически.

Откуда данные

Источник — публичные протоколы участковых комиссий с сайта ЦИК РФ (сводные таблицы результатов). Здесь они только перекладываются в удобный формат: значения протоколов не изменяются и не пересчитываются. Исключение — варианты clean/fixed в seats.json, которые явно помечены как расчётные.