Как сделать русскую рулетку на питоне
Пару дней назад закончил писать «Русскую рулетку». Всеми игроками управляет человек, музыки нет и т.д., предупреждаю сразу. Создал я эту программу для своих нужд, но надеюсь, что она кому-то пригодится.
Под спойлером находится видео геймплея.
Вложения rr_alpha.zip Игра для Linux (14.66 КБ) Скачиваний: 25 russian_roulette_win.zip Игра для Windows (7.37 МБ) Скачиваний: 92
Последний раз редактировалось Gamer 13.10.2022, 13:35, всего редактировалось 1 раз.
Gamer Репутация: +46/-3 Сообщения: 368
Сыграл — недурно, напомнило игру на Бэйсике — там были боты, которых тут нет.
Student_25 Репутация: 0 Сообщения: 53
Подоспел маленький фикс — он исправляет некоторые ошибки в логе, который ведёт игра. Если у вас Windows с интерпретатором Python или вы используете Linux, просто перекачайте файл с исходным кодом и разархивируйте в папку с игрой. Код на гитхабе тоже исправлю.
Моделируем игру в рулетку на Python
Недавно у нас была статья о математическом ожидании в рулетке. Сегодня мы смоделируем игру на рулетке и покажем силу математики на практике.
Вкратце: что нужно знать. В рулетку можно выиграть в краткосрочной перспективе, но когда играешь долго, ты всегда теряешь деньги. Почему так:
- У рулетки 37 секторов: 18 красных, 18 чёрных и зеро. Самая простая ставка — на красное или на чёрное. Если ставка сработала, то она удваивается. Если не сработала, то ставка сгорает.
- По идее, в половине случаев ставка должна принести прибыль, поэтому играть в эту игру должно быть выгодно. Поставил большую сумму, удвоил, забрал. На первый взгляд, шанс — 50%.
- Но на самом деле красное или чёрное выпадают не в половине случаев, а чуть реже — за счёт зеро. Из-за него вероятность красного или чёрного не 50%, а 48,6%.
- Получается, при идеально честных рулеточных условиях проигрывать мы будем всегда немного чаще, чем выигрывать. И в долгосрочной перспективе мы будем всегда немного терять деньги.
Но так ли это на самом деле? Может быть, здесь есть какой-то математический трюк, из-за которого мы видим искажённые результаты? Давайте построим модель и протестируем всё.
Что проверяем
Мы смоделируем на Python игру в рулетку по трём стратегиям с разными матожиданиями и посмотрим, как они влияют на результат. Чтобы было нагляднее, мы построим график ставок и выигрышей для каждой стратегии. Python мы выберем именно для того, чтобы быстро построить график.
В каждой стратегии мы всегда начинаем с миллиона рублей, а ставим одну тысячную от этой суммы. Если захотите, можно будет потом поменять это в коде.
Мы сделаем три модели рулетки:
- Классика. В первом случае мы смоделируем классическую рулетку как в казино с отрицательным матожиданием. Для этого нам понадобится 18 чёрных цифр, 18 красных и зеро, а ставить будем только, например, на чёрное. Теоретически, играя по этой стратегии, мы должны со временем проиграть.
- Во второй стратегии мы сделаем нулевое матожидание — уберём зеро. Это даст нам равные шансы при каждой ставке, поэтому, скорее всего, при том же количестве ставок, что и в первый раз, мы останемся с плюс-минус той же суммой. Не ровно той же, а примерно такой же.
- Третья стратегия — делаем положительное матожидание. Для этого мы убираем зеро и одну красную цифру, чтобы у нас было 18 чёрных и 17 красных. Это значит, что мы вероятнее выиграем, чем проиграем, поэтому при том же количестве ставок мы должны неплохо заработать.
Но это в теории. Как получится на практике — сейчас проверим.
⚠️ Это про Python
Мы делаем проект на Python, для его запуска нужна пайтоновская среда и программы. Мы об этом уже писали, прочитайте: Как установить Python и начать на нём писать.
Графики
Чтобы построить графики, нам понадобятся две библиотеки — Plotly и Pandas.
Plotly отвечает за графическую часть — рисует красивые графики в браузере с помощью JavaScript. Их можно увеличивать, выделять фрагмент для анализа, скачивать себе как картинки и сравнивать данные между собой. Когда нужно нарисовать какой-то график, Plotly запускает браузер и создаёт локальную страницу с интерактивными данными.
Чтобы вся эта магия с данными работала и графики обрабатывались правильно, для Plotly нужна библиотека Pandas. Она отвечает за математику, анализ и обработку всех чисел на графике.
Устанавливаются библиотеки так:
pip install plotly
pip install pandas
Эти команды можно запустить прямо в терминале VS Code, если вы пишете код в нём, а если нет — то в командной строке компьютера.
Подготовка
Всё, что понадобится для проверки каждой стратегии, мы вынесем в отдельные переменные. Это позволит нам легко поменять нужные числа при необходимости в одном месте, а не искать по всей программе.
Для подсчёта статистики сделаем переменные, где будем хранить данные о количестве побед и проигрышей. А для графиков — будем запоминать номер игры и количество денег, которые у нас остались.
Напишем это на Python:
# подключаем модуль случайных чисел import random # подключаем модуль для графиков import plotly import plotly.graph_objs as go # сколько денег будет на старте для каждой стратегии startmoney = 1000000 # коэффициент ставки c1 = 0.001 # количество побед и проигрышей win = 0 loose = 0 # количество игр, сыгранных по первой стратегии games = 0 # статистика для первой стратегии balance1 = [] games1 = [] # статистика для второй стратегии balance2 = [] games2 = [] # статистика для третьей стратегии balance3 = [] games3 = []
Три стратегии с матожиданиями
В каждой стратегии будем ставить на цвет — красное или чёрное. Чтобы понять, сыграла ставка или нет, мы каждый раз будем брать случайное число от 1 до 37: 18 чёрных, 18 красных и зеро. Чтобы было проще, пусть числа от 1 до 18 у нас будут чёрные, с 19 по 36 — красные, а 37 будет зеро.
Первая стратегия: берём всё как есть и просто бросаем шарик. Если выпало чёрное — мы выиграли. В этой стратегии у нас 18 выигрышных вариантов и 19 проигрышных, поэтому матожидание будет отрицательным.
Вторая стратегия: убираем зеро. У нас получается по 18 чёрных и красных чисел, и вероятность выиграть — ровно 50 на 50. Это даёт нам нулевое матожидание.
Третья: убираем зеро и одно красное число, чтобы было 18 чёрных и 17 красных. Так как вероятность попасть на чёрное выше, чем на красное, то матожидание будет положительным.
Когда будете читать код, обратите внимание на такую строку: if ball in range(1,19) . Дело в том, что Python работает с диапазоном range() так: первое число входит в рабочий диапазон, а конечное — нет. Поэтому, чтобы нам проверить, попало ли наше число в диапазон от 1 до 18 включительно, нам нужно указать range(1,19).
# начинаем играть с полной суммой # первая стратегия — отрицательное матожидание, как в казино money = startmoney # пока у нас ещё есть деньги while money > 0: # ставка — постоянная часть от первоначальной суммы bet = startmoney * c1 # если ставка получилась больше, чем у нас осталось денег — ставим всё, что осталось, чтобы не уйти в минус if bet > money: bet = money # после ставки количество денег уменьшилось money -= bet # записываем очередную игру в статистику — деньги и номер игры balance1.append(money) games1.append(len(games1)+1) # крутим рулетку, на которой 18 чёрных чисел, 18 красных и одно зеро. Мы ставим на чёрное ball = random.randint(1,37) # пусть первые 18 будут чёрными — для простоты алгоритма # если наша ставка сыграла — мы попали в нужный диапазон if ball in range (1,19): # получаем назад нашу ставку в двойном размере money += bet * 2 # увеличиваем количество побед win += 1 else: # иначе — увеличиваем количество проигрышей loose += 1 games = win + loose # выводим результат игры по первой стратегии print("Выиграно ставок: " + str(win) + " (" + str(win/games * 100) + "%). " + " Проиграно ставок: " + str(loose) + " (" + str(loose/games * 100) + "%). ") # началась вторая стратегия, тоже стартуем с полной суммой # вторая стратегия — с нулевым матожиданием money = startmoney # обнуляем статистику win = 0 loose = 0 # начинаем играть с полной суммой money = startmoney # играем, пока есть деньги или пока мы не сыграем столько же игр, как и в первый раз while (money > 0) and (win + loose < games): # ставка — постоянная часть от первоначальной суммы bet = startmoney * c1 # если ставка получилась больше, чем у нас осталось денег — ставим всё, что осталось, чтобы не уйти в минус if bet >money: bet = money # после ставки количество денег уменьшилось money -= bet # записываем очередную игру в статистику — деньги и номер игры balance2.append(money) games2.append(len(games2)+1) # крутим рулетку, на которой 18 чёрных чисел, 18 красных. Так как всего поровну, матожидание будет равно нулю. # Ставим, как и в прошлом случае, на чёрное ball = random.randint(1,36) # пусть первые 18 будут чёрными — для простоты алгоритма # если наша ставка сыграла — мы попали в нужный диапазон if ball in range (1,19): # получаем назад нашу ставку в двойном размере money += bet * 2 # увеличиваем количество побед win += 1 else: # иначе — увеличиваем количество проигрышей loose += 1 # выводим результат игры по второй стратегии print("Выиграно ставок: " + str(win) + " (" + str(win/games * 100) + "%). " + " Проиграно ставок: " + str(loose) + " (" + str(loose/games * 100) + "%). ") # началась третья стратегия, тоже стартуем с полной суммой # третья стратегия — с положительным матожиданием money = startmoney # обнуляем статистику win = 0 loose = 0 # начинаем играть с полной суммой money = startmoney # играем, пока есть деньги или пока мы не сыграем столько же игр, как и в первый раз while (money > 0) and (win + loose < games): # ставка — постоянная часть от первоначальной суммы bet = startmoney * c1 # если ставка получилась больше, чем у нас осталось денег — ставим всё, что осталось, чтобы не уйти в минус if bet >money: bet = money # после ставки количество денег уменьшилось money -= bet # записываем очередную игру в статистику — деньги и номер игры balance3.append(money) games3.append(len(games3)+1) # крутим рулетку, на которой 18 чёрных чисел, 17 красных. Так как чёрных больше, а мы ставим на чёрное, то матожидание будет положительным # Ставим, как и в прошлом случае, на чёрное ball = random.randint(1,35) # пусть первые 18 будут чёрными — для простоты алгоритма # если наша ставка сыграла — мы попали в нужный диапазон if ball in range (1,19): # получаем назад нашу ставку в двойном размере money += bet * 2 # увеличиваем количество побед win += 1 else: # иначе — увеличиваем количество проигрышей loose += 1 # выводим результат игры по третьей стратегии print("Выиграно ставок: " + str(win) + " (" + str(win/games * 100) + "%). " + " Проиграно ставок: " + str(loose) + " (" + str(loose/games * 100) + "%). ")
Если мы запустим этот код, то в консоли увидим результат для каждого матожидания:

