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 человека больше, чем насчитал ЦИК. Видимо какая-то борьба с голосующими электронно и на участке одновременно была проведена при подведении итогов.
Дублированные записи: 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. 😉
Что не помешало 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 юзеров, все свежие в него, как видите, попали.
Таким образом, чуваки обогнали Соловьева (16 673 VS 14 876 рыл) и стали крупнейшим чатиком политотной телеги.
P. S. известным узким местом запроса client.iter_participants является выдача не более 10к участников больших чатов, это ограничение телеграм. Но огорчаться не стоит, потому что выдача идёт по нарастанию времени последней активности. То есть от свежих к старым. И хотя запрос вернул 9997 юзеров, все свежие в него, как видите, попали.
Тут у makecloud.ru обновились тарифы до уровня "халява". Кто примеривался к своей vps хватайте, не пожалеете.
Я уже писал про этот домик для моих ботов.
По состоянию на сейчас - идут 32 сутки с момента переезда туда. Сбоев не было. Простой - 22 секунды на 1 перезагрузку сервера по моей инициативе (обновление убунту).
Я уже писал про этот домик для моих ботов.
По состоянию на сейчас - идут 32 сутки с момента переезда туда. Сбоев не было. Простой - 22 секунды на 1 перезагрузку сервера по моей инициативе (обновление убунту).
Сам ты упоротый! 😜
Хотя, по существу согласен с товарищем. Если хочется начать программировать, но непонятно как, автоматизируйте свою самую нудную и частую задачу. А дальше само пойдёт.
Хотя, по существу согласен с товарищем. Если хочется начать программировать, но непонятно как, автоматизируйте свою самую нудную и частую задачу. А дальше само пойдёт.
Telegram
Эшу быдлокодит
Меня часто спрашивают: с чего начинать изучение программирования? Я всегда предлагаю ответить на вопрос: а зачем оно вам и насколько глубоко вы готовы погружаться в мир IT?
Впрочем, в большинстве случаев, совет один: начните с изучения основ Python. Да,…
Впрочем, в большинстве случаев, совет один: начните с изучения основ Python. Да,…
Тем временем, база тг-политоты доросла до 400 тысяч людей.
Ради интереса, сопоставил её с базой телефонов. Определилось 93 410 штук. 23%
То есть, по каждому четвёртому человеку в политчатиках, можно опеределить как минимум регион по номеру телефона, как максимум реальное имя и соцсети.
Напомню, проверить есть ли вы там, вы можете здесь, спросив Фому :)
Ради интереса, сопоставил её с базой телефонов. Определилось 93 410 штук. 23%
То есть, по каждому четвёртому человеку в политчатиках, можно опеределить как минимум регион по номеру телефона, как максимум реальное имя и соцсети.
Напомню, проверить есть ли вы там, вы можете здесь, спросив Фому :)
Алгоритмы сравнения больших данных могут быть разными. Хорошо, когда все влезает в оперативную память, тогда можно загрузить все в один словарь и по нему пробежать. Это алгоритм раз (слева)
Второй (справа) немного сложнее, но в десятки раз экономнее. Юзерайди в телеграм это целое число в диапазоне от 0 до 1,4 млрд. Соответственно диапазон разбивается на 1400 кусочков по миллиону возможных айди в каждом и сравнивается частями. 1400 запросов к бд, загрузка словаря, сравнение, очистка.
В результате имеем.
Курсор 1 - 400к строк
Курсор 2 - 12М строк
Алгоритм 1 - 2Гб оперативки, 38 секунд.
Алгоритм 2 - 54Мб оперативки, 1 минута, 52 секунды.
Второй (справа) немного сложнее, но в десятки раз экономнее. Юзерайди в телеграм это целое число в диапазоне от 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 секунд. Потому что они не то, чем кажутся. Внутри у них хэши инебинарные люди бинарные деревья.
Спрашивает приятель:
- глянул твой канал, зачем тебе словари, если можно списки использовать или 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 секунд. Потому что они не то, чем кажутся. Внутри у них хэши и
Дорогие читатели, чего вы хотите больше? (несколько вариантов ответа)
Anonymous Poll
48%
Больше алгоритмов и лайфхаков быстродействия python
16%
Больше исходного кода
39%
Больше сливов инфы
35%
Больше подробностей устройства телеги и telethon
13%
И так все хорошо
После первого поста, поиски алгоритмов продолжились.
Приятель сказал - множества! И написал программу в 4 строки. Она вычисляет пересечение двух множеств и печатает его размер.
1 минута 8 секунд. Это самое pythonic way решение. (верхний слайд)
Я написал класс, который изображает из себя btree. При 14к листьев - 1 минута 28 секунд. При 140к листьев - 47 секунд, 1,6-1.7Гб памяти.
В итоге словарь мы не догнали, но ещё два решения нашли.
Итак, перебор сверхбольших массивов в питоше от лучшего к худшему:
Словарями
Самопальным btree
Множествами.
Остальное лучше даже не пробовать 😄
P. S. Голосовать выше не забывайте, мне нужны ваши ориентиры.
Приятель сказал - множества! И написал программу в 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%.
Многие не понимают, как базовые навыки программирования могут в разы облегчить труд. Вот вам живой пример: подумал я вчера, что хорошо бы по номеру телефона определять и регион, откуда юзер. Есть сайты в интернете со списками кодов, но руками туда не набегаешься.
Соответственно, сайт надо превратить в список кодов телефонов. Легко (все исходные тексты приложены в след. сообщении ↘️ )
Действие ноль
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%.