Форум программистов, компьютерный форум, киберфорум
Python: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 30.07.2022
Сообщений: 18

Оптимизация расчета рейтинга ЭЛО

10.08.2022, 17:31. Показов 1477. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Пытаюсь посчитать рейтинги ЭЛО для теннисистов. Есть такая исходная таблица (Пример ~27к строк). Я попытался реализовать это с помощью функций, цикла и справочника. Мне необходимо делать ежедневный расчет на базе с 500к+ строк, и я столкнулся с проблемой скорости выполнения. Файл ELO_test, который прикрепил ниже, считает число игр (они используются в дальнейшем расчете), общий рейтинг + рейтинг на каждом покрытии и результирующий рейтинг. Можно ли решить эту задачу без циклов и справочника, если да, то как? Еще была идея сделать это через две таблицы: просчитать все один раз, сохранить в отдельной таблице, а для будущих матчей извлекать необходимые данные из сохраненной таблицы и после расчета также сохранять их в эту главную таблицу. Но тоже не знаю как это сделать... Хочу добиться результата при котором все будет считаться за 3-5 мин, ну или быстрее( если это возможно). Сейчас это мин под 30 (с учетом расчета всех перечисленных выше рейтингов на базе данных 500к+ строк)

Немного про рейтинг: Изначально у каждого игрока рейтинг 1500 пунктов, после игры он изменяется, в худшую либо в лучшую сторону в зависимости от результатов игры.Скажем у победителя рейтинг стал 1510, у проигравшего 1490 . И на следующий матч нужно уже брать этот обновленный рейтинг

P.S в файле показан расчет только общего рейтинга Эло, для покрытий методология расчета такая же
Вложения
Тип файла: rar Documents.rar (353.3 Кб, 12 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.08.2022, 17:31
Ответы с готовыми решениями:

Оптимизация расчета децилей
Добрый день! Написал небольшой скрипт по расчету децилей по определенному массиву с определенным периодом. Понимаю, что код далеко не...

Формула расчета рейтинга
Здравствуйте. Кто знает, есть ли какая-нибудь формула для расчета рейтинга студента по оценкам и посещаемости? Есть у кого-нибудь идеи...

Алгоритм расчета рейтинга
Здрасьте всем! Есть тренажер с вопросами - пользователю показывается вопрос, а он выбирает ответ. Нужно расчитать вес вопроса в...

10
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
10.08.2022, 23:53
1.
Цитата Сообщение от Xelar93 Посмотреть сообщение
Мне необходимо делать ежедневный расчет на базе с 500к+ строк
Зачем ежедневно пересчитывать всю таблицу?
2. Оптимизировать надо только этот кусок:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
current_ELO={}
for idx,row in df.iterrows():
    
    Player_1ELO=row['Player1']
    Player_2ELO=row['Player2']
    g1=row['GP1']
    g2=row['GP2']
    f=row['Fora']
    t=row['RANK_T']
    
    if Player_1ELO not in current_ELO.keys():
        current_ELO[Player_1ELO]=1500
    
    if Player_2ELO not in current_ELO.keys():
        current_ELO[Player_2ELO]=1500
        
    elo_1=current_ELO[Player_1ELO]
    elo_2=current_ELO[Player_2ELO]
    
    PTS1,PTS2=calculate_elo(elo_1,elo_2,g1,g2,f,t)
    
    current_ELO[Player_1ELO]=elo_1+PTS1
    current_ELO[Player_2ELO]=elo_2+PTS2
    
    df.loc[idx,'PTS1']=PTS1
    df.loc[idx,'PTS2']=PTS2
или расчет параметров тоже?
Сколько времени занимает каждый блок?
0
0 / 0 / 0
Регистрация: 30.07.2022
Сообщений: 18
11.08.2022, 08:53  [ТС]
Расчет каждого блока идёт мин по 7. Таких блока 4. А это вы мне ещё с играми помогли, до этого я их тоже через справочник считал. Про пересчет в этом и вопрос. Новые матчи появляются каждый день. Я представляю себе это так: 1). Сделать расчет по моему коду для 2010 года. Потом сгруппировать данные так,чтобы были только колонки Player, общий рейтинг+рейтинги на покрытиях+результирующий рейтинг и количество игр, сохранить это в отдельную таблицу. А на новый сезон в условие где идёт проверка нахождения имени в словаре добавить как-то чтобы брало те конечные рейтинги из сохранённой таблицы для нужного игрока. Но возможно и как-то по-другому все это можно сделать
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
11.08.2022, 11:27
Тут очень много моментов. Пересчет рейтинга надо делать построчно, это не sql-ная операция и если делать это в массиве numpy на данной выборке это займет около секунды, вместо 13 как сейчас.
Но дело даже не в этом. 500К - это очень маленькая таблица и расчеты должны вестись максимум порядка нескольких секунд. При правильном подходе, конечно.
Во-первых, нет смысла делать пересчет всей таблицы. Можно сделать срезы рейтингов по годам (или даже полугодам или месяцам) и делать пересчет только по тем игрокам и с той даты, по которым прошли изменения.
Во-вторых, вы очень нерационально подходите к пересчету, начиная со сбора параметров (самый затратный join у вас выполняется на каждый параметр, хотя его достаточно было сделать один раз) и заканчивая самими функциями расчета рейтинга, которых должно быть ровно 1, а не сколько вы наплодили. И пересчет всех рейтингов можно провести за один проход. Если все это сделать, то пересчет будет мгновенный. Даже без срезов рейтингов, полный пересчет будет измеряться секундами, а не минутами.
Есть много других нюансов, эффект от которых на такой маленькой таблице не скажется (или скажется незначительно), но считаются просто правилами хорошего тона для sql-щика. Например, работать не со строковыми значениями (player), а только с числовыми (player_id). Или выделять под поля в таблицах ровно столько места сколько необходимо, а не 64 бита как это делает панда по умолчанию.
Мог бы привести ваш код в божеский вид, но сделать это смогу не ранее следующей недели.