Кажется, что все три варианта дают примерно одинаковый результат, но на самом деле в первом случае вы останетесь без денег, а в третьем — разбогатеете. Чтобы было нагляднее — построим графики.
Строим графики
Для графиков мы используем библиотеку Plotly и рисуем сразу все три графика на одном поле — это даст нам наглядность и понимание, к чему приводит разное матожидание. Чтобы было понятно, какой график отвечает за какую стратегию, мы их подпишем:
# строим графики fig = go.Figure() # для первой стратегии fig.add_trace(go.Scatter(x=games1, y=balance1, name = "Отрицательное матожидание")) # для второй fig.add_trace(go.Scatter(x=games2, y=balance2, name = "Нулевое матожидание")) # и для третьей fig.add_trace(go.Scatter(x=games3, y=balance3, name = "Положительное матожидание")) # выводим графики в браузер fig.show()
Теперь посмотрим на тот же результат, который у нас получился, но в виде графиков:

Синяя линия — это баланс нашей первой игры с отрицательным матожиданием. Мы предсказуемо всё проиграли.
Оранжевая линия — график баланса при нулевом матожидании. Видно, что мы то выигрывали, то проигрывали, но в результате мы всё равно остались примерно с той же суммой, что и начинали.
Зелёная линия — наш баланс при положительном матожидании. Мы выигрывали чаще, чем проигрывали, поэтому удвоили нашу стартовую сумму.
Готовый код
# подключаем модуль случайных чисел import random # подключаем модуль для графиков import plotly import plotly.graph_objs as go # сколько денег будет на старте для каждой стратегии startmoney = 1000000 # коэффициент ставки c1 = 0.001 # количество побед и проигрышей win = 0 loose = 0 # количество игр, сыгранный по первой стратегии games = 0 # статистика для первой стратегии balance1 = [] games1 = [] # статистика для второй стратегии balance2 = [] games2 = [] # статистика для третьей стратегии balance3 = [] games3 = [] # начинаем играть с полной суммой # первая стратегия — отрицательное матожидание, как в казино money = startmoney # пока у нас ещё есть деньги while money > 0: # ставка — постоянная часть от первоначальной суммы bet = startmoney * c1 # если ставка получилась больше, чем у нас осталось денег — ставим всё, что осталось, чтобы не уйти в минус if bet > money: bet = money # после ставки количество денег уменьшилось money -= bet # записываем очередную игру в статистику — деньги и номер игры balance1.append(money) games1.append(len(games1)+1) # крутим рулетку, на которой 18 чёрных чисел, 18 красных и одно зеро. Мы ставим на чёрное ball = random.randint(1,37) # пусть первые 18 будут чёрными — для простоты алгоритма # если наша ставка сыграла — мы попали в нужный диапазон if ball in range (1,19): # получаем назад нашу ставку в двойном размере money += bet * 2 # увеличиваем количество побед win += 1 else: # иначе — увеличиваем количество проигрышей loose += 1 games = win + loose # выводим результат игры по первой стратегии print("Выиграно ставок: " + str(win) + " (" + str(win/games * 100) + "%). " + " Проиграно ставок: " + str(loose) + " (" + str(loose/games * 100) + "%). ") # началась вторая стратегия, тоже стартуем с полной суммой # вторая стратегия — с нулевым матожиданием money = startmoney # обнуляем статистику win = 0 loose = 0 # начинаем играть с полной суммой money = startmoney # играем, пока есть деньги или пока мы не сыграем столько же игр, как и в первый раз while (money > 0) and (win + loose < games): # ставка — постоянная часть от первоначальной суммы bet = startmoney * c1 # если ставка получилась больше, чем у нас осталось денег — ставим всё, что осталось, чтобы не уйти в минус if bet >money: bet = money # после ставки количество денег уменьшилось money -= bet # записываем очередную игру в статистику — деньги и номер игры balance2.append(money) games2.append(len(games2)+1) # крутим рулетку, на которой 18 чёрных чисел, 18 красных. Так как всего поровну, матожидание будет равно нулю. # Ставим, как и в прошлом случае, на чёрное ball = random.randint(1,36) # пусть первые 18 будут чёрными — для простоты алгоритма # если наша ставка сыграла — мы попали в нужный диапазон if ball in range (1,19): # получаем назад нашу ставку в двойном размере money += bet * 2 # увеличиваем количество побед win += 1 else: # иначе — увеличиваем количество проигрышей loose += 1 # выводим результат игры по второй стратегии print("Выиграно ставок: " + str(win) + " (" + str(win/games * 100) + "%). " + " Проиграно ставок: " + str(loose) + " (" + str(loose/games * 100) + "%). ") # началась третья стратегия, тоже стартуем с полной суммой # третья стратегия — с положительным матожиданием money = startmoney # обнуляем статистику win = 0 loose = 0 # начинаем играть с полной суммой money = startmoney # играем, пока есть деньги или пока мы не сыграем столько же игр, как и в первый раз while (money > 0) and (win + loose < games): # ставка — постоянная часть от первоначальной суммы bet = startmoney * c1 # если ставка получилась больше, чем у нас осталось денег — ставим всё, что осталось, чтобы не уйти в минус if bet >money: bet = money # после ставки количество денег уменьшилось money -= bet # записываем очередную игру в статистику — деньги и номер игры balance3.append(money) games3.append(len(games3)+1) # крутим рулетку, на которой 18 чёрных чисел, 17 красных. Так как чёрных больше, а мы ставим на чёрное, то матожидание будет положительным # Ставим, как и в прошлом случае, на чёрное ball = random.randint(1,35) # пусть первые 18 будут чёрными — для простоты алгоритма # если наша ставка сыграла — мы попали в нужный диапазон if ball in range (1,19): # получаем назад нашу ставку в двойном размере money += bet * 2 # увеличиваем количество побед win += 1 else: # иначе — увеличиваем количество проигрышей loose += 1 # выводим результат игры по третьей стратегии print("Выиграно ставок: " + str(win) + " (" + str(win/games * 100) + "%). " + " Проиграно ставок: " + str(loose) + " (" + str(loose/games * 100) + "%). ") # строим графики fig = go.Figure() # для первой стратегии fig.add_trace(go.Scatter(x=games1, y=balance1, name = "Отрицательное матожидание")) # для второй fig.add_trace(go.Scatter(x=games2, y=balance2, name = "Нулевое матожидание")) # и для третьей fig.add_trace(go.Scatter(x=games3, y=balance3, name = "Положительное матожидание")) # выводим графики в браузер fig.show()
Что дальше
Теперь у вас есть все инструменты, чтобы проверять результаты игр при любом матожидании. Этот код можно использовать не только для рулетки, а в принципе для любых игр, где результат определяется случайным образом.
Русская рулетка


