База данных линии Париматч

База данных линии Париматч

Georgi Morozenko


Сразу публикую список открытых багов (я о них знаю, работаю):

  • Кривое определение названия стран и лиг. Париматч, гори в аду! Не можете сделать какой-то общий формат?
  • Знак "-" в ставках типа Ф1.. и Ф2.. не является обычным "коротким дефисом". Это "среднее тире" и может быть поставлено на клавиатуре путем набора цифр 0150 на цифровой панели при зажатом левом Alt: Alt + 0150 = –, Alt + —
  • Ф2(–1.0) по нелепым причинам считает win для счетов типа 1:2 и 0:1 вместо refund. Гори в аду, длинный минус!!!


Всем привет!

Длительное время занимаясь разработкой и поддержкой ресурса с табличным вариантом представления статистики футбольных чемпионатов, постоянно сталкивался с тем, что без привязки к коэффициентам данная статистика не даёт полной картины происходящего. Тогда и возникла идея создания базы данных, хранящей все архивные котировки букмекеров на спортивные соревнования. Естественно, с подсчётом "проходимости" каждого коэффициента.

В качестве источника данных был выбрал раздел "Архив ставок" сайта Париматч. Почему именно так? Потому что другие букмекеры не предоставляют столь простой способ доступа к архиву своей линии. Конечно, интереснее было бы иметь базу ставок из Марафона, но простота доступа к линии Париматча сыграла свою роль.

Вот он где спрятался!

К слову, футбольную статистику я тоже беру с сайта этого букмекера. Мне не подходят всякие MyScore потому, что их внутренняя архитектура довольно сложна и сайт в целом хорошо защищен от подобного рода вытягивания информации. Париматч же прост как палка. Статические html странички, которые содержат красивые (снаружи, но, как оказалось, не внутри) таблички с слепком линии по конкретной дате. Можете посмотреть сами https://www.parimatch.by/bet.html?ha=20180302

Стандартная линия на футбол (обратите внимание, результат матча есть здесь же)

Несомненный плюс еще в том, что, скачав 1 страницу, можно получить архив на все виды спорта. Ну и, конечно же, как видно, на этой странице присутствует и финальный счёт с дополнительной информацией.

Но, есть и минусы: линия лишь основная, никаких докупок фор или дополнительных тоталов. Ну и еще скажу, что наблюдаются проблемы со скачиванием этих самых страничек: каждая страница весит от 3 до 5 мегабайт, что по современным меркам не так уж и много, но для веба - всё еще довольно проблематично. Подсчитал, что скачивание 1 дня занимает примерно 30 секунд. Возможно, это искусственное ограничение со стороны сервера.

Мною была написана программа, не только скачивающая все дни между заданным временным интервалом, но и, разумеется, обрабатывающая скачанные данные таким образом, чтоб каждый коэффициент (Ф1, П2, иТБ1 и так далее) стал строкой таблицы, содержащей в себе

  • дату проведения игры,
  • список участников (с указанием хозяев и гостей),
  • обшие сведения типа: вид спорта, страна, лига,
  • наименование коэффициента,
  • его численное значение
  • и результат для данного коэффициента.
Мой ночной кошмар

Затем список полей был немного расширен. Были добавлены поля:

  • детализированный счёт (по таймам для футбола, по периодам для хоккея, по четвертям для баскетбола и так далее)
  • поля "был ли хозяин фаворит?" и "был ли гость фаворит?"
  • отдельные колонки для голов хозяев и гостей
  • дата публикации ставки.

Касательно последнего момента: я решил добавлять в таблицу первое упоминание события в линии Париматча. Т.е. если я исследую линию на конкретный день и вижу там матч, который состоится через неделю, то всё равно забираю его в таблицу. Если в следующие дни я нахожу этот же матч, то игнорирую изменения коэффициента и не добавляю его.

Программа была написана на языке Java. База данных - SQLlite. Специально выбирал такую базу данных, чтоб для работы с ней пользователям не требовалось устанавливать никаких серверов баз данных. Только лишь приложение для просмотра.

