|
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 в файле показан расчет только общего рейтинга Эло, для покрытий методология расчета такая же
0
|
|
| 10.08.2022, 17:31 | |
|
Ответы с готовыми решениями:
10
Оптимизация расчета децилей Формула расчета рейтинга Алгоритм расчета рейтинга |
|
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
|
|||||||
| 10.08.2022, 23:53 | |||||||
|
1.
2. Оптимизировать надо только этот кусок:
Сколько времени занимает каждый блок?
0
|
|||||||
|
0 / 0 / 0
Регистрация: 30.07.2022
Сообщений: 18
|
|
| 11.08.2022, 08:53 [ТС] | |
|
Расчет каждого блока идёт мин по 7. Таких блока 4. А это вы мне ещё с играми помогли, до этого я их тоже через справочник считал. Про пересчет в этом и вопрос. Новые матчи появляются каждый день. Я представляю себе это так: 1). Сделать расчет по моему коду для 2010 года. Потом сгруппировать данные так,чтобы были только колонки Player, общий рейтинг+рейтинги на покрытиях+результирующий рейтинг и количество игр, сохранить это в отдельную таблицу. А на новый сезон в условие где идёт проверка нахождения имени в словаре добавить как-то чтобы брало те конечные рейтинги из сохранённой таблицы для нужного игрока. Но возможно и как-то по-другому все это можно сделать
0
|
|
|
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
|
|
|
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
|
|
|
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
|
|
| 12.08.2022, 08:40 | |
|
Gdez, dummy, как правило, нам нужны для регрессии. А здесь get_dummies приведет к появлению тысячи переменных и непонятно, что потом с этим богатством делать.
0
|
|
|
8849 / 4500 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
|
|
| 12.08.2022, 09:05 | |
|
Red white socks, обработка логического массива существенно быстрее строкового.
Но как вариант можно и pd.factorize - количество уникальных игроков существенно меньше строк фрейма. Экономия памяти и опять же обработка типа int быстрее str (для pandas и numpy)
0
|
|
|
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
|
|
| 12.08.2022, 09:33 | |
|
Gdez, просто мне казалось что в данном случае с дамми неудобно работать будут. Я упоминал, что работать нужно с числовыми значениям, но на такой таблице оценивал прирост всего процентов на 20-30. Сам факт работы в numpy (пусть даже с словарем со строковыми ключами ) увеличит скорость на порядок.
0
|
|
|
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 [ТС] | |
|
Разделитель ;
0
|
|
| 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 была полностью переписана на Си, в. . .
|