У админского эффекта присутствия есть и обратная сторона.

2 дня назад

А логические ошибки разработчик должен видеть сам!

3 дня назад
Работает же!

4 дня назад

Ответ на пост «Собеседование в IT»
Дело было давно. Устроился в крупную IT-компанию, в один из отделов, занимающийся разработкой своей АРМ-системой. Разработка велась уже более 10 лет и к моменту моего начала уже отсутствовали те, кто всё это затеял. Выделили комп, стол, а под ним тумбочка. В ней оставалось какое-то барахло, сказали выбросить. Разобрав тумбочку я обнаружил книжку с основной документацией на систему для разработчиков. Я довольно быстро освоился и через какое-то время с простых задач перешёл к сложным.
И вот спустя несколько месяцев, обсуждаем одну разработку. Я высказался: ну тут всё просто — в ядре есть поддержка этого и этого, по сути нужно только вызвать функцию *** из модуля ***, помню, это было в документации.
В этот момент я заметил удивлённые лица ведущих программистов: «В какой ещё документации?»
Я достал книжку и показал им, они удивлённо отстали её, видя впервые. Некоторые сотрудники работали в отделе более 5 лет и не знали о существовании таковой, другие же припоминали что-то, но считали что всё давно утеряно. А я думал, что такая книжка есть у каждого или в электронном виде где-то.
5 дней назад

