СЛЕГ! <Z> ️
524 subscribers
678 photos
20 videos
12 files
307 links
Здесь создают авторских телеграм-ботов. Когда не справляются конструкторы и веб-студии - есть СЛЕГ.

Статистика ботов:
https://ssleg.tech/bots_view.html

Написать автору: @yesitsnew

TW: ещё тут политота, утечки баз и игры в товарища майора на минималках
加入频道
vote_passport.zip
12.3 MB
База данных электронного голосования по конституции с расшифрованными паспортами. Не является перс. данными, см. выше. 😜
Теперь немного цифр о том, что происходило на выборах.

Дублированные записи: 97 штук, каждая из них дублирована 1 раз, сразу, в следующей строке. У всех инвертирован флаг голосования, т.е. если сначала был 0, то в дубле 1 и наоборот. Соответственно в базу они мной внесены один раз, с флагом по второй записи и флагом doubled=1. Всего 69 из 97 имели возможность проголосовать второй раз, потому что у них инверсия 1->0.

Недействительные паспорта, самое интересное: Всего 6 048 штук (0,5% общего числа), проголосовало 5 437 (89.9%, при общей явке голосовавших 93%). Доля недействительных, по регионам выпуска, колеблется от 0,18% (2 на 1095, 14 регион, 5 на 2707, 39 регион) до 0,91% (11 на 1203, 4 регион), среднее 0,56%. Москва - 4817 на 921101, 0.52%, МО - 256 на 47458, 0.54%, Новгород - 444 на 135721, 0.33%.

То есть и поведение и распределение недействительных паспортов соответсвует обычным, что позволяет выдвинуть гипотезу, что целенаправленного вброса не было и мы имеем дело с просроченными паспортами 20/45. Да и кому нужен вброс размером в 0,5%.🥴

Проголосовавших с валидными паспортами (по регионам выпуска бланков паспорта) :
Нижегородская область - 124 598.
Москва - 854 809.
МО - 43 890.
В сумме эта тройка дает 92.85% от всего проголосовавших (1 102 094 человек).

Забавно, что эта цифра на 11 883 человека больше, чем насчитал ЦИК. Видимо какая-то борьба с голосующими электронно и на участке одновременно была проведена при подведении итогов.
Ещё мне подсказали посмотреть по годам изготовления бланков (вторые две цифры серии). И нашлась ещё одна аномалия. 89 паспортов, с годами от 21 до 96. Причём пик её на 45 году - 22 паспорта.

Что не помешало 67 из 89 "успешно" проголосовать. 😅

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

Опечатки, потому что пик на 45 очень характерен, 45 в первых двух цифрах серии это код Москвы, то есть наиболее часто вводимая серия.

Все 89 паспортов не имеют признака invalid, что очевидно, у МВД свои опечатки, другие :)

P. S. Неверную расшифровку хэша я сразу отметаю, потому что ни один из хэшей не имел двух решений, это контролировалось в процессе. И сама по себе неверная расшифровка имеет микроскопическую вероятность, количество вариантов хэша алгоритма sha256 - 1.16x10^77. 😉
Как раскрутить свой чатик, рассказывает нам канал МДК. Более шести тысяч человек за сутки зашли в чат, чтобы поучаствовать в розыгрыше PlayStation 5. 😂

Таким образом, чуваки обогнали Соловьева (16 673 VS 14 876 рыл) и стали крупнейшим чатиком политотной телеги.

P. S. известным узким местом запроса client.iter_participants является выдача не более 10к участников больших чатов, это ограничение телеграм. Но огорчаться не стоит, потому что выдача идёт по нарастанию времени последней активности. То есть от свежих к старым. И хотя запрос вернул 9997 юзеров, все свежие в него, как видите, попали.
Тут у makecloud.ru обновились тарифы до уровня "халява". Кто примеривался к своей vps хватайте, не пожалеете.

Я уже писал про этот домик для моих ботов.

По состоянию на сейчас - идут 32 сутки с момента переезда туда. Сбоев не было. Простой - 22 секунды на 1 перезагрузку сервера по моей инициативе (обновление убунту).
Тем временем, база тг-политоты доросла до 400 тысяч людей.

Ради интереса, сопоставил её с базой телефонов. Определилось 93 410 штук. 23%

То есть, по каждому четвёртому человеку в политчатиках, можно опеределить как минимум регион по номеру телефона, как максимум реальное имя и соцсети.

Напомню, проверить есть ли вы там, вы можете здесь, спросив Фому :)
Алгоритмы сравнения больших данных могут быть разными. Хорошо, когда все влезает в оперативную память, тогда можно загрузить все в один словарь и по нему пробежать. Это алгоритм раз (слева)

Второй (справа) немного сложнее, но в десятки раз экономнее. Юзерайди в телеграм это целое число в диапазоне от 0 до 1,4 млрд. Соответственно диапазон разбивается на 1400 кусочков по миллиону возможных айди в каждом и сравнивается частями. 1400 запросов к бд, загрузка словаря, сравнение, очистка.

В результате имеем.
Курсор 1 - 400к строк
Курсор 2 - 12М строк
Алгоритм 1 - 2Гб оперативки, 38 секунд.
Алгоритм 2 - 54Мб оперативки, 1 минута, 52 секунды.
Минутка плохих и очень плохих алгоритмов.

Спрашивает приятель:
- глянул твой канал, зачем тебе словари, если можно списки использовать или numpy? (речь идет о задаче сопоставления баз юзеров политоты и телефонов)

Ок, используем списки (сверху, алгоритм 1):
принадлежность проверяем через row[0] in list
1.6Гб памяти, обрабатывает 500 записей за 39 секунд, то есть работа будет сделана всего за 8.7 часа.

Списки (внизу слева, алгоритм 2):
те же списки, принадлежность проверяем через list.count(row[0]). Еще хуже, 500 записей за 56 секунд. Вся задача - 12.5 часов (потому что count всегда пробегает весь list, в отличии от in)

Numpy (внизу справа, алгоритм 3):
640Мб памяти, 10 000 записей за 53 сек. Общее время - 35 минут. Хахалити. 😂

Словари начинают и выигрывают в питоне везде, где больше 1000 элементов. Напомню, что словари решали задачу за 38 секунд. Потому что они не то, чем кажутся. Внутри у них хэши и небинарные люди бинарные деревья.
После первого поста, поиски алгоритмов продолжились.

Приятель сказал - множества! И написал программу в 4 строки. Она вычисляет пересечение двух множеств и печатает его размер.
1 минута 8 секунд. Это самое pythonic way решение. (верхний слайд)

Я написал класс, который изображает из себя btree. При 14к листьев - 1 минута 28 секунд. При 140к листьев - 47 секунд, 1,6-1.7Гб памяти.

В итоге словарь мы не догнали, но ещё два решения нашли.

Итак, перебор сверхбольших массивов в питоше от лучшего к худшему:
Словарями
Самопальным btree
Множествами.

Остальное лучше даже не пробовать 😄

P. S. Голосовать выше не забывайте, мне нужны ваши ориентиры.
Небольшой пример из жизни, для начинающих Питон.

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

Соответственно, сайт надо превратить в список кодов телефонов. Легко (все исходные тексты приложены в след. сообщении ↘️ )

Действие ноль
mobile_operator0.py — превращает список страниц сайта, скопированный с сайта в массив
(единственное ручное действие)

Делай раз
mobile_operator1.py — все страницы сайта загружены в файлики, чтобы их разобрать.
(reg_codes получен на этапе 0. внимание - создайте папку telcodes там, где вы положите эти скрипты или пропишите свой путь)

Делай два
mobile_operator2.py — все страницы очищены от html и превращены в csv

Делай три
mobile_operator3.py — csv прочитаны, проверены на ошибки и просчитаны диапазоны номеров. Сделан итоговый файл csv, которым можно легко пользоваться открыв его в excel.
(программа выловит одну ошибку в данных, это ошибка на сайте. Csv таблицу так же выкладываю ниже ↘️ )

Все готово. Повторив эти шаги вы получили удобную базу с диапазонами номеров, провайдерами и регионами. 7591 запись. А когда вы разберетесь в используемых командах (всего штук 15, в основном строковые и файловые операции) вы сможете гордо сказать, что вы теперь умеете в датамайнинг и почти датасайентист.

Бонусный файл, продвинутый уровень:
mobile_operator4.py — создание таблицы в базе PostgreSQL, с использованием типа данных int8range (да, постгрес умеет хранить и выбирать диапазоны значений). В принципе надо делать три таблицы и два внешних ключа (регион и оператор), но поскольку это статичная малая таблица, смысла усложнять запросы я не вижу.

P. S. Полученная база была протестирована на 12 млн номеров, опознание составило 99.93%. Осталось несколько диапазонов нагуглить и добавить ручками, чтобы довести до 100%.
А вот так уже выглядит запрос в постгрес и его результаты. Работа с диапазонами в слиянии таблиц - легко. Запрос выполняется 28мс.

Фома получит такой функционал в ближайшем обновлении, таблица уже на продакшене. :)
Просто познавательный слайд. План нумерации и сотовые операторы в Крыму сейчас. Выписка из таблицы россвязи от 26 июня 2020