Кстати, о приложении. С самого начала думал выкладывать это всё в интернет, но объемы получаются очень приличные - база на 1 год занимает порядка 400 мегабайт. Ну, еще бы, если на 1 футбольный матч приходится делать 14 записей. А матчей в линии букмекерской конторы вы представляете сколько. И это еще не Марафон даже. Да и время обработки/записи данных в базу довольно велико. 1 год идет почти что целый день (тут есть кое-какие проблемы с оптимизацией, которую я еще устраню).

Работа программы кипит, а программист может посмотреть пока футбол

Делиться исходным кодом своего приложения я, разумеется, не собираюсь. Всё, что я делаю, я делаю бесплатно. Потому что я этим увлекаюсь. А как мои программы будут использоваться кем-то другим? Возможно, с целью зарабатывания денег, так как вся эта тема с букмекерами пропитана целиком и полностью какими-то платными экспертами. А я не люблю, когда кто-то наживается моим интеллектуальным трудом. Не то чтобы там какие-то шедевры программирования, но сил потрачено было много.

Поделюсь только самой базой данных. Иначе зачем я ее вообще делал? Далее опишу процесс, как всё настроить.

Настройка описана для OS Windows, но SQLlite - кроссплатформенный формат. Так что для работе на Linux или MacOS вам всего лишь нужно подобрать другой клиент.
  1. База данных поставляется в виде файла в формате *.db. Ссылка на скачивание вот https://yadi.sk/d/AV-JBs-T3TWFtL. База включает в себя 2017 год полностью. Так сказать, для затравки. 1,7 млн матчей.
  2. Для открытия этого файла предлагаю вам воспользоваться следующим клиентом - DB Browser for SQLite. Почему он? Я попробовал несколько других, но поля фтльтрации нашел только в этом. Другие браузеры баз данных требуют как минимум знания языка SQL. Этот же умеет делать фильтрацию в колонках для простых смертных людей.
  3. Скачиваем отсюда exe для своей платформы https://github.com/sqlitebrowser/sqlitebrowser/releases
  4. Я, допустим, скачал файл DB.Browser.for.SQLite-3.10.1-win64.exe и установил его. Вроде бы на этапе установки никаких сложностей не было. Русский язык присутствует.
  5. Далее небольшое замечание на счёт производительности. Я работаю на достаточно мощном компьютере (Core i7, 32 Гб оперативки), хотя это всё условно. Сейчас и куда мощнее есть, конечно же. Но я испытываю проблемы с этим файлом в виду его громадного размера (более 1 млн записей). Я не знаю, как это будет работать на недостаточно производительных компьютерах. Но давайте проверим. Если совсем беда - будем что-то делать с этим.
  6. Итак, запускаем DB Browser. И выбираем "Открыть базу данных" или Ctrl + O. Указываем путь к скачанному заранее файлику.
  7. Откроется закладка "Структура БД"
Структура БД. Нам надо чуть правее)

8. Переключаемся на закладку "Данные". Это может занять много времени.

9. Затем вы должны увидеть что-то такое:

Поздравляю! Вы открыли табличку! Вот возможности программы:

Основные органы управления DB Browser

Сделал небольшую гифку с процессом фильтрации.

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

Как видно, тормозит немного. Будем работать над этим.

В заключении хотел бы добавить пару слов о том, как эффективно пользоваться фильтрами (с примерами).

Полное и частичное совпадение

Ситуация:

Допустим, вы хотите отфильтровать все матчи английской Премьер-лиги. Пишете в поле "country": "Англия" и в поле "league" : "Премьер-лига". Но вам отображается что-то типа такого:

Я понимаю, что вы все любите Южную премьерку, но вдруг сейчас не до нее?

Решение:

Использовать символ "=" в запросе. Т.е. вместо "Премьер-лига" ввести в поле для фильтрации "=Премьер-лига". Такой запрос вернет только те строки, где в этом поле написано именно так.

Ситуация:

Допустим, вам нужно выбрать все матчи "Милана", но в выборку влезает их Примавера:

Чувствует программа, что Гаттузо тренером и там и там был!

Решение:

Можно сделать как в примере выше, а можно использовать вариант со знаком %. Вместо "Милан" набрать "%Милан". Это означает, что вы допускаете наличие каких-то символов до слова "Милан" спереди, но после него никаких символов быть не должно.

Внимательный читатель догадался, что обычный вариант поиска по слову, допустим, "Милан" эквивалентен поиску по "%Милан%". Т.е. мы допускаем символы и до, и после слова.

Поиск сыгравших ставок, диапазоны и другое

Далее буду чуть более кратко.

Поиск домашних матчей Милана, в которых они победили и забили 2-5 мячей.

Пояснение:

  • графа bet_result может быть трех значений: win, loss, refund. Написав "w", этого будет достаточно, чтоб отфильтровать то, что зашло.
  • 2~5 - означает диапазон от 2 до 5 включая границы.
Поиск игр, в которых гости Милана забивали 1 и более голов с отображением коэффициентов на ИТБ2 по мнению букмекеров.

Пояснение:

  • в колонках с цифрами можно использовать символы "<", ">", "<=", ">=", "=". Вот цитата с сайта разработчика

В целом, у них есть мануал на английском https://github.com/sqlitebrowser/sqlitebrowser/wiki/Using-the-Filters


Поиск матчей, где Милан играл в гостях и был фаворитом, но ИТБ хозяев зашло.

Пояснение:

Колонки is_home_fav и is_guest_fav могут иметь значения 1, 2 и 3:

  • 1 - да, команда фаворит
  • 2 - команда андердог
  • 3 - чудо, коэффициенты на П1 и П2 равны

Рубрика "Посмеемся над убогими"

Выборка матчей КХЛ, в которых не зашли коэффициенты меньше 1.8 с сортировкой по возрастающей. Это больно...


Даже не знаю, какие еще варианты предложить. Вроде всё ясно. Добавлю, что в базе нашлась 371 гандбольная ничья с минимальным коэффициентом 7, а максимальным - 29.

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

Справа от закладки "Данные" в самом конце строки есть закладка "SQL". Переходим туда. Собственно, здесь будем писать на SQL'е.

Пример 1. Выбрать все матчи "Милана" и показать в отсортированном по убыванию порядке выигрышные коэффициенты:

SELECT * FROM bets WHERE (home = 'Милан' OR guest = 'Милан') AND sport = 'Футбол' AND bet_result = 'win' ORDER BY bet_coeff DESC

Это можно было бы сделать и через визуальные фильтры, но я пока не понял, как там можно одновременно искать в одной из двух колонок: хозяева и гости. А на SQL можно. Лишь надо добавить условие (home = 'Милан' OR guest = 'Милан').

Пример 2. Выбрать все проигранные ставки на Баскетболе, где букмекер предлагал вычетать из гостей. При этом показать не все колонки, а только некоторые.

SELECT country, league, home, guest, score, bet_name, bet_coeff, bet_result FROM bets WHERE sport = 'Баскетбол' AND bet_result = 'loss' AND bet_name LIKE 'Ф2(–%'

База отвечает, что "1247 строки возвращены за 820мс". Хм. А если победы? Заменяем на

SELECT country, league, home, guest, score, bet_name, bet_coeff, bet_result FROM bets WHERE sport = 'Баскетбол' AND bet_result = 'win' AND bet_name LIKE 'Ф2(–%'

"4586 строки возвращены за 809мс" - значит всё-таки можно вычетать из гостей в баскетболе?

Здесь "bet_name LIKE 'Ф2(–%'" означает, что в колонке должно найтись значение, которое начинается с "Ф2(–", то есть фора минусовая.

Естественно, я вас не могу научить всем примудростям работы с базами данных. Но об этом много мануалов в инете. Вы можете удалять ненужные данные из таблицы, если хотите оставить там, к примеру, только ФНЛ, а больше ничего вам и не надо.

Пример 3. Удалить все записи из таблицы, которые не относятся к MLB.

DELETE FROM bets WHERE league != 'MLB'

После этого нужно применить изменения кнопкой

Сперва выполнить, затем записать изменения


Итак, надеюсь, что я что-то вам объяснил и это вам как-то поможет. Как? Этого я не знаю. По всем вопросам обращайтесь на спортс.ру пользователю xheo. И в телеграм пользователю @Heorhi.






Report Page