О траблшутинге в IT (и не только)

Показать полностью 1
6 дней назад

Дикая природа IT удивительна
Взято из телеграмма — Инкогнито

Показать полностью 1
Поддержать
8 дней назад

Абидна

8 дней назад

Ответ на пост «Как я стал программистом в 32 года. Отработал 1 год. Стоит ли оно того?»
Короткий рассказ.
Скорее нет, особенно вначале.
Можно ли получать удовольствие?
Изменяется ли личность?
Да, но у всех по-своему. Иногда это пугает.
Это спокойная работа?
Нифига, нервы нужны крепкие.
Про общение с неприятными людьми можно забыть?
И опять нет, вам хватит руководителей, а заказчики ещё та песня.
Можно ли работать на удаленке?
100% , если вы готовы.
Новые друзья и крутая тусовка прилагаются?
Зависит от выбора компании и отдела в ней.
А что тогда в этом хорошего?
Мой ответ таков, что, умея программировать, я могу наделать себе интересных пет-проектов для души, и чего я всегда желал. Например. Чат бот на языковой модели GPT. Или это. Обучение с подкреплением для биржевой торгашки.
Длинный рассказ.
Я тоже только в 32 стал прогать на работе.
Но не так жестоко было всё. Не с нуля, не из менеджерской роли.
Образование социологическое, диплом по количественным методам. На красную пятёрку. Правда, когда спустя лет 8 я связался с профессором социологии из Урбане-Шампейне, на чьей статье я развивал тему, оказалось, что мой подход был почти полностью калом, с его точки зрения.
А, ну ещё в школе еле вытянул факультатив на бейсике. Вообще с логикой проблемы были лет до 30-35.
6 лет аналитиком данных (эксель), SPSS. И другие статистические пакеты с графическим интерфейсом. Прокачивал скорее матчасть в области анализа, нежели чистую техничку.
Понадобились макросы. Открыл IDE в экселе и прямо такое приятное чувство испытал, когда за долбанными таблицами скрывается ЯП и море возможностей. Visual Basic, если что. Через месяц я написал аж программу, которая прогнозирует продажи и даже общается с 1С.
Потом понадобилось сделать такую штуку для маркетинга, как ассоциированные продажи. Установил R. Про их IDE понятия тогда не имел. Научился в командной строке делать моделирование (a priori). Получилось.
Параллельно прошёл бесплатный курс по SQL , базовые вещи. Начал слегка шурупить в реляционных базах.
На работе застой с повышениями. Плюс антикризисное управление. А у меня кредит большой. Через хаха получил приглашение на мидла статистика. Три вечера читал про проверки гипотез. Собес прошёл. Дали тогда 90 на руки, это 2014 был. Это было не больше, чем я получал. И в карьере бывал и старшим и руководителем группы. Короче, дауншифтнулся конкретно, лишь бы из маркетинговых исследований и анализа свалить.
Сил в 30 лет дофига ещё.
На новой работе начал фигачить нормальную взрослую статистику. Rstudio, и много сложных запросов. Самый прикол — без хороших коллег профессиональный рост очень медленный. Мне дядька у соседнего компа пару раз подсказал по БД и реально как лампочка зажглась в голове.
Потом подняли до старшего, ЗП 115 или 120. Было покомфортнее. Через три года я ушёл по личным причинам плюс менеджеры подпалили мне седло, да и однообразие задач стало добивать просто нереально. Но писал запросы я уже с нормальной оптимизацией.
На новой работе был мидлом с зп 200. Прошёл курс Advanced R (а на ступеньку ниже уже давно прошёл). Курсы от C. a. Там был сложный проект, который я взялся писать на R. За почти полтора года где-то 10-12 тыщ строк. Ушёл по . личным причинам. К меня ещё с эмоциальной стабильностью не всё отлично.
Потом ещё переход на другую работу, там уже были 220 ЗП. Задачи разные, интересные, много исследований. Подключил Python. Ушёл с — бее — Винды и плюсовой среды версионирования на линукс. Наигрался в машинное обучение, глубокие сети. Большие данные немного.
И тут я подзастрял в своей ракушке комфорта. Ну и уже на Python уровень мидла сделал. И 8 лет на R, сениористость детектед.
Выгораний было дофига. В моём случае, в основном, от общения с манагерами. Переход на полную удаленку сделал меня хуже. Хотя через пару лет стало привычно. Как теперь ежедневно бежать в офис на какой-то дейлик я ХЗ!
Не жалею, что ушёл из экселя и маркетинга, там душновато прямо бывало. И ещё раз. Нужны полезные люди вокруг. Меня предупреждали, что в ИТ зае. Ну вы поняли, от однообразных задач. Потом эту же теорию высказал один эксперт: он свалил в Европы за интересной работой, и уже оттуда ныл, что всё уже видел и опять то же самое и тд.
И я вас предупреждаю об этом. А ещё о том, что учить новое надо будет постоянно, если хотите карьерной мобильности. А если вы не гений, то удовольствие от новых вещей вы начнёте получать совсем не сразу а фрустрацию — как раз сразу. А если ещё лид попадётся, повёрнутый на «модненьких штучках», вы будете страдать.
То есть вместо борьбы не на жизнь, а на смерть за руководящую должность я получил через 4 года работу, к которой больше лежит душа. Только живот отрос в процессе.
Показать полностью
Поддержать
10 дней назад

Чему-то новому научился
Вот решил поделиться своим маленьким достижением.
Написал рендерер на python. Без каких бы то ни было зависимостей кроме numpy. т.е. без OpenGL и т.п.
Знающие, наверное, посмеялись.
Но я не ставил целью какое-то практическое применение. Только любопытства ради, давно было интересно как это всё работает.
Постепенно. Шаг за шагом. Пилил по одной фиче.
Прогресс выглядел примерно так.
1. Сначала был только однонаправленый свет.

2. Потом появилась перспектива




6. Правильные текстурки



Ещё много чего можно сделать. Может, буду допиливать, как время будет.
Сильно не пинайте. Чукча не писатель.
Показать полностью 8
19 дней назад

Связный список насмешек

Показать полностью 1
1 месяц назад

Войти в IT
Привет, пикабутяне!! Работал 6 лет системным администратором, сейчас 1с программистом уже лет 10 примерно, и надоело. Нет никакой законченности, нет такого что закончил интересный проект и вздохнул, вечно звонки, вечно исправления в прошлом периоде. А эти печатные формочки, которые надо менять/добавлять по несколько раз в месяц. А ведь всегда тянуло к компам и программированию, а тут стало надоедать, потерял интерес.
И решил переквалифицироваться в «настоящего» программиста. Не знаю получится или нет, тем более в 43 года, но постараюсь. Начал изучать книгу PyQt5.