Добавлено через 16 минут
И да, уделяйте внимание науке именования. Эти GP1, df_mGPd2 и т.п. ведут к бардаку не только внутри кода, но и в вашей голове. Удивитесь, насколько станет яснее и проще мыслить, когда сделаете практикой системное и грамотное именование столбцов, таблиц, переменных и пр. Не говоря уже о читаемости кода.

Добавлено через 7 минут
Это дело не быстрое. Просто смотрите на примеры кода и в голове прокручивайте, насколько вам ясно, что в нем написано. И откладывайте себе где-нибудь на подкорке, каким образом достигается читабельность. Код - это как книга и стиль имеет такое же важное значение, как сюжет и прорисовка деталей.
3
0 / 0 / 0
Регистрация: 30.07.2022
Сообщений: 18
11.08.2022, 11:54  [ТС]
Спасибо Вам за такой развернутый ответ. Попробуй что-то изменить следуя тому что Вы расписали, ну и буду ждать тогда следующей недели.
0
Эксперт Python
8849 / 4500 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
12.08.2022, 05:11
Одним из вариантов оптимизации и ускорения вычислений -> преобразование колонок Player1 и Player2 с помощью pd.get_dummies : https://pandas.pydata.org/pand... mmies.html
В дальнейшем с помощью numpy вычисления существенно ускорятся...
1
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
12.08.2022, 08:40
Gdez, dummy, как правило, нам нужны для регрессии. А здесь get_dummies приведет к появлению тысячи переменных и непонятно, что потом с этим богатством делать.
0
Эксперт Python
8849 / 4500 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
12.08.2022, 09:05
Red white socks, обработка логического массива существенно быстрее строкового.
Но как вариант можно и pd.factorize - количество уникальных игроков существенно меньше строк фрейма. Экономия памяти и опять же обработка типа int быстрее str (для pandas и numpy)
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
12.08.2022, 09:33
Gdez, просто мне казалось что в данном случае с дамми неудобно работать будут. Я упоминал, что работать нужно с числовыми значениям, но на такой таблице оценивал прирост всего процентов на 20-30. Сам факт работы в numpy (пусть даже с словарем со строковыми ключами ) увеличит скорость на порядок.
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
14.08.2022, 20:15
Xelar93, скинь полную входную таблицу
0
0 / 0 / 0
Регистрация: 30.07.2022
Сообщений: 18
15.08.2022, 10:56  [ТС]
Разделитель ;
Вложения
Тип файла: rar SQL.rar (6.68 Мб, 7 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.08.2022, 10:56
Помогаю со студенческими работами здесь

Составить программу расчёта рейтинга
Рейтинг бакалавра заочного отделения при поступлении в магистратуру определяется средним баллу по диплому, умноженным на коэффициент стажа...

Формула расчёта рейтинга объекта
Приветствую всех зашедших. Обращаюсь к вам в связи с тем, что совершенно не разбираюсь в математике :) Проблема состоит в том, что...

Составить программу расчета рейтинга
Рейтинг бакалавра заочного отделения при поступлении в магистратуру опре-деляется средним баллом по диплому, умноженным на коэффициент...

Какой же все-таки должна быть формула расчёта рейтинга?
Привет! Приступив к задаче разработки алгоритма/формулы расчета рейтинга объектов на сайте, пришел к тому, что задача порядком сложнее,...

Составить программу расчета рейтинга при заданном среднем балле диплома
Рейтинг бакалавра заочного отделения при поступлении в магистратуру определяется средним баллом по диплому, умноженным на коэффициент стажа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru