ateo.digital — мониторинг доступности и цензуры Рунета

Схема данных

Формат длинный: одна строка = одно измерение. Так его одинаково удобно читать и pandas, и обычным grep, и он не ломается, когда добавляется новый оператор, цель или сервис.

data/daily/<YYYY-MM-DD>.csv, data/latest.csv

поле тип что означает
date YYYY-MM-DD дата сборки снапшота (UTC)
generated_at ISO 8601 точное время сборки снапшота
window_hours целое окно агрегации: за сколько часов взяты замеры
region eu / sib / ea европейская часть, Сибирь, Дальний Восток
kind vpn / direct через туннель или напрямую, без него
service строка название сервиса; для direct — базовая линия
service_slug строка идентификатор для связи со страницей обзора
protocol строка семейство протокола: xray, wireguard, openvpn, …
provider строка оператор связи, через которого шёл замер
provider_type mobile / wired мобильный интернет или проводной
target строка что проверяли: youtube_home, telegram_org, …
status строка результат проверки, см. ниже

Значения status

data/summary-latest.json

Сводка по последнему снапшоту: доля ok для каждой пары «регион × оператор» по VPN-строкам. Читается глазами, не открывая CSV.

{
  "generated_at": "...",
  "window_hours": 24,
  "measurements": 780,
  "by_region_provider": [
    { "region": "eu", "provider": "Beeline", "ok": 65, "total": 65, "ok_share": 1.0 }
  ]
}

Строка direct — не мусор, а точка отсчёта

kind = direct означает проверку без туннеля, напрямую через оператора. Без неё цифры VPN не с чем сравнивать: если цель недоступна и напрямую, и через туннель, это может быть проблемой самой цели, а не блокировки.

Чего в данных НЕТ и почему