Вроде все понятно, написал пару мелких программок типа игры Быки-коровы для десктопа. Еще обучающие видео смотрю по алгоритмам, докерам, Гит и остальному. Информации конечно очень много, но интересно. Думаю над пэт-проектом, наверно будет что-то вроде домашних финансов, что бы и в браузере и на пк и на мобиле. Хотя так много наверно не потяну, но хотя бы начну, да и интересно это.
Надеюсь получится сменить род деятельности. Работу конечно пока не бросаю, но нагрузку пытаюсь снизить, что бы высвободить время.
Пожелайте удачи, ну и советов покидайте.
Показать полностью 1
1 месяц назад

Как нейронка за меня таблицы считала (живой пример)
Сегодня я расскажу как лично я в своей работе использую нейросеть для решения задач по обработке данных и экселевских таблиц.
Казалось бы обычный кликбейт в стиле «100 нейросетей для улучшения дикпиков» или «50 новых убийц чат-гпт”. Но нет.
Я работаю маркетологом, и помимо того что мне разрешают сидеть рядом с настоящими айтишниками и програмистами, мне иногда дают задачки по обработке данных. Но не тех данных, для которых нужно иметь 3 сертификата по ML и бигдате, а обычные задачки по экселю, которые встречаются у каждого из нас, практически вне зависимости от профессии. Если вы тот самый “опытный пользователь ПК”, скорее всего вы копаетесь в экселе по рабочим нуждам, и обычная задачка со сводной табличкой из-за отсутствия опыта может растянуться на 6 рабочих часов с перекурами. Большинство таких задач довольно однотипные, и более опытный коллега сделает их в 10 раз быстрее, просто потому что он уже на них собаку съел. Но задачка упала вам. Что бы не проваливаться в кроличью нору запросов в гугле про работу экселевских формул, откроем классический chatGPT 3.5.
Нейросеть, вопреки популярному в одноклассниках мнению, довольно глупая сама по себе, и ей необходимо ставить очень четкие, подробные до духоты задачки. В таком случае она выдает грамотный и рабочий (ну почти всегда) результат. Важно говорить нейросети какие проблемы у тебя образовались в процессе, что бы она лучше понимала что происходит и как это исправить. Также, очень важно помнить что чат-гпт (да и другие нейронки) помнят только последние несколько сообщений, поэтому желательно что бы каждый запрос был максимально информативным и с контекстом. Через сообщений 5-7 он начинает отвечать полную чушь, поэтому полезно формулировать задачку заново с учетом всего пройденного пути.
Давайте более конкретно.
Представим что вы работаете с контекстом. У вас есть файл в котором содержится 20.000 поисковых фраз, визиты, посетители, отказы, глубина просмотров и время на сайте.

Файл может и реальный, а может и нет. Да какая разница, мы тут не за этим.
Ваша задача довольно простая —
- Прочекать все поисковые фразы с >20% отказностью;
- Вычленить из них все наиболее повторяющиеся фразы, посчитать их повторы
- Вычленить из них все наиболее повторяющиеся слова, посчитать их повторы
- Выстроить в порядке убывания слова и фразы от большей отказности к меньшей
Часть первая — простая (кто хочет сразу про питон — го во вторую часть)
Первый вариант работы довольно очевидный — мы просим нейросеть (в данном случае обыкновенный чат-гпт) решить нашу задачу через формулы экселя. Для этого просто пишем в чат нашу таску.
Привет! У меня есть задачка. Есть таблица из 20000 строк. Столбцы этой таблицы — «Поисковая фраза (Директ), Визиты, Посетители, Отказы, Глубина просмотра, Время на сайте». Вторая строчка «Итого и среднее» содержит суммы с средние значения моих данных. Потом идет 19.998 строк с данными. Визиты и посетители — целые числа, отказы — в процентах, глубина просмотрах в десятичных числах с тремя знаками после запятой, время формата ЧЧ:ММ:СС.
Зачем я пишу так подробно? Потому что она буквально ничего не знает про мой файл. Может у меня визиты прописаны текстом, глубина просмотров в сантиметрах, а отказы написаны на хинди?
Далее когда нейросеть понимает что у нас за файл, можно ее просить помочь с формулами.
Напиши мне формулу, которая найдет все фразы с отказностью более 20% и добавит их на новый лист в отдельную колонку. Эксель у меня воспринимает англоязычные формулы. (про язык стоит добавлять, а лучше сразу версию указывать, что бы не было ошибок из-за разницы версий)
Нейросеть выдает нужную формулу, с описанием ее работы —
=IF(«Отчет’!D2 > 0.2, ‘Отчет’!A2 & » (» & TEXT(‘Отчет’!D2*100, «0.00%») & «)», »»)
«Эта формула проверяет, если значение отказов в ячейке D2 (на листе «Отчет»)
больше 20% (0.2 в десятичной форме), и если это условие выполняется,
она объединяет значение в столбце »Поисковая фраза (Директ)» с
отображением отказов в скобках с процентами.
В противном случае, она возвращает пустую строку.”
К сожалению в формуле есть косяк, который мы видим после пробного запуска — она не содержит разделителя для формулы (;). Спросим об этом нейросеть.

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

Видим что он зачем то умножает наши проценты на 100. Исправляем формулу руками до вида (убираем «*100» из формулы) —
и получаем приемлемый результат.

Мне не нравится что у меня проценты и фраза в одной ячейке, спрошу нейросеть как это исправить, и убрать пустые строки.
Он предлагает сначала скопировать все фразы на новый лист, потом выполнить следующие действия.

Подробное описание всех необходимых действий
По итогу мы получим новый лист с фразами где отказы более 20%.
Далее мы можем просить нейросеть написать более сложные формулы для подсчета оставшихся задачек.
Этот метод подходит тем кто не знает как подступиться к задаче, не очень хорошо разбирается в возможностях экселя (или вообще его первый раз видите), но можете примерно понять где именно ошибка. Очень полезно если вы в душе не чаете какую формулу лучше использовать, и как сделать то что вам нужно. И у вас нет желания использовать что то еще кроме браузера и экселя. И это все равно намного быстрее чем гуглить формулу.
Но я собрал вас тут не для этого.
Вот бы был способ, что бы не надо было писать, протягивать формулы, самому фильтровать, вставлять, копировать данные и т. д.
Можно попросить написать макрос для экселя, который сделает за нас все самостоятельно, включая создание листов и т. д.

Пример ответа на нашу первоначальную задачку, но с просьбой использовать макросы экселя.
Но мне этот способ не очень нравится, как я ничего не понимаю в VBA, и как то у меня с макросами не срослось. Но если вы в них хоть немного шарите — это может сэкономить вам годы (ну ладно, может не годы, но дни точно) жизни.
Я же предлагаю еще более сложный способ, но который позволяет делать с данными из экселя практически что угодно, имеет очень понятный способ поиска ошибки, и может быть реализован практически кем угодно. Я говорю про работу с Python
Я категорически рекомендую всем кто хоть иногда работает с данными освоить самые азы питона (не читая толстенные книжки типа о-райли и прочих, а просто пройдя какой нибудь скидочный курс в любой онлайн-школе) . Но это не обязательно для решения наших задач.
Что нам позволяет делать нейросеть? Писать любой простой код на любом языке программирования, даже если мы в нем ничего не понимаем.
Начнем по порядку, что нам нужно сделать что бы затея сработала?
Для работы с питоном, его (а точнее его интерпретатор) необходимо поставить на свой пк (без этого к сожалению никак). Я использую PyCharm от компании Jetbrains (хотя пофигу что использовать, главное что бы он работал). Инструкция по установке находится в первой ссылке поискового ответа — https://pythonru.com/baza-znanij/poshagovaja-ustanovka-pycha. . Если хочется не отходить от нейросетей — можно спросить у нее, как пошагово установить PyCharm, он подробно расскажет.
Перенесемся сразу в момент когда у нас установлен PyCharm, и мы начали новый проект.
Преимущество работы через Python заключается в том, что нейросеть не ограничивает наши возможности одной строкой с формулами экселя, а может делать с данными из экселя любые вычисления, любые трансформации, а потом паковать обратно в эксель.
Как это выглядит.
Практически идентично тем запросам, которые мы отправляли в нейросеть ранее, но просто добавляем в конец просьбу “напиши решение на питоне”. Ну и говорим ему как называется наш файл, и где он лежит (что бы питон смог с ним работать напрямую) .
Вот пример ответа на мой прошлый запрос для экселя, но я попросил его написать код на питоне:

Чуть редактируем код, меняя 20 на 0.20, потому что данные о процентах у нас меньше единицы всегда.
Вставляем код в PyCharm, и получаем сразу новый готовый файл в папке с нашим проектом.

Да, задача решалась просто и через эксель. Но так тоже работает.
На решение этой задачки ушло минуты 3. Из которых две — на открытие программы и написание запроса. Результат ок, идем дальше.
Далее просим нейросеть перейти ко второй задачке —
- Вычленить из полученных запросов все наиболее повторяющиеся фразы, посчитать их повторы”. (более полный запрос будет чуть ниже)
Далее нам нейросеть пишет код посложнее, со всякими сторонними библиотеками и т. д. Я не стал постить сюда этот код, думаю он мало что скажет. (Можно попросить писать объяснение всех действий, она очень подробно пишет комментарии для каждой строчки.) Нам совершенно не нужно вникать какую именно библиотеку она использует, или какой метод. Следуем указаниям умной машины.
Если (точнее «когда») получаем ошибку — не стесняемся копировать ее всю в ответ в чат, она находит причину и говорит решение — вот пример (я обрезал часть ошибки, она была длинная)

Я ему абракадабру, а он мне — четкий план действий.
Любую полученную ошибку закидываем в нейросеть и получаем решение. Далее запускаем код. Если есть снова ошибка — кидаем снова в нейросеть. Если нет — смотрим на данные и радуемся результату, или просим переделать в другом виде. Если видите что нейросеть пишет вам ахинею (будто совсем забыла в чем изначально задача) — формулируйте изначальную задачу заново. И так повторяйте до тех пор пока не получите удобоваримый результат.
Вот как выглядел мой итоговый запрос:
Давай создадим новый файл, основываясь на этой задаче — “Есть таблица из 20000 строк. Столбцы этой таблицы — «Поисковая фраза (Директ), Визиты, Посетители, Отказы, Глубина просмотра, Время на сайте». Вторая строчка «Итого и среднее» содержит суммы с средние значения моих данных. Потом идет 19.998 строк с данными. Визиты и посетители — целые числа, отказы — в процентах, глубина просмотрах в десятичных числах с тремя знаками после запятой, время формата ЧЧ:ММ:СС.” (тут я скопировал изначальные условия) Напиши мне формулу, которая найдет все фразы с отказностью более 0.2 (эту часть добавил что бы он не написал 20, как в первый раз) и добавит их на новый лист в две отдельные колонки (фраза и отказность). Мой файл называется context_data.xlsx (что бы он понимал как называется файл) Теперь у меня в полученном мне нужно вычленить из полученных данных все наиболее повторяющиеся фразы или словосочетания и посчитать их повторы (без учета союзов и местоимений) (эти уточнения сильно фильтруют итоговый результат. Потмоу что очевидно что самые частые слова будут союзами). Сделай отдельно лист с результатами повтора словосочетаний (где больше 1 слова), и отдельно лист с самыми часто повторяющимися словами. Важно что каждая строка в целом уникальна, но в ней могут содержаться одинаковые словосочетания или фразы (если это не описать, он просто будет искать одинаковые строки, а их у меня нет). Результаты добавь на новый файл. Код напиши на питоне.
В итоге я получил длинную портянку кода и инструкцию:


После запуска у меня была всего одна ошибка, которая была вылечена одной доп. строчкой. После чего я получил вот такой итоговый файл


Алгоритм всегда один и тот же — описали задание, если выполнилось с ошибкой — кидаем ошибку, он ее исправляет. Если без ошибок — усложняем задачку, и заново формируем ее в запросе.
Далее можно попросить в начальные условия добавить подсчет % отказа, что бы он выписал те слова, которые чаще всего встречаются в отказных запросах, или найти слова которые приводят самые глубокие сессии. Или любые другие хотелки которые вы придумаете.
По итогу получаем готовую таблицу с нужными нам данными, попутно осваивая питон.
Зачем я все это пишу и показываю?
Данный метод работы сократил мое время на обработку данных, позволяет мне кинуть в разговоре “да я тут на питоне прикинул”, что резко повышает ценность в глазах других маркетологов и начальства, и вполне обоснованно позволяет писать новый навык на линкедине.
А если более серьезно — нейросеть может сильно ускорить выполнение рутинных и нудных задач. Она как гугл — главное правильно составить запрос. Не “посчитай мне итог по Сыктывкару для прошлого квартала” а “У меня есть таблица А, в ней колонки АБС, содержат данные таких то форматов. В колонке Б у меня города рф, в колонце С у меня оборот, в колонке Е вид материала. Создай новую таблицу где будет сумма всех поставок пургена для областей которые содержат букву Ы в названии и состоят из 9 букв”. Такой запрос очень понятен, его можно разбить на подзадачи и написать алгоритм. А какой в итоге для этого будет использоваться язык программирования — не имеет значения (ну вообще имеет, если язык появился после 21 года, то есть шанс что чат-гпт 3.5 не знает об этом). Нейросеть можно попросить что то объяснить в коде, рассказать о методе или причинах выбора такого способа решения, и писать запросы человеческим языком.
Использование нейросети для работы не напрямую с формулами, а через сторонний язык программирования позволяет работать сразу с нужными нам файлами. Скоро, когда майкрософт внедрит окончательно нейросеть в стандартный пакет офиса — такие задачи можно будет попросить решать нейронку сразу напрямую в экселе. Но пока что это недоступно простым менеджерам.
Поставить IDE питона — элементарно. Запустить скопированный код из чата с нейронкой — дело 2 секунд. Если у вас есть ежедневные (еженедельные, повторяющиеся) задачки с какими то однотипными выгрузками — вы один вечер потратите на написание кода через нейросеть, потом сможете использовать его постоянно. Сэкономленное время можно потратить на срач в комментариях на DTF или пикабу, или поиск новой работы аналитиком.
Если хоть одному человеку это сэкономит больше времени чем я потратил на эту простыню — это будет означать что я писал все не зря.
Телеграм канала нет, паблика нет, контактов нет, никуда не подписывайтесь, я пишу очень редко.
Русская рулетка
Рулетка
Игровое поле рулетки поделено на номера от 0 до 36, которые имеют черный, красный. или зеленый.

Рулетка из казино
Добрый вечер друзья, я полный новичок в пайтоне и я решил на основе моих текущих знаний написать.
Зациклить программу и ещё пару нюансов (рулетка из казино)
Предыстория: я продолжаю писать свою рулетку из казино, делаю её не ради чтобы просто сделать, а.
Русская классика
Устный экзамен – это всегда сложно. Когда тебе задают "в лоб" неожиданный вопрос, нет времени.
(Gnome 3 | Unity) + PyQT5. Не работает русская раскладка в полях ввода
Столкнулся с проблемой! Написал небольшое приложение на PyQt, типо мессенджера для вк. Но вот.
634 / 474 / 179
Регистрация: 28.05.2012
Сообщений: 1,411
1 2 3 4 5 6 7 8 9 10 11 12 13
import random s = True revolver_drum = [0, 0, 0, 0, 0, 1] while s: shot = random.choice(revolver_drum) if k == 1: s = False print('Убит!') else: print('Живой!')