From 588ba077030bff7beb64c9848266120e0d2248e0 Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Mon, 12 Jul 2021 13:59:52 +0200 Subject: [PATCH 01/26] initial commit --- .gitignore | 3 + app/.gitattributes | 8 + app/external/csvs/8475167.csv | 3 + app/external/databases/bets.db | 3 + app/external/databases/testing.db | 3 + app/external/nicknames/player_nicknames.csv | 3 + app/external/nicknames/team_nicknames.csv | 3 + app/external/saved_bets/2021-03-16.bet365 | 3 + app/external/saved_bets/2021-03-17.bet365 | 3 + app/external/saved_bets/2021-03-18.bet365 | 3 + app/external/saved_bets/2021-03-19.bet365 | 3 + app/external/saved_bets/2021-03-20.bet365 | 3 + app/external/saved_bets/2021-03-20.betsson | 3 + app/external/saved_bets/2021-03-20.betway | 3 + app/external/saved_bets/2021-03-20.unibet | 3 + app/external/saved_bets/2021-03-20.wh | 428 ++++++++++++++++++ app/external/saved_bets/2021-03-21.bet365 | 3 + app/external/saved_bets/2021-03-21.betsson | 3 + app/external/saved_bets/2021-03-21.betway | 3 + app/external/saved_bets/2021-03-21.unibet | 3 + app/external/saved_bets/2021-03-21.wh | 129 ++++++ app/external/saved_bets/2021-03-22.bet365 | 3 + app/external/saved_bets/2021-03-22.betsson | 3 + app/external/saved_bets/2021-03-22.betway | 3 + app/external/saved_bets/2021-03-22.ss | 3 + app/external/saved_bets/2021-03-22.unibet | 3 + app/external/saved_bets/2021-03-22.wh | 283 ++++++++++++ app/external/saved_bets/2021-03-23.bet365 | 3 + app/external/saved_bets/2021-03-23.betsson | 3 + app/external/saved_bets/2021-03-23.betway | 3 + app/external/saved_bets/2021-03-23.ss | 3 + app/external/saved_bets/2021-03-23.unibet | 3 + app/external/saved_bets/2021-03-23.wh | 129 ++++++ app/external/saved_bets/2021-03-24.bet365 | 3 + app/external/saved_bets/2021-03-24.betsson | 3 + app/external/saved_bets/2021-03-24.betway | 3 + app/external/saved_bets/2021-03-24.ss | 3 + app/external/saved_bets/2021-03-24.unibet | 3 + app/external/saved_bets/2021-03-24.wh | 159 +++++++ app/external/saved_bets/2021-03-25.bet365 | 3 + app/external/saved_bets/2021-03-25.betsson | 3 + app/external/saved_bets/2021-03-25.betway | 3 + app/external/saved_bets/2021-03-25.unibet | 3 + app/external/saved_bets/2021-03-25.wh | 361 +++++++++++++++ app/external/saved_bets/2021-03-26.bet365 | 3 + app/external/saved_bets/2021-03-26.betsson | 3 + app/external/saved_bets/2021-03-26.betway | 3 + app/external/saved_bets/2021-03-26.unibet | 3 + app/external/saved_bets/2021-03-26.wh | 126 ++++++ app/external/saved_bets/2021-03-27.bet365 | 3 + app/external/saved_bets/2021-03-27.betsson | 3 + app/external/saved_bets/2021-03-27.betway | 3 + app/external/saved_bets/2021-03-27.unibet | 3 + app/external/saved_bets/2021-03-27.wh | 230 ++++++++++ app/external/saved_bets/2021-03-28.bet365 | 3 + app/external/saved_bets/2021-03-28.betsson | 3 + app/external/saved_bets/2021-03-28.betway | 3 + app/external/saved_bets/2021-03-28.ss | 3 + app/external/saved_bets/2021-03-28.unibet | 3 + app/external/saved_bets/2021-03-28.wh | 102 +++++ app/external/saved_bets/2021-03-29.bet365 | 3 + app/external/saved_bets/2021-03-29.betsson | 3 + app/external/saved_bets/2021-03-29.betway | 3 + app/external/saved_bets/2021-03-29.ss | 3 + app/external/saved_bets/2021-03-29.unibet | 3 + app/external/saved_bets/2021-03-29.wh | 230 ++++++++++ app/external/saved_bets/2021-03-30.bet365 | 3 + app/external/saved_bets/2021-03-30.betsson | 3 + app/external/saved_bets/2021-03-30.betway | 3 + app/external/saved_bets/2021-03-30.ss | 3 + app/external/saved_bets/2021-03-30.unibet | 3 + app/external/saved_bets/2021-03-30.wh | 231 ++++++++++ app/external/saved_bets/2021-03-31.bet365 | 3 + app/external/saved_bets/2021-03-31.betsson | 3 + app/external/saved_bets/2021-03-31.betway | 3 + app/external/saved_bets/2021-03-31.ss | 3 + app/external/saved_bets/2021-03-31.unibet | 3 + app/external/saved_bets/2021-03-31.wh | 159 +++++++ app/external/saved_bets/2021-04-01.bet365 | 3 + app/external/saved_bets/2021-04-01.betsson | 3 + app/external/saved_bets/2021-04-01.betway | 3 + app/external/saved_bets/2021-04-01.ss | 3 + app/external/saved_bets/2021-04-01.unibet | 3 + app/external/saved_bets/2021-04-01.wh | 287 ++++++++++++ app/external/saved_bets/2021-04-02.bet365 | 3 + app/external/saved_bets/2021-04-02.betsson | 3 + app/external/saved_bets/2021-04-02.betway | 3 + app/external/saved_bets/2021-04-02.unibet | 3 + app/external/saved_bets/2021-04-02.wh | 191 ++++++++ app/external/saved_bets/2021-04-04.bet365 | 3 + app/external/saved_bets/2021-04-04.betsson | 3 + app/external/saved_bets/2021-04-04.betway | 3 + app/external/saved_bets/2021-04-04.unibet | 3 + app/external/saved_bets/2021-04-04.wh | 127 ++++++ app/external/saved_bets/2021-04-05.bet365 | 3 + app/external/saved_bets/2021-04-05.betsson | 3 + app/external/saved_bets/2021-04-05.betway | 3 + app/external/saved_bets/2021-04-05.ss | 3 + app/external/saved_bets/2021-04-05.unibet | 3 + app/external/saved_bets/2021-04-05.wh | 217 +++++++++ app/external/saved_bets/2021-04-06.bet365 | 3 + app/external/saved_bets/2021-04-06.betsson | 3 + app/external/saved_bets/2021-04-06.betway | 3 + app/external/saved_bets/2021-04-06.ss | 3 + app/external/saved_bets/2021-04-06.unibet | 3 + app/external/saved_bets/2021-04-06.wh | 297 +++++++++++++ app/external/saved_bets/2021-04-07.bet365 | 3 + app/external/saved_bets/2021-04-07.betsson | 3 + app/external/saved_bets/2021-04-07.betway | 3 + app/external/saved_bets/2021-04-07.ss | 3 + app/external/saved_bets/2021-04-07.unibet | 3 + app/external/saved_bets/2021-04-07.wh | 131 ++++++ app/external/saved_bets/2021-04-08.bet365 | 3 + app/external/saved_bets/2021-04-08.betsson | 3 + app/external/saved_bets/2021-04-08.betway | 3 + app/external/saved_bets/2021-04-08.ss | 3 + app/external/saved_bets/2021-04-08.unibet | 3 + app/external/saved_bets/2021-04-08.wh | 324 ++++++++++++++ app/external/saved_bets/2021-04-09.bet365 | 3 + app/external/saved_bets/2021-04-09.betsson | 3 + app/external/saved_bets/2021-04-09.betway | 3 + app/external/saved_bets/2021-04-09.ss | 3 + app/external/saved_bets/2021-04-09.unibet | 3 + app/external/saved_bets/2021-04-09.wh | 231 ++++++++++ app/external/saved_bets/2021-04-10.bet365 | 3 + app/external/saved_bets/2021-04-10.betsson | 3 + app/external/saved_bets/2021-04-10.betway | 3 + app/external/saved_bets/2021-04-10.ss | 3 + app/external/saved_bets/2021-04-10.unibet | 3 + app/external/saved_bets/2021-04-10.wh | 253 +++++++++++ app/external/saved_bets/2021-04-11.bet365 | 3 + app/external/saved_bets/2021-04-11.betsson | 3 + app/external/saved_bets/2021-04-11.betway | 3 + app/external/saved_bets/2021-04-11.ss | 3 + app/external/saved_bets/2021-04-11.unibet | 3 + app/external/saved_bets/2021-04-11.wh | 197 +++++++++ app/external/saved_bets/2021-04-12.bet365 | 3 + app/external/saved_bets/2021-04-12.betsson | 3 + app/external/saved_bets/2021-04-12.betway | 3 + app/external/saved_bets/2021-04-12.ss | 3 + app/external/saved_bets/2021-04-12.unibet | 3 + app/external/saved_bets/2021-04-12.wh | 226 ++++++++++ app/external/saved_bets/2021-04-13.bet365 | 3 + app/external/saved_bets/2021-04-13.betsson | 3 + app/external/saved_bets/2021-04-13.betway | 3 + app/external/saved_bets/2021-04-13.ss | 3 + app/external/saved_bets/2021-04-13.unibet | 3 + app/external/saved_bets/2021-04-13.wh | 198 +++++++++ app/external/saved_bets/2021-04-14.bet365 | 3 + app/external/saved_bets/2021-04-14.betsson | 3 + app/external/saved_bets/2021-04-14.betway | 3 + app/external/saved_bets/2021-04-14.unibet | 3 + app/external/saved_bets/2021-04-14.wh | 165 +++++++ app/external/saved_bets/2021-04-15.bet365 | 3 + app/external/saved_bets/2021-04-15.betsson | 3 + app/external/saved_bets/2021-04-15.betway | 3 + app/external/saved_bets/2021-04-15.ss | 3 + app/external/saved_bets/2021-04-15.unibet | 3 + app/external/saved_bets/2021-04-15.wh | 291 +++++++++++++ app/external/saved_bets/2021-04-16.bet365 | 3 + app/external/saved_bets/2021-04-16.betsson | 3 + app/external/saved_bets/2021-04-16.betway | 3 + app/external/saved_bets/2021-04-16.ss | 3 + app/external/saved_bets/2021-04-16.unibet | 3 + app/external/saved_bets/2021-04-16.wh | 131 ++++++ app/external/saved_bets/2021-04-17.bet365 | 3 + app/external/saved_bets/2021-04-17.betsson | 3 + app/external/saved_bets/2021-04-17.betway | 3 + app/external/saved_bets/2021-04-17.ss | 3 + app/external/saved_bets/2021-04-17.unibet | 3 + app/external/saved_bets/2021-04-17.wh | 364 ++++++++++++++++ app/external/saved_bets/2021-04-18.bet365 | 3 + app/external/saved_bets/2021-04-18.betsson | 3 + app/external/saved_bets/2021-04-18.betway | 3 + app/external/saved_bets/2021-04-18.ss | 3 + app/external/saved_bets/2021-04-18.unibet | 3 + app/external/saved_bets/2021-04-18.wh | 197 +++++++++ app/external/saved_bets/2021-04-19.bet365 | 3 + app/external/saved_bets/2021-04-19.betsson | 3 + app/external/saved_bets/2021-04-19.betway | 3 + app/external/saved_bets/2021-04-19.ss | 3 + app/external/saved_bets/2021-04-19.unibet | 3 + app/external/saved_bets/2021-04-19.wh | 263 +++++++++++ app/external/saved_bets/2021-04-20.bet365 | 3 + app/external/saved_bets/2021-04-20.betsson | 3 + app/external/saved_bets/2021-04-20.betway | 3 + app/external/saved_bets/2021-04-20.ss | 3 + app/external/saved_bets/2021-04-20.unibet | 3 + app/external/saved_bets/2021-04-20.wh | 263 +++++++++++ app/external/saved_bets/2021-04-21.bet365 | 3 + app/external/saved_bets/2021-04-21.betsson | 3 + app/external/saved_bets/2021-04-21.betway | 3 + app/external/saved_bets/2021-04-21.ss | 3 + app/external/saved_bets/2021-04-21.unibet | 3 + app/external/saved_bets/2021-04-21.wh | 131 ++++++ app/external/saved_bets/2021-04-22.bet365 | 3 + app/external/saved_bets/2021-04-22.betsson | 3 + app/external/saved_bets/2021-04-22.betway | 3 + app/external/saved_bets/2021-04-22.ss | 3 + app/external/saved_bets/2021-04-22.unibet | 3 + app/external/saved_bets/2021-04-22.wh | 332 ++++++++++++++ app/external/saved_bets/2021-04-23.bet365 | 3 + app/external/saved_bets/2021-04-23.betsson | 3 + app/external/saved_bets/2021-04-23.betway | 3 + app/external/saved_bets/2021-04-23.ss | 3 + app/external/saved_bets/2021-04-23.unibet | 3 + app/external/saved_bets/2021-04-23.wh | 167 +++++++ app/external/saved_bets/2021-04-25.bet365 | 3 + app/external/saved_bets/2021-04-25.betsson | 3 + app/external/saved_bets/2021-04-25.betway | 3 + app/external/saved_bets/2021-04-25.ss | 3 + app/external/saved_bets/2021-04-25.unibet | 3 + app/external/saved_bets/2021-04-25.wh | 131 ++++++ app/external/saved_bets/2021-04-26.bet365 | 3 + app/external/saved_bets/2021-04-26.betsson | 3 + app/external/saved_bets/2021-04-26.betway | 3 + app/external/saved_bets/2021-04-26.ss | 3 + app/external/saved_bets/2021-04-26.unibet | 3 + app/external/saved_bets/2021-04-26.wh | 264 +++++++++++ app/external/saved_bets/2021-04-27.bet365 | 3 + app/external/saved_bets/2021-04-27.betsson | 3 + app/external/saved_bets/2021-04-27.betway | 3 + app/external/saved_bets/2021-04-27.ss | 3 + app/external/saved_bets/2021-04-27.unibet | 3 + app/external/saved_bets/2021-04-27.wh | 268 ++++++++++++ app/external/saved_bets/2021-04-28.bet365 | 3 + app/external/saved_bets/2021-04-28.betsson | 3 + app/external/saved_bets/2021-04-28.betway | 3 + app/external/saved_bets/2021-04-28.ss | 3 + app/external/saved_bets/2021-04-28.unibet | 3 + app/external/saved_bets/2021-04-28.wh | 232 ++++++++++ app/external/saved_bets/2021-04-29.bet365 | 3 + app/external/saved_bets/2021-04-29.betsson | 3 + app/external/saved_bets/2021-04-29.betway | 3 + app/external/saved_bets/2021-04-29.ss | 3 + app/external/saved_bets/2021-04-29.unibet | 3 + app/external/saved_bets/2021-04-29.wh | 329 ++++++++++++++ app/external/saved_bets/2021-05-02.bet365 | 3 + app/external/saved_bets/2021-05-02.betsson | 3 + app/external/saved_bets/2021-05-02.betway | 3 + app/external/saved_bets/2021-05-02.ss | 3 + app/external/saved_bets/2021-05-02.unibet | 3 + app/external/saved_bets/2021-05-02.wh | 52 +++ app/external/saved_bets/2021-05-03.bet365 | 3 + app/external/saved_bets/2021-05-03.betsson | 3 + app/external/saved_bets/2021-05-03.betway | 3 + app/external/saved_bets/2021-05-03.ss | 3 + app/external/saved_bets/2021-05-03.unibet | 3 + app/external/saved_bets/2021-05-03.wh | 459 ++++++++++++++++++++ app/external/saved_bets/2021-05-04.bet365 | 3 + app/external/saved_bets/2021-05-04.betsson | 3 + app/external/saved_bets/2021-05-04.betway | 3 + app/external/saved_bets/2021-05-04.ss | 3 + app/external/saved_bets/2021-05-04.unibet | 3 + app/external/saved_bets/2021-05-04.wh | 164 +++++++ app/external/saved_bets/2021-05-05.bet365 | 3 + app/external/saved_bets/2021-05-05.betsson | 3 + app/external/saved_bets/2021-05-05.betway | 3 + app/external/saved_bets/2021-05-05.ss | 3 + app/external/saved_bets/2021-05-05.unibet | 3 + app/external/saved_bets/2021-05-05.wh | 368 ++++++++++++++++ app/external/saved_bets/2021-05-06.bet365 | 3 + app/external/saved_bets/2021-05-06.betsson | 3 + app/external/saved_bets/2021-05-06.betway | 3 + app/external/saved_bets/2021-05-06.ss | 3 + app/external/saved_bets/2021-05-06.unibet | 3 + app/external/saved_bets/2021-05-06.wh | 187 ++++++++ app/external/saved_bets/2021-05-07.bet365 | 3 + app/external/saved_bets/2021-05-07.betsson | 3 + app/external/saved_bets/2021-05-07.betway | 3 + app/external/saved_bets/2021-05-07.ss | 3 + app/external/saved_bets/2021-05-07.unibet | 3 + app/external/saved_bets/2021-05-07.wh | 230 ++++++++++ app/external/saved_bets/2021-05-09.bet365 | 3 + app/external/saved_bets/2021-05-09.betsson | 3 + app/external/saved_bets/2021-05-09.betway | 3 + app/external/saved_bets/2021-05-09.ss | 3 + app/external/saved_bets/2021-05-09.unibet | 3 + app/external/saved_bets/2021-05-09.wh | 66 +++ app/external/saved_bets/2021-05-12.bet365 | 3 + app/external/saved_bets/2021-05-12.betsson | 3 + app/external/saved_bets/2021-05-12.betway | 3 + app/external/saved_bets/2021-05-12.unibet | 3 + app/external/saved_bets/2021-05-12.wh | 164 +++++++ app/external/saved_bets/2021-05-17.bet365 | 3 + app/external/saved_bets/2021-05-17.betsson | 3 + app/external/saved_bets/2021-05-17.betway | 3 + app/external/saved_bets/2021-05-17.unibet | 3 + app/external/saved_bets/2021-05-17.wh | 153 +++++++ app/external/saved_bets/2021-05-18.bet365 | 3 + app/external/saved_bets/2021-05-18.betsson | 3 + app/external/saved_bets/2021-05-18.betway | 3 + app/external/saved_bets/2021-05-18.unibet | 3 + app/external/saved_bets/2021-05-18.wh | 193 ++++++++ app/external/saved_bets/2021-05-19.bet365 | 3 + app/external/saved_bets/2021-05-19.betsson | 3 + app/external/saved_bets/2021-05-19.betway | 3 + app/external/saved_bets/2021-05-19.unibet | 3 + app/external/saved_bets/2021-05-20.bet365 | 3 + app/external/saved_bets/2021-05-20.bethard | 3 + app/external/saved_bets/2021-05-20.betsson | 3 + app/external/saved_bets/2021-05-20.betway | 3 + app/external/saved_bets/2021-05-20.unibet | 3 + app/external/saved_bets/2021-05-21.bet365 | 3 + app/external/saved_bets/2021-05-21.bethard | 3 + app/external/saved_bets/2021-05-21.betsson | 3 + app/external/saved_bets/2021-05-21.betway | 3 + app/external/saved_bets/2021-05-21.unibet | 3 + app/external/saved_bets/2021-05-22.bet365 | 3 + app/external/saved_bets/2021-05-22.bethard | 3 + app/external/saved_bets/2021-05-22.betsson | 3 + app/external/saved_bets/2021-05-22.betway | 3 + app/external/saved_bets/2021-05-22.unibet | 3 + app/external/saved_bets/2021-05-23.bet365 | 3 + app/external/saved_bets/2021-05-23.bethard | 3 + app/external/saved_bets/2021-05-23.betsson | 3 + app/external/saved_bets/2021-05-23.betway | 3 + app/external/saved_bets/2021-05-23.unibet | 3 + app/external/saved_bets/2021-05-24.bet365 | 3 + app/external/saved_bets/2021-05-24.bethard | 3 + app/external/saved_bets/2021-05-24.betsson | 3 + app/external/saved_bets/2021-05-24.betway | 3 + app/external/saved_bets/2021-05-24.unibet | 3 + app/handler.py | 95 ++++ app/main.py | 58 +++ app/source/bet_parsers/parse_bet365.py | 73 ++++ app/source/bet_parsers/parse_betsson.py | 60 +++ app/source/bet_parsers/parse_betway.py | 42 ++ app/source/bet_parsers/parse_ss.py | 46 ++ app/source/bet_parsers/parse_unibet.py | 43 ++ app/source/bet_parsers/parse_wh.py | 42 ++ app/source/bets_handler.py | 127 ++++++ app/source/db_models/bets_models.py | 25 ++ app/source/db_models/nhl_models.py | 170 ++++++++ app/source/nhl_gen.py | 57 +++ app/source/nhl_handler.py | 328 ++++++++++++++ 336 files changed, 12803 insertions(+) create mode 100644 app/.gitattributes create mode 100644 app/external/csvs/8475167.csv create mode 100644 app/external/databases/bets.db create mode 100644 app/external/databases/testing.db create mode 100644 app/external/nicknames/player_nicknames.csv create mode 100644 app/external/nicknames/team_nicknames.csv create mode 100644 app/external/saved_bets/2021-03-16.bet365 create mode 100644 app/external/saved_bets/2021-03-17.bet365 create mode 100644 app/external/saved_bets/2021-03-18.bet365 create mode 100644 app/external/saved_bets/2021-03-19.bet365 create mode 100644 app/external/saved_bets/2021-03-20.bet365 create mode 100644 app/external/saved_bets/2021-03-20.betsson create mode 100644 app/external/saved_bets/2021-03-20.betway create mode 100644 app/external/saved_bets/2021-03-20.unibet create mode 100644 app/external/saved_bets/2021-03-20.wh create mode 100644 app/external/saved_bets/2021-03-21.bet365 create mode 100644 app/external/saved_bets/2021-03-21.betsson create mode 100644 app/external/saved_bets/2021-03-21.betway create mode 100644 app/external/saved_bets/2021-03-21.unibet create mode 100644 app/external/saved_bets/2021-03-21.wh create mode 100644 app/external/saved_bets/2021-03-22.bet365 create mode 100644 app/external/saved_bets/2021-03-22.betsson create mode 100644 app/external/saved_bets/2021-03-22.betway create mode 100644 app/external/saved_bets/2021-03-22.ss create mode 100644 app/external/saved_bets/2021-03-22.unibet create mode 100644 app/external/saved_bets/2021-03-22.wh create mode 100644 app/external/saved_bets/2021-03-23.bet365 create mode 100644 app/external/saved_bets/2021-03-23.betsson create mode 100644 app/external/saved_bets/2021-03-23.betway create mode 100644 app/external/saved_bets/2021-03-23.ss create mode 100644 app/external/saved_bets/2021-03-23.unibet create mode 100644 app/external/saved_bets/2021-03-23.wh create mode 100644 app/external/saved_bets/2021-03-24.bet365 create mode 100644 app/external/saved_bets/2021-03-24.betsson create mode 100644 app/external/saved_bets/2021-03-24.betway create mode 100644 app/external/saved_bets/2021-03-24.ss create mode 100644 app/external/saved_bets/2021-03-24.unibet create mode 100644 app/external/saved_bets/2021-03-24.wh create mode 100644 app/external/saved_bets/2021-03-25.bet365 create mode 100644 app/external/saved_bets/2021-03-25.betsson create mode 100644 app/external/saved_bets/2021-03-25.betway create mode 100644 app/external/saved_bets/2021-03-25.unibet create mode 100644 app/external/saved_bets/2021-03-25.wh create mode 100644 app/external/saved_bets/2021-03-26.bet365 create mode 100644 app/external/saved_bets/2021-03-26.betsson create mode 100644 app/external/saved_bets/2021-03-26.betway create mode 100644 app/external/saved_bets/2021-03-26.unibet create mode 100644 app/external/saved_bets/2021-03-26.wh create mode 100644 app/external/saved_bets/2021-03-27.bet365 create mode 100644 app/external/saved_bets/2021-03-27.betsson create mode 100644 app/external/saved_bets/2021-03-27.betway create mode 100644 app/external/saved_bets/2021-03-27.unibet create mode 100644 app/external/saved_bets/2021-03-27.wh create mode 100644 app/external/saved_bets/2021-03-28.bet365 create mode 100644 app/external/saved_bets/2021-03-28.betsson create mode 100644 app/external/saved_bets/2021-03-28.betway create mode 100644 app/external/saved_bets/2021-03-28.ss create mode 100644 app/external/saved_bets/2021-03-28.unibet create mode 100644 app/external/saved_bets/2021-03-28.wh create mode 100644 app/external/saved_bets/2021-03-29.bet365 create mode 100644 app/external/saved_bets/2021-03-29.betsson create mode 100644 app/external/saved_bets/2021-03-29.betway create mode 100644 app/external/saved_bets/2021-03-29.ss create mode 100644 app/external/saved_bets/2021-03-29.unibet create mode 100644 app/external/saved_bets/2021-03-29.wh create mode 100644 app/external/saved_bets/2021-03-30.bet365 create mode 100644 app/external/saved_bets/2021-03-30.betsson create mode 100644 app/external/saved_bets/2021-03-30.betway create mode 100644 app/external/saved_bets/2021-03-30.ss create mode 100644 app/external/saved_bets/2021-03-30.unibet create mode 100644 app/external/saved_bets/2021-03-30.wh create mode 100644 app/external/saved_bets/2021-03-31.bet365 create mode 100644 app/external/saved_bets/2021-03-31.betsson create mode 100644 app/external/saved_bets/2021-03-31.betway create mode 100644 app/external/saved_bets/2021-03-31.ss create mode 100644 app/external/saved_bets/2021-03-31.unibet create mode 100644 app/external/saved_bets/2021-03-31.wh create mode 100644 app/external/saved_bets/2021-04-01.bet365 create mode 100644 app/external/saved_bets/2021-04-01.betsson create mode 100644 app/external/saved_bets/2021-04-01.betway create mode 100644 app/external/saved_bets/2021-04-01.ss create mode 100644 app/external/saved_bets/2021-04-01.unibet create mode 100644 app/external/saved_bets/2021-04-01.wh create mode 100644 app/external/saved_bets/2021-04-02.bet365 create mode 100644 app/external/saved_bets/2021-04-02.betsson create mode 100644 app/external/saved_bets/2021-04-02.betway create mode 100644 app/external/saved_bets/2021-04-02.unibet create mode 100644 app/external/saved_bets/2021-04-02.wh create mode 100644 app/external/saved_bets/2021-04-04.bet365 create mode 100644 app/external/saved_bets/2021-04-04.betsson create mode 100644 app/external/saved_bets/2021-04-04.betway create mode 100644 app/external/saved_bets/2021-04-04.unibet create mode 100644 app/external/saved_bets/2021-04-04.wh create mode 100644 app/external/saved_bets/2021-04-05.bet365 create mode 100644 app/external/saved_bets/2021-04-05.betsson create mode 100644 app/external/saved_bets/2021-04-05.betway create mode 100644 app/external/saved_bets/2021-04-05.ss create mode 100644 app/external/saved_bets/2021-04-05.unibet create mode 100644 app/external/saved_bets/2021-04-05.wh create mode 100644 app/external/saved_bets/2021-04-06.bet365 create mode 100644 app/external/saved_bets/2021-04-06.betsson create mode 100644 app/external/saved_bets/2021-04-06.betway create mode 100644 app/external/saved_bets/2021-04-06.ss create mode 100644 app/external/saved_bets/2021-04-06.unibet create mode 100644 app/external/saved_bets/2021-04-06.wh create mode 100644 app/external/saved_bets/2021-04-07.bet365 create mode 100644 app/external/saved_bets/2021-04-07.betsson create mode 100644 app/external/saved_bets/2021-04-07.betway create mode 100644 app/external/saved_bets/2021-04-07.ss create mode 100644 app/external/saved_bets/2021-04-07.unibet create mode 100644 app/external/saved_bets/2021-04-07.wh create mode 100644 app/external/saved_bets/2021-04-08.bet365 create mode 100644 app/external/saved_bets/2021-04-08.betsson create mode 100644 app/external/saved_bets/2021-04-08.betway create mode 100644 app/external/saved_bets/2021-04-08.ss create mode 100644 app/external/saved_bets/2021-04-08.unibet create mode 100644 app/external/saved_bets/2021-04-08.wh create mode 100644 app/external/saved_bets/2021-04-09.bet365 create mode 100644 app/external/saved_bets/2021-04-09.betsson create mode 100644 app/external/saved_bets/2021-04-09.betway create mode 100644 app/external/saved_bets/2021-04-09.ss create mode 100644 app/external/saved_bets/2021-04-09.unibet create mode 100644 app/external/saved_bets/2021-04-09.wh create mode 100644 app/external/saved_bets/2021-04-10.bet365 create mode 100644 app/external/saved_bets/2021-04-10.betsson create mode 100644 app/external/saved_bets/2021-04-10.betway create mode 100644 app/external/saved_bets/2021-04-10.ss create mode 100644 app/external/saved_bets/2021-04-10.unibet create mode 100644 app/external/saved_bets/2021-04-10.wh create mode 100644 app/external/saved_bets/2021-04-11.bet365 create mode 100644 app/external/saved_bets/2021-04-11.betsson create mode 100644 app/external/saved_bets/2021-04-11.betway create mode 100644 app/external/saved_bets/2021-04-11.ss create mode 100644 app/external/saved_bets/2021-04-11.unibet create mode 100644 app/external/saved_bets/2021-04-11.wh create mode 100644 app/external/saved_bets/2021-04-12.bet365 create mode 100644 app/external/saved_bets/2021-04-12.betsson create mode 100644 app/external/saved_bets/2021-04-12.betway create mode 100644 app/external/saved_bets/2021-04-12.ss create mode 100644 app/external/saved_bets/2021-04-12.unibet create mode 100644 app/external/saved_bets/2021-04-12.wh create mode 100644 app/external/saved_bets/2021-04-13.bet365 create mode 100644 app/external/saved_bets/2021-04-13.betsson create mode 100644 app/external/saved_bets/2021-04-13.betway create mode 100644 app/external/saved_bets/2021-04-13.ss create mode 100644 app/external/saved_bets/2021-04-13.unibet create mode 100644 app/external/saved_bets/2021-04-13.wh create mode 100644 app/external/saved_bets/2021-04-14.bet365 create mode 100644 app/external/saved_bets/2021-04-14.betsson create mode 100644 app/external/saved_bets/2021-04-14.betway create mode 100644 app/external/saved_bets/2021-04-14.unibet create mode 100644 app/external/saved_bets/2021-04-14.wh create mode 100644 app/external/saved_bets/2021-04-15.bet365 create mode 100644 app/external/saved_bets/2021-04-15.betsson create mode 100644 app/external/saved_bets/2021-04-15.betway create mode 100644 app/external/saved_bets/2021-04-15.ss create mode 100644 app/external/saved_bets/2021-04-15.unibet create mode 100644 app/external/saved_bets/2021-04-15.wh create mode 100644 app/external/saved_bets/2021-04-16.bet365 create mode 100644 app/external/saved_bets/2021-04-16.betsson create mode 100644 app/external/saved_bets/2021-04-16.betway create mode 100644 app/external/saved_bets/2021-04-16.ss create mode 100644 app/external/saved_bets/2021-04-16.unibet create mode 100644 app/external/saved_bets/2021-04-16.wh create mode 100644 app/external/saved_bets/2021-04-17.bet365 create mode 100644 app/external/saved_bets/2021-04-17.betsson create mode 100644 app/external/saved_bets/2021-04-17.betway create mode 100644 app/external/saved_bets/2021-04-17.ss create mode 100644 app/external/saved_bets/2021-04-17.unibet create mode 100644 app/external/saved_bets/2021-04-17.wh create mode 100644 app/external/saved_bets/2021-04-18.bet365 create mode 100644 app/external/saved_bets/2021-04-18.betsson create mode 100644 app/external/saved_bets/2021-04-18.betway create mode 100644 app/external/saved_bets/2021-04-18.ss create mode 100644 app/external/saved_bets/2021-04-18.unibet create mode 100644 app/external/saved_bets/2021-04-18.wh create mode 100644 app/external/saved_bets/2021-04-19.bet365 create mode 100644 app/external/saved_bets/2021-04-19.betsson create mode 100644 app/external/saved_bets/2021-04-19.betway create mode 100644 app/external/saved_bets/2021-04-19.ss create mode 100644 app/external/saved_bets/2021-04-19.unibet create mode 100644 app/external/saved_bets/2021-04-19.wh create mode 100644 app/external/saved_bets/2021-04-20.bet365 create mode 100644 app/external/saved_bets/2021-04-20.betsson create mode 100644 app/external/saved_bets/2021-04-20.betway create mode 100644 app/external/saved_bets/2021-04-20.ss create mode 100644 app/external/saved_bets/2021-04-20.unibet create mode 100644 app/external/saved_bets/2021-04-20.wh create mode 100644 app/external/saved_bets/2021-04-21.bet365 create mode 100644 app/external/saved_bets/2021-04-21.betsson create mode 100644 app/external/saved_bets/2021-04-21.betway create mode 100644 app/external/saved_bets/2021-04-21.ss create mode 100644 app/external/saved_bets/2021-04-21.unibet create mode 100644 app/external/saved_bets/2021-04-21.wh create mode 100644 app/external/saved_bets/2021-04-22.bet365 create mode 100644 app/external/saved_bets/2021-04-22.betsson create mode 100644 app/external/saved_bets/2021-04-22.betway create mode 100644 app/external/saved_bets/2021-04-22.ss create mode 100644 app/external/saved_bets/2021-04-22.unibet create mode 100644 app/external/saved_bets/2021-04-22.wh create mode 100644 app/external/saved_bets/2021-04-23.bet365 create mode 100644 app/external/saved_bets/2021-04-23.betsson create mode 100644 app/external/saved_bets/2021-04-23.betway create mode 100644 app/external/saved_bets/2021-04-23.ss create mode 100644 app/external/saved_bets/2021-04-23.unibet create mode 100644 app/external/saved_bets/2021-04-23.wh create mode 100644 app/external/saved_bets/2021-04-25.bet365 create mode 100644 app/external/saved_bets/2021-04-25.betsson create mode 100644 app/external/saved_bets/2021-04-25.betway create mode 100644 app/external/saved_bets/2021-04-25.ss create mode 100644 app/external/saved_bets/2021-04-25.unibet create mode 100644 app/external/saved_bets/2021-04-25.wh create mode 100644 app/external/saved_bets/2021-04-26.bet365 create mode 100644 app/external/saved_bets/2021-04-26.betsson create mode 100644 app/external/saved_bets/2021-04-26.betway create mode 100644 app/external/saved_bets/2021-04-26.ss create mode 100644 app/external/saved_bets/2021-04-26.unibet create mode 100644 app/external/saved_bets/2021-04-26.wh create mode 100644 app/external/saved_bets/2021-04-27.bet365 create mode 100644 app/external/saved_bets/2021-04-27.betsson create mode 100644 app/external/saved_bets/2021-04-27.betway create mode 100644 app/external/saved_bets/2021-04-27.ss create mode 100644 app/external/saved_bets/2021-04-27.unibet create mode 100644 app/external/saved_bets/2021-04-27.wh create mode 100644 app/external/saved_bets/2021-04-28.bet365 create mode 100644 app/external/saved_bets/2021-04-28.betsson create mode 100644 app/external/saved_bets/2021-04-28.betway create mode 100644 app/external/saved_bets/2021-04-28.ss create mode 100644 app/external/saved_bets/2021-04-28.unibet create mode 100644 app/external/saved_bets/2021-04-28.wh create mode 100644 app/external/saved_bets/2021-04-29.bet365 create mode 100644 app/external/saved_bets/2021-04-29.betsson create mode 100644 app/external/saved_bets/2021-04-29.betway create mode 100644 app/external/saved_bets/2021-04-29.ss create mode 100644 app/external/saved_bets/2021-04-29.unibet create mode 100644 app/external/saved_bets/2021-04-29.wh create mode 100644 app/external/saved_bets/2021-05-02.bet365 create mode 100644 app/external/saved_bets/2021-05-02.betsson create mode 100644 app/external/saved_bets/2021-05-02.betway create mode 100644 app/external/saved_bets/2021-05-02.ss create mode 100644 app/external/saved_bets/2021-05-02.unibet create mode 100644 app/external/saved_bets/2021-05-02.wh create mode 100644 app/external/saved_bets/2021-05-03.bet365 create mode 100644 app/external/saved_bets/2021-05-03.betsson create mode 100644 app/external/saved_bets/2021-05-03.betway create mode 100644 app/external/saved_bets/2021-05-03.ss create mode 100644 app/external/saved_bets/2021-05-03.unibet create mode 100644 app/external/saved_bets/2021-05-03.wh create mode 100644 app/external/saved_bets/2021-05-04.bet365 create mode 100644 app/external/saved_bets/2021-05-04.betsson create mode 100644 app/external/saved_bets/2021-05-04.betway create mode 100644 app/external/saved_bets/2021-05-04.ss create mode 100644 app/external/saved_bets/2021-05-04.unibet create mode 100644 app/external/saved_bets/2021-05-04.wh create mode 100644 app/external/saved_bets/2021-05-05.bet365 create mode 100644 app/external/saved_bets/2021-05-05.betsson create mode 100644 app/external/saved_bets/2021-05-05.betway create mode 100644 app/external/saved_bets/2021-05-05.ss create mode 100644 app/external/saved_bets/2021-05-05.unibet create mode 100644 app/external/saved_bets/2021-05-05.wh create mode 100644 app/external/saved_bets/2021-05-06.bet365 create mode 100644 app/external/saved_bets/2021-05-06.betsson create mode 100644 app/external/saved_bets/2021-05-06.betway create mode 100644 app/external/saved_bets/2021-05-06.ss create mode 100644 app/external/saved_bets/2021-05-06.unibet create mode 100644 app/external/saved_bets/2021-05-06.wh create mode 100644 app/external/saved_bets/2021-05-07.bet365 create mode 100644 app/external/saved_bets/2021-05-07.betsson create mode 100644 app/external/saved_bets/2021-05-07.betway create mode 100644 app/external/saved_bets/2021-05-07.ss create mode 100644 app/external/saved_bets/2021-05-07.unibet create mode 100644 app/external/saved_bets/2021-05-07.wh create mode 100644 app/external/saved_bets/2021-05-09.bet365 create mode 100644 app/external/saved_bets/2021-05-09.betsson create mode 100644 app/external/saved_bets/2021-05-09.betway create mode 100644 app/external/saved_bets/2021-05-09.ss create mode 100644 app/external/saved_bets/2021-05-09.unibet create mode 100644 app/external/saved_bets/2021-05-09.wh create mode 100644 app/external/saved_bets/2021-05-12.bet365 create mode 100644 app/external/saved_bets/2021-05-12.betsson create mode 100644 app/external/saved_bets/2021-05-12.betway create mode 100644 app/external/saved_bets/2021-05-12.unibet create mode 100644 app/external/saved_bets/2021-05-12.wh create mode 100644 app/external/saved_bets/2021-05-17.bet365 create mode 100644 app/external/saved_bets/2021-05-17.betsson create mode 100644 app/external/saved_bets/2021-05-17.betway create mode 100644 app/external/saved_bets/2021-05-17.unibet create mode 100644 app/external/saved_bets/2021-05-17.wh create mode 100644 app/external/saved_bets/2021-05-18.bet365 create mode 100644 app/external/saved_bets/2021-05-18.betsson create mode 100644 app/external/saved_bets/2021-05-18.betway create mode 100644 app/external/saved_bets/2021-05-18.unibet create mode 100644 app/external/saved_bets/2021-05-18.wh create mode 100644 app/external/saved_bets/2021-05-19.bet365 create mode 100644 app/external/saved_bets/2021-05-19.betsson create mode 100644 app/external/saved_bets/2021-05-19.betway create mode 100644 app/external/saved_bets/2021-05-19.unibet create mode 100644 app/external/saved_bets/2021-05-20.bet365 create mode 100644 app/external/saved_bets/2021-05-20.bethard create mode 100644 app/external/saved_bets/2021-05-20.betsson create mode 100644 app/external/saved_bets/2021-05-20.betway create mode 100644 app/external/saved_bets/2021-05-20.unibet create mode 100644 app/external/saved_bets/2021-05-21.bet365 create mode 100644 app/external/saved_bets/2021-05-21.bethard create mode 100644 app/external/saved_bets/2021-05-21.betsson create mode 100644 app/external/saved_bets/2021-05-21.betway create mode 100644 app/external/saved_bets/2021-05-21.unibet create mode 100644 app/external/saved_bets/2021-05-22.bet365 create mode 100644 app/external/saved_bets/2021-05-22.bethard create mode 100644 app/external/saved_bets/2021-05-22.betsson create mode 100644 app/external/saved_bets/2021-05-22.betway create mode 100644 app/external/saved_bets/2021-05-22.unibet create mode 100644 app/external/saved_bets/2021-05-23.bet365 create mode 100644 app/external/saved_bets/2021-05-23.bethard create mode 100644 app/external/saved_bets/2021-05-23.betsson create mode 100644 app/external/saved_bets/2021-05-23.betway create mode 100644 app/external/saved_bets/2021-05-23.unibet create mode 100644 app/external/saved_bets/2021-05-24.bet365 create mode 100644 app/external/saved_bets/2021-05-24.bethard create mode 100644 app/external/saved_bets/2021-05-24.betsson create mode 100644 app/external/saved_bets/2021-05-24.betway create mode 100644 app/external/saved_bets/2021-05-24.unibet create mode 100644 app/handler.py create mode 100644 app/main.py create mode 100644 app/source/bet_parsers/parse_bet365.py create mode 100644 app/source/bet_parsers/parse_betsson.py create mode 100644 app/source/bet_parsers/parse_betway.py create mode 100644 app/source/bet_parsers/parse_ss.py create mode 100644 app/source/bet_parsers/parse_unibet.py create mode 100644 app/source/bet_parsers/parse_wh.py create mode 100644 app/source/bets_handler.py create mode 100644 app/source/db_models/bets_models.py create mode 100644 app/source/db_models/nhl_models.py create mode 100644 app/source/nhl_gen.py create mode 100644 app/source/nhl_handler.py diff --git a/.gitignore b/.gitignore index b6e47617..3003d9b8 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,6 @@ dmypy.json # Pyre type checker .pyre/ + +.history/ +.history \ No newline at end of file diff --git a/app/.gitattributes b/app/.gitattributes new file mode 100644 index 00000000..8f05dc0f --- /dev/null +++ b/app/.gitattributes @@ -0,0 +1,8 @@ +*.unibet filter=lfs diff=lfs merge=lfs -text +*.betway filter=lfs diff=lfs merge=lfs -text +*.betsson filter=lfs diff=lfs merge=lfs -text +*.bethard filter=lfs diff=lfs merge=lfs -text +*.ss filter=lfs diff=lfs merge=lfs -text +*.bet365 filter=lfs diff=lfs merge=lfs -text +*.db filter=lfs diff=lfs merge=lfs -text +*.csv filter=lfs diff=lfs merge=lfs -text diff --git a/app/external/csvs/8475167.csv b/app/external/csvs/8475167.csv new file mode 100644 index 00000000..cfea091b --- /dev/null +++ b/app/external/csvs/8475167.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb048a7a8c6c1ccad811d160eb58d1c9b6f0478a8a8598ca569f0ce5b659be08 +size 2950118 diff --git a/app/external/databases/bets.db b/app/external/databases/bets.db new file mode 100644 index 00000000..88f61a39 --- /dev/null +++ b/app/external/databases/bets.db @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04b93cd91026870ac3d9fa5ca5ab39aabcbf63b7f956107a7e6e1f5ccda9f1b4 +size 1777664 diff --git a/app/external/databases/testing.db b/app/external/databases/testing.db new file mode 100644 index 00000000..62532611 --- /dev/null +++ b/app/external/databases/testing.db @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65c5381d25af92d7ee1c2730c265f707540c4a6ceb50c5fdb6b44bf07d2b7f3e +size 83619840 diff --git a/app/external/nicknames/player_nicknames.csv b/app/external/nicknames/player_nicknames.csv new file mode 100644 index 00000000..8207e71a --- /dev/null +++ b/app/external/nicknames/player_nicknames.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ce9144e9b9d2d36ba3dea8899e5167828f35378b7f5475dc8ec8ece309849ec +size 1915 diff --git a/app/external/nicknames/team_nicknames.csv b/app/external/nicknames/team_nicknames.csv new file mode 100644 index 00000000..780adc8f --- /dev/null +++ b/app/external/nicknames/team_nicknames.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6cef5a35a34229666a1a92963b1013ca3f5622337e98b8108390e40489ef5b69 +size 1416 diff --git a/app/external/saved_bets/2021-03-16.bet365 b/app/external/saved_bets/2021-03-16.bet365 new file mode 100644 index 00000000..14c53bca --- /dev/null +++ b/app/external/saved_bets/2021-03-16.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b3423685878b6651122b661e86c92a055bd2d3b0e5f26da1ff84132eba90d49 +size 2799 diff --git a/app/external/saved_bets/2021-03-17.bet365 b/app/external/saved_bets/2021-03-17.bet365 new file mode 100644 index 00000000..e8f0c122 --- /dev/null +++ b/app/external/saved_bets/2021-03-17.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20394bd19ddb7b662d01f6bc244ba99640bd0491e7555b41e99c7a7abe0bb68b +size 2957 diff --git a/app/external/saved_bets/2021-03-18.bet365 b/app/external/saved_bets/2021-03-18.bet365 new file mode 100644 index 00000000..226685de --- /dev/null +++ b/app/external/saved_bets/2021-03-18.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e73e0450fb06657851dfb98a17de6373a33f8a36fe87a2f159b8b76d37e3656d +size 2662 diff --git a/app/external/saved_bets/2021-03-19.bet365 b/app/external/saved_bets/2021-03-19.bet365 new file mode 100644 index 00000000..7d606ae2 --- /dev/null +++ b/app/external/saved_bets/2021-03-19.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19bd928ce99eb203b2a47c28c0e703f6f2bee4c34a33b3b263db7c9722c1e5d8 +size 2836 diff --git a/app/external/saved_bets/2021-03-20.bet365 b/app/external/saved_bets/2021-03-20.bet365 new file mode 100644 index 00000000..c16b0613 --- /dev/null +++ b/app/external/saved_bets/2021-03-20.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28e112cc9f1673871c828dadbfa7c5169577abe8495ce23ba96e019d5d99f478 +size 6713 diff --git a/app/external/saved_bets/2021-03-20.betsson b/app/external/saved_bets/2021-03-20.betsson new file mode 100644 index 00000000..8e02ab70 --- /dev/null +++ b/app/external/saved_bets/2021-03-20.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:052978c1d341c6a9b86e48318e3705d1a75537785ebe3b9be2e38e145bc4ee79 +size 7650 diff --git a/app/external/saved_bets/2021-03-20.betway b/app/external/saved_bets/2021-03-20.betway new file mode 100644 index 00000000..33b14a08 --- /dev/null +++ b/app/external/saved_bets/2021-03-20.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f09e25bbf6e9c5df9adcff774d96eaa0e5fab4f3189fdaa201f319723248d101 +size 2149 diff --git a/app/external/saved_bets/2021-03-20.unibet b/app/external/saved_bets/2021-03-20.unibet new file mode 100644 index 00000000..073c6018 --- /dev/null +++ b/app/external/saved_bets/2021-03-20.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1e8a0f14ee55fb39ddea174f3ba7b86d98884457477966c551222ee47671708 +size 4128 diff --git a/app/external/saved_bets/2021-03-20.wh b/app/external/saved_bets/2021-03-20.wh new file mode 100644 index 00000000..8ba2363c --- /dev/null +++ b/app/external/saved_bets/2021-03-20.wh @@ -0,0 +1,428 @@ +Edmonton Oilers - Winnipeg Jets + +McDavid, Connor +Över 3.5 +1.90 +Under 3.5 +1.80 +Draisaitl, Leon +Över 2.5 +1.60 +Under 2.5 +2.20 +Nugent-Hopkins, Ryan +Över 2.5 +1.68 +Under 2.5 +2.05 +Scheifele, Mark +Över 2.5 +2.35 +Under 2.5 +1.52 +Wheeler, Blake +Över 2.5 +2.35 +Under 2.5 +1.52 +Connor, Kyle +Över 2.5 +1.57 +Under 2.5 +2.25 + +San José Sharks - St Louis Blues + +Burns, Brent +Över 3.5 +2.40 +Under 3.5 +1.50 +Kane, Evander +Över 3.5 +2.25 +Under 3.5 +1.57 +Couture, Logan +Över 2.5 +1.95 +Under 2.5 +1.75 +Krug, Torey +Över 2.5 +2.25 +Under 2.5 +1.57 +Perron, David +Över 2.5 +2.15 +Under 2.5 +1.62 +O'Reilly, Ryan +Över 1.5 +1.47 +Under 1.5 +2.50 + +Anaheim Ducks - Arizona Coyotes + +Silfverberg, Jakob +Över 2.5 +2.50 +Under 2.5 +1.47 +Rakell, Rickard +Över 2.5 +1.65 +Under 2.5 +2.10 +Kessel, Phil +Över 2.5 +2.40 +Under 2.5 +1.50 +Keller, Clayton +Över 2.5 +2.30 +Under 2.5 +1.55 +Getzlaf, Ryan +Över 1.5 +1.75 +Under 1.5 +1.95 +Dvorak, Christian +Över 1.5 +1.80 +Under 1.5 +1.90 + +Washington Capitals - NY Rangers + +Kuznetsov, Evgeny +Över 2.5 +2.50 +Under 2.5 +1.47 +Panarin, Artemi +Över 2.5 +1.80 +Under 2.5 +1.90 +Kreider, Chris +Över 2.5 +2.25 +Under 2.5 +1.57 +Bäckström, Nicklas +Över 2.5 +2.35 +Under 2.5 +1.52 +Zibanejad, Mika +Över 3.5 +2.25 +Under 3.5 +1.57 +Ovechkin, Alexander +Över 4.5 +2.25 +Under 4.5 +1.57 + +Toronto Maple Leafs - Calgary Flames + +Tavares, John +Över 2.5 +1.72 +Under 2.5 +2.00 +Marner, Mitch +Över 2.5 +1.75 +Under 2.5 +1.95 +Gaudreau, Johnny +Över 2.5 +2.10 +Under 2.5 +1.65 +Lindholm, Elias +Över 2.5 +2.30 +Under 2.5 +1.55 +Tkachuk, Matthew +Över 2.5 +1.68 +Under 2.5 +2.05 +Matthews, Auston +Över 3.5 +1.50 +Under 3.5 +2.40 + +NY Islanders - Philadelphia Flyers + +Barzal, Mathew +Över 2.5 +2.20 +Under 2.5 +1.60 +Nelson, Brock +Över 2.5 +2.00 +Under 2.5 +1.72 +Eberle, Jordan +Över 2.5 +2.20 +Under 2.5 +1.60 +Giroux, Claude +Över 2.5 +2.05 +Under 2.5 +1.70 +Couturier, Sean +Över 2.5 +2.05 +Under 2.5 +1.68 +Hayes, Kevin +Över 2.5 +2.15 +Under 2.5 +1.62 + +Montreal Canadiens - Vancouver Canucks + +Gallagher, Brendan +Över 3.5 +2.10 +Under 3.5 +1.65 +Weber, Shea +Över 2.5 +2.35 +Under 2.5 +1.52 +Toffoli, Tyler +Över 2.5 +1.60 +Under 2.5 +2.20 +Boeser, Brock +Över 2.5 +2.00 +Under 2.5 +1.72 +Horvat, Bowie +Över 2.5 +2.15 +Under 2.5 +1.62 +Miller, J.T. +Över 2.5 +2.40 +Under 2.5 +1.50 + +Detroit Red Wings - Dallas Stars + +Larkin, Dylan +Över 3.5 +2.35 +Under 3.5 +1.52 +Mantha, Anthony +Över 2.5 +2.05 +Under 2.5 +1.70 +Benn, Jamie +Över 2.5 +2.00 +Under 2.5 +1.72 +Klingberg, John +Över 2.5 +2.30 +Under 2.5 +1.55 +Pavelski, Joe +Över 2.5 +2.15 +Under 2.5 +1.62 +Hronek, Filip +Över 1.5 +1.52 +Under 1.5 +2.35 + +Carolina Hurricanes - Columbus Blue Jackets + +Aho, Sebastian (1997) +Över 2.5 +1.80 +Under 2.5 +1.90 +Svechnikov, Andrei +Över 2.5 +1.65 +Under 2.5 +2.10 +Hamilton, Dougie +Över 2.5 +1.60 +Under 2.5 +2.20 +Atkinson, Cam +Över 2.5 +1.90 +Under 2.5 +1.80 +Laine, Patrik +Över 2.5 +1.95 +Under 2.5 +1.75 +Björkstrand, Oliver +Över 2.5 +2.00 +Under 2.5 +1.72 + +New Jersey Devils - Pittsburgh Penguins + +Palmieri, Kyle +over 2.5 +1.95 +Under 2.5 +1.75 +Subban, P. K. +over 2.5 +2.45 +Under 2.5 +1.48 +Hughes, Jack +over 2.5 +2.10 +Under 2.5 +1.65 +Guentzel, Jake +over 2.5 +1.62 +Under 2.5 +2.15 +Crosby, Sidney +over 2.5 +1.80 +Under 2.5 +1.90 +Letang, Kris +over 2.5 +2.00 +Under 2.5 +1.72 + +Florida Panthers - Nashville Predators + +Barkov, Aleksander +over 2.5 +1.57 +Under 2.5 +2.25 +Huberdeau, Jonathan +over 2.5 +2.35 +Under 2.5 +1.52 +Hornqvist, Patric +over 2.5 +1.55 +Under 2.5 +2.30 +Forsberg, Filip +over 2.5 +1.52 +Under 2.5 +2.35 +Arvidsson, Viktor +over 2.5 +1.75 +Under 2.5 +1.95 +Johansen, Ryan +over 1.5 +1.90 +Under 1.5 +1.80 + +Colorado Avalanche - Minnesota Wild + +MacKinnon, Nathan +over 3.5 +1.60 +Under 3.5 +2.20 +Landeskog, Gabriel +over 2.5 +1.80 +Under 2.5 +1.90 +Rantanen, Mikko +over 2.5 +1.55 +Under 2.5 +2.30 +Fiala, Kevin +over 2.5 +1.75 +Under 2.5 +1.95 +Zuccarello, Mats +over 1.5 +1.65 +Under 1.5 +2.10 +Suter, Ryan +over 1.5 +2.00 +Under 1.5 +1.72 + +Tampa Bay Lightning - Chicago Blackhawks + +Stamkos, Steven +over 2.5 +1.70 +Under 2.5 +2.05 +Hedman, Victor +over 2.5 +1.90 +Under 2.5 +1.80 +Point, Brayden +over 2.5 +1.90 +Under 2.5 +1.80 +DeBrincat, Alex +over 2.5 +1.62 +Under 2.5 +2.15 +Kubalik, Dominik +over 2.5 +1.80 +Under 2.5 +1.90 +Kane, Patrick +over 3.5 +2.10 +Under 3.5 +1.65 \ No newline at end of file diff --git a/app/external/saved_bets/2021-03-21.bet365 b/app/external/saved_bets/2021-03-21.bet365 new file mode 100644 index 00000000..7f242f1d --- /dev/null +++ b/app/external/saved_bets/2021-03-21.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4ec352c44d8e00ed715d3b6c661305d93171a9cea23f1d5613f4b6efbc7684a +size 1791 diff --git a/app/external/saved_bets/2021-03-21.betsson b/app/external/saved_bets/2021-03-21.betsson new file mode 100644 index 00000000..f373c3ab --- /dev/null +++ b/app/external/saved_bets/2021-03-21.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37e2df34f2fa109f69f6a5efecd0e497277b09ba92500333a8fed953321e155e +size 2743 diff --git a/app/external/saved_bets/2021-03-21.betway b/app/external/saved_bets/2021-03-21.betway new file mode 100644 index 00000000..e4bc5c0f --- /dev/null +++ b/app/external/saved_bets/2021-03-21.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:400c323c6acc44c5144f31d992484257b7c9b099cfc13522a795b0489e91de1a +size 2105 diff --git a/app/external/saved_bets/2021-03-21.unibet b/app/external/saved_bets/2021-03-21.unibet new file mode 100644 index 00000000..f5c2c405 --- /dev/null +++ b/app/external/saved_bets/2021-03-21.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c44f37e7f362474bef82679f7e65714d9c7bc52d3a2cdb4538a752eadda1d452 +size 1384 diff --git a/app/external/saved_bets/2021-03-21.wh b/app/external/saved_bets/2021-03-21.wh new file mode 100644 index 00000000..3700c672 --- /dev/null +++ b/app/external/saved_bets/2021-03-21.wh @@ -0,0 +1,129 @@ +Pittsburgh Penguins - New Jersey Devils + +Hughes, Jack +Över 2.5 +2.10 +Under 2.5 +1.65 +Palmieri, Kyle +Över 2.5 +1.95 +Under 2.5 +1.75 +Subban, P. K. +Över 2.5 +2.45 +Under 2.5 +1.48 +Crosby, Sidney +Över 2.5 +1.80 +Under 2.5 +1.90 +Guentzel, Jake +Över 2.5 +1.62 +Under 2.5 +2.15 +Letang, Kris +Över 2.5 +2.00 +Under 2.5 +1.72 + +Tampa Bay Lightning - Florida Panthers + +Stamkos, Steven +Över 2.5 +1.72 +Under 2.5 +2.00 +Hedman, Victor +Över 2.5 +1.95 +Under 2.5 +1.75 +Point, Brayden +Över 2.5 +1.95 +Under 2.5 +1.75 +Barkov, Aleksander +Över 2.5 +1.57 +Under 2.5 +2.25 +Huberdeau, Jonathan +Över 2.5 +2.40 +Under 2.5 +1.50 +Hörnqvist, Patric +Över 2.5 +1.60 +Under 2.5 +2.20 + +Los Angeles Kings - Vegas Golden Knights +Brown, Dustin +Över 2.5 +1.65 +Under 2.5 +2.10 +Marchessault, Jonathan +Över 2.5 +1.65 +Under 2.5 +2.10 +Stone, Mark +Över 2.5 +2.35 +Under 2.5 +1.52 +Pacioretty, Max +Över 3.5 +1.67 +Under 3.5 +2.08 +Doughty, Drew +Över 1.5 +1.72 +Under 1.5 +2.00 +Kopitar, Anze +Över 1.5 +1.52 +Under 1.5 +2.35 + +Dallas Stars - Nashville Predators +Benn, Jamie +Över 2.5 +2.00 +Under 2.5 +1.72 +Klingberg, John +Över 2.5 +2.30 +Under 2.5 +1.55 +Pavelski, Joe +Över 2.5 +2.15 +Under 2.5 +1.62 +Forsberg, Filip +Över 2.5 +1.52 +Under 2.5 +2.35 +Arvidsson, Viktor +Över 2.5 +1.65 +Under 2.5 +2.10 +Johansen, Ryan +Över 1.5 +1.90 +Under 1.5 +1.80 \ No newline at end of file diff --git a/app/external/saved_bets/2021-03-22.bet365 b/app/external/saved_bets/2021-03-22.bet365 new file mode 100644 index 00000000..f727f604 --- /dev/null +++ b/app/external/saved_bets/2021-03-22.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:632dd1d2da38d90315b6f146c0dbc5c6c8f86cae520ddf1179fd052f928857ad +size 3774 diff --git a/app/external/saved_bets/2021-03-22.betsson b/app/external/saved_bets/2021-03-22.betsson new file mode 100644 index 00000000..f81c1107 --- /dev/null +++ b/app/external/saved_bets/2021-03-22.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c1678bb5a3f5b1dbe233bad26c143b50f398f3950b29c877df10df58805ca72 +size 4646 diff --git a/app/external/saved_bets/2021-03-22.betway b/app/external/saved_bets/2021-03-22.betway new file mode 100644 index 00000000..602a5a9d --- /dev/null +++ b/app/external/saved_bets/2021-03-22.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eba8fa594556f6124d636bc246e3604e5c42acc25331e6dc6d1d446896de3d93 +size 4610 diff --git a/app/external/saved_bets/2021-03-22.ss b/app/external/saved_bets/2021-03-22.ss new file mode 100644 index 00000000..813f8dcd --- /dev/null +++ b/app/external/saved_bets/2021-03-22.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:575b76ebd290b36db6ca4e5dd2c0daf204c652e010382c9a3400d9642422aa7c +size 1047 diff --git a/app/external/saved_bets/2021-03-22.unibet b/app/external/saved_bets/2021-03-22.unibet new file mode 100644 index 00000000..83d4a6dd --- /dev/null +++ b/app/external/saved_bets/2021-03-22.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48d79760e4a90fe7352c5321a2720365013d9077627c9f1b6a3d0f1578a8b7e8 +size 3034 diff --git a/app/external/saved_bets/2021-03-22.wh b/app/external/saved_bets/2021-03-22.wh new file mode 100644 index 00000000..e3a325cd --- /dev/null +++ b/app/external/saved_bets/2021-03-22.wh @@ -0,0 +1,283 @@ +Columbus Blue Jackets - Carolina Hurricanes + +Atkinson, Cam +Över 2.5 +1.90 +Under 2.5 +1.80 +Laine, Patrik +Över 2.5 +1.92 +Under 2.5 +1.78 +Björkstrand, Oliver +Över 2.5 +2.05 +Under 2.5 +1.68 +Aho, Sebastian (1997) +Över 2.5 +1.80 +Under 2.5 +1.90 +Svechnikov, Andrei +Över 2.5 +1.65 +Under 2.5 +2.10 +Hamilton, Dougie +Över 2.5 +1.60 +Under 2.5 +2.20 + +NY Rangers - Buffalo Sabres +Panarin, Artemi +Över 2.5 +1.68 +Under 2.5 +2.05 +Kreider, Chris +Över 2.5 +2.10 +Under 2.5 +1.65 +Dahlin, Rasmus +Över 2.5 +2.45 +Under 2.5 +1.48 +Reinhart, Sam +Över 2.5 +2.15 +Under 2.5 +1.62 +Hall, Taylor +Över 2.5 +1.90 +Under 2.5 +1.80 +Zibanejad, Mika +Över 3.5 +2.10 +Under 3.5 +1.65 + +Ottawa Senators - Calgary Flames +Chabot, Thomas +Över 2.5 +2.00 +Under 2.5 +1.72 +Dadonov, Evgeny +Över 2.5 +2.15 +Under 2.5 +1.62 +Gaudreau, Johnny +Över 2.5 +2.05 +Under 2.5 +1.68 +Lindholm, Elias +Över 2.5 +2.25 +Under 2.5 +1.57 +Tkachuk, Matthew +Över 2.5 +1.65 +Under 2.5 +2.10 + +Philadelphia Flyers - NY Islanders +Giroux, Claude +Över 2.5 +2.05 +Under 2.5 +1.70 +Couturier, Sean +Över 2.5 +2.05 +Under 2.5 +1.68 +Hayes, Kevin +Över 2.5 +2.15 +Under 2.5 +1.62 +Barzal, Mathew +Över 2.5 +2.20 +Under 2.5 +1.60 +Nelson, Brock +Över 2.5 +1.95 +Under 2.5 +1.75 +Eberle, Jordan +Över 2.5 +2.20 +Under 2.5 +1.60 + +Minnesota Wild - Anaheim Ducks +Fiala, Kevin +Över 2.5 +1.68 +Under 2.5 +2.05 +Silfverberg, Jakob +Över 2.5 +2.55 +Under 2.5 +1.45 +Rakell, Rickard +Över 2.5 +1.72 +Under 2.5 +2.00 +Zuccarello, Mats +Över 1.5 +1.65 +Under 1.5 +2.10 +Suter, Ryan +Över 1.5 +1.90 +Under 1.5 +1.80 +Getzlaf, Ryan +Över 1.5 +1.80 +Under 1.5 +1.90 + +Arizona Coyotes - Colorado Avalanche +Kessel, Phil +Över 2.5 +2.50 +Under 2.5 +1.47 +Keller, Clayton +Över 2.5 +2.40 +Under 2.5 +1.50 +Landeskog, Gabriel +Över 2.5 +1.80 +Under 2.5 +1.90 +Rantanen, Mikko +Över 2.5 +1.55 +Under 2.5 +2.30 +MacKinnon, Nathan +Över 3.5 +1.60 +Under 3.5 +2.20 +Dvorak, Christian +Över 1.5 +1.90 +Under 1.5 +1.80 + +Vancouver Canucks - Winnipeg Jets +Boeser, Brock +Över 2.5 +1.92 +Under 2.5 +1.78 +Horvat, Bowie +Över 2.5 +2.05 +Under 2.5 +1.68 +Miller, J.T. +Över 2.5 +2.30 +Under 2.5 +1.55 +Scheifele, Mark +Över 2.5 +2.20 +Under 2.5 +1.60 +Wheeler, Blake +Över 2.5 +2.30 +Under 2.5 +1.55 +Connor, Kyle +Över 2.5 +1.60 +Under 2.5 +2.20 + +Vegas Golden Knights - St Louis Blues +Marchessault, Jonathan +Över 2.5 +1.68 +Under 2.5 +2.05 +Stone, Mark +Över 2.5 +2.35 +Under 2.5 +1.52 +Krug, Torey +Över 2.5 +2.30 +Under 2.5 +1.55 +Perron, David +Över 2.5 +2.20 +Under 2.5 +1.60 +Pacioretty, Max +Över 3.5 +1.68 +Under 3.5 +2.05 +O'Reilly, Ryan +Över 1.5 +1.52 +Under 1.5 +2.35 + +San José Sharks - Los Angeles Kings +Couture, Logan +Över 2.5 +1.90 +Under 2.5 +1.80 +Brown, Dustin +Över 2.5 +1.80 +Under 2.5 +1.90 +Burns, Brent +Över 3.5 +2.30 +Under 3.5 +1.55 +Kane, Evander +Över 3.5 +2.20 +Under 3.5 +1.60 +Doughty, Drew +Över 1.5 +1.65 +Under 1.5 +2.10 +Kopitar, Anze +Över 1.5 +1.50 +Under 1.5 +2.40 \ No newline at end of file diff --git a/app/external/saved_bets/2021-03-23.bet365 b/app/external/saved_bets/2021-03-23.bet365 new file mode 100644 index 00000000..78fd3b45 --- /dev/null +++ b/app/external/saved_bets/2021-03-23.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:047980e8be89ce247f3fc05de4ea58dc97be7e148b823e325b5f64139c33ab7a +size 2558 diff --git a/app/external/saved_bets/2021-03-23.betsson b/app/external/saved_bets/2021-03-23.betsson new file mode 100644 index 00000000..a5d623c8 --- /dev/null +++ b/app/external/saved_bets/2021-03-23.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec3b4fdcce12a345132a6efb8242ce4fccac36b2bfd3c0df2ba5360eb46b0e17 +size 2421 diff --git a/app/external/saved_bets/2021-03-23.betway b/app/external/saved_bets/2021-03-23.betway new file mode 100644 index 00000000..41aae826 --- /dev/null +++ b/app/external/saved_bets/2021-03-23.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0aee868cd14495afe0c88a4ba61671702c3c3be9703875708e87c19325ab18b +size 3281 diff --git a/app/external/saved_bets/2021-03-23.ss b/app/external/saved_bets/2021-03-23.ss new file mode 100644 index 00000000..a1fefa5a --- /dev/null +++ b/app/external/saved_bets/2021-03-23.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:623ce6ba0c9fe9331c8d526b1e4193a9ddab1bf6dce2767e206bafcfecbb9625 +size 765 diff --git a/app/external/saved_bets/2021-03-23.unibet b/app/external/saved_bets/2021-03-23.unibet new file mode 100644 index 00000000..7971f8a9 --- /dev/null +++ b/app/external/saved_bets/2021-03-23.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a713f1ca9fb31aa7b040efac0d6851e773428464f417f8b523c4080a5a4fa37 +size 1392 diff --git a/app/external/saved_bets/2021-03-23.wh b/app/external/saved_bets/2021-03-23.wh new file mode 100644 index 00000000..89fc918d --- /dev/null +++ b/app/external/saved_bets/2021-03-23.wh @@ -0,0 +1,129 @@ +Chicago Blackhawks - Florida Panthers + +DeBrincat, Alex +Över 2.5 +1.65 +Under 2.5 +2.10 +Kubalik, Dominik +Över 2.5 +1.82 +Under 2.5 +1.88 +Barkov, Aleksander +Över 2.5 +1.45 +Under 2.5 +2.55 +Huberdeau, Jonathan +Över 2.5 +2.30 +Under 2.5 +1.55 +Hörnqvist, Patric +Över 2.5 +1.52 +Under 2.5 +2.35 +Kane, Patrick +Över 3.5 +2.10 +Under 3.5 +1.65 + +Nashville Predators - Detroit Red Wings + +Forsberg, Filip +Över 2.5 +1.47 +Under 2.5 +2.50 +Arvidsson, Viktor +Över 2.5 +1.55 +Under 2.5 +2.30 +Mantha, Anthony +Över 2.5 +2.00 +Under 2.5 +1.72 +Larkin, Dylan +Över 3.5 +2.30 +Under 3.5 +1.55 +Johansen, Ryan +Över 1.5 +1.80 +Under 1.5 +1.90 +Hronek, Filip +Över 1.5 +1.50 +Under 1.5 +2.40 + +Dallas Stars - Tampa Bay Lightning +Benn, Jamie +Över 2.5 +2.00 +Under 2.5 +1.72 +Klingberg, John +Över 2.5 +2.55 +Under 2.5 +1.45 +Pavelski, Joe +Över 2.5 +2.40 +Under 2.5 +1.50 +Stamkos, Steven +Över 2.5 +1.72 +Under 2.5 +2.00 +Hedman, Victor +Över 2.5 +2.05 +Under 2.5 +1.68 +Point, Brayden +Över 2.5 +2.20 +Under 2.5 +1.60 + +Arizona Coyotes - Colorado Avalanche +Kessel, Phil +Över 2.5 +2.55 +Under 2.5 +1.45 +Keller, Clayton +Över 2.5 +2.40 +Under 2.5 +1.50 +Landeskog, Gabriel +Över 2.5 +1.80 +Under 2.5 +1.90 +Rantanen, Mikko +Över 2.5 +1.55 +Under 2.5 +2.30 +MacKinnon, Nathan +Över 3.5 +1.60 +Under 3.5 +2.20 +Dvorak, Christian +Över 1.5 +1.90 +Under 1.5 +1.80 \ No newline at end of file diff --git a/app/external/saved_bets/2021-03-24.bet365 b/app/external/saved_bets/2021-03-24.bet365 new file mode 100644 index 00000000..27842e98 --- /dev/null +++ b/app/external/saved_bets/2021-03-24.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2c3ecc33f41b75a64f1bba6ddf9588a1d9613fbd51670bd0c983b7250ffe18d +size 2522 diff --git a/app/external/saved_bets/2021-03-24.betsson b/app/external/saved_bets/2021-03-24.betsson new file mode 100644 index 00000000..7badc688 --- /dev/null +++ b/app/external/saved_bets/2021-03-24.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa2be7e0f29cfd1e880785c234050c201acd093f331c46c276d98c3256c19a49 +size 2022 diff --git a/app/external/saved_bets/2021-03-24.betway b/app/external/saved_bets/2021-03-24.betway new file mode 100644 index 00000000..3d22afa3 --- /dev/null +++ b/app/external/saved_bets/2021-03-24.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10f3b8e94ffe86d110c93bcdd5cdd2658c2fe2c368362f9690ddaf70f59970e5 +size 3420 diff --git a/app/external/saved_bets/2021-03-24.ss b/app/external/saved_bets/2021-03-24.ss new file mode 100644 index 00000000..5998d4a5 --- /dev/null +++ b/app/external/saved_bets/2021-03-24.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1762c99ba2d71daaabb87123b7dd9c6b69db257352fe764c6121a329dfffe161 +size 823 diff --git a/app/external/saved_bets/2021-03-24.unibet b/app/external/saved_bets/2021-03-24.unibet new file mode 100644 index 00000000..b7827825 --- /dev/null +++ b/app/external/saved_bets/2021-03-24.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7fb443f5bfc8ad97c4935e7cae21e482154efbb87913cd3da484e2222c104a2c +size 1674 diff --git a/app/external/saved_bets/2021-03-24.wh b/app/external/saved_bets/2021-03-24.wh new file mode 100644 index 00000000..dd5781ab --- /dev/null +++ b/app/external/saved_bets/2021-03-24.wh @@ -0,0 +1,159 @@ +Ottawa Senators - Calgary Flames +Chabot, Thomas +Över 2.5 +2.00 +Under 2.5 +1.72 +Dadonov, Evgeny +Över 2.5 +2.25 +Under 2.5 +1.57 +Tkachuk, Brady +Över 3.5 +1.88 +Under 3.5 +1.82 +Gaudreau, Johnny +Över 2.5 +2.05 +Under 2.5 +1.68 +Lindholm, Elias +Över 2.5 +2.25 +Under 2.5 +1.57 +Tkachuk, Matthew +Över 2.5 +1.65 +Under 2.5 +2.10 + +Minnesota Wild - Anaheim Ducks +Zuccarello, Mats +Över 1.5 +1.60 +Under 1.5 +2.20 +Suter, Ryan +Över 1.5 +1.90 +Under 1.5 +1.80 +Getzlaf, Ryan +Över 1.5 +1.80 +Under 1.5 +1.90 +Fiala, Kevin +Över 2.5 +1.68 +Under 2.5 +2.05 +Silfverberg, Jakob +Över 2.5 +2.55 +Under 2.5 +1.45 +Rakell, Rickard +Över 2.5 +1.72 +Under 2.5 +2.00 + +Pittsburgh Penguins - Buffalo Sabres +Crosby, Sidney +Över 2.5 +1.62 +Under 2.5 +2.15 +Letang, Kris +Över 2.5 +2.00 +Under 2.5 +1.72 +Guentzel, Jake +Över 2.5 +1.70 +Under 2.5 +2.05 +Dahlin, Rasmus +Över 2.5 +2.45 +Under 2.5 +1.48 +Reinhart, Sam +Över 2.5 +2.25 +Under 2.5 +1.57 +Hall, Taylor +Över 2.5 +2.10 +Under 2.5 +1.65 + +San José Sharks - Los Angeles Kings +Couture, Logan +Över 2.5 +1.90 +Under 2.5 +1.80 +Brown, Dustin +Över 2.5 +1.72 +Under 2.5 +2.00 +Doughty, Drew +Över 1.5 +1.65 +Under 1.5 +2.10 +Kopitar, Anze +Över 1.5 +1.50 +Under 1.5 +2.40 +Burns, Brent +Över 3.5 +2.30 +Under 3.5 +1.55 +Kane, Evander +Över 3.5 +2.20 +Under 3.5 +1.60 + +Vancouver Canucks - Winnipeg Jets +Boeser, Brock +Över 2.5 +1.92 +Under 2.5 +1.78 +Horvat, Bowie +Över 2.5 +2.05 +Under 2.5 +1.68 +Miller, J.T. +Över 2.5 +2.40 +Under 2.5 +1.50 +Scheifele, Mark +Över 2.5 +2.20 +Under 2.5 +1.60 +Wheeler, Blake +Över 2.5 +2.30 +Under 2.5 +1.55 +Connor, Kyle +Över 2.5 +1.60 +Under 2.5 +2.20 \ No newline at end of file diff --git a/app/external/saved_bets/2021-03-25.bet365 b/app/external/saved_bets/2021-03-25.bet365 new file mode 100644 index 00000000..8bdf6818 --- /dev/null +++ b/app/external/saved_bets/2021-03-25.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:506c2c65e15d1d4a226f9fcb2a2b0c58ef66e1b953d7e5defe1d6dc0c40e9b7b +size 6416 diff --git a/app/external/saved_bets/2021-03-25.betsson b/app/external/saved_bets/2021-03-25.betsson new file mode 100644 index 00000000..a50964ad --- /dev/null +++ b/app/external/saved_bets/2021-03-25.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5dab625965163e861b703cce1697aef72417d74fd055e4b489a58d15fe3ef3d +size 5718 diff --git a/app/external/saved_bets/2021-03-25.betway b/app/external/saved_bets/2021-03-25.betway new file mode 100644 index 00000000..8d09f958 --- /dev/null +++ b/app/external/saved_bets/2021-03-25.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85590707464b79c53a623f4c8df67ad0b73fc3c17d9e5cd28ce129e36112a67b +size 8227 diff --git a/app/external/saved_bets/2021-03-25.unibet b/app/external/saved_bets/2021-03-25.unibet new file mode 100644 index 00000000..44221b8a --- /dev/null +++ b/app/external/saved_bets/2021-03-25.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a085def65e827f5eeb7fb87117b75c89b36d4beb32b1351d5e7a78d727f5297 +size 3760 diff --git a/app/external/saved_bets/2021-03-25.wh b/app/external/saved_bets/2021-03-25.wh new file mode 100644 index 00000000..2998675f --- /dev/null +++ b/app/external/saved_bets/2021-03-25.wh @@ -0,0 +1,361 @@ +Boston Bruins - NY Islanders + +Marchand, Brad +Över 2.5 +2.10 +Under 2.5 +1.65 +Pastrnak, David +Över 3.5 +1.75 +Under 3.5 +1.95 +Bergeron, Patrice +Över 2.5 +1.62 +Under 2.5 +2.15 +Barzal, Mathew +Över 2.5 +2.25 +Under 2.5 +1.57 +Nelson, Brock +Över 2.5 +2.00 +Under 2.5 +1.72 +Eberle, Jordan +Över 2.5 +2.25 +Under 2.5 +1.57 + +Columbus Blue Jackets - Carolina Hurricanes + +Atkinson, Cam +Över 2.5 +1.90 +Under 2.5 +1.80 +Laine, Patrik +Över 2.5 +1.92 +Under 2.5 +1.78 +Björkstrand, Oliver +Över 2.5 +2.05 +Under 2.5 +1.68 +Aho, Sebastian (1997) +Över 2.5 +1.80 +Under 2.5 +1.90 +Hamilton, Dougie +Över 2.5 +1.60 +Under 2.5 +2.20 +Svechnikov, Andrei +Över 2.5 +1.60 +Under 2.5 +2.20 + +Ottawa Senators - Toronto Maple Leafs + +Chabot, Thomas +Över 2.5 +2.05 +Under 2.5 +1.68 +Tkachuk, Brady +Över 3.5 +2.00 +Under 3.5 +1.72 +Matthews, Auston +Över 3.5 +1.47 +Under 3.5 +2.50 +Dadonov, Evgeny +Över 2.5 +2.20 +Under 2.5 +1.60 +Tavares, John +Över 2.5 +1.68 +Under 2.5 +2.05 +Marner, Mitch +Över 2.5 +1.68 +Under 2.5 +2.05 + +Philadelphia Flyers - NY Rangers + +Zibanejad, Mika +Över 3.5 +2.20 +Under 3.5 +1.60 +Giroux, Claude +Över 2.5 +2.05 +Under 2.5 +1.68 +Couturier, Sean +Över 2.5 +2.05 +Under 2.5 +1.68 +Hayes, Kevin +Över 2.5 +2.10 +Under 2.5 +1.65 +Panarin, Artemi +Över 2.5 +1.78 +Under 2.5 +1.92 +Kreider, Chris +Över 2.5 +2.20 +Under 2.5 +1.60 + +Pittsburgh Penguins - Buffalo Sabres + +Crosby, Sidney +Över 2.5 +1.65 +Under 2.5 +2.10 +Letang, Kris +Över 2.5 +2.00 +Under 2.5 +1.72 +Guentzel, Jake +Över 2.5 +1.65 +Under 2.5 +2.10 +Dahlin, Rasmus +Över 2.5 +2.45 +Under 2.5 +1.48 +Reinhart, Sam +Över 2.5 +2.25 +Under 2.5 +1.58 +Hall, Taylor +Över 2.5 +2.00 +Under 2.5 +1.72 + +Washington Capitals - New Jersey Devils + +Ovechkin, Alexander +Över 4.5 +2.20 +Under 4.5 +1.60 +Bäckström, Nicklas +Över 2.5 +2.30 +Under 2.5 +1.55 +Kuznetsov, Evgeny +Över 2.5 +2.40 +Under 2.5 +1.50 +Palmieri, Kyle +Över 2.5 +2.10 +Under 2.5 +1.65 +Subban, P. K. +Över 2.5 +2.50 +Under 2.5 +1.47 +Hughes, Jack +Över 2.5 +2.40 +Under 2.5 +1.50 + +Chicago Blackhawks - Florida Panthers + +Kane, Patrick +Över 3.5 +2.10 +Under 3.5 +1.65 +DeBrincat, Alex +Över 2.5 +1.65 +Under 2.5 +2.10 +Kubalik, Dominik +Över 2.5 +1.85 +Under 2.5 +1.85 +Huberdeau, Jonathan +Över 2.5 +2.30 +Under 2.5 +1.55 +Hörnqvist, Patric +Över 2.5 +1.52 +Under 2.5 +2.35 + +Minnesota Wild - St Louis Blues + +Zuccarello, Mats +Över 1.5 +1.65 +Under 1.5 +2.10 +Suter, Ryan +Över 1.5 +2.00 +Under 1.5 +1.72 +O'Reilly, Ryan +Över 1.5 +1.50 +Under 1.5 +2.40 +Fiala, Kevin +Över 2.5 +1.75 +Under 2.5 +1.95 +Krug, Torey +Över 2.5 +2.25 +Under 2.5 +1.57 +Perron, David +Över 2.5 +1.90 +Under 2.5 +1.80 + +Nashville Predators - Detroit Red Wings + +Larkin, Dylan +Över 3.5 +2.35 +Under 3.5 +1.52 +Arvidsson, Viktor +Över 2.5 +1.55 +Under 2.5 +2.30 +Forsberg, Filip +Över 2.5 +1.47 +Under 2.5 +2.50 +Mantha, Anthony +Över 2.5 +2.05 +Under 2.5 +1.68 +Johansen, Ryan +Över 1.5 +1.80 +Under 1.5 +1.90 +Hronek, Filip +Över 1.5 +1.50 +Under 1.5 +2.40 + +Dallas Stars - Tampa Bay Lightning + +Benn, Jamie +Över 2.5 +2.05 +Under 2.5 +1.68 +Klingberg, John +Över 2.5 +2.55 +Under 2.5 +1.45 +Pavelski, Joe +Över 2.5 +2.40 +Under 2.5 +1.50 +Stamkos, Steven +Över 2.5 +1.82 +Under 2.5 +1.88 +Hedman, Victor +Över 2.5 +2.05 +Under 2.5 +1.68 +Point, Brayden +Över 2.5 +2.20 +Under 2.5 +1.60 + +Colorado Avalanche - Vegas Golden Knights + +MacKinnon, Nathan +Över 3.5 +1.62 +Under 3.5 +2.15 +Pacioretty, Max +Över 3.5 +1.75 +Under 3.5 +1.95 +Landeskog, Gabriel +Över 2.5 +1.85 +Under 2.5 +1.85 +Rantanen, Mikko +Över 2.5 +1.60 +Under 2.5 +2.20 +Marchessault, Jonathan +Över 2.5 +1.67 +Under 2.5 +2.08 +Stone, Mark +Över 2.5 +2.40 +Under 2.5 +1.50 + + + + diff --git a/app/external/saved_bets/2021-03-26.bet365 b/app/external/saved_bets/2021-03-26.bet365 new file mode 100644 index 00000000..3276103c --- /dev/null +++ b/app/external/saved_bets/2021-03-26.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c01963ef5873ae19ab038b5950ebd3e4b611a0e1c29e34124b07ccfeeb60731 +size 2243 diff --git a/app/external/saved_bets/2021-03-26.betsson b/app/external/saved_bets/2021-03-26.betsson new file mode 100644 index 00000000..4c4502fe --- /dev/null +++ b/app/external/saved_bets/2021-03-26.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41714c7d19a51fee2a2d540402e9f77be793ae458a4c362681b6fa933970f59a +size 2359 diff --git a/app/external/saved_bets/2021-03-26.betway b/app/external/saved_bets/2021-03-26.betway new file mode 100644 index 00000000..6fe19121 --- /dev/null +++ b/app/external/saved_bets/2021-03-26.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0308b8dfcf01a6748339cd6aef3b084838539e904041a3b4497f340ce525ce4 +size 2826 diff --git a/app/external/saved_bets/2021-03-26.unibet b/app/external/saved_bets/2021-03-26.unibet new file mode 100644 index 00000000..94de75b7 --- /dev/null +++ b/app/external/saved_bets/2021-03-26.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:161e076b6b2a7c4f09628700ba9f5db527cbc59eb671f9e179a1ec6c4ad9d31e +size 1369 diff --git a/app/external/saved_bets/2021-03-26.wh b/app/external/saved_bets/2021-03-26.wh new file mode 100644 index 00000000..d9d63077 --- /dev/null +++ b/app/external/saved_bets/2021-03-26.wh @@ -0,0 +1,126 @@ +Washington Capitals - New Jersey Devils + +Bäckström, Nicklas +Över 2.5 +2.30 +Under 2.5 +1.55 +Kuznetsov, Evgeny +Över 2.5 +2.40 +Under 2.5 +1.50 +Palmieri, Kyle +Över 2.5 +2.10 +Under 2.5 +1.65 +Subban, P. K. +Över 2.5 +2.50 +Under 2.5 +1.47 +Hughes, Jack +Över 2.5 +2.40 +Under 2.5 +1.50 + +St Louis Blues - Anaheim Ducks + +Krug, Torey +Över 2.5 +2.20 +Under 2.5 +1.60 +Perron, David +Över 2.5 +1.95 +Under 2.5 +1.75 +Silfverberg, Jakob +Över 2.5 +2.65 +Under 2.5 +1.42 +Rakell, Rickard +Över 2.5 +1.75 +Under 2.5 +1.95 +O'Reilly, Ryan +Över 1.5 +1.47 +Under 1.5 +2.50 +Getzlaf, Ryan +Över 1.5 +1.80 +Under 1.5 +1.90 + +Arizona Coyotes - San José Sharks + +Kessel, Phil +Över 2.5 +2.65 +Under 2.5 +1.42 +Keller, Clayton +Över 2.5 +2.30 +Under 2.5 +1.55 +Couture, Logan +Över 2.5 +1.90 +Under 2.5 +1.80 +Burns, Brent +Över 3.5 +2.40 +Under 3.5 +1.50 +Kane, Evander +Över 3.5 +2.20 +Under 3.5 +1.60 +Dvorak, Christian +Över 1.5 +1.80 +Under 1.5 +1.90 + +Calgary Flames - Winnipeg Jets + +Gaudreau, Johnny +Över 2.5 +2.10 +Under 2.5 +1.65 +Lindholm, Elias +Över 2.5 +2.30 +Under 2.5 +1.55 +Tkachuk, Matthew +Över 2.5 +1.67 +Under 2.5 +2.08 +Scheifele, Mark +Över 2.5 +2.40 +Under 2.5 +1.50 +Wheeler, Blake +Över 2.5 +2.35 +Under 2.5 +1.52 +Connor, Kyle +Över 2.5 +1.62 +Under 2.5 +2.15 \ No newline at end of file diff --git a/app/external/saved_bets/2021-03-27.bet365 b/app/external/saved_bets/2021-03-27.bet365 new file mode 100644 index 00000000..c463b313 --- /dev/null +++ b/app/external/saved_bets/2021-03-27.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04f01369e8d07023f44b88254fe34dcb38e45fb3d5d22c9d51aa06c416b57fd2 +size 2767 diff --git a/app/external/saved_bets/2021-03-27.betsson b/app/external/saved_bets/2021-03-27.betsson new file mode 100644 index 00000000..3c426fe9 --- /dev/null +++ b/app/external/saved_bets/2021-03-27.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c42f001c623eca26ce54789f8759601da373357ab515b0d86fe2f3ed04e89831 +size 4142 diff --git a/app/external/saved_bets/2021-03-27.betway b/app/external/saved_bets/2021-03-27.betway new file mode 100644 index 00000000..62da691d --- /dev/null +++ b/app/external/saved_bets/2021-03-27.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c068c82aa2eb01db2d0afe1bf8c0ca42e69f67fad725709a9cc53b23685716f +size 5452 diff --git a/app/external/saved_bets/2021-03-27.unibet b/app/external/saved_bets/2021-03-27.unibet new file mode 100644 index 00000000..80204f9f --- /dev/null +++ b/app/external/saved_bets/2021-03-27.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:530fdeddebfe3aa79d6aa7dd0391931ce317bdd05fce3e724353da2198d6de9d +size 2423 diff --git a/app/external/saved_bets/2021-03-27.wh b/app/external/saved_bets/2021-03-27.wh new file mode 100644 index 00000000..2d8b6672 --- /dev/null +++ b/app/external/saved_bets/2021-03-27.wh @@ -0,0 +1,230 @@ +Carolina Hurricanes - Tampa Bay Lightning + +Aho, Sebastian (1997) +Över 2.5 +1.85 +Under 2.5 +1.85 +Hamilton, Dougie +Över 2.5 +1.57 +Under 2.5 +2.25 +Svechnikov, Andrei +Över 2.5 +1.62 +Under 2.5 +2.15 +Stamkos, Steven +Över 2.5 +1.85 +Under 2.5 +1.85 +Hedman, Victor +Över 2.5 +2.10 +Under 2.5 +1.65 +Point, Brayden +Över 2.5 +2.35 +Under 2.5 +1.52 + +Pittsburgh Penguins - NY Islanders + +Crosby, Sidney +Över 2.5 +1.72 +Under 2.5 +2.00 +Letang, Kris +Över 2.5 +2.10 +Under 2.5 +1.65 +Guentzel, Jake +Över 2.5 +1.72 +Under 2.5 +2.00 +Barzal, Mathew +Över 2.5 +2.25 +Under 2.5 +1.57 +Nelson, Brock +Över 2.5 +2.00 +Under 2.5 +1.72 +Eberle, Jordan +Över 2.5 +2.20 +Under 2.5 +1.60 + +Toronto Maple Leafs - Edmonton Oilers + +Tavares, John +Över 2.5 +1.72 +Under 2.5 +2.00 +Marner, Mitch +Över 2.5 +1.75 +Under 2.5 +1.95 +Draisaitl, Leon +Över 2.5 +1.64 +Under 2.5 +2.12 +Nugent-Hopkins, Ryan +Över 2.5 +1.72 +Under 2.5 +2.00 +Matthews, Auston +Över 3.5 +1.50 +Under 3.5 +2.40 +McDavid, Connor +Över 3.5 +1.90 +Under 3.5 +1.80 + +Chicago Blackhawks - Nashville Predators + +DeBrincat, Alex +Över 2.5 +1.62 +Under 2.5 +2.15 +Kubalik, Dominik +Över 2.5 +1.90 +Under 2.5 +1.80 +Forsberg, Filip +Över 2.5 +1.50 +Under 2.5 +2.40 +Arvidsson, Viktor +Över 2.5 +1.65 +Under 2.5 +2.10 +Kane, Patrick +Över 3.5 +2.15 +Under 3.5 +1.62 +Johansen, Ryan +Över 1.5 +1.85 +Under 1.5 +1.85 + +Dallas Stars - Florida Panthers + +Benn, Jamie +Över 2.5 +2.05 +Under 2.5 +1.70 +Klingberg, John +Över 2.5 +2.50 +Under 2.5 +1.47 +Pavelski, Joe +Över 2.5 +2.35 +Under 2.5 +1.52 +Barkov, Aleksander +Över 2.5 +1.52 +Under 2.5 +2.35 +Huberdeau, Jonathan +Över 2.5 +2.35 +Under 2.5 +1.52 +Hörnqvist, Patric +Över 2.5 +1.52 +Under 2.5 +2.35 + +Arizona Coyotes - San José Sharks + +Kessel, Phil +Över 2.5 +2.80 +Under 2.5 +1.38 +Keller, Clayton +Över 2.5 +2.30 +Under 2.5 +1.55 +Couture, Logan +Över 2.5 +2.00 +Under 2.5 +1.72 +Burns, Brent +Över 3.5 +2.40 +Under 3.5 +1.50 +Kane, Evander +Över 3.5 +2.20 +Under 3.5 +1.60 +Dvorak, Christian +Över 1.5 +1.72 +Under 1.5 +2.00 + +Calgary Flames - Winnipeg Jets + +Gaudreau, Johnny +Över 2.5 +2.10 +Under 2.5 +1.65 +Lindholm, Elias +Över 2.5 +2.30 +Under 2.5 +1.55 +Tkachuk, Matthew +Över 2.5 +1.67 +Under 2.5 +2.08 +Scheifele, Mark +Över 2.5 +2.40 +Under 2.5 +1.50 +Wheeler, Blake +Över 2.5 +2.35 +Under 2.5 +1.52 +Connor, Kyle +Över 2.5 +1.55 +Under 2.5 +2.30 \ No newline at end of file diff --git a/app/external/saved_bets/2021-03-28.bet365 b/app/external/saved_bets/2021-03-28.bet365 new file mode 100644 index 00000000..49137472 --- /dev/null +++ b/app/external/saved_bets/2021-03-28.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7426ce44f7d4d79471e23675246196b3656012859749e7d81358901abb811a72 +size 2148 diff --git a/app/external/saved_bets/2021-03-28.betsson b/app/external/saved_bets/2021-03-28.betsson new file mode 100644 index 00000000..7c9bc8ca --- /dev/null +++ b/app/external/saved_bets/2021-03-28.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9db47d68b05963c1fb5a31b5ee427723733541d6709031edd2d429e11ef16be4 +size 1805 diff --git a/app/external/saved_bets/2021-03-28.betway b/app/external/saved_bets/2021-03-28.betway new file mode 100644 index 00000000..282a692d --- /dev/null +++ b/app/external/saved_bets/2021-03-28.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c0939243872c5c7bde60d85077f4e30911c93f98e0816279598220dc2c8fc91 +size 3076 diff --git a/app/external/saved_bets/2021-03-28.ss b/app/external/saved_bets/2021-03-28.ss new file mode 100644 index 00000000..36dda37b --- /dev/null +++ b/app/external/saved_bets/2021-03-28.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:823470bee2455cfde83e3e8e7ec305a1c129bb2a10ec9afe4571994b9fc674ff +size 372 diff --git a/app/external/saved_bets/2021-03-28.unibet b/app/external/saved_bets/2021-03-28.unibet new file mode 100644 index 00000000..87c66f5d --- /dev/null +++ b/app/external/saved_bets/2021-03-28.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7ccb0c97080ec908c3da729f9240069f3611b0eed1e0680f21914dee46fa8b5 +size 1028 diff --git a/app/external/saved_bets/2021-03-28.wh b/app/external/saved_bets/2021-03-28.wh new file mode 100644 index 00000000..e1d5e16a --- /dev/null +++ b/app/external/saved_bets/2021-03-28.wh @@ -0,0 +1,102 @@ +Boston Bruins - New Jersey Devils + +Marchand, Brad +Över 2.5 +1.95 +Under 2.5 +1.75 +Bergeron, Patrice +Över 2.5 +1.55 +Under 2.5 +2.30 +Palmieri, Kyle +Över 2.5 +2.10 +Under 2.5 +1.65 +Subban, P. K. +Över 2.5 +2.50 +Under 2.5 +1.47 +Hughes, Jack +Över 2.5 +2.40 +Under 2.5 +1.50 +Pastrnak, David +Över 3.5 +1.55 +Under 3.5 +2.30 + +Dallas Stars - Florida Panthers + +Benn, Jamie +Över 2.5 +2.05 +Under 2.5 +1.70 +Klingberg, John +Över 2.5 +2.50 +Under 2.5 +1.47 +Pavelski, Joe +Över 2.5 +2.35 +Under 2.5 +1.52 +Huberdeau, Jonathan +Över 2.5 +2.35 +Under 2.5 +1.52 +Ekblad, Aaron +Över 2.5 +1.72 +Under 2.5 +2.00 +Vatrano, Frank +Över 2.5 +1.80 +Under 2.5 +1.90 + +Chicago Blackhawks - Nashville Predators + +DeBrincat, Alex +Över 2.5 +1.62 +Under 2.5 +2.15 +Kubalik, Dominik +Över 2.5 +1.90 +Under 2.5 +1.80 +Forsberg, Filip +Över 2.5 +1.60 +Under 2.5 +2.20 +Arvidsson, Viktor +Över 2.5 +1.65 +Under 2.5 +2.10 +Johansen, Ryan +Över 1.5 +1.85 +Under 1.5 +1.85 +Kane, Patrick +Över 3.5 +2.15 +Under 3.5 +1.62 + + + + diff --git a/app/external/saved_bets/2021-03-29.bet365 b/app/external/saved_bets/2021-03-29.bet365 new file mode 100644 index 00000000..0e7e1621 --- /dev/null +++ b/app/external/saved_bets/2021-03-29.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a9fcb722f9192273e839dd2b36172fe7f8c00149913920b66966677b54869ae +size 4214 diff --git a/app/external/saved_bets/2021-03-29.betsson b/app/external/saved_bets/2021-03-29.betsson new file mode 100644 index 00000000..427ef1ee --- /dev/null +++ b/app/external/saved_bets/2021-03-29.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8992eec60640f08542b2038661751cb896cdfe13ec4b7a741dccfe6f968c729a +size 3377 diff --git a/app/external/saved_bets/2021-03-29.betway b/app/external/saved_bets/2021-03-29.betway new file mode 100644 index 00000000..d05dcfd3 --- /dev/null +++ b/app/external/saved_bets/2021-03-29.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78aca965f8b36bad8453fcaa85e5db885ece7e8b96b05e20a072d37e53495ad3 +size 5797 diff --git a/app/external/saved_bets/2021-03-29.ss b/app/external/saved_bets/2021-03-29.ss new file mode 100644 index 00000000..4080b7dc --- /dev/null +++ b/app/external/saved_bets/2021-03-29.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a301bbd672a3e414ecf871af7bcf4b72dea8fe748b01a86bdd5a0da923b16693 +size 917 diff --git a/app/external/saved_bets/2021-03-29.unibet b/app/external/saved_bets/2021-03-29.unibet new file mode 100644 index 00000000..f756746a --- /dev/null +++ b/app/external/saved_bets/2021-03-29.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27e8bb4865a61ecaad5c8041969cc346a1d9485e093b53ca63aad234927c6ff7 +size 2396 diff --git a/app/external/saved_bets/2021-03-29.wh b/app/external/saved_bets/2021-03-29.wh new file mode 100644 index 00000000..7c2b7672 --- /dev/null +++ b/app/external/saved_bets/2021-03-29.wh @@ -0,0 +1,230 @@ +Buffalo Sabres - Philadelphia Flyers + +Dahlin, Rasmus +Över 2.5 +2.50 +Under 2.5 +1.47 +Reinhart, Sam +Över 2.5 +2.25 +Under 2.5 +1.57 +Hall, Taylor +Över 2.5 +1.95 +Under 2.5 +1.75 +Giroux, Claude +Över 2.5 +2.10 +Under 2.5 +1.65 +Couturier, Sean +Över 2.5 +1.95 +Under 2.5 +1.75 +Hayes, Kevin +Över 2.5 +2.10 +Under 2.5 +1.65 + +Pittsburgh Penguins - NY Islanders + +Crosby, Sidney +Över 2.5 +1.67 +Under 2.5 +2.07 +Letang, Kris +Över 2.5 +2.10 +Under 2.5 +1.65 +Guentzel, Jake +Över 2.5 +1.72 +Under 2.5 +2.00 +Barzal, Mathew +Över 2.5 +2.25 +Under 2.5 +1.57 +Nelson, Brock +Över 2.5 +2.10 +Under 2.5 +1.65 +Eberle, Jordan +Över 2.5 +2.20 +Under 2.5 +1.60 + +Toronto Maple Leafs - Edmonton Oilers + +Tavares, John +Över 2.5 +1.65 +Under 2.5 +2.10 +Marner, Mitch +Över 2.5 +1.65 +Under 2.5 +2.10 +Draisaitl, Leon +Över 2.5 +1.72 +Under 2.5 +2.00 +Nugent-Hopkins, Ryan +Över 2.5 +1.80 +Under 2.5 +1.90 +Matthews, Auston +Över 3.5 +1.50 +Under 3.5 +2.40 +McDavid, Connor +Över 3.5 +1.90 +Under 3.5 +1.80 + +Colorado Avalanche - Anaheim Ducks + +Landeskog, Gabriel +Över 2.5 +1.75 +Under 2.5 +1.95 +Rantanen, Mikko +Över 2.5 +1.55 +Under 2.5 +2.30 +Silfverberg, Jakob +Över 2.5 +2.85 +Under 2.5 +1.37 +Rakell, Rickard +Över 2.5 +1.90 +Under 2.5 +1.80 +MacKinnon, Nathan +Över 3.5 +1.62 +Under 3.5 +2.15 +Getzlaf, Ryan +Över 1.5 +1.80 +Under 1.5 +1.90 + +Calgary Flames - Winnipeg Jets + +Gaudreau, Johnny +Över 2.5 +2.10 +Under 2.5 +1.65 +Lindholm, Elias +Över 2.5 +2.30 +Under 2.5 +1.55 +Tkachuk, Matthew +Över 2.5 +1.72 +Under 2.5 +2.00 +Scheifele, Mark +Över 2.5 +2.40 +Under 2.5 +1.50 +Wheeler, Blake +Över 2.5 +2.35 +Under 2.5 +1.52 +Connor, Kyle +Över 2.5 +1.52 +Under 2.5 +2.35 + +Vegas Golden Knights - Los Angeles Kings + +Marchessault, Jonathan +Över 2.5 +1.70 +Under 2.5 +2.05 +Stone, Mark +Över 2.5 +2.35 +Under 2.5 +1.52 +Brown, Dustin +Över 2.5 +1.78 +Under 2.5 +1.92 +Pacioretty, Max +Över 3.5 +1.80 +Under 3.5 +1.90 +Doughty, Drew +Över 1.5 +1.72 +Under 1.5 +2.00 +Kopitar, Anze +Över 1.5 +1.52 +Under 1.5 +2.35 + +San José Sharks - Minnesota Wild + +Burns, Brent +Över 3.5 +2.55 +Under 3.5 +1.45 +Kane, Evander +Över 3.5 +2.25 +Under 3.5 +1.57 +Couture, Logan +Över 2.5 +2.15 +Under 2.5 +1.62 +Fiala, Kevin +Över 2.5 +1.75 +Under 2.5 +1.95 +Zuccarello, Mats +Över 1.5 +1.57 +Under 1.5 +2.25 +Suter, Ryan +Över 1.5 +1.85 +Under 1.5 +1.85 \ No newline at end of file diff --git a/app/external/saved_bets/2021-03-30.bet365 b/app/external/saved_bets/2021-03-30.bet365 new file mode 100644 index 00000000..1bb9a4d0 --- /dev/null +++ b/app/external/saved_bets/2021-03-30.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0fc52b4a1e1914653e7649f7a834f5053603c2187a97d6101ce17febf4ab627 +size 4426 diff --git a/app/external/saved_bets/2021-03-30.betsson b/app/external/saved_bets/2021-03-30.betsson new file mode 100644 index 00000000..99967d38 --- /dev/null +++ b/app/external/saved_bets/2021-03-30.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8cd5c8775d67ed8fb7e172615496f45362880b72785d270e0205b36a713edf9d +size 3763 diff --git a/app/external/saved_bets/2021-03-30.betway b/app/external/saved_bets/2021-03-30.betway new file mode 100644 index 00000000..31e4e341 --- /dev/null +++ b/app/external/saved_bets/2021-03-30.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f41a03964a2e5dcf3084668335de56c027005c610ed230d7c78af00621549e87 +size 5564 diff --git a/app/external/saved_bets/2021-03-30.ss b/app/external/saved_bets/2021-03-30.ss new file mode 100644 index 00000000..4970d842 --- /dev/null +++ b/app/external/saved_bets/2021-03-30.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b79bcfc46d09787bd65cf5ef84a480cc5ecc359b615823a6445317db6fd3d022 +size 770 diff --git a/app/external/saved_bets/2021-03-30.unibet b/app/external/saved_bets/2021-03-30.unibet new file mode 100644 index 00000000..abe0e1b6 --- /dev/null +++ b/app/external/saved_bets/2021-03-30.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acfb72e86cb7bc16ea49037b897588d06bb4a8e087a27ffa8a97649ac43de612 +size 2444 diff --git a/app/external/saved_bets/2021-03-30.wh b/app/external/saved_bets/2021-03-30.wh new file mode 100644 index 00000000..ec3453eb --- /dev/null +++ b/app/external/saved_bets/2021-03-30.wh @@ -0,0 +1,231 @@ +Boston Bruins - New Jersey Devils + +Marchand, Brad +Över 2.5 +1.95 +Under 2.5 +1.75 +Bergeron, Patrice +Över 2.5 +1.55 +Under 2.5 +2.30 +Palmieri, Kyle +Över 2.5 +2.10 +Under 2.5 +1.65 +Subban, P. K. +Över 2.5 +2.50 +Under 2.5 +1.47 +Hughes, Jack +Över 2.5 +2.55 +Under 2.5 +1.45 +Pastrnak, David +Över 3.5 +1.55 +Under 3.5 +2.30 + +Florida Panthers - Detroit Red Wings + +Huberdeau, Jonathan +Över 2.5 +2.15 +Under 2.5 +1.62 +Vatrano, Frank +Över 2.5 +1.95 +Under 2.5 +1.75 +Larkin, Dylan +Över 2.5 +1.70 +Under 2.5 +2.02 +Mantha, Anthony +Över 2.5 +2.10 +Under 2.5 +1.65 +Yandle, Keith +Över 1.5 +1.68 +Under 1.5 +2.05 +Hronek, Filip +Över 1.5 +1.52 +Under 1.5 +2.35 + +Montreal Canadiens - Edmonton Oilers + +Gallagher, Brendan +Över 3.5 +1.90 +Under 3.5 +1.80 +McDavid, Connor +Över 3.5 +1.88 +Under 3.5 +1.82 +Weber, Shea +Över 2.5 +2.30 +Under 2.5 +1.55 +Draisaitl, Leon +Över 2.5 +1.70 +Under 2.5 +2.02 +Nugent-Hopkins, Ryan +Över 2.5 +1.80 +Under 2.5 +1.90 +Drouin, Jonathan +Över 1.5 +1.57 +Under 1.5 +2.25 + +NY Rangers - Washington Capitals + +Zibanejad, Mika +Över 3.5 +2.10 +Under 3.5 +1.65 +Ovechkin, Alexander +Över 4.5 +2.20 +Under 4.5 +1.60 +Panarin, Artemi +Över 2.5 +1.75 +Under 2.5 +1.95 +Kreider, Chris +Över 2.5 +2.10 +Under 2.5 +1.65 +Bäckström, Nicklas +Över 2.5 +2.35 +Under 2.5 +1.52 +Kuznetsov, Evgeny +Över 2.5 +2.40 +Under 2.5 +1.50 + +Tampa Bay Lightning - Columbus Blue Jackets + +Stamkos, Steven +Över 2.5 +1.78 +Under 2.5 +1.92 +Hedman, Victor +Över 2.5 +2.05 +Under 2.5 +1.68 +Point, Brayden +Över 2.5 +2.25 +Under 2.5 +1.57 +Atkinson, Cam +Över 2.5 +1.92 +Under 2.5 +1.78 +Laine, Patrik +Över 2.5 +1.95 +Under 2.5 +1.75 +Björkstrand, Oliver +Över 2.5 +2.10 +Under 2.5 +1.65 + +Chicago Blackhawks - Carolina Hurricanes + +Kane, Patrick +Över 3.5 +2.25 +Under 3.5 +1.57 +DeBrincat, Alex +Över 2.5 +1.65 +Under 2.5 +2.10 +Kubalik, Dominik +Över 2.5 +2.00 +Under 2.5 +1.72 +Aho, Sebastian (1997) +Över 2.5 +1.75 +Under 2.5 +1.95 +Hamilton, Dougie +Över 2.5 +1.60 +Under 2.5 +2.20 +Svechnikov, Andrei +Över 2.5 +1.62 +Under 2.5 +2.15 + +Nashville Predators - Dallas Stars + +Johansen, Ryan +Över 1.5 +1.85 +Under 1.5 +1.85 +Forsberg, Filip +Över 2.5 +1.60 +Under 2.5 +2.20 +Arvidsson, Viktor +Över 2.5 +1.65 +Under 2.5 +2.10 +Benn, Jamie +Över 2.5 +2.05 +Under 2.5 +1.70 +Klingberg, John +Över 2.5 +2.50 +Under 2.5 +1.47 +Pavelski, Joe +Över 2.5 +2.35 +Under 2.5 +1.52 + diff --git a/app/external/saved_bets/2021-03-31.bet365 b/app/external/saved_bets/2021-03-31.bet365 new file mode 100644 index 00000000..d418670e --- /dev/null +++ b/app/external/saved_bets/2021-03-31.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:538724f09059676d190090735de1946895face59af09aff04f96ebe3a213df8f +size 3562 diff --git a/app/external/saved_bets/2021-03-31.betsson b/app/external/saved_bets/2021-03-31.betsson new file mode 100644 index 00000000..3d78d642 --- /dev/null +++ b/app/external/saved_bets/2021-03-31.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b074f8382d181f386225d5c917838b4ac5deecab4469da222315cf08308d3fc3 +size 3317 diff --git a/app/external/saved_bets/2021-03-31.betway b/app/external/saved_bets/2021-03-31.betway new file mode 100644 index 00000000..b118cb2d --- /dev/null +++ b/app/external/saved_bets/2021-03-31.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db4ea7c4eaa658cd183a0e25cb714d2cdc3903887195fab32161242cb4235884 +size 4953 diff --git a/app/external/saved_bets/2021-03-31.ss b/app/external/saved_bets/2021-03-31.ss new file mode 100644 index 00000000..690db046 --- /dev/null +++ b/app/external/saved_bets/2021-03-31.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6728e8b893a942044482c6a303f2f1def18a2d3b7f6a0fe6777960768f3ae25 +size 446 diff --git a/app/external/saved_bets/2021-03-31.unibet b/app/external/saved_bets/2021-03-31.unibet new file mode 100644 index 00000000..86ffecd5 --- /dev/null +++ b/app/external/saved_bets/2021-03-31.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d282ccc4d977ddf8ca57fd35f35c01a0ffec2b7a91c782d629b7e968af5b2cf0 +size 1698 diff --git a/app/external/saved_bets/2021-03-31.wh b/app/external/saved_bets/2021-03-31.wh new file mode 100644 index 00000000..44b5a7f5 --- /dev/null +++ b/app/external/saved_bets/2021-03-31.wh @@ -0,0 +1,159 @@ +Buffalo Sabres - Philadelphia Flyers +Dahlin, Rasmus +Över 2.5 +2.50 +Under 2.5 +1.47 +Reinhart, Sam +Över 2.5 +2.25 +Under 2.5 +1.57 +Hall, Taylor +Över 2.5 +2.00 +Under 2.5 +1.72 +Giroux, Claude +Över 2.5 +2.10 +Under 2.5 +1.65 +Couturier, Sean +Över 2.5 +1.95 +Under 2.5 +1.75 +Hayes, Kevin +Över 2.5 +2.10 +Under 2.5 +1.65 + +Winnipeg Jets - Toronto Maple Leafs +Scheifele, Mark +Över 2.5 +2.40 +Under 2.5 +1.50 +Wheeler, Blake +Över 2.5 +2.35 +Under 2.5 +1.52 +Connor, Kyle +Över 2.5 +1.55 +Under 2.5 +2.30 +Tavares, John +Över 2.5 +1.67 +Under 2.5 +2.08 +Marner, Mitch +Över 2.5 +1.65 +Under 2.5 +2.10 +Matthews, Auston +Över 3.5 +1.55 +Under 3.5 +2.30 + +Colorado Avalanche - Arizona Coyotes +MacKinnon, Nathan +Över 3.5 +1.62 +Under 3.5 +2.15 +Landeskog, Gabriel +Över 2.5 +1.72 +Under 2.5 +2.00 +Rantanen, Mikko +Över 2.5 +1.55 +Under 2.5 +2.30 +Kessel, Phil +Över 2.5 +2.85 +Under 2.5 +1.37 +Keller, Clayton +Över 2.5 +2.40 +Under 2.5 +1.50 +Dvorak, Christian +Över 1.5 +1.72 +Under 1.5 +2.00 + +Vegas Golden Knights - Los Angeles Kings +Marchessault, Jonathan +Över 2.5 +1.70 +Under 2.5 +2.05 +Stone, Mark +Över 2.5 +2.50 +Under 2.5 +1.47 +Brown, Dustin +Över 2.5 +1.78 +Under 2.5 +1.92 +Pacioretty, Max +Över 3.5 +1.75 +Under 3.5 +1.95 +Doughty, Drew +Över 1.5 +1.72 +Under 1.5 +2.00 +Kopitar, Anze +Över 1.5 +1.52 +Under 1.5 +2.35 + +San José Sharks - Minnesota Wild +Burns, Brent +Över 3.5 +2.85 +Under 3.5 +1.37 +Kane, Evander +Över 3.5 +2.25 +Under 3.5 +1.57 +Couture, Logan +Över 2.5 +2.15 +Under 2.5 +1.62 +Fiala, Kevin +Över 2.5 +1.75 +Under 2.5 +1.95 +Zuccarello, Mats +Över 1.5 +1.57 +Under 1.5 +2.25 +Suter, Ryan +Över 1.5 +1.85 +Under 1.5 +1.85 \ No newline at end of file diff --git a/app/external/saved_bets/2021-04-01.bet365 b/app/external/saved_bets/2021-04-01.bet365 new file mode 100644 index 00000000..fd25dc05 --- /dev/null +++ b/app/external/saved_bets/2021-04-01.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2fa5dc2460e17b9c33a17f36221735d4c20755c33eb7dcaaa8102e178707048 +size 6196 diff --git a/app/external/saved_bets/2021-04-01.betsson b/app/external/saved_bets/2021-04-01.betsson new file mode 100644 index 00000000..93a062d9 --- /dev/null +++ b/app/external/saved_bets/2021-04-01.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53f23393fbf0b47e6343003a89a5953a01f602213938be7ef622ad4103fa9724 +size 4733 diff --git a/app/external/saved_bets/2021-04-01.betway b/app/external/saved_bets/2021-04-01.betway new file mode 100644 index 00000000..80d94f01 --- /dev/null +++ b/app/external/saved_bets/2021-04-01.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70aa8ec4c2d1ff5d21b8887dd59fd7e14443d2e8e6babf0bfbcae32883265a6e +size 8020 diff --git a/app/external/saved_bets/2021-04-01.ss b/app/external/saved_bets/2021-04-01.ss new file mode 100644 index 00000000..db4bb236 --- /dev/null +++ b/app/external/saved_bets/2021-04-01.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c5c347a3fc8fa8c318c8e3ade6dbd6e3e584fb68fa6041bf70db97e5880a2c6 +size 450 diff --git a/app/external/saved_bets/2021-04-01.unibet b/app/external/saved_bets/2021-04-01.unibet new file mode 100644 index 00000000..df615ca7 --- /dev/null +++ b/app/external/saved_bets/2021-04-01.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad29b3293916fadcd6daca42eea8e78d83758ae3e4c1eb216713064fc034b51d +size 3095 diff --git a/app/external/saved_bets/2021-04-01.wh b/app/external/saved_bets/2021-04-01.wh new file mode 100644 index 00000000..cb51ca49 --- /dev/null +++ b/app/external/saved_bets/2021-04-01.wh @@ -0,0 +1,287 @@ +Boston Bruins - Pittsburgh Penguins +Pastrnak, David +Över 3.5 +1.57 +Under 3.5 +2.25 +Marchand, Brad +Över 2.5 +1.95 +Under 2.5 +1.75 +Bergeron, Patrice +Över 2.5 +1.57 +Under 2.5 +2.25 +Crosby, Sidney +Över 2.5 +1.67 +Under 2.5 +2.07 +Letang, Kris +Över 2.5 +2.10 +Under 2.5 +1.65 +Guentzel, Jake +Över 2.5 +1.72 +Under 2.5 +2.00 + +Buffalo Sabres - NY Rangers +Zibanejad, Mika +Över 3.5 +2.10 +Under 3.5 +1.65 +Dahlin, Rasmus +Över 2.5 +2.55 +Under 2.5 +1.45 +Reinhart, Sam +Över 2.5 +2.25 +Under 2.5 +1.57 +Hall, Taylor +Över 2.5 +2.00 +Under 2.5 +1.72 +Panarin, Artemi +Över 2.5 +1.72 +Under 2.5 +2.00 +Kreider, Chris +Över 2.5 +2.10 +Under 2.5 +1.65 + +Florida Panthers - Detroit Red Wings +Huberdeau, Jonathan +Över 2.5 +2.15 +Under 2.5 +1.62 +Vatrano, Frank +Över 2.5 +1.95 +Under 2.5 +1.75 +Larkin, Dylan +Över 2.5 +1.62 +Under 2.5 +2.15 +Mantha, Anthony +Över 2.5 +2.10 +Under 2.5 +1.65 +Yandle, Keith +Över 1.5 +1.65 +Under 1.5 +2.10 +Hronek, Filip +Över 1.5 +1.52 +Under 1.5 +2.35 + +NY Islanders - Washington Capitals +Ovechkin, Alexander +Över 4.5 +2.20 +Under 4.5 +1.60 +Barzal, Mathew +Över 2.5 +2.25 +Under 2.5 +1.57 +Nelson, Brock +Över 2.5 +2.10 +Under 2.5 +1.65 +Eberle, Jordan +Över 2.5 +2.20 +Under 2.5 +1.60 +Bäckström, Nicklas +Över 2.5 +2.35 +Under 2.5 +1.52 +Kuznetsov, Evgeny +Över 2.5 +2.40 +Under 2.5 +1.50 + +Ottawa Senators - Montreal Canadiens +Tkachuk, Brady +Över 3.5 +2.00 +Under 3.5 +1.72 +Gallagher, Brendan +Över 3.5 +1.92 +Under 3.5 +1.78 +Chabot, Thomas +Över 2.5 +2.05 +Under 2.5 +1.68 +Dadonov, Evgeny +Över 2.5 +2.20 +Under 2.5 +1.60 +Weber, Shea +Över 2.5 +2.25 +Under 2.5 +1.57 +Drouin, Jonathan +Över 1.5 +1.57 +Under 1.5 +2.25 + +Tampa Bay Lightning - Columbus Blue +Stamkos, Steven +Över 2.5 +1.80 +Under 2.5 +1.90 +Hedman, Victor +Över 2.5 +1.95 +Under 2.5 +1.75 +Point, Brayden +Över 2.5 +2.25 +Under 2.5 +1.57 +Atkinson, Cam +Över 2.5 +1.92 +Under 2.5 +1.78 +Laine, Patrik +Över 2.5 +2.08 +Under 2.5 +1.67 +Björkstrand, Oliver +Över 2.5 +2.10 +Under 2.5 +1.65 + +Chicago Blackhawks - Carolina Hurrican +Kane, Patrick +Över 3.5 +2.25 +Under 3.5 +1.57 +DeBrincat, Alex +Över 2.5 +1.65 +Under 2.5 +2.10 +Kubalik, Dominik +Över 2.5 +2.00 +Under 2.5 +1.72 +Aho, Sebastian (1997) +Över 2.5 +1.75 +Under 2.5 +1.95 +Hamilton, Dougie +Över 2.5 +1.60 +Under 2.5 +2.20 +Svechnikov, Andrei +Över 2.5 +1.68 +Under 2.5 +2.05 + +Nashville Predators - Dallas Stars +Josi, Roman +Över 2.5 +1.55 +Under 2.5 +2.30 +Arvidsson, Viktor +Över 2.5 +1.65 +Under 2.5 +2.10 +Benn, Jamie +Över 2.5 +2.05 +Under 2.5 +1.70 +Klingberg, John +Över 2.5 +2.50 +Under 2.5 +1.47 +Pavelski, Joe +Över 2.5 +2.35 +Under 2.5 +1.52 +Johansen, Ryan +Över 1.5 +1.85 +Under 1.5 +1.85 + +Vegas Golden Knights - Minnesota Wild +Pacioretty, Max +Över 3.5 +1.75 +Under 3.5 +1.95 +Marchessault, Jonathan +Över 2.5 +1.70 +Under 2.5 +2.05 +Stone, Mark +Över 2.5 +2.50 +Under 2.5 +1.47 +Fiala, Kevin +Över 2.5 +1.80 +Under 2.5 +1.90 +Zuccarello, Mats +Över 1.5 +1.65 +Under 1.5 +2.10 +Suter, Ryan +Över 1.5 +1.90 +Under 1.5 +1.80 \ No newline at end of file diff --git a/app/external/saved_bets/2021-04-02.bet365 b/app/external/saved_bets/2021-04-02.bet365 new file mode 100644 index 00000000..2e4b752c --- /dev/null +++ b/app/external/saved_bets/2021-04-02.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a04f2b1b61e72bfae6f0da3b2c7d83de86b01d4321c41b8bae2fc5873765fc9d +size 3875 diff --git a/app/external/saved_bets/2021-04-02.betsson b/app/external/saved_bets/2021-04-02.betsson new file mode 100644 index 00000000..f8db0517 --- /dev/null +++ b/app/external/saved_bets/2021-04-02.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc6a30ff99480de386fdba409dd0708ff3a167bbb44c33649692e69117db5101 +size 4374 diff --git a/app/external/saved_bets/2021-04-02.betway b/app/external/saved_bets/2021-04-02.betway new file mode 100644 index 00000000..f60f03c5 --- /dev/null +++ b/app/external/saved_bets/2021-04-02.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a842f0a462e552e6648554c12bb70f6d2842daeda12ed56dbc5b53a1e9f624f0 +size 5287 diff --git a/app/external/saved_bets/2021-04-02.unibet b/app/external/saved_bets/2021-04-02.unibet new file mode 100644 index 00000000..11ace84d --- /dev/null +++ b/app/external/saved_bets/2021-04-02.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77160a442f05a94d173af7abf171a9d62329f958ec3ea19d9e8515a56df28ba1 +size 2055 diff --git a/app/external/saved_bets/2021-04-02.wh b/app/external/saved_bets/2021-04-02.wh new file mode 100644 index 00000000..041f22be --- /dev/null +++ b/app/external/saved_bets/2021-04-02.wh @@ -0,0 +1,191 @@ +New Jersey Devils - Washington Capitals +Ovechkin, Alexander +Över 4.5 +2.15 +Under 4.5 +1.62 +Palmieri, Kyle +Över 2.5 +2.10 +Under 2.5 +1.65 +Subban, P. K. +Över 2.5 +2.50 +Under 2.5 +1.47 +Hughes, Jack +Över 2.5 +2.40 +Under 2.5 +1.50 +Bäckström, Nicklas +Över 2.5 +2.30 +Under 2.5 +1.55 +Kuznetsov, Evgeny +Över 2.5 +2.35 +Under 2.5 +1.52 + +Winnipeg Jets - Toronto Maple Leafs +Matthews, Auston +Över 3.5 +1.62 +Under 3.5 +2.15 +Scheifele, Mark +Över 2.5 +2.40 +Under 2.5 +1.50 +Wheeler, Blake +Över 2.5 +2.35 +Under 2.5 +1.52 +Connor, Kyle +Över 2.5 +1.55 +Under 2.5 +2.30 +Tavares, John +Över 2.5 +1.67 +Under 2.5 +2.08 +Marner, Mitch +Över 2.5 +1.65 +Under 2.5 +2.10 + +Colorado Avalanche - St Louis Blues +MacKinnon, Nathan +Över 3.5 +1.62 +Under 3.5 +2.15 +Landeskog, Gabriel +Över 2.5 +1.80 +Under 2.5 +1.90 +Rantanen, Mikko +Över 2.5 +1.65 +Under 2.5 +2.10 +Krug, Torey +Över 2.5 +2.20 +Under 2.5 +1.60 +Perron, David +Över 2.5 +2.10 +Under 2.5 +1.65 +O'Reilly, Ryan +Över 1.5 +1.57 +Under 1.5 +2.25 + +Edmonton Oilers - Calgary Flames +McDavid, Connor +Över 3.5 +1.88 +Under 3.5 +1.82 +Draisaitl, Leon +Över 2.5 +1.70 +Under 2.5 +2.02 +Nugent-Hopkins, Ryan +Över 2.5 +1.80 +Under 2.5 +1.90 +Gaudreau, Johnny +Över 2.5 +2.10 +Under 2.5 +1.65 +Lindholm, Elias +Över 2.5 +2.30 +Under 2.5 +1.55 +Tkachuk, Matthew +Över 2.5 +1.85 +Under 2.5 +1.85 + +Anaheim Ducks - Arizona Coyotes +Rakell, Rickard +Över 2.5 +1.80 +Under 2.5 +1.90 +Keller, Clayton +Över 2.5 +2.30 +Under 2.5 +1.55 +Kessel, Phil +Över 2.5 +2.65 +Under 2.5 +1.42 +Getzlaf, Ryan +Över 1.5 +1.72 +Under 1.5 +2.00 +Silfverberg, Jakob +Över 1.5 +1.62 +Under 1.5 +2.15 +Dvorak, Christian +Över 1.5 +1.68 +Under 1.5 +2.05 + +Los Angeles Kings - San José Sharks +Kane, Evander +Över 3.5 +2.40 +Under 3.5 +1.50 +Brown, Dustin +Över 2.5 +1.75 +Under 2.5 +1.95 +Burns, Brent +Över 2.5 +2.00 +Under 2.5 +1.72 +Couture, Logan +Över 2.5 +2.30 +Under 2.5 +1.55 +Doughty, Drew +Över 1.5 +1.68 +Under 1.5 +2.05 +Kopitar, Anze +Över 1.5 +1.45 +Under 1.5 +2.55 \ No newline at end of file diff --git a/app/external/saved_bets/2021-04-04.bet365 b/app/external/saved_bets/2021-04-04.bet365 new file mode 100644 index 00000000..72f7652b --- /dev/null +++ b/app/external/saved_bets/2021-04-04.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d06fefd65c2d89d76683245ace020d6450b6ff198fdbe86f4f20a99e3275cb36 +size 2462 diff --git a/app/external/saved_bets/2021-04-04.betsson b/app/external/saved_bets/2021-04-04.betsson new file mode 100644 index 00000000..d79b900e --- /dev/null +++ b/app/external/saved_bets/2021-04-04.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9f502b0e920ee8a01799882d61b0cc472abc8e41d1acd8a43cdfe6a0644ea72 +size 2919 diff --git a/app/external/saved_bets/2021-04-04.betway b/app/external/saved_bets/2021-04-04.betway new file mode 100644 index 00000000..9bdbb14e --- /dev/null +++ b/app/external/saved_bets/2021-04-04.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b105c15a932696c5723c3f6428f47568b7d16cc3b8ded632e9a1ef91ec527be7 +size 3384 diff --git a/app/external/saved_bets/2021-04-04.unibet b/app/external/saved_bets/2021-04-04.unibet new file mode 100644 index 00000000..2945a12d --- /dev/null +++ b/app/external/saved_bets/2021-04-04.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ddcaa86a163938d4f6fe5e6afc3715cb08cfcf95a05a40e5de7d1d69ee7a41d6 +size 1382 diff --git a/app/external/saved_bets/2021-04-04.wh b/app/external/saved_bets/2021-04-04.wh new file mode 100644 index 00000000..29b98cec --- /dev/null +++ b/app/external/saved_bets/2021-04-04.wh @@ -0,0 +1,127 @@ +Florida Panthers - Columbus Blue Jackets +Yandle, Keith +Över 1.5 +1.65 +Under 1.5 +2.10 +Huberdeau, Jonathan +Över 2.5 +2.20 +Under 2.5 +1.60 +Vatrano, Frank +Över 2.5 +2.10 +Under 2.5 +1.65 +Atkinson, Cam +Över 2.5 +1.85 +Under 2.5 +1.85 +Laine, Patrik +Över 2.5 +2.10 +Under 2.5 +1.65 +Björkstrand, Oliver +Över 2.5 +2.00 +Under 2.5 +1.72 + +Carolina Hurricanes - Dallas Stars +Aho, Sebastian (1997) +Över 2.5 +1.75 +Under 2.5 +1.95 +Hamilton, Dougie +Över 2.5 +1.60 +Under 2.5 +2.20 +Svechnikov, Andrei +Över 2.5 +1.70 +Under 2.5 +2.02 +Benn, Jamie +Över 2.5 +2.15 +Under 2.5 +1.62 +Klingberg, John +Över 2.5 +2.65 +Under 2.5 +1.42 +Pavelski, Joe +Över 2.5 +2.40 +Under 2.5 +1.50 + +Anaheim Ducks - Arizona Coyotes +Rakell, Rickard +Över 2.5 +1.80 +Under 2.5 +1.90 +Kessel, Phil +Över 2.5 +2.65 +Under 2.5 +1.42 +Keller, Clayton +Över 2.5 +2.30 +Under 2.5 +1.55 +Getzlaf, Ryan +Över 1.5 +1.72 +Under 1.5 +2.00 +Silfverberg, Jakob +Över 1.5 +1.62 +Under 1.5 +2.15 +Dvorak, Christian +Över 1.5 +1.68 +Under 1.5 +2.05 + +Calgary Flames - Toronto Maple Leafs +Matthews, Auston +Över 3.5 +1.65 +Under 3.5 +2.10 +Gaudreau, Johnny +Över 2.5 +2.10 +Under 2.5 +1.65 +Lindholm, Elias +Över 2.5 +2.30 +Under 2.5 +1.55 +Tkachuk, Matthew +Över 2.5 +1.95 +Under 2.5 +1.75 +Tavares, John +Över 2.5 +1.67 +Under 2.5 +2.08 +Marner, Mitch +Över 2.5 +1.72 +Under 2.5 +2.00 \ No newline at end of file diff --git a/app/external/saved_bets/2021-04-05.bet365 b/app/external/saved_bets/2021-04-05.bet365 new file mode 100644 index 00000000..d338b5e3 --- /dev/null +++ b/app/external/saved_bets/2021-04-05.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b651901e4f87f98fe4d96c1eefa27469f3d17d994e23cb13d8ab0250853b30cf +size 4701 diff --git a/app/external/saved_bets/2021-04-05.betsson b/app/external/saved_bets/2021-04-05.betsson new file mode 100644 index 00000000..83eba2d0 --- /dev/null +++ b/app/external/saved_bets/2021-04-05.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:930456707d14aa10a55bc55af7c758dbb2f3e29c371960a193eb3617af45deef +size 3015 diff --git a/app/external/saved_bets/2021-04-05.betway b/app/external/saved_bets/2021-04-05.betway new file mode 100644 index 00000000..4e533d59 --- /dev/null +++ b/app/external/saved_bets/2021-04-05.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8257964614f642a1ad49745e846dced85515290849e2d3a405eadd7a73c11d4 +size 6639 diff --git a/app/external/saved_bets/2021-04-05.ss b/app/external/saved_bets/2021-04-05.ss new file mode 100644 index 00000000..4650a921 --- /dev/null +++ b/app/external/saved_bets/2021-04-05.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cba30be0a362b42f0e3f84d02c01c827c1127d9ce37d882c996ca3bd837b0522 +size 764 diff --git a/app/external/saved_bets/2021-04-05.unibet b/app/external/saved_bets/2021-04-05.unibet new file mode 100644 index 00000000..252a0705 --- /dev/null +++ b/app/external/saved_bets/2021-04-05.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae83081cde279117ba67e9c1694a6a712944bb3f7a932f993b2ccbeff48d6c3c +size 2398 diff --git a/app/external/saved_bets/2021-04-05.wh b/app/external/saved_bets/2021-04-05.wh new file mode 100644 index 00000000..a2f79b77 --- /dev/null +++ b/app/external/saved_bets/2021-04-05.wh @@ -0,0 +1,217 @@ +Boston Bruins - Philadelphia Flyers +Marchand, Brad +Över 2.5 +1.80 +Under 2.5 +1.90 +Giroux, Claude +Över 2.5 +2.15 +Under 2.5 +1.62 +Couturier, Sean +Över 2.5 +2.15 +Under 2.5 +1.62 +Hayes, Kevin +Över 2.5 +2.20 +Under 2.5 +1.60 +Bergeron, Patrice +Över 2.5 +1.72 +Under 2.5 +2.00 +Pastrnak, David +Över 3.5 +1.55 +Under 3.5 +2.30 +Montreal Canadiens - Edmonton Oilers +Gallagher, Brendan +Över 3.5 +1.85 +Under 3.5 +1.85 +McDavid, Connor +Över 3.5 +1.90 +Under 3.5 +1.80 +Weber, Shea +Över 2.5 +2.30 +Under 2.5 +1.55 +Draisaitl, Leon +Över 2.5 +1.70 +Under 2.5 +2.05 +Nugent-Hopkins, Ryan +Över 2.5 +1.80 +Under 2.5 +1.90 +Drouin, Jonathan +Över 1.5 +1.57 +Under 1.5 +2.25 +Winnipeg Jets - Ottawa Senators +Scheifele, Mark +Över 2.5 +2.30 +Under 2.5 +1.55 +Wheeler, Blake +Över 2.5 +2.25 +Under 2.5 +1.57 +Connor, Kyle +Över 2.5 +1.57 +Under 2.5 +2.25 +Chabot, Thomas +Över 2.5 +2.20 +Under 2.5 +1.60 +Dadonov, Evgeny +Över 2.5 +2.25 +Under 2.5 +1.57 +Tkachuk, Brady +Över 3.5 +1.80 +Under 3.5 +1.90 +Minnesota Wild - Colorado Avalanche +Zuccarello, Mats +Över 1.5 +1.65 +Under 1.5 +2.10 +Fiala, Kevin +Över 2.5 +1.90 +Under 2.5 +1.80 +Landeskog, Gabriel +Över 2.5 +1.92 +Under 2.5 +1.78 +Rantanen, Mikko +Över 2.5 +1.60 +Under 2.5 +2.20 +MacKinnon, Nathan +Över 3.5 +1.65 +Under 3.5 +2.10 +Suter, Ryan +Över 1.5 +1.95 +Under 1.5 +1.75 +St Louis Blues - Vegas Golden Knights +O'Reilly, Ryan +Över 1.5 +1.52 +Under 1.5 +2.35 +Krug, Torey +Över 2.5 +2.15 +Under 2.5 +1.62 +Perron, David +Över 2.5 +2.00 +Under 2.5 +1.72 +Marchessault, Jonathan +Över 2.5 +1.65 +Under 2.5 +2.10 +Stone, Mark +Över 2.5 +2.55 +Under 2.5 +1.45 +Pacioretty, Max +Över 3.5 +1.75 +Under 3.5 +1.95 +Calgary Flames - Toronto Maple Leafs +Gaudreau, Johnny +Över 2.5 +2.10 +Under 2.5 +1.65 +Lindholm, Elias +Över 2.5 +2.30 +Under 2.5 +1.55 +Tkachuk, Matthew +Över 2.5 +1.95 +Under 2.5 +1.75 +Tavares, John +Över 2.5 +1.67 +Under 2.5 +2.08 +Marner, Mitch +Över 2.5 +1.75 +Under 2.5 +1.95 +Matthews, Auston +Över 3.5 +1.65 +Under 3.5 +2.10 +Los Angeles Kings - Arizona Coyotes +Brown, Dustin +Över 2.5 +1.75 +Under 2.5 +1.95 +Kessel, Phil +Över 2.5 +2.75 +Under 2.5 +1.40 +Keller, Clayton +Över 2.5 +2.30 +Under 2.5 +1.55 +Doughty, Drew +Över 1.5 +1.65 +Under 1.5 +2.10 +Kopitar, Anze +Över 1.5 +1.45 +Under 1.5 +2.55 +Dvorak, Christian +Över 1.5 +1.72 +Under 1.5 +2.00 \ No newline at end of file diff --git a/app/external/saved_bets/2021-04-06.bet365 b/app/external/saved_bets/2021-04-06.bet365 new file mode 100644 index 00000000..e852d902 --- /dev/null +++ b/app/external/saved_bets/2021-04-06.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08e6ae6eab3f24d371d8e0178c517f6b273dda9572d95f3673604c0af09d6b3f +size 5235 diff --git a/app/external/saved_bets/2021-04-06.betsson b/app/external/saved_bets/2021-04-06.betsson new file mode 100644 index 00000000..ce040d07 --- /dev/null +++ b/app/external/saved_bets/2021-04-06.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4ff981b9be80f2175ca9f50cb93ac48a5e164e04bab4d4c4cd6c5cd30a37d14 +size 5649 diff --git a/app/external/saved_bets/2021-04-06.betway b/app/external/saved_bets/2021-04-06.betway new file mode 100644 index 00000000..71496b0f --- /dev/null +++ b/app/external/saved_bets/2021-04-06.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d190bebafb2f50b6390a4728661b6821b1724e9c34d161bfe9ae4b0a0572eaa6 +size 6845 diff --git a/app/external/saved_bets/2021-04-06.ss b/app/external/saved_bets/2021-04-06.ss new file mode 100644 index 00000000..806eac02 --- /dev/null +++ b/app/external/saved_bets/2021-04-06.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4947d3cc6915466dd6e072f71f3f74ecd119089185df4679e34787673a7335a9 +size 833 diff --git a/app/external/saved_bets/2021-04-06.unibet b/app/external/saved_bets/2021-04-06.unibet new file mode 100644 index 00000000..271ad967 --- /dev/null +++ b/app/external/saved_bets/2021-04-06.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad4cfb0deaf1fdfcebb448e92a1038d1a912c767736a1b842fe28e2a83e81c77 +size 3113 diff --git a/app/external/saved_bets/2021-04-06.wh b/app/external/saved_bets/2021-04-06.wh new file mode 100644 index 00000000..226fad6b --- /dev/null +++ b/app/external/saved_bets/2021-04-06.wh @@ -0,0 +1,297 @@ +Carolina Hurricanes - Florida Panthers + +Aho, Sebastian (1997) +Över 2.5 +1.75 +Under 2.5 +1.95 +Hamilton, Dougie +Över 2.5 +1.52 +Under 2.5 +2.35 +Svechnikov, Andrei +Över 2.5 +1.72 +Under 2.5 +2.00 +Barkov, Aleksander +Över 2.5 +1.57 +Under 2.5 +2.25 +Huberdeau, Jonathan +Över 2.5 +2.30 +Under 2.5 +1.55 +Hörnqvist, Patric +Över 2.5 +1.52 +Under 2.5 +2.35 + +Columbus Blue Jackets - Tampa Bay Lightning + +Atkinson, Cam +Över 2.5 +1.85 +Under 2.5 +1.85 +Laine, Patrik +Över 2.5 +2.10 +Under 2.5 +1.65 +Björkstrand, Oliver +Över 2.5 +2.00 +Under 2.5 +1.72 +Stamkos, Steven +Över 2.5 +1.85 +Under 2.5 +1.85 +Hedman, Victor +Över 2.5 +1.95 +Under 2.5 +1.75 +Point, Brayden +Över 2.5 +2.15 +Under 2.5 +1.62 + +NY Islanders - Washington Capitals + +Barzal, Mathew +Över 2.5 +2.20 +Under 2.5 +1.60 +Nelson, Brock +Över 2.5 +2.10 +Under 2.5 +1.65 +Eberle, Jordan +Över 2.5 +2.15 +Under 2.5 +1.62 +Bäckström, Nicklas +Över 2.5 +2.35 +Under 2.5 +1.52 +Carlson, John +Över 2.5 +2.15 +Under 2.5 +1.62 +Ovechkin, Alexander +Över 4.5 +2.35 +Under 4.5 +1.52 + +NY Rangers - Pittsburgh Penguins + +Zibanejad, Mika +Över 3.5 +2.10 +Under 3.5 +1.65 +Panarin, Artemi +Över 2.5 +1.72 +Under 2.5 +2.00 +Kreider, Chris +Över 2.5 +2.10 +Under 2.5 +1.65 +Crosby, Sidney +Över 2.5 +1.70 +Under 2.5 +2.05 +Letang, Kris +Över 2.5 +2.10 +Under 2.5 +1.65 +Guentzel, Jake +Över 2.5 +1.75 +Under 2.5 +1.95 + +New Jersey Devils - Buffalo Sabres + +Subban, P. K. +Över 2.5 +2.40 +Under 2.5 +1.50 +Hughes, Jack +Över 2.5 +2.30 +Under 2.5 +1.55 +Dahlin, Rasmus +Över 2.5 +2.45 +Under 2.5 +1.48 +Reinhart, Sam +Över 2.5 +2.20 +Under 2.5 +1.60 +Hall, Taylor +Över 2.5 +1.85 +Under 2.5 +1.85 +Johnsson, Andreas +Över 1.5 +2.25 +Under 1.5 +1.57 + +Philadelphia Flyers - Boston Bruins + +Giroux, Claude +Över 2.5 +2.10 +Under 2.5 +1.65 +Couturier, Sean +Över 2.5 +2.10 +Under 2.5 +1.65 +Hayes, Kevin +Över 2.5 +2.20 +Under 2.5 +1.60 +Marchand, Brad +Över 2.5 +1.95 +Under 2.5 +1.75 +Bergeron, Patrice +Över 2.5 +1.70 +Under 2.5 +2.05 +Pastrnak, David +Över 3.5 +1.57 +Under 3.5 +2.25 + +Detroit Red Wings - Nashville Predators + +Larkin, Dylan +Över 2.5 +1.65 +Under 2.5 +2.10 +Mantha, Anthony +Över 2.5 +2.05 +Under 2.5 +1.70 +Arvidsson, Viktor +Över 2.5 +1.62 +Under 2.5 +2.15 +Josi, Roman +Över 2.5 +1.52 +Under 2.5 +2.35 +Hronek, Filip +Över 1.5 +1.57 +Under 1.5 +2.25 +Johansen, Ryan +Över 1.5 +1.75 +Under 1.5 +1.95 + +Chicago Blackhawks - Dallas Stars + +DeBrincat, Alex +Över 2.5 +1.70 +Under 2.5 +2.05 +Kubalik, Dominik +Över 2.5 +1.90 +Under 2.5 +1.80 +Kane, Patrick +Över 3.5 +2.15 +Under 3.5 +1.62 +Benn, Jamie +Över 2.5 +2.00 +Under 2.5 +1.72 +Klingberg, John +Över 2.5 +2.40 +Under 2.5 +1.50 +Pavelski, Joe +Över 2.5 +2.30 +Under 2.5 +1.55 + +San José Sharks - Anaheim Ducks + +Burns, Brent +Över 2.5 +1.90 +Under 2.5 +1.80 +Couture, Logan +Över 2.5 +2.25 +Under 2.5 +1.57 +Rakell, Rickard +Över 2.5 +1.85 +Under 2.5 +1.85 +Kane, Evander +Över 3.5 +2.30 +Under 3.5 +1.55 +Getzlaf, Ryan +Över 1.5 +2.00 +Under 1.5 +1.72 +Silfverberg, Jakob +Över 1.5 +1.65 +Under 1.5 +2.10 + diff --git a/app/external/saved_bets/2021-04-07.bet365 b/app/external/saved_bets/2021-04-07.bet365 new file mode 100644 index 00000000..5fef7555 --- /dev/null +++ b/app/external/saved_bets/2021-04-07.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6618c489c00da6782826e46425e08c1d55f2330721f0962bb93a22e153f1e15 +size 3543 diff --git a/app/external/saved_bets/2021-04-07.betsson b/app/external/saved_bets/2021-04-07.betsson new file mode 100644 index 00000000..72b07d98 --- /dev/null +++ b/app/external/saved_bets/2021-04-07.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c54f35ebbf01bccc8cc1a5926aa4155d84e4d48f5a439352439420ec5af71f6a +size 2697 diff --git a/app/external/saved_bets/2021-04-07.betway b/app/external/saved_bets/2021-04-07.betway new file mode 100644 index 00000000..ec342b0f --- /dev/null +++ b/app/external/saved_bets/2021-04-07.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:369ff01a0fed39958e8ec5df2b0376bd12308c81cb706322903665361a6df43c +size 4750 diff --git a/app/external/saved_bets/2021-04-07.ss b/app/external/saved_bets/2021-04-07.ss new file mode 100644 index 00000000..2fa6cb2e --- /dev/null +++ b/app/external/saved_bets/2021-04-07.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af4ad6af5bea8e889deefa53765cff7baa4556bf6c7965bbaa3e0827a3774267 +size 2149 diff --git a/app/external/saved_bets/2021-04-07.unibet b/app/external/saved_bets/2021-04-07.unibet new file mode 100644 index 00000000..4955facd --- /dev/null +++ b/app/external/saved_bets/2021-04-07.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1ecccff8b49a63bc496a7f723ffe139237eea0700f4f2f0d5e7cf25465855c3 +size 1376 diff --git a/app/external/saved_bets/2021-04-07.wh b/app/external/saved_bets/2021-04-07.wh new file mode 100644 index 00000000..46038e72 --- /dev/null +++ b/app/external/saved_bets/2021-04-07.wh @@ -0,0 +1,131 @@ +Toronto Maple Leafs - Montreal Canadiens + +Tavares, John +Över 2.5 +1.67 +Under 2.5 +2.08 +Marner, Mitch +Över 2.5 +1.75 +Under 2.5 +1.95 +Matthews, Auston +Över 3.5 +1.65 +Under 3.5 +2.10 +Weber, Shea +Över 2.5 +2.35 +Under 2.5 +1.52 +Drouin, Jonathan +Över 1.5 +1.60 +Under 1.5 +2.20 +Toffoli, Tyler +Över 2.5 +1.72 +Under 2.5 +2.00 + +Minnesota Wild - Colorado Avalanche + +Fiala, Kevin +Över 2.5 +1.80 +Under 2.5 +1.90 +Suter, Ryan +Över 1.5 +1.95 +Under 1.5 +1.75 +Kaprizov, Kirill +Över 2.5 +2.00 +Under 2.5 +1.72 +MacKinnon, Nathan +Över 3.5 +1.65 +Under 3.5 +2.10 +Landeskog, Gabriel +Över 2.5 +1.80 +Under 2.5 +1.90 +Rantanen, Mikko +Över 2.5 +1.60 +Under 2.5 +2.20 + +St Louis Blues - Vegas Golden Knights + +O'Reilly, Ryan +Över 1.5 +1.52 +Under 1.5 +2.35 +Krug, Torey +Över 2.5 +2.15 +Under 2.5 +1.62 +Perron, David +Över 2.5 +2.00 +Under 2.5 +1.72 +Marchessault, Jonathan +Över 2.5 +1.65 +Under 2.5 +2.10 +Stone, Mark +Över 2.5 +2.72 +Under 2.5 +1.40 +Pacioretty, Max +Över 3.5 +1.85 +Under 3.5 +1.85 + +Los Angeles Kings - Arizona Coyotes + +Brown, Dustin +Över 2.5 +1.72 +Under 2.5 +2.00 +Doughty, Drew +Över 1.5 +1.65 +Under 1.5 +2.10 +Kopitar, Anze +Över 1.5 +1.45 +Under 1.5 +2.55 +Kessel, Phil +Över 2.5 +2.75 +Under 2.5 +1.40 +Keller, Clayton +Över 2.5 +2.30 +Under 2.5 +1.55 +Dvorak, Christian +Över 1.5 +1.72 +Under 1.5 +2.00 \ No newline at end of file diff --git a/app/external/saved_bets/2021-04-08.bet365 b/app/external/saved_bets/2021-04-08.bet365 new file mode 100644 index 00000000..eedf1aa1 --- /dev/null +++ b/app/external/saved_bets/2021-04-08.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d322e131a3b1a6cae722ac008b57eb7256c0ead680cd5f9a8d02ed29d0795ee +size 4826 diff --git a/app/external/saved_bets/2021-04-08.betsson b/app/external/saved_bets/2021-04-08.betsson new file mode 100644 index 00000000..9349c9f5 --- /dev/null +++ b/app/external/saved_bets/2021-04-08.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f52c684a4dab00bf860548d351577704e4394b0b5f7bb93c143fdc5e93ecc4b +size 6648 diff --git a/app/external/saved_bets/2021-04-08.betway b/app/external/saved_bets/2021-04-08.betway new file mode 100644 index 00000000..a38906fd --- /dev/null +++ b/app/external/saved_bets/2021-04-08.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba6009c095d1dad8aec67d0ecbeb4e7b43a5616f12b169cfab982b412d66b728 +size 8029 diff --git a/app/external/saved_bets/2021-04-08.ss b/app/external/saved_bets/2021-04-08.ss new file mode 100644 index 00000000..a462dff1 --- /dev/null +++ b/app/external/saved_bets/2021-04-08.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1f629142a7c8c3dbaff4bd4a1c77111b0bc834a46407f15d38ea94f53f18900 +size 5538 diff --git a/app/external/saved_bets/2021-04-08.unibet b/app/external/saved_bets/2021-04-08.unibet new file mode 100644 index 00000000..40f5c563 --- /dev/null +++ b/app/external/saved_bets/2021-04-08.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37d8ce0e1646476094746ba9871ac0845477a38c8587a6ceedbdd2a6be046f58 +size 3407 diff --git a/app/external/saved_bets/2021-04-08.wh b/app/external/saved_bets/2021-04-08.wh new file mode 100644 index 00000000..0dba1515 --- /dev/null +++ b/app/external/saved_bets/2021-04-08.wh @@ -0,0 +1,324 @@ +Buffalo Sabres - New Jersey Devils + +Olofsson, Victor +Över 2.5 +2.35 +Under 2.5 +1.52 +Dahlin, Rasmus +Över 2.5 +2.40 +Under 2.5 +1.50 +Reinhart, Sam +Över 2.5 +2.20 +Under 2.5 +1.60 +Subban, P. K. +Över 2.5 +2.45 +Under 2.5 +1.48 +Hughes, Jack +Över 2.5 +2.30 +Under 2.5 +1.55 +Bratt, Jesper +Över 1.5 +1.65 +Under 1.5 +2.10 + +Carolina Hurricanes - Florida Panthers + +Aho, Sebastian (1997) +Över 2.5 +1.80 +Under 2.5 +1.90 +Hamilton, Dougie +Över 2.5 +1.52 +Under 2.5 +2.35 +Svechnikov, Andrei +Över 2.5 +1.75 +Under 2.5 +1.95 +Barkov, Aleksander +Över 2.5 +1.62 +Under 2.5 +2.15 +Huberdeau, Jonathan +Över 2.5 +2.30 +Under 2.5 +1.55 +Hörnqvist, Patric +Över 2.5 +1.55 +Under 2.5 +2.30 + +Columbus Blue Jackets - Tampa Bay Lightning + +Atkinson, Cam +Över 2.5 +1.85 +Under 2.5 +1.85 +Laine, Patrik +Över 2.5 +2.10 +Under 2.5 +1.65 +Björkstrand, Oliver +Över 2.5 +2.00 +Under 2.5 +1.72 +Stamkos, Steven +Över 2.5 +1.85 +Under 2.5 +1.85 +Hedman, Victor +Över 2.5 +1.95 +Under 2.5 +1.75 +Point, Brayden +Över 2.5 +2.15 +Under 2.5 +1.62 + +Montreal Canadiens - Winnipeg Jets + +Weber, Shea +Över 2.5 +2.30 +Under 2.5 +1.55 +Toffoli, Tyler +Över 2.5 +1.65 +Under 2.5 +2.10 +Scheifele, Mark +Över 2.5 +2.40 +Under 2.5 +1.50 +Connor, Kyle +Över 2.5 +1.60 +Under 2.5 +2.20 +Drouin, Jonathan +Över 1.5 +1.57 +Under 1.5 +2.25 + +NY Islanders - Philadelphia Flyers + +Barzal, Mathew +Över 2.5 +2.10 +Under 2.5 +1.65 +Nelson, Brock +Över 2.5 +2.05 +Under 2.5 +1.68 +Eberle, Jordan +Över 2.5 +2.10 +Under 2.5 +1.65 +Giroux, Claude +Över 2.5 +2.15 +Under 2.5 +1.62 +Couturier, Sean +Över 2.5 +2.15 +Under 2.5 +1.62 +Hayes, Kevin +Över 2.5 +2.25 +Under 2.5 +1.57 + +NY Rangers - Pittsburgh Penguins + +Zibanejad, Mika +Över 3.5 +2.32 +Under 3.5 +1.54 +Panarin, Artemi +Över 2.5 +1.80 +Under 2.5 +1.90 +Kreider, Chris +Över 2.5 +2.10 +Under 2.5 +1.65 +Crosby, Sidney +Över 2.5 +1.70 +Under 2.5 +2.05 +Letang, Kris +Över 2.5 +2.15 +Under 2.5 +1.62 +Guentzel, Jake +Över 2.5 +1.75 +Under 2.5 +1.95 + +Ottawa Senators - Edmonton Oilers + +Tkachuk, Brady +Över 3.5 +1.80 +Under 3.5 +1.90 +McDavid, Connor +Över 3.5 +1.85 +Under 3.5 +1.85 +Chabot, Thomas +Över 2.5 +2.10 +Under 2.5 +1.65 +Dadonov, Evgeny +Över 2.5 +2.50 +Under 2.5 +1.47 +Draisaitl, Leon +Över 2.5 +1.67 +Under 2.5 +2.08 +Nugent-Hopkins, Ryan +Över 2.5 +1.78 +Under 2.5 +1.92 +Washington Capitals - Boston Bruins + +Ovechkin, Alexander +Över 4.5 +2.30 +Under 4.5 +1.55 +Pastrnak, David +Över 3.5 +1.70 +Under 3.5 +2.02 +Bäckström, Nicklas +Över 2.5 +2.45 +Under 2.5 +1.50 +Carlson, John +Över 2.5 +2.10 +Under 2.5 +1.65 +Marchand, Brad +Över 2.5 +2.00 +Under 2.5 +1.72 +Bergeron, Patrice +Över 2.5 +1.65 +Under 2.5 +2.10 + +Detroit Red Wings - Nashville Predators + +Larkin, Dylan +Över 2.5 +1.65 +Under 2.5 +2.10 +Mantha, Anthony +Över 2.5 +2.05 +Under 2.5 +1.70 +Josi, Roman +Över 2.5 +1.57 +Under 2.5 +2.25 +Hronek, Filip +Över 1.5 +1.57 +Under 1.5 +2.25 +Johansen, Ryan +Över 1.5 +1.75 +Under 1.5 +1.95 +Granlund, Mikael +Över 1.5 +1.72 +Under 1.5 +2.00 + +Chicago Blackhawks - Dallas Stars + +Kane, Patrick +Över 3.5 +2.15 +Under 3.5 +1.62 +DeBrincat, Alex +Över 2.5 +1.68 +Under 2.5 +2.05 +Kubalik, Dominik +Över 2.5 +1.90 +Under 2.5 +1.80 +Benn, Jamie +Över 2.5 +2.00 +Under 2.5 +1.72 +Klingberg, John +Över 2.5 +2.40 +Under 2.5 +1.50 +Pavelski, Joe +Över 2.5 +2.30 +Under 2.5 +1.55 + diff --git a/app/external/saved_bets/2021-04-09.bet365 b/app/external/saved_bets/2021-04-09.bet365 new file mode 100644 index 00000000..fcd9c1b3 --- /dev/null +++ b/app/external/saved_bets/2021-04-09.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3454afba0fc3cd33e8942328374cdb1e55fa1c2b51d31b5d7e0319f0184af50 +size 4201 diff --git a/app/external/saved_bets/2021-04-09.betsson b/app/external/saved_bets/2021-04-09.betsson new file mode 100644 index 00000000..016ca284 --- /dev/null +++ b/app/external/saved_bets/2021-04-09.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df6ec006dc4a2e1651275494ea63c6f428203e5761be361f7be2c57d65151ccf +size 2677 diff --git a/app/external/saved_bets/2021-04-09.betway b/app/external/saved_bets/2021-04-09.betway new file mode 100644 index 00000000..ea56079b --- /dev/null +++ b/app/external/saved_bets/2021-04-09.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f9b0468281b535cb7d3ace5dc87dab988cdba83f4ab31b27fce64b7cea3ad86 +size 5772 diff --git a/app/external/saved_bets/2021-04-09.ss b/app/external/saved_bets/2021-04-09.ss new file mode 100644 index 00000000..afff9853 --- /dev/null +++ b/app/external/saved_bets/2021-04-09.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2199388cf07415470e8f32566dcb002d804f8f875280837bfe071d31cf271ca3 +size 2505 diff --git a/app/external/saved_bets/2021-04-09.unibet b/app/external/saved_bets/2021-04-09.unibet new file mode 100644 index 00000000..2b9f284c --- /dev/null +++ b/app/external/saved_bets/2021-04-09.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ba7a08089b19dd89141865b5834a8ed85feab9d1207b496730080276d83be97 +size 2394 diff --git a/app/external/saved_bets/2021-04-09.wh b/app/external/saved_bets/2021-04-09.wh new file mode 100644 index 00000000..63033681 --- /dev/null +++ b/app/external/saved_bets/2021-04-09.wh @@ -0,0 +1,231 @@ +Buffalo Sabres - Washington Capitals + +Olofsson, Victor +Över 2.5 +2.40 +Under 2.5 +1.50 +Dahlin, Rasmus +Över 2.5 +2.50 +Under 2.5 +1.47 +Reinhart, Sam +Över 2.5 +2.30 +Under 2.5 +1.55 +Bäckström, Nicklas +Över 2.5 +2.40 +Under 2.5 +1.50 +Carlson, John +Över 2.5 +2.20 +Under 2.5 +1.60 +Ovechkin, Alexander +Över 4.5 +2.20 +Under 4.5 +1.60 + +NY Islanders - NY Rangers + +Barzal, Mathew +Över 2.5 +2.15 +Under 2.5 +1.62 +Nelson, Brock +Över 2.5 +2.10 +Under 2.5 +1.65 +Eberle, Jordan +Över 2.5 +2.15 +Under 2.5 +1.62 +Panarin, Artemi +Över 2.5 +1.88 +Under 2.5 +1.82 +Kreider, Chris +Över 2.5 +2.20 +Under 2.5 +1.60 +Zibanejad, Mika +Över 3.5 +2.35 +Under 3.5 +1.52 + +New Jersey Devils - Pittsburgh Penguins + +Subban, P. K. +Över 2.5 +2.55 +Under 2.5 +1.45 +Hughes, Jack +Över 2.5 +2.10 +Under 2.5 +1.65 +Crosby, Sidney +Över 2.5 +1.65 +Under 2.5 +2.10 +Letang, Kris +Över 2.5 +2.05 +Under 2.5 +1.68 +Guentzel, Jake +Över 2.5 +1.68 +Under 2.5 +2.05 +Bratt, Jesper +Över 1.5 +1.72 +Under 1.5 +2.00 + +St Louis Blues - Minnesota Wild + +Krug, Torey +Över 2.5 +2.05 +Under 2.5 +1.68 +Perron, David +Över 2.5 +1.92 +Under 2.5 +1.78 +Fiala, Kevin +Över 2.5 +1.68 +Under 2.5 +2.05 +Kaprizov, Kirill +Över 2.5 +1.90 +Under 2.5 +1.80 +O'Reilly, Ryan +Över 1.5 +1.47 +Under 1.5 +2.50 +Suter, Ryan +Över 1.5 +1.85 +Under 1.5 +1.85 + +Anaheim Ducks - Colorado Avalanche + +Landeskog, Gabriel +Över 2.5 +1.72 +Under 2.5 +2.00 +Rantanen, Mikko +Över 2.5 +1.55 +Under 2.5 +2.30 +MacKinnon, Nathan +Över 3.5 +1.60 +Under 3.5 +2.20 +Silfverberg, Jakob +Över 1.5 +1.75 +Under 1.5 +1.95 +Fowler, Cam +Över 1.5 +1.85 +Under 1.5 +1.85 +Comtois, Maxime +Över 1.5 +1.85 +Under 1.5 +1.85 + +Vegas Golden Knights - Arizona Coyotes + +Marchessault, Jonathan +Över 2.5 +1.60 +Under 2.5 +2.20 +Stone, Mark +Över 2.5 +2.65 +Under 2.5 +1.42 +Kessel, Phil +Över 2.5 +2.75 +Under 2.5 +1.40 +Keller, Clayton +Över 2.5 +2.40 +Under 2.5 +1.50 +Pacioretty, Max +Över 3.5 +1.85 +Under 3.5 +1.85 +Dvorak, Christian +Över 1.5 +1.82 +Under 1.5 +1.88 + +San José Sharks - Los Angeles Kings + +Burns, Brent +Över 2.5 +2.00 +Under 2.5 +1.72 +Couture, Logan +Över 2.5 +2.35 +Under 2.5 +1.52 +Brown, Dustin +Över 2.5 +1.72 +Under 2.5 +2.00 +Kane, Evander +Över 3.5 +2.35 +Under 3.5 +1.52 +Doughty, Drew +Över 1.5 +1.70 +Under 1.5 +2.02 +Kopitar, Anze +Över 1.5 +1.47 +Under 1.5 +2.50 + diff --git a/app/external/saved_bets/2021-04-10.bet365 b/app/external/saved_bets/2021-04-10.bet365 new file mode 100644 index 00000000..c5489e58 --- /dev/null +++ b/app/external/saved_bets/2021-04-10.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9fb92bfdf11245b0242f6f45409bf380272e2d5efdd4d7d9467321abcd6b013e +size 4528 diff --git a/app/external/saved_bets/2021-04-10.betsson b/app/external/saved_bets/2021-04-10.betsson new file mode 100644 index 00000000..15260a20 --- /dev/null +++ b/app/external/saved_bets/2021-04-10.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15962f1c7086fd9c2169fcdf5becc156098bb5ab17558e10f73b7d0e8d2311b2 +size 5523 diff --git a/app/external/saved_bets/2021-04-10.betway b/app/external/saved_bets/2021-04-10.betway new file mode 100644 index 00000000..b1f374bd --- /dev/null +++ b/app/external/saved_bets/2021-04-10.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3f55ea9a9af41dffb768e803580018adec10a3801424bb13809309c6c9b5aa0 +size 5434 diff --git a/app/external/saved_bets/2021-04-10.ss b/app/external/saved_bets/2021-04-10.ss new file mode 100644 index 00000000..c65c2df8 --- /dev/null +++ b/app/external/saved_bets/2021-04-10.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9d446cd833e44ecb33d27465131461e1b8acd5b54abb36a09b08f5dc7e4b079 +size 4078 diff --git a/app/external/saved_bets/2021-04-10.unibet b/app/external/saved_bets/2021-04-10.unibet new file mode 100644 index 00000000..3d93b184 --- /dev/null +++ b/app/external/saved_bets/2021-04-10.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67a833d6655d62ea3fdbd90cf8393188c0a165086b7e2435f62d75ed136bd033 +size 2647 diff --git a/app/external/saved_bets/2021-04-10.wh b/app/external/saved_bets/2021-04-10.wh new file mode 100644 index 00000000..1a7944ff --- /dev/null +++ b/app/external/saved_bets/2021-04-10.wh @@ -0,0 +1,253 @@ +Carolina Hurricanes - Detroit Red Wings + +Aho, Sebastian (1997) +Över 2.5 +1.72 +Under 2.5 +2.00 +Hamilton, Dougie +Över 2.5 +1.50 +Under 2.5 +2.40 +Svechnikov, Andrei +Över 2.5 +1.67 +Under 2.5 +2.08 +Larkin, Dylan +Över 2.5 +1.75 +Under 2.5 +1.95 +Mantha, Anthony +Över 2.5 +2.20 +Under 2.5 +1.60 +Hronek, Filip +Över 1.5 +1.67 +Under 1.5 +2.08 + +Columbus Blue Jackets - Chicago Blackhawks + +Kane, Patrick +Över 3.5 +2.10 +Under 3.5 +1.65 +Atkinson, Cam +Över 2.5 +1.80 +Under 2.5 +1.90 +Laine, Patrik +Över 2.5 +2.05 +Under 2.5 +1.70 +Björkstrand, Oliver +Över 2.5 +1.90 +Under 2.5 +1.80 +DeBrincat, Alex +Över 2.5 +1.67 +Under 2.5 +2.08 +Kubalik, Dominik +Över 2.5 +2.00 +Under 2.5 +1.72 + +Montreal Canadiens - Winnipeg Jets + +Weber, Shea +Över 2.5 +2.30 +Under 2.5 +1.55 +Toffoli, Tyler +Över 2.5 +1.65 +Under 2.5 +2.10 +Scheifele, Mark +Över 2.5 +2.40 +Under 2.5 +1.50 +Connor, Kyle +Över 2.5 +1.62 +Under 2.5 +2.15 +Ehlers, Nikolaj +Över 2.5 +1.62 +Under 2.5 +2.15 +Drouin, Jonathan +Över 1.5 +1.60 +Under 1.5 +2.20 + +Toronto Maple Leafs - Ottawa Senators + +Matthews, Auston +Över 3.5 +1.70 +Under 3.5 +2.05 +Tkachuk, Brady +Över 3.5 +1.90 +Under 3.5 +1.80 +Tavares, John +Över 2.5 +1.64 +Under 2.5 +2.12 +Marner, Mitch +Över 2.5 +1.70 +Under 2.5 +2.05 +Chabot, Thomas +Över 2.5 +2.05 +Under 2.5 +1.70 +Dadonov, Evgeny +Över 1.5 +1.85 +Under 1.5 +1.85 + +Nashville Predators - Tampa Bay Lightning + +Josi, Roman +Över 2.5 +1.64 +Under 2.5 +2.12 +Hedman, Victor +Över 2.5 +1.95 +Under 2.5 +1.75 +Point, Brayden +Över 2.5 +2.15 +Under 2.5 +1.62 +Johansen, Ryan +Över 1.5 +1.85 +Under 1.5 +1.85 +Granlund, Mikael +Över 1.5 +1.85 +Under 1.5 +1.85 + +St Louis Blues - Minnesota Wild + +Krug, Torey +Över 2.5 +2.15 +Under 2.5 +1.62 +Perron, David +Över 2.5 +1.90 +Under 2.5 +1.80 +Fiala, Kevin +Över 2.5 +1.67 +Under 2.5 +2.08 +Kaprizov, Kirill +Över 2.5 +1.85 +Under 2.5 +1.85 +O'Reilly, Ryan +Över 1.5 +1.47 +Under 1.5 +2.50 +Suter, Ryan +Över 1.5 +1.85 +Under 1.5 +1.85 + +Calgary Flames - Edmonton Oilers + +McDavid, Connor +Över 3.5 +1.90 +Under 3.5 +1.80 +Gaudreau, Johnny +Över 2.5 +2.10 +Under 2.5 +1.65 +Lindholm, Elias +Över 2.5 +2.30 +Under 2.5 +1.55 +Tkachuk, Matthew +Över 2.5 +1.90 +Under 2.5 +1.80 +Draisaitl, Leon +Över 2.5 +1.70 +Under 2.5 +2.05 + +San José Sharks - Los Angeles Kings + +Kane, Evander +Över 3.5 +2.35 +Under 3.5 +1.52 +Burns, Brent +Över 2.5 +2.00 +Under 2.5 +1.72 +Couture, Logan +Över 2.5 +2.35 +Under 2.5 +1.52 +Brown, Dustin +Över 2.5 +1.70 +Under 2.5 +2.05 +Doughty, Drew +Över 1.5 +1.70 +Under 1.5 +2.05 +Kopitar, Anze +Över 1.5 +1.47 +Under 1.5 +2.50 \ No newline at end of file diff --git a/app/external/saved_bets/2021-04-11.bet365 b/app/external/saved_bets/2021-04-11.bet365 new file mode 100644 index 00000000..d77d424e --- /dev/null +++ b/app/external/saved_bets/2021-04-11.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08b75e932fe325a243f055e01ebeb68e91b1793966bc8316de0730b413766918 +size 3603 diff --git a/app/external/saved_bets/2021-04-11.betsson b/app/external/saved_bets/2021-04-11.betsson new file mode 100644 index 00000000..7f65c9db --- /dev/null +++ b/app/external/saved_bets/2021-04-11.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:924f7b90bd309c4b74fc6dcc45ac7bd81d7ffec7891748ed1b2148e4d2a2365a +size 2923 diff --git a/app/external/saved_bets/2021-04-11.betway b/app/external/saved_bets/2021-04-11.betway new file mode 100644 index 00000000..db3d5b08 --- /dev/null +++ b/app/external/saved_bets/2021-04-11.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d97dadc573193807492626f6d7ce89e65a9e1eefb8924de9f307932b68b75006 +size 4795 diff --git a/app/external/saved_bets/2021-04-11.ss b/app/external/saved_bets/2021-04-11.ss new file mode 100644 index 00000000..c558df14 --- /dev/null +++ b/app/external/saved_bets/2021-04-11.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2277be342734c187813d93b6f18d9ca658d305ea559d143981cb6f68056bc6ea +size 2507 diff --git a/app/external/saved_bets/2021-04-11.unibet b/app/external/saved_bets/2021-04-11.unibet new file mode 100644 index 00000000..527b6024 --- /dev/null +++ b/app/external/saved_bets/2021-04-11.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af1ac7615e377a1c446eda0f272af254ffb96293ab0675b504806f5d5a49a111 +size 2062 diff --git a/app/external/saved_bets/2021-04-11.wh b/app/external/saved_bets/2021-04-11.wh new file mode 100644 index 00000000..31572e83 --- /dev/null +++ b/app/external/saved_bets/2021-04-11.wh @@ -0,0 +1,197 @@ +Vegas Golden Knights - Arizona Coyotes + +Pacioretty, Max +Över 3.5 +1.85 +Under 3.5 +1.85 +Marchessault, Jonathan +Över 2.5 +1.50 +Under 2.5 +2.40 +Stone, Mark +Över 2.5 +2.80 +Under 2.5 +1.38 +Kessel, Phil +Över 2.5 +2.75 +Under 2.5 +1.40 +Keller, Clayton +Över 2.5 +2.20 +Under 2.5 +1.60 +Dvorak, Christian +Över 1.5 +1.82 +Under 1.5 +1.88 + +Anaheim Ducks - Colorado Avalanche + +MacKinnon, Nathan +Över 3.5 +1.60 +Under 3.5 +2.20 +Landeskog, Gabriel +Över 2.5 +1.72 +Under 2.5 +2.00 +Rantanen, Mikko +Över 2.5 +1.55 +Under 2.5 +2.30 +Fowler, Cam +Över 1.5 +1.85 +Under 1.5 +1.85 +Silfverberg, Jakob +Över 1.5 +1.75 +Under 1.5 +1.95 +Comtois, Maxime +Över 1.5 +1.85 +Under 1.5 +1.85 + +Boston Bruins - Washington Capitals + +Ovechkin, Alexander +Över 4.5 +2.25 +Under 4.5 +1.57 +Pastrnak, David +Över 3.5 +1.72 +Under 3.5 +2.00 +Marchand, Brad +Över 2.5 +2.00 +Under 2.5 +1.72 +Bergeron, Patrice +Över 2.5 +1.65 +Under 2.5 +2.10 +Bäckström, Nicklas +Över 2.5 +2.40 +Under 2.5 +1.50 +Carlson, John +Över 2.5 +2.25 +Under 2.5 +1.57 + +NY Islanders - NY Rangers + +Zibanejad, Mika +Över 3.5 +2.35 +Under 3.5 +1.52 +Barzal, Mathew +Över 2.5 +2.15 +Under 2.5 +1.62 +Nelson, Brock +Över 2.5 +2.10 +Under 2.5 +1.65 +Eberle, Jordan +Över 2.5 +2.15 +Under 2.5 +1.62 +Panarin, Artemi +Över 2.5 +1.88 +Under 2.5 +1.82 +Kreider, Chris +Över 2.5 +2.20 +Under 2.5 +1.60 + +New Jersey Devils - Pittsburgh Penguins + +Subban, P. K. +Över 2.5 +2.55 +Under 2.5 +1.45 +Hughes, Jack +Över 2.5 +2.10 +Under 2.5 +1.65 +Letang, Kris +Över 2.5 +2.05 +Under 2.5 +1.68 +Guentzel, Jake +Över 2.5 +1.68 +Under 2.5 +2.05 +Crosby, Sidney +Över 2.5 +1.65 +Under 2.5 +2.10 +Bratt, Jesper +Över 1.5 +1.72 +Under 1.5 +2.00 + +Nashville Predators - Dallas Stars + +Josi, Roman +Över 2.5 +1.62 +Under 2.5 +2.15 +Benn, Jamie +Över 2.5 +2.15 +Under 2.5 +1.62 +Klingberg, John +Över 2.5 +2.55 +Under 2.5 +1.45 +Pavelski, Joe +Över 2.5 +2.40 +Under 2.5 +1.50 +Johansen, Ryan +Över 1.5 +1.82 +Under 1.5 +1.88 +Granlund, Mikael +Över 1.5 +1.82 +Under 1.5 +1.88 \ No newline at end of file diff --git a/app/external/saved_bets/2021-04-12.bet365 b/app/external/saved_bets/2021-04-12.bet365 new file mode 100644 index 00000000..66b973dc --- /dev/null +++ b/app/external/saved_bets/2021-04-12.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f73487fa8ceffbf52811d3694a8937d29e24d70fdf9ecfd27a7a22e7213f643 +size 4630 diff --git a/app/external/saved_bets/2021-04-12.betsson b/app/external/saved_bets/2021-04-12.betsson new file mode 100644 index 00000000..c623a7ba --- /dev/null +++ b/app/external/saved_bets/2021-04-12.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:817dcab2de06f6f3c163799621fdef3b36cffc00340b041edc0bc638b34ed746 +size 4018 diff --git a/app/external/saved_bets/2021-04-12.betway b/app/external/saved_bets/2021-04-12.betway new file mode 100644 index 00000000..088d85ea --- /dev/null +++ b/app/external/saved_bets/2021-04-12.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94357f8e52c8b570be5544628fa4e2150ee15d3161d2be9625d65d7984aaf67e +size 6287 diff --git a/app/external/saved_bets/2021-04-12.ss b/app/external/saved_bets/2021-04-12.ss new file mode 100644 index 00000000..934f4b14 --- /dev/null +++ b/app/external/saved_bets/2021-04-12.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d60babfa5d71e142023500b8111a05d7131b68127f2c6e7b5df851acf7e14c7c +size 4592 diff --git a/app/external/saved_bets/2021-04-12.unibet b/app/external/saved_bets/2021-04-12.unibet new file mode 100644 index 00000000..954c7375 --- /dev/null +++ b/app/external/saved_bets/2021-04-12.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f5e7f92bcc6a5ac5e615a23329c6f8185718a8b075bfcfaaa177c5625b078ca +size 2383 diff --git a/app/external/saved_bets/2021-04-12.wh b/app/external/saved_bets/2021-04-12.wh new file mode 100644 index 00000000..c6485f5f --- /dev/null +++ b/app/external/saved_bets/2021-04-12.wh @@ -0,0 +1,226 @@ +Carolina Hurricanes - Detroit Red Wings + +Aho, Sebastian (1997) +Över 2.5 +1.64 +Under 2.5 +2.12 +Hamilton, Dougie +Över 2.5 +1.50 +Under 2.5 +2.40 +Svechnikov, Andrei +Över 2.5 +1.65 +Under 2.5 +2.10 +Larkin, Dylan +Över 2.5 +1.75 +Under 2.5 +1.95 +Hronek, Filip +Över 1.5 +1.67 +Under 1.5 +2.08 + +Columbus Blue Jackets - Chicago Blackhawks + +Atkinson, Cam +Över 2.5 +1.72 +Under 2.5 +2.00 +Laine, Patrik +Över 2.5 +2.10 +Under 2.5 +1.65 +Björkstrand, Oliver +Över 2.5 +1.90 +Under 2.5 +1.80 +DeBrincat, Alex +Över 2.5 +1.67 +Under 2.5 +2.08 +Kubalik, Dominik +Över 2.5 +2.00 +Under 2.5 +1.72 +Kane, Patrick +Över 3.5 +2.10 +Under 3.5 +1.65 + +Montreal Canadiens - Toronto Maple Leafs + +Weber, Shea +Över 2.5 +2.55 +Under 2.5 +1.45 +Toffoli, Tyler +Över 2.5 +1.65 +Under 2.5 +2.10 +Tavares, John +Över 2.5 +1.70 +Under 2.5 +2.05 +Marner, Mitch +Över 2.5 +1.80 +Under 2.5 +1.90 +Matthews, Auston +Över 3.5 +1.75 +Under 3.5 +1.95 +Drouin, Jonathan +Över 1.5 +1.62 +Under 1.5 +2.15 + +Ottawa Senators - Winnipeg Jets + +Chabot, Thomas +Över 2.5 +2.00 +Under 2.5 +1.72 +Scheifele, Mark +Över 2.5 +2.30 +Under 2.5 +1.55 +Connor, Kyle +Över 2.5 +1.55 +Under 2.5 +2.30 +Ehlers, Nikolaj +Över 2.5 +1.57 +Under 2.5 +2.25 +Tkachuk, Brady +Över 3.5 +1.85 +Under 3.5 +1.85 +Dadonov, Evgeny +Över 1.5 +1.85 +Under 1.5 +1.85 + +Colorado Avalanche - Arizona Coyotes + +Landeskog, Gabriel +Över 2.5 +1.72 +Under 2.5 +2.00 +Rantanen, Mikko +Över 2.5 +1.55 +Under 2.5 +2.30 +Kessel, Phil +Över 2.5 +2.75 +Under 2.5 +1.40 +Keller, Clayton +Över 2.5 +2.75 +Under 2.5 +1.40 +MacKinnon, Nathan +Över 3.5 +1.60 +Under 3.5 +2.20 +Dvorak, Christian +Över 1.5 +1.80 +Under 1.5 +1.90 + +Los Angeles Kings - Vegas Golden Knights + +Brown, Dustin +Över 2.5 +1.75 +Under 2.5 +1.95 +Marchessault, Jonathan +Över 2.5 +1.60 +Under 2.5 +2.20 +Stone, Mark +Över 2.5 +2.75 +Under 2.5 +1.40 +Pacioretty, Max +Över 3.5 +1.80 +Under 3.5 +1.90 +Doughty, Drew +Över 1.5 +1.72 +Under 1.5 +2.00 +Kopitar, Anze +Över 1.5 +1.50 +Under 1.5 +2.45 + +San José Sharks - Anaheim Ducks + +Burns, Brent +Över 2.5 +1.92 +Under 2.5 +1.78 +Rakell, Rickard +Över 2.5 +1.70 +Under 2.5 +2.05 +Couture, Logan +Över 2.5 +2.30 +Under 2.5 +1.55 +Kane, Evander +Över 3.5 +2.35 +Under 3.5 +1.52 +Silfverberg, Jakob +Över 1.5 +1.60 +Under 1.5 +2.20 +Comtois, Maxime +Över 1.5 +1.75 +Under 1.5 +1.95 + diff --git a/app/external/saved_bets/2021-04-13.bet365 b/app/external/saved_bets/2021-04-13.bet365 new file mode 100644 index 00000000..be41cfae --- /dev/null +++ b/app/external/saved_bets/2021-04-13.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf0c447c9eac1f354c5eaec1057783131dcc701cbd570354d42895dbf0852f8a +size 3758 diff --git a/app/external/saved_bets/2021-04-13.betsson b/app/external/saved_bets/2021-04-13.betsson new file mode 100644 index 00000000..32be7e2c --- /dev/null +++ b/app/external/saved_bets/2021-04-13.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5b0fc7669de50864ae1bfffdb00b6bf4adb8ef8205445476df8b81a4730aaac +size 3097 diff --git a/app/external/saved_bets/2021-04-13.betway b/app/external/saved_bets/2021-04-13.betway new file mode 100644 index 00000000..3e03716d --- /dev/null +++ b/app/external/saved_bets/2021-04-13.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70aeb325427b8e06c52de96484cbd775dda2e33ca0716d34fd9131ca8ac1d0fb +size 4907 diff --git a/app/external/saved_bets/2021-04-13.ss b/app/external/saved_bets/2021-04-13.ss new file mode 100644 index 00000000..11af8910 --- /dev/null +++ b/app/external/saved_bets/2021-04-13.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8700f203df27a7e7939a09915947357a0ab6f2e6f1fbc31b3d5463b2b7e19cf5 +size 3130 diff --git a/app/external/saved_bets/2021-04-13.unibet b/app/external/saved_bets/2021-04-13.unibet new file mode 100644 index 00000000..4b363945 --- /dev/null +++ b/app/external/saved_bets/2021-04-13.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42e0c1b3d6cab81be80406125ae964c7fd0adfe88694cce2498cf108cddbc456 +size 2070 diff --git a/app/external/saved_bets/2021-04-13.wh b/app/external/saved_bets/2021-04-13.wh new file mode 100644 index 00000000..a74b822b --- /dev/null +++ b/app/external/saved_bets/2021-04-13.wh @@ -0,0 +1,198 @@ +Boston Bruins - Buffalo Sabres + +Marchand, Brad +Över 2.5 +2.00 +Under 2.5 +1.72 +Bergeron, Patrice +Över 2.5 +1.57 +Under 2.5 +2.25 +Olofsson, Victor +Över 2.5 +2.45 +Under 2.5 +1.48 +Dahlin, Rasmus +Över 2.5 +2.55 +Under 2.5 +1.45 +Reinhart, Sam +Över 2.5 +2.35 +Under 2.5 +1.52 +Pastrnak, David +Över 3.5 +1.60 +Under 3.5 +2.20 + +New Jersey Devils - NY Rangers + +Subban, P. K. +Över 2.5 +2.55 +Under 2.5 +1.45 +Hughes, Jack +Över 2.5 +2.10 +Under 2.5 +1.65 +Panarin, Artemi +Över 2.5 +1.80 +Under 2.5 +1.90 +Kreider, Chris +Över 2.5 +2.15 +Under 2.5 +1.62 +Bratt, Jesper +Över 1.5 +1.67 +Under 1.5 +2.08 +Zibanejad, Mika +Över 3.5 +2.35 +Under 3.5 +1.52 + +Washington Capitals - Philadelphia Flyers + +Ovechkin, Alexander +Över 4.5 +2.15 +Under 4.5 +1.62 +Bäckström, Nicklas +Över 2.5 +2.40 +Under 2.5 +1.50 +Carlson, John +Över 2.5 +2.20 +Under 2.5 +1.60 +Giroux, Claude +Över 2.5 +2.20 +Under 2.5 +1.60 +Couturier, Sean +Över 2.5 +2.20 +Under 2.5 +1.60 +Hayes, Kevin +Över 2.5 +2.30 +Under 2.5 +1.55 + +Toronto Maple Leafs - Calgary Flames + +Tavares, John +Över 2.5 +1.65 +Under 2.5 +2.10 +Marner, Mitch +Över 2.5 +1.72 +Under 2.5 +2.00 +Gaudreau, Johnny +Över 2.5 +2.20 +Under 2.5 +1.60 +Lindholm, Elias +Över 2.5 +2.40 +Under 2.5 +1.50 +Tkachuk, Matthew +Över 2.5 +2.00 +Under 2.5 +1.72 +Matthews, Auston +Över 3.5 +1.68 +Under 3.5 +2.05 + +Nashville Predators - Tampa Bay Lightning + +Johansen, Ryan +Över 1.5 +1.85 +Under 1.5 +1.85 +Granlund, Mikael +Över 1.5 +1.85 +Under 1.5 +1.85 +Josi, Roman +Över 2.5 +1.70 +Under 2.5 +2.02 +Stamkos, Steven +Över 2.5 +1.85 +Under 2.5 +1.85 +Hedman, Victor +Över 2.5 +1.95 +Under 2.5 +1.75 +Point, Brayden +Över 2.5 +2.15 +Under 2.5 +1.62 + +Dallas Stars - Florida Panthers + +Benn, Jamie +Över 2.5 +2.15 +Under 2.5 +1.62 +Klingberg, John +Över 2.5 +2.55 +Under 2.5 +1.45 +Pavelski, Joe +Över 2.5 +2.40 +Under 2.5 +1.50 +Barkov, Aleksander +Över 2.5 +1.62 +Under 2.5 +2.15 +Huberdeau, Jonathan +Över 2.5 +2.30 +Under 2.5 +1.55 +Hörnqvist, Patric +Över 2.5 +1.60 +Under 2.5 +2.20 + diff --git a/app/external/saved_bets/2021-04-14.bet365 b/app/external/saved_bets/2021-04-14.bet365 new file mode 100644 index 00000000..f5290362 --- /dev/null +++ b/app/external/saved_bets/2021-04-14.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72b9b73f6d8f178de99ddf70175feffe8f71d7a534b777198c1c671fc633707d +size 3669 diff --git a/app/external/saved_bets/2021-04-14.betsson b/app/external/saved_bets/2021-04-14.betsson new file mode 100644 index 00000000..3668f1ca --- /dev/null +++ b/app/external/saved_bets/2021-04-14.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7509d86ad12d5ed09746af7c2f67129497f1d115379fd2780c497d6c89a800e6 +size 3474 diff --git a/app/external/saved_bets/2021-04-14.betway b/app/external/saved_bets/2021-04-14.betway new file mode 100644 index 00000000..78056ac7 --- /dev/null +++ b/app/external/saved_bets/2021-04-14.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5688d949abe30ca7745f961e15c18f800d697c58b7d03e13adba2a3d62a4ae6 +size 5068 diff --git a/app/external/saved_bets/2021-04-14.unibet b/app/external/saved_bets/2021-04-14.unibet new file mode 100644 index 00000000..75a826fc --- /dev/null +++ b/app/external/saved_bets/2021-04-14.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c462705aeadca3dea30f30ffe92341f04dd14f0e0a022fe47ce03aafafd4fbcf +size 1716 diff --git a/app/external/saved_bets/2021-04-14.wh b/app/external/saved_bets/2021-04-14.wh new file mode 100644 index 00000000..8e38c99d --- /dev/null +++ b/app/external/saved_bets/2021-04-14.wh @@ -0,0 +1,165 @@ +Montreal Canadiens - Calgary Flames + +Weber, Shea +Över 2.5 +2.62 +Under 2.5 +1.43 +Drouin, Jonathan +Över 1.5 +1.60 +Under 1.5 +2.20 +Toffoli, Tyler +Över 2.5 +1.65 +Under 2.5 +2.10 +Gaudreau, Johnny +Över 2.5 +2.35 +Under 2.5 +1.52 +Lindholm, Elias +Över 2.5 +2.40 +Under 2.5 +1.50 +Tkachuk, Matthew +Över 2.5 +2.10 +Under 2.5 +1.65 + +Ottawa Senators - Winnipeg Jets + +Chabot, Thomas +Över 2.5 +2.05 +Under 2.5 +1.70 +Tkachuk, Brady +Över 3.5 +1.85 +Under 3.5 +1.85 +Dadonov, Evgeny +Över 1.5 +1.75 +Under 1.5 +1.95 +Scheifele, Mark +Över 2.5 +2.30 +Under 2.5 +1.55 +Connor, Kyle +Över 2.5 +1.55 +Under 2.5 +2.30 +Ehlers, Nikolaj +Över 2.5 +1.57 +Under 2.5 +2.25 + +St Louis Blues - Colorado Avalanche + +O'Reilly, Ryan +Över 1.5 +1.55 +Under 1.5 +2.30 +Krug, Torey +Över 2.5 +2.50 +Under 2.5 +1.47 +Perron, David +Över 2.5 +2.10 +Under 2.5 +1.65 +MacKinnon, Nathan +Över 3.5 +1.65 +Under 3.5 +2.10 +Landeskog, Gabriel +Över 2.5 +1.80 +Under 2.5 +1.90 +Rantanen, Mikko +Över 2.5 +1.55 +Under 2.5 +2.30 + +Los Angeles Kings - Vegas Golden Knights + +Brown, Dustin +Över 2.5 +1.75 +Under 2.5 +1.95 +Doughty, Drew +Över 1.5 +1.72 +Under 1.5 +2.00 +Kopitar, Anze +Över 1.5 +1.50 +Under 1.5 +2.45 +Marchessault, Jonathan +Över 2.5 +1.62 +Under 2.5 +2.15 +Stone, Mark +Över 2.5 +2.85 +Under 2.5 +1.37 +Pacioretty, Max +Över 3.5 +1.90 +Under 3.5 +1.80 + +San José Sharks - Anaheim Ducks + +Burns, Brent +Över 2.5 +1.92 +Under 2.5 +1.78 +Kane, Evander +Över 3.5 +2.35 +Under 3.5 +1.52 +Couture, Logan +Över 2.5 +2.30 +Under 2.5 +1.55 +Silfverberg, Jakob +Över 1.5 +1.62 +Under 1.5 +2.15 +Rakell, Rickard +Över 2.5 +1.72 +Under 2.5 +2.00 +Comtois, Maxime +Över 1.5 +1.80 +Under 1.5 +1.90 + diff --git a/app/external/saved_bets/2021-04-15.bet365 b/app/external/saved_bets/2021-04-15.bet365 new file mode 100644 index 00000000..1144c1cc --- /dev/null +++ b/app/external/saved_bets/2021-04-15.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:238a3243b9a6dba3c77c77ab15f5739d1581a3d890b1def2a7e5d3367e716f3b +size 5912 diff --git a/app/external/saved_bets/2021-04-15.betsson b/app/external/saved_bets/2021-04-15.betsson new file mode 100644 index 00000000..37d611d1 --- /dev/null +++ b/app/external/saved_bets/2021-04-15.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac689d72404276f403be12e712ad1410938c9555d25e7f1fecb02375217a6d1f +size 5816 diff --git a/app/external/saved_bets/2021-04-15.betway b/app/external/saved_bets/2021-04-15.betway new file mode 100644 index 00000000..34de9bd0 --- /dev/null +++ b/app/external/saved_bets/2021-04-15.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61bcc6953309a4698be6470756c58222f168bfb377ad94192bb01b74073295ee +size 8037 diff --git a/app/external/saved_bets/2021-04-15.ss b/app/external/saved_bets/2021-04-15.ss new file mode 100644 index 00000000..21ad0299 --- /dev/null +++ b/app/external/saved_bets/2021-04-15.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9cfc2ce5ca1f707fe164532fa6ea5bce78d5b832855ae52b20900dd4078ccd5 +size 5366 diff --git a/app/external/saved_bets/2021-04-15.unibet b/app/external/saved_bets/2021-04-15.unibet new file mode 100644 index 00000000..e06272c3 --- /dev/null +++ b/app/external/saved_bets/2021-04-15.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:369fe93665ea49824f4420d3e07b9d5b8d15f2e653582f32dcd54c2266ae0330 +size 3056 diff --git a/app/external/saved_bets/2021-04-15.wh b/app/external/saved_bets/2021-04-15.wh new file mode 100644 index 00000000..3c42b867 --- /dev/null +++ b/app/external/saved_bets/2021-04-15.wh @@ -0,0 +1,291 @@ +Boston Bruins - NY Islanders + +Pastrnak, David +Över 3.5 +1.65 +Under 3.5 +2.10 +Marchand, Brad +Över 2.5 +2.05 +Under 2.5 +1.68 +Bergeron, Patrice +Över 2.5 +1.60 +Under 2.5 +2.20 +Barzal, Mathew +Över 2.5 +2.15 +Under 2.5 +1.62 +Nelson, Brock +Över 2.5 +2.10 +Under 2.5 +1.65 +Eberle, Jordan +Över 2.5 +2.15 +Under 2.5 +1.62 + +Carolina Hurricanes - Nashville Predators + +Johansen, Ryan +Över 1.5 +1.85 +Under 1.5 +1.85 +Granlund, Mikael +Över 1.5 +1.85 +Under 1.5 +1.85 +Aho, Sebastian (1997) +Över 2.5 +1.65 +Under 2.5 +2.10 +Hamilton, Dougie +Över 2.5 +1.50 +Under 2.5 +2.40 +Svechnikov, Andrei +Över 2.5 +1.65 +Under 2.5 +2.10 +Josi, Roman +Över 2.5 +1.70 +Under 2.5 +2.02 + +NY Rangers - New Jersey Devils + +Zibanejad, Mika +Över 3.5 +2.48 +Under 3.5 +1.48 +Bratt, Jesper +Över 1.5 +1.62 +Under 1.5 +2.15 +Panarin, Artemi +Över 2.5 +1.80 +Under 2.5 +1.90 +Kreider, Chris +Över 2.5 +2.30 +Under 2.5 +1.55 +Subban, P. K. +Över 2.5 +2.55 +Under 2.5 +1.45 +Hughes, Jack +Över 2.5 +2.10 +Under 2.5 +1.65 + +Pittsburgh Penguins - Philadelphia Flyers + +Crosby, Sidney +Över 2.5 +1.65 +Under 2.5 +2.10 +Letang, Kris +Över 2.5 +2.05 +Under 2.5 +1.68 +Guentzel, Jake +Över 2.5 +1.68 +Under 2.5 +2.05 +Giroux, Claude +Över 2.5 +2.20 +Under 2.5 +1.60 +Couturier, Sean +Över 2.5 +2.20 +Under 2.5 +1.60 +Hayes, Kevin +Över 2.5 +2.30 +Under 2.5 +1.55 + +Tampa Bay Lightning - Florida Panthers + +Stamkos, Steven +Över 2.5 +1.85 +Under 2.5 +1.85 +Hedman, Victor +Över 2.5 +1.85 +Under 2.5 +1.85 +Point, Brayden +Över 2.5 +2.15 +Under 2.5 +1.62 +Barkov, Aleksander +Över 2.5 +1.65 +Under 2.5 +2.10 +Huberdeau, Jonathan +Över 2.5 +2.30 +Under 2.5 +1.55 +Hörnqvist, Patric +Över 2.5 +1.62 +Under 2.5 +2.15 + +Toronto Maple Leafs - Winnipeg Jets + +Tavares, John +Över 2.5 +1.65 +Under 2.5 +2.10 +Marner, Mitch +Över 2.5 +1.60 +Under 2.5 +2.20 +Scheifele, Mark +Över 2.5 +2.35 +Under 2.5 +1.52 +Connor, Kyle +Över 2.5 +1.60 +Under 2.5 +2.20 +Ehlers, Nikolaj +Över 2.5 +1.62 +Under 2.5 +2.15 + +Washington Capitals - Buffalo Sabres + +Ovechkin, Alexander +Över 4.5 +2.30 +Under 4.5 +1.55 +Bäckström, Nicklas +Över 2.5 +2.35 +Under 2.5 +1.52 +Carlson, John +Över 2.5 +2.15 +Under 2.5 +1.62 +Olofsson, Victor +Över 2.5 +2.25 +Under 2.5 +1.57 +Dahlin, Rasmus +Över 2.5 +2.65 +Under 2.5 +1.42 +Reinhart, Sam +Över 2.5 +2.35 +Under 2.5 +1.52 + +Detroit Red Wings - Chicago Blackhawks + +Zadina, Filip +Över 1.5 +1.50 +Under 1.5 +2.40 +Hronek, Filip +Över 1.5 +1.57 +Under 1.5 +2.25 +Kane, Patrick +Över 3.5 +2.10 +Under 3.5 +1.65 +Larkin, Dylan +Över 2.5 +1.67 +Under 2.5 +2.10 +DeBrincat, Alex +Över 2.5 +1.65 +Under 2.5 +2.10 +Kubalik, Dominik +Över 2.5 +2.05 +Under 2.5 +1.70 + +Dallas Stars - Columbus Blue Jackets + +Benn, Jamie +Över 2.5 +2.10 +Under 2.5 +1.65 +Klingberg, John +Över 2.5 +2.50 +Under 2.5 +1.47 +Pavelski, Joe +Över 2.5 +2.40 +Under 2.5 +1.50 +Atkinson, Cam +Över 2.5 +1.75 +Under 2.5 +1.95 +Laine, Patrik +Över 2.5 +2.05 +Under 2.5 +1.70 +Björkstrand, Oliver +Över 2.5 +2.00 +Under 2.5 +1.72 \ No newline at end of file diff --git a/app/external/saved_bets/2021-04-16.bet365 b/app/external/saved_bets/2021-04-16.bet365 new file mode 100644 index 00000000..dc314d64 --- /dev/null +++ b/app/external/saved_bets/2021-04-16.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a3ae51326415e6ee58b39fbd1cb0d78c9a962102edd6934b4ba26fbbf58d617 +size 2785 diff --git a/app/external/saved_bets/2021-04-16.betsson b/app/external/saved_bets/2021-04-16.betsson new file mode 100644 index 00000000..56ac1742 --- /dev/null +++ b/app/external/saved_bets/2021-04-16.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3dd898e364d4eb00e053609400f4099854eb4d136cb844b99dea0bc148fdbf91 +size 3076 diff --git a/app/external/saved_bets/2021-04-16.betway b/app/external/saved_bets/2021-04-16.betway new file mode 100644 index 00000000..55d0e901 --- /dev/null +++ b/app/external/saved_bets/2021-04-16.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b39ef6f3e36639efea1992c7eb21d6f32568b8685a2972ed4542355dba872c1a +size 3865 diff --git a/app/external/saved_bets/2021-04-16.ss b/app/external/saved_bets/2021-04-16.ss new file mode 100644 index 00000000..b88cb5f3 --- /dev/null +++ b/app/external/saved_bets/2021-04-16.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5b7948a25b8b9ccc96d84f6557f406cb3d6ee27ab8b727647aa4d403a5786e5 +size 2478 diff --git a/app/external/saved_bets/2021-04-16.unibet b/app/external/saved_bets/2021-04-16.unibet new file mode 100644 index 00000000..92dcf42e --- /dev/null +++ b/app/external/saved_bets/2021-04-16.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05b2500b8ee8a2ea18c63c945087c592c7b47ac8087a54efe943bde7e096af68 +size 1365 diff --git a/app/external/saved_bets/2021-04-16.wh b/app/external/saved_bets/2021-04-16.wh new file mode 100644 index 00000000..23d043b2 --- /dev/null +++ b/app/external/saved_bets/2021-04-16.wh @@ -0,0 +1,131 @@ +Montreal Canadiens - Calgary Flames + +Drouin, Jonathan +Över 1.5 +1.60 +Under 1.5 +2.20 +Weber, Shea +Över 2.5 +2.62 +Under 2.5 +1.43 +Toffoli, Tyler +Över 2.5 +1.65 +Under 2.5 +2.10 +Gaudreau, Johnny +Över 2.5 +2.50 +Under 2.5 +1.47 +Lindholm, Elias +Över 2.5 +2.40 +Under 2.5 +1.50 +Tkachuk, Matthew +Över 2.5 +2.10 +Under 2.5 +1.65 + +Boston Bruins - NY Islanders + +Pastrnak, David +Över 3.5 +1.65 +Under 3.5 +2.10 +Marchand, Brad +Över 2.5 +2.05 +Under 2.5 +1.68 +Bergeron, Patrice +Över 2.5 +1.60 +Under 2.5 +2.20 +Barzal, Mathew +Över 2.5 +2.15 +Under 2.5 +1.62 +Nelson, Brock +Över 2.5 +2.10 +Under 2.5 +1.65 +Eberle, Jordan +Över 2.5 +2.15 +Under 2.5 +1.62 + +Minnesota Wild - San José Sharks + +Suter, Ryan +Över 1.5 +2.05 +Under 1.5 +1.68 +Fiala, Kevin +Över 2.5 +1.65 +Under 2.5 +2.10 +Kaprizov, Kirill +Över 2.5 +2.00 +Under 2.5 +1.72 +Burns, Brent +Över 2.5 +2.00 +Under 2.5 +1.72 +Kane, Evander +Över 3.5 +2.30 +Under 3.5 +1.55 +Couture, Logan +Över 2.5 +2.40 +Under 2.5 +1.50 + +Anaheim Ducks - Vegas Golden Knights + +Silfverberg, Jakob +Över 1.5 +1.68 +Under 1.5 +2.05 +Comtois, Maxime +Över 1.5 +1.85 +Under 1.5 +1.85 +Pacioretty, Max +Över 3.5 +1.90 +Under 3.5 +1.80 +Rakell, Rickard +Över 2.5 +1.85 +Under 2.5 +1.85 +Marchessault, Jonathan +Över 2.5 +1.62 +Under 2.5 +2.15 +Stone, Mark +Över 2.5 +2.85 +Under 2.5 +1.37 diff --git a/app/external/saved_bets/2021-04-17.bet365 b/app/external/saved_bets/2021-04-17.bet365 new file mode 100644 index 00000000..185c647f --- /dev/null +++ b/app/external/saved_bets/2021-04-17.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6e903e6bdcd5fee77598996c6adb68fe02e52e9b89912fed0f577abae3117df +size 7648 diff --git a/app/external/saved_bets/2021-04-17.betsson b/app/external/saved_bets/2021-04-17.betsson new file mode 100644 index 00000000..c01f9d62 --- /dev/null +++ b/app/external/saved_bets/2021-04-17.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ddbb2aa87b5180ee6f9b6e035ee2a2967e0f945cd6d2faa60dcc46754e6d22a +size 2718 diff --git a/app/external/saved_bets/2021-04-17.betway b/app/external/saved_bets/2021-04-17.betway new file mode 100644 index 00000000..511f403d --- /dev/null +++ b/app/external/saved_bets/2021-04-17.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82a1f552726c0d7b09ae22b65abb605fc1966b9a73440a1fc516baed86a84397 +size 10327 diff --git a/app/external/saved_bets/2021-04-17.ss b/app/external/saved_bets/2021-04-17.ss new file mode 100644 index 00000000..68c02a95 --- /dev/null +++ b/app/external/saved_bets/2021-04-17.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d59b90331536227eec32c9d8b956fa1eca9b55935c5a59a073fde7411d502fd +size 5029 diff --git a/app/external/saved_bets/2021-04-17.unibet b/app/external/saved_bets/2021-04-17.unibet new file mode 100644 index 00000000..9cc36984 --- /dev/null +++ b/app/external/saved_bets/2021-04-17.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76a963e6d8f22d728451e6c4aabc3d9a27df7dbca21eb99e6e66d0a4d27f6682 +size 3779 diff --git a/app/external/saved_bets/2021-04-17.wh b/app/external/saved_bets/2021-04-17.wh new file mode 100644 index 00000000..fd94c634 --- /dev/null +++ b/app/external/saved_bets/2021-04-17.wh @@ -0,0 +1,364 @@ +NY Rangers - New Jersey Devils + +Panarin, Artemi +Över 2.5 +1.75 +Under 2.5 +1.95 +Kreider, Chris +Över 2.5 +2.35 +Under 2.5 +1.52 +Subban, P. K. +Över 2.5 +2.55 +Under 2.5 +1.45 +Hughes, Jack +Över 2.5 +2.10 +Under 2.5 +1.65 +Zibanejad, Mika +Över 3.5 +2.45 +Under 3.5 +1.48 +Hischier, Nico +Över 2.5 +2.15 +Under 2.5 +1.62 + +Philadelphia Flyers - Washington Capitals + +Giroux, Claude +Över 2.5 +2.25 +Under 2.5 +1.57 +Couturier, Sean +Över 2.5 +2.20 +Under 2.5 +1.60 +Hayes, Kevin +Över 2.5 +2.45 +Under 2.5 +1.48 +Bäckström, Nicklas +Över 2.5 +2.50 +Under 2.5 +1.47 +Carlson, John +Över 2.5 +2.15 +Under 2.5 +1.62 +Ovechkin, Alexander +Över 4.5 +2.15 +Under 4.5 +1.62 + +Buffalo Sabres - Pittsburgh Penguins + +Olofsson, Victor +Över 2.5 +2.20 +Under 2.5 +1.60 +Dahlin, Rasmus +Över 2.5 +2.55 +Under 2.5 +1.45 +Reinhart, Sam +Över 2.5 +2.30 +Under 2.5 +1.55 +Crosby, Sidney +Över 2.5 +1.65 +Under 2.5 +2.10 +Letang, Kris +Över 2.5 +2.10 +Under 2.5 +1.65 +Guentzel, Jake +Över 2.5 +1.62 +Under 2.5 +2.15 + +Montreal Canadiens - Ottawa Senators + +Weber, Shea +Över 2.5 +2.50 +Under 2.5 +1.47 +Toffoli, Tyler +Över 2.5 +1.62 +Under 2.5 +2.15 +Chabot, Thomas +Över 2.5 +2.05 +Under 2.5 +1.70 +Drouin, Jonathan +Över 1.5 +1.57 +Under 1.5 +2.25 +Dadonov, Evgeny +Över 1.5 +1.70 +Under 1.5 +2.05 +Tkachuk, Brady +Över 3.5 +1.85 +Under 3.5 +1.85 + +Arizona Coyotes - St Louis Blues + +Kessel, Phil +Över 2.5 +2.55 +Under 2.5 +1.45 +Keller, Clayton +Över 2.5 +2.50 +Under 2.5 +1.47 +Krug, Torey +Över 2.5 +2.25 +Under 2.5 +1.57 +Perron, David +Över 2.5 +2.05 +Under 2.5 +1.70 +Dvorak, Christian +Över 1.5 +1.70 +Under 1.5 +2.05 +O'Reilly, Ryan +Över 1.5 +1.47 +Under 1.5 +2.50 + +Carolina Hurricanes - Nashville Predators + +Aho, Sebastian (1997) +Över 2.5 +1.65 +Under 2.5 +2.10 +Hamilton, Dougie +Över 2.5 +1.47 +Under 2.5 +2.50 +Svechnikov, Andrei +Över 2.5 +1.72 +Under 2.5 +2.00 +Josi, Roman +Över 2.5 +1.72 +Under 2.5 +2.00 +Johansen, Ryan +Över 1.5 +1.85 +Under 1.5 +1.85 +Granlund, Mikael +Över 1.5 +1.85 +Under 1.5 +1.85 + +Detroit Red Wings - Chicago Blackhawks + +Larkin, Dylan +Över 2.5 +1.70 +Under 2.5 +2.05 +DeBrincat, Alex +Över 2.5 +1.65 +Under 2.5 +2.10 +Kubalik, Dominik +Över 2.5 +1.90 +Under 2.5 +1.80 +Zadina, Filip +Över 1.5 +1.50 +Under 1.5 +2.40 +Hronek, Filip +Över 1.5 +1.57 +Under 1.5 +2.25 +Kane, Patrick +Över 3.5 +2.10 +Under 3.5 +1.65 + +Tampa Bay Lightning - Florida Panthers + +Hedman, Victor +Över 2.5 +1.85 +Under 2.5 +1.85 +Point, Brayden +Över 2.5 +2.15 +Under 2.5 +1.62 +Barkov, Aleksander +Över 2.5 +1.52 +Under 2.5 +2.35 +Huberdeau, Jonathan +Över 2.5 +2.30 +Under 2.5 +1.55 +Hörnqvist, Patric +Över 2.5 +1.65 +Under 2.5 +2.10 +Killorn, Alex +Över 1.5 +1.70 +Under 1.5 +2.05 + +Winnipeg Jets - Edmonton Oilers + +Scheifele, Mark +Över 2.5 +2.25 +Under 2.5 +1.57 +Connor, Kyle +Över 2.5 +1.52 +Under 2.5 +2.35 +Ehlers, Nikolaj +Över 2.5 +1.60 +Under 2.5 +2.20 +Draisaitl, Leon +Över 2.5 +1.67 +Under 2.5 +2.08 +McDavid, Connor +Över 3.5 +1.90 +Under 3.5 +1.80 +Nurse, Darnell +Över 2.5 +1.75 +Under 2.5 +1.95 + +Dallas Stars - Columbus Blue Jackets + +Benn, Jamie +Över 2.5 +2.10 +Under 2.5 +1.65 +Klingberg, John +Över 2.5 +2.50 +Under 2.5 +1.47 +Pavelski, Joe +Över 2.5 +2.30 +Under 2.5 +1.55 +Atkinson, Cam +Över 2.5 +1.80 +Under 2.5 +1.90 +Laine, Patrik +Över 2.5 +2.25 +Under 2.5 +1.57 +Björkstrand, Oliver +Över 2.5 +2.05 +Under 2.5 +1.70 + +Minnesota Wild - San José Sharks + +Fiala, Kevin +Över 2.5 +1.65 +Under 2.5 +2.10 +Kaprizov, Kirill +Över 2.5 +2.00 +Under 2.5 +1.72 +Burns, Brent +Över 2.5 +2.00 +Under 2.5 +1.72 +Couture, Logan +Över 2.5 +2.50 +Under 2.5 +1.47 +Suter, Ryan +Över 1.5 +2.05 +Under 1.5 +1.70 +Kane, Evander +Över 3.5 +2.25 +Under 3.5 +1.57 + + diff --git a/app/external/saved_bets/2021-04-18.bet365 b/app/external/saved_bets/2021-04-18.bet365 new file mode 100644 index 00000000..eda45f64 --- /dev/null +++ b/app/external/saved_bets/2021-04-18.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e524ad8e00ddecf0c2977978d71666d4b069b8dcd6a5a1ec732dc344284de825 +size 3526 diff --git a/app/external/saved_bets/2021-04-18.betsson b/app/external/saved_bets/2021-04-18.betsson new file mode 100644 index 00000000..0a857fa1 --- /dev/null +++ b/app/external/saved_bets/2021-04-18.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfde28c1e187506c0ab24d9b0bb842ae2260a45fbef37b632a101b402775b3a2 +size 3880 diff --git a/app/external/saved_bets/2021-04-18.betway b/app/external/saved_bets/2021-04-18.betway new file mode 100644 index 00000000..baadca5a --- /dev/null +++ b/app/external/saved_bets/2021-04-18.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e311cb211c537247f02966b836e8f9fe4c171ed4cff6ea1c504c7ce3df3d7f4 +size 4858 diff --git a/app/external/saved_bets/2021-04-18.ss b/app/external/saved_bets/2021-04-18.ss new file mode 100644 index 00000000..cd5dd05b --- /dev/null +++ b/app/external/saved_bets/2021-04-18.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8152600a2e7db9053f9bd4e652abceda49cd9cb67e3a4c126505f0430cd17cb9 +size 2704 diff --git a/app/external/saved_bets/2021-04-18.unibet b/app/external/saved_bets/2021-04-18.unibet new file mode 100644 index 00000000..ef9c8569 --- /dev/null +++ b/app/external/saved_bets/2021-04-18.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b299e41da8188fe900d67b901243988e2543feae25907785abe6b57289bd9d92 +size 2057 diff --git a/app/external/saved_bets/2021-04-18.wh b/app/external/saved_bets/2021-04-18.wh new file mode 100644 index 00000000..7a54bd04 --- /dev/null +++ b/app/external/saved_bets/2021-04-18.wh @@ -0,0 +1,197 @@ +Boston Bruins - Washington Capitals + +Marchand, Brad +Över 2.5 +2.05 +Under 2.5 +1.68 +Pastrnak, David +Över 3.5 +1.70 +Under 3.5 +2.02 +Bergeron, Patrice +Över 2.5 +1.60 +Under 2.5 +2.20 +Ovechkin, Alexander +Över 4.5 +2.20 +Under 4.5 +1.60 +Bäckström, Nicklas +Över 2.5 +2.50 +Under 2.5 +1.47 +Carlson, John +Över 2.5 +2.15 +Under 2.5 +1.62 + +Buffalo Sabres - Pittsburgh Penguins + +Olofsson, Victor +Över 2.5 +2.20 +Under 2.5 +1.60 +Dahlin, Rasmus +Över 2.5 +2.65 +Under 2.5 +1.42 +Reinhart, Sam +Över 2.5 +2.30 +Under 2.5 +1.55 +Crosby, Sidney +Över 2.5 +1.65 +Under 2.5 +2.10 +Letang, Kris +Över 2.5 +2.10 +Under 2.5 +1.65 +Guentzel, Jake +Över 2.5 +1.62 +Under 2.5 +2.15 + +New Jersey Devils - NY Rangers + +Hischier, Nico +Över 2.5 +2.15 +Under 2.5 +1.62 +Subban, P. K. +Över 2.5 +2.55 +Under 2.5 +1.45 +Hughes, Jack +Över 2.5 +2.00 +Under 2.5 +1.72 +Zibanejad, Mika +Över 3.5 +2.52 +Under 3.5 +1.46 +Panarin, Artemi +Över 2.5 +1.75 +Under 2.5 +1.95 +Kreider, Chris +Över 2.5 +2.35 +Under 2.5 +1.52 + +Anaheim Ducks - Vegas Golden Knights + +Silfverberg, Jakob +Över 1.5 +1.68 +Under 1.5 +2.05 +Comtois, Maxime +Över 1.5 +1.72 +Under 1.5 +2.00 +Rakell, Rickard +Över 2.5 +1.85 +Under 2.5 +1.85 +Marchessault, Jonathan +Över 2.5 +1.60 +Under 2.5 +2.20 +Stone, Mark +Över 2.5 +2.85 +Under 2.5 +1.37 +Pacioretty, Max +Över 3.5 +1.88 +Under 3.5 +1.82 + +Philadelphia Flyers - NY Islanders + +Giroux, Claude +Över 2.5 +2.25 +Under 2.5 +1.57 +Couturier, Sean +Över 2.5 +2.20 +Under 2.5 +1.60 +Hayes, Kevin +Över 2.5 +2.45 +Under 2.5 +1.48 +Barzal, Mathew +Över 2.5 +2.10 +Under 2.5 +1.65 +Nelson, Brock +Över 2.5 +2.10 +Under 2.5 +1.65 +Eberle, Jordan +Över 2.5 +2.20 +Under 2.5 +1.60 + +Vancouver Canucks - Toronto Maple Leafs + +Boeser, Brock +Över 2.5 +2.00 +Under 2.5 +1.72 +Horvat, Bowie +Över 2.5 +2.25 +Under 2.5 +1.57 +Tavares, John +Över 2.5 +1.62 +Under 2.5 +2.15 +Marner, Mitch +Över 2.5 +1.62 +Under 2.5 +2.15 +Hyman, Zach +Över 2.5 +2.00 +Under 2.5 +1.72 +Miller, J.T. +Över 1.5 +1.60 +Under 1.5 +2.20 diff --git a/app/external/saved_bets/2021-04-19.bet365 b/app/external/saved_bets/2021-04-19.bet365 new file mode 100644 index 00000000..3255666b --- /dev/null +++ b/app/external/saved_bets/2021-04-19.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:838164d010b4e9f0af1b84986e0fabbe2741f16c883aeddfb743c1d534ce549b +size 5468 diff --git a/app/external/saved_bets/2021-04-19.betsson b/app/external/saved_bets/2021-04-19.betsson new file mode 100644 index 00000000..d86bf260 --- /dev/null +++ b/app/external/saved_bets/2021-04-19.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e43f54e946896683143a8ce987e11de30202ada885da39eaf9c5aac5cbf08753 +size 4992 diff --git a/app/external/saved_bets/2021-04-19.betway b/app/external/saved_bets/2021-04-19.betway new file mode 100644 index 00000000..f467f843 --- /dev/null +++ b/app/external/saved_bets/2021-04-19.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a16b936c6503a39345c450f57fce0837135e3ff78dc7690c16f001a6eb71c700 +size 7417 diff --git a/app/external/saved_bets/2021-04-19.ss b/app/external/saved_bets/2021-04-19.ss new file mode 100644 index 00000000..139e5fdf --- /dev/null +++ b/app/external/saved_bets/2021-04-19.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:654c6471946798137e32282144b70209e4a1473bfdda9f520ce3316dbcc57e2e +size 5062 diff --git a/app/external/saved_bets/2021-04-19.unibet b/app/external/saved_bets/2021-04-19.unibet new file mode 100644 index 00000000..9595d8a8 --- /dev/null +++ b/app/external/saved_bets/2021-04-19.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3436cc2a98f763095d0c5264e6f47929425d7daa6e966350e4014db3add27f0 +size 2773 diff --git a/app/external/saved_bets/2021-04-19.wh b/app/external/saved_bets/2021-04-19.wh new file mode 100644 index 00000000..5d181803 --- /dev/null +++ b/app/external/saved_bets/2021-04-19.wh @@ -0,0 +1,263 @@ +Florida Panthers - Columbus Blue Jackets + +Barkov, Aleksander +Över 2.5 +1.50 +Under 2.5 +2.40 +Huberdeau, Jonathan +Över 2.5 +2.25 +Under 2.5 +1.57 +Hörnqvist, Patric +Över 2.5 +1.62 +Under 2.5 +2.15 +Atkinson, Cam +Över 2.5 +1.80 +Under 2.5 +1.90 +Laine, Patrik +Över 2.5 +2.25 +Under 2.5 +1.57 +Björkstrand, Oliver +Över 2.5 +2.10 +Under 2.5 +1.65 + +Tampa Bay Lightning - Carolina Hurricanes + +Killorn, Alex +Över 1.5 +1.75 +Under 1.5 +1.95 +Hedman, Victor +Över 2.5 +1.95 +Under 2.5 +1.75 +Point, Brayden +Över 2.5 +2.20 +Under 2.5 +1.60 +Aho, Sebastian (1997) +Över 2.5 +1.72 +Under 2.5 +2.00 +Hamilton, Dougie +Över 2.5 +1.52 +Under 2.5 +2.40 +Svechnikov, Andrei +Över 2.5 +1.80 +Under 2.5 +1.90 + +Dallas Stars - Detroit Red Wings + +Zadina, Filip +Över 1.5 +1.52 +Under 1.5 +2.35 +Hronek, Filip +Över 1.5 +1.62 +Under 1.5 +2.15 +Benn, Jamie +Över 2.5 +2.10 +Under 2.5 +1.65 +Klingberg, John +Över 2.5 +2.50 +Under 2.5 +1.47 +Pavelski, Joe +Över 2.5 +2.25 +Under 2.5 +1.57 +Larkin, Dylan +Över 2.5 +1.72 +Under 2.5 +2.00 + +Nashville Predators - Chicago Blackhawks + +Kane, Patrick +Över 3.5 +2.10 +Under 3.5 +1.65 +Johansen, Ryan +Över 1.5 +1.80 +Under 1.5 +1.90 +Granlund, Mikael +Över 1.5 +1.75 +Under 1.5 +1.95 +Josi, Roman +Över 2.5 +1.60 +Under 2.5 +2.20 +DeBrincat, Alex +Över 2.5 +1.57 +Under 2.5 +2.25 +Kubalik, Dominik +Över 2.5 +2.05 +Under 2.5 +1.70 + +Arizona Coyotes - Minnesota Wild + +Dvorak, Christian +Över 1.5 +1.72 +Under 1.5 +2.00 +Suter, Ryan +Över 1.5 +2.10 +Under 1.5 +1.65 +Kessel, Phil +Över 2.5 +2.50 +Under 2.5 +1.47 +Keller, Clayton +Över 2.5 +2.65 +Under 2.5 +1.42 +Fiala, Kevin +Över 2.5 +1.67 +Under 2.5 +2.08 +Kaprizov, Kirill +Över 2.5 +2.00 +Under 2.5 +1.72 + +Calgary Flames - Ottawa Senators + +Tkachuk, Brady +Över 3.5 +1.80 +Under 3.5 +1.90 +Dadonov, Evgeny +Över 1.5 +1.67 +Under 1.5 +2.08 +Gaudreau, Johnny +Över 2.5 +2.35 +Under 2.5 +1.52 +Lindholm, Elias +Över 2.5 +2.25 +Under 2.5 +1.57 +Tkachuk, Matthew +Över 2.5 +2.05 +Under 2.5 +1.70 +Chabot, Thomas +Över 2.5 +2.05 +Under 2.5 +1.70 + +Edmonton Oilers - Montreal Canadiens + +McDavid, Connor +Över 3.5 +1.90 +Under 3.5 +1.80 +Drouin, Jonathan +Över 1.5 +1.65 +Under 1.5 +2.10 +Draisaitl, Leon +Över 2.5 +1.65 +Under 2.5 +2.10 +Weber, Shea +Över 2.5 +2.50 +Under 2.5 +1.47 +Toffoli, Tyler +Över 2.5 +1.67 +Under 2.5 +2.08 +Nurse, Darnell +Över 2.5 +2.10 +Under 2.5 +1.65 + +Vegas Golden Knights - San José Sharks + +Pacioretty, Max +Över 3.5 +1.85 +Under 3.5 +1.85 +Kane, Evander +Över 3.5 +2.35 +Under 3.5 +1.52 +Marchessault, Jonathan +Över 2.5 +1.62 +Under 2.5 +2.15 +Stone, Mark +Över 2.5 +2.55 +Under 2.5 +1.45 +Burns, Brent +Över 2.5 +1.90 +Under 2.5 +1.80 +Couture, Logan +Över 2.5 +2.50 +Under 2.5 +1.47 diff --git a/app/external/saved_bets/2021-04-20.bet365 b/app/external/saved_bets/2021-04-20.bet365 new file mode 100644 index 00000000..74e2e325 --- /dev/null +++ b/app/external/saved_bets/2021-04-20.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e46c57bb3c269d0d3c222e1d17acc5abce0a50199dc526829f5dd4e1eee4011 +size 5048 diff --git a/app/external/saved_bets/2021-04-20.betsson b/app/external/saved_bets/2021-04-20.betsson new file mode 100644 index 00000000..9255e03b --- /dev/null +++ b/app/external/saved_bets/2021-04-20.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b04fb2702e8592bc58ab2c7a2df98d17dc8a1cb0fa7bc90913d0381928aecc7 +size 3167 diff --git a/app/external/saved_bets/2021-04-20.betway b/app/external/saved_bets/2021-04-20.betway new file mode 100644 index 00000000..fd727d42 --- /dev/null +++ b/app/external/saved_bets/2021-04-20.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4351dbd23334835bfe310151adf2afe9a00e1af90137e312cf850170d3aecae +size 6513 diff --git a/app/external/saved_bets/2021-04-20.ss b/app/external/saved_bets/2021-04-20.ss new file mode 100644 index 00000000..8fade68e --- /dev/null +++ b/app/external/saved_bets/2021-04-20.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65a1f169935e349f9198e18f64c3c972adddf2ebf081b4ceb1cb3d7033f51c1a +size 4218 diff --git a/app/external/saved_bets/2021-04-20.unibet b/app/external/saved_bets/2021-04-20.unibet new file mode 100644 index 00000000..3b510b76 --- /dev/null +++ b/app/external/saved_bets/2021-04-20.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f843c652f422bffe2db0a05dd49801db72c8446e415d4f84ab03eebc82887872 +size 2698 diff --git a/app/external/saved_bets/2021-04-20.wh b/app/external/saved_bets/2021-04-20.wh new file mode 100644 index 00000000..210adc51 --- /dev/null +++ b/app/external/saved_bets/2021-04-20.wh @@ -0,0 +1,263 @@ +Buffalo Sabres - Boston Bruins + +Olofsson, Victor +Över 2.5 +2.20 +Under 2.5 +1.60 +Dahlin, Rasmus +Över 2.5 +2.65 +Under 2.5 +1.42 +Reinhart, Sam +Över 2.5 +2.30 +Under 2.5 +1.55 +Marchand, Brad +Över 2.5 +2.00 +Under 2.5 +1.72 +Bergeron, Patrice +Över 2.5 +1.55 +Under 2.5 +2.30 +Pastrnak, David +Över 3.5 +1.65 +Under 3.5 +2.10 + +Florida Panthers - Columbus Blue Jackets + +Barkov, Aleksander +Över 2.5 +1.50 +Under 2.5 +2.40 +Huberdeau, Jonathan +Över 2.5 +2.25 +Under 2.5 +1.57 +Hörnqvist, Patric +Över 2.5 +1.62 +Under 2.5 +2.15 +Atkinson, Cam +Över 2.5 +1.80 +Under 2.5 +1.90 +Laine, Patrik +Över 2.5 +2.25 +Under 2.5 +1.57 +Björkstrand, Oliver +Över 2.5 +2.10 +Under 2.5 +1.65 + +NY Islanders - NY Rangers + +Barzal, Mathew +Över 2.5 +2.10 +Under 2.5 +1.65 +Nelson, Brock +Över 2.5 +2.10 +Under 2.5 +1.65 +Eberle, Jordan +Över 2.5 +2.20 +Under 2.5 +1.60 +Panarin, Artemi +Över 2.5 +1.80 +Under 2.5 +1.90 +Kreider, Chris +Över 2.5 +2.50 +Under 2.5 +1.47 +Zibanejad, Mika +Över 3.5 +2.50 +Under 3.5 +1.47 + +Pittsburgh Penguins - New Jersey Devils + +Crosby, Sidney +Över 2.5 +1.65 +Under 2.5 +2.10 +Letang, Kris +Över 2.5 +2.00 +Under 2.5 +1.72 +Guentzel, Jake +Över 2.5 +1.62 +Under 2.5 +2.15 +Hischier, Nico +Över 2.5 +2.20 +Under 2.5 +1.60 +Subban, P. K. +Över 2.5 +2.55 +Under 2.5 +1.45 +Hughes, Jack +Över 2.5 +1.90 +Under 2.5 +1.80 + +Tampa Bay Lightning - Carolina Hurricanes + +Hedman, Victor +Över 2.5 +1.95 +Under 2.5 +1.75 +Point, Brayden +Över 2.5 +2.20 +Under 2.5 +1.60 +Aho, Sebastian (1997) +Över 2.5 +1.72 +Under 2.5 +2.00 +Hamilton, Dougie +Över 2.5 +1.50 +Under 2.5 +2.40 +Svechnikov, Andrei +Över 2.5 +1.80 +Under 2.5 +1.90 +Killorn, Alex +Över 1.5 +1.75 +Under 1.5 +1.95 + +Dallas Stars - Detroit Red Wings + +Benn, Jamie +Över 2.5 +2.10 +Under 2.5 +1.65 +Klingberg, John +Över 2.5 +2.50 +Under 2.5 +1.47 +Pavelski, Joe +Över 2.5 +2.25 +Under 2.5 +1.57 +Larkin, Dylan +Över 2.5 +1.72 +Under 2.5 +2.00 +Zadina, Filip +Över 1.5 +1.52 +Under 1.5 +2.35 +Hronek, Filip +Över 1.5 +1.62 +Under 1.5 +2.15 + +Vancouver Canucks - Toronto Maple Leafs + +Boeser, Brock +Över 2.5 +2.00 +Under 2.5 +1.72 +Horvat, Bowie +Över 2.5 +2.25 +Under 2.5 +1.57 +Tavares, John +Över 2.5 +1.62 +Under 2.5 +2.15 +Marner, Mitch +Över 2.5 +1.62 +Under 2.5 +2.15 +Miller, J.T. +Över 1.5 +1.60 +Under 1.5 +2.20 +Matthews, Auston +Över 3.5 +1.52 +Under 3.5 +2.35 + +Los Angeles Kings - Anaheim Ducks + +Brown, Dustin +Över 2.5 +1.80 +Under 2.5 +1.90 +Rakell, Rickard +Över 2.5 +1.72 +Under 2.5 +2.00 +Doughty, Drew +Över 1.5 +1.72 +Under 1.5 +2.00 +Kopitar, Anze +Över 1.5 +1.50 +Under 1.5 +2.40 +Silfverberg, Jakob +Över 1.5 +1.62 +Under 1.5 +2.15 +Comtois, Maxime +Över 1.5 +1.85 +Under 1.5 +1.85 \ No newline at end of file diff --git a/app/external/saved_bets/2021-04-21.bet365 b/app/external/saved_bets/2021-04-21.bet365 new file mode 100644 index 00000000..3343180b --- /dev/null +++ b/app/external/saved_bets/2021-04-21.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:131fcdb6fc4a4cd14f2af31034433cec29ffc5dc2b00ac7a66d1187c357febf6 +size 2370 diff --git a/app/external/saved_bets/2021-04-21.betsson b/app/external/saved_bets/2021-04-21.betsson new file mode 100644 index 00000000..8022591f --- /dev/null +++ b/app/external/saved_bets/2021-04-21.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2072870add3a437e7567e90866d2460c78e382cff152483017ef242ce5aa29b4 +size 2639 diff --git a/app/external/saved_bets/2021-04-21.betway b/app/external/saved_bets/2021-04-21.betway new file mode 100644 index 00000000..3a3852f1 --- /dev/null +++ b/app/external/saved_bets/2021-04-21.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e50a0d0933e0f3c61db402a36a701fd59003673e491128f9342b34933c8d6b1 +size 3500 diff --git a/app/external/saved_bets/2021-04-21.ss b/app/external/saved_bets/2021-04-21.ss new file mode 100644 index 00000000..343e31b1 --- /dev/null +++ b/app/external/saved_bets/2021-04-21.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36e530ef958852aaaa580043de372d2308f792b51246a959029651deda55694f +size 2277 diff --git a/app/external/saved_bets/2021-04-21.unibet b/app/external/saved_bets/2021-04-21.unibet new file mode 100644 index 00000000..18f20475 --- /dev/null +++ b/app/external/saved_bets/2021-04-21.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f616c4e3adb4a1dbc7c68e70765453727235bacd2e287f3186c7d39a08dd2141 +size 1373 diff --git a/app/external/saved_bets/2021-04-21.wh b/app/external/saved_bets/2021-04-21.wh new file mode 100644 index 00000000..d2cab540 --- /dev/null +++ b/app/external/saved_bets/2021-04-21.wh @@ -0,0 +1,131 @@ +Chicago Blackhawks - Nashville Predators + +DeBrincat, Alex +Över 2.5 +1.72 +Under 2.5 +2.00 +Kubalik, Dominik +Över 2.5 +1.95 +Under 2.5 +1.75 +Josi, Roman +Över 2.5 +1.72 +Under 2.5 +2.00 +Kane, Patrick +Över 3.5 +2.20 +Under 3.5 +1.60 +Johansen, Ryan +Över 1.5 +1.80 +Under 1.5 +1.90 +Granlund, Mikael +Över 1.5 +1.82 +Under 1.5 +1.88 + +Arizona Coyotes - Minnesota Wild + +Kessel, Phil +Över 2.5 +2.55 +Under 2.5 +1.45 +Keller, Clayton +Över 2.5 +2.65 +Under 2.5 +1.42 +Fiala, Kevin +Över 2.5 +1.67 +Under 2.5 +2.08 +Kaprizov, Kirill +Över 2.5 +2.00 +Under 2.5 +1.72 +Dvorak, Christian +Över 1.5 +1.75 +Under 1.5 +1.95 +Suter, Ryan +Över 1.5 +2.10 +Under 1.5 +1.65 + +Vegas Golden Knights - San José Sharks + +Marchessault, Jonathan +Över 2.5 +1.62 +Under 2.5 +2.15 +Stone, Mark +Över 2.5 +2.65 +Under 2.5 +1.42 +Burns, Brent +Över 2.5 +1.95 +Under 2.5 +1.75 +Couture, Logan +Över 2.5 +2.50 +Under 2.5 +1.47 +Pacioretty, Max +Över 3.5 +1.92 +Under 3.5 +1.78 +Kane, Evander +Över 3.5 +2.35 +Under 3.5 +1.52 + +Edmonton Oilers - Montreal Canadiens + +McDavid, Connor +Över 3.5 +1.90 +Under 3.5 +1.80 +Draisaitl, Leon +Över 2.5 +1.60 +Under 2.5 +2.20 +Nurse, Darnell +Över 2.5 +2.10 +Under 2.5 +1.65 +Weber, Shea +Över 2.5 +2.50 +Under 2.5 +1.47 +Toffoli, Tyler +Över 2.5 +1.67 +Under 2.5 +2.08 +Drouin, Jonathan +Över 1.5 +1.65 +Under 1.5 +2.10 \ No newline at end of file diff --git a/app/external/saved_bets/2021-04-22.bet365 b/app/external/saved_bets/2021-04-22.bet365 new file mode 100644 index 00000000..d3a88fe7 --- /dev/null +++ b/app/external/saved_bets/2021-04-22.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:789f8bb5cb2e4b1390676482758f0497cf3bf700376c13f94d2c43dd7ff97423 +size 4858 diff --git a/app/external/saved_bets/2021-04-22.betsson b/app/external/saved_bets/2021-04-22.betsson new file mode 100644 index 00000000..86a808e3 --- /dev/null +++ b/app/external/saved_bets/2021-04-22.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e4bbbf4dee2b56875498ec21a15efe5bf75865997e8ecf367165340ce128f8b +size 4328 diff --git a/app/external/saved_bets/2021-04-22.betway b/app/external/saved_bets/2021-04-22.betway new file mode 100644 index 00000000..2bf593fd --- /dev/null +++ b/app/external/saved_bets/2021-04-22.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2034e0dd0e2c4c908485db268d5d67008dcd1582e7a79e7e894ae156b782cea8 +size 7181 diff --git a/app/external/saved_bets/2021-04-22.ss b/app/external/saved_bets/2021-04-22.ss new file mode 100644 index 00000000..3729e58a --- /dev/null +++ b/app/external/saved_bets/2021-04-22.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ab7c01db972b2879440996af8b4be39d67cff2fe5c39773b85358a807d000c1 +size 5200 diff --git a/app/external/saved_bets/2021-04-22.unibet b/app/external/saved_bets/2021-04-22.unibet new file mode 100644 index 00000000..d51ac098 --- /dev/null +++ b/app/external/saved_bets/2021-04-22.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9104ee8f449c55289a0df32f2a4da7a52690770168239f330aabde835a5566de +size 3437 diff --git a/app/external/saved_bets/2021-04-22.wh b/app/external/saved_bets/2021-04-22.wh new file mode 100644 index 00000000..5291a1c0 --- /dev/null +++ b/app/external/saved_bets/2021-04-22.wh @@ -0,0 +1,332 @@ +Buffalo Sabres - Boston Bruins + +Olofsson, Victor +Över 2.5 +2.20 +Under 2.5 +1.60 +Dahlin, Rasmus +Över 2.5 +2.65 +Under 2.5 +1.42 +Reinhart, Sam +Över 2.5 +2.30 +Under 2.5 +1.55 +Marchand, Brad +Över 2.5 +1.95 +Under 2.5 +1.75 +Bergeron, Patrice +Över 2.5 +1.60 +Under 2.5 +2.20 +Pastrnak, David +Över 3.5 +1.72 +Under 3.5 +2.00 + +Florida Panthers - Carolina Hurricanes + +Barkov, Aleksander +Över 2.5 +1.52 +Under 2.5 +2.35 +Huberdeau, Jonathan +Över 2.5 +2.40 +Under 2.5 +1.50 +Aho, Sebastian (1997) +Över 2.5 +1.67 +Under 2.5 +2.08 +Hamilton, Dougie +Över 2.5 +1.50 +Under 2.5 +2.40 +Svechnikov, Andrei +Över 2.5 +1.80 +Under 2.5 +1.90 +Vatrano, Frank +Över 2.5 +1.80 +Under 2.5 +1.90 + +NY Islanders - Washington Capitals + +Barzal, Mathew +Över 2.5 +2.20 +Under 2.5 +1.60 +Nelson, Brock +Över 2.5 +2.30 +Under 2.5 +1.55 +Eberle, Jordan +Över 2.5 +2.15 +Under 2.5 +1.62 +Bäckström, Nicklas +Över 2.5 +2.50 +Under 2.5 +1.47 +Carlson, John +Över 2.5 +2.15 +Under 2.5 +1.62 +Ovechkin, Alexander +Över 4.5 +2.20 +Under 4.5 +1.60 + +NY Rangers - Philadelphia Flyers + +Panarin, Artemi +Över 2.5 +1.80 +Under 2.5 +1.90 +Kreider, Chris +Över 2.5 +2.45 +Under 2.5 +1.48 +Giroux, Claude +Över 2.5 +2.25 +Under 2.5 +1.57 +Couturier, Sean +Över 2.5 +2.20 +Under 2.5 +1.60 +Hayes, Kevin +Över 2.5 +2.50 +Under 2.5 +1.47 +Zibanejad, Mika +Över 3.5 +2.30 +Under 3.5 +1.55 + +Pittsburgh Penguins - New Jersey Devils + +Crosby, Sidney +Över 2.5 +1.60 +Under 2.5 +2.20 +Letang, Kris +Över 2.5 +2.05 +Under 2.5 +1.70 +Guentzel, Jake +Över 2.5 +1.65 +Under 2.5 +2.10 +Hischier, Nico +Över 2.5 +2.15 +Under 2.5 +1.62 +Hughes, Jack +Över 2.5 +1.85 +Under 2.5 +1.85 +Wood, Miles +Över 2.5 +2.50 +Under 2.5 +1.47 + +Tampa Bay Lightning - Columbus Blue Jackets + +Hedman, Victor +Över 2.5 +1.95 +Under 2.5 +1.75 +Point, Brayden +Över 2.5 +2.15 +Under 2.5 +1.62 +Atkinson, Cam +Över 2.5 +1.72 +Under 2.5 +2.00 +Laine, Patrik +Över 2.5 +2.25 +Under 2.5 +1.57 +Björkstrand, Oliver +Över 2.5 +2.15 +Under 2.5 +1.62 +Killorn, Alex +Över 1.5 +1.70 +Under 1.5 +2.05 + +Winnipeg Jets - Toronto Maple Leafs + +Scheifele, Mark +Över 2.5 +2.30 +Under 2.5 +1.55 +Connor, Kyle +Över 2.5 +1.57 +Under 2.5 +2.25 +Ehlers, Nikolaj +Över 2.5 +1.65 +Under 2.5 +2.10 +Tavares, John +Över 2.5 +1.65 +Under 2.5 +2.10 +Marner, Mitch +Över 2.5 +1.72 +Under 2.5 +2.00 +Matthews, Auston +Över 3.5 +1.55 +Under 3.5 +2.30 + +Detroit Red Wings - Dallas Stars + +Larkin, Dylan +Över 2.5 +1.70 +Under 2.5 +2.05 +Benn, Jamie +Över 2.5 +2.15 +Under 2.5 +1.62 +Klingberg, John +Över 2.5 +2.50 +Under 2.5 +1.47 +Pavelski, Joe +Över 2.5 +2.25 +Under 2.5 +1.57 +Zadina, Filip +Över 1.5 +1.50 +Under 1.5 +2.40 +Hronek, Filip +Över 1.5 +1.62 +Under 1.5 +2.15 + +St Louis Blues - Colorado Avalanche + +Krug, Torey +Över 2.5 +2.25 +Under 2.5 +1.57 +Perron, David +Över 2.5 +2.10 +Under 2.5 +1.65 +Landeskog, Gabriel +Över 2.5 +1.80 +Under 2.5 +1.90 +O'Reilly, Ryan +Över 1.5 +1.50 +Under 1.5 +2.40 +MacKinnon, Nathan +Över 3.5 +1.62 +Under 3.5 +2.15 +Makar, Cale +Över 1.5 +1.50 +Under 1.5 +2.40 + +Vancouver Canucks - Ottawa Senators + +Boeser, Brock +Över 2.5 +2.00 +Under 2.5 +1.72 +Horvat, Bowie +Över 2.5 +2.20 +Under 2.5 +1.60 +Chabot, Thomas +Över 2.5 +2.05 +Under 2.5 +1.70 +Miller, J.T. +Över 1.5 +1.55 +Under 1.5 +2.30 +Dadonov, Evgeny +Över 1.5 +1.64 +Under 1.5 +2.15 +Tkachuk, Brady +Över 3.5 +1.80 +Under 3.5 +1.90 + + + diff --git a/app/external/saved_bets/2021-04-23.bet365 b/app/external/saved_bets/2021-04-23.bet365 new file mode 100644 index 00000000..b7b94105 --- /dev/null +++ b/app/external/saved_bets/2021-04-23.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07e3ed355689092cc0a90c1ec3895d240bcdb573ad07d4928e1d57bad49c8258 +size 3246 diff --git a/app/external/saved_bets/2021-04-23.betsson b/app/external/saved_bets/2021-04-23.betsson new file mode 100644 index 00000000..bc3f566b --- /dev/null +++ b/app/external/saved_bets/2021-04-23.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad59a908f12aed7246849d211f92aa5bdbf33fb9494b8041910e5a972d250da0 +size 2630 diff --git a/app/external/saved_bets/2021-04-23.betway b/app/external/saved_bets/2021-04-23.betway new file mode 100644 index 00000000..1a2b1f44 --- /dev/null +++ b/app/external/saved_bets/2021-04-23.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:446b4e53065753bc9a634d3872119e7671a09a473df820143ddd821f031240fa +size 4595 diff --git a/app/external/saved_bets/2021-04-23.ss b/app/external/saved_bets/2021-04-23.ss new file mode 100644 index 00000000..0da93d76 --- /dev/null +++ b/app/external/saved_bets/2021-04-23.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:228e1f92f2ff442a2706b72e62bee4394c0b8126afad0f615ce6c51a722dacb1 +size 3007 diff --git a/app/external/saved_bets/2021-04-23.unibet b/app/external/saved_bets/2021-04-23.unibet new file mode 100644 index 00000000..f5bfd6af --- /dev/null +++ b/app/external/saved_bets/2021-04-23.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f99cc0a18c3de7a25a83e1320c888b526e6a186872374b5942e229bc348a23d +size 1702 diff --git a/app/external/saved_bets/2021-04-23.wh b/app/external/saved_bets/2021-04-23.wh new file mode 100644 index 00000000..71bb7643 --- /dev/null +++ b/app/external/saved_bets/2021-04-23.wh @@ -0,0 +1,167 @@ +Buffalo Sabres - Boston Bruins + +Olofsson, Victor +Över 2.5 +2.20 +Under 2.5 +1.60 +Dahlin, Rasmus +Över 2.5 +2.65 +Under 2.5 +1.42 +Reinhart, Sam +Över 2.5 +2.30 +Under 2.5 +1.55 +Marchand, Brad +Över 2.5 +1.95 +Under 2.5 +1.75 +Bergeron, Patrice +Över 2.5 +1.60 +Under 2.5 +2.20 +Pastrnak, David +Över 3.5 +1.65 +Under 3.5 +2.10 + +NY Rangers - Philadelphia Flyers + +Zibanejad, Mika +Över 3.5 +2.10 +Under 3.5 +1.65 +Panarin, Artemi +Över 2.5 +1.80 +Under 2.5 +1.90 +Kreider, Chris +Över 2.5 +2.45 +Under 2.5 +1.48 +Giroux, Claude +Över 2.5 +2.25 +Under 2.5 +1.57 +Couturier, Sean +Över 2.5 +2.20 +Under 2.5 +1.60 +Hayes, Kevin +Över 2.5 +2.50 +Under 2.5 +1.47 + +Chicago Blackhawks - Nashville Predators + +Kane, Patrick +Över 3.5 +2.20 +Under 3.5 +1.60 +DeBrincat, Alex +Över 2.5 +1.72 +Under 2.5 +2.00 +Kubalik, Dominik +Över 2.5 +1.85 +Under 2.5 +1.85 +Josi, Roman +Över 2.5 +1.72 +Under 2.5 +2.00 +Johansen, Ryan +Över 1.5 +1.80 +Under 1.5 +1.90 +Granlund, Mikael +Över 1.5 +1.88 +Under 1.5 +1.82 + +Calgary Flames - Montreal Canadiens + +Gaudreau, Johnny +Över 2.5 +2.40 +Under 2.5 +1.50 +Lindholm, Elias +Över 2.5 +2.35 +Under 2.5 +1.52 +Tkachuk, Matthew +Över 2.5 +2.15 +Under 2.5 +1.62 +Weber, Shea +Över 2.5 +2.40 +Under 2.5 +1.50 +Toffoli, Tyler +Över 2.5 +1.62 +Under 2.5 +2.15 +Drouin, Jonathan +Över 1.5 +1.60 +Under 1.5 +2.20 + +Los Angeles Kings - Minnesota Wild + +Brown, Dustin +Över 2.5 +1.90 +Under 2.5 +1.80 +Fiala, Kevin +Över 2.5 +1.67 +Under 2.5 +2.08 +Kaprizov, Kirill +Över 2.5 +1.85 +Under 2.5 +1.85 +Doughty, Drew +Över 1.5 +1.82 +Under 1.5 +1.88 +Kopitar, Anze +Över 1.5 +1.55 +Under 1.5 +2.30 +Suter, Ryan +Över 1.5 +2.10 +Under 1.5 +1.65 + + + diff --git a/app/external/saved_bets/2021-04-25.bet365 b/app/external/saved_bets/2021-04-25.bet365 new file mode 100644 index 00000000..15bdb7e4 --- /dev/null +++ b/app/external/saved_bets/2021-04-25.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:176e043b5fe275555c3ecdf5c97ac78fdec8ef7e490ee8204709c379bc95d3a3 +size 2592 diff --git a/app/external/saved_bets/2021-04-25.betsson b/app/external/saved_bets/2021-04-25.betsson new file mode 100644 index 00000000..afdea81d --- /dev/null +++ b/app/external/saved_bets/2021-04-25.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24308d9eb04f4a3d8b7a03d6cecf8b6231e5762a401dab738b0f12e203ca70e5 +size 1664 diff --git a/app/external/saved_bets/2021-04-25.betway b/app/external/saved_bets/2021-04-25.betway new file mode 100644 index 00000000..ec8d8c08 --- /dev/null +++ b/app/external/saved_bets/2021-04-25.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:55c9474ee9f8808f56bf74394624ea35e8665e00fa8f31107c2ec6e56ae73a58 +size 3646 diff --git a/app/external/saved_bets/2021-04-25.ss b/app/external/saved_bets/2021-04-25.ss new file mode 100644 index 00000000..aa6c22fc --- /dev/null +++ b/app/external/saved_bets/2021-04-25.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da651976f011a4846cc9f84768c176dfd03e52887ecea6345154aea090c6c5ff +size 2204 diff --git a/app/external/saved_bets/2021-04-25.unibet b/app/external/saved_bets/2021-04-25.unibet new file mode 100644 index 00000000..24316638 --- /dev/null +++ b/app/external/saved_bets/2021-04-25.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c121579391504bb81422a37bbcffec8ec82c77c09cb184b8bb38d1983b4621f9 +size 1368 diff --git a/app/external/saved_bets/2021-04-25.wh b/app/external/saved_bets/2021-04-25.wh new file mode 100644 index 00000000..89f172c0 --- /dev/null +++ b/app/external/saved_bets/2021-04-25.wh @@ -0,0 +1,131 @@ +Pittsburgh Penguins - Boston Bruins + +Crosby, Sidney +Över 2.5 +1.65 +Under 2.5 +2.10 +Letang, Kris +Över 2.5 +2.15 +Under 2.5 +1.62 +Guentzel, Jake +Över 2.5 +1.85 +Under 2.5 +1.85 +Marchand, Brad +Över 2.5 +2.05 +Under 2.5 +1.68 +Bergeron, Patrice +Över 2.5 +1.72 +Under 2.5 +2.00 +Pastrnak, David +Över 3.5 +1.85 +Under 3.5 +1.85 + +NY Rangers - Buffalo Sabres + +Panarin, Artemi +Över 2.5 +1.75 +Under 2.5 +1.95 +Kreider, Chris +Över 2.5 +2.35 +Under 2.5 +1.52 +Olofsson, Victor +Över 2.5 +2.10 +Under 2.5 +1.65 +Dahlin, Rasmus +Över 2.5 +2.55 +Under 2.5 +1.45 +Reinhart, Sam +Över 2.5 +2.20 +Under 2.5 +1.60 +Zibanejad, Mika +Över 3.5 +2.10 +Under 3.5 +1.65 + +Philadelphia Flyers - New Jersey Devils + +Giroux, Claude +Över 2.5 +2.15 +Under 2.5 +1.62 +Couturier, Sean +Över 2.5 +1.95 +Under 2.5 +1.75 +Hayes, Kevin +Över 2.5 +2.40 +Under 2.5 +1.50 +Hischier, Nico +Över 2.5 +2.05 +Under 2.5 +1.68 +Hughes, Jack +Över 2.5 +1.75 +Under 2.5 +1.95 +Wood, Miles +Över 2.5 +2.40 +Under 2.5 +1.50 + +Tampa Bay Lightning - Columbus Blue Jackets + +Hedman, Victor +Över 2.5 +1.95 +Under 2.5 +1.75 +Point, Brayden +Över 2.5 +2.15 +Under 2.5 +1.62 +Atkinson, Cam +Över 2.5 +1.72 +Under 2.5 +2.00 +Laine, Patrik +Över 2.5 +2.25 +Under 2.5 +1.57 +Björkstrand, Oliver +Över 2.5 +2.10 +Under 2.5 +1.65 +Killorn, Alex +Över 1.5 +1.70 +Under 1.5 +2.05 \ No newline at end of file diff --git a/app/external/saved_bets/2021-04-26.bet365 b/app/external/saved_bets/2021-04-26.bet365 new file mode 100644 index 00000000..1dc8bcda --- /dev/null +++ b/app/external/saved_bets/2021-04-26.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd3be719c334a8cff31e128fe1c897c5d2e402581df5ddb5623586f7efb6053c +size 3202 diff --git a/app/external/saved_bets/2021-04-26.betsson b/app/external/saved_bets/2021-04-26.betsson new file mode 100644 index 00000000..a99cd7fc --- /dev/null +++ b/app/external/saved_bets/2021-04-26.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2056d55d64baeffd1b5bb844b774e351bf1bcbf142ef50d8df31425671b0048 +size 2980 diff --git a/app/external/saved_bets/2021-04-26.betway b/app/external/saved_bets/2021-04-26.betway new file mode 100644 index 00000000..bdf74cfc --- /dev/null +++ b/app/external/saved_bets/2021-04-26.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7068d79bd9ad62d1020954b009d35b4fdefab35b2d2751d04adc19ea5d6e23d8 +size 3814 diff --git a/app/external/saved_bets/2021-04-26.ss b/app/external/saved_bets/2021-04-26.ss new file mode 100644 index 00000000..92b80ac1 --- /dev/null +++ b/app/external/saved_bets/2021-04-26.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e20471354c32c1db9f50196997e92114ea4f86b5ea91b9ba7f61f3f907089521 +size 3801 diff --git a/app/external/saved_bets/2021-04-26.unibet b/app/external/saved_bets/2021-04-26.unibet new file mode 100644 index 00000000..8c7cad26 --- /dev/null +++ b/app/external/saved_bets/2021-04-26.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9751b9e6332c76116705fcb40f13826c5535e98e8469ea105dd524031aabca47 +size 2738 diff --git a/app/external/saved_bets/2021-04-26.wh b/app/external/saved_bets/2021-04-26.wh new file mode 100644 index 00000000..402f19ce --- /dev/null +++ b/app/external/saved_bets/2021-04-26.wh @@ -0,0 +1,264 @@ +Calgary Flames - Montreal Canadiens + +Gaudreau, Johnny +Över 2.5 +2.40 +Under 2.5 +1.50 +Lindholm, Elias +Över 2.5 +2.35 +Under 2.5 +1.52 +Tkachuk, Matthew +Över 2.5 +2.15 +Under 2.5 +1.62 +Weber, Shea +Över 2.5 +2.40 +Under 2.5 +1.50 +Toffoli, Tyler +Över 2.5 +1.60 +Under 2.5 +2.20 +Suzuki, Nick +Över 1.5 +1.85 +Under 1.5 +1.85 + +Ottawa Senators - Vancouver Canucks + +Chabot, Thomas +Över 2.5 +1.90 +Under 2.5 +1.80 +Boeser, Brock +Över 2.5 +1.95 +Under 2.5 +1.75 +Horvat, Bowie +Över 2.5 +2.15 +Under 2.5 +1.62 +Dadonov, Evgeny +Över 1.5 +1.62 +Under 1.5 +2.15 +Miller, J.T. +Över 1.5 +1.55 +Under 1.5 +2.30 +Tkachuk, Brady +Över 3.5 +1.80 +Under 3.5 +1.90 + +St Louis Blues - Colorado Avalanche + +Krug, Torey +Över 2.5 +2.25 +Under 2.5 +1.57 +Perron, David +Över 2.5 +2.15 +Under 2.5 +1.62 +Landeskog, Gabriel +Över 2.5 +1.80 +Under 2.5 +1.90 +O'Reilly, Ryan +Över 1.5 +1.50 +Under 1.5 +2.40 +Makar, Cale +Över 1.5 +1.50 +Under 1.5 +2.40 +MacKinnon, Nathan +Över 3.5 +1.52 +Under 3.5 +2.35 + +Dallas Stars - Carolina Hurricanes + +Benn, Jamie +Över 2.5 +2.25 +Under 2.5 +1.57 +Klingberg, John +Över 2.5 +2.65 +Under 2.5 +1.42 +Pavelski, Joe +Över 2.5 +2.35 +Under 2.5 +1.52 +Aho, Sebastian (1997) +Över 2.5 +1.67 +Under 2.5 +2.08 +Hamilton, Dougie +Över 2.5 +1.55 +Under 2.5 +2.30 +Svechnikov, Andrei +Över 2.5 +1.90 +Under 2.5 +1.80 + +Nashville Predators - Florida Panthers + +Josi, Roman +Över 2.5 +1.72 +Under 2.5 +2.00 +Barkov, Aleksander +Över 2.5 +1.50 +Under 2.5 +2.40 +Huberdeau, Jonathan +Över 2.5 +2.35 +Under 2.5 +1.52 +Hörnqvist, Patric +Över 2.5 +1.60 +Under 2.5 +2.20 +Johansen, Ryan +Över 1.5 +1.85 +Under 1.5 +1.85 +Granlund, Mikael +Över 1.5 +1.90 +Under 1.5 +1.80 + +Winnipeg Jets - Edmonton Oilers + +Scheifele, Mark +Över 2.5 +2.15 +Under 2.5 +1.62 +Connor, Kyle +Över 2.5 +1.52 +Under 2.5 +2.35 +Draisaitl, Leon +Över 2.5 +1.57 +Under 2.5 +2.25 +Nurse, Darnell +Över 2.5 +2.05 +Under 2.5 +1.70 +McDavid, Connor +Över 3.5 +1.90 +Under 3.5 +1.80 +Wheeler, Blake +Över 2.5 +2.50 +Under 2.5 +1.47 + +Los Angeles Kings - Anaheim Ducks + +Doughty, Drew +Över 1.5 +1.72 +Under 1.5 +2.00 +Kopitar, Anze +Över 1.5 +1.45 +Under 1.5 +2.55 +Getzlaf, Ryan +Över 1.5 +2.00 +Under 1.5 +1.72 +Comtois, Maxime +Över 1.5 +1.85 +Under 1.5 +1.85 +Brown, Dustin +Över 2.5 +1.75 +Under 2.5 +1.95 +Rakell, Rickard +Över 2.5 +1.85 +Under 2.5 +1.85 + +San José Sharks - Arizona Coyotes + +Burns, Brent +Över 2.5 +2.00 +Under 2.5 +1.72 +Couture, Logan +Över 2.5 +2.50 +Under 2.5 +1.47 +Kessel, Phil +Över 2.5 +2.15 +Under 2.5 +1.62 +Keller, Clayton +Över 2.5 +2.60 +Under 2.5 +1.43 +Kane, Evander +Över 3.5 +2.35 +Under 3.5 +1.52 +Dvorak, Christian +Över 1.5 +1.70 +Under 1.5 +2.05 + diff --git a/app/external/saved_bets/2021-04-27.bet365 b/app/external/saved_bets/2021-04-27.bet365 new file mode 100644 index 00000000..553aa91c --- /dev/null +++ b/app/external/saved_bets/2021-04-27.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba2c85d630ad733ab07db9327ef1554db83cac2433bea9787ea3593a10c92e00 +size 4150 diff --git a/app/external/saved_bets/2021-04-27.betsson b/app/external/saved_bets/2021-04-27.betsson new file mode 100644 index 00000000..96460f05 --- /dev/null +++ b/app/external/saved_bets/2021-04-27.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10695857dcbb73aa62a94cb4ead34ed915f0c3a2eb42e8ac2247f49cf7deb504 +size 5104 diff --git a/app/external/saved_bets/2021-04-27.betway b/app/external/saved_bets/2021-04-27.betway new file mode 100644 index 00000000..2616626c --- /dev/null +++ b/app/external/saved_bets/2021-04-27.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6934eaffee67e58096093cf466fa0259d180478ea33c1b439d81ae2afa9e5790 +size 5440 diff --git a/app/external/saved_bets/2021-04-27.ss b/app/external/saved_bets/2021-04-27.ss new file mode 100644 index 00000000..42b62fae --- /dev/null +++ b/app/external/saved_bets/2021-04-27.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:179a29c5cbec736d127ff5faf02e293ead524bc09c09895728946d3b2cf7e642 +size 3878 diff --git a/app/external/saved_bets/2021-04-27.unibet b/app/external/saved_bets/2021-04-27.unibet new file mode 100644 index 00000000..1e1d8188 --- /dev/null +++ b/app/external/saved_bets/2021-04-27.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5ac3f12f886c5ba09b531c2b7f0df3f7e90abe26f16a61adf98c9051686afd9 +size 2808 diff --git a/app/external/saved_bets/2021-04-27.wh b/app/external/saved_bets/2021-04-27.wh new file mode 100644 index 00000000..eebfc7f0 --- /dev/null +++ b/app/external/saved_bets/2021-04-27.wh @@ -0,0 +1,268 @@ +Columbus Blue Jackets - Detroit Red Wings + +Atkinson, Cam +Över 2.5 +1.75 +Under 2.5 +2.00 +Laine, Patrik +Över 2.5 +2.15 +Under 2.5 +1.62 +Björkstrand, Oliver +Över 2.5 +2.00 +Under 2.5 +1.72 +Vrána, Jakub +Över 2.5 +2.10 +Under 2.5 +1.65 +Zadina, Filip +Över 1.5 +1.48 +Under 1.5 +2.45 +Hronek, Filip +Över 1.5 +1.62 +Under 1.5 +2.15 + +NY Rangers - Buffalo Sabres + +Panarin, Artemi +Över 2.5 +1.75 +Under 2.5 +1.95 +Kreider, Chris +Över 2.5 +2.35 +Under 2.5 +1.52 +Olofsson, Victor +Över 2.5 +2.10 +Under 2.5 +1.65 +Dahlin, Rasmus +Över 2.5 +2.55 +Under 2.5 +1.45 +Reinhart, Sam +Över 2.5 +2.20 +Under 2.5 +1.60 +Zibanejad, Mika +Över 3.5 +2.30 +Under 3.5 +1.55 + +New Jersey Devils - Philadelphia Flyers + +Hischier, Nico +Över 2.5 +2.05 +Under 2.5 +1.68 +Hughes, Jack +Över 2.5 +1.75 +Under 2.5 +1.95 +Wood, Miles +Över 2.5 +2.40 +Under 2.5 +1.50 +Giroux, Claude +Över 2.5 +2.15 +Under 2.5 +1.62 +Couturier, Sean +Över 2.5 +1.95 +Under 2.5 +1.75 +Hayes, Kevin +Över 2.5 +2.40 +Under 2.5 +1.50 + +Pittsburgh Penguins - Boston Bruins + +Crosby, Sidney +Över 2.5 +1.65 +Under 2.5 +2.10 +Letang, Kris +Över 2.5 +2.15 +Under 2.5 +1.62 +Guentzel, Jake +Över 2.5 +1.85 +Under 2.5 +1.85 +Marchand, Brad +Över 2.5 +2.00 +Under 2.5 +1.72 +Bergeron, Patrice +Över 2.5 +1.72 +Under 2.5 +2.00 +Pastrnak, David +Över 3.5 +1.85 +Under 3.5 +1.85 + +Washington Capitals - NY Islanders + +Bäckström, Nicklas +Över 2.5 +2.50 +Under 2.5 +1.47 +Carlson, John +Över 2.5 +2.15 +Under 2.5 +1.62 +Barzal, Mathew +Över 2.5 +2.20 +Under 2.5 +1.60 +Nelson, Brock +Över 2.5 +2.30 +Under 2.5 +1.55 +Eberle, Jordan +Över 2.5 +2.22 +Under 2.5 +1.58 +Oshie, T.J. +Över 1.5 +1.52 +Under 1.5 +2.35 + +Chicago Blackhawks - Tampa Bay Lightning + +DeBrincat, Alex +Över 2.5 +1.75 +Under 2.5 +1.95 +Kubalik, Dominik +Över 2.5 +1.85 +Under 2.5 +1.85 +Hedman, Victor +Över 2.5 +1.95 +Under 2.5 +1.75 +Point, Brayden +Över 2.5 +2.00 +Under 2.5 +1.72 +Kane, Patrick +Över 3.5 +2.25 +Under 3.5 +1.57 +Killorn, Alex +Över 1.5 +1.60 +Under 1.5 +2.20 +Palát, Ondrej +Över 1.5 +1.52 +Under 1.5 +2.35 + +Nashville Predators - Florida Panthers + +Josi, Roman +Över 2.5 +1.70 +Under 2.5 +2.05 +Barkov, Aleksander +Över 2.5 +1.50 +Under 2.5 +2.40 +Huberdeau, Jonathan +Över 2.5 +2.35 +Under 2.5 +1.52 +Hörnqvist, Patric +Över 2.5 +1.60 +Under 2.5 +2.20 +Johansen, Ryan +Över 1.5 +1.90 +Under 1.5 +1.80 +Granlund, Mikael +Över 1.5 +1.90 +Under 1.5 +1.80 + +Dallas Stars - Carolina Hurricanes + +Benn, Jamie +Över 2.5 +2.25 +Under 2.5 +1.57 +Klingberg, John +Över 2.5 +2.65 +Under 2.5 +1.42 +Pavelski, Joe +Över 2.5 +2.35 +Under 2.5 +1.52 +Aho, Sebastian (1997) +Över 2.5 +1.67 +Under 2.5 +2.08 +Hamilton, Dougie +Över 2.5 +1.55 +Under 2.5 +2.30 +Svechnikov, Andrei +Över 2.5 +2.00 +Under 2.5 +1.72 \ No newline at end of file diff --git a/app/external/saved_bets/2021-04-28.bet365 b/app/external/saved_bets/2021-04-28.bet365 new file mode 100644 index 00000000..f984c105 --- /dev/null +++ b/app/external/saved_bets/2021-04-28.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bc9cda42d2035ae28a85a48af4c546918a4b4f591913618fdec88fa0ac331af +size 3564 diff --git a/app/external/saved_bets/2021-04-28.betsson b/app/external/saved_bets/2021-04-28.betsson new file mode 100644 index 00000000..db61ef90 --- /dev/null +++ b/app/external/saved_bets/2021-04-28.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa2db306e48c52884a1dadf1e3d0a257f29d1471529168c9f42b7ebfeef15d3c +size 4672 diff --git a/app/external/saved_bets/2021-04-28.betway b/app/external/saved_bets/2021-04-28.betway new file mode 100644 index 00000000..ce9c78d6 --- /dev/null +++ b/app/external/saved_bets/2021-04-28.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45d82bf4fbbdc226494938830675edd95c4a508b095b239e0d6ac68a16bdf1e3 +size 4594 diff --git a/app/external/saved_bets/2021-04-28.ss b/app/external/saved_bets/2021-04-28.ss new file mode 100644 index 00000000..cd002bda --- /dev/null +++ b/app/external/saved_bets/2021-04-28.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a394c4157f33b58017b32f5db5d1cefbd160f5f2f2e264868307870c9f06146a +size 3350 diff --git a/app/external/saved_bets/2021-04-28.unibet b/app/external/saved_bets/2021-04-28.unibet new file mode 100644 index 00000000..fc5f7901 --- /dev/null +++ b/app/external/saved_bets/2021-04-28.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:978c7fa8ffceda0fdb75c5e8abe2e9a69f888a828de88f952c104865e778977f +size 2384 diff --git a/app/external/saved_bets/2021-04-28.wh b/app/external/saved_bets/2021-04-28.wh new file mode 100644 index 00000000..7b291a1c --- /dev/null +++ b/app/external/saved_bets/2021-04-28.wh @@ -0,0 +1,232 @@ +Ottawa Senators - Vancouver Canucks + +Chabot, Thomas +Över 2.5 +1.80 +Under 2.5 +1.90 +Boeser, Brock +Över 2.5 +2.00 +Under 2.5 +1.72 +Horvat, Bowie +Över 2.5 +2.15 +Under 2.5 +1.62 +Dadonov, Evgeny +Över 1.5 +1.62 +Under 1.5 +2.15 +Miller, J.T. +Över 1.5 +1.52 +Under 1.5 +2.35 +Tkachuk, Brady +Över 3.5 +1.80 +Under 3.5 +1.90 + +Minnesota Wild - St Louis Blues + +Fiala, Kevin +Över 2.5 +1.72 +Under 2.5 +2.00 +Kaprizov, Kirill +Över 2.5 +1.80 +Under 2.5 +1.90 +Krug, Torey +Över 2.5 +2.25 +Under 2.5 +1.57 +Perron, David +Över 2.5 +2.10 +Under 2.5 +1.65 +Suter, Ryan +Över 1.5 +2.10 +Under 1.5 +1.65 +O'Reilly, Ryan +Över 1.5 +1.50 +Under 1.5 +2.40 + +Montreal Canadiens - Toronto Maple Leafs + +Weber, Shea +Över 2.5 +2.40 +Under 2.5 +1.50 +Toffoli, Tyler +Över 2.5 +1.62 +Under 2.5 +2.15 +Tavares, John +Över 2.5 +1.65 +Under 2.5 +2.10 +Marner, Mitch +Över 2.5 +1.67 +Under 2.5 +2.08 +Suzuki, Nick +Över 1.5 +1.85 +Under 1.5 +1.85 +Matthews, Auston +Över 3.5 +1.55 +Under 3.5 +2.30 + +Winnipeg Jets - Edmonton Oilers + +Scheifele, Mark +Över 2.5 +2.10 +Under 2.5 +1.65 +Wheeler, Blake +Över 2.5 +2.50 +Under 2.5 +1.47 +Connor, Kyle +Över 2.5 +1.52 +Under 2.5 +2.35 +Draisaitl, Leon +Över 2.5 +1.57 +Under 2.5 +2.25 +Nugent-Hopkins, Ryan +Över 2.5 +1.80 +Under 2.5 +1.90 +McDavid, Connor +Över 3.5 +1.75 +Under 3.5 +1.95 + +Vegas Golden Knights - Colorado Avalanche + +Marchessault, Jonathan +Över 2.5 +1.68 +Under 2.5 +2.06 +Stone, Mark +Över 2.5 +2.60 +Under 2.5 +1.43 +Landeskog, Gabriel +Över 2.5 +1.90 +Under 2.5 +1.80 +Makar, Cale +Över 1.5 +1.50 +Under 1.5 +2.40 +Pacioretty, Max +Över 3.5 +1.95 +Under 3.5 +1.75 +MacKinnon, Nathan +Över 3.5 +1.52 +Under 3.5 +2.35 + +Los Angeles Kings - Anaheim Ducks + +Doughty, Drew +Över 1.5 +1.72 +Under 1.5 +2.00 +Kopitar, Anze +Över 1.5 +1.45 +Under 1.5 +2.55 +Getzlaf, Ryan +Över 1.5 +2.00 +Under 1.5 +1.72 +Comtois, Maxime +Över 1.5 +1.85 +Under 1.5 +1.85 +Brown, Dustin +Över 2.5 +1.85 +Under 2.5 +1.85 +Rakell, Rickard +Över 2.5 +1.85 +Under 2.5 +1.85 + +San José Sharks - Arizona Coyotes + +Burns, Brent +Över 2.5 +1.85 +Under 2.5 +1.85 +Couture, Logan +Över 2.5 +2.50 +Under 2.5 +1.47 +Kessel, Phil +Över 2.5 +2.25 +Under 2.5 +1.57 +Keller, Clayton +Över 2.5 +2.60 +Under 2.5 +1.43 +Dvorak, Christian +Över 1.5 +1.70 +Under 1.5 +2.05 +Kane, Evander +Över 3.5 +2.15 +Under 3.5 +1.62 + + diff --git a/app/external/saved_bets/2021-04-29.bet365 b/app/external/saved_bets/2021-04-29.bet365 new file mode 100644 index 00000000..18c15e66 --- /dev/null +++ b/app/external/saved_bets/2021-04-29.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a69fc13033c908155bdacab14dc895b629cb997e42fa44da7dd74ad08291b26 +size 5564 diff --git a/app/external/saved_bets/2021-04-29.betsson b/app/external/saved_bets/2021-04-29.betsson new file mode 100644 index 00000000..49d6e377 --- /dev/null +++ b/app/external/saved_bets/2021-04-29.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5ba496885afbfd1918d30b94bc39b74f5537501d197d0ac8907a885fe4093fe +size 6824 diff --git a/app/external/saved_bets/2021-04-29.betway b/app/external/saved_bets/2021-04-29.betway new file mode 100644 index 00000000..7925027b --- /dev/null +++ b/app/external/saved_bets/2021-04-29.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:afda2e9e27d01ca3b2e233b26b37bc0abe470ecf62bfa4d2932e91f09a156742 +size 7131 diff --git a/app/external/saved_bets/2021-04-29.ss b/app/external/saved_bets/2021-04-29.ss new file mode 100644 index 00000000..5ad5eda9 --- /dev/null +++ b/app/external/saved_bets/2021-04-29.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64699f591d4ce96faf6bf9b3d311cfd7c42f3f6c8ea9f0cbe25d750761e5c60c +size 5392 diff --git a/app/external/saved_bets/2021-04-29.unibet b/app/external/saved_bets/2021-04-29.unibet new file mode 100644 index 00000000..f4f38a91 --- /dev/null +++ b/app/external/saved_bets/2021-04-29.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b7dc3c077a33fdaae6f17e4ee4f0a561627d28f41c6a4a11ef22fa2808be281 +size 3426 diff --git a/app/external/saved_bets/2021-04-29.wh b/app/external/saved_bets/2021-04-29.wh new file mode 100644 index 00000000..1ee4dc95 --- /dev/null +++ b/app/external/saved_bets/2021-04-29.wh @@ -0,0 +1,329 @@ +Boston Bruins - Buffalo Sabres + +Marchand, Brad +Över 2.5 +1.95 +Under 2.5 +1.75 +Bergeron, Patrice +Över 2.5 +1.60 +Under 2.5 +2.20 +Olofsson, Victor +Över 2.5 +2.20 +Under 2.5 +1.60 +Dahlin, Rasmus +Över 2.5 +2.65 +Under 2.5 +1.42 +Reinhart, Sam +Över 2.5 +2.20 +Under 2.5 +1.60 +Pastrnak, David +Över 3.5 +1.65 +Under 3.5 +2.10 + +Carolina Hurricanes - Detroit Red Wings + +Aho, Sebastian (1997) +Över 2.5 +1.62 +Under 2.5 +2.15 +Hamilton, Dougie +Över 2.5 +1.50 +Under 2.5 +2.40 +Svechnikov, Andrei +Över 2.5 +1.90 +Under 2.5 +1.80 +Vrána, Jakub +Över 2.5 +2.10 +Under 2.5 +1.65 +Zadina, Filip +Över 1.5 +1.55 +Under 1.5 +2.30 +Hronek, Filip +Över 1.5 +1.68 +Under 1.5 +2.05 + +NY Rangers - NY Islanders + +Zibanejad, Mika +Över 3.5 +2.25 +Under 3.5 +1.57 +Panarin, Artemi +Över 2.5 +1.82 +Under 2.5 +1.88 +Kreider, Chris +Över 2.5 +2.45 +Under 2.5 +1.48 +Barzal, Mathew +Över 2.5 +2.40 +Under 2.5 +1.50 +Nelson, Brock +Över 2.5 +2.30 +Under 2.5 +1.55 +Eberle, Jordan +Över 2.5 +2.30 +Under 2.5 +1.55 + +New Jersey Devils - Philadelphia Flyers + +Hischier, Nico +Över 2.5 +2.20 +Under 2.5 +1.60 +Hughes, Jack +Över 2.5 +1.70 +Under 2.5 +2.02 +Wood, Miles +Över 2.5 +2.40 +Under 2.5 +1.50 +Giroux, Claude +Över 2.5 +2.05 +Under 2.5 +1.68 +Couturier, Sean +Över 2.5 +1.88 +Under 2.5 +1.82 +Hayes, Kevin +Över 2.5 +2.40 +Under 2.5 +1.50 + +Tampa Bay Lightning - Dallas Stars + +Hedman, Victor +Över 2.5 +1.95 +Under 2.5 +1.75 +Point, Brayden +Över 2.5 +2.00 +Under 2.5 +1.72 +Benn, Jamie +Över 2.5 +2.20 +Under 2.5 +1.60 +Klingberg, John +Över 2.5 +2.70 +Under 2.5 +1.40 +Pavelski, Joe +Över 2.5 +2.40 +Under 2.5 +1.50 +Killorn, Alex +Över 1.5 +1.60 +Under 1.5 +2.20 + +Washington Capitals - Pittsburgh Penguins + +Bäckström, Nicklas +Över 2.5 +2.50 +Under 2.5 +1.47 +Carlson, John +Över 2.5 +2.15 +Under 2.5 +1.62 +Crosby, Sidney +Över 2.5 +1.65 +Under 2.5 +2.10 +Letang, Kris +Över 2.5 +2.15 +Under 2.5 +1.62 +Guentzel, Jake +Över 2.5 +1.92 +Under 2.5 +1.78 +Oshie, T.J. +Över 1.5 +1.52 +Under 1.5 +2.35 + +Toronto Maple Leafs - Vancouver Canucks + +Tavares, John +Över 2.5 +1.57 +Under 2.5 +2.25 +Marner, Mitch +Över 2.5 +1.62 +Under 2.5 +2.15 +Boeser, Brock +Över 2.5 +2.15 +Under 2.5 +1.62 +Horvat, Bowie +Över 2.5 +2.30 +Under 2.5 +1.55 +Matthews, Auston +Över 3.5 +1.52 +Under 3.5 +2.35 +Miller, J.T. +Över 1.5 +1.62 +Under 1.5 +2.15 + +Chicago Blackhawks - Florida Panthers + +DeBrincat, Alex +Över 2.5 +1.65 +Under 2.5 +2.10 +Kubalik, Dominik +Över 2.5 +1.82 +Under 2.5 +1.88 +Barkov, Aleksander +Över 2.5 +1.48 +Under 2.5 +2.48 +Huberdeau, Jonathan +Över 2.5 +2.30 +Under 2.5 +1.55 +Vatrano, Frank +Över 2.5 +1.85 +Under 2.5 +1.85 +Kane, Patrick +Över 3.5 +2.20 +Under 3.5 +1.60 + +Minnesota Wild - St Louis Blues + +Fiala, Kevin +Över 2.5 +1.72 +Under 2.5 +2.00 +Kaprizov, Kirill +Över 2.5 +1.75 +Under 2.5 +1.95 +Krug, Torey +Över 2.5 +2.25 +Under 2.5 +1.57 +Perron, David +Över 2.5 +2.10 +Under 2.5 +1.65 +Suter, Ryan +Över 1.5 +2.10 +Under 1.5 +1.65 +O'Reilly, Ryan +Över 1.5 +1.50 +Under 1.5 +2.40 + +Edmonton Oilers - Calgary Flames + +McDavid, Connor +Över 3.5 +1.72 +Under 3.5 +2.00 +Draisaitl, Leon +Över 2.5 +1.55 +Under 2.5 +2.30 +Nugent-Hopkins, Ryan +Över 2.5 +1.75 +Under 2.5 +1.95 +Gaudreau, Johnny +Över 2.5 +2.50 +Under 2.5 +1.47 +Lindholm, Elias +Över 2.5 +2.40 +Under 2.5 +1.50 +Tkachuk, Matthew +Över 2.5 +2.20 +Under 2.5 +1.60 \ No newline at end of file diff --git a/app/external/saved_bets/2021-05-02.bet365 b/app/external/saved_bets/2021-05-02.bet365 new file mode 100644 index 00000000..2f1a9052 --- /dev/null +++ b/app/external/saved_bets/2021-05-02.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26879f01376572184fcdf0b03a40036ae80e305f1a3313debd21bffbeb7cff79 +size 417 diff --git a/app/external/saved_bets/2021-05-02.betsson b/app/external/saved_bets/2021-05-02.betsson new file mode 100644 index 00000000..9e9ad97b --- /dev/null +++ b/app/external/saved_bets/2021-05-02.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:570774b2110f4521f8d54073ce3b0c72812b2652ca70f26827f6b911fce72c96 +size 413 diff --git a/app/external/saved_bets/2021-05-02.betway b/app/external/saved_bets/2021-05-02.betway new file mode 100644 index 00000000..7e83194f --- /dev/null +++ b/app/external/saved_bets/2021-05-02.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81d8b03cea6a964c5c79c28424f6a78136b7098d541b0b4eb84c0d96faa11134 +size 409 diff --git a/app/external/saved_bets/2021-05-02.ss b/app/external/saved_bets/2021-05-02.ss new file mode 100644 index 00000000..1a705803 --- /dev/null +++ b/app/external/saved_bets/2021-05-02.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc61f11d80ce17faba910ce8b86200a62b5b728a721940294def4f14ae983cee +size 444 diff --git a/app/external/saved_bets/2021-05-02.unibet b/app/external/saved_bets/2021-05-02.unibet new file mode 100644 index 00000000..ed653f84 --- /dev/null +++ b/app/external/saved_bets/2021-05-02.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2879a012b01c1d2f6688080e7b1e001b7a3fe81f8e04f1e5228b630ab174dd01 +size 537 diff --git a/app/external/saved_bets/2021-05-02.wh b/app/external/saved_bets/2021-05-02.wh new file mode 100644 index 00000000..9e1a4a0f --- /dev/null +++ b/app/external/saved_bets/2021-05-02.wh @@ -0,0 +1,52 @@ +Detroit Red Wings - Tampa Bay Lightning + +Zadina, Filip +Över 1.5 +1.60 +Under 1.5 +2.20 +Vrána, Jakub +Över 2.5 +2.00 +Under 2.5 +1.72 +Hedman, Victor +Över 2.5 +2.05 +Under 2.5 +1.70 +Point, Brayden +Över 2.5 +1.85 +Under 2.5 +1.85 +Hronek, Filip +Över 1.5 +1.70 +Under 1.5 +2.05 +Killorn, Alex +Över 1.5 +1.52 +Under 1.5 +2.35 +Rasmussen, Michael +Över 1.5 +1.72 +Under 1.5 +2.00 +Gagner, Sam +Över 1.5 +1.75 +Under 1.5 +1.95 +Palát, Ondrej +Över 1.5 +1.50 +Under 1.5 +2.40 +Gourde, Yanni +Över 1.5 +1.57 +Under 1.5 +2.25 \ No newline at end of file diff --git a/app/external/saved_bets/2021-05-03.bet365 b/app/external/saved_bets/2021-05-03.bet365 new file mode 100644 index 00000000..eb7e38e8 --- /dev/null +++ b/app/external/saved_bets/2021-05-03.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a815a5fa9fab982270d0efcb40c60930586eb301dad159180021b1b60fba5262 +size 7222 diff --git a/app/external/saved_bets/2021-05-03.betsson b/app/external/saved_bets/2021-05-03.betsson new file mode 100644 index 00000000..4bf24f14 --- /dev/null +++ b/app/external/saved_bets/2021-05-03.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5bf283c976483e7a29c4bf31444ffa25f4a2ac24046a5caeb44b850820a87a70 +size 6857 diff --git a/app/external/saved_bets/2021-05-03.betway b/app/external/saved_bets/2021-05-03.betway new file mode 100644 index 00000000..1135298a --- /dev/null +++ b/app/external/saved_bets/2021-05-03.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:239a3fca0132d44e36e64cabe121ecb7c134c6923bb6bc83748125ad08b9b648 +size 8361 diff --git a/app/external/saved_bets/2021-05-03.ss b/app/external/saved_bets/2021-05-03.ss new file mode 100644 index 00000000..92641e93 --- /dev/null +++ b/app/external/saved_bets/2021-05-03.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f8b6f77b5cf428e0fc09347da238fb67f43732fda13b66d64e6a09585a9cbf2 +size 6655 diff --git a/app/external/saved_bets/2021-05-03.unibet b/app/external/saved_bets/2021-05-03.unibet new file mode 100644 index 00000000..dcb49aa6 --- /dev/null +++ b/app/external/saved_bets/2021-05-03.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38d6d9faf05bec6373a6beeb6e729f0ea048a19c6fcb9efc0efc94f9da6285fe +size 4757 diff --git a/app/external/saved_bets/2021-05-03.wh b/app/external/saved_bets/2021-05-03.wh new file mode 100644 index 00000000..28f5b88e --- /dev/null +++ b/app/external/saved_bets/2021-05-03.wh @@ -0,0 +1,459 @@ +Buffalo Sabres - NY Islanders + +Olofsson, Victor +Över 2.5 +2.10 +Under 2.5 +1.65 +Dahlin, Rasmus +Över 2.5 +2.60 +Under 2.5 +1.43 +Reinhart, Sam +Över 2.5 +1.90 +Under 2.5 +1.80 +Barzal, Mathew +Över 2.5 +2.15 +Under 2.5 +1.62 +Nelson, Brock +Över 2.5 +2.25 +Under 2.5 +1.57 +Eberle, Jordan +Över 2.5 +2.25 +Under 2.5 +1.57 + +Carolina Hurricanes - Chicago Blackhawks + +Aho, Sebastian (1997) +Över 2.5 +1.62 +Under 2.5 +2.15 +Hamilton, Dougie +Över 2.5 +1.50 +Under 2.5 +2.40 +Svechnikov, Andrei +Över 2.5 +1.80 +Under 2.5 +1.90 +DeBrincat, Alex +Över 2.5 +1.70 +Under 2.5 +2.05 +Kubalik, Dominik +Över 2.5 +1.95 +Under 2.5 +1.75 +Kane, Patrick +Över 3.5 +2.30 +Under 3.5 +1.55 + +Columbus Blue Jackets - Nashville Predators + +Atkinson, Cam +Över 2.5 +1.80 +Under 2.5 +1.90 +Laine, Patrik +Över 2.5 +2.35 +Under 2.5 +1.52 +Björkstrand, Oliver +Över 2.5 +2.00 +Under 2.5 +1.72 +Josi, Roman +Över 2.5 +1.72 +Under 2.5 +2.00 +Johansen, Ryan +Över 1.5 +1.85 +Under 1.5 +1.85 +Granlund, Mikael +Över 1.5 +1.80 +Under 1.5 +1.90 + +Florida Panthers - Dallas Stars + +Barkov, Aleksander +Över 2.5 +1.52 +Under 2.5 +2.35 +Huberdeau, Jonathan +Över 2.5 +2.30 +Under 2.5 +1.55 +Vatrano, Frank +Över 2.5 +2.00 +Under 2.5 +1.72 +Benn, Jamie +Över 2.5 +2.20 +Under 2.5 +1.60 +Klingberg, John +Över 2.5 +2.50 +Under 2.5 +1.47 +Pavelski, Joe +Över 2.5 +2.35 +Under 2.5 +1.52 + +Montreal Canadiens - Toronto Maple Leafs + +Suzuki, Nick +Över 1.5 +1.80 +Under 1.5 +1.90 +Weber, Shea +Över 2.5 +2.40 +Under 2.5 +1.50 +Toffoli, Tyler +Över 2.5 +1.60 +Under 2.5 +2.20 +Tavares, John +Över 2.5 +1.65 +Under 2.5 +2.10 +Marner, Mitch +Över 2.5 +1.67 +Under 2.5 +2.08 +Matthews, Auston +Över 3.5 +1.55 +Under 3.5 +2.30 + +NY Rangers - Washington Capitals + +Panarin, Artemi +Över 2.5 +1.85 +Under 2.5 +1.85 +Bäckström, Nicklas +Över 2.5 +2.50 +Under 2.5 +1.47 +Zibanejad, Mika +Över 3.5 +2.25 +Under 3.5 +1.57 +Buchnevich, Pavel +Över 1.5 +1.57 +Under 1.5 +2.25 +Kuznetsov, Evgeny +Över 1.5 +1.57 +Under 1.5 +2.25 + +New Jersey Devils - Boston Bruins + +Hischier, Nico +Över 2.5 +2.30 +Under 2.5 +1.55 +Hughes, Jack +Över 2.5 +1.75 +Under 2.5 +1.95 +Wood, Miles +Över 2.5 +2.50 +Under 2.5 +1.47 +Marchand, Brad +Över 2.5 +1.90 +Under 2.5 +1.80 +Bergeron, Patrice +Över 2.5 +1.62 +Under 2.5 +2.15 +Pastrnak, David +Över 3.5 +1.70 +Under 3.5 +2.05 + +Ottawa Senators - Winnipeg Jets + +Chabot, Thomas +Över 2.5 +1.85 +Under 2.5 +1.85 +Scheifele, Mark +Över 2.5 +2.10 +Under 2.5 +1.65 +Wheeler, Blake +Över 2.5 +2.50 +Under 2.5 +1.47 +Connor, Kyle +Över 2.5 +1.52 +Under 2.5 +2.35 +Dadonov, Evgeny +Över 1.5 +1.65 +Under 1.5 +2.10 +Tkachuk, Brady +Över 3.5 +1.85 +Under 3.5 +1.85 + +Philadelphia Flyers - Pittsburgh Penguins + +Giroux, Claude +Över 2.5 +2.15 +Under 2.5 +1.62 +Couturier, Sean +Över 2.5 +1.90 +Under 2.5 +1.80 +Hayes, Kevin +Över 2.5 +2.50 +Under 2.5 +1.47 +Crosby, Sidney +Över 2.5 +1.65 +Under 2.5 +2.10 +Letang, Kris +Över 2.5 +2.10 +Under 2.5 +1.65 +Guentzel, Jake +Över 2.5 +1.80 +Under 2.5 +1.90 + +Minnesota Wild - Vegas Golden Knights + +Fiala, Kevin +Över 2.5 +1.75 +Under 2.5 +1.95 +Kaprizov, Kirill +Över 2.5 +1.64 +Under 2.5 +2.12 +Marchessault, Jonathan +Över 2.5 +1.65 +Under 2.5 +2.10 +Stone, Mark +Över 2.5 +2.55 +Under 2.5 +1.45 +Suter, Ryan +Över 1.5 +2.10 +Under 1.5 +1.65 +Pacioretty, Max +Över 3.5 +1.85 +Under 3.5 +1.85 + +St Louis Blues - Anaheim Ducks + +Krug, Torey +Över 2.5 +2.35 +Under 2.5 +1.52 +Perron, David +Över 2.5 +2.05 +Under 2.5 +1.70 +Rakell, Rickard +Över 2.5 +2.00 +Under 2.5 +1.72 +O'Reilly, Ryan +Över 1.5 +1.42 +Under 1.5 +2.65 +Getzlaf, Ryan +Över 1.5 +2.00 +Under 1.5 +1.72 +Comtois, Maxime +Över 1.5 +1.85 +Under 1.5 +1.85 + +Arizona Coyotes - Los Angeles Kings + +Kessel, Phil +Över 2.5 +2.40 +Under 2.5 +1.50 +Keller, Clayton +Över 2.5 +2.50 +Under 2.5 +1.47 +Brown, Dustin +Över 2.5 +1.95 +Under 2.5 +1.75 +Dvorak, Christian +Över 1.5 +1.64 +Under 1.5 +2.12 +Doughty, Drew +Över 1.5 +1.75 +Under 1.5 +1.95 +Kopitar, Anze +Över 1.5 +1.52 +Under 1.5 +2.35 + +Vancouver Canucks - Edmonton Oilers + +Boeser, Brock +Över 2.5 +2.10 +Under 2.5 +1.65 +Horvat, Bowie +Över 2.5 +2.25 +Under 2.5 +1.57 +Draisaitl, Leon +Över 2.5 +1.50 +Under 2.5 +2.40 +Nugent-Hopkins, Ryan +Över 2.5 +1.72 +Under 2.5 +2.00 +Miller, J.T. +Över 1.5 +1.60 +Under 1.5 +2.20 +McDavid, Connor +Över 3.5 +1.75 +Under 3.5 +1.95 + +San José Sharks - Colorado Avalanche + +Burns, Brent +Över 2.5 +2.00 +Under 2.5 +1.72 +Couture, Logan +Över 2.5 +2.50 +Under 2.5 +1.47 +Landeskog, Gabriel +Över 2.5 +1.80 +Under 2.5 +1.90 +Kane, Evander +Över 3.5 +2.20 +Under 3.5 +1.60 +MacKinnon, Nathan +Över 3.5 +1.50 +Under 3.5 +2.40 +Makar, Cale +Över 1.5 +1.45 +Under 1.5 +2.55 + + + diff --git a/app/external/saved_bets/2021-05-04.bet365 b/app/external/saved_bets/2021-05-04.bet365 new file mode 100644 index 00000000..7c61b360 --- /dev/null +++ b/app/external/saved_bets/2021-05-04.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a46a3c05051f0d28c0f7bdf35f782f94d776e7f09e64f9c29a607c69ec30896 +size 3043 diff --git a/app/external/saved_bets/2021-05-04.betsson b/app/external/saved_bets/2021-05-04.betsson new file mode 100644 index 00000000..be8bd719 --- /dev/null +++ b/app/external/saved_bets/2021-05-04.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c40628ed566c1b98255f41d78b872f71080432c07f4bfe67c7e01e9e14c4303 +size 2494 diff --git a/app/external/saved_bets/2021-05-04.betway b/app/external/saved_bets/2021-05-04.betway new file mode 100644 index 00000000..847c4a0c --- /dev/null +++ b/app/external/saved_bets/2021-05-04.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:945f94666565ab9e250f3ba5e779ce994649ee4e9c3e8681f1e5b0b7ba078006 +size 4086 diff --git a/app/external/saved_bets/2021-05-04.ss b/app/external/saved_bets/2021-05-04.ss new file mode 100644 index 00000000..3298ec1f --- /dev/null +++ b/app/external/saved_bets/2021-05-04.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b811b987d246d589449ecf6bc7f8581475943ace224260e289c4977db3dbf498 +size 3022 diff --git a/app/external/saved_bets/2021-05-04.unibet b/app/external/saved_bets/2021-05-04.unibet new file mode 100644 index 00000000..d9976a75 --- /dev/null +++ b/app/external/saved_bets/2021-05-04.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec8552abb26b13e13821513d2fb2a9fa7274e444710571366ac3ae320297ad86 +size 1721 diff --git a/app/external/saved_bets/2021-05-04.wh b/app/external/saved_bets/2021-05-04.wh new file mode 100644 index 00000000..cf2663e1 --- /dev/null +++ b/app/external/saved_bets/2021-05-04.wh @@ -0,0 +1,164 @@ +Buffalo Sabres - NY Islanders + +Olofsson, Victor +Över 2.5 +2.10 +Under 2.5 +1.65 +Dahlin, Rasmus +Över 2.5 +2.60 +Under 2.5 +1.43 +Reinhart, Sam +Över 2.5 +1.90 +Under 2.5 +1.80 +Barzal, Mathew +Över 2.5 +2.15 +Under 2.5 +1.62 +Nelson, Brock +Över 2.5 +2.25 +Under 2.5 +1.57 +Eberle, Jordan +Över 2.5 +2.25 +Under 2.5 +1.57 + +Carolina Hurricanes - Chicago Blackhawks + +Aho, Sebastian (1997) +Över 2.5 +1.62 +Under 2.5 +2.15 +Hamilton, Dougie +Över 2.5 +1.50 +Under 2.5 +2.40 +Svechnikov, Andrei +Över 2.5 +1.85 +Under 2.5 +1.85 +DeBrincat, Alex +Över 2.5 +1.75 +Under 2.5 +1.95 +Kubalik, Dominik +Över 2.5 +2.00 +Under 2.5 +1.72 +Kane, Patrick +Över 3.5 +2.10 +Under 3.5 +1.65 + +New Jersey Devils - Boston Bruins + +Hischier, Nico +Över 2.5 +2.10 +Under 2.5 +1.65 +Hughes, Jack +Över 2.5 +1.75 +Under 2.5 +1.95 +Wood, Miles +Över 2.5 +2.50 +Under 2.5 +1.47 +Marchand, Brad +Över 2.5 +2.00 +Under 2.5 +1.72 +Bergeron, Patrice +Över 2.5 +1.62 +Under 2.5 +2.15 +Pastrnak, David +Över 3.5 +1.70 +Under 3.5 +2.05 + +Philadelphia Flyers - Pittsburgh Penguins + +Giroux, Claude +Över 2.5 +2.15 +Under 2.5 +1.62 +Couturier, Sean +Över 2.5 +1.90 +Under 2.5 +1.80 +Hayes, Kevin +Över 2.5 +2.50 +Under 2.5 +1.47 +Crosby, Sidney +Över 2.5 +1.65 +Under 2.5 +2.10 +Letang, Kris +Över 2.5 +2.10 +Under 2.5 +1.65 +Guentzel, Jake +Över 2.5 +1.80 +Under 2.5 +1.90 + +Vancouver Canucks - Edmonton Oilers + +Boeser, Brock +Över 2.5 +2.10 +Under 2.5 +1.65 +Horvat, Bowie +Över 2.5 +2.25 +Under 2.5 +1.57 +Draisaitl, Leon +Över 2.5 +1.50 +Under 2.5 +2.40 +Nugent-Hopkins, Ryan +Över 2.5 +1.72 +Under 2.5 +2.00 +Miller, J.T. +Över 1.5 +1.60 +Under 1.5 +2.20 +McDavid, Connor +Över 3.5 +1.75 +Under 3.5 +1.95 \ No newline at end of file diff --git a/app/external/saved_bets/2021-05-05.bet365 b/app/external/saved_bets/2021-05-05.bet365 new file mode 100644 index 00000000..32c787e9 --- /dev/null +++ b/app/external/saved_bets/2021-05-05.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4d2e0f864b078af95768bccc93ab73b27be27e5c56e52ad6d06fdb34805c506 +size 5060 diff --git a/app/external/saved_bets/2021-05-05.betsson b/app/external/saved_bets/2021-05-05.betsson new file mode 100644 index 00000000..fdfd25d9 --- /dev/null +++ b/app/external/saved_bets/2021-05-05.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:520ebb966205e8b19506d1789a9834f2139a18fd382de0c8aabe997c1d6c87e8 +size 4199 diff --git a/app/external/saved_bets/2021-05-05.betway b/app/external/saved_bets/2021-05-05.betway new file mode 100644 index 00000000..f816704f --- /dev/null +++ b/app/external/saved_bets/2021-05-05.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ed6aa0ba4a279d32d52f81e500ee0a1dcb655beaf8eeaeec2bac2ab33edaad9 +size 5497 diff --git a/app/external/saved_bets/2021-05-05.ss b/app/external/saved_bets/2021-05-05.ss new file mode 100644 index 00000000..e48cca44 --- /dev/null +++ b/app/external/saved_bets/2021-05-05.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4031a017290e507291af86549a9045928b726bd8ec67c9c9ea4728a2e332fd47 +size 3972 diff --git a/app/external/saved_bets/2021-05-05.unibet b/app/external/saved_bets/2021-05-05.unibet new file mode 100644 index 00000000..359371f3 --- /dev/null +++ b/app/external/saved_bets/2021-05-05.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3bea57235282f0e89a71e03b235a9ef833e8a341d51ae6386701052412cc5267 +size 2443 diff --git a/app/external/saved_bets/2021-05-05.wh b/app/external/saved_bets/2021-05-05.wh new file mode 100644 index 00000000..f64b35f6 --- /dev/null +++ b/app/external/saved_bets/2021-05-05.wh @@ -0,0 +1,368 @@ +Columbus Blue Jackets - Nashville Predators + +Atkinson, Cam +Över 2.5 +1.80 +Under 2.5 +1.90 +Laine, Patrik +Över 2.5 +2.35 +Under 2.5 +1.52 +Björkstrand, Oliver +Över 2.5 +2.00 +Under 2.5 +1.72 +Josi, Roman +Över 2.5 +1.72 +Under 2.5 +2.00 +Johansen, Ryan +Över 1.5 +1.85 +Under 1.5 +1.85 +Granlund, Mikael +Över 1.5 +1.80 +Under 1.5 +1.90 + +NY Rangers - Washington Capitals + +Zibanejad, Mika +Över 3.5 +2.15 +Under 3.5 +1.62 +Bäckström, Nicklas +Över 2.5 +2.50 +Under 2.5 +1.47 +Buchnevich, Pavel +Över 1.5 +1.57 +Under 1.5 +2.25 +Fox, Adam +Över 1.5 +1.50 +Under 1.5 +2.40 +Eller, Lars +Över 1.5 +1.62 +Under 1.5 +2.15 +Mantha, Anthony +Över 2.5 +1.80 +Under 2.5 +1.90 + +Ottawa Senators - Montreal Canadiens + +Chabot, Thomas +Över 2.5 +1.85 +Under 2.5 +1.85 +Tatar, Tomas +Över 2.5 +2.40 +Under 2.5 +1.50 +Anderson, Josh +Över 2.5 +2.00 +Under 2.5 +1.72 +Dadonov, Evgeny +Över 1.5 +1.72 +Under 1.5 +2.00 +Suzuki, Nick +Över 1.5 +1.62 +Under 1.5 +2.15 +Tkachuk, Brady +Över 3.5 +1.85 +Under 3.5 +1.85 +Toffoli, Tyler +Över 2.5 +1.60 +Under 2.5 +2.20 + +Tampa Bay Lightning - Dallas Stars + +Hedman, Victor +Över 2.5 +2.10 +Under 2.5 +1.65 +Point, Brayden +Över 2.5 +2.00 +Under 2.5 +1.72 +Benn, Jamie +Över 2.5 +2.25 +Under 2.5 +1.57 +Klingberg, John +Över 2.5 +2.55 +Under 2.5 +1.45 +Pavelski, Joe +Över 2.5 +2.40 +Under 2.5 +1.50 +Killorn, Alex +Över 1.5 +1.57 +Under 1.5 +2.25 + +Minnesota Wild - Vegas Golden Knights + +Fiala, Kevin +Över 2.5 +1.75 +Under 2.5 +1.95 +Kaprizov, Kirill +Över 2.5 +1.57 +Under 2.5 +2.25 +Marchessault, Jonathan +Över 2.5 +1.57 +Under 2.5 +2.25 +Stone, Mark +Över 2.5 +2.55 +Under 2.5 +1.45 +Suter, Ryan +Över 1.5 +2.10 +Under 1.5 +1.65 +Pacioretty, Max +Över 3.5 +1.85 +Under 3.5 +1.85 + +St Louis Blues - Anaheim Ducks + +O'Reilly, Ryan +Över 1.5 +1.42 +Under 1.5 +2.65 +Schenn, Brayden +Över 1.5 +1.57 +Under 1.5 +2.25 +Getzlaf, Ryan +Över 1.5 +2.00 +Under 1.5 +1.72 +Comtois, Maxime +Över 1.5 +1.85 +Under 1.5 +1.85 +Perron, David +Över 2.5 +2.05 +Under 2.5 +1.70 +Rakell, Rickard +Över 2.5 +2.00 +Under 2.5 +1.72 + +Calgary Flames - Winnipeg Jets + +Gaudreau, Johnny +Över 2.5 +2.50 +Under 2.5 +1.47 +Lindholm, Elias +Över 2.5 +2.25 +Under 2.5 +1.57 +Tkachuk, Matthew +Över 2.5 +2.05 +Under 2.5 +1.68 +Scheifele, Mark +Över 2.5 +2.15 +Under 2.5 +1.62 +Wheeler, Blake +Över 2.5 +2.55 +Under 2.5 +1.45 +Connor, Kyle +Över 2.5 +1.57 +Under 2.5 +2.25 + +San José Sharks - Colorado Avalanche + +Burns, Brent +Över 2.5 +2.00 +Under 2.5 +1.72 +Couture, Logan +Över 2.5 +2.50 +Under 2.5 +1.47 +Landeskog, Gabriel +Över 2.5 +1.75 +Under 2.5 +1.95 +Kane, Evander +Över 3.5 +2.20 +Under 3.5 +1.60 +MacKinnon, Nathan +Över 3.5 +1.50 +Under 3.5 +2.40 +Makar, Cale +Över 1.5 +1.45 +Under 1.5 +2.55 + +Calgary Flames - Winnipeg Jets + +Gaudreau, Johnny +Över 2.5 +2.50 +Under 2.5 +1.47 +Lindholm, Elias +Över 2.5 +2.25 +Under 2.5 +1.57 +Tkachuk, Matthew +Över 2.5 +2.05 +Under 2.5 +1.68 +Scheifele, Mark +Över 2.5 +2.15 +Under 2.5 +1.62 +Wheeler, Blake +Över 2.5 +2.55 +Under 2.5 +1.45 +Connor, Kyle +Över 2.5 +1.57 +Under 2.5 +2.25 + +San José Sharks - Colorado Avalanche + +Burns, Brent +Över 2.5 +2.00 +Under 2.5 +1.72 +Couture, Logan +Över 2.5 +2.50 +Under 2.5 +1.47 +Landeskog, Gabriel +Över 2.5 +1.75 +Under 2.5 +1.95 +Kane, Evander +Över 3.5 +2.20 +Under 3.5 +1.60 +MacKinnon, Nathan +Över 3.5 +1.50 +Under 3.5 +2.40 +Makar, Cale +Över 1.5 +1.45 +Under 1.5 +2.55 + +Arizona Coyotes - Los Angeles Kings + +Kessel, Phil +Över 2.5 +2.40 +Under 2.5 +1.50 +Keller, Clayton +Över 2.5 +2.50 +Under 2.5 +1.47 +Brown, Dustin +Över 2.5 +1.95 +Under 2.5 +1.75 +Dvorak, Christian +Över 1.5 +1.64 +Under 1.5 +2.12 +Doughty, Drew +Över 1.5 +1.70 +Under 1.5 +2.02 +Kopitar, Anze +Över 1.5 +1.52 +Under 1.5 +2.35 + diff --git a/app/external/saved_bets/2021-05-06.bet365 b/app/external/saved_bets/2021-05-06.bet365 new file mode 100644 index 00000000..2fcab9b6 --- /dev/null +++ b/app/external/saved_bets/2021-05-06.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2fd62e99a12bde5cb5bcb64ac95d44033afa59b6570929957f0188a9b56ab525 +size 604 diff --git a/app/external/saved_bets/2021-05-06.betsson b/app/external/saved_bets/2021-05-06.betsson new file mode 100644 index 00000000..3a81d845 --- /dev/null +++ b/app/external/saved_bets/2021-05-06.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad9281302ca16fbb51d92646bb90e81566f32289644db58f9cb79e9aa9053244 +size 4004 diff --git a/app/external/saved_bets/2021-05-06.betway b/app/external/saved_bets/2021-05-06.betway new file mode 100644 index 00000000..f37f1f30 --- /dev/null +++ b/app/external/saved_bets/2021-05-06.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37fbe41f61ecc273c951f1ca2bebb02c087715d163c8961f6cebab30bf6c3e71 +size 4997 diff --git a/app/external/saved_bets/2021-05-06.ss b/app/external/saved_bets/2021-05-06.ss new file mode 100644 index 00000000..bbbcecbc --- /dev/null +++ b/app/external/saved_bets/2021-05-06.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d3c6e3aa7104eeed7db36a249ad6a4927d00cf6a22d55a0673ecfcfafb67250 +size 2708 diff --git a/app/external/saved_bets/2021-05-06.unibet b/app/external/saved_bets/2021-05-06.unibet new file mode 100644 index 00000000..b0759c63 --- /dev/null +++ b/app/external/saved_bets/2021-05-06.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36cd23f24a328e1762c7a7c9fe95a33419e3e5466d55734ab50514683d4a27d5 +size 1951 diff --git a/app/external/saved_bets/2021-05-06.wh b/app/external/saved_bets/2021-05-06.wh new file mode 100644 index 00000000..75e9e5bc --- /dev/null +++ b/app/external/saved_bets/2021-05-06.wh @@ -0,0 +1,187 @@ +Boston Bruins - NY Rangers + +Pastrnak, David +Över 3.5 +1.70 +Under 3.5 +2.05 +Zibanejad, Mika +Över 3.5 +2.20 +Under 3.5 +1.60 +Marchand, Brad +Över 2.5 +1.80 +Under 2.5 +1.90 +Bergeron, Patrice +Över 2.5 +1.62 +Under 2.5 +2.15 +Fox, Adam +Över 1.5 +1.55 +Under 1.5 +2.30 + +Carolina Hurricanes - Chicago Blackhawks + +Kane, Patrick +Över 3.5 +2.10 +Under 3.5 +1.65 +Aho, Sebastian (1997) +Över 2.5 +1.62 +Under 2.5 +2.15 +Hamilton, Dougie +Över 2.5 +1.50 +Under 2.5 +2.40 +Svechnikov, Andrei +Över 2.5 +1.85 +Under 2.5 +1.85 +DeBrincat, Alex +Över 2.5 +1.75 +Under 2.5 +1.95 +Kubalik, Dominik +Över 2.5 +2.00 +Under 2.5 +1.72 + +NY Islanders - New Jersey Devils + +Barzal, Mathew +Över 2.5 +2.15 +Under 2.5 +1.62 +Nelson, Brock +Över 2.5 +2.25 +Under 2.5 +1.57 +Hischier, Nico +Över 2.5 +2.10 +Under 2.5 +1.65 +Hughes, Jack +Över 2.5 +1.75 +Under 2.5 +1.95 +Wood, Miles +Över 2.5 +2.50 +Under 2.5 +1.47 + +Pittsburgh Penguins - Buffalo Sabres + +Crosby, Sidney +Över 2.5 +1.62 +Under 2.5 +2.15 +Letang, Kris +Över 2.5 +2.10 +Under 2.5 +1.65 +Guentzel, Jake +Över 2.5 +1.78 +Under 2.5 +1.92 +Olofsson, Victor +Över 2.5 +2.15 +Under 2.5 +1.62 +Dahlin, Rasmus +Över 2.5 +2.50 +Under 2.5 +1.47 +Reinhart, Sam +Över 2.5 +1.95 +Under 2.5 +1.75 + +Toronto Maple Leafs - Montreal Canadiens + +Matthews, Auston +Över 3.5 +1.55 +Under 3.5 +2.30 +Tavares, John +Över 2.5 +1.65 +Under 2.5 +2.10 +Marner, Mitch +Över 2.5 +1.67 +Under 2.5 +2.08 +Toffoli, Tyler +Över 2.5 +1.60 +Under 2.5 +2.20 +Anderson, Josh +Över 2.5 +2.00 +Under 2.5 +1.72 +Suzuki, Nick +Över 1.5 +1.80 +Under 1.5 +1.90 + +Edmonton Oilers - Vancouver Canucks + +McDavid, Connor +Över 3.5 +1.75 +Under 3.5 +1.95 +Draisaitl, Leon +Över 2.5 +1.50 +Under 2.5 +2.40 +Nugent-Hopkins, Ryan +Över 2.5 +1.72 +Under 2.5 +2.00 +Boeser, Brock +Över 2.5 +2.10 +Under 2.5 +1.65 +Horvat, Bowie +Över 2.5 +2.25 +Under 2.5 +1.57 +Miller, J.T. +Över 1.5 +1.60 +Under 1.5 +2.20 \ No newline at end of file diff --git a/app/external/saved_bets/2021-05-07.bet365 b/app/external/saved_bets/2021-05-07.bet365 new file mode 100644 index 00000000..9bbb0972 --- /dev/null +++ b/app/external/saved_bets/2021-05-07.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bdc11f2779891f5c2a8b93eef15a87336dd0e6ec6a5b93abbaf62708dadfe9e2 +size 3777 diff --git a/app/external/saved_bets/2021-05-07.betsson b/app/external/saved_bets/2021-05-07.betsson new file mode 100644 index 00000000..d2be80e0 --- /dev/null +++ b/app/external/saved_bets/2021-05-07.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4e797b46c069aac430999a896ca054e9ada0e6a3c7e47433809c8a655def158 +size 4641 diff --git a/app/external/saved_bets/2021-05-07.betway b/app/external/saved_bets/2021-05-07.betway new file mode 100644 index 00000000..7f5674bd --- /dev/null +++ b/app/external/saved_bets/2021-05-07.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c02628bd718477fcad1666d3b9e94a4caca2058e0640a1e86c9be50b56f97192 +size 4936 diff --git a/app/external/saved_bets/2021-05-07.ss b/app/external/saved_bets/2021-05-07.ss new file mode 100644 index 00000000..aa5aa526 --- /dev/null +++ b/app/external/saved_bets/2021-05-07.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:195d0dd77181c138f671f0ba933270f81b5d87b09b2b81c8e0bf20c1681350fe +size 4785 diff --git a/app/external/saved_bets/2021-05-07.unibet b/app/external/saved_bets/2021-05-07.unibet new file mode 100644 index 00000000..5fefac59 --- /dev/null +++ b/app/external/saved_bets/2021-05-07.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c519b3f085690eea96251fd31d597b5bcee3c614a6d8ed595a4e5374882d288b +size 2405 diff --git a/app/external/saved_bets/2021-05-07.wh b/app/external/saved_bets/2021-05-07.wh new file mode 100644 index 00000000..11779f45 --- /dev/null +++ b/app/external/saved_bets/2021-05-07.wh @@ -0,0 +1,230 @@ +Columbus Blue Jackets - Detroit Red Wings + +Atkinson, Cam +Över 2.5 +1.75 +Under 2.5 +1.95 +Laine, Patrik +Över 2.5 +2.30 +Under 2.5 +1.55 +Björkstrand, Oliver +Över 2.5 +1.85 +Under 2.5 +1.85 +Vrána, Jakub +Över 2.5 +1.95 +Under 2.5 +1.75 +Zadina, Filip +Över 1.5 +1.55 +Under 1.5 +2.30 +Hronek, Filip +Över 1.5 +1.65 +Under 1.5 +2.10 + +Tampa Bay Lightning - Dallas Stars + +Hedman, Victor +Över 2.5 +2.10 +Under 2.5 +1.65 +Point, Brayden +Över 2.5 +2.00 +Under 2.5 +1.72 +Benn, Jamie +Över 2.5 +2.25 +Under 2.5 +1.57 +Klingberg, John +Över 2.5 +2.60 +Under 2.5 +1.44 +Pavelski, Joe +Över 2.5 +2.40 +Under 2.5 +1.50 +Killorn, Alex +Över 1.5 +1.57 +Under 1.5 +2.25 + +Washington Capitals - Philadelphia Flyers + +Bäckström, Nicklas +Över 2.5 +2.50 +Under 2.5 +1.47 +Mantha, Anthony +Över 2.5 +1.85 +Under 2.5 +1.85 +Giroux, Claude +Över 2.5 +2.20 +Under 2.5 +1.60 +Couturier, Sean +Över 2.5 +2.00 +Under 2.5 +1.72 +Hayes, Kevin +Över 2.5 +2.50 +Under 2.5 +1.47 +Oshie, T.J. +Över 1.5 +1.50 +Under 1.5 +2.40 + +Minnesota Wild - Anaheim Ducks + +Fiala, Kevin +Över 2.5 +1.65 +Under 2.5 +2.10 +Kaprizov, Kirill +Över 2.5 +1.55 +Under 2.5 +2.30 +Rakell, Rickard +Över 2.5 +2.00 +Under 2.5 +1.72 +Suter, Ryan +Över 1.5 +2.05 +Under 1.5 +1.70 +Getzlaf, Ryan +Över 1.5 +2.00 +Under 1.5 +1.72 +Comtois, Maxime +Över 1.5 +1.85 +Under 1.5 +1.85 + +Los Angeles Kings - Colorado Avalanche + +Brown, Dustin +Över 2.5 +2.05 +Under 2.5 +1.68 +Landeskog, Gabriel +Över 2.5 +1.72 +Under 2.5 +2.00 +Rantanen, Mikko +Över 2.5 +1.55 +Under 2.5 +2.30 +Doughty, Drew +Över 1.5 +1.75 +Under 1.5 +1.95 +Kopitar, Anze +Över 1.5 +1.57 +Under 1.5 +2.25 +MacKinnon, Nathan +Över 3.5 +1.50 +Under 3.5 +2.40 + +Vegas Golden Knights - St Louis Blues + +Karlsson, William +Över 2.5 +2.60 +Under 2.5 +1.43 +Marchessault, Jonathan +Över 2.5 +1.60 +Under 2.5 +2.20 +Stone, Mark +Över 2.5 +2.55 +Under 2.5 +1.45 +Perron, David +Över 2.5 +2.15 +Under 2.5 +1.62 +O'Reilly, Ryan +Över 1.5 +1.45 +Under 1.5 +2.55 +Schenn, Brayden +Över 1.5 +1.62 +Under 1.5 +2.15 + +San José Sharks - Arizona Coyotes + +Burns, Brent +Över 2.5 +1.95 +Under 2.5 +1.75 +Kessel, Phil +Över 2.5 +2.30 +Under 2.5 +1.55 +Keller, Clayton +Över 2.5 +2.50 +Under 2.5 +1.47 +Dvorak, Christian +Över 1.5 +1.70 +Under 1.5 +2.05 +Kane, Evander +Över 3.5 +2.10 +Under 3.5 +1.65 +Hertl, Tomas +Över 2.5 +2.05 +Under 2.5 +1.70 diff --git a/app/external/saved_bets/2021-05-09.bet365 b/app/external/saved_bets/2021-05-09.bet365 new file mode 100644 index 00000000..5c724eee --- /dev/null +++ b/app/external/saved_bets/2021-05-09.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e60fe4b5241073572e750a038895ac3aaf31d77477c7992345ea88d2a55a19f +size 1030 diff --git a/app/external/saved_bets/2021-05-09.betsson b/app/external/saved_bets/2021-05-09.betsson new file mode 100644 index 00000000..5979dec4 --- /dev/null +++ b/app/external/saved_bets/2021-05-09.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f53a907fbac877592f405c7952991d3d86bf1499c568027147c266eb8fca36e +size 1025 diff --git a/app/external/saved_bets/2021-05-09.betway b/app/external/saved_bets/2021-05-09.betway new file mode 100644 index 00000000..cf28708a --- /dev/null +++ b/app/external/saved_bets/2021-05-09.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9275a38f7c66baad2395138fbb73a313466db10398d25f1dc6319c123aad2e3 +size 1561 diff --git a/app/external/saved_bets/2021-05-09.ss b/app/external/saved_bets/2021-05-09.ss new file mode 100644 index 00000000..80dabd32 --- /dev/null +++ b/app/external/saved_bets/2021-05-09.ss @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0705dad1dbf5ccbc56c17dcd95a73022895519776211460c54bc82235779d777 +size 897 diff --git a/app/external/saved_bets/2021-05-09.unibet b/app/external/saved_bets/2021-05-09.unibet new file mode 100644 index 00000000..17b450ac --- /dev/null +++ b/app/external/saved_bets/2021-05-09.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4efe7b89e69525ed7872e3840973b2b1c5e7a6e27943363bd57b3ac2ad2d751e +size 680 diff --git a/app/external/saved_bets/2021-05-09.wh b/app/external/saved_bets/2021-05-09.wh new file mode 100644 index 00000000..d98c30e2 --- /dev/null +++ b/app/external/saved_bets/2021-05-09.wh @@ -0,0 +1,66 @@ +Chicago Blackhawks - Dallas Stars + +DeBrincat, Alex +Över 2.5 +1.75 +Under 2.5 +1.95 +Kubalik, Dominik +Över 2.5 +1.95 +Under 2.5 +1.75 +Benn, Jamie +Över 2.5 +2.20 +Under 2.5 +1.60 +Klingberg, John +Över 2.5 +2.50 +Under 2.5 +1.47 +Pavelski, Joe +Över 2.5 +2.30 +Under 2.5 +1.55 +Kane, Patrick +Över 3.5 +2.00 +Under 3.5 +1.72 + +Calgary Flames - Ottawa Senators + +Gaudreau, Johnny +Över 2.5 +2.40 +Under 2.5 +1.50 +Lindholm, Elias +Över 2.5 +2.20 +Under 2.5 +1.60 +Tkachuk, Matthew +Över 2.5 +2.00 +Under 2.5 +1.72 +Dadonov, Evgeny +Över 1.5 +1.70 +Under 1.5 +2.05 +Batherson, Drake +Över 1.5 +1.57 +Under 1.5 +2.25 +Tkachuk, Brady +Över 3.5 +1.85 +Under 3.5 +1.85 + diff --git a/app/external/saved_bets/2021-05-12.bet365 b/app/external/saved_bets/2021-05-12.bet365 new file mode 100644 index 00000000..ad58dbbb --- /dev/null +++ b/app/external/saved_bets/2021-05-12.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:058b917026325eaa9fa0a069f927c837aab47fec0883dbe45178ff2f1d08ad04 +size 1944 diff --git a/app/external/saved_bets/2021-05-12.betsson b/app/external/saved_bets/2021-05-12.betsson new file mode 100644 index 00000000..77fcef91 --- /dev/null +++ b/app/external/saved_bets/2021-05-12.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:130d43ea86cc37309e74f7309435312383296da26dc995c4051f26f2e17c0c2d +size 3222 diff --git a/app/external/saved_bets/2021-05-12.betway b/app/external/saved_bets/2021-05-12.betway new file mode 100644 index 00000000..66f3c082 --- /dev/null +++ b/app/external/saved_bets/2021-05-12.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf5c3e9b9f26ababcb9dff8f9364a0c5f9ae6af79d2271fd57a2ae14a30d56b8 +size 2212 diff --git a/app/external/saved_bets/2021-05-12.unibet b/app/external/saved_bets/2021-05-12.unibet new file mode 100644 index 00000000..9b7a1ae5 --- /dev/null +++ b/app/external/saved_bets/2021-05-12.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47de80d08276a179f76509c41b1d3247ce3427e68c5afb8540ac36771d84b465 +size 1715 diff --git a/app/external/saved_bets/2021-05-12.wh b/app/external/saved_bets/2021-05-12.wh new file mode 100644 index 00000000..b1bf0bf6 --- /dev/null +++ b/app/external/saved_bets/2021-05-12.wh @@ -0,0 +1,164 @@ +Montreal Canadiens - Edmonton Oilers + +McDavid, Connor +Över 3.5 +1.75 +Under 3.5 +1.95 +Toffoli, Tyler +Över 2.5 +1.60 +Under 2.5 +2.20 +Anderson, Josh +Över 2.5 +2.00 +Under 2.5 +1.72 +Draisaitl, Leon +Över 2.5 +1.50 +Under 2.5 +2.40 +Nugent-Hopkins, Ryan +Över 2.5 +1.80 +Under 2.5 +1.90 +Suzuki, Nick +Över 1.5 +1.62 +Under 1.5 +2.15 + +Ottawa Senators - Toronto Maple Leafs + +Tkachuk, Brady +Över 3.5 +1.85 +Under 3.5 +1.85 +Matthews, Auston +Över 3.5 +1.52 +Under 3.5 +2.35 +Tavares, John +Över 2.5 +1.65 +Under 2.5 +2.10 +Marner, Mitch +Över 2.5 +1.67 +Under 2.5 +2.08 +Dadonov, Evgeny +Över 1.5 +1.75 +Under 1.5 +1.95 +Batherson, Drake +Över 1.5 +1.57 +Under 1.5 +2.25 + +Colorado Avalanche - Los Angeles Kings + +Landeskog, Gabriel +Över 2.5 +1.72 +Under 2.5 +2.00 +Rantanen, Mikko +Över 2.5 +1.45 +Under 2.5 +2.55 +Makar, Cale +Över 1.5 +1.52 +Under 1.5 +2.35 +Doughty, Drew +Över 1.5 +1.80 +Under 1.5 +1.90 +Kopitar, Anze +Över 1.5 +1.60 +Under 1.5 +2.20 +Kempe, Adrian +Över 1.5 +1.55 +Under 1.5 +2.30 + +San José Sharks - Vegas Golden Knights + +Kane, Evander +Över 3.5 +2.20 +Under 3.5 +1.60 +Burns, Brent +Över 2.5 +1.90 +Under 2.5 +1.80 +Hertl, Tomas +Över 2.5 +2.00 +Under 2.5 +1.72 +Marchessault, Jonathan +Över 2.5 +1.55 +Under 2.5 +2.30 +Stone, Mark +Över 2.5 +2.50 +Under 2.5 +1.47 +Karlsson, William +Över 2.5 +2.50 +Under 2.5 +1.47 + +St Louis Blues - Minnesota Wild + +Perron, David +Över 2.5 +2.15 +Under 2.5 +1.62 +Fiala, Kevin +Över 2.5 +1.60 +Under 2.5 +2.20 +Kaprizov, Kirill +Över 2.5 +1.57 +Under 2.5 +2.25 +O'Reilly, Ryan +Över 1.5 +1.45 +Under 1.5 +2.55 +Schenn, Brayden +Över 1.5 +1.62 +Under 1.5 +2.15 +Suter, Ryan +Över 1.5 +2.05 +Under 1.5 +1.70 \ No newline at end of file diff --git a/app/external/saved_bets/2021-05-17.bet365 b/app/external/saved_bets/2021-05-17.bet365 new file mode 100644 index 00000000..0c6c416f --- /dev/null +++ b/app/external/saved_bets/2021-05-17.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b1d1b60a7d796552d1531f7c4430d87382885096cfb9c2c934ecd2036cc43c6 +size 1477 diff --git a/app/external/saved_bets/2021-05-17.betsson b/app/external/saved_bets/2021-05-17.betsson new file mode 100644 index 00000000..ca1615a6 --- /dev/null +++ b/app/external/saved_bets/2021-05-17.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1b828269818e0350fe702d7801fc78c028394408761487f8ede2216d73b0706 +size 910 diff --git a/app/external/saved_bets/2021-05-17.betway b/app/external/saved_bets/2021-05-17.betway new file mode 100644 index 00000000..14a7d04e --- /dev/null +++ b/app/external/saved_bets/2021-05-17.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a16aefe29d9f50c85758ba16cffbacdc729922a0c8f8751a4abf9b7d7fc7174a +size 1899 diff --git a/app/external/saved_bets/2021-05-17.unibet b/app/external/saved_bets/2021-05-17.unibet new file mode 100644 index 00000000..26b9544e --- /dev/null +++ b/app/external/saved_bets/2021-05-17.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4932b0815cbd5d6038256c31a1dd5be2e6b1180e2dadb0171fd51bd6e07682be +size 1608 diff --git a/app/external/saved_bets/2021-05-17.wh b/app/external/saved_bets/2021-05-17.wh new file mode 100644 index 00000000..4e98c3eb --- /dev/null +++ b/app/external/saved_bets/2021-05-17.wh @@ -0,0 +1,153 @@ +Washington Capitals - Boston Bruins + +Bäckström, Nicklas +Över 1.5 +1.62 +Under 1.5 +2.15 +Oshie, T.J. +Över 1.5 +1.62 +Under 1.5 +2.15 +Krejci, David +Över 1.5 +1.75 +Under 1.5 +1.95 +Ovechkin, Alexander +Över 4.5 +2.15 +Under 4.5 +1.62 +Carlson, John +Över 2.5 +2.15 +Under 2.5 +1.62 +Mantha, Anthony +Över 2.5 +2.05 +Under 2.5 +1.70 +Marchand, Brad +Över 2.5 +1.92 +Under 2.5 +1.78 +Bergeron, Patrice +Över 2.5 +1.65 +Under 2.5 +2.10 +Pastrnak, David +Över 3.5 +1.75 +Under 3.5 +1.95 +Hall, Taylor +Över 2.5 +1.88 +Under 2.5 +1.82 + +Carolina Hurricanes - Nashville Predators + +Aho, Sebastian (1997) +Över 2.5 +1.60 +Under 2.5 +2.20 +Teräväinen, Teuvo +Över 2.5 +2.15 +Under 2.5 +1.62 +Hamilton, Dougie +Över 2.5 +1.50 +Under 2.5 +2.40 +Svechnikov, Andrei +Över 2.5 +1.95 +Under 2.5 +1.75 +Trocheck, Vincent +Över 2.5 +2.10 +Under 2.5 +1.65 +Forsberg, Filip +Över 2.5 +1.57 +Under 2.5 +2.25 +Duchene, Matt +Över 1.5 +1.50 +Under 1.5 +2.40 +Johansen, Ryan +Över 1.5 +2.05 +Under 1.5 +1.70 +Granlund, Mikael +Över 1.5 +2.05 +Under 1.5 +1.70 +Josi, Roman +Över 2.5 +1.70 +Under 2.5 +2.05 + +Colorado Avalanche - St Louis Blues + +MacKinnon, Nathan +Över 3.5 +1.50 +Under 3.5 +2.40 +Landeskog, Gabriel +Över 2.5 +1.72 +Under 2.5 +2.00 +Rantanen, Mikko +Över 2.5 +1.52 +Under 2.5 +2.35 +Kadri, Nazem +Över 2.5 +1.80 +Under 2.5 +1.90 +Krug, Torey +Över 2.5 +2.35 +Under 2.5 +1.52 +Makar, Cale +Över 1.5 +1.42 +Under 1.5 +2.65 +O'Reilly, Ryan +Över 1.5 +1.47 +Under 1.5 +2.50 +Schwartz, Jaden +Över 1.5 +1.72 +Under 1.5 +2.00 +Schenn, Brayden +Över 1.5 +1.67 +Under 1.5 +2.08 \ No newline at end of file diff --git a/app/external/saved_bets/2021-05-18.bet365 b/app/external/saved_bets/2021-05-18.bet365 new file mode 100644 index 00000000..97e49718 --- /dev/null +++ b/app/external/saved_bets/2021-05-18.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db4af1456dac10511477fe82ca5fc149af54d13a329797e488fb7358f05ca395 +size 2234 diff --git a/app/external/saved_bets/2021-05-18.betsson b/app/external/saved_bets/2021-05-18.betsson new file mode 100644 index 00000000..1f5e571d --- /dev/null +++ b/app/external/saved_bets/2021-05-18.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c59295069da08b432b8d723034581f1b754103f2153e026bc937d406bfb0647e +size 2471 diff --git a/app/external/saved_bets/2021-05-18.betway b/app/external/saved_bets/2021-05-18.betway new file mode 100644 index 00000000..8154c614 --- /dev/null +++ b/app/external/saved_bets/2021-05-18.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e812828022d2c222361062d54735eab5a937be51e77dd3a0a7346029bc0b039 +size 3195 diff --git a/app/external/saved_bets/2021-05-18.unibet b/app/external/saved_bets/2021-05-18.unibet new file mode 100644 index 00000000..cbb65bcc --- /dev/null +++ b/app/external/saved_bets/2021-05-18.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:55a7895287bc5420add8166b9db1c5c0a3013832262c3176c731d75c1412338e +size 1989 diff --git a/app/external/saved_bets/2021-05-18.wh b/app/external/saved_bets/2021-05-18.wh new file mode 100644 index 00000000..1289efb2 --- /dev/null +++ b/app/external/saved_bets/2021-05-18.wh @@ -0,0 +1,193 @@ +Vancouver Canucks - Calgary Flames + +Boeser, Brock +Över 2.5 +2.05 +Under 2.5 +1.70 +Horvat, Bowie +Över 2.5 +2.15 +Under 2.5 +1.62 +Gaudreau, Johnny +Över 2.5 +2.35 +Under 2.5 +1.52 +Lindholm, Elias +Över 2.5 +2.25 +Under 2.5 +1.57 +Tkachuk, Matthew +Över 2.5 +1.95 +Under 2.5 +1.75 +Miller, J.T. +Över 1.5 +1.55 +Under 1.5 +2.30 + +Pittsburgh Penguins - NY Islanders + +Malkin, Yevgeni +Över 2.5 +1.85 +Under 2.5 +1.85 +Crosby, Sidney +Över 2.5 +1.62 +Under 2.5 +2.15 +Letang, Kris +Över 2.5 +2.15 +Under 2.5 +1.62 +Guentzel, Jake +Över 2.5 +1.72 +Under 2.5 +2.00 +Rust, Bryan +Över 2.5 +1.75 +Under 2.5 +1.95 +Barzal, Mathew +Över 2.5 +2.35 +Under 2.5 +1.52 +Nelson, Brock +Över 2.5 +2.25 +Under 2.5 +1.57 +Eberle, Jordan +Över 2.5 +2.40 +Under 2.5 +1.50 +Pageau, Jean-Gabriel +Över 1.5 +1.72 +Under 1.5 +2.00 +Beauvillier, Anthony +Över 1.5 +1.45 +Under 1.5 +2.55 + +Florida Panthers - Tampa Bay Lightning + +Barkov, Aleksander +Över 2.5 +1.52 +Under 2.5 +2.35 +Huberdeau, Jonathan +Över 2.5 +2.40 +Under 2.5 +1.50 +Hörnqvist, Patric +Över 2.5 +1.75 +Under 2.5 +1.95 +Vatrano, Frank +Över 2.5 +2.10 +Under 2.5 +1.65 +Kucherov, Nikita +Över 2.5 +1.55 +Under 2.5 +2.30 +Stamkos, Steven +Över 2.5 +1.85 +Under 2.5 +1.85 +Hedman, Victor +Över 2.5 +2.10 +Under 2.5 +1.65 +Point, Brayden +Över 2.5 +1.92 +Under 2.5 +1.78 +Yandle, Keith +Över 1.5 +1.72 +Under 1.5 +2.00 +Palát, Ondrej +Över 1.5 +1.55 +Under 1.5 +2.30 + +Vegas Golden Knights - Minnesota Wild + +Karlsson, William +Över 2.5 +2.40 +Under 2.5 +1.50 +Marchessault, Jonathan +Över 2.5 +1.55 +Under 2.5 +2.30 +Stone, Mark +Över 2.5 +2.50 +Under 2.5 +1.47 +Tuch, Alex +Över 2.5 +2.00 +Under 2.5 +1.72 +Fiala, Kevin +Över 2.5 +1.65 +Under 2.5 +2.10 +Kaprizov, Kirill +Över 2.5 +1.52 +Under 2.5 +2.35 +Smith, Reilly +Över 1.5 +1.42 +Under 1.5 +2.65 +Zuccarello, Mats +Över 1.5 +1.60 +Under 1.5 +2.20 +Suter, Ryan +Över 1.5 +2.05 +Under 1.5 +1.70 +Spurgeon, Jared +Över 1.5 +1.75 +Under 1.5 +1.95 + + diff --git a/app/external/saved_bets/2021-05-19.bet365 b/app/external/saved_bets/2021-05-19.bet365 new file mode 100644 index 00000000..8bc5432a --- /dev/null +++ b/app/external/saved_bets/2021-05-19.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2920dca1660935aac423ccce304e8a2a435dac6d2f8acab3a3492af5cc0342cc +size 1847 diff --git a/app/external/saved_bets/2021-05-19.betsson b/app/external/saved_bets/2021-05-19.betsson new file mode 100644 index 00000000..69d83b13 --- /dev/null +++ b/app/external/saved_bets/2021-05-19.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d3a0c37bfa61cd63d44d2a1991c074702f13997513bba10d08f67fae317ca70c +size 2917 diff --git a/app/external/saved_bets/2021-05-19.betway b/app/external/saved_bets/2021-05-19.betway new file mode 100644 index 00000000..7d703217 --- /dev/null +++ b/app/external/saved_bets/2021-05-19.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98a2aea36add8d1e64b05d02f250a6843eed95e604014bef5321ccea2e65f14f +size 2422 diff --git a/app/external/saved_bets/2021-05-19.unibet b/app/external/saved_bets/2021-05-19.unibet new file mode 100644 index 00000000..471a59d6 --- /dev/null +++ b/app/external/saved_bets/2021-05-19.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb7c41ab5e8682af2e2fabea2e2b1e1bcce258a726b80bb56566b4936fdb663d +size 2602 diff --git a/app/external/saved_bets/2021-05-20.bet365 b/app/external/saved_bets/2021-05-20.bet365 new file mode 100644 index 00000000..f3b8a463 --- /dev/null +++ b/app/external/saved_bets/2021-05-20.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f255c2822516e57a373586c77549f56eb0f4f858a0e6689fcee2704656de54d +size 2838 diff --git a/app/external/saved_bets/2021-05-20.bethard b/app/external/saved_bets/2021-05-20.bethard new file mode 100644 index 00000000..d39148cc --- /dev/null +++ b/app/external/saved_bets/2021-05-20.bethard @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:222ad3f7b0d0effba1275595a7305c3e77c3fef84eec10b9c13dec24b650dec1 +size 2881 diff --git a/app/external/saved_bets/2021-05-20.betsson b/app/external/saved_bets/2021-05-20.betsson new file mode 100644 index 00000000..826aaff5 --- /dev/null +++ b/app/external/saved_bets/2021-05-20.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79dd734b2a057953085c838ee8323dab5e44da30f723c5c82425f9f9ca1b9c87 +size 2654 diff --git a/app/external/saved_bets/2021-05-20.betway b/app/external/saved_bets/2021-05-20.betway new file mode 100644 index 00000000..06ac81bf --- /dev/null +++ b/app/external/saved_bets/2021-05-20.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b41d854b4f71adc0aa819e12cc42ba8f6b67a4f9327a035ead8aab037a87781 +size 3641 diff --git a/app/external/saved_bets/2021-05-20.unibet b/app/external/saved_bets/2021-05-20.unibet new file mode 100644 index 00000000..848a685c --- /dev/null +++ b/app/external/saved_bets/2021-05-20.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8017341b3e058e6c24982ead24d9bbeb49b1e97d56e5febb52a39ecf4c2bb5be +size 2191 diff --git a/app/external/saved_bets/2021-05-21.bet365 b/app/external/saved_bets/2021-05-21.bet365 new file mode 100644 index 00000000..c0ec388a --- /dev/null +++ b/app/external/saved_bets/2021-05-21.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bb606a333ef3c718747661bb5889ef97d69a04dbee9513aa646e899e0ad936e +size 2005 diff --git a/app/external/saved_bets/2021-05-21.bethard b/app/external/saved_bets/2021-05-21.bethard new file mode 100644 index 00000000..97c99405 --- /dev/null +++ b/app/external/saved_bets/2021-05-21.bethard @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:461fa1bd5f29b9413f42e00b65ed15970481f6d6df614c8dd5633ab9a5f355b5 +size 2870 diff --git a/app/external/saved_bets/2021-05-21.betsson b/app/external/saved_bets/2021-05-21.betsson new file mode 100644 index 00000000..128f25d2 --- /dev/null +++ b/app/external/saved_bets/2021-05-21.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6300365a7558aed8b5f65b3264b93ae1ab58d4c67e5e1285b84ff5147bb06b0e +size 2715 diff --git a/app/external/saved_bets/2021-05-21.betway b/app/external/saved_bets/2021-05-21.betway new file mode 100644 index 00000000..d69741c7 --- /dev/null +++ b/app/external/saved_bets/2021-05-21.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea12fa8d094722bd4a304208a931b00ec86c6986b9c2520310ef6d4177c37282 +size 2560 diff --git a/app/external/saved_bets/2021-05-21.unibet b/app/external/saved_bets/2021-05-21.unibet new file mode 100644 index 00000000..c4377d9b --- /dev/null +++ b/app/external/saved_bets/2021-05-21.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45a383642d2ae420d5ba3bffb34f894fa6492d1c3017aa0946d7fb39c5fdca5b +size 2210 diff --git a/app/external/saved_bets/2021-05-22.bet365 b/app/external/saved_bets/2021-05-22.bet365 new file mode 100644 index 00000000..cc499d5d --- /dev/null +++ b/app/external/saved_bets/2021-05-22.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30f82698a11d68d466532eec5fe37533f78b31f696dd0e5e663a43234a187499 +size 1887 diff --git a/app/external/saved_bets/2021-05-22.bethard b/app/external/saved_bets/2021-05-22.bethard new file mode 100644 index 00000000..dd63aefe --- /dev/null +++ b/app/external/saved_bets/2021-05-22.bethard @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9c73ff02eb0d58b23883128819a8e411b39dc3210c30d416c0f41149fedeafa +size 2156 diff --git a/app/external/saved_bets/2021-05-22.betsson b/app/external/saved_bets/2021-05-22.betsson new file mode 100644 index 00000000..4722160b --- /dev/null +++ b/app/external/saved_bets/2021-05-22.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3571c54a08ad5d6e0f0b90aa37ad4e284c10554d9e8ce9fbb0e926dad663ec8c +size 1988 diff --git a/app/external/saved_bets/2021-05-22.betway b/app/external/saved_bets/2021-05-22.betway new file mode 100644 index 00000000..8e03b0a3 --- /dev/null +++ b/app/external/saved_bets/2021-05-22.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f521ae9e80e2b375b8fd19439d48565cb189b662206b830596a86d84b2cd667a +size 2529 diff --git a/app/external/saved_bets/2021-05-22.unibet b/app/external/saved_bets/2021-05-22.unibet new file mode 100644 index 00000000..bb444efe --- /dev/null +++ b/app/external/saved_bets/2021-05-22.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a7cd548e88e56fb7aa4423d78004fdd211fa4c734f2a391128490fd8de81349 +size 1635 diff --git a/app/external/saved_bets/2021-05-23.bet365 b/app/external/saved_bets/2021-05-23.bet365 new file mode 100644 index 00000000..7f703273 --- /dev/null +++ b/app/external/saved_bets/2021-05-23.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a483e0179fb637ab15302584b9b4c8999c732329ba83b57a0016f5bfabdceec5 +size 2812 diff --git a/app/external/saved_bets/2021-05-23.bethard b/app/external/saved_bets/2021-05-23.bethard new file mode 100644 index 00000000..f22a1289 --- /dev/null +++ b/app/external/saved_bets/2021-05-23.bethard @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43ce186ac3aca2935d33583f1f7e73c1d107d1778a322ee106d2825bfd9fec63 +size 2870 diff --git a/app/external/saved_bets/2021-05-23.betsson b/app/external/saved_bets/2021-05-23.betsson new file mode 100644 index 00000000..f4b36d1d --- /dev/null +++ b/app/external/saved_bets/2021-05-23.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ce7852156170735a90e792136263f46cd336fca3f31f9d44b4cd1a35f20b82c +size 2705 diff --git a/app/external/saved_bets/2021-05-23.betway b/app/external/saved_bets/2021-05-23.betway new file mode 100644 index 00000000..34bccb8e --- /dev/null +++ b/app/external/saved_bets/2021-05-23.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6c46be2e6c361abc6b821f8599778cb3c928b21dc5f9f0e080e623c34cb440f +size 3916 diff --git a/app/external/saved_bets/2021-05-23.unibet b/app/external/saved_bets/2021-05-23.unibet new file mode 100644 index 00000000..804b5551 --- /dev/null +++ b/app/external/saved_bets/2021-05-23.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c542ad11bdfd8aec6750e0fe9679ceab1f84fc8cbbd92969d98caa14874c2c6 +size 2204 diff --git a/app/external/saved_bets/2021-05-24.bet365 b/app/external/saved_bets/2021-05-24.bet365 new file mode 100644 index 00000000..013cbd4d --- /dev/null +++ b/app/external/saved_bets/2021-05-24.bet365 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50b18a7549948664c2e6a290f5da2fab36517d4b2348aea5937e0d6fc1351c73 +size 3117 diff --git a/app/external/saved_bets/2021-05-24.bethard b/app/external/saved_bets/2021-05-24.bethard new file mode 100644 index 00000000..7079a242 --- /dev/null +++ b/app/external/saved_bets/2021-05-24.bethard @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a013975db59cd4c7c5495b02bc350b108f22da26d1174aa454f34ed9026af06a +size 3539 diff --git a/app/external/saved_bets/2021-05-24.betsson b/app/external/saved_bets/2021-05-24.betsson new file mode 100644 index 00000000..98e8d0d9 --- /dev/null +++ b/app/external/saved_bets/2021-05-24.betsson @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79ba91e4b39d60c6a6b2275dc9a168ebc21655bb8959aacb0de4390b967673cb +size 3349 diff --git a/app/external/saved_bets/2021-05-24.betway b/app/external/saved_bets/2021-05-24.betway new file mode 100644 index 00000000..d42391ca --- /dev/null +++ b/app/external/saved_bets/2021-05-24.betway @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62862ae6cfdf5d66d99e77df074449f0f2b4b1f97f62ac418f59fb21c085f2cc +size 4200 diff --git a/app/external/saved_bets/2021-05-24.unibet b/app/external/saved_bets/2021-05-24.unibet new file mode 100644 index 00000000..903e1dae --- /dev/null +++ b/app/external/saved_bets/2021-05-24.unibet @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9b14c9ae4306cf9ed09022a720f32f0461ab7f1f79d0daf26768735d48e2f6d +size 2746 diff --git a/app/handler.py b/app/handler.py new file mode 100644 index 00000000..4d66bab6 --- /dev/null +++ b/app/handler.py @@ -0,0 +1,95 @@ +import sys +import glob +import os +from sqlalchemy import create_engine, Column, Integer, String, ForeignKey +from sqlalchemy.orm import sessionmaker, relationship +from source.db_models.bets_models import * +from source.db_models.nhl_models import * +from source.bets_handler import * +from source.nhl_handler import * +from source.nhl_gen import * +from tqdm import tqdm +from datetime import date, datetime, timedelta +import csv + + +# Global db's +# Create engines +engine_bets = create_engine('sqlite:///external/databases/bets.db', echo=False, future=False) +engine_nhl = create_engine('sqlite:///external/databases/testing.db', echo=False, future=False) + +# Bind tables +Base_bets.metadata.create_all(bind=engine_bets) +Base_nhl.metadata.create_all(bind=engine_nhl) + +# Create session factory +Session_bets = sessionmaker(bind=engine_bets) +Session_nhl = sessionmaker(bind=engine_nhl) + + + + + + + + +# Update nhl db (session to nhl db) (add if doesn't exists) +def update_nhl_db(season=None): + global Session_nhl + nhl_session = Session_nhl() + + if not season: + fill_teams_and_persons(nhl_session) + for season in tqdm(range(2010, 2021)): + fill_all_games_from_season(nhl_session, str(season) + str(season+1)) + else: + fill_all_games_from_season(season) + + nhl_session.commit() + nhl_session.close() + + +# Add nicknames to nhl_db (all) (session to nhl db) +def add_nicknames_nhl_db(): + global Session_nhl + nhl_session = Session_nhl() + with open("./external/nicknames/player_nicknames.csv", encoding='utf-8') as f: + datareader = csv.reader(f) + for row in datareader: + add_person_nickname(row[0], row[1], nhl_session) + + with open("./external/nicknames/team_nicknames.csv", encoding='utf-8') as f: + datareader = csv.reader(f) + for row in datareader: + add_team_nickname(row[0], row[1], nhl_session) + + nhl_session.commit() + nhl_session.close() + + +# Add bets (all) (session to nhl and bet_session db) +def update_bets_db(file = None): + global Session_bets + global Session_nhl + bet_session = Session_bets() + nhl_session = Session_nhl() + + os.chdir("./external/saved_bets") + if not file: + for file in tqdm(glob.glob("*")): + add_file_to_db(file, nhl_session, bet_session) + else: + add_file_to_db(file, nhl_session, bet_session) + + bet_session.commit() + bet_session.close() + nhl_session.close() + + +def generate_csv(player_id): + global Session_nhl + nhl_session = Session_nhl() + + generate_data_for(player_id, nhl_session, 5, "all", f"./external/csvs/{player_id}.csv") + + nhl_session.close() \ No newline at end of file diff --git a/app/main.py b/app/main.py new file mode 100644 index 00000000..9714aab9 --- /dev/null +++ b/app/main.py @@ -0,0 +1,58 @@ +from handler import * + + +def print_help(): + print("Current commands: ") + print("1. help: Shows this") + print("2. exit: Exits the process, nothing is saved") + + + +if __name__ == "__main__": + while True: + arg_in = input(">>> ") + + # Initial commands + if arg_in.lower() == 'help' or arg_in == '1' or arg_in == 'h': + print_help() + + elif arg_in.lower() == 'exit' or arg_in == '2' or arg_in == 'e': + print("Exiting...") + break + + + # Database commands + elif arg_in.lower() == 'eval': + eval_bets() + + # Dev + + elif arg_in.lower() == 'und': + update_nhl_db() + print("Nhl database updated") + + elif arg_in.lower() == 'and': + add_nicknames_nhl_db() + print("Nicknames added") + + elif arg_in.lower() == 'ubd': + print("What file do you want to add? (\"b\" for back) (EX: 2017-03-21.bet365) (Empty for all in folder)") + f = input(">>> > ") + if f == 'b': + print("Back...") + elif f == "": + update_bets_db() + print("Bets database updated") + else: + update_bets_db(f) + print("Bets database updated") + + elif arg_in.lower() == 'gen': + start_time = datetime(2017, 9, 15) + end_time = datetime.now() + print("Enter player id (\"b\" for back) (EX: 8475167)") + player_id = 8475167#input(">>> > ") + generate_csv(player_id) + + else: + print(f"\"{arg_in}\" is no command") \ No newline at end of file diff --git a/app/source/bet_parsers/parse_bet365.py b/app/source/bet_parsers/parse_bet365.py new file mode 100644 index 00000000..acd50c15 --- /dev/null +++ b/app/source/bet_parsers/parse_bet365.py @@ -0,0 +1,73 @@ + +import json +from datetime import datetime as dt +from datetime import timedelta +from unidecode import unidecode + +def read_file(file): + date = file.split("/")[-1].split(".")[0] + betting_site = file.split("/")[-1].split(".")[1] + + try: + with open(file, "r", encoding='utf-8') as reader: + lines = reader.readlines() + except Exception as e: + return [] + + matches = {} + current_key = "" + for line in lines: + line = line.replace("\n","") + if(line.find(" @ ") > 0): + current_key = line + matches[current_key] = [] + elif len(line) > 2: + matches[current_key].append(line) + + games_player = {} + for match in matches: + games_player[match] = [] + for i in range(1, len(matches[match]),2): + if(unidecode(matches[match][i].lower()) == "over"): + break + else: + games_player[match].append(matches[match][i]) + games_over_data = {} + for match in matches: + game = [] + start_saving = False + games_over_data[match] = [] + for i in range(1, len(matches[match])): + if(start_saving): + if(matches[match][i].lower() == "under"): + break + else: + games_over_data[match].append(matches[match][i]) + else: + start_saving = unidecode(matches[match][i].lower()) == "over" + games_under_data = {} + for match in matches: + game = [] + start_saving = False + games_under_data[match] = [] + for i in range(1, len(matches[match])): + if(start_saving): + if(matches[match][i].find(" @ ") > 0): + break + else: + games_under_data[match].append(matches[match][i]) + else: + start_saving = matches[match][i] == "Under" + res = [] + for match in games_player: + home_team = match.split(" @ ")[1] + away_team = match.split(" @ ")[0] + for i in range(0, len(games_player[match])): + player_name = unidecode(games_player[match][i].lower()) + player_target = games_over_data[match][2*i] + player_odds_O = games_over_data[match][2*i+1] + player_odds_U = games_under_data[match][2*i+1] + player_info = [date, player_name, home_team, away_team, betting_site, player_odds_O, player_odds_U, player_target] + res.append(player_info) + + return res \ No newline at end of file diff --git a/app/source/bet_parsers/parse_betsson.py b/app/source/bet_parsers/parse_betsson.py new file mode 100644 index 00000000..87b8a4fd --- /dev/null +++ b/app/source/bet_parsers/parse_betsson.py @@ -0,0 +1,60 @@ + +import json +from datetime import datetime as dt +from datetime import timedelta +from unidecode import unidecode + +def read_file(file): + date = file.split("/")[-1].split(".")[0] + betting_site = file.split("/")[-1].split(".")[1] + + try: + with open(file, "r", encoding='utf-8') as reader: + lines = reader.readlines() + except Exception as e: + return [] + matches= {} + current_key = "" + + tmp = [] + for line in lines: + if len(line) > 1: + line = line.replace("\n","") + tmp.append(line) + find = "–" + res = [] + for i in range(len(tmp)): + if tmp[i] == find: + res.append(i) + + res.append(len(tmp)+1) + for i in range(len(res)-1): + game = tmp[res[i]-1:res[i+1]-1] + key = str(game[0]) + " - " + str(game[2]) + matches[key] = game[3:] + + res = [] + for match in matches: + home_team = unidecode(match.split(" - ")[0]) + away_team = unidecode(match.split(" - ")[1]) + for i in range(0, len(matches[match]), 4): + info = matches[match][i:(i+4)] + player_name = "" + name = info[0].split(" ")[:-2] + for i in range(len(name)): + if i == len(name)-1: + player_name += name[i] + else: + player_name += name[i] + " " + + player_name = unidecode(player_name) + try: + player_target = info[0].split(" ")[-1] + player_odds_O = info[1] + player_odds_U = info[3] + player_info = [date, player_name, home_team, away_team, betting_site, player_odds_O, player_odds_U, player_target] + res.append(player_info) + except: + print(player_name) + raise("wrong") + return res \ No newline at end of file diff --git a/app/source/bet_parsers/parse_betway.py b/app/source/bet_parsers/parse_betway.py new file mode 100644 index 00000000..eca3dc67 --- /dev/null +++ b/app/source/bet_parsers/parse_betway.py @@ -0,0 +1,42 @@ + +import json +from datetime import datetime as dt +from datetime import timedelta +from unidecode import unidecode + +def read_file(file): + date = file.split("/")[-1].split(".")[0] + betting_site = file.split("/")[-1].split(".")[1] + + try: + with open(file, "r", encoding='utf-8') as reader: + lines = reader.readlines() + except Exception as e: + return [] + matches= {} + current_key = "" + for line in lines: + line = line.replace("\n","") + if(line.find(" @ ") > 0): + current_key = line + matches[current_key] = [] + elif line != "": + matches[current_key].append(line) + res = [] + + for match in matches: + home_team = unidecode(match.split(" @ ")[1]) + away_team = unidecode(match.split(" @ ")[0]) + for i in range(0, len(matches[match]), 4): + info = matches[match][i:(i+4)] + if(len(info) > 1): + player_name = info[0].split(", ")[0].split(" ") + player_name_first = player_name[0].lower() + player_name_last = player_name[1].lower() + player_name = unidecode(player_name_first+" "+player_name_last) + player_target = info[0].split(" ")[-1] + player_odds_O = info[1] + player_odds_U = info[3] + player_info = [date, player_name, home_team, away_team, betting_site, player_odds_O, player_odds_U, player_target] + res.append(player_info) + return res \ No newline at end of file diff --git a/app/source/bet_parsers/parse_ss.py b/app/source/bet_parsers/parse_ss.py new file mode 100644 index 00000000..88c13c30 --- /dev/null +++ b/app/source/bet_parsers/parse_ss.py @@ -0,0 +1,46 @@ +import json +from datetime import datetime as dt +from datetime import timedelta +from unidecode import unidecode + + +def read_file(file): + date = file.split("/")[-1].split(".")[0] + betting_site = file.split("/")[-1].split(".")[1] + + try: + with open(file, "r", encoding='utf-8') as reader: + lines = reader.readlines() + except Exception as e: + return [] + + matches= {} + current_key = "" + for line in lines: + line = line.replace("\n","") + if(line.find(" - ") > 0): + current_key = line + matches[current_key] = [] + elif line != "": + matches[current_key].append(line) + res = [] + for match in matches: + home_team = unidecode(match.split(" - ")[0]) + away_team = unidecode(match.split(" - ")[1]) + for i in range(0, len(matches[match]), 3): + name_list = matches[match][i].split(" ")[:-4] + first_name = name_list[0] + last_name = name_list[1] + player_name = first_name + " " + last_name + player_target = matches[match][i+1].split(" ")[1][1:4] + player_odds_O = matches[match][i+1].split(" ")[1].split(")")[1] + player_odds_U = matches[match][i+2].split(" ")[1].split(")")[1] + player_info = [date, player_name, home_team, away_team, betting_site, player_odds_O, player_odds_U, player_target] + res.append(player_info) + + return res + + +#print(read_file("../../../saved_bets/2021-03-23.ss")) + + diff --git a/app/source/bet_parsers/parse_unibet.py b/app/source/bet_parsers/parse_unibet.py new file mode 100644 index 00000000..754747b1 --- /dev/null +++ b/app/source/bet_parsers/parse_unibet.py @@ -0,0 +1,43 @@ + +import json +from datetime import datetime as dt +from datetime import timedelta +from unidecode import unidecode + + +def read_file(file): + date = file.split("/")[-1].split(".")[0] + betting_site = file.split("/")[-1].split(".")[1] + + try: + with open(file, "r", encoding='utf-8') as reader: + lines = reader.readlines() + except Exception as e: + return [] + matches= {} + current_key = "" + for line in lines: + line = line.replace("\n","") + if(line.find(" - ") > 0): + current_key = line + matches[current_key] = [] + elif line != "": + matches[current_key].append(line) + res = [] + for match in matches: + home_team = unidecode(match.split(" - ")[0]) + away_team = unidecode(match.split(" - ")[1]) + for i in range(0, len(matches[match]), 5): + info = matches[match][i:(i+5)] + if(len(info) > 1): + player_name = info[0].split(", ") + player_name_first = player_name[1].lower() + player_name_last = player_name[0].lower() + player_name = unidecode(player_name_first+" "+player_name_last) + player_target = info[1].split(" ")[1] + player_odds_O = info[2] + player_odds_U = info[4] + player_info = [date, player_name, home_team, away_team, betting_site, player_odds_O, player_odds_U, player_target] + res.append(player_info) + return res + diff --git a/app/source/bet_parsers/parse_wh.py b/app/source/bet_parsers/parse_wh.py new file mode 100644 index 00000000..d6a02650 --- /dev/null +++ b/app/source/bet_parsers/parse_wh.py @@ -0,0 +1,42 @@ + +import json +from datetime import datetime as dt +from datetime import timedelta +from unidecode import unidecode + + +def read_file(file): + date = file.split("/")[-1].split(".")[0] + betting_site = file.split("/")[-1].split(".")[1] + + try: + with open(file, "r", encoding='utf-8') as reader: + lines = reader.readlines() + except Exception as e: + return [] + matches= {} + current_key = "" + for line in lines: + line = line.replace("\n","") + if(line.find(" - ") > 0): + current_key = line + matches[current_key] = [] + elif line != "": + matches[current_key].append(line) + res = [] + for match in matches: + home_team = unidecode(match.split(" - ")[0]) + away_team = unidecode(match.split(" - ")[1]) + for i in range(0, len(matches[match]), 5): + info = matches[match][i:(i+5)] + if(len(info) > 1): + player_name = info[0].split(", ") + player_name_first = player_name[1].lower() + player_name_last = player_name[0].lower() + player_name = unidecode(player_name_first+" "+player_name_last) + player_target = info[1].split(" ")[1] + player_odds_O = info[2] + player_odds_U = info[4] + player_info = [date, player_name, home_team, away_team, betting_site, player_odds_O, player_odds_U, player_target] + res.append(player_info) + return res \ No newline at end of file diff --git a/app/source/bets_handler.py b/app/source/bets_handler.py new file mode 100644 index 00000000..287b6df9 --- /dev/null +++ b/app/source/bets_handler.py @@ -0,0 +1,127 @@ +import source.bet_parsers.parse_betsson as betsson +import source.bet_parsers.parse_betway as betway +import source.bet_parsers.parse_unibet as unibet +import source.bet_parsers.parse_bet365 as bet365 +import source.bet_parsers.parse_wh as wh +import source.bet_parsers.parse_ss as ss +from source.db_models.bets_models import * +from source.db_models.nhl_models import * +from datetime import date, datetime, timedelta +from sqlalchemy import func, and_, or_, not_ + + +def add_file_to_db(file, nhl_session, bets_session): + end = file.split(".")[-1] + + bets = [] + if end == "bet365": + bets = bet365.read_file(file) + elif end == "betsson": + bets = betsson.read_file(file) + elif end == "betway": + bets = betway.read_file(file) + elif end == "unibet": + bets = unibet.read_file(file) + elif end == "wh": + bets = wh.read_file(file) + elif end == "ss": + bets = ss.read_file(file) + + for bet in bets: + add_bet_to_db(bet, nhl_session, bets_session) + + +def get_game_pk(home_team, away_team, time, nhl_session): + delta_12_h = timedelta(hours=12) + time = time + timedelta(hours=24) + lower_time = time - delta_12_h + upper_time = time + delta_12_h + ids = nhl_session.query(Game).filter(and_(Game.homeTeamId == home_team, \ + Game.awayTeamId == away_team, \ + Game.gameDate > lower_time, \ + Game.gameDate < upper_time \ + )).all() + if len(ids) == 0: + print("No games found...") + return -1 + elif len(ids) > 1: + print("more than 1 game found...") + return -1 + else: + return ids[0].gamePk + + + +def add_bet_to_db(bet, nhl_session, bets_session): + + player_id = get_player_id_from_name(bet[1], nhl_session) + home_team = get_team_id_from_name(bet[2], nhl_session) + away_team = get_team_id_from_name(bet[3], nhl_session) + time = datetime.strptime(bet[0], '%Y-%m-%d') + + game_pk = get_game_pk(home_team, away_team, time, nhl_session) + + if game_pk == -1: + print("Game was not found, not adding bets {}".format(bet)) + else: + if not bets_session.query(Bet).filter(and_(Bet.gamePk == game_pk, + Bet.playerId == player_id, \ + func.lower(Bet.site) == func.lower(bet[4]), \ + func.lower(Bet.overUnder) == func.lower(str(bet[7]).replace(",", ".")) \ + )).all(): + try: + new_bet = Bet() + new_bet.playerId = player_id + new_bet.homeTeamId = home_team + new_bet.awayTeamId = away_team + new_bet.dateTime = time + new_bet.site = bet[4] + new_bet.gamePk = game_pk + new_bet.overUnder = str(bet[7]).replace(",", ".") + new_bet.oddsOver = str(bet[5]).replace(",", ".") + new_bet.oddsUnder = str(bet[6]).replace(",", ".") + + bets_session.add(new_bet) + except: + print("Something went wrong, did not add {}".format(bet)) + else: + print("Bet already exists") + return + + +def get_player_id_from_name(name, nhl_session): + ids = nhl_session.query(PersonNicknames).filter(func.lower(PersonNicknames.nickname) == (func.lower(name))).all() + if len(ids) == 0: + ids = nhl_session.query(Person).filter(func.lower(Person.fullName).contains(func.lower(name))).all() + + if len(ids) > 1: + print("More than one id for:") + print(name) + raise "More than one id..." + + if len(ids) == 0: + print("Cant find a player with that name for:") + print(name) + raise "Cant find a player with that name..." + + return ids[0].id + + + + +def get_team_id_from_name(name, nhl_session): + ids = nhl_session.query(TeamNicknames).filter(func.lower(TeamNicknames.nickname) == (func.lower(name))).all() + if len(ids) == 0: + ids = nhl_session.query(Team).filter(func.lower(Team.name).contains(func.lower(name))).all() + + if len(ids) > 1: + print("More than one id for:") + print(name) + raise "More than one id..." + + if len(ids) == 0: + print("Cant find a player with that name for:") + print(name) + raise "Cant find a player with that name..." + + return ids[0].id diff --git a/app/source/db_models/bets_models.py b/app/source/db_models/bets_models.py new file mode 100644 index 00000000..d624fada --- /dev/null +++ b/app/source/db_models/bets_models.py @@ -0,0 +1,25 @@ +import datetime +from sqlalchemy import create_engine, Column, Integer, String, Boolean, DateTime, ForeignKey, Time, Float +from sqlalchemy.orm import sessionmaker, relationship +from sqlalchemy.ext.declarative import declarative_base + +Base_bets = declarative_base() + + +class Bet(Base_bets): + __tablename__ = "bet" + + id = Column('id', Integer, primary_key=True) + playerId = Column('playerId', String(50)) + homeTeamId = Column('homeTeamId', String(50)) + awayTeamId = Column('awayTeamId', String(50)) + dateTime = Column('dateTime', DateTime) + + site = Column('site', String(50)) + overUnder = Column('overUnder', Float) + oddsOver = Column('oddsOver', Float) + oddsUnder = Column('oddsUnder', Float) + + gamePk = Column('gamePk', Integer) + + added = Column('added', DateTime, default=datetime.datetime.utcnow) diff --git a/app/source/db_models/nhl_models.py b/app/source/db_models/nhl_models.py new file mode 100644 index 00000000..664ce1f0 --- /dev/null +++ b/app/source/db_models/nhl_models.py @@ -0,0 +1,170 @@ +import datetime +from sqlalchemy import create_engine, Column, Integer, String, Boolean, DateTime, ForeignKey, Time, Float +from sqlalchemy.orm import sessionmaker, relationship +from sqlalchemy.ext.declarative import declarative_base + +Base_nhl = declarative_base() + +class Person(Base_nhl): + __tablename__ = "person" + + id = Column('id', Integer, primary_key=True) + fullName = Column('fullName', String(50)) + firstName = Column('firstName', String(50)) + lastName = Column('lastName', String(50)) + positionCode = Column('positionCode', Integer) + + added = Column('added', DateTime, default=datetime.datetime.utcnow) + updated = Column('updated', DateTime) + + +class Team(Base_nhl): + __tablename__ = "team" + + id = Column('id', Integer, primary_key=True) + name = Column('name', String(50)) + teamName = Column('teamName', String(50)) + + added = Column('added', DateTime, default=datetime.datetime.utcnow) + updated = Column('updated', DateTime) + + +class Game(Base_nhl): + __tablename__ = "game" + + gamePk = Column('gamePk', Integer, primary_key=True) + gameType = Column('gameType', String(2)) + season = Column('season', String(8)) + gameDate = Column('gameDate', DateTime) + + abstractGameState = Column('abstractGameState', String(20)) + codedGameState = Column('codedGameState', Integer) + detailedState = Column('detailedState', String(20)) + statusCode = Column('statusCode', Integer) + startTimeTBD = Column('startTimeTBD', Boolean) + + homeTeamId = Column('homeTeamId', Integer, ForeignKey('team.id')) + awayTeamId = Column('awayTeamId', Integer, ForeignKey('team.id')) + + added = Column('added', DateTime, default=datetime.datetime.utcnow) + updated = Column('updated', DateTime) + + +class TeamStats(Base_nhl): + __tablename__ = "teamStats" + + gamePk = Column('gamePk', Integer, ForeignKey('game.gamePk'), primary_key=True) + teamId = Column('teamId', Integer, ForeignKey('team.id'), primary_key=True) + isHome = Column('isHome', Integer) + + goals = Column('goals', Integer) + pim = Column('pim', Integer) + shots = Column('shots', Integer) + powerPlayPercentage = Column('powerPlayPercentage', Float) + powerPlayGoals = Column('powerPlayGoals', Float) + powerPlayOpportunities = Column('powerPlayOpportunities', Float) + faceOffWinPercentage = Column('faceOffWinPercentage', Float) + blocked = Column('blocked', Integer) + takeaways = Column('takeaways', Integer) + giveaways = Column('giveaways', Integer) + hits = Column('hits', Integer) + + goalsAgainst = Column('goalsAgainst', Integer) + pimAgainst = Column('pimAgainst', Integer) + shotsAgainst = Column('shotsAgainst', Integer) + powerPlayPercentageAgainst = Column('powerPlayPercentageAgainst', Float) + powerPlayGoalsAgainst = Column('powerPlayGoalsAgainst', Float) + powerPlayOpportunitiesAgainst = Column('powerPlayOpportunitiesAgainst', Float) + faceOffWinPercentageAgainst = Column('faceOffWinPercentageAgainst', Float) + blockedAgainst = Column('blockedAgainst', Integer) + takeawaysAgainst = Column('takeawaysAgainst', Integer) + giveawaysAgainst = Column('giveawaysAgainst', Integer) + hitsAgainst = Column('hitsAgainst', Integer) + + + wins = Column('wins', Integer) + losses = Column('losses', Integer) + ot = Column('ot', Integer) + leagueRecordType = Column('leagueRecordType', String(50)) + score = Column('score', Integer) + + added = Column('added', DateTime, default=datetime.datetime.utcnow) + updated = Column('updated', DateTime) + + + +class SkaterStats(Base_nhl): + __tablename__ = "skaterStats" + + playerId = Column('playerId', Integer, ForeignKey('person.id'), primary_key=True) + gamePk = Column('gamePk', Integer, ForeignKey('game.gamePk'), primary_key=True) + position = Column('position', Integer) + team = Column('team', Integer) + + timeOnIce = Column('timeOnIce', Time) + assists = Column('assists', Integer) + goals = Column('goals', Integer) + shots = Column('shots', Integer) + hits = Column('hits', Integer) + powerPlayGoals = Column('powerPlayGoals', Integer) + powerPlayAssists = Column('powerPlayAssists', Integer) + penaltyMinutes = Column('penaltyMinutes', Integer) + faceOffWins = Column('faceOffWins', Integer) + faceoffTaken = Column('faceoffTaken', Integer) + takeaways = Column('takeaways', Integer) + giveaways = Column('giveaways', Integer) + shortHandedGoals = Column('shortHandedGoals', Integer) + shortHandedAssists = Column('shortHandedAssists', Integer) + blocked = Column('blocked', Integer) + plusMinus = Column('plusMinus', Integer) + evenTimeOnIce = Column('evenTimeOnIce', Time) + powerPlayTimeOnIce = Column('powerPlayTimeOnIce', Time) + shortHandedTimeOnIce = Column('shortHandedTimeOnIce', Time) + + added = Column('added', DateTime, default=datetime.datetime.utcnow) + updated = Column('updated', DateTime) + + +class GoalieStats(Base_nhl): + __tablename__ = "goalieStats" + + playerId = Column('playerId', Integer, ForeignKey('person.id'), primary_key=True) + gamePk = Column('gamePk', Integer, ForeignKey('game.gamePk'), primary_key=True) + position = Column('position', Integer) + team = Column('team', Integer) + + timeOnIce = Column('timeOnIce', Time) + assists = Column('assists', Integer) + goals = Column('goals', Integer) + pim = Column('pim', Integer) + shots = Column('shots', Integer) + saves = Column('saves', Integer) + powerPlaySaves = Column('powerPlaySaves', Integer) + shortHandedSaves = Column('shortHandedSaves', Integer) + evenSaves = Column('evenSaves', Integer) + shortHandedShotsAgainst = Column('shortHandedShotsAgainst', Integer) + evenShotsAgainst = Column('evenShotsAgainst', Integer) + powerPlayShotsAgainst = Column('powerPlayShotsAgainst', Integer) + decision = Column('decision', String(1)) + savePercentage = Column('savePercentage', Float) + powerPlaySavePercentage = Column('powerPlaySavePercentage', Float) + evenStrengthSavePercentage = Column('evenStrengthSavePercentage', Float) + + added = Column('added', DateTime, default=datetime.datetime.utcnow) + updated = Column('updated', DateTime) + + +class PersonNicknames(Base_nhl): + __tablename__ = "personnicknames" + + innerId = Column('innerId', Integer, primary_key=True) + id = Column('id', Integer, ForeignKey('person.id')) + nickname = Column('nickname', String(50)) + + +class TeamNicknames(Base_nhl): + __tablename__ = "teamnicknames" + + innerId = Column('innerId', Integer, primary_key=True) + id = Column('id', Integer, ForeignKey('team.id')) + nickname = Column('nickname', String(50)) diff --git a/app/source/nhl_gen.py b/app/source/nhl_gen.py new file mode 100644 index 00000000..3e902d10 --- /dev/null +++ b/app/source/nhl_gen.py @@ -0,0 +1,57 @@ +from source.db_models.bets_models import * +from source.db_models.nhl_models import * +from datetime import date, datetime, timedelta +from sqlalchemy import func, and_, or_, not_, asc, desc +import pandas as pd +import sqlalchemy +from sqlalchemy import select +from sqlalchemy.orm import aliased +from tqdm import tqdm +import csv + +def generate_data_for(player_id, nhl_session, games_to_go_back, season, path=None): + PlayerTeamStats = aliased(TeamStats) + OppTeamStats = aliased(TeamStats) + query = ( + select(SkaterStats, Game, PlayerTeamStats, OppTeamStats) + .where(SkaterStats.playerId == player_id) + .join(Game, SkaterStats.gamePk == Game.gamePk) + .join(PlayerTeamStats, and_(SkaterStats.gamePk == PlayerTeamStats.gamePk, PlayerTeamStats.teamId == SkaterStats.team)) + .join(OppTeamStats, and_(SkaterStats.gamePk == OppTeamStats.gamePk, OppTeamStats.teamId != SkaterStats.team)) + .order_by(asc(Game.gameDate)) + ) + playerStatsForGames = pd.read_sql(query, nhl_session.bind) + + playerStatsForGames.columns = [u + "_SkaterStats" for u in SkaterStats.__table__.columns.keys()]\ + + [u + "_Game" for u in Game.__table__.columns.keys()] \ + + [u + "_PlayerTeamStats" for u in PlayerTeamStats.__table__.columns.keys()] \ + + [u + "_OppTeamStats" for u in OppTeamStats.__table__.columns.keys()] + + df_total = pd.DataFrame() + if season == "all": + for i in tqdm(range(2008, 2025)): + season = str(i) + str(i+1) + print(playerStatsForGames[playerStatsForGames.season_Game == str(season)].shape) + new_df = add_games_back(playerStatsForGames[playerStatsForGames.season_Game == str(season)], games_to_go_back) + print(new_df.shape) + df_total = pd.concat([df_total, new_df]) + print(df_total.shape) + + else: + df_total = add_games_back(playerStatsForGames[playerStatsForGames.season_Game == str(season)], games_to_go_back) + + if path: + stats_csv = df_total.to_csv(path, sep=';', encoding='utf-8', index=False) + return path + return df_total + + +def add_games_back(df, games_to_go_back): + df_total = pd.DataFrame() + for i in range(1, games_to_go_back + 1): + dfc = df.copy() + dfc = dfc.shift(periods=i+1) + dfc.columns = [u + "_{}_games_back".format(i) for u in dfc.head()] + df_total = pd.concat([df_total, dfc], axis=1) + df = pd.concat([df, df_total], axis=1) + return df diff --git a/app/source/nhl_handler.py b/app/source/nhl_handler.py new file mode 100644 index 00000000..9666e31f --- /dev/null +++ b/app/source/nhl_handler.py @@ -0,0 +1,328 @@ +from sqlalchemy import func, and_, or_, not_ +from source.db_models.nhl_models import * +import traceback +import gevent.monkey +gevent.monkey.patch_all(thread=False, select=False) +import requests +import grequests +import datetime +import json + +def convert_string_to_time(time_sec): + arr = time_sec.split(":") + h = 0 + m = int(arr[0]) + s = int(arr[1]) + while m > 59: + h += 1 + m -= 60 + return datetime.time(h, m, s) + + +def add_game_to_db(session, game): + try: + new_game = Game() + + new_game.gamePk = game["gamePk"] + new_game.gameType = game["gameType"] if "gameType" in game else None + new_game.season = game["season"] if "season" in game else None + new_game.gameDate = datetime.datetime.strptime(game["gameDate"], "%Y-%m-%dT%H:%M:%SZ") if "gameDate" in game else None + new_game.abstractGameState = game["status"]["abstractGameState"] if "status" in game and "abstractGameState" in game["status"] else None + new_game.codedGameState = game["status"]["codedGameState"] if "status" in game and "codedGameState" in game["status"] else None + new_game.detailedState = game["status"]["detailedState"] if "status" in game and "detailedState" in game["status"] else None + new_game.statusCode = game["status"]["statusCode"] if "status" in game and "statusCode" in game["status"] else None + new_game.startTimeTBD = game["status"]["startTimeTBD"] if "status" in game and "startTimeTBD" in game["status"] else None + new_game.homeTeamId = game["teams"]["home"]["team"]["id"] + new_game.awayTeamId = game["teams"]["away"]["team"]["id"] + + session.add(new_game) + except Exception as e: + print(e) + traceback.print_exc() + +def hook_factory(*factory_args, **factory_kwargs): + def add_game_stats_to_db(res, *args, **kwargs): + try: + info = factory_kwargs["info"] + session = info["session"] + + res = res.json() + + for home_or_away in ("home", "away"): + # Add team stats + rev_home_away = "home" if home_or_away == "away" else "away" + team_info = res["teams"][home_or_away] + rev_team_info = res["teams"][rev_home_away] + + new_team_stats = TeamStats() + + new_team_stats.gamePk = info["gamePk"] + new_team_stats.teamId = team_info["team"]["id"] + new_team_stats.isHome = (home_or_away == "home") + if "teamSkaterStats" in team_info["teamStats"]: + res_team_stats = team_info["teamStats"]["teamSkaterStats"] + rev_res_team_stats = rev_team_info["teamStats"]["teamSkaterStats"] + + new_team_stats.goals = res_team_stats["goals"] + new_team_stats.pim = res_team_stats["pim"] + new_team_stats.shots = res_team_stats["shots"] + new_team_stats.powerPlayPercentage = res_team_stats["powerPlayPercentage"] + new_team_stats.powerPlayGoals = res_team_stats["powerPlayGoals"] + new_team_stats.powerPlayOpportunities = res_team_stats["powerPlayOpportunities"] + new_team_stats.faceOffWinPercentage = res_team_stats["faceOffWinPercentage"] + new_team_stats.blocked = res_team_stats["blocked"] + new_team_stats.takeaways = res_team_stats["takeaways"] + new_team_stats.giveaways = res_team_stats["giveaways"] + new_team_stats.hits = res_team_stats["hits"] + + new_team_stats.goalsAgainst = rev_res_team_stats["goals"] + new_team_stats.pimAgainst = rev_res_team_stats["pim"] + new_team_stats.shotsAgainst = rev_res_team_stats["shots"] + new_team_stats.powerPlayPercentageAgainst = rev_res_team_stats["powerPlayPercentage"] + new_team_stats.powerPlayGoalsAgainst = rev_res_team_stats["powerPlayGoals"] + new_team_stats.powerPlayOpportunitiesAgainst = rev_res_team_stats["powerPlayOpportunities"] + new_team_stats.faceOffWinPercentageAgainst = rev_res_team_stats["faceOffWinPercentage"] + new_team_stats.blockedAgainst = rev_res_team_stats["blocked"] + new_team_stats.takeawaysAgainst = rev_res_team_stats["takeaways"] + new_team_stats.giveawaysAgainst = rev_res_team_stats["giveaways"] + new_team_stats.hitsAgainst = rev_res_team_stats["hits"] + + new_team_stats.wins = info["stats"][team_info["team"]["id"]]["wins"] + new_team_stats.losses = info["stats"][team_info["team"]["id"]]["losses"] + new_team_stats.ot = info["stats"][team_info["team"]["id"]]["ot"] + new_team_stats.leagueRecordType = info["stats"][team_info["team"]["id"]]["type"] + new_team_stats.score = info["stats"][team_info["team"]["id"]]["score"] + + session.add(new_team_stats) + + # Add all players stats + for player_id in team_info["players"]: + player_info = team_info["players"][player_id] + + if player_info["position"]["code"] == "G": + if "goalieStats" in player_info["stats"]: + res_goalie_stats = player_info["stats"]["goalieStats"] + + new_goalie_stats = GoalieStats() + + new_goalie_stats.playerId = player_info["person"]["id"] + new_goalie_stats.gamePk = info["gamePk"] + new_goalie_stats.position = player_info["position"]["code"] + new_goalie_stats.team = team_info["team"]["id"] + + new_goalie_stats.timeOnIce = convert_string_to_time(res_goalie_stats["timeOnIce"]) + new_goalie_stats.assists = res_goalie_stats["assists"] + new_goalie_stats.goals = res_goalie_stats["goals"] + new_goalie_stats.pim = res_goalie_stats["pim"] + new_goalie_stats.shots = res_goalie_stats["shots"] + new_goalie_stats.saves = res_goalie_stats["saves"] + new_goalie_stats.powerPlaySaves = res_goalie_stats["powerPlaySaves"] + new_goalie_stats.shortHandedSaves = res_goalie_stats["shortHandedSaves"] + new_goalie_stats.evenSaves = res_goalie_stats["evenSaves"] + new_goalie_stats.shortHandedShotsAgainst = res_goalie_stats["shortHandedShotsAgainst"] + new_goalie_stats.evenShotsAgainst = res_goalie_stats["evenShotsAgainst"] + new_goalie_stats.powerPlayShotsAgainst = res_goalie_stats["powerPlayShotsAgainst"] + new_goalie_stats.decision = res_goalie_stats["decision"] if "decision" in res_goalie_stats else None + new_goalie_stats.savePercentage = res_goalie_stats["savePercentage"] if "savePercentage" in res_goalie_stats else None + new_goalie_stats.powerPlaySavePercentage = res_goalie_stats["powerPlaySavePercentage"] if "powerPlaySavePercentage" in res_goalie_stats else None + new_goalie_stats.evenStrengthSavePercentage = res_goalie_stats["evenStrengthSavePercentage"] if "evenStrengthSavePercentage" in res_goalie_stats else None + + session.add(new_goalie_stats) + + else: + if "skaterStats" in player_info["stats"]: + res_skater_stats = player_info["stats"]["skaterStats"] + + new_skater_stats = SkaterStats() + + new_skater_stats.playerId = player_info["person"]["id"] + new_skater_stats.gamePk = info["gamePk"] + new_skater_stats.position = player_info["position"]["code"] + new_skater_stats.team = team_info["team"]["id"] + + new_skater_stats.timeOnIce = convert_string_to_time(res_skater_stats["timeOnIce"]) + new_skater_stats.assists = res_skater_stats["assists"] + new_skater_stats.goals = res_skater_stats["goals"] + new_skater_stats.shots = res_skater_stats["shots"] + new_skater_stats.hits = res_skater_stats["hits"] + new_skater_stats.powerPlayGoals = res_skater_stats["powerPlayGoals"] + new_skater_stats.powerPlayAssists = res_skater_stats["powerPlayAssists"] + new_skater_stats.penaltyMinutes = res_skater_stats["penaltyMinutes"] + new_skater_stats.faceOffWins = res_skater_stats["faceOffWins"] + new_skater_stats.faceoffTaken = res_skater_stats["faceoffTaken"] + new_skater_stats.takeaways = res_skater_stats["takeaways"] + new_skater_stats.giveaways = res_skater_stats["giveaways"] + new_skater_stats.shortHandedGoals = res_skater_stats["shortHandedGoals"] + new_skater_stats.shortHandedAssists = res_skater_stats["shortHandedAssists"] + new_skater_stats.blocked = res_skater_stats["blocked"] + new_skater_stats.plusMinus = res_skater_stats["plusMinus"] + new_skater_stats.evenTimeOnIce = convert_string_to_time(res_skater_stats["evenTimeOnIce"]) + new_skater_stats.powerPlayTimeOnIce = convert_string_to_time(res_skater_stats["powerPlayTimeOnIce"]) + new_skater_stats.shortHandedTimeOnIce = convert_string_to_time(res_skater_stats["shortHandedTimeOnIce"]) + + session.add(new_skater_stats) + + except Exception as e: + print(e) + print(info["gamePk"]) + traceback.print_exc() + + return add_game_stats_to_db + +def fill_all_games_from_season(session, season): + + res = requests.get('https://statsapi.web.nhl.com/api/v1/schedule?season={}'.format(season)) + res = res.json() + + base = "https://statsapi.web.nhl.com/api/v1/game/" + urls = [] + + games_that_dont_have_to_be_updated = {} + games = session.query(Game).filter(Game.statusCode == 7) + for game in games: + games_that_dont_have_to_be_updated[game.gamePk] = game + + if "dates" in res: + for date in res["dates"]: + for game in date["games"]: + if game["gameType"] == "R" or game["gameType"] == "P": + if game["gamePk"] not in games_that_dont_have_to_be_updated.keys(): + if session.query(Game).filter(Game.gamePk == game["gamePk"]).first(): + remove_gamePk(session, game["gamePk"]) + + add_game_to_db(session, game) + game_pk = game["gamePk"] + urls.append((base + str(game_pk) + "/boxscore", { "session": session, "gamePk": str(game_pk), "stats" : {game["teams"]["home"]["team"]["id"]: {"wins": game["teams"]["home"]["leagueRecord"]["wins"], + "losses": game["teams"]["home"]["leagueRecord"]["losses"], + "ot": game["teams"]["home"]["leagueRecord"]["ot"] if "ot" in game["teams"]["home"]["leagueRecord"] else "", + "type": game["teams"]["home"]["leagueRecord"]["type"], + "score": game["teams"]["home"]["score"]}, + game["teams"]["away"]["team"]["id"]: {"wins": game["teams"]["away"]["leagueRecord"]["wins"], + "losses": game["teams"]["away"]["leagueRecord"]["losses"], + "ot": game["teams"]["away"]["leagueRecord"]["ot"] if "ot" in game["teams"]["away"]["leagueRecord"] else "", + "type": game["teams"]["away"]["leagueRecord"]["type"], + "score": game["teams"]["away"]["score"]}}})) + + rs = (grequests.get(u[0], hooks={'response': [hook_factory(info=u[1])]}) for u in urls) + responses = grequests.map(rs) + + +def fill_teams_and_persons(session): + res = requests.get('https://statsapi.web.nhl.com/api/v1/teams?expand=team.roster') + res = res.json() + + all_players_in_db = [player.id for player in session.query(Person).all()] + + for team in res["teams"]: + if not session.query(Team).filter(Team.id == team["id"]).first(): + new_team = Team() + + new_team.id = team["id"] + new_team.name = team["name"] + new_team.teamName = team["teamName"] + + session.add(new_team) + + if "roster" in team: + for player in team["roster"]["roster"]: + + # end me :() + if session.query(Person).filter(Person.id == player["person"]["id"]).first(): + session.query(Person).filter(Person.id == player["person"]["id"]).update({ + "fullName": player["person"]["fullName"], + "positionCode": player["position"]["code"], + "updated":datetime.datetime.utcnow() + }) + + else: + new_person = Person() + + new_person.id = player["person"]["id"] + new_person.fullName = player["person"]["fullName"] + new_person.positionCode = player["position"]["code"] + + session.add(new_person) + + +def remove_gamePk(session, gamePk): + curr_game = session.query(Game).filter(Game.gamePk == gamePk).first() + + all_goalie_stats = session.query(GoalieStats).filter(GoalieStats.gamePk == curr_game.gamePk) + for stats in all_goalie_stats: + session.delete(stats) + + all_skater_stats = session.query(SkaterStats).filter(SkaterStats.gamePk == curr_game.gamePk) + for stats in all_skater_stats: + session.delete(stats) + + all_team_stats = session.query(TeamStats).filter(TeamStats.gamePk == curr_game.gamePk) + for stats in all_team_stats: + session.delete(stats) + + session.delete(curr_game) + + # commit session because we need this to happend before we try to add again + session.commit() + + +def add_person_nickname(nickname, name, nhl_session): + name = name.replace("\"", "") + + ids = [] + + if name.isnumeric(): + ids = nhl_session.query(Person).filter(Person.id == int(name)).all() + else: + ids = nhl_session.query(Person).filter(func.lower( + Person.fullName).contains(func.lower(name))).all() + + if len(ids) > 1: + print("More than one id for:") + print(name) + return + print(nhl_session.query(Person).filter( + func.lower(Person.fullName).contains(func.lower(name)))) + raise "More than one id..." + + if len(ids) == 0: + print("Cant find a player with that name for:") + print(name) + return + print(nhl_session.query(Person).filter( + func.lower(Person.fullName).contains(func.lower(name)))) + raise "Cant find a player with that name..." + + if not nhl_session.query(PersonNicknames).filter(and_(PersonNicknames.id == ids[0].id, func.lower(PersonNicknames.nickname) == func.lower(nickname))).first(): + new_nickname = PersonNicknames() + + new_nickname.id = ids[0].id + new_nickname.nickname = nickname + + nhl_session.add(new_nickname) + + +def add_team_nickname(nickname, name, nhl_session): + name = name.replace("\"", "") + ids = nhl_session.query(Team).filter(func.lower( + Team.name).contains(func.lower(name))).all() + + if len(ids) > 1: + print("More than one id for:") + print(name) + return + raise "More than one id..." + + if len(ids) == 0: + print("Cant find a team with that name for:") + print(name) + print(nhl_session.query(Team).filter(func.lower(Team.name).contains(func.lower(name)))) + return + raise "Cant find a team with that name..." + + if not nhl_session.query(TeamNicknames).filter(and_(TeamNicknames.id == ids[0].id, func.lower(TeamNicknames.nickname) == func.lower(nickname))).first(): + new_nickname = TeamNicknames() + + new_nickname.id = ids[0].id + new_nickname.nickname = nickname + + nhl_session.add(new_nickname) From dc9a5966ada27ae7db1d1d9dc3a1b7fb0b4eaebb Mon Sep 17 00:00:00 2001 From: RasmusRynell <35874840+RasmusRynell@users.noreply.github.com> Date: Mon, 12 Jul 2021 15:05:01 +0200 Subject: [PATCH 02/26] Update README.md --- README.md | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 598e4d94..1ee53d9e 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# Predicting-NHL +# Predicting NHL stats (shots on goal) ## Overview -This project explores the idea of using different machine learning techniques to determine different stats in NHL games. Research about different techniques to be used has already been done in [this](https://github.com/RasmusRynell/sports_betting_test) project. +This project explores the idea of using different machine learning techniques to determine different stats in NHL games. Research and testing of different techniques has previously been done in [this](https://github.com/RasmusRynell/sports_betting_test) project. ### Current features - About 5000 predictions for “Shots on goal” in NHL games from different betting sites -- A way to add more predictions by copy-pasting them from sites into text files +- A way to add more "new" predictions by copy-pasting them from sites into text files - Request data from NHL’s own database to populate your own internal database (in order to use less internet and have a faster running program) - Produce a CSV file containing all data related to a prediction, this includes player statistics, players teams statistics, and enemy teams statistics for as many games back as one wants (typically no more than 5) @@ -21,7 +21,7 @@ This project explores the idea of using different machine learning techniques to - Create a more robust framework for different sports with different types of data - Live predictions - +

## Inner workings *(Under construction)* ### Data collection @@ -34,15 +34,16 @@ This project explores the idea of using different machine learning techniques to ### Evaluating the results - +

## Installation +*Side comment: +Make sure you have atleast python 3.9 installed, if for some reason "python3" does not work, try using "python" instead.* ### Installing the source code
 git clone git@github.com:RasmusRynell/Predicting-NHL.git
 
+ ### Create environment -*Side comment: -If "python3" does not work, try "python" and if it still does not work, download and install python.* Navigate into to project and create an environment
@@ -57,8 +58,34 @@ On Unix/MacOS:
 
 ### Install packages
 
python3 -m pip install -r requirements.txt
+ +

## How to use *(Under construction)* +*Side comment: The application is currently accessed through a terminal, this terminal can then in later builds be replaced by a more traditional and easy to use UI.* + +### Starting the application +To first start the application make sure you have followed the instructions under "Installation". When that is done simple navigate to the "app" folder and write the following: +
python3 main.py
+The application is then started, to then do certain things just enter in a command. + +### Commands + +#### General +* "help (h) *Prints all currently available commands* + +* "exit" (e) *Exits the application* + +#### Dev +* "eval" (ev) *under construction* + +* "und" *Refreshes/Updates the local NHL database* + +* "and" *Add nicknames to the database* + +* "ubd" *Add "old" bets (from bookies but that's located on a local file) to database* +* "gen" *Generate a CSV file containing all information for a player going back to 2017/09/15* +

## Contributors - @RasmusRynell From b73a476ed8152bbac3d8bb1835328a42c152d8a8 Mon Sep 17 00:00:00 2001 From: RasmusRynell <35874840+RasmusRynell@users.noreply.github.com> Date: Mon, 12 Jul 2021 15:34:47 +0200 Subject: [PATCH 03/26] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1ee53d9e..0bfbd029 100644 --- a/README.md +++ b/README.md @@ -88,4 +88,5 @@ The application is then started, to then do certain things just enter in a comma

## Contributors -- @RasmusRynell +- [RasmusRynell](https://github.com/RasmusRynell) +- [Awarty](https://github.com/Awarty) From 0fec0095dd600e4d169038f1625c8e336c64df39 Mon Sep 17 00:00:00 2001 From: Rasmus Rynell <35874840+RasmusRynell@users.noreply.github.com> Date: Mon, 12 Jul 2021 15:56:33 +0200 Subject: [PATCH 04/26] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0bfbd029..69b0229b 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,8 @@ This project explores the idea of using different machine learning techniques to - Load and select features from CSV file to be used in different ML techniques (Data preprocessing) - Create a pipeline for both using and testing and evaluating ML techniques - Add more data (maybe xG for both player and teams) -- Create a better way of scraping the web both for data -- Create a better way of scraping the web both for previous bets and their outcomes +- Create a better way of scraping the web for data +- Create a better way of scraping the web for previous bets and their outcomes - Create a user interface either as an app or on the web ### Long term new features From 88f96934911341df51e6b1d384c20110d93aa93a Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Mon, 12 Jul 2021 21:56:04 +0200 Subject: [PATCH 05/26] small update --- app/external/databases/testing.db | 4 ++-- app/main.py | 13 +++++++++---- requirements.txt | 16 ++++++++++++++++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/app/external/databases/testing.db b/app/external/databases/testing.db index 62532611..d427f28c 100644 --- a/app/external/databases/testing.db +++ b/app/external/databases/testing.db @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:65c5381d25af92d7ee1c2730c265f707540c4a6ceb50c5fdb6b44bf07d2b7f3e -size 83619840 +oid sha256:185f76a2cf14e3c78a5e686119b80e63a63dad9d71e3cb9102392543966dd68f +size 83644416 diff --git a/app/main.py b/app/main.py index 9714aab9..212e6c83 100644 --- a/app/main.py +++ b/app/main.py @@ -5,6 +5,12 @@ def print_help(): print("Current commands: ") print("1. help: Shows this") print("2. exit: Exits the process, nothing is saved") + print("3. eval: ") + print("4. und: Refreshes/Updates the local NHL database") + print("5. and: Add nicknames to the database") + print("6. ubd: Add \"old\" bets (from bookies that's located on a local file) to database") + print("7. gen: Generate a CSV file containing all information for a player going back to 2017/09/15") + @@ -20,13 +26,12 @@ def print_help(): print("Exiting...") break - - # Database commands - elif arg_in.lower() == 'eval': - eval_bets() # Dev + elif arg_in.lower() == 'eval': + eval_bets() + elif arg_in.lower() == 'und': update_nhl_db() print("Nhl database updated") diff --git a/requirements.txt b/requirements.txt index c7928d27..3c447e40 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,21 @@ certifi==2021.5.30 +cffi==1.14.6 chardet==4.0.0 +colorama==0.4.4 +gevent==21.1.2 +greenlet==1.1.0 +grequests==0.6.0 idna==2.10 +numpy==1.21.0 +pandas==1.3.0 +pycparser==2.20 +python-dateutil==2.8.1 +pytz==2021.1 requests==2.25.1 +six==1.16.0 +SQLAlchemy==1.4.20 +tqdm==4.61.2 +Unidecode==1.2.0 urllib3==1.26.6 +zope.event==4.5.0 +zope.interface==5.4.0 From c89c482c3db8cb8953cedbd77fdec8941ebca977 Mon Sep 17 00:00:00 2001 From: Rasmus Rynell <35874840+RasmusRynell@users.noreply.github.com> Date: Tue, 13 Jul 2021 11:20:31 +0200 Subject: [PATCH 06/26] Update README.md --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 69b0229b..440469b3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Predicting NHL stats (shots on goal) ## Overview -This project explores the idea of using different machine learning techniques to determine different stats in NHL games. Research and testing of different techniques has previously been done in [this](https://github.com/RasmusRynell/sports_betting_test) project. +This project explores the idea of using different machine learning techniques to determine different stats in NHL games. Research and testing of different techniques has previously mainly been done in [this](https://github.com/RasmusRynell/sports_betting_test) project. ### Current features - About 5000 predictions for “Shots on goal” in NHL games from different betting sites @@ -24,14 +24,18 @@ This project explores the idea of using different machine learning techniques to

## Inner workings *(Under construction)* ### Data collection +In order to perform different ML techniques, data is needed, for now we use NHL's own (free and very detailed) database to gather all our data. We take this data and store it in our own [sqlite](https://www.sqlite.org/index.html) database to be used and updated when one wants/needs. The reasoning behind having our own database is quite simple, it’s a lot of data to ask for each time we want to do a prediction. This combined with the fact that we in the end want this process to be done once each day in the season the number of times we ask for a specific game in the database gets quickly out of control. +#### NHL's database +In order to use the NHL database we followed [this](https://gitlab.com/dword4/nhlapi/-/blob/master/stats-api.md) incredible documentation. Since we know we want all game data for every game x seasons back all we had to do was loop through each day for that period and request all games that occurred on that day. We then took that data and put it in our own database in order to be used later. To update the database is then to only request data for games that have not yet (according to our database) been played, by doing it this way we don’t have to keep requesting data that never changes. +

### Preprocessing - +

### Machine learning - +

### Evaluating the results

From ed7963d0c348ffb13836bb2af7a558a45d93f6da Mon Sep 17 00:00:00 2001 From: Rasmus Rynell <35874840+RasmusRynell@users.noreply.github.com> Date: Tue, 13 Jul 2021 15:57:04 +0200 Subject: [PATCH 07/26] Update README.md --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index 440469b3..aa8cbf31 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,19 @@ In order to use the NHL database we followed [this](https://gitlab.com/dword4/nh

### Preprocessing +#### Feature selection + +#### Feature extraction + +#### Dimensionality reduction + +#### Missing data removal / prediction + +#### Transformation + +#### Discretization + +

### Machine learning @@ -90,6 +103,8 @@ The application is then started, to then do certain things just enter in a comma * "gen" *Generate a CSV file containing all information for a player going back to 2017/09/15* +* "pre" *Preprocess a csv file according to a configuration file* +

## Contributors - [RasmusRynell](https://github.com/RasmusRynell) From bc804fc87acfaa400ce647661e94447cc38bd5c2 Mon Sep 17 00:00:00 2001 From: Rasmus Rynell <35874840+RasmusRynell@users.noreply.github.com> Date: Tue, 13 Jul 2021 16:02:24 +0200 Subject: [PATCH 08/26] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index aa8cbf31..09a158f6 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,13 @@ ## Overview This project explores the idea of using different machine learning techniques to determine different stats in NHL games. Research and testing of different techniques has previously mainly been done in [this](https://github.com/RasmusRynell/sports_betting_test) project. -### Current features -- About 5000 predictions for “Shots on goal” in NHL games from different betting sites +### Current features / functionality +- A database containing about 5000 predictions for “Shots on goal” in NHL games from different betting sites - A way to add more "new" predictions by copy-pasting them from sites into text files - Request data from NHL’s own database to populate your own internal database (in order to use less internet and have a faster running program) - Produce a CSV file containing all data related to a prediction, this includes player statistics, players teams statistics, and enemy teams statistics for as many games back as one wants (typically no more than 5) -### Futures features +### Features in the future - Load and select features from CSV file to be used in different ML techniques (Data preprocessing) - Create a pipeline for both using and testing and evaluating ML techniques - Add more data (maybe xG for both player and teams) From 58dcceb706521b772f08e6b869f6324f3af6ab74 Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Tue, 13 Jul 2021 16:26:26 +0200 Subject: [PATCH 09/26] Started work on preprocessing --- app/external/csvs/8475167_e_s.csv | 3 +++ app/external/preprocessing_configs/test.cfg | 11 ++++++++ app/handler.py | 13 ++++++++- app/main.py | 14 +++++++--- app/source/preprocessing.py | 29 +++++++++++++++++++++ 5 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 app/external/csvs/8475167_e_s.csv create mode 100644 app/external/preprocessing_configs/test.cfg create mode 100644 app/source/preprocessing.py diff --git a/app/external/csvs/8475167_e_s.csv b/app/external/csvs/8475167_e_s.csv new file mode 100644 index 00000000..ed5fa7c5 --- /dev/null +++ b/app/external/csvs/8475167_e_s.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67af9e83f1d024bc6d47a37b94e63b94eff44fc46ed2b8e6ed301886625e6885 +size 7874 diff --git a/app/external/preprocessing_configs/test.cfg b/app/external/preprocessing_configs/test.cfg new file mode 100644 index 00000000..f63c0062 --- /dev/null +++ b/app/external/preprocessing_configs/test.cfg @@ -0,0 +1,11 @@ +{ + "file": "8475167.csv", + "extract": [ + { + "name": "test", + "action": "div", + "data": ["assists_SkaterStats", "goals_SkaterStats"] + } + ], + "select": ["assists_SkaterStats", "goals_SkaterStats"] +} \ No newline at end of file diff --git a/app/handler.py b/app/handler.py index 4d66bab6..b7c556f1 100644 --- a/app/handler.py +++ b/app/handler.py @@ -8,6 +8,7 @@ from source.bets_handler import * from source.nhl_handler import * from source.nhl_gen import * +from source.preprocessing import preprocessing from tqdm import tqdm from datetime import date, datetime, timedelta import csv @@ -92,4 +93,14 @@ def generate_csv(player_id): generate_data_for(player_id, nhl_session, 5, "all", f"./external/csvs/{player_id}.csv") - nhl_session.close() \ No newline at end of file + nhl_session.close() + + +def save_csv(df, path, append): + name, end = path.split(".") + df.to_csv("./external/csvs/" + name + append + "." + end, sep=';', encoding='utf-8', index=False) + +def extract_and_select(config): + df1 = preprocessing.extract_data(config['file'], config['extract']) + df2 = preprocessing.select_data(config['file'], config['select']) + return pd.concat([df1, df2], axis=1, join='inner') \ No newline at end of file diff --git a/app/main.py b/app/main.py index 212e6c83..fbc255cf 100644 --- a/app/main.py +++ b/app/main.py @@ -10,6 +10,7 @@ def print_help(): print("5. and: Add nicknames to the database") print("6. ubd: Add \"old\" bets (from bookies that's located on a local file) to database") print("7. gen: Generate a CSV file containing all information for a player going back to 2017/09/15") + print("8. pre: Perform preprocessing") @@ -26,12 +27,10 @@ def print_help(): print("Exiting...") break - - # Dev elif arg_in.lower() == 'eval': eval_bets() - + # Dev elif arg_in.lower() == 'und': update_nhl_db() print("Nhl database updated") @@ -59,5 +58,14 @@ def print_help(): player_id = 8475167#input(">>> > ") generate_csv(player_id) + elif arg_in.lower() == 'pre': + # Feature extraction / selection + # From file or from "input"? + extract_and_select_var = {} + with open('./external/preprocessing_configs/test.cfg') as f: + extract_and_select_var = json.loads(f.read()) + save_csv(extract_and_select(extract_and_select_var), extract_and_select_var['file'], "_e_s") + + else: print(f"\"{arg_in}\" is no command") \ No newline at end of file diff --git a/app/source/preprocessing.py b/app/source/preprocessing.py new file mode 100644 index 00000000..02f12b89 --- /dev/null +++ b/app/source/preprocessing.py @@ -0,0 +1,29 @@ +import pandas as pd + +class preprocessing(): + def extract_data(file, data): + df = pd.read_csv(f"./external/csvs/{file}", sep = ';') + df_res = pd.DataFrame() + for e in data: + if e['action'] == "sum": + df[e['name']] = df[e["data"]].sum(axis=1) + df_res[e['name']] = df[e["data"]].sum(axis=1) + + elif e['action'] == "mean": + df[e['name']] = df[e["data"]].mean(axis=1) + df_res[e['name']] = df[e["data"]].mean(axis=1) + + elif e['action'] == "div": + res = df[e['data'][0]] + for d_index in range(1, len(e['data'])): + res = res / df[e['data'][d_index]] + res.fillna(value=0, inplace=True) + df[e['name']] = res + df_res[e['name']] = res + + return df_res + + + def select_data(file, data): + df = pd.read_csv(f"./external/csvs/{file}", sep = ';') + return df[data] \ No newline at end of file From 6b1535002e3bfdb825031544bf88c130a4a37f1b Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Wed, 14 Jul 2021 21:07:23 +0200 Subject: [PATCH 10/26] did some tests with preprocessing --- app/source/preprocessing.py | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/app/source/preprocessing.py b/app/source/preprocessing.py index 02f12b89..7ba7f831 100644 --- a/app/source/preprocessing.py +++ b/app/source/preprocessing.py @@ -1,5 +1,6 @@ import pandas as pd + class preprocessing(): def extract_data(file, data): df = pd.read_csv(f"./external/csvs/{file}", sep = ';') @@ -23,7 +24,29 @@ def extract_data(file, data): return df_res + # A function that returns a dataframe from a csv file containing only the specified columns + def extract_columns(file, columns): + return pd.read_csv(f"./external/csvs/{file}", sep = ';')[columns] - def select_data(file, data): - df = pd.read_csv(f"./external/csvs/{file}", sep = ';') - return df[data] \ No newline at end of file + # A function that returns a dataframe containing only rows with more than half of the values missing + def drop_missing_values(df): + return df.dropna(thresh=len(df.columns) / 2) + + # A function that performs principal component analysis on a dataframe + def pca(df, n_components): + from sklearn.decomposition import PCA + pca = PCA(n_components=n_components) + pca.fit(df) + return pca.transform(df) + + # A function that performs a PCA on a dataframe + def add_pca_features(df, n_components): + df_pca = preprocessing.pca(df, n_components) + df_pca = pd.DataFrame(df_pca) + df_pca.columns = ['pca_' + str(i) for i in range(n_components)] + df = pd.concat([df, df_pca], axis=1) + return df + + # A function that returns a dataframe with filled in predicts the missing values using a specified method + def fill_missing_values_by(df, method): + return df.fillna(method=method) \ No newline at end of file From e4c51be05ca102f607fe558bf46e7dfa4057538d Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Thu, 15 Jul 2021 22:11:26 +0200 Subject: [PATCH 11/26] Research --- app/external/preprocessing_configs/test.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/external/preprocessing_configs/test.cfg b/app/external/preprocessing_configs/test.cfg index f63c0062..13329e7e 100644 --- a/app/external/preprocessing_configs/test.cfg +++ b/app/external/preprocessing_configs/test.cfg @@ -2,7 +2,7 @@ "file": "8475167.csv", "extract": [ { - "name": "test", + "name": "Testing", "action": "div", "data": ["assists_SkaterStats", "goals_SkaterStats"] } From 98f5e4abe275a8650751973797eb70f64aae6be1 Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Fri, 16 Jul 2021 18:27:29 +0200 Subject: [PATCH 12/26] Working on pipeline, soon done --- app/external/csvs/8475167.csv | 4 +- app/external/csvs/8475167_e_s.csv | 3 - app/external/csvs/test_csv.csv | 3 + app/external/csvs/test_csv_new.csv | 3 + app/external/preprocessing_configs/test.cfg | 139 ++++++++++++- app/handler.py | 14 +- app/main.py | 11 +- app/source/eval.py | 208 ++++++++++++++++++++ app/source/nhl_gen.py | 14 +- app/source/preprocessing.py | 52 ----- 10 files changed, 368 insertions(+), 83 deletions(-) delete mode 100644 app/external/csvs/8475167_e_s.csv create mode 100644 app/external/csvs/test_csv.csv create mode 100644 app/external/csvs/test_csv_new.csv create mode 100644 app/source/eval.py delete mode 100644 app/source/preprocessing.py diff --git a/app/external/csvs/8475167.csv b/app/external/csvs/8475167.csv index cfea091b..624f6061 100644 --- a/app/external/csvs/8475167.csv +++ b/app/external/csvs/8475167.csv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fb048a7a8c6c1ccad811d160eb58d1c9b6f0478a8a8598ca569f0ce5b659be08 -size 2950118 +oid sha256:2a3f8caeedb678d22005306941b459fe9fb46a4596a2861e7134d8d467fde12e +size 2939460 diff --git a/app/external/csvs/8475167_e_s.csv b/app/external/csvs/8475167_e_s.csv deleted file mode 100644 index ed5fa7c5..00000000 --- a/app/external/csvs/8475167_e_s.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67af9e83f1d024bc6d47a37b94e63b94eff44fc46ed2b8e6ed301886625e6885 -size 7874 diff --git a/app/external/csvs/test_csv.csv b/app/external/csvs/test_csv.csv new file mode 100644 index 00000000..82da356e --- /dev/null +++ b/app/external/csvs/test_csv.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5a8f5da1cdd21ec0d83173def74dc59b078c5f342d9f9f79359aeb6cbcc8ee0 +size 15717 diff --git a/app/external/csvs/test_csv_new.csv b/app/external/csvs/test_csv_new.csv new file mode 100644 index 00000000..6c550f4e --- /dev/null +++ b/app/external/csvs/test_csv_new.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6eb56e45237e7510ec8dd7bf18ce8a2b194d4bf4ede4405a8de62b773aa5539c +size 2866 diff --git a/app/external/preprocessing_configs/test.cfg b/app/external/preprocessing_configs/test.cfg index 13329e7e..be40fc75 100644 --- a/app/external/preprocessing_configs/test.cfg +++ b/app/external/preprocessing_configs/test.cfg @@ -1,11 +1,132 @@ { - "file": "8475167.csv", - "extract": [ - { - "name": "Testing", - "action": "div", - "data": ["assists_SkaterStats", "goals_SkaterStats"] - } - ], - "select": ["assists_SkaterStats", "goals_SkaterStats"] + "data_path": "8475167.csv", + "save_path": "8475167_results.csv", + "train_test_split": { + "target_col": "O_1.5", + "test_percent": 0.25, + "random_state": 42, + "shuffle": false + }, + "scaler": {"name": "standard", + "settings": []}, + + "decomposition": {"name": "pca", + "settings": [2]}, + + "model": {"name": "sgd", + "settings": []}, + + "remove_cols": [ + "gameType_Game", + "U_4.5", + "O_4.5", + "U_3.5", + "O_3.5", + "U_2.5", + "O_2.5", + "U_1.5", + "O_1.5", + + "playerId_SkaterStats", + "gamePk_SkaterStats", + "position_SkaterStats", + "team_SkaterStats", + + "timeOnIce_SkaterStats", + "timeOnIce_SkaterStats", + "assists_SkaterStats", + "goals_SkaterStats", + "shots_SkaterStats", + "hits_SkaterStats", + "powerPlayGoals_SkaterStats", + "powerPlayAssists_SkaterStats", + "penaltyMinutes_SkaterStats", + "faceOffWins_SkaterStats", + "faceoffTaken_SkaterStats", + "takeaways_SkaterStats", + "giveaways_SkaterStats", + "shortHandedGoals_SkaterStats", + "shortHandedAssists_SkaterStats", + "blocked_SkaterStats", + "plusMinus_SkaterStats", + "evenTimeOnIce_SkaterStats", + "powerPlayTimeOnIce_SkaterStats", + "shortHandedTimeOnIce_SkaterStats", + "added_SkaterStats", + "updated_SkaterStats", + "gamePk_Game", + "season_Game", + "gameDate_Game", + "abstractGameState_Game", + "codedGameState_Game", + "detailedState_Game", + "statusCode_Game", + "startTimeTBD_Game", + + "added_Game", + "updated_Game", + "gamePk_PlayerTeamStats", + "teamId_PlayerTeamStats", + "goals_PlayerTeamStats", + "pim_PlayerTeamStats", + "shots_PlayerTeamStats", + "powerPlayPercentage_PlayerTeamStats", + "powerPlayGoals_PlayerTeamStats", + "powerPlayOpportunities_PlayerTeamStats", + "faceOffWinPercentage_PlayerTeamStats", + "blocked_PlayerTeamStats", + "takeaways_PlayerTeamStats", + "giveaways_PlayerTeamStats", + "hits_PlayerTeamStats", + "goalsAgainst_PlayerTeamStats", + "pimAgainst_PlayerTeamStats", + "shotsAgainst_PlayerTeamStats", + "powerPlayPercentageAgainst_PlayerTeamStats", + "powerPlayGoalsAgainst_PlayerTeamStats", + "powerPlayOpportunitiesAgainst_PlayerTeamStats", + "faceOffWinPercentageAgainst_PlayerTeamStats", + "blockedAgainst_PlayerTeamStats", + "takeawaysAgainst_PlayerTeamStats", + "giveawaysAgainst_PlayerTeamStats", + "hitsAgainst_PlayerTeamStats", + "wins_PlayerTeamStats", + "losses_PlayerTeamStats", + "ot_PlayerTeamStats", + "score_PlayerTeamStats", + "added_PlayerTeamStats", + "updated_PlayerTeamStats", + "gamePk_OppTeamStats", + "teamId_OppTeamStats", + "isHome_OppTeamStats", + "goals_OppTeamStats", + "pim_OppTeamStats", + "shots_OppTeamStats", + "powerPlayPercentage_OppTeamStats", + "powerPlayGoals_OppTeamStats", + "powerPlayOpportunities_OppTeamStats", + "faceOffWinPercentage_OppTeamStats", + "blocked_OppTeamStats", + "takeaways_OppTeamStats", + "giveaways_OppTeamStats", + "hits_OppTeamStats", + "goalsAgainst_OppTeamStats", + "pimAgainst_OppTeamStats", + "shotsAgainst_OppTeamStats", + "powerPlayPercentageAgainst_OppTeamStats", + "powerPlayGoalsAgainst_OppTeamStats", + "powerPlayOpportunitiesAgainst_OppTeamStats", + "faceOffWinPercentageAgainst_OppTeamStats", + "blockedAgainst_OppTeamStats", + "takeawaysAgainst_OppTeamStats", + "giveawaysAgainst_OppTeamStats", + "hitsAgainst_OppTeamStats", + "wins_OppTeamStats", + "losses_OppTeamStats", + "ot_OppTeamStats", + "leagueRecordType_OppTeamStats", + "score_OppTeamStats", + "added_OppTeamStats", + "updated_OppTeamStats", + "playerId_SkaterStats_1_games_back" + ] } \ No newline at end of file diff --git a/app/handler.py b/app/handler.py index b7c556f1..73042f6e 100644 --- a/app/handler.py +++ b/app/handler.py @@ -8,7 +8,7 @@ from source.bets_handler import * from source.nhl_handler import * from source.nhl_gen import * -from source.preprocessing import preprocessing +from source.eval import * from tqdm import tqdm from datetime import date, datetime, timedelta import csv @@ -96,11 +96,9 @@ def generate_csv(player_id): nhl_session.close() -def save_csv(df, path, append): - name, end = path.split(".") - df.to_csv("./external/csvs/" + name + append + "." + end, sep=';', encoding='utf-8', index=False) +def save_csv(df, path): + df.to_csv(f"./external/csvs/{path}", sep=';', encoding='utf-8', index=False) -def extract_and_select(config): - df1 = preprocessing.extract_data(config['file'], config['extract']) - df2 = preprocessing.select_data(config['file'], config['select']) - return pd.concat([df1, df2], axis=1, join='inner') \ No newline at end of file + +def evaluate_setup(config): + return run_pipeline(config) \ No newline at end of file diff --git a/app/main.py b/app/main.py index fbc255cf..f142320a 100644 --- a/app/main.py +++ b/app/main.py @@ -27,8 +27,8 @@ def print_help(): print("Exiting...") break - elif arg_in.lower() == 'eval': - eval_bets() + #elif arg_in.lower() == 'eval': + # eval_bets() # Dev elif arg_in.lower() == 'und': @@ -58,13 +58,14 @@ def print_help(): player_id = 8475167#input(">>> > ") generate_csv(player_id) - elif arg_in.lower() == 'pre': + + elif arg_in.lower() == 'eval': # Feature extraction / selection - # From file or from "input"? + # From file or from "input" extract_and_select_var = {} with open('./external/preprocessing_configs/test.cfg') as f: extract_and_select_var = json.loads(f.read()) - save_csv(extract_and_select(extract_and_select_var), extract_and_select_var['file'], "_e_s") + save_csv(evaluate_setup(extract_and_select_var), extract_and_select_var['save_path']) else: diff --git a/app/source/eval.py b/app/source/eval.py new file mode 100644 index 00000000..dc807ac9 --- /dev/null +++ b/app/source/eval.py @@ -0,0 +1,208 @@ +from numpy import e, float32 +from sklearn.model_selection import train_test_split +from sklearn import preprocessing +from sklearn.pipeline import Pipeline +import pandas as pd + + + +# A function that takes in a configuration dict and runs a scikitlearn pipeline with its settings +def run_pipeline(config): + # Load the data + data = pd.read_csv("./external/csvs/" + config['data_path'], sep=";") + + # Split the data into train and test sets + X_train, X_test, y_train, y_test = train_test_split(data.drop(config['remove_cols'], axis=1), + data[config['train_test_split']['target_col']], + test_size=config['train_test_split']['test_percent'], + random_state=config['train_test_split']['random_state'], + shuffle=config['train_test_split']['shuffle']) + + + # A function call to create the right scaler + scaler = None + if 'scaler' in config: + scaler = construct_scaler(config['scaler']) + + + # A function call to create the right encoder + encoder = None + if 'encoder' in config: + encoder = construct_encoder(config['encoder']) + + + # A function call to create the right matrix decomposition + decomposition = None + if 'decomposition' in config: + decomposition = construct_matrix_decomposition(config['decomposition']) + + + # A function call to create the right model + model = construct_model(config['model']) + + if model == None: + return None + + + # Create the pipeline + pipeline = None + if scaler != None and encoder != None and decomposition != None: + pipeline = Pipeline([('encoder', encoder), ('scaler', scaler), ('decomposition', decomposition), ('model', model)]) + elif scaler != None and encoder != None: + pipeline = Pipeline([('encoder', encoder), ('scaler', scaler), ('model', model)]) + elif scaler != None and decomposition != None: + pipeline = Pipeline([('scaler', scaler), ('decomposition', decomposition), ('model', model)]) + elif scaler != None and model != None: + pipeline = Pipeline([('scaler', scaler), ('model', model)]) + elif encoder != None and decomposition != None: + pipeline = Pipeline([('encoder', encoder), ('decomposition', decomposition), ('model', model)]) + elif encoder != None and model != None: + pipeline = Pipeline([('encoder', encoder), ('model', model)]) + elif decomposition != None and model != None: + pipeline = Pipeline([('decomposition', decomposition), ('model', model)]) + elif scaler != None: + pipeline = Pipeline([('scaler', scaler), ('model', model)]) + elif encoder != None: + pipeline = Pipeline([('encoder', encoder), ('model', model)]) + elif decomposition != None: + pipeline = Pipeline([('decomposition', decomposition), ('model', model)]) + elif model != None: + pipeline = Pipeline([('model', model)]) + else: + pipeline = Pipeline([('model', model)]) + + print("Running: " + str(pipeline)) + + # Fit the pipeline + pipeline.fit(X_train, y_train) + + + # Calculate the accuracy + accuracy = pipeline.score(X_test, y_test) + print("Accuracy:", accuracy) + X_test["pred"] = pipeline.predict(X_test) + + + return X_test + + + + + + + +def construct_scaler(scaler_config): + scaler = None + if scaler_config['name'] == 'standard': + from sklearn.preprocessing import StandardScaler + scaler = StandardScaler(*scaler_config['settings']) + elif scaler_config['name'] == 'minmax': + from sklearn.preprocessing import MinMaxScaler + scaler = MinMaxScaler(*scaler_config['settings']) + elif scaler_config['name'] == 'maxabs': + from sklearn.preprocessing import MaxAbsScaler + scaler = MaxAbsScaler(*scaler_config['settings']) + elif scaler_config['name'] == 'robust': + from sklearn.preprocessing import RobustScaler + scaler = RobustScaler(*scaler_config['settings']) + elif scaler_config['name'] == 'quantile': + from sklearn.preprocessing import QuantileTransformer + scaler = QuantileTransformer(*scaler_config['settings']) + elif scaler_config['name'] == 'power': + from sklearn.preprocessing import PowerTransformer + scaler = PowerTransformer(*scaler_config['settings']) + elif scaler_config['name'] == 'normalize': + from sklearn.preprocessing import Normalizer + scaler = Normalizer(*scaler_config['settings']) + return scaler + +def construct_encoder(encoder_config): + encoder = NotImplementedError + if encoder_config['name'] == 'onehot': + from sklearn.preprocessing import OneHotEncoder + encoder = OneHotEncoder(*encoder_config['settings']) + elif encoder_config['name'] == 'label': + from sklearn.preprocessing import LabelEncoder + encoder = LabelEncoder(*encoder_config['settings']) + elif encoder_config['name'] == 'Ordinal': + from sklearn.preprocessing import OrdinalEncoder + encoder = OrdinalEncoder(*encoder_config['settings']) + return encoder + +def construct_matrix_decomposition(decomposition_config): + decomposition = None + if decomposition_config['name'] == 'pca': + from sklearn.decomposition import PCA + decomposition = PCA(*decomposition_config['settings']) + elif decomposition_config['name'] == 'kernelpca': + from sklearn.decomposition import KernelPCA + decomposition = KernelPCA(*decomposition_config['settings']) + elif decomposition_config['name'] == 'face': + from sklearn.decomposition import FactorAnalysis + decomposition = FactorAnalysis(*decomposition_config['settings']) + elif decomposition_config['name'] == 'nmf': + from sklearn.decomposition import NMF + decomposition = NMF(*decomposition_config['settings']) + elif decomposition_config['name'] == 'sparsepca': + from sklearn.decomposition import SparsePCA + decomposition = SparsePCA(*decomposition_config['settings']) + elif decomposition_config['name'] == 'factoranalysis': + from sklearn.decomposition import FactorAnalysis + decomposition = FactorAnalysis(*decomposition_config['settings']) + elif decomposition_config['name'] == 'truncatedsvd': + from sklearn.decomposition import TruncatedSVD + decomposition = TruncatedSVD(*decomposition_config['settings']) + elif decomposition_config['name'] == 'pca_sparse': + from sklearn.decomposition import PCA + decomposition = PCA(*decomposition_config['settings']) + return decomposition + + + + + +def construct_model(model_config): + model = None + if model_config['name'] == 'logistic': + from sklearn.linear_model import LogisticRegression + model = LogisticRegression(*model_config['settings']) + elif model_config['name'] == 'svm': + from sklearn.svm import SVC + model = SVC(*model_config['settings']) + elif model_config['name'] == 'knn': + from sklearn.neighbors import KNeighborsClassifier + model = KNeighborsClassifier(*model_config['settings']) + elif model_config['name'] == 'gaussian': + from sklearn.naive_bayes import GaussianNB + model = GaussianNB(*model_config['settings']) + elif model_config['name'] == 'tree': + from sklearn.tree import DecisionTreeClassifier + model = DecisionTreeClassifier(*model_config['settings']) + elif model_config['name'] == 'forest': + from sklearn.ensemble import RandomForestClassifier + model = RandomForestClassifier(*model_config['settings']) + elif model_config['name'] == 'gradient': + from sklearn.ensemble import GradientBoostingClassifier + model = GradientBoostingClassifier(*model_config['settings']) + elif model_config['name'] == 'adaboost': + from sklearn.ensemble import AdaBoostClassifier + model = AdaBoostClassifier(*model_config['settings']) + elif model_config['name'] == 'extra': + from sklearn.ensemble import ExtraTreesClassifier + model = ExtraTreesClassifier(*model_config['settings']) + elif model_config['name'] == 'bagging': + from sklearn.ensemble import BaggingClassifier + model = BaggingClassifier(*model_config['settings']) + elif model_config['name'] == 'gradientboosting': + from sklearn.ensemble import GradientBoostingClassifier + model = GradientBoostingClassifier(*model_config['settings']) + elif model_config['name'] == 'voting': + from sklearn.ensemble import VotingClassifier + model = VotingClassifier(*model_config['settings']) + elif model_config['name'] == 'mlp': + from sklearn.neural_network import MLPClassifier + model = MLPClassifier(*model_config['settings']) + elif model_config['name'] == 'sgd': + from sklearn.linear_model import SGDClassifier + model = SGDClassifier(*model_config['settings']) + return model \ No newline at end of file diff --git a/app/source/nhl_gen.py b/app/source/nhl_gen.py index 3e902d10..59e07041 100644 --- a/app/source/nhl_gen.py +++ b/app/source/nhl_gen.py @@ -31,15 +31,21 @@ def generate_data_for(player_id, nhl_session, games_to_go_back, season, path=Non if season == "all": for i in tqdm(range(2008, 2025)): season = str(i) + str(i+1) - print(playerStatsForGames[playerStatsForGames.season_Game == str(season)].shape) new_df = add_games_back(playerStatsForGames[playerStatsForGames.season_Game == str(season)], games_to_go_back) - print(new_df.shape) df_total = pd.concat([df_total, new_df]) - print(df_total.shape) else: df_total = add_games_back(playerStatsForGames[playerStatsForGames.season_Game == str(season)], games_to_go_back) + df_total["O_1.5"] = (df_total["shots_SkaterStats"] > 1.5).astype(int) + df_total["O_2.5"] = (df_total["shots_SkaterStats"] > 2.5).astype(int) + df_total["O_3.5"] = (df_total["shots_SkaterStats"] > 3.5).astype(int) + df_total["O_4.5"] = (df_total["shots_SkaterStats"] > 4.5).astype(int) + df_total["U_1.5"] = (df_total["shots_SkaterStats"] < 1.5).astype(int) + df_total["U_2.5"] = (df_total["shots_SkaterStats"] < 2.5).astype(int) + df_total["U_3.5"] = (df_total["shots_SkaterStats"] < 3.5).astype(int) + df_total["U_4.5"] = (df_total["shots_SkaterStats"] < 4.5).astype(int) + if path: stats_csv = df_total.to_csv(path, sep=';', encoding='utf-8', index=False) return path @@ -50,7 +56,7 @@ def add_games_back(df, games_to_go_back): df_total = pd.DataFrame() for i in range(1, games_to_go_back + 1): dfc = df.copy() - dfc = dfc.shift(periods=i+1) + dfc = dfc.shift(periods=i) dfc.columns = [u + "_{}_games_back".format(i) for u in dfc.head()] df_total = pd.concat([df_total, dfc], axis=1) df = pd.concat([df, df_total], axis=1) diff --git a/app/source/preprocessing.py b/app/source/preprocessing.py deleted file mode 100644 index 7ba7f831..00000000 --- a/app/source/preprocessing.py +++ /dev/null @@ -1,52 +0,0 @@ -import pandas as pd - - -class preprocessing(): - def extract_data(file, data): - df = pd.read_csv(f"./external/csvs/{file}", sep = ';') - df_res = pd.DataFrame() - for e in data: - if e['action'] == "sum": - df[e['name']] = df[e["data"]].sum(axis=1) - df_res[e['name']] = df[e["data"]].sum(axis=1) - - elif e['action'] == "mean": - df[e['name']] = df[e["data"]].mean(axis=1) - df_res[e['name']] = df[e["data"]].mean(axis=1) - - elif e['action'] == "div": - res = df[e['data'][0]] - for d_index in range(1, len(e['data'])): - res = res / df[e['data'][d_index]] - res.fillna(value=0, inplace=True) - df[e['name']] = res - df_res[e['name']] = res - - return df_res - - # A function that returns a dataframe from a csv file containing only the specified columns - def extract_columns(file, columns): - return pd.read_csv(f"./external/csvs/{file}", sep = ';')[columns] - - # A function that returns a dataframe containing only rows with more than half of the values missing - def drop_missing_values(df): - return df.dropna(thresh=len(df.columns) / 2) - - # A function that performs principal component analysis on a dataframe - def pca(df, n_components): - from sklearn.decomposition import PCA - pca = PCA(n_components=n_components) - pca.fit(df) - return pca.transform(df) - - # A function that performs a PCA on a dataframe - def add_pca_features(df, n_components): - df_pca = preprocessing.pca(df, n_components) - df_pca = pd.DataFrame(df_pca) - df_pca.columns = ['pca_' + str(i) for i in range(n_components)] - df = pd.concat([df, df_pca], axis=1) - return df - - # A function that returns a dataframe with filled in predicts the missing values using a specified method - def fill_missing_values_by(df, method): - return df.fillna(method=method) \ No newline at end of file From 9b31ee81ee78f7e3011219e4d6a31c688a9e62f0 Mon Sep 17 00:00:00 2001 From: Rasmus Rynell <35874840+RasmusRynell@users.noreply.github.com> Date: Mon, 19 Jul 2021 10:31:34 +0200 Subject: [PATCH 13/26] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 09a158f6..7d7c7779 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ This project explores the idea of using different machine learning techniques to In order to perform different ML techniques, data is needed, for now we use NHL's own (free and very detailed) database to gather all our data. We take this data and store it in our own [sqlite](https://www.sqlite.org/index.html) database to be used and updated when one wants/needs. The reasoning behind having our own database is quite simple, it’s a lot of data to ask for each time we want to do a prediction. This combined with the fact that we in the end want this process to be done once each day in the season the number of times we ask for a specific game in the database gets quickly out of control. #### NHL's database -In order to use the NHL database we followed [this](https://gitlab.com/dword4/nhlapi/-/blob/master/stats-api.md) incredible documentation. Since we know we want all game data for every game x seasons back all we had to do was loop through each day for that period and request all games that occurred on that day. We then took that data and put it in our own database in order to be used later. To update the database is then to only request data for games that have not yet (according to our database) been played, by doing it this way we don’t have to keep requesting data that never changes. +In order to use the NHL database [this](https://gitlab.com/dword4/nhlapi/-/blob/master/stats-api.md) incredible documentation was used. Since we know we want all game data for every game x seasons back all we had to do was loop through each day for that period and request all games that occurred on that day. We then took that data and put it in our own database in order to be used later. To update the database is then to only request data for games that have not yet (according to our database) been played, by doing it this way we don’t have to keep requesting data that never changes.

### Preprocessing From 2985e2098ed375e72ac093a1e00865f2351d2efd Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Mon, 19 Jul 2021 16:37:40 +0200 Subject: [PATCH 14/26] Added feature manipulation trough settings and defaults --- app/external/csvs/8475167_results.csv | 3 + app/external/csvs/cleaned_8475167.csv | 3 + app/external/csvs/test_csv_new.csv | 3 - app/external/preprocessing_configs/test.cfg | 332 +++++++++++++------- app/handler.py | 2 +- app/source/eval.py | 137 ++++---- 6 files changed, 308 insertions(+), 172 deletions(-) create mode 100644 app/external/csvs/8475167_results.csv create mode 100644 app/external/csvs/cleaned_8475167.csv delete mode 100644 app/external/csvs/test_csv_new.csv diff --git a/app/external/csvs/8475167_results.csv b/app/external/csvs/8475167_results.csv new file mode 100644 index 00000000..7435a47f --- /dev/null +++ b/app/external/csvs/8475167_results.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9429569c3dfa4ef7575a81606a254c5af49c214e409191ed63155731fe5db31e +size 384105 diff --git a/app/external/csvs/cleaned_8475167.csv b/app/external/csvs/cleaned_8475167.csv new file mode 100644 index 00000000..a9e85217 --- /dev/null +++ b/app/external/csvs/cleaned_8475167.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d60803e6d7326bc0bd4375c75f2bcba1254896d3b62d7ae686d28ed63f3596f +size 2494364 diff --git a/app/external/csvs/test_csv_new.csv b/app/external/csvs/test_csv_new.csv deleted file mode 100644 index 6c550f4e..00000000 --- a/app/external/csvs/test_csv_new.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6eb56e45237e7510ec8dd7bf18ce8a2b194d4bf4ede4405a8de62b773aa5539c -size 2866 diff --git a/app/external/preprocessing_configs/test.cfg b/app/external/preprocessing_configs/test.cfg index be40fc75..d696b665 100644 --- a/app/external/preprocessing_configs/test.cfg +++ b/app/external/preprocessing_configs/test.cfg @@ -2,131 +2,237 @@ "data_path": "8475167.csv", "save_path": "8475167_results.csv", "train_test_split": { - "target_col": "O_1.5", + "target_col": "U_2.5", "test_percent": 0.25, "random_state": 42, "shuffle": false }, + + "save_cleaned_csv": true, + + "replace_missing_values_with_zero": true, + "drop_all_missing_columns" : true, + "drop_all_missing_rows": true, + "scaler": {"name": "standard", - "settings": []}, + "settings": {}}, "decomposition": {"name": "pca", - "settings": [2]}, + "settings": {"n_components": 100}}, "model": {"name": "sgd", - "settings": []}, + "settings": {"penalty": "l2", + "n_jobs": 1}}, + + "setup_cols": { + "t": 2 + }, "remove_cols": [ - "gameType_Game", - "U_4.5", - "O_4.5", - "U_3.5", - "O_3.5", - "U_2.5", - "O_2.5", - "U_1.5", - "O_1.5", + "gameType_Game", + "U_4.5", + "O_4.5", + "U_3.5", + "O_3.5", + "U_2.5", + "O_2.5", + "U_1.5", + "O_1.5", + + "playerId_SkaterStats", + "gamePk_SkaterStats", + "position_SkaterStats", + "team_SkaterStats", + + "timeOnIce_SkaterStats", + "timeOnIce_SkaterStats", + "assists_SkaterStats", + "goals_SkaterStats", + "shots_SkaterStats", + "hits_SkaterStats", + "powerPlayGoals_SkaterStats", + "powerPlayAssists_SkaterStats", + "penaltyMinutes_SkaterStats", + "faceOffWins_SkaterStats", + "faceoffTaken_SkaterStats", + "takeaways_SkaterStats", + "giveaways_SkaterStats", + "shortHandedGoals_SkaterStats", + "shortHandedAssists_SkaterStats", + "blocked_SkaterStats", + "plusMinus_SkaterStats", + "evenTimeOnIce_SkaterStats", + "powerPlayTimeOnIce_SkaterStats", + "shortHandedTimeOnIce_SkaterStats", + "added_SkaterStats", + "updated_SkaterStats", + "gamePk_Game", + "season_Game", + "gameDate_Game", + "abstractGameState_Game", + "codedGameState_Game", + "detailedState_Game", + "statusCode_Game", + "startTimeTBD_Game", + + "added_Game", + "updated_Game", + "gamePk_PlayerTeamStats", + "teamId_PlayerTeamStats", + "goals_PlayerTeamStats", + "pim_PlayerTeamStats", + "shots_PlayerTeamStats", + "powerPlayPercentage_PlayerTeamStats", + "powerPlayGoals_PlayerTeamStats", + "powerPlayOpportunities_PlayerTeamStats", + "faceOffWinPercentage_PlayerTeamStats", + "blocked_PlayerTeamStats", + "takeaways_PlayerTeamStats", + "giveaways_PlayerTeamStats", + "hits_PlayerTeamStats", + "goalsAgainst_PlayerTeamStats", + "pimAgainst_PlayerTeamStats", + "shotsAgainst_PlayerTeamStats", + "powerPlayPercentageAgainst_PlayerTeamStats", + "powerPlayGoalsAgainst_PlayerTeamStats", + "powerPlayOpportunitiesAgainst_PlayerTeamStats", + "faceOffWinPercentageAgainst_PlayerTeamStats", + "blockedAgainst_PlayerTeamStats", + "takeawaysAgainst_PlayerTeamStats", + "giveawaysAgainst_PlayerTeamStats", + "hitsAgainst_PlayerTeamStats", + "wins_PlayerTeamStats", + "losses_PlayerTeamStats", + "ot_PlayerTeamStats", + "score_PlayerTeamStats", + "added_PlayerTeamStats", + "updated_PlayerTeamStats", + "gamePk_OppTeamStats", + "teamId_OppTeamStats", + "isHome_OppTeamStats", + "goals_OppTeamStats", + "pim_OppTeamStats", + "shots_OppTeamStats", + "powerPlayPercentage_OppTeamStats", + "powerPlayGoals_OppTeamStats", + "powerPlayOpportunities_OppTeamStats", + "faceOffWinPercentage_OppTeamStats", + "blocked_OppTeamStats", + "takeaways_OppTeamStats", + "giveaways_OppTeamStats", + "hits_OppTeamStats", + "goalsAgainst_OppTeamStats", + "pimAgainst_OppTeamStats", + "shotsAgainst_OppTeamStats", + "powerPlayPercentageAgainst_OppTeamStats", + "powerPlayGoalsAgainst_OppTeamStats", + "powerPlayOpportunitiesAgainst_OppTeamStats", + "faceOffWinPercentageAgainst_OppTeamStats", + "blockedAgainst_OppTeamStats", + "takeawaysAgainst_OppTeamStats", + "giveawaysAgainst_OppTeamStats", + "hitsAgainst_OppTeamStats", + "wins_OppTeamStats", + "losses_OppTeamStats", + "ot_OppTeamStats", + "leagueRecordType_OppTeamStats", + "score_OppTeamStats", + "added_OppTeamStats", + "updated_OppTeamStats", + + "timeOnIce_SkaterStats_1_games_back", + "evenTimeOnIce_SkaterStats_1_games_back", + "powerPlayTimeOnIce_SkaterStats_1_games_back", + "shortHandedTimeOnIce_SkaterStats_1_games_back", + "added_SkaterStats_1_games_back", + "updated_SkaterStats_1_games_back", + "gamePk_Game_1_games_back", + "gameDate_Game_1_games_back", + "abstractGameState_Game_1_games_back", + "added_Game_1_games_back", + "updated_Game_1_games_back", + "added_PlayerTeamStats_1_games_back", + "updated_PlayerTeamStats_1_games_back", + "added_OppTeamStats_1_games_back", + "updated_OppTeamStats_1_games_back", + "gameType_Game_1_games_back", + "abstractGameState_Game_1_games_back", + "detailedState_Game_1_games_back", + + "timeOnIce_SkaterStats_2_games_back", + "evenTimeOnIce_SkaterStats_2_games_back", + "powerPlayTimeOnIce_SkaterStats_2_games_back", + "shortHandedTimeOnIce_SkaterStats_2_games_back", + "added_SkaterStats_2_games_back", + "updated_SkaterStats_2_games_back", + "gamePk_Game_2_games_back", + "gameDate_Game_2_games_back", + "abstractGameState_Game_2_games_back", + "added_Game_2_games_back", + "updated_Game_2_games_back", + "added_PlayerTeamStats_2_games_back", + "updated_PlayerTeamStats_2_games_back", + "added_OppTeamStats_2_games_back", + "updated_OppTeamStats_2_games_back", + "gameType_Game_2_games_back", + "abstractGameState_Game_2_games_back", + "detailedState_Game_2_games_back", - "playerId_SkaterStats", - "gamePk_SkaterStats", - "position_SkaterStats", - "team_SkaterStats", + "timeOnIce_SkaterStats_3_games_back", + "evenTimeOnIce_SkaterStats_3_games_back", + "powerPlayTimeOnIce_SkaterStats_3_games_back", + "shortHandedTimeOnIce_SkaterStats_3_games_back", + "added_SkaterStats_3_games_back", + "updated_SkaterStats_3_games_back", + "gamePk_Game_3_games_back", + "gameDate_Game_3_games_back", + "abstractGameState_Game_3_games_back", + "added_Game_3_games_back", + "updated_Game_3_games_back", + "added_PlayerTeamStats_3_games_back", + "updated_PlayerTeamStats_3_games_back", + "added_OppTeamStats_3_games_back", + "updated_OppTeamStats_3_games_back", + "gameType_Game_3_games_back", + "abstractGameState_Game_3_games_back", + "detailedState_Game_3_games_back", - "timeOnIce_SkaterStats", - "timeOnIce_SkaterStats", - "assists_SkaterStats", - "goals_SkaterStats", - "shots_SkaterStats", - "hits_SkaterStats", - "powerPlayGoals_SkaterStats", - "powerPlayAssists_SkaterStats", - "penaltyMinutes_SkaterStats", - "faceOffWins_SkaterStats", - "faceoffTaken_SkaterStats", - "takeaways_SkaterStats", - "giveaways_SkaterStats", - "shortHandedGoals_SkaterStats", - "shortHandedAssists_SkaterStats", - "blocked_SkaterStats", - "plusMinus_SkaterStats", - "evenTimeOnIce_SkaterStats", - "powerPlayTimeOnIce_SkaterStats", - "shortHandedTimeOnIce_SkaterStats", - "added_SkaterStats", - "updated_SkaterStats", - "gamePk_Game", - "season_Game", - "gameDate_Game", - "abstractGameState_Game", - "codedGameState_Game", - "detailedState_Game", - "statusCode_Game", - "startTimeTBD_Game", + "timeOnIce_SkaterStats_4_games_back", + "evenTimeOnIce_SkaterStats_4_games_back", + "powerPlayTimeOnIce_SkaterStats_4_games_back", + "shortHandedTimeOnIce_SkaterStats_4_games_back", + "added_SkaterStats_4_games_back", + "updated_SkaterStats_4_games_back", + "gamePk_Game_4_games_back", + "gameDate_Game_4_games_back", + "abstractGameState_Game_4_games_back", + "added_Game_4_games_back", + "updated_Game_4_games_back", + "added_PlayerTeamStats_4_games_back", + "updated_PlayerTeamStats_4_games_back", + "added_OppTeamStats_4_games_back", + "updated_OppTeamStats_4_games_back", + "gameType_Game_4_games_back", + "abstractGameState_Game_4_games_back", + "detailedState_Game_4_games_back", - "added_Game", - "updated_Game", - "gamePk_PlayerTeamStats", - "teamId_PlayerTeamStats", - "goals_PlayerTeamStats", - "pim_PlayerTeamStats", - "shots_PlayerTeamStats", - "powerPlayPercentage_PlayerTeamStats", - "powerPlayGoals_PlayerTeamStats", - "powerPlayOpportunities_PlayerTeamStats", - "faceOffWinPercentage_PlayerTeamStats", - "blocked_PlayerTeamStats", - "takeaways_PlayerTeamStats", - "giveaways_PlayerTeamStats", - "hits_PlayerTeamStats", - "goalsAgainst_PlayerTeamStats", - "pimAgainst_PlayerTeamStats", - "shotsAgainst_PlayerTeamStats", - "powerPlayPercentageAgainst_PlayerTeamStats", - "powerPlayGoalsAgainst_PlayerTeamStats", - "powerPlayOpportunitiesAgainst_PlayerTeamStats", - "faceOffWinPercentageAgainst_PlayerTeamStats", - "blockedAgainst_PlayerTeamStats", - "takeawaysAgainst_PlayerTeamStats", - "giveawaysAgainst_PlayerTeamStats", - "hitsAgainst_PlayerTeamStats", - "wins_PlayerTeamStats", - "losses_PlayerTeamStats", - "ot_PlayerTeamStats", - "score_PlayerTeamStats", - "added_PlayerTeamStats", - "updated_PlayerTeamStats", - "gamePk_OppTeamStats", - "teamId_OppTeamStats", - "isHome_OppTeamStats", - "goals_OppTeamStats", - "pim_OppTeamStats", - "shots_OppTeamStats", - "powerPlayPercentage_OppTeamStats", - "powerPlayGoals_OppTeamStats", - "powerPlayOpportunities_OppTeamStats", - "faceOffWinPercentage_OppTeamStats", - "blocked_OppTeamStats", - "takeaways_OppTeamStats", - "giveaways_OppTeamStats", - "hits_OppTeamStats", - "goalsAgainst_OppTeamStats", - "pimAgainst_OppTeamStats", - "shotsAgainst_OppTeamStats", - "powerPlayPercentageAgainst_OppTeamStats", - "powerPlayGoalsAgainst_OppTeamStats", - "powerPlayOpportunitiesAgainst_OppTeamStats", - "faceOffWinPercentageAgainst_OppTeamStats", - "blockedAgainst_OppTeamStats", - "takeawaysAgainst_OppTeamStats", - "giveawaysAgainst_OppTeamStats", - "hitsAgainst_OppTeamStats", - "wins_OppTeamStats", - "losses_OppTeamStats", - "ot_OppTeamStats", - "leagueRecordType_OppTeamStats", - "score_OppTeamStats", - "added_OppTeamStats", - "updated_OppTeamStats", - "playerId_SkaterStats_1_games_back" - ] + "timeOnIce_SkaterStats_5_games_back", + "evenTimeOnIce_SkaterStats_5_games_back", + "powerPlayTimeOnIce_SkaterStats_5_games_back", + "shortHandedTimeOnIce_SkaterStats_5_games_back", + "added_SkaterStats_5_games_back", + "updated_SkaterStats_5_games_back", + "gamePk_Game_5_games_back", + "gameDate_Game_5_games_back", + "abstractGameState_Game_5_games_back", + "added_Game_5_games_back", + "updated_Game_5_games_back", + "added_PlayerTeamStats_5_games_back", + "updated_PlayerTeamStats_5_games_back", + "added_OppTeamStats_5_games_back", + "updated_OppTeamStats_5_games_back", + "gameType_Game_5_games_back", + "abstractGameState_Game_5_games_back", + "detailedState_Game_5_games_back" + ] } \ No newline at end of file diff --git a/app/handler.py b/app/handler.py index 73042f6e..4571970b 100644 --- a/app/handler.py +++ b/app/handler.py @@ -101,4 +101,4 @@ def save_csv(df, path): def evaluate_setup(config): - return run_pipeline(config) \ No newline at end of file + return run_eval_pipeline(config) \ No newline at end of file diff --git a/app/source/eval.py b/app/source/eval.py index dc807ac9..b29c8528 100644 --- a/app/source/eval.py +++ b/app/source/eval.py @@ -7,18 +7,44 @@ # A function that takes in a configuration dict and runs a scikitlearn pipeline with its settings -def run_pipeline(config): +def run_eval_pipeline(config): # Load the data data = pd.read_csv("./external/csvs/" + config['data_path'], sep=";") + pre_fix = data.shape + + # Turn false and true into 0 and 1 + if config['replace_missing_values_with_zero']: + print("Replacing true/false with 1/0") + data.replace(['false', 'true'], [0, 1], inplace=True) + data.replace(['False', 'True'], [0, 1], inplace=True) + + # Drop columns with all missing values + if config['drop_all_missing_columns']: + print("Dropping all columns with missing values") + data.dropna(axis=1, how='all', inplace=True) + + # Drop rows with missing values + if config['drop_all_missing_rows']: + print("Dropping rows with missing values") + data = data.dropna(axis=0, how='any') + + print("Data shape before removing missing values: " + str(pre_fix)) + print("Data shape after removing missing values: " + str(data.shape)) + + # save to csv + if config['save_cleaned_csv']: + data.to_csv("./external/csvs/cleaned_" + config['data_path'], sep=";", index=False) + # Split the data into train and test sets - X_train, X_test, y_train, y_test = train_test_split(data.drop(config['remove_cols'], axis=1), + X_train, X_test, y_train, y_test = train_test_split(data.drop(config['remove_cols'], axis=1, errors='ignore'), data[config['train_test_split']['target_col']], test_size=config['train_test_split']['test_percent'], random_state=config['train_test_split']['random_state'], shuffle=config['train_test_split']['shuffle']) + # A function call to create the right scaler scaler = None if 'scaler' in config: @@ -45,6 +71,24 @@ def run_pipeline(config): # Create the pipeline + pipeline = construct_pipeline(scaler, encoder, decomposition, model) + + # Fit the pipeline + print("Running: " + str(pipeline)) + pipeline.fit(X_train, y_train) + + + # Calculate the accuracy + accuracy = pipeline.score(X_test, y_test) + print("Accuracy:", accuracy) + X_test["pred"] = pipeline.predict(X_test) + + + return X_test + + + +def construct_pipeline(scaler, encoder, decomposition, model): pipeline = None if scaler != None and encoder != None and decomposition != None: pipeline = Pipeline([('encoder', encoder), ('scaler', scaler), ('decomposition', decomposition), ('model', model)]) @@ -70,24 +114,7 @@ def run_pipeline(config): pipeline = Pipeline([('model', model)]) else: pipeline = Pipeline([('model', model)]) - - print("Running: " + str(pipeline)) - - # Fit the pipeline - pipeline.fit(X_train, y_train) - - - # Calculate the accuracy - accuracy = pipeline.score(X_test, y_test) - print("Accuracy:", accuracy) - X_test["pred"] = pipeline.predict(X_test) - - - return X_test - - - - + return pipeline @@ -95,114 +122,114 @@ def construct_scaler(scaler_config): scaler = None if scaler_config['name'] == 'standard': from sklearn.preprocessing import StandardScaler - scaler = StandardScaler(*scaler_config['settings']) + scaler = StandardScaler(**scaler_config['settings']) elif scaler_config['name'] == 'minmax': from sklearn.preprocessing import MinMaxScaler - scaler = MinMaxScaler(*scaler_config['settings']) + scaler = MinMaxScaler(**scaler_config['settings']) elif scaler_config['name'] == 'maxabs': from sklearn.preprocessing import MaxAbsScaler - scaler = MaxAbsScaler(*scaler_config['settings']) + scaler = MaxAbsScaler(**scaler_config['settings']) elif scaler_config['name'] == 'robust': from sklearn.preprocessing import RobustScaler - scaler = RobustScaler(*scaler_config['settings']) + scaler = RobustScaler(**scaler_config['settings']) elif scaler_config['name'] == 'quantile': from sklearn.preprocessing import QuantileTransformer - scaler = QuantileTransformer(*scaler_config['settings']) + scaler = QuantileTransformer(**scaler_config['settings']) elif scaler_config['name'] == 'power': from sklearn.preprocessing import PowerTransformer - scaler = PowerTransformer(*scaler_config['settings']) + scaler = PowerTransformer(**scaler_config['settings']) elif scaler_config['name'] == 'normalize': from sklearn.preprocessing import Normalizer - scaler = Normalizer(*scaler_config['settings']) + scaler = Normalizer(**scaler_config['settings']) return scaler + def construct_encoder(encoder_config): encoder = NotImplementedError if encoder_config['name'] == 'onehot': from sklearn.preprocessing import OneHotEncoder - encoder = OneHotEncoder(*encoder_config['settings']) + encoder = OneHotEncoder(**encoder_config['settings']) elif encoder_config['name'] == 'label': from sklearn.preprocessing import LabelEncoder - encoder = LabelEncoder(*encoder_config['settings']) + encoder = LabelEncoder(**encoder_config['settings']) elif encoder_config['name'] == 'Ordinal': from sklearn.preprocessing import OrdinalEncoder - encoder = OrdinalEncoder(*encoder_config['settings']) + encoder = OrdinalEncoder(**encoder_config['settings']) return encoder + def construct_matrix_decomposition(decomposition_config): decomposition = None if decomposition_config['name'] == 'pca': from sklearn.decomposition import PCA - decomposition = PCA(*decomposition_config['settings']) + decomposition = PCA(**decomposition_config['settings']) elif decomposition_config['name'] == 'kernelpca': from sklearn.decomposition import KernelPCA - decomposition = KernelPCA(*decomposition_config['settings']) + decomposition = KernelPCA(**decomposition_config['settings']) elif decomposition_config['name'] == 'face': from sklearn.decomposition import FactorAnalysis - decomposition = FactorAnalysis(*decomposition_config['settings']) + decomposition = FactorAnalysis(**decomposition_config['settings']) elif decomposition_config['name'] == 'nmf': from sklearn.decomposition import NMF - decomposition = NMF(*decomposition_config['settings']) + decomposition = NMF(**decomposition_config['settings']) elif decomposition_config['name'] == 'sparsepca': from sklearn.decomposition import SparsePCA - decomposition = SparsePCA(*decomposition_config['settings']) + decomposition = SparsePCA(**decomposition_config['settings']) elif decomposition_config['name'] == 'factoranalysis': from sklearn.decomposition import FactorAnalysis - decomposition = FactorAnalysis(*decomposition_config['settings']) + decomposition = FactorAnalysis(**decomposition_config['settings']) elif decomposition_config['name'] == 'truncatedsvd': from sklearn.decomposition import TruncatedSVD - decomposition = TruncatedSVD(*decomposition_config['settings']) + decomposition = TruncatedSVD(**decomposition_config['settings']) elif decomposition_config['name'] == 'pca_sparse': from sklearn.decomposition import PCA - decomposition = PCA(*decomposition_config['settings']) + print(*decomposition_config['settings']) + decomposition = PCA(**decomposition_config['settings']) return decomposition - - - def construct_model(model_config): model = None if model_config['name'] == 'logistic': from sklearn.linear_model import LogisticRegression - model = LogisticRegression(*model_config['settings']) + model = LogisticRegression(**model_config['settings']) elif model_config['name'] == 'svm': from sklearn.svm import SVC - model = SVC(*model_config['settings']) + model = SVC(**model_config['settings']) elif model_config['name'] == 'knn': from sklearn.neighbors import KNeighborsClassifier - model = KNeighborsClassifier(*model_config['settings']) + model = KNeighborsClassifier(**model_config['settings']) elif model_config['name'] == 'gaussian': from sklearn.naive_bayes import GaussianNB - model = GaussianNB(*model_config['settings']) + model = GaussianNB(**model_config['settings']) elif model_config['name'] == 'tree': from sklearn.tree import DecisionTreeClassifier - model = DecisionTreeClassifier(*model_config['settings']) + model = DecisionTreeClassifier(**model_config['settings']) elif model_config['name'] == 'forest': from sklearn.ensemble import RandomForestClassifier - model = RandomForestClassifier(*model_config['settings']) + model = RandomForestClassifier(**model_config['settings']) elif model_config['name'] == 'gradient': from sklearn.ensemble import GradientBoostingClassifier - model = GradientBoostingClassifier(*model_config['settings']) + model = GradientBoostingClassifier(**model_config['settings']) elif model_config['name'] == 'adaboost': from sklearn.ensemble import AdaBoostClassifier - model = AdaBoostClassifier(*model_config['settings']) + model = AdaBoostClassifier(**model_config['settings']) elif model_config['name'] == 'extra': from sklearn.ensemble import ExtraTreesClassifier - model = ExtraTreesClassifier(*model_config['settings']) + model = ExtraTreesClassifier(**model_config['settings']) elif model_config['name'] == 'bagging': from sklearn.ensemble import BaggingClassifier - model = BaggingClassifier(*model_config['settings']) + model = BaggingClassifier(**model_config['settings']) elif model_config['name'] == 'gradientboosting': from sklearn.ensemble import GradientBoostingClassifier - model = GradientBoostingClassifier(*model_config['settings']) + model = GradientBoostingClassifier(**model_config['settings']) elif model_config['name'] == 'voting': from sklearn.ensemble import VotingClassifier - model = VotingClassifier(*model_config['settings']) + model = VotingClassifier(**model_config['settings']) elif model_config['name'] == 'mlp': from sklearn.neural_network import MLPClassifier - model = MLPClassifier(*model_config['settings']) + model = MLPClassifier(**model_config['settings']) elif model_config['name'] == 'sgd': from sklearn.linear_model import SGDClassifier - model = SGDClassifier(*model_config['settings']) + model = SGDClassifier(**model_config['settings']) return model \ No newline at end of file From 5fd69c9398167006b501b3e786be90113e373165 Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Wed, 21 Jul 2021 12:05:29 +0200 Subject: [PATCH 15/26] Added support for column transformer --- app/external/csvs/8475167.csv | 4 +- app/external/csvs/8475167_results.csv | 4 +- app/external/csvs/cleaned_8475167.csv | 4 +- app/external/preprocessing_configs/test.cfg | 30 +++++-- app/source/eval.py | 87 +++++++++++++-------- 5 files changed, 86 insertions(+), 43 deletions(-) diff --git a/app/external/csvs/8475167.csv b/app/external/csvs/8475167.csv index 624f6061..681461ec 100644 --- a/app/external/csvs/8475167.csv +++ b/app/external/csvs/8475167.csv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2a3f8caeedb678d22005306941b459fe9fb46a4596a2861e7134d8d467fde12e -size 2939460 +oid sha256:b45b9e39f712727839078407b71e855de8572d024ae36e7b2e1122ec63985732 +size 3005515 diff --git a/app/external/csvs/8475167_results.csv b/app/external/csvs/8475167_results.csv index 7435a47f..8a8bf686 100644 --- a/app/external/csvs/8475167_results.csv +++ b/app/external/csvs/8475167_results.csv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9429569c3dfa4ef7575a81606a254c5af49c214e409191ed63155731fe5db31e -size 384105 +oid sha256:efbc340166640c29207638d2d50e711553a0e428cdfc6e0e6def01d4f0b636ef +size 372447 diff --git a/app/external/csvs/cleaned_8475167.csv b/app/external/csvs/cleaned_8475167.csv index a9e85217..648a5a2f 100644 --- a/app/external/csvs/cleaned_8475167.csv +++ b/app/external/csvs/cleaned_8475167.csv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3d60803e6d7326bc0bd4375c75f2bcba1254896d3b62d7ae686d28ed63f3596f -size 2494364 +oid sha256:6123c0d33de1a329fa82d9af432881f49c2d5af1e0730e137e951c0ce8ef6a71 +size 2528566 diff --git a/app/external/preprocessing_configs/test.cfg b/app/external/preprocessing_configs/test.cfg index d696b665..d77752dd 100644 --- a/app/external/preprocessing_configs/test.cfg +++ b/app/external/preprocessing_configs/test.cfg @@ -17,6 +17,14 @@ "scaler": {"name": "standard", "settings": {}}, + "col_transformer": { + "encoders": [{"name": "onehot", + "targets": ["startTimeTBD_Game_1_games_back"], + "settings": {"categories":"auto"} + }], + "settings": {"remainder": "passthrough", + "n_jobs": -1}}, + "decomposition": {"name": "pca", "settings": {"n_components": 100}}, @@ -24,10 +32,6 @@ "settings": {"penalty": "l2", "n_jobs": 1}}, - "setup_cols": { - "t": 2 - }, - "remove_cols": [ "gameType_Game", "U_4.5", @@ -139,6 +143,7 @@ "score_OppTeamStats", "added_OppTeamStats", "updated_OppTeamStats", + "leagueRecordType_PlayerTeamStats", "timeOnIce_SkaterStats_1_games_back", "evenTimeOnIce_SkaterStats_1_games_back", @@ -158,6 +163,9 @@ "gameType_Game_1_games_back", "abstractGameState_Game_1_games_back", "detailedState_Game_1_games_back", + "leagueRecordType_PlayerTeamStats_1_games_back", + "leagueRecordType_OppTeamStats_1_games_back", + "position_SkaterStats_1_games_back", "timeOnIce_SkaterStats_2_games_back", "evenTimeOnIce_SkaterStats_2_games_back", @@ -177,6 +185,9 @@ "gameType_Game_2_games_back", "abstractGameState_Game_2_games_back", "detailedState_Game_2_games_back", + "leagueRecordType_PlayerTeamStats_2_games_back", + "leagueRecordType_OppTeamStats_2_games_back", + "position_SkaterStats_2_games_back", "timeOnIce_SkaterStats_3_games_back", "evenTimeOnIce_SkaterStats_3_games_back", @@ -196,6 +207,9 @@ "gameType_Game_3_games_back", "abstractGameState_Game_3_games_back", "detailedState_Game_3_games_back", + "leagueRecordType_PlayerTeamStats_3_games_back", + "leagueRecordType_OppTeamStats_3_games_back", + "position_SkaterStats_3_games_back", "timeOnIce_SkaterStats_4_games_back", "evenTimeOnIce_SkaterStats_4_games_back", @@ -215,6 +229,9 @@ "gameType_Game_4_games_back", "abstractGameState_Game_4_games_back", "detailedState_Game_4_games_back", + "leagueRecordType_PlayerTeamStats_4_games_back", + "leagueRecordType_OppTeamStats_4_games_back", + "position_SkaterStats_4_games_back", "timeOnIce_SkaterStats_5_games_back", "evenTimeOnIce_SkaterStats_5_games_back", @@ -233,6 +250,9 @@ "updated_OppTeamStats_5_games_back", "gameType_Game_5_games_back", "abstractGameState_Game_5_games_back", - "detailedState_Game_5_games_back" + "detailedState_Game_5_games_back", + "leagueRecordType_PlayerTeamStats_5_games_back", + "leagueRecordType_OppTeamStats_5_games_back", + "position_SkaterStats_5_games_back" ] } \ No newline at end of file diff --git a/app/source/eval.py b/app/source/eval.py index b29c8528..c220deee 100644 --- a/app/source/eval.py +++ b/app/source/eval.py @@ -51,10 +51,10 @@ def run_eval_pipeline(config): scaler = construct_scaler(config['scaler']) - # A function call to create the right encoder - encoder = None - if 'encoder' in config: - encoder = construct_encoder(config['encoder']) + # A function call to create the right column tranformer + col_transformer = None + if 'col_transformer' in config: + col_transformer = construct_col_transformer(config['col_transformer']) # A function call to create the right matrix decomposition @@ -65,13 +65,12 @@ def run_eval_pipeline(config): # A function call to create the right model model = construct_model(config['model']) - if model == None: return None # Create the pipeline - pipeline = construct_pipeline(scaler, encoder, decomposition, model) + pipeline = construct_pipeline(scaler, col_transformer, decomposition, model) # Fit the pipeline print("Running: " + str(pipeline)) @@ -88,32 +87,37 @@ def run_eval_pipeline(config): -def construct_pipeline(scaler, encoder, decomposition, model): + + + + +def construct_pipeline(scaler, col_transformer, decomposition, model): pipeline = None - if scaler != None and encoder != None and decomposition != None: - pipeline = Pipeline([('encoder', encoder), ('scaler', scaler), ('decomposition', decomposition), ('model', model)]) - elif scaler != None and encoder != None: - pipeline = Pipeline([('encoder', encoder), ('scaler', scaler), ('model', model)]) + if scaler != None and col_transformer != None and decomposition != None: + pipeline = Pipeline([('col_transformer', col_transformer), ('scaler', scaler), ('decomposition', decomposition), ('model', model)]) + elif scaler != None and col_transformer != None: + pipeline = Pipeline([('col_transformer', col_transformer), ('scaler', scaler), ('model', model)]) elif scaler != None and decomposition != None: pipeline = Pipeline([('scaler', scaler), ('decomposition', decomposition), ('model', model)]) elif scaler != None and model != None: pipeline = Pipeline([('scaler', scaler), ('model', model)]) - elif encoder != None and decomposition != None: - pipeline = Pipeline([('encoder', encoder), ('decomposition', decomposition), ('model', model)]) - elif encoder != None and model != None: - pipeline = Pipeline([('encoder', encoder), ('model', model)]) + elif col_transformer != None and decomposition != None: + pipeline = Pipeline([('col_transformer', col_transformer), ('decomposition', decomposition), ('model', model)]) + elif col_transformer != None and model != None: + pipeline = Pipeline([('col_transformer', col_transformer), ('model', model)]) elif decomposition != None and model != None: pipeline = Pipeline([('decomposition', decomposition), ('model', model)]) elif scaler != None: pipeline = Pipeline([('scaler', scaler), ('model', model)]) - elif encoder != None: - pipeline = Pipeline([('encoder', encoder), ('model', model)]) + elif col_transformer != None: + pipeline = Pipeline([('col_transformer', col_transformer), ('model', model)]) elif decomposition != None: pipeline = Pipeline([('decomposition', decomposition), ('model', model)]) elif model != None: pipeline = Pipeline([('model', model)]) else: pipeline = Pipeline([('model', model)]) + return pipeline @@ -141,21 +145,34 @@ def construct_scaler(scaler_config): elif scaler_config['name'] == 'normalize': from sklearn.preprocessing import Normalizer scaler = Normalizer(**scaler_config['settings']) - return scaler + + if scaler != None: + return scaler + raise Exception("No scaler found in scaler config") + + +def construct_col_transformer(col_transformer_config): + from sklearn.compose import make_column_transformer + encoders = [] + for encoder_config in col_transformer_config['encoders']: + encoder = None + if encoder_config['name'] == 'onehot': + from sklearn.preprocessing import OneHotEncoder + encoder = OneHotEncoder(**encoder_config['settings']) + elif encoder_config['name'] == 'label': + from sklearn.preprocessing import LabelEncoder + encoder = LabelEncoder(**encoder_config['settings']) + elif encoder_config['name'] == 'Ordinal': + from sklearn.preprocessing import OrdinalEncoder + encoder = OrdinalEncoder(**encoder_config['settings']) -def construct_encoder(encoder_config): - encoder = NotImplementedError - if encoder_config['name'] == 'onehot': - from sklearn.preprocessing import OneHotEncoder - encoder = OneHotEncoder(**encoder_config['settings']) - elif encoder_config['name'] == 'label': - from sklearn.preprocessing import LabelEncoder - encoder = LabelEncoder(**encoder_config['settings']) - elif encoder_config['name'] == 'Ordinal': - from sklearn.preprocessing import OrdinalEncoder - encoder = OrdinalEncoder(**encoder_config['settings']) - return encoder + encoders.append((encoder, encoder_config['targets'])) + + if len(encoders) > 0: + print(encoders) + return make_column_transformer(*encoders, **col_transformer_config['settings']) + raise Exception("No encoders found in col_transformer config") def construct_matrix_decomposition(decomposition_config): @@ -185,7 +202,10 @@ def construct_matrix_decomposition(decomposition_config): from sklearn.decomposition import PCA print(*decomposition_config['settings']) decomposition = PCA(**decomposition_config['settings']) - return decomposition + + if decomposition != None: + return decomposition + raise Exception("No decomposition found in decomposition config") def construct_model(model_config): @@ -232,4 +252,7 @@ def construct_model(model_config): elif model_config['name'] == 'sgd': from sklearn.linear_model import SGDClassifier model = SGDClassifier(**model_config['settings']) - return model \ No newline at end of file + + if model != None: + return model + raise Exception("No model found in model config") \ No newline at end of file From 583411f024ca555d7effbfb583283056917c7bdf Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Wed, 21 Jul 2021 12:14:27 +0200 Subject: [PATCH 16/26] Fixed readability --- app/external/csvs/8475167_results.csv | 2 +- app/external/preprocessing_configs/test.cfg | 7 ++++--- app/source/eval.py | 5 +---- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/external/csvs/8475167_results.csv b/app/external/csvs/8475167_results.csv index 8a8bf686..9552937c 100644 --- a/app/external/csvs/8475167_results.csv +++ b/app/external/csvs/8475167_results.csv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:efbc340166640c29207638d2d50e711553a0e428cdfc6e0e6def01d4f0b636ef +oid sha256:5ac5952dbdb5c66a4d9a2084192ef810d30f872a70948a448a82d1b038e1a64d size 372447 diff --git a/app/external/preprocessing_configs/test.cfg b/app/external/preprocessing_configs/test.cfg index d77752dd..b0eba282 100644 --- a/app/external/preprocessing_configs/test.cfg +++ b/app/external/preprocessing_configs/test.cfg @@ -3,11 +3,12 @@ "save_path": "8475167_results.csv", "train_test_split": { "target_col": "U_2.5", - "test_percent": 0.25, - "random_state": 42, - "shuffle": false + "settings": {"test_size": 0.25, + "random_state": 42, + "shuffle": false} }, + "save_cleaned_csv": true, "replace_missing_values_with_zero": true, diff --git a/app/source/eval.py b/app/source/eval.py index c220deee..cb4a06b5 100644 --- a/app/source/eval.py +++ b/app/source/eval.py @@ -39,10 +39,7 @@ def run_eval_pipeline(config): # Split the data into train and test sets X_train, X_test, y_train, y_test = train_test_split(data.drop(config['remove_cols'], axis=1, errors='ignore'), data[config['train_test_split']['target_col']], - test_size=config['train_test_split']['test_percent'], - random_state=config['train_test_split']['random_state'], - shuffle=config['train_test_split']['shuffle']) - + **config['train_test_split']['settings']) # A function call to create the right scaler From a255f30f485ebe8f7f8c13a87a0b5a6bfd633194 Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Wed, 21 Jul 2021 14:44:34 +0200 Subject: [PATCH 17/26] added support for cross validation --- app/external/csvs/8475167_results.csv | 2 +- app/external/preprocessing_configs/test.cfg | 11 +++--- app/source/eval.py | 37 ++++++++++++++++----- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/app/external/csvs/8475167_results.csv b/app/external/csvs/8475167_results.csv index 9552937c..a5be74ab 100644 --- a/app/external/csvs/8475167_results.csv +++ b/app/external/csvs/8475167_results.csv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ac5952dbdb5c66a4d9a2084192ef810d30f872a70948a448a82d1b038e1a64d +oid sha256:3244556543ec444bd72d1de204b1dbbdfba077d2d10e455d51762ee39ddca5e8 size 372447 diff --git a/app/external/preprocessing_configs/test.cfg b/app/external/preprocessing_configs/test.cfg index b0eba282..81e01710 100644 --- a/app/external/preprocessing_configs/test.cfg +++ b/app/external/preprocessing_configs/test.cfg @@ -8,13 +8,12 @@ "shuffle": false} }, - - "save_cleaned_csv": true, - "replace_missing_values_with_zero": true, "drop_all_missing_columns" : true, "drop_all_missing_rows": true, + "save_cleaned_csv": true, + "scaler": {"name": "standard", "settings": {}}, @@ -31,7 +30,11 @@ "model": {"name": "sgd", "settings": {"penalty": "l2", - "n_jobs": 1}}, + "n_jobs": -1}}, + + "cross_validate": {"settings": {"cv": 5, + "scoring": "accuracy"}}, + "remove_cols": [ "gameType_Game", diff --git a/app/source/eval.py b/app/source/eval.py index cb4a06b5..681dd8fe 100644 --- a/app/source/eval.py +++ b/app/source/eval.py @@ -69,15 +69,36 @@ def run_eval_pipeline(config): # Create the pipeline pipeline = construct_pipeline(scaler, col_transformer, decomposition, model) - # Fit the pipeline - print("Running: " + str(pipeline)) - pipeline.fit(X_train, y_train) + score = None + # Cross validate the pipeline + if 'cross_validate' in config: + from sklearn.model_selection import cross_val_score + print("Cross validating the pipeline") + print(config['cross_validate']['settings']) + scores = cross_val_score(pipeline, X_train, y_train, **config['cross_validate']['settings']).mean() + print("Cross validation score:", scores) + print("Cross validation std:", scores.std()) + print(y_train.value_counts(normalize=True)) + + pipeline.fit(X_train, y_train) + score = pipeline.score(X_test, y_test) + + # print confusion matrix + y_pred = pipeline.predict(X_test) + print(pd.crosstab(y_test, y_pred, rownames=['True'], colnames=['Predicted'], margins=True)) + X_test["pred"] = y_pred + + print("Score on test: " + str(score)) - - # Calculate the accuracy - accuracy = pipeline.score(X_test, y_test) - print("Accuracy:", accuracy) - X_test["pred"] = pipeline.predict(X_test) + else: + # Fit the pipeline + print("Fitting pipeline without cross validation: " + str(pipeline)) + pipeline.fit(X_train, y_train) + + # Calculate accuracy + accuracy = pipeline.score(X_test, y_test) + print("Accuracy:", accuracy) + X_test["pred"] = pipeline.predict(X_test) return X_test From 2ea51a098301fb5341f20f2b990c8b2b689c9f62 Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Thu, 22 Jul 2021 10:53:05 +0200 Subject: [PATCH 18/26] cleanup --- .../test.cfg | 2 + app/external/csvs/8475167_results.csv | 2 +- app/main.py | 2 +- app/source/eval.py | 51 +++++++++++-------- 4 files changed, 33 insertions(+), 24 deletions(-) rename app/external/{preprocessing_configs => configs}/test.cfg (99%) diff --git a/app/external/preprocessing_configs/test.cfg b/app/external/configs/test.cfg similarity index 99% rename from app/external/preprocessing_configs/test.cfg rename to app/external/configs/test.cfg index 81e01710..0a9be793 100644 --- a/app/external/preprocessing_configs/test.cfg +++ b/app/external/configs/test.cfg @@ -14,6 +14,8 @@ "save_cleaned_csv": true, + "pipeline": {"settings": {"verbose": true}}, + "scaler": {"name": "standard", "settings": {}}, diff --git a/app/external/csvs/8475167_results.csv b/app/external/csvs/8475167_results.csv index a5be74ab..0bb1c951 100644 --- a/app/external/csvs/8475167_results.csv +++ b/app/external/csvs/8475167_results.csv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3244556543ec444bd72d1de204b1dbbdfba077d2d10e455d51762ee39ddca5e8 +oid sha256:a238b7105149de1917f90e60bac0ec83bf144a8ffd49c2493128544aeb1fd5cc size 372447 diff --git a/app/main.py b/app/main.py index f142320a..fd050d3a 100644 --- a/app/main.py +++ b/app/main.py @@ -63,7 +63,7 @@ def print_help(): # Feature extraction / selection # From file or from "input" extract_and_select_var = {} - with open('./external/preprocessing_configs/test.cfg') as f: + with open('./external/configs/test.cfg') as f: extract_and_select_var = json.loads(f.read()) save_csv(evaluate_setup(extract_and_select_var), extract_and_select_var['save_path']) diff --git a/app/source/eval.py b/app/source/eval.py index 681dd8fe..ae0c0031 100644 --- a/app/source/eval.py +++ b/app/source/eval.py @@ -31,6 +31,7 @@ def run_eval_pipeline(config): print("Data shape before removing missing values: " + str(pre_fix)) print("Data shape after removing missing values: " + str(data.shape)) + print("") # save to csv if config['save_cleaned_csv']: @@ -67,28 +68,36 @@ def run_eval_pipeline(config): # Create the pipeline - pipeline = construct_pipeline(scaler, col_transformer, decomposition, model) + pipeline = construct_pipeline(config, scaler, col_transformer, decomposition, model) score = None # Cross validate the pipeline if 'cross_validate' in config: + print("Running: ", pipeline) + print("") + from sklearn.model_selection import cross_val_score - print("Cross validating the pipeline") + print("Cross validating the pipeline with settings: ") print(config['cross_validate']['settings']) scores = cross_val_score(pipeline, X_train, y_train, **config['cross_validate']['settings']).mean() - print("Cross validation score:", scores) - print("Cross validation std:", scores.std()) + print("score on cross validation:", scores) + print("std on cross validation:", scores.std()) + + print("\nHow many right one would have only guessing on one") print(y_train.value_counts(normalize=True)) + print("") pipeline.fit(X_train, y_train) score = pipeline.score(X_test, y_test) - - # print confusion matrix + + print("\nScore on test: " + str(score)) + + print("Confusion matrix") y_pred = pipeline.predict(X_test) print(pd.crosstab(y_test, y_pred, rownames=['True'], colnames=['Predicted'], margins=True)) + print("") X_test["pred"] = y_pred - print("Score on test: " + str(score)) else: # Fit the pipeline @@ -109,32 +118,32 @@ def run_eval_pipeline(config): -def construct_pipeline(scaler, col_transformer, decomposition, model): +def construct_pipeline(config, scaler, col_transformer, decomposition, model): pipeline = None if scaler != None and col_transformer != None and decomposition != None: - pipeline = Pipeline([('col_transformer', col_transformer), ('scaler', scaler), ('decomposition', decomposition), ('model', model)]) + pipeline = Pipeline([('col_transformer', col_transformer), ('scaler', scaler), ('decomposition', decomposition), ('model', model)], **config['pipeline']['settings']) elif scaler != None and col_transformer != None: - pipeline = Pipeline([('col_transformer', col_transformer), ('scaler', scaler), ('model', model)]) + pipeline = Pipeline([('col_transformer', col_transformer), ('scaler', scaler), ('model', model)], **config['pipeline']['settings']) elif scaler != None and decomposition != None: - pipeline = Pipeline([('scaler', scaler), ('decomposition', decomposition), ('model', model)]) + pipeline = Pipeline([('scaler', scaler), ('decomposition', decomposition), ('model', model)], **config['pipeline']['settings']) elif scaler != None and model != None: - pipeline = Pipeline([('scaler', scaler), ('model', model)]) + pipeline = Pipeline([('scaler', scaler), ('model', model)], **config['pipeline']['settings']) elif col_transformer != None and decomposition != None: - pipeline = Pipeline([('col_transformer', col_transformer), ('decomposition', decomposition), ('model', model)]) + pipeline = Pipeline([('col_transformer', col_transformer), ('decomposition', decomposition), ('model', model)], **config['pipeline']['settings']) elif col_transformer != None and model != None: - pipeline = Pipeline([('col_transformer', col_transformer), ('model', model)]) + pipeline = Pipeline([('col_transformer', col_transformer), ('model', model)], **config['pipeline']['settings']) elif decomposition != None and model != None: - pipeline = Pipeline([('decomposition', decomposition), ('model', model)]) + pipeline = Pipeline([('decomposition', decomposition), ('model', model)], **config['pipeline']['settings']) elif scaler != None: - pipeline = Pipeline([('scaler', scaler), ('model', model)]) + pipeline = Pipeline([('scaler', scaler), ('model', model)], **config['pipeline']['settings']) elif col_transformer != None: - pipeline = Pipeline([('col_transformer', col_transformer), ('model', model)]) + pipeline = Pipeline([('col_transformer', col_transformer), ('model', model)], **config['pipeline']['settings']) elif decomposition != None: - pipeline = Pipeline([('decomposition', decomposition), ('model', model)]) + pipeline = Pipeline([('decomposition', decomposition), ('model', model)], **config['pipeline']['settings']) elif model != None: - pipeline = Pipeline([('model', model)]) + pipeline = Pipeline([('model', model)], **config['pipeline']['settings']) else: - pipeline = Pipeline([('model', model)]) + pipeline = Pipeline([('model', model)], **config['pipeline']['settings']) return pipeline @@ -188,7 +197,6 @@ def construct_col_transformer(col_transformer_config): encoders.append((encoder, encoder_config['targets'])) if len(encoders) > 0: - print(encoders) return make_column_transformer(*encoders, **col_transformer_config['settings']) raise Exception("No encoders found in col_transformer config") @@ -218,7 +226,6 @@ def construct_matrix_decomposition(decomposition_config): decomposition = TruncatedSVD(**decomposition_config['settings']) elif decomposition_config['name'] == 'pca_sparse': from sklearn.decomposition import PCA - print(*decomposition_config['settings']) decomposition = PCA(**decomposition_config['settings']) if decomposition != None: From c49d269a1e28f2f45c22ac29bf7a8dfda8bbf22d Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Thu, 22 Jul 2021 17:25:54 +0200 Subject: [PATCH 19/26] Simple hyper parameter optimization added --- app/external/configs/test.cfg | 11 ++- app/external/csvs/8475167_results.csv | 2 +- app/source/eval.py | 97 ++++++++++++++++++--------- 3 files changed, 75 insertions(+), 35 deletions(-) diff --git a/app/external/configs/test.cfg b/app/external/configs/test.cfg index 0a9be793..351c8bc5 100644 --- a/app/external/configs/test.cfg +++ b/app/external/configs/test.cfg @@ -8,6 +8,8 @@ "shuffle": false} }, + "verbose": true, + "replace_missing_values_with_zero": true, "drop_all_missing_columns" : true, "drop_all_missing_rows": true, @@ -20,7 +22,7 @@ "settings": {}}, "col_transformer": { - "encoders": [{"name": "onehot", + "encoders": [{"name": "onehotencoder", "targets": ["startTimeTBD_Game_1_games_back"], "settings": {"categories":"auto"} }], @@ -36,7 +38,12 @@ "cross_validate": {"settings": {"cv": 5, "scoring": "accuracy"}}, - + + "hyperparameter_optimization": {"name": "grid_search", + "params": {"col_transformer__onehotencoder": {"categories":["auto"]}}, + "settings": {"cv":5, "verbose": true, "n_jobs":-1}}, + + "remove_cols": [ "gameType_Game", diff --git a/app/external/csvs/8475167_results.csv b/app/external/csvs/8475167_results.csv index 0bb1c951..4905061e 100644 --- a/app/external/csvs/8475167_results.csv +++ b/app/external/csvs/8475167_results.csv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a238b7105149de1917f90e60bac0ec83bf144a8ffd49c2493128544aeb1fd5cc +oid sha256:3dfda5d384602be20a9e2b88a4ac45c0d7ca6a375f79bdda9b1f8a581b74dae2 size 372447 diff --git a/app/source/eval.py b/app/source/eval.py index ae0c0031..6e44430b 100644 --- a/app/source/eval.py +++ b/app/source/eval.py @@ -68,82 +68,115 @@ def run_eval_pipeline(config): # Create the pipeline - pipeline = construct_pipeline(config, scaler, col_transformer, decomposition, model) + pipeline = construct_pipeline(config['pipeline'], scaler, col_transformer, decomposition, model) + + + if 'hyperparameter_optimization' in config: + pipeline = hyperparameter_optimization(config['hyperparameter_optimization'], pipeline, X_train, y_train) score = None # Cross validate the pipeline if 'cross_validate' in config: - print("Running: ", pipeline) - print("") + if 'verbose' in config and config['verbose']: print(f"Running: {pipeline} \n") from sklearn.model_selection import cross_val_score - print("Cross validating the pipeline with settings: ") - print(config['cross_validate']['settings']) + if 'verbose' in config and config['verbose']: print("Cross validating the pipeline with settings: ") + if 'verbose' in config and config['verbose']: print(config['cross_validate']['settings']) scores = cross_val_score(pipeline, X_train, y_train, **config['cross_validate']['settings']).mean() - print("score on cross validation:", scores) - print("std on cross validation:", scores.std()) + if 'verbose' in config and config['verbose']: print("score on cross validation:", scores) + if 'verbose' in config and config['verbose']: print("std on cross validation:", scores.std()) - print("\nHow many right one would have only guessing on one") - print(y_train.value_counts(normalize=True)) - print("") + if 'verbose' in config and config['verbose']: print("\nHow many right one would have only guessing on one") + if 'verbose' in config and config['verbose']: print(f"{y_train.value_counts(normalize=True)}\n") pipeline.fit(X_train, y_train) score = pipeline.score(X_test, y_test) - print("\nScore on test: " + str(score)) - - print("Confusion matrix") + if 'verbose' in config and config['verbose']: print("\nScore on test: " + str(score)) + if 'verbose' in config and config['verbose']: print("Confusion matrix") y_pred = pipeline.predict(X_test) - print(pd.crosstab(y_test, y_pred, rownames=['True'], colnames=['Predicted'], margins=True)) - print("") + if 'verbose' in config and config['verbose']: print(f"{pd.crosstab(y_test, y_pred, rownames=['True'], colnames=['Predicted'], margins=True)}\n") + + # Save answers X_test["pred"] = y_pred else: # Fit the pipeline - print("Fitting pipeline without cross validation: " + str(pipeline)) + if 'verbose' in config and config['verbose']: print("Fitting pipeline without cross validation: " + str(pipeline)) pipeline.fit(X_train, y_train) # Calculate accuracy accuracy = pipeline.score(X_test, y_test) - print("Accuracy:", accuracy) - X_test["pred"] = pipeline.predict(X_test) + if 'verbose' in config and config['verbose']: print("Accuracy:", accuracy) + # Save answers + X_test["pred"] = pipeline.predict(X_test) return X_test +def hyperparameter_optimization(hp_o_config, pipeline, X_train, y_train): + from sklearn.model_selection import GridSearchCV + from sklearn.model_selection import RandomizedSearchCV + + grid_params = [] + for key, value in hp_o_config['params'].items(): + for k,v in value.items(): + grid_params.append({key + "__" + k: v}) + + print(grid_params) + + cv = None + if hp_o_config['name'] == 'grid_search': + if 'verbose' in hp_o_config and hp_o_config['verbose']: print("Running: Grid search") + + # Create the grid + cv = GridSearchCV(pipeline, param_grid=grid_params, **hp_o_config['settings']) + + + elif hp_o_config['name'] == 'random_search': + raise Exception("Not implemented yet") + if 'verbose' in hp_o_config and hp_o_config['verbose']: print("Running: Random search") + + # Fit the grid + cv.fit(X_train, y_train) + # Print the results + print("Best score:", cv.best_score_) + print("Best parameters:", cv.best_params_) + print(cv.best_estimator_) + return cv.best_estimator_ -def construct_pipeline(config, scaler, col_transformer, decomposition, model): +def construct_pipeline(pipline_config, scaler, col_transformer, decomposition, model): pipeline = None if scaler != None and col_transformer != None and decomposition != None: - pipeline = Pipeline([('col_transformer', col_transformer), ('scaler', scaler), ('decomposition', decomposition), ('model', model)], **config['pipeline']['settings']) + pipeline = Pipeline([('col_transformer', col_transformer), ('scaler', scaler), ('decomposition', decomposition), ('model', model)], **pipline_config['settings']) elif scaler != None and col_transformer != None: - pipeline = Pipeline([('col_transformer', col_transformer), ('scaler', scaler), ('model', model)], **config['pipeline']['settings']) + pipeline = Pipeline([('col_transformer', col_transformer), ('scaler', scaler), ('model', model)], **pipline_config['settings']) elif scaler != None and decomposition != None: - pipeline = Pipeline([('scaler', scaler), ('decomposition', decomposition), ('model', model)], **config['pipeline']['settings']) + pipeline = Pipeline([('scaler', scaler), ('decomposition', decomposition), ('model', model)], **pipline_config['settings']) elif scaler != None and model != None: - pipeline = Pipeline([('scaler', scaler), ('model', model)], **config['pipeline']['settings']) + pipeline = Pipeline([('scaler', scaler), ('model', model)], **pipline_config['settings']) elif col_transformer != None and decomposition != None: - pipeline = Pipeline([('col_transformer', col_transformer), ('decomposition', decomposition), ('model', model)], **config['pipeline']['settings']) + pipeline = Pipeline([('col_transformer', col_transformer), ('decomposition', decomposition), ('model', model)], **pipline_config['settings']) elif col_transformer != None and model != None: - pipeline = Pipeline([('col_transformer', col_transformer), ('model', model)], **config['pipeline']['settings']) + pipeline = Pipeline([('col_transformer', col_transformer), ('model', model)], **pipline_config['settings']) elif decomposition != None and model != None: - pipeline = Pipeline([('decomposition', decomposition), ('model', model)], **config['pipeline']['settings']) + pipeline = Pipeline([('decomposition', decomposition), ('model', model)], **pipline_config['settings']) elif scaler != None: - pipeline = Pipeline([('scaler', scaler), ('model', model)], **config['pipeline']['settings']) + pipeline = Pipeline([('scaler', scaler), ('model', model)], **pipline_config['settings']) elif col_transformer != None: - pipeline = Pipeline([('col_transformer', col_transformer), ('model', model)], **config['pipeline']['settings']) + pipeline = Pipeline([('col_transformer', col_transformer), ('model', model)], **pipline_config['settings']) elif decomposition != None: - pipeline = Pipeline([('decomposition', decomposition), ('model', model)], **config['pipeline']['settings']) + pipeline = Pipeline([('decomposition', decomposition), ('model', model)], **pipline_config['settings']) elif model != None: - pipeline = Pipeline([('model', model)], **config['pipeline']['settings']) + pipeline = Pipeline([('model', model)], **pipline_config['settings']) else: - pipeline = Pipeline([('model', model)], **config['pipeline']['settings']) + pipeline = Pipeline([('model', model)], **pipline_config['settings']) return pipeline @@ -184,7 +217,7 @@ def construct_col_transformer(col_transformer_config): encoders = [] for encoder_config in col_transformer_config['encoders']: encoder = None - if encoder_config['name'] == 'onehot': + if encoder_config['name'] == 'onehotencoder': from sklearn.preprocessing import OneHotEncoder encoder = OneHotEncoder(**encoder_config['settings']) elif encoder_config['name'] == 'label': From 3eecce2aecad2635cccec72a5218b3945f8c0868 Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Thu, 22 Jul 2021 23:50:49 +0200 Subject: [PATCH 20/26] started work on research pipeline --- app/data_new.csv | 3 + app/external/configs/new_test.cfg | 260 ++++++++++++++++++ app/external/configs/test.cfg | 1 - app/external/csvs/8475167_results.csv | 3 - app/external/csvs/cleaned_8475167.csv | 3 - .../8475167_2021-07-08-00-00-00.csv} | 0 .../data_csvs/8478550_2021-05-03-23-00-00.csv | 3 + app/external/csvs/test_csv.csv | 3 - app/handler.py | 55 +++- app/main.py | 19 +- app/source/nhl_gen.py | 10 +- app/source/predict.py | 95 +++++++ 12 files changed, 432 insertions(+), 23 deletions(-) create mode 100644 app/data_new.csv create mode 100644 app/external/configs/new_test.cfg delete mode 100644 app/external/csvs/8475167_results.csv delete mode 100644 app/external/csvs/cleaned_8475167.csv rename app/external/csvs/{8475167.csv => data_csvs/8475167_2021-07-08-00-00-00.csv} (100%) create mode 100644 app/external/csvs/data_csvs/8478550_2021-05-03-23-00-00.csv delete mode 100644 app/external/csvs/test_csv.csv create mode 100644 app/source/predict.py diff --git a/app/data_new.csv b/app/data_new.csv new file mode 100644 index 00000000..e625d1a1 --- /dev/null +++ b/app/data_new.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d6b6d4405854d3e145e69717cfcf54d4523f0e82ae610fb04d5f36cc3c23333 +size 1206870 diff --git a/app/external/configs/new_test.cfg b/app/external/configs/new_test.cfg new file mode 100644 index 00000000..d2f04f58 --- /dev/null +++ b/app/external/configs/new_test.cfg @@ -0,0 +1,260 @@ +{ + "columns": { + "targets": [ + "U_1.5", + "O_1.5" + ], + "types": + {"time": [ + "timeOnIce_SkaterStats_1_games_back", + "evenTimeOnIce_SkaterStats_1_games_back", + "powerPlayTimeOnIce_SkaterStats_1_games_back", + "shortHandedTimeOnIce_SkaterStats_1_games_back", + + "timeOnIce_SkaterStats_2_games_back", + "evenTimeOnIce_SkaterStats_2_games_back", + "powerPlayTimeOnIce_SkaterStats_2_games_back", + "shortHandedTimeOnIce_SkaterStats_2_games_back", + + "timeOnIce_SkaterStats_3_games_back", + "evenTimeOnIce_SkaterStats_3_games_back", + "powerPlayTimeOnIce_SkaterStats_3_games_back", + "shortHandedTimeOnIce_SkaterStats_3_games_back", + + "timeOnIce_SkaterStats_4_games_back", + "evenTimeOnIce_SkaterStats_4_games_back", + "powerPlayTimeOnIce_SkaterStats_4_games_back", + "shortHandedTimeOnIce_SkaterStats_4_games_back", + + "timeOnIce_SkaterStats_5_games_back", + "evenTimeOnIce_SkaterStats_5_games_back", + "powerPlayTimeOnIce_SkaterStats_5_games_back", + "shortHandedTimeOnIce_SkaterStats_5_games_back" + ] + "hotencode" + }, + "drop": [ + "playerId_SkaterStats", + "gamePk_SkaterStats", + + "timeOnIce_SkaterStats", + "assists_SkaterStats", + "goals_SkaterStats", + "shots_SkaterStats", + "hits_SkaterStats", + "powerPlayGoals_SkaterStats", + "powerPlayAssists_SkaterStats", + "penaltyMinutes_SkaterStats", + "faceOffWins_SkaterStats", + "faceoffTaken_SkaterStats", + "takeaways_SkaterStats", + "giveaways_SkaterStats", + "shortHandedGoals_SkaterStats", + "shortHandedAssists_SkaterStats", + "blocked_SkaterStats", + "plusMinus_SkaterStats", + "evenTimeOnIce_SkaterStats", + "powerPlayTimeOnIce_SkaterStats", + "shortHandedTimeOnIce_SkaterStats", + "added_SkaterStats", + "updated_SkaterStats", + "gamePk_Game", + + + + "abstractGameState_Game", + "codedGameState_Game", + "detailedState_Game", + "statusCode_Game", + "startTimeTBD_Game", + + + "added_Game", + "updated_Game", + "gamePk_PlayerTeamStats", + "teamId_PlayerTeamStats", + "isHome_PlayerTeamStats", + "goals_PlayerTeamStats", + "pim_PlayerTeamStats", + "shots_PlayerTeamStats", + "powerPlayPercentage_PlayerTeamStats", + "powerPlayGoals_PlayerTeamStats", + "powerPlayOpportunities_PlayerTeamStats", + "faceOffWinPercentage_PlayerTeamStats", + "blocked_PlayerTeamStats", + "takeaways_PlayerTeamStats", + "giveaways_PlayerTeamStats", + "hits_PlayerTeamStats", + "goalsAgainst_PlayerTeamStats", + "pimAgainst_PlayerTeamStats", + "shotsAgainst_PlayerTeamStats", + "powerPlayPercentageAgainst_PlayerTeamStats", + "powerPlayGoalsAgainst_PlayerTeamStats", + "powerPlayOpportunitiesAgainst_PlayerTeamStats", + "faceOffWinPercentageAgainst_PlayerTeamStats", + "blockedAgainst_PlayerTeamStats", + "takeawaysAgainst_PlayerTeamStats", + "giveawaysAgainst_PlayerTeamStats", + "hitsAgainst_PlayerTeamStats", + "wins_PlayerTeamStats", + "losses_PlayerTeamStats", + "ot_PlayerTeamStats", + "leagueRecordType_PlayerTeamStats", + "score_PlayerTeamStats", + "added_PlayerTeamStats", + "updated_PlayerTeamStats", + "gamePk_OppTeamStats", + "teamId_OppTeamStats", + "isHome_OppTeamStats", + "goals_OppTeamStats", + "pim_OppTeamStats", + "shots_OppTeamStats", + "powerPlayPercentage_OppTeamStats", + "powerPlayGoals_OppTeamStats", + "powerPlayOpportunities_OppTeamStats", + "faceOffWinPercentage_OppTeamStats", + "blocked_OppTeamStats", + "takeaways_OppTeamStats", + "giveaways_OppTeamStats", + "hits_OppTeamStats", + "goalsAgainst_OppTeamStats", + "pimAgainst_OppTeamStats", + "shotsAgainst_OppTeamStats", + "powerPlayPercentageAgainst_OppTeamStats", + "powerPlayGoalsAgainst_OppTeamStats", + "powerPlayOpportunitiesAgainst_OppTeamStats", + "faceOffWinPercentageAgainst_OppTeamStats", + "blockedAgainst_OppTeamStats", + "takeawaysAgainst_OppTeamStats", + "giveawaysAgainst_OppTeamStats", + "hitsAgainst_OppTeamStats", + "wins_OppTeamStats", + "losses_OppTeamStats", + "ot_OppTeamStats", + "leagueRecordType_OppTeamStats", + "score_OppTeamStats", + "added_OppTeamStats", + "updated_OppTeamStats", + + + "added_SkaterStats_1_games_back", + "updated_SkaterStats_1_games_back", + "gamePk_Game_1_games_back", + "gameDate_Game_1_games_back", + "abstractGameState_Game_1_games_back", + "added_Game_1_games_back", + "updated_Game_1_games_back", + "added_PlayerTeamStats_1_games_back", + "updated_PlayerTeamStats_1_games_back", + "added_OppTeamStats_1_games_back", + "updated_OppTeamStats_1_games_back", + "gameType_Game_1_games_back", + "abstractGameState_Game_1_games_back", + "detailedState_Game_1_games_back", + "leagueRecordType_PlayerTeamStats_1_games_back", + "leagueRecordType_OppTeamStats_1_games_back", + "position_SkaterStats_1_games_back", + "gamePk_PlayerTeamStats_1_games_back", + "season_Game_1_games_back", + "gamePk_SkaterStats_1_games_back", + "gamePk_OppTeamStats_1_games_back", + + "added_SkaterStats_2_games_back", + "updated_SkaterStats_2_games_back", + "gamePk_Game_2_games_back", + "gameDate_Game_2_games_back", + "abstractGameState_Game_2_games_back", + "added_Game_2_games_back", + "updated_Game_2_games_back", + "added_PlayerTeamStats_2_games_back", + "updated_PlayerTeamStats_2_games_back", + "added_OppTeamStats_2_games_back", + "updated_OppTeamStats_2_games_back", + "gameType_Game_2_games_back", + "abstractGameState_Game_2_games_back", + "detailedState_Game_2_games_back", + "leagueRecordType_PlayerTeamStats_2_games_back", + "leagueRecordType_OppTeamStats_2_games_back", + "position_SkaterStats_2_games_back", + "gamePk_PlayerTeamStats_2_games_back", + "season_Game_2_games_back", + "gamePk_SkaterStats_2_games_back", + "gamePk_OppTeamStats_2_games_back", + + "added_SkaterStats_3_games_back", + "updated_SkaterStats_3_games_back", + "gamePk_Game_3_games_back", + "gameDate_Game_3_games_back", + "abstractGameState_Game_3_games_back", + "added_Game_3_games_back", + "updated_Game_3_games_back", + "added_PlayerTeamStats_3_games_back", + "updated_PlayerTeamStats_3_games_back", + "added_OppTeamStats_3_games_back", + "updated_OppTeamStats_3_games_back", + "gameType_Game_3_games_back", + "abstractGameState_Game_3_games_back", + "detailedState_Game_3_games_back", + "leagueRecordType_PlayerTeamStats_3_games_back", + "leagueRecordType_OppTeamStats_3_games_back", + "position_SkaterStats_3_games_back", + "gamePk_PlayerTeamStats_3_games_back", + "season_Game_3_games_back", + "gamePk_SkaterStats_3_games_back", + "gamePk_OppTeamStats_3_games_back", + + "added_SkaterStats_4_games_back", + "updated_SkaterStats_4_games_back", + "gamePk_Game_4_games_back", + "gameDate_Game_4_games_back", + "abstractGameState_Game_4_games_back", + "added_Game_4_games_back", + "updated_Game_4_games_back", + "added_PlayerTeamStats_4_games_back", + "updated_PlayerTeamStats_4_games_back", + "added_OppTeamStats_4_games_back", + "updated_OppTeamStats_4_games_back", + "gameType_Game_4_games_back", + "abstractGameState_Game_4_games_back", + "detailedState_Game_4_games_back", + "leagueRecordType_PlayerTeamStats_4_games_back", + "leagueRecordType_OppTeamStats_4_games_back", + "position_SkaterStats_4_games_back", + "gamePk_PlayerTeamStats_4_games_back", + "season_Game_4_games_back", + "gamePk_SkaterStats_4_games_back", + "gamePk_OppTeamStats_4_games_back", + + "added_SkaterStats_5_games_back", + "updated_SkaterStats_5_games_back", + "gamePk_Game_5_games_back", + "gameDate_Game_5_games_back", + "abstractGameState_Game_5_games_back", + "added_Game_5_games_back", + "updated_Game_5_games_back", + "added_PlayerTeamStats_5_games_back", + "updated_PlayerTeamStats_5_games_back", + "added_OppTeamStats_5_games_back", + "updated_OppTeamStats_5_games_back", + "gameType_Game_5_games_back", + "abstractGameState_Game_5_games_back", + "detailedState_Game_5_games_back", + "leagueRecordType_PlayerTeamStats_5_games_back", + "leagueRecordType_OppTeamStats_5_games_back", + "position_SkaterStats_5_games_back", + "gamePk_PlayerTeamStats_5_games_back", + "season_Game_5_games_back", + "gamePk_SkaterStats_5_games_back", + "gamePk_OppTeamStats_5_games_back", + + "O_1.5", + "O_2.5", + "O_3.5", + "O_4.5", + "U_1.5", + "U_2.5", + "U_3.5", + "U_4.5" + ] + } +} \ No newline at end of file diff --git a/app/external/configs/test.cfg b/app/external/configs/test.cfg index 351c8bc5..56243894 100644 --- a/app/external/configs/test.cfg +++ b/app/external/configs/test.cfg @@ -61,7 +61,6 @@ "position_SkaterStats", "team_SkaterStats", - "timeOnIce_SkaterStats", "timeOnIce_SkaterStats", "assists_SkaterStats", "goals_SkaterStats", diff --git a/app/external/csvs/8475167_results.csv b/app/external/csvs/8475167_results.csv deleted file mode 100644 index 4905061e..00000000 --- a/app/external/csvs/8475167_results.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3dfda5d384602be20a9e2b88a4ac45c0d7ca6a375f79bdda9b1f8a581b74dae2 -size 372447 diff --git a/app/external/csvs/cleaned_8475167.csv b/app/external/csvs/cleaned_8475167.csv deleted file mode 100644 index 648a5a2f..00000000 --- a/app/external/csvs/cleaned_8475167.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6123c0d33de1a329fa82d9af432881f49c2d5af1e0730e137e951c0ce8ef6a71 -size 2528566 diff --git a/app/external/csvs/8475167.csv b/app/external/csvs/data_csvs/8475167_2021-07-08-00-00-00.csv similarity index 100% rename from app/external/csvs/8475167.csv rename to app/external/csvs/data_csvs/8475167_2021-07-08-00-00-00.csv diff --git a/app/external/csvs/data_csvs/8478550_2021-05-03-23-00-00.csv b/app/external/csvs/data_csvs/8478550_2021-05-03-23-00-00.csv new file mode 100644 index 00000000..6db10f91 --- /dev/null +++ b/app/external/csvs/data_csvs/8478550_2021-05-03-23-00-00.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdb382106304448376bf6cef5b90ab588b653754f9ba7cf11579b3f9eb432e09 +size 1599151 diff --git a/app/external/csvs/test_csv.csv b/app/external/csvs/test_csv.csv deleted file mode 100644 index 82da356e..00000000 --- a/app/external/csvs/test_csv.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5a8f5da1cdd21ec0d83173def74dc59b078c5f342d9f9f79359aeb6cbcc8ee0 -size 15717 diff --git a/app/handler.py b/app/handler.py index 4571970b..a90d8ac2 100644 --- a/app/handler.py +++ b/app/handler.py @@ -9,6 +9,7 @@ from source.nhl_handler import * from source.nhl_gen import * from source.eval import * +from source.predict import * from tqdm import tqdm from datetime import date, datetime, timedelta import csv @@ -75,12 +76,14 @@ def update_bets_db(file = None): bet_session = Session_bets() nhl_session = Session_nhl() + oldpwd=os.getcwd() os.chdir("./external/saved_bets") if not file: for file in tqdm(glob.glob("*")): add_file_to_db(file, nhl_session, bet_session) else: add_file_to_db(file, nhl_session, bet_session) + os.chdir(oldpwd) bet_session.commit() bet_session.close() @@ -91,14 +94,60 @@ def generate_csv(player_id): global Session_nhl nhl_session = Session_nhl() - generate_data_for(player_id, nhl_session, 5, "all", f"./external/csvs/{player_id}.csv") + data, file_name = generate_data_for(player_id, nhl_session, 5, "all") nhl_session.close() + return (data, file_name) def save_csv(df, path): - df.to_csv(f"./external/csvs/{path}", sep=';', encoding='utf-8', index=False) + df.to_csv(f"./external/csvs/data_csvs/{path}", sep=';', encoding='utf-8', index=False) def evaluate_setup(config): - return run_eval_pipeline(config) \ No newline at end of file + return run_eval_pipeline(config) + + + + +# A function that check if data of player contains data for game +def get_data_from_file(player_id, game_id, date): + date = datetime.strptime(date, '%Y-%m-%d') + print(date) + # Loop through all files in folder + oldpwd=os.getcwd() + os.chdir("./external/csvs/data_csvs/") + for file in glob.glob("*"): + file_name = file.split(".")[0] + file_player_id, file_date = file_name.split("_") + file_date = datetime.strptime(file_date, '%Y-%m-%d-%H-%M-%S') + + if str(player_id) == str(file_player_id) and date <= file_date: + print("Found file: " + file) + os.chdir(oldpwd) + return pd.read_csv("./external/csvs/data_csvs/" + file, sep=';', encoding='utf-8') + + os.chdir(oldpwd) + print("No file sufficient found") + return False + + +def predict_games(games): + for game in games: + print(f"Predicting player: {game['player_id']} in game {game['game_id']}") + + # Todo: Check if game is already predicted (If not, predict else use old prediction) (maybe add some sort of id to know if its used same type of prediction config) + + # Todo: Generate data if doesn't exist + data = get_data_from_file(game['player_id'], game['game_id'], game['date']) + + # Todo: Predict game + + # Read config from file + config = None + with open(game['config']) as f: + config = json.loads(f.read()) + + pred_df = predict_game(data, config) + + # Todo: Save prediction \ No newline at end of file diff --git a/app/main.py b/app/main.py index fd050d3a..93c02aa1 100644 --- a/app/main.py +++ b/app/main.py @@ -52,11 +52,10 @@ def print_help(): print("Bets database updated") elif arg_in.lower() == 'gen': - start_time = datetime(2017, 9, 15) - end_time = datetime.now() - print("Enter player id (\"b\" for back) (EX: 8475167)") - player_id = 8475167#input(">>> > ") - generate_csv(player_id) + player_id = 8475167 + data, game_date = generate_csv(player_id) + game_date = str(game_date).replace(" ", "-").replace(":", "-") + save_csv(data, str(player_id) + "_" + str(game_date) + ".csv") elif arg_in.lower() == 'eval': @@ -67,6 +66,16 @@ def print_help(): extract_and_select_var = json.loads(f.read()) save_csv(evaluate_setup(extract_and_select_var), extract_and_select_var['save_path']) + elif arg_in.lower() == 'pred': + games = [{ + 'player_id': 8475167, + 'game_id': '201709210', + 'date': "2021-05-01", + 'config': "./external/configs/new_test.cfg" + }] + + predict_games(games) + else: print(f"\"{arg_in}\" is no command") \ No newline at end of file diff --git a/app/source/nhl_gen.py b/app/source/nhl_gen.py index 59e07041..85fe2df8 100644 --- a/app/source/nhl_gen.py +++ b/app/source/nhl_gen.py @@ -9,7 +9,7 @@ from tqdm import tqdm import csv -def generate_data_for(player_id, nhl_session, games_to_go_back, season, path=None): +def generate_data_for(player_id, nhl_session, games_to_go_back, season): PlayerTeamStats = aliased(TeamStats) OppTeamStats = aliased(TeamStats) query = ( @@ -46,10 +46,10 @@ def generate_data_for(player_id, nhl_session, games_to_go_back, season, path=Non df_total["U_3.5"] = (df_total["shots_SkaterStats"] < 3.5).astype(int) df_total["U_4.5"] = (df_total["shots_SkaterStats"] < 4.5).astype(int) - if path: - stats_csv = df_total.to_csv(path, sep=';', encoding='utf-8', index=False) - return path - return df_total + # Get date of last game in df_total + last_game_date = df_total.iloc[-1]["gameDate_Game"] + + return (df_total, last_game_date) def add_games_back(df, games_to_go_back): diff --git a/app/source/predict.py b/app/source/predict.py new file mode 100644 index 00000000..e6ee1113 --- /dev/null +++ b/app/source/predict.py @@ -0,0 +1,95 @@ +import pandas as pd + + +def predict_game(data_in, config): + for target in config['columns']['targets']: + data = data_cleanup(data_in.copy(), config) + + # Save data to csv + data.to_csv('data_new.csv', sep=";", index=False) + + + # Onehot encode categorical variables + #data2 = pd.get_dummies(data) + #print(data2.columns) + + + # Logistic regression + log_reg = create_logistic_model() + + + + # SVM + svm = create_svm_model() + + + # Naive Bayes + naive_bayes = create_naive_bayes_model() + + + + # Random forest + random_forest = create_random_forest_model() + + + # Neural network + + + + +def search_model(data, grid_params): + pass + + + +def data_cleanup(data, config): + ''' + This function cleans up the data by removing the columns that are not needed + ''' + + # Drop all columns with only Nan values + data.dropna(axis=1, how='all', inplace=True) + + # Remove columns with all same values + data.drop(data.columns[data.nunique() == 1], axis=1, inplace=True) + + # Remove rows containing NaN values + data.dropna(inplace=True) + + # Turn all times into a timedelta objects + for col in config['columns']['types']['time']: + data[col] = pd.to_timedelta(data[col]) + + # Turn timedelta objects into seconds + data[col] = data[col].dt.total_seconds().astype(int) + + # Drop all columns in config + data.drop(config['columns']['drop'], axis=1, inplace=True, errors='ignore') + + return data + + + + + + +def create_logistic_model(): + from sklearn.linear_model import LogisticRegression + model = LogisticRegression() + return model + + +def create_svm_model(): + from sklearn.svm import SVC + model = SVC() + return model + +def create_naive_bayes_model(): + from sklearn.naive_bayes import GaussianNB + model = GaussianNB() + return model + +def create_random_forest_model(): + from sklearn.ensemble import RandomForestClassifier + model = RandomForestClassifier() + return model \ No newline at end of file From 6beb1c3019ac589b6173c463f19eb1835a421e59 Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Fri, 23 Jul 2021 00:59:00 +0200 Subject: [PATCH 21/26] Good progress --- app/data_new.csv | 3 - app/external/configs/new_test.cfg | 47 ++++++++------- app/handler.py | 1 - app/source/predict.py | 95 ++++++++++++++++++------------- 4 files changed, 81 insertions(+), 65 deletions(-) delete mode 100644 app/data_new.csv diff --git a/app/data_new.csv b/app/data_new.csv deleted file mode 100644 index e625d1a1..00000000 --- a/app/data_new.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d6b6d4405854d3e145e69717cfcf54d4523f0e82ae610fb04d5f36cc3c23333 -size 1206870 diff --git a/app/external/configs/new_test.cfg b/app/external/configs/new_test.cfg index d2f04f58..284c77a6 100644 --- a/app/external/configs/new_test.cfg +++ b/app/external/configs/new_test.cfg @@ -1,9 +1,21 @@ { "columns": { - "targets": [ - "U_1.5", - "O_1.5" - ], + "targets": {"active":[ + "U_1.5", + "U_2.5", + "U_3.5", + "U_4.5" + ], + "all":[ + "O_1.5", + "O_2.5", + "O_3.5", + "O_4.5", + "U_1.5", + "U_2.5", + "U_3.5", + "U_4.5" + ]}, "types": {"time": [ "timeOnIce_SkaterStats_1_games_back", @@ -30,8 +42,17 @@ "evenTimeOnIce_SkaterStats_5_games_back", "powerPlayTimeOnIce_SkaterStats_5_games_back", "shortHandedTimeOnIce_SkaterStats_5_games_back" + ], + "date": ["gameDate_Game", + "gameDate_Game_1_games_back", + "gameDate_Game_2_games_back", + "gameDate_Game_3_games_back", + "gameDate_Game_4_games_back", + "gameDate_Game_5_games_back" + ], + "categorical" : [ + "gameType_Game" ] - "hotencode" }, "drop": [ "playerId_SkaterStats", @@ -140,7 +161,6 @@ "added_SkaterStats_1_games_back", "updated_SkaterStats_1_games_back", "gamePk_Game_1_games_back", - "gameDate_Game_1_games_back", "abstractGameState_Game_1_games_back", "added_Game_1_games_back", "updated_Game_1_games_back", @@ -162,7 +182,6 @@ "added_SkaterStats_2_games_back", "updated_SkaterStats_2_games_back", "gamePk_Game_2_games_back", - "gameDate_Game_2_games_back", "abstractGameState_Game_2_games_back", "added_Game_2_games_back", "updated_Game_2_games_back", @@ -184,7 +203,6 @@ "added_SkaterStats_3_games_back", "updated_SkaterStats_3_games_back", "gamePk_Game_3_games_back", - "gameDate_Game_3_games_back", "abstractGameState_Game_3_games_back", "added_Game_3_games_back", "updated_Game_3_games_back", @@ -206,7 +224,6 @@ "added_SkaterStats_4_games_back", "updated_SkaterStats_4_games_back", "gamePk_Game_4_games_back", - "gameDate_Game_4_games_back", "abstractGameState_Game_4_games_back", "added_Game_4_games_back", "updated_Game_4_games_back", @@ -228,7 +245,6 @@ "added_SkaterStats_5_games_back", "updated_SkaterStats_5_games_back", "gamePk_Game_5_games_back", - "gameDate_Game_5_games_back", "abstractGameState_Game_5_games_back", "added_Game_5_games_back", "updated_Game_5_games_back", @@ -245,16 +261,7 @@ "gamePk_PlayerTeamStats_5_games_back", "season_Game_5_games_back", "gamePk_SkaterStats_5_games_back", - "gamePk_OppTeamStats_5_games_back", - - "O_1.5", - "O_2.5", - "O_3.5", - "O_4.5", - "U_1.5", - "U_2.5", - "U_3.5", - "U_4.5" + "gamePk_OppTeamStats_5_games_back" ] } } \ No newline at end of file diff --git a/app/handler.py b/app/handler.py index a90d8ac2..2adaa6f6 100644 --- a/app/handler.py +++ b/app/handler.py @@ -123,7 +123,6 @@ def get_data_from_file(player_id, game_id, date): file_date = datetime.strptime(file_date, '%Y-%m-%d-%H-%M-%S') if str(player_id) == str(file_player_id) and date <= file_date: - print("Found file: " + file) os.chdir(oldpwd) return pd.read_csv("./external/csvs/data_csvs/" + file, sep=';', encoding='utf-8') diff --git a/app/source/predict.py b/app/source/predict.py index e6ee1113..87d0bf1d 100644 --- a/app/source/predict.py +++ b/app/source/predict.py @@ -1,40 +1,69 @@ +from sklearn.pipeline import Pipeline +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import StandardScaler +from sklearn.preprocessing import OneHotEncoder +from sklearn.linear_model import LogisticRegression +import sklearn.svm as svm +from sklearn.metrics import classification_report +from sklearn.compose import ColumnTransformer +from sklearn.model_selection import cross_val_score +from sklearn.metrics import accuracy_score +from sklearn.naive_bayes import GaussianNB +from sklearn.ensemble import RandomForestClassifier import pandas as pd +def predict_game(org_data, config): + for target in config['columns']['targets']['active']: + data = data_cleanup(org_data.copy(), config) -def predict_game(data_in, config): - for target in config['columns']['targets']: - data = data_cleanup(data_in.copy(), config) + # Split data into train and test using sci-kit learn + X_train, X_test, y_train, y_test = train_test_split(data.drop(config['columns']['targets']['all'], axis=1), data[target], test_size=0.2, random_state=42) - # Save data to csv - data.to_csv('data_new.csv', sep=";", index=False) - - - # Onehot encode categorical variables - #data2 = pd.get_dummies(data) - #print(data2.columns) + # Create column transformer + col_transformer = ColumnTransformer([ + ('one_hot_encoder', OneHotEncoder(), config['columns']['types']['categorical']) + ]) # Logistic regression - log_reg = create_logistic_model() - - + run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, LogisticRegression(), 'Logistic Regression') # SVM - svm = create_svm_model() + run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, svm.SVC(), 'SVM') # Naive Bayes - naive_bayes = create_naive_bayes_model() - + run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, GaussianNB(), 'Naive Bayes') # Random forest - random_forest = create_random_forest_model() + run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, RandomForestClassifier(), 'Random Forest') # Neural network + print("---") + + +def run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, model, name): + # Create pipeline with column transformer, standard scaler, and logistic regression + pipeline = Pipeline([ + ('col_transformer', col_transformer), + ('standard_scaler', StandardScaler()), + ('classifier', model) + ]) + + # Cross validate pipeline + scores = cross_val_score(pipeline, X_train, y_train, cv=5, scoring='accuracy', n_jobs=-1, verbose=1) + print(f'\nCrossvaledating {target} using {name}') + print(f'target: {target}') + print(f'Accuracy: {scores.mean()}') + print(f'Std: {scores.std()}') + # Run the pipeline on test data + pipeline.fit(X_train, y_train) + y_pred = pipeline.predict(X_test) + print(f'Accuracy on test data: {accuracy_score(y_test, y_pred)}') def search_model(data, grid_params): @@ -66,30 +95,14 @@ def data_cleanup(data, config): # Drop all columns in config data.drop(config['columns']['drop'], axis=1, inplace=True, errors='ignore') - return data + # Get first date in first row as datetime object + first_date = pd.to_datetime(data.iloc[0]['gameDate_Game']) + for col in config['columns']['types']['date']: + # Create new column with date difference + data[col] = data[col].apply(lambda x: pd.to_datetime(x) - first_date) + # Change col column from datetime object to total seconds + data[col] = data[col].dt.total_seconds().astype(int) - - - -def create_logistic_model(): - from sklearn.linear_model import LogisticRegression - model = LogisticRegression() - return model - - -def create_svm_model(): - from sklearn.svm import SVC - model = SVC() - return model - -def create_naive_bayes_model(): - from sklearn.naive_bayes import GaussianNB - model = GaussianNB() - return model - -def create_random_forest_model(): - from sklearn.ensemble import RandomForestClassifier - model = RandomForestClassifier() - return model \ No newline at end of file + return data \ No newline at end of file From 7bb02d79929d7ab0e6fb2585896c82c1258d5b68 Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Fri, 23 Jul 2021 13:47:40 +0200 Subject: [PATCH 22/26] Tests with different classifiers has begun --- app/external/configs/new_test.cfg | 5 +- .../data_csvs/8478550_2021-05-03-23-00-00.csv | 3 - app/source/eval.py | 1 - app/source/predict.py | 122 ++++++++++++++---- 4 files changed, 98 insertions(+), 33 deletions(-) delete mode 100644 app/external/csvs/data_csvs/8478550_2021-05-03-23-00-00.csv diff --git a/app/external/configs/new_test.cfg b/app/external/configs/new_test.cfg index 284c77a6..91ff551a 100644 --- a/app/external/configs/new_test.cfg +++ b/app/external/configs/new_test.cfg @@ -1,10 +1,7 @@ { "columns": { "targets": {"active":[ - "U_1.5", - "U_2.5", - "U_3.5", - "U_4.5" + "U_2.5" ], "all":[ "O_1.5", diff --git a/app/external/csvs/data_csvs/8478550_2021-05-03-23-00-00.csv b/app/external/csvs/data_csvs/8478550_2021-05-03-23-00-00.csv deleted file mode 100644 index 6db10f91..00000000 --- a/app/external/csvs/data_csvs/8478550_2021-05-03-23-00-00.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fdb382106304448376bf6cef5b90ab588b653754f9ba7cf11579b3f9eb432e09 -size 1599151 diff --git a/app/source/eval.py b/app/source/eval.py index 6e44430b..417fde11 100644 --- a/app/source/eval.py +++ b/app/source/eval.py @@ -120,7 +120,6 @@ def run_eval_pipeline(config): def hyperparameter_optimization(hp_o_config, pipeline, X_train, y_train): from sklearn.model_selection import GridSearchCV - from sklearn.model_selection import RandomizedSearchCV grid_params = [] for key, value in hp_o_config['params'].items(): diff --git a/app/source/predict.py b/app/source/predict.py index 87d0bf1d..69f7544d 100644 --- a/app/source/predict.py +++ b/app/source/predict.py @@ -3,13 +3,18 @@ from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import OneHotEncoder from sklearn.linear_model import LogisticRegression -import sklearn.svm as svm +from sklearn.svm import SVC from sklearn.metrics import classification_report from sklearn.compose import ColumnTransformer from sklearn.model_selection import cross_val_score from sklearn.metrics import accuracy_score from sklearn.naive_bayes import GaussianNB from sklearn.ensemble import RandomForestClassifier +from sklearn.decomposition import PCA +from sklearn.ensemble import StackingClassifier +from sklearn.model_selection import GridSearchCV + +import numpy as np import pandas as pd def predict_game(org_data, config): @@ -22,22 +27,74 @@ def predict_game(org_data, config): # Create column transformer col_transformer = ColumnTransformer([ ('one_hot_encoder', OneHotEncoder(), config['columns']['types']['categorical']) - ]) - + ], + remainder='passthrough', + n_jobs=-1 + ) # Logistic regression - run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, LogisticRegression(), 'Logistic Regression') + grid_params = None#\ + # { + # 'pca__n_components': [10, 50, 100, 200], + # 'classifier__penalty': ['l1', 'l2'], + # 'classifier__solver': ['liblinear'], + # 'classifier__C': [0.001, 0.01, 0.1, 1, 10], + # } + log_reg_pipeline = run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, LogisticRegression(C=0.1, penalty='l1', solver='liblinear'), grid_params) # SVM - run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, svm.SVC(), 'SVM') + grid_params = None#\ + # { + # 'pca__n_components': [7, 8, 9, 10, 11, 12, 13], + # 'classifier__C': [0.001, 0.01, 0.1, 1, 10], + # 'classifier__kernel': ['rbf'], + # 'classifier__gamma': [0.001, 0.01, 0.1, 1, 10] + # } + svm_pipeline = run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, SVC(C=1, gamma=0.01), grid_params) # Naive Bayes - run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, GaussianNB(), 'Naive Bayes') + grid_params = None#\ + # { + # 'pca__n_components': [10, 50, 100, 200], + # 'classifier__var_smoothing': np.logspace(0,-9, num=10) + # } + bayes_pipeline = run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, GaussianNB(var_smoothing=0.3511191734215131), grid_params) # Random forest - run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, RandomForestClassifier(), 'Random Forest') + grid_params = None#\ + # { + # 'pca__n_components': [10], + # 'classifier__n_estimators': [10, 50, 100, 200], + # 'classifier__max_features': ['auto', 'sqrt', 'log2'], + # 'classifier__min_samples_split': [2, 4, 8, 9, 10], + # 'classifier__n_jobs': [-1], + # } + forest_pipeline = run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, RandomForestClassifier(max_depth=None, max_features='auto', min_samples_split=4, n_estimators=200), grid_params) + + + # Stacking + estimators = [ + ('log_reg', log_reg_pipeline), + ('svm', svm_pipeline), + ('bayes', bayes_pipeline), + ('forest', forest_pipeline) + ] + + clf = StackingClassifier( + estimators=estimators, + final_estimator=LogisticRegression(), + cv=5, + verbose=1, + n_jobs=-1 + ) + + clf.fit(X_train, y_train) + y_pred = clf.predict(X_test) + print(f"Stacking report: {classification_report(y_test, y_pred)}") + print(f"Stacking acc: {accuracy_score(y_test, y_pred)}") + print(f"{y_train.value_counts(normalize=True)}") # Neural network @@ -45,29 +102,41 @@ def predict_game(org_data, config): print("---") -def run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, model, name): +def run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, model, grid_params=None): # Create pipeline with column transformer, standard scaler, and logistic regression - pipeline = Pipeline([ + pipeline = Pipeline(steps=[ ('col_transformer', col_transformer), ('standard_scaler', StandardScaler()), + ('pca', PCA(n_components=10)), ('classifier', model) ]) - - # Cross validate pipeline - scores = cross_val_score(pipeline, X_train, y_train, cv=5, scoring='accuracy', n_jobs=-1, verbose=1) - print(f'\nCrossvaledating {target} using {name}') - print(f'target: {target}') - print(f'Accuracy: {scores.mean()}') - print(f'Std: {scores.std()}') - - # Run the pipeline on test data - pipeline.fit(X_train, y_train) - y_pred = pipeline.predict(X_test) - print(f'Accuracy on test data: {accuracy_score(y_test, y_pred)}') - - -def search_model(data, grid_params): - pass + print("\n") + + # Create grid search object + if grid_params: + grid_search = GridSearchCV(pipeline, grid_params, cv=5, n_jobs=-1) + grid_search.fit(X_train, y_train) + print("Best score:", grid_search.best_score_) + print("Best params:", grid_search.best_params_) + print("Best estimator:", grid_search.best_estimator_) + + # fit best model to train data + y_pred = grid_search.predict(X_test) + print(f"Accuracy on test data: {accuracy_score(y_test, y_pred):.2%}") + + else: + # Cross validate pipeline + scores = cross_val_score(pipeline, X_train, y_train, cv=5, scoring='accuracy', n_jobs=-1, verbose=0) + print(f'Crossvaledating {target} using {str(model)}') + print(f'Accuracy: {scores.mean():.2%}') + print(f'Std: {scores.std()}') + + # Run the pipeline on test data + pipeline.fit(X_train, y_train) + y_pred = pipeline.predict(X_test) + print(f'Accuracy on test data: {accuracy_score(y_test, y_pred):.2%}') + + return pipeline @@ -76,6 +145,9 @@ def data_cleanup(data, config): This function cleans up the data by removing the columns that are not needed ''' + # Remove data before season "2015" + data = data[data['season_Game'] >= 2019] + # Drop all columns with only Nan values data.dropna(axis=1, how='all', inplace=True) From 7302cc9114bb3890dcf9011d5544a3325e422b45 Mon Sep 17 00:00:00 2001 From: rasmusrynell Date: Fri, 23 Jul 2021 18:26:49 +0200 Subject: [PATCH 23/26] Added ROC AUC score --- app/source/predict.py | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/app/source/predict.py b/app/source/predict.py index 69f7544d..3dc5ae92 100644 --- a/app/source/predict.py +++ b/app/source/predict.py @@ -13,6 +13,7 @@ from sklearn.decomposition import PCA from sklearn.ensemble import StackingClassifier from sklearn.model_selection import GridSearchCV +from sklearn.metrics import roc_auc_score import numpy as np import pandas as pd @@ -50,7 +51,7 @@ def predict_game(org_data, config): # 'classifier__kernel': ['rbf'], # 'classifier__gamma': [0.001, 0.01, 0.1, 1, 10] # } - svm_pipeline = run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, SVC(C=1, gamma=0.01), grid_params) + svm_pipeline = run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, SVC(C=1, gamma=0.01,probability=True), grid_params) # Naive Bayes @@ -82,19 +83,25 @@ def predict_game(org_data, config): ('forest', forest_pipeline) ] + # Create meta-pipeline clf = StackingClassifier( estimators=estimators, final_estimator=LogisticRegression(), cv=5, verbose=1, - n_jobs=-1 + n_jobs=-1, + stack_method='predict_proba' ) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) - print(f"Stacking report: {classification_report(y_test, y_pred)}") + print(f"\n\nStacking report: ") + print("{classification_report(y_test, y_pred)}") print(f"Stacking acc: {accuracy_score(y_test, y_pred)}") print(f"{y_train.value_counts(normalize=True)}") + + # Print ROC AUC + print(f"ROC AUC: {roc_auc_score(y_test, y_pred)}") # Neural network @@ -108,7 +115,7 @@ def run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, mode ('col_transformer', col_transformer), ('standard_scaler', StandardScaler()), ('pca', PCA(n_components=10)), - ('classifier', model) + ('classifier', model), ]) print("\n") @@ -116,6 +123,10 @@ def run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, mode if grid_params: grid_search = GridSearchCV(pipeline, grid_params, cv=5, n_jobs=-1) grid_search.fit(X_train, y_train) + + # Print ROC AUC score + print(f"ROC AUC: {roc_auc_score(y_test, grid_search.predict_proba(X_test)[:, 1])}") + print("Best score:", grid_search.best_score_) print("Best params:", grid_search.best_params_) print("Best estimator:", grid_search.best_estimator_) @@ -126,7 +137,8 @@ def run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, mode else: # Cross validate pipeline - scores = cross_val_score(pipeline, X_train, y_train, cv=5, scoring='accuracy', n_jobs=-1, verbose=0) + scores = cross_val_score( + pipeline, X_train, y_train, cv=5, scoring='roc_auc', n_jobs=-1, verbose=0) print(f'Crossvaledating {target} using {str(model)}') print(f'Accuracy: {scores.mean():.2%}') print(f'Std: {scores.std()}') @@ -136,6 +148,9 @@ def run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, mode y_pred = pipeline.predict(X_test) print(f'Accuracy on test data: {accuracy_score(y_test, y_pred):.2%}') + # Print ROC AUC score + print(f"ROC AUC: {roc_auc_score(y_test, pipeline.predict_proba(X_test)[:, 1])}") + return pipeline @@ -177,4 +192,4 @@ def data_cleanup(data, config): # Change col column from datetime object to total seconds data[col] = data[col].dt.total_seconds().astype(int) - return data \ No newline at end of file + return data From bc209689368e89875f31655b9e40d063ca08351f Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Sat, 24 Jul 2021 23:26:36 +0200 Subject: [PATCH 24/26] done testing models --- .../configs/{new_test.cfg => default.cfg} | 23 +- .../data_csvs/8471214_2021-05-23-23-00-00.csv | 3 + .../data_csvs/8475744_2021-05-23-23-00-00.csv | 3 + .../data_csvs/8476881_2021-05-13-01-00-00.csv | 3 + .../data_csvs/8477492_2021-06-11-01-00-00.csv | 3 + .../data_csvs/8477499_2021-05-08-19-00-00.csv | 3 + .../data_csvs/8477504_2021-06-08-00-00-00.csv | 3 + .../data_csvs/8478463_2021-06-26-00-00-00.csv | 3 + app/external/databases/testing.db | 2 +- app/external/model_configs/8471214_3.5.cfg | 239 ++++++++++ app/external/model_configs/8471214_4.5.cfg | 239 ++++++++++ app/external/model_configs/8475167_2.5.cfg | 239 ++++++++++ app/external/model_configs/8476881_2.5.cfg | 239 ++++++++++ app/external/model_configs/8477499_1.5.cfg | 239 ++++++++++ app/external/model_configs/8477504_1.5.cfg | 239 ++++++++++ app/external/model_configs/8478463_2.5.cfg | 239 ++++++++++ app/external/predictions/test.json | 1 + app/handler.py | 34 +- app/main.py | 90 +++- app/source/predict.py | 439 +++++++++++++----- 20 files changed, 2132 insertions(+), 151 deletions(-) rename app/external/configs/{new_test.cfg => default.cfg} (95%) create mode 100644 app/external/csvs/data_csvs/8471214_2021-05-23-23-00-00.csv create mode 100644 app/external/csvs/data_csvs/8475744_2021-05-23-23-00-00.csv create mode 100644 app/external/csvs/data_csvs/8476881_2021-05-13-01-00-00.csv create mode 100644 app/external/csvs/data_csvs/8477492_2021-06-11-01-00-00.csv create mode 100644 app/external/csvs/data_csvs/8477499_2021-05-08-19-00-00.csv create mode 100644 app/external/csvs/data_csvs/8477504_2021-06-08-00-00-00.csv create mode 100644 app/external/csvs/data_csvs/8478463_2021-06-26-00-00-00.csv create mode 100644 app/external/model_configs/8471214_3.5.cfg create mode 100644 app/external/model_configs/8471214_4.5.cfg create mode 100644 app/external/model_configs/8475167_2.5.cfg create mode 100644 app/external/model_configs/8476881_2.5.cfg create mode 100644 app/external/model_configs/8477499_1.5.cfg create mode 100644 app/external/model_configs/8477504_1.5.cfg create mode 100644 app/external/model_configs/8478463_2.5.cfg create mode 100644 app/external/predictions/test.json diff --git a/app/external/configs/new_test.cfg b/app/external/configs/default.cfg similarity index 95% rename from app/external/configs/new_test.cfg rename to app/external/configs/default.cfg index 91ff551a..dce441f4 100644 --- a/app/external/configs/new_test.cfg +++ b/app/external/configs/default.cfg @@ -1,7 +1,14 @@ { "columns": { "targets": {"active":[ - "U_2.5" + "O_1.5", + "O_2.5", + "O_3.5", + "O_4.5", + "U_1.5", + "U_2.5", + "U_3.5", + "U_4.5" ], "all":[ "O_1.5", @@ -40,21 +47,23 @@ "powerPlayTimeOnIce_SkaterStats_5_games_back", "shortHandedTimeOnIce_SkaterStats_5_games_back" ], - "date": ["gameDate_Game", + "date": [ + "gameDate_Game", "gameDate_Game_1_games_back", "gameDate_Game_2_games_back", "gameDate_Game_3_games_back", "gameDate_Game_4_games_back", "gameDate_Game_5_games_back" - ], + ], "categorical" : [ - "gameType_Game" - ] + "gameType_Game", + "position_SkaterStats" + ], + "identifier" : ["gamePk_SkaterStats"] }, "drop": [ "playerId_SkaterStats", - "gamePk_SkaterStats", - + "timeOnIce_SkaterStats", "assists_SkaterStats", "goals_SkaterStats", diff --git a/app/external/csvs/data_csvs/8471214_2021-05-23-23-00-00.csv b/app/external/csvs/data_csvs/8471214_2021-05-23-23-00-00.csv new file mode 100644 index 00000000..d764d04c --- /dev/null +++ b/app/external/csvs/data_csvs/8471214_2021-05-23-23-00-00.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a5e0deb61547ffe6a7165f588e24ceb38a5b1a880941cc704f036f816f0b8cf +size 3150377 diff --git a/app/external/csvs/data_csvs/8475744_2021-05-23-23-00-00.csv b/app/external/csvs/data_csvs/8475744_2021-05-23-23-00-00.csv new file mode 100644 index 00000000..83202346 --- /dev/null +++ b/app/external/csvs/data_csvs/8475744_2021-05-23-23-00-00.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50717e776b787d96615d0da76cbdee4fb99a8f5d4a34b95817369071140bc685 +size 2076182 diff --git a/app/external/csvs/data_csvs/8476881_2021-05-13-01-00-00.csv b/app/external/csvs/data_csvs/8476881_2021-05-13-01-00-00.csv new file mode 100644 index 00000000..1ab364d6 --- /dev/null +++ b/app/external/csvs/data_csvs/8476881_2021-05-13-01-00-00.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8a1c269ab67ac5373a69afb51d5b6f01cbf6602140104295daf689fff66cdbd +size 1951294 diff --git a/app/external/csvs/data_csvs/8477492_2021-06-11-01-00-00.csv b/app/external/csvs/data_csvs/8477492_2021-06-11-01-00-00.csv new file mode 100644 index 00000000..b2574af6 --- /dev/null +++ b/app/external/csvs/data_csvs/8477492_2021-06-11-01-00-00.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b14f59e985b4ec361522b0b6a9c84ac39e21fc41fdcfc235fef79e701b3979d +size 2152449 diff --git a/app/external/csvs/data_csvs/8477499_2021-05-08-19-00-00.csv b/app/external/csvs/data_csvs/8477499_2021-05-08-19-00-00.csv new file mode 100644 index 00000000..829937c3 --- /dev/null +++ b/app/external/csvs/data_csvs/8477499_2021-05-08-19-00-00.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d2000cf97f1243f9f36c3f8ae710a45308a18eac07c4f1b0ef8b4b927c1e44c +size 1861938 diff --git a/app/external/csvs/data_csvs/8477504_2021-06-08-00-00-00.csv b/app/external/csvs/data_csvs/8477504_2021-06-08-00-00-00.csv new file mode 100644 index 00000000..67aaaed2 --- /dev/null +++ b/app/external/csvs/data_csvs/8477504_2021-06-08-00-00-00.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6cbb60c7a8c7705f78c6cea650fd0a35034fecf82a38310695061bb4bf9f0f02 +size 1310939 diff --git a/app/external/csvs/data_csvs/8478463_2021-06-26-00-00-00.csv b/app/external/csvs/data_csvs/8478463_2021-06-26-00-00-00.csv new file mode 100644 index 00000000..dc3cca8f --- /dev/null +++ b/app/external/csvs/data_csvs/8478463_2021-06-26-00-00-00.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b95583b65a81870259f549ac12390330f00729b6b456d9b1edbc962203def1c5 +size 1319741 diff --git a/app/external/databases/testing.db b/app/external/databases/testing.db index d427f28c..88242dc4 100644 --- a/app/external/databases/testing.db +++ b/app/external/databases/testing.db @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:185f76a2cf14e3c78a5e686119b80e63a63dad9d71e3cb9102392543966dd68f +oid sha256:6d89f17d1fb7747d82f36078c054303aa0d7025edb06a2c53b850a28e1ff6015 size 83644416 diff --git a/app/external/model_configs/8471214_3.5.cfg b/app/external/model_configs/8471214_3.5.cfg new file mode 100644 index 00000000..03b18bc0 --- /dev/null +++ b/app/external/model_configs/8471214_3.5.cfg @@ -0,0 +1,239 @@ +{ + "LogisticRegression": { + "train_best_score": 0.567945109909823, + "train_best_params": { + "C": 1, + "class_weight": "balanced", + "dual": false, + "fit_intercept": true, + "intercept_scaling": 1, + "l1_ratio": null, + "max_iter": 100, + "multi_class": "auto", + "n_jobs": null, + "penalty": "l1", + "random_state": null, + "solver": "liblinear", + "tol": 0.01, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.4748633879781421, + "test_classification_report": { + "0": { + "precision": 0.39285714285714285, + "recall": 0.5409836065573771, + "f1-score": 0.4551724137931034, + "support": 61 + }, + "1": { + "precision": 0.582089552238806, + "recall": 0.43333333333333335, + "f1-score": 0.4968152866242039, + "support": 90 + }, + "accuracy": 0.4768211920529801, + "macro avg": { + "precision": 0.48747334754797444, + "recall": 0.4871584699453552, + "f1-score": 0.47599385020865365, + "support": 151 + }, + "weighted avg": { + "precision": 0.5056446716276705, + "recall": 0.4768211920529801, + "f1-score": 0.4799926691228984, + "support": 151 + } + } + }, + "SVC": { + "train_best_score": 0.5738738618064151, + "train_best_params": { + "C": 1, + "break_ties": false, + "cache_size": 200, + "class_weight": "balanced", + "coef0": 0.0, + "decision_function_shape": "ovr", + "degree": 3, + "gamma": "scale", + "kernel": "sigmoid", + "max_iter": -1, + "probability": true, + "random_state": null, + "shrinking": true, + "tol": 0.001, + "verbose": false + }, + "test_ROC_AUC": 0.5258652094717668, + "test_classification_report": { + "0": { + "precision": 0.425, + "recall": 0.5573770491803278, + "f1-score": 0.4822695035460992, + "support": 61 + }, + "1": { + "precision": 0.6197183098591549, + "recall": 0.4888888888888889, + "f1-score": 0.5465838509316769, + "support": 90 + }, + "accuracy": 0.5165562913907285, + "macro avg": { + "precision": 0.5223591549295774, + "recall": 0.5231329690346084, + "f1-score": 0.5144266772388881, + "support": 151 + }, + "weighted avg": { + "precision": 0.5410572707769797, + "recall": 0.5165562913907285, + "f1-score": 0.520602558279225, + "support": 151 + } + } + }, + "GaussianNB": { + "train_best_score": 0.5791921684974728, + "train_best_params": { + "priors": null, + "var_smoothing": 0.0001 + }, + "test_ROC_AUC": 0.46921675774134797, + "test_classification_report": { + "0": { + "precision": 0.125, + "recall": 0.01639344262295082, + "f1-score": 0.028985507246376815, + "support": 61 + }, + "1": { + "precision": 0.5804195804195804, + "recall": 0.9222222222222223, + "f1-score": 0.7124463519313305, + "support": 90 + }, + "accuracy": 0.5562913907284768, + "macro avg": { + "precision": 0.3527097902097902, + "recall": 0.46930783242258656, + "f1-score": 0.3707159295888537, + "support": 151 + }, + "weighted avg": { + "precision": 0.3964421340249155, + "recall": 0.5562913907284768, + "f1-score": 0.4363462756016473, + "support": 151 + } + } + }, + "SGDClassifier": { + "train_best_score": 0.5611108696522293, + "train_best_params": { + "alpha": 0.001, + "average": false, + "class_weight": null, + "early_stopping": false, + "epsilon": 0.1, + "eta0": 0.0, + "fit_intercept": true, + "l1_ratio": 0.2, + "learning_rate": "optimal", + "loss": "modified_huber", + "max_iter": 1000, + "n_iter_no_change": 5, + "n_jobs": -1, + "penalty": "elasticnet", + "power_t": 0.5, + "random_state": null, + "shuffle": true, + "tol": 0.001, + "validation_fraction": 0.1, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.5074681238615665, + "test_classification_report": { + "0": { + "precision": 0.4, + "recall": 0.45901639344262296, + "f1-score": 0.4274809160305344, + "support": 61 + }, + "1": { + "precision": 0.5925925925925926, + "recall": 0.5333333333333333, + "f1-score": 0.5614035087719299, + "support": 90 + }, + "accuracy": 0.5033112582781457, + "macro avg": { + "precision": 0.4962962962962963, + "recall": 0.4961748633879781, + "f1-score": 0.49444221240123215, + "support": 151 + }, + "weighted avg": { + "precision": 0.5147902869757175, + "recall": 0.5033112582781457, + "f1-score": 0.5073023289227568, + "support": 151 + } + } + }, + "RandomForestClassifier": { + "train_best_score": 0.5793796520718046, + "train_best_params": { + "bootstrap": true, + "ccp_alpha": 0.0, + "class_weight": "balanced", + "criterion": "gini", + "max_depth": 5, + "max_features": "auto", + "max_leaf_nodes": null, + "max_samples": null, + "min_impurity_decrease": 0.0, + "min_impurity_split": null, + "min_samples_leaf": 1, + "min_samples_split": 4, + "min_weight_fraction_leaf": 0.0, + "n_estimators": 20, + "n_jobs": -1, + "oob_score": false, + "random_state": null, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.44699453551912566, + "test_classification_report": { + "0": { + "precision": 0.30612244897959184, + "recall": 0.2459016393442623, + "f1-score": 0.27272727272727276, + "support": 61 + }, + "1": { + "precision": 0.5490196078431373, + "recall": 0.6222222222222222, + "f1-score": 0.5833333333333334, + "support": 90 + }, + "accuracy": 0.47019867549668876, + "macro avg": { + "precision": 0.4275710284113646, + "recall": 0.4340619307832423, + "f1-score": 0.4280303030303031, + "support": 151 + }, + "weighted avg": { + "precision": 0.4508955900240891, + "recall": 0.47019867549668876, + "f1-score": 0.45785671282360024, + "support": 151 + } + } + } +} \ No newline at end of file diff --git a/app/external/model_configs/8471214_4.5.cfg b/app/external/model_configs/8471214_4.5.cfg new file mode 100644 index 00000000..a12868b4 --- /dev/null +++ b/app/external/model_configs/8471214_4.5.cfg @@ -0,0 +1,239 @@ +{ + "LogisticRegression": { + "train_best_score": 0.5500706731689501, + "train_best_params": { + "C": 0.1, + "class_weight": null, + "dual": false, + "fit_intercept": true, + "intercept_scaling": 1, + "l1_ratio": null, + "max_iter": 100, + "multi_class": "auto", + "n_jobs": null, + "penalty": "l1", + "random_state": null, + "solver": "liblinear", + "tol": 0.01, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.4819672131147541, + "test_classification_report": { + "0": { + "precision": 0.5894736842105263, + "recall": 0.6222222222222222, + "f1-score": 0.6054054054054053, + "support": 90 + }, + "1": { + "precision": 0.39285714285714285, + "recall": 0.36065573770491804, + "f1-score": 0.37606837606837606, + "support": 61 + }, + "accuracy": 0.5165562913907285, + "macro avg": { + "precision": 0.4911654135338346, + "recall": 0.4914389799635701, + "f1-score": 0.4907368907368907, + "support": 151 + }, + "weighted avg": { + "precision": 0.5100458098889608, + "recall": 0.5165562913907285, + "f1-score": 0.5127593207063404, + "support": 151 + } + } + }, + "SVC": { + "train_best_score": 0.5572473212263084, + "train_best_params": { + "C": 1, + "break_ties": false, + "cache_size": 200, + "class_weight": "balanced", + "coef0": 0.0, + "decision_function_shape": "ovr", + "degree": 3, + "gamma": "scale", + "kernel": "poly", + "max_iter": -1, + "probability": true, + "random_state": null, + "shrinking": true, + "tol": 0.001, + "verbose": false + }, + "test_ROC_AUC": 0.5123861566484517, + "test_classification_report": { + "0": { + "precision": 0.6071428571428571, + "recall": 0.5666666666666667, + "f1-score": 0.5862068965517241, + "support": 90 + }, + "1": { + "precision": 0.417910447761194, + "recall": 0.45901639344262296, + "f1-score": 0.4375, + "support": 61 + }, + "accuracy": 0.5231788079470199, + "macro avg": { + "precision": 0.5125266524520256, + "recall": 0.5128415300546448, + "f1-score": 0.5118534482758621, + "support": 151 + }, + "weighted avg": { + "precision": 0.5306979765317217, + "recall": 0.5231788079470199, + "f1-score": 0.5261332496003653, + "support": 151 + } + } + }, + "GaussianNB": { + "train_best_score": 0.5628785923697082, + "train_best_params": { + "priors": null, + "var_smoothing": 0.0001 + }, + "test_ROC_AUC": 0.45956284153005467, + "test_classification_report": { + "0": { + "precision": 0.5851063829787234, + "recall": 0.6111111111111112, + "f1-score": 0.5978260869565217, + "support": 90 + }, + "1": { + "precision": 0.38596491228070173, + "recall": 0.36065573770491804, + "f1-score": 0.37288135593220334, + "support": 61 + }, + "accuracy": 0.5099337748344371, + "macro avg": { + "precision": 0.4855356476297126, + "recall": 0.4858834244080146, + "f1-score": 0.4853537214443625, + "support": 151 + }, + "weighted avg": { + "precision": 0.5046585040874696, + "recall": 0.5099337748344371, + "f1-score": 0.5069543744235189, + "support": 151 + } + } + }, + "SGDClassifier": { + "train_best_score": 0.5474045178753094, + "train_best_params": { + "alpha": 0.001, + "average": false, + "class_weight": null, + "early_stopping": false, + "epsilon": 0.1, + "eta0": 0.0, + "fit_intercept": true, + "l1_ratio": 0.15, + "learning_rate": "optimal", + "loss": "modified_huber", + "max_iter": 1000, + "n_iter_no_change": 5, + "n_jobs": -1, + "penalty": "elasticnet", + "power_t": 0.5, + "random_state": null, + "shuffle": true, + "tol": 0.001, + "validation_fraction": 0.1, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.46193078324225867, + "test_classification_report": { + "0": { + "precision": 0.5833333333333334, + "recall": 0.4666666666666667, + "f1-score": 0.5185185185185186, + "support": 90 + }, + "1": { + "precision": 0.3924050632911392, + "recall": 0.5081967213114754, + "f1-score": 0.44285714285714284, + "support": 61 + }, + "accuracy": 0.48344370860927155, + "macro avg": { + "precision": 0.4878691983122363, + "recall": 0.48743169398907105, + "f1-score": 0.4806878306878307, + "support": 151 + }, + "weighted avg": { + "precision": 0.5062033699388045, + "recall": 0.48344370860927155, + "f1-score": 0.4879533270261748, + "support": 151 + } + } + }, + "RandomForestClassifier": { + "train_best_score": 0.5682262970664416, + "train_best_params": { + "bootstrap": true, + "ccp_alpha": 0.0, + "class_weight": "balanced", + "criterion": "entropy", + "max_depth": 5, + "max_features": "auto", + "max_leaf_nodes": null, + "max_samples": null, + "min_impurity_decrease": 0.0, + "min_impurity_split": null, + "min_samples_leaf": 1, + "min_samples_split": 8, + "min_weight_fraction_leaf": 0.0, + "n_estimators": 10, + "n_jobs": -1, + "oob_score": false, + "random_state": null, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.44735883424408013, + "test_classification_report": { + "0": { + "precision": 0.5753424657534246, + "recall": 0.4666666666666667, + "f1-score": 0.5153374233128835, + "support": 90 + }, + "1": { + "precision": 0.38461538461538464, + "recall": 0.4918032786885246, + "f1-score": 0.4316546762589928, + "support": 61 + }, + "accuracy": 0.4768211920529801, + "macro avg": { + "precision": 0.47997892518440466, + "recall": 0.4792349726775956, + "f1-score": 0.4734960497859381, + "support": 151 + }, + "weighted avg": { + "precision": 0.49829377734666674, + "recall": 0.4768211920529801, + "f1-score": 0.481531810264623, + "support": 151 + } + } + } +} \ No newline at end of file diff --git a/app/external/model_configs/8475167_2.5.cfg b/app/external/model_configs/8475167_2.5.cfg new file mode 100644 index 00000000..6a07e8ef --- /dev/null +++ b/app/external/model_configs/8475167_2.5.cfg @@ -0,0 +1,239 @@ +{ + "LogisticRegression": { + "train_best_score": 0.6477305908497859, + "train_best_params": { + "C": 0.01, + "class_weight": "balanced", + "dual": false, + "fit_intercept": true, + "intercept_scaling": 1, + "l1_ratio": null, + "max_iter": 100, + "multi_class": "auto", + "n_jobs": null, + "penalty": "l1", + "random_state": null, + "solver": "liblinear", + "tol": 0.001, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.5855874894336432, + "test_classification_report": { + "0": { + "precision": 0.6705882352941176, + "recall": 0.6263736263736264, + "f1-score": 0.6477272727272727, + "support": 91 + }, + "1": { + "precision": 0.41379310344827586, + "recall": 0.46153846153846156, + "f1-score": 0.43636363636363634, + "support": 52 + }, + "accuracy": 0.5664335664335665, + "macro avg": { + "precision": 0.5421906693711968, + "recall": 0.543956043956044, + "f1-score": 0.5420454545454545, + "support": 143 + }, + "weighted avg": { + "precision": 0.5772081873501752, + "recall": 0.5664335664335665, + "f1-score": 0.5708677685950413, + "support": 143 + } + } + }, + "SVC": { + "train_best_score": 0.6286693264170043, + "train_best_params": { + "C": 0.1, + "break_ties": false, + "cache_size": 200, + "class_weight": "balanced", + "coef0": 0.0, + "decision_function_shape": "ovr", + "degree": 3, + "gamma": "scale", + "kernel": "sigmoid", + "max_iter": -1, + "probability": true, + "random_state": null, + "shrinking": true, + "tol": 0.001, + "verbose": false + }, + "test_ROC_AUC": 0.5612848689771767, + "test_classification_report": { + "0": { + "precision": 0.6714285714285714, + "recall": 0.5164835164835165, + "f1-score": 0.5838509316770187, + "support": 91 + }, + "1": { + "precision": 0.3972602739726027, + "recall": 0.5576923076923077, + "f1-score": 0.46399999999999997, + "support": 52 + }, + "accuracy": 0.5314685314685315, + "macro avg": { + "precision": 0.534344422700587, + "recall": 0.5370879120879122, + "f1-score": 0.5239254658385093, + "support": 143 + }, + "weighted avg": { + "precision": 0.57173100871731, + "recall": 0.5314685314685315, + "f1-score": 0.5402687747035574, + "support": 143 + } + } + }, + "GaussianNB": { + "train_best_score": 0.6295238355842071, + "train_best_params": { + "priors": null, + "var_smoothing": 1.0 + }, + "test_ROC_AUC": 0.5564243448858834, + "test_classification_report": { + "0": { + "precision": 0.6428571428571429, + "recall": 0.989010989010989, + "f1-score": 0.7792207792207793, + "support": 91 + }, + "1": { + "precision": 0.6666666666666666, + "recall": 0.038461538461538464, + "f1-score": 0.07272727272727274, + "support": 52 + }, + "accuracy": 0.6433566433566433, + "macro avg": { + "precision": 0.6547619047619048, + "recall": 0.5137362637362638, + "f1-score": 0.425974025974026, + "support": 143 + }, + "weighted avg": { + "precision": 0.6515151515151516, + "recall": 0.6433566433566433, + "f1-score": 0.5223140495867769, + "support": 143 + } + } + }, + "SGDClassifier": { + "train_best_score": 0.6350520048817263, + "train_best_params": { + "alpha": 0.001, + "average": false, + "class_weight": null, + "early_stopping": false, + "epsilon": 0.1, + "eta0": 0.0, + "fit_intercept": true, + "l1_ratio": 0.15, + "learning_rate": "optimal", + "loss": "log", + "max_iter": 1000, + "n_iter_no_change": 5, + "n_jobs": -1, + "penalty": "l1", + "power_t": 0.5, + "random_state": null, + "shuffle": true, + "tol": 0.001, + "validation_fraction": 0.1, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.6115807269653424, + "test_classification_report": { + "0": { + "precision": 0.6341463414634146, + "recall": 0.8571428571428571, + "f1-score": 0.7289719626168224, + "support": 91 + }, + "1": { + "precision": 0.35, + "recall": 0.1346153846153846, + "f1-score": 0.19444444444444445, + "support": 52 + }, + "accuracy": 0.5944055944055944, + "macro avg": { + "precision": 0.4920731707317073, + "recall": 0.49587912087912084, + "f1-score": 0.4617082035306334, + "support": 143 + }, + "weighted avg": { + "precision": 0.530820399113082, + "recall": 0.5944055944055944, + "f1-score": 0.5345983196450487, + "support": 143 + } + } + }, + "RandomForestClassifier": { + "train_best_score": 0.6191494285689333, + "train_best_params": { + "bootstrap": true, + "ccp_alpha": 0.0, + "class_weight": null, + "criterion": "gini", + "max_depth": 5, + "max_features": "auto", + "max_leaf_nodes": null, + "max_samples": null, + "min_impurity_decrease": 0.0, + "min_impurity_split": null, + "min_samples_leaf": 1, + "min_samples_split": 8, + "min_weight_fraction_leaf": 0.0, + "n_estimators": 20, + "n_jobs": -1, + "oob_score": false, + "random_state": null, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.5931952662721893, + "test_classification_report": { + "0": { + "precision": 0.6422764227642277, + "recall": 0.8681318681318682, + "f1-score": 0.7383177570093459, + "support": 91 + }, + "1": { + "precision": 0.4, + "recall": 0.15384615384615385, + "f1-score": 0.2222222222222222, + "support": 52 + }, + "accuracy": 0.6083916083916084, + "macro avg": { + "precision": 0.5211382113821139, + "recall": 0.510989010989011, + "f1-score": 0.48026998961578404, + "support": 143 + }, + "weighted avg": { + "precision": 0.5541759053954176, + "recall": 0.6083916083916084, + "f1-score": 0.5506466534503919, + "support": 143 + } + } + } +} \ No newline at end of file diff --git a/app/external/model_configs/8476881_2.5.cfg b/app/external/model_configs/8476881_2.5.cfg new file mode 100644 index 00000000..83648bf4 --- /dev/null +++ b/app/external/model_configs/8476881_2.5.cfg @@ -0,0 +1,239 @@ +{ + "LogisticRegression": { + "train_best_score": 0.5113221643267236, + "train_best_params": { + "C": 10, + "class_weight": "balanced", + "dual": false, + "fit_intercept": true, + "intercept_scaling": 1, + "l1_ratio": null, + "max_iter": 100, + "multi_class": "auto", + "n_jobs": null, + "penalty": "l1", + "random_state": null, + "solver": "liblinear", + "tol": 0.01, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.4444976076555024, + "test_classification_report": { + "0": { + "precision": 0.5423728813559322, + "recall": 0.5818181818181818, + "f1-score": 0.5614035087719298, + "support": 55 + }, + "1": { + "precision": 0.3235294117647059, + "recall": 0.2894736842105263, + "f1-score": 0.30555555555555564, + "support": 38 + }, + "accuracy": 0.46236559139784944, + "macro avg": { + "precision": 0.4329511465603191, + "recall": 0.43564593301435406, + "f1-score": 0.4334795321637427, + "support": 93 + }, + "weighted avg": { + "precision": 0.4529529690498397, + "recall": 0.46236559139784944, + "f1-score": 0.45686348487706724, + "support": 93 + } + } + }, + "SVC": { + "train_best_score": 0.6071942880096376, + "train_best_params": { + "C": 100, + "break_ties": false, + "cache_size": 200, + "class_weight": "balanced", + "coef0": 0.0, + "decision_function_shape": "ovr", + "degree": 3, + "gamma": "scale", + "kernel": "sigmoid", + "max_iter": -1, + "probability": true, + "random_state": null, + "shrinking": true, + "tol": 0.001, + "verbose": false + }, + "test_ROC_AUC": 0.48421052631578954, + "test_classification_report": { + "0": { + "precision": 0.5106382978723404, + "recall": 0.43636363636363634, + "f1-score": 0.4705882352941176, + "support": 55 + }, + "1": { + "precision": 0.32608695652173914, + "recall": 0.39473684210526316, + "f1-score": 0.35714285714285715, + "support": 38 + }, + "accuracy": 0.41935483870967744, + "macro avg": { + "precision": 0.41836262719703976, + "recall": 0.4155502392344498, + "f1-score": 0.41386554621848737, + "support": 93 + }, + "weighted avg": { + "precision": 0.4352302229118797, + "recall": 0.41935483870967744, + "f1-score": 0.4242342098129574, + "support": 93 + } + } + }, + "GaussianNB": { + "train_best_score": 0.5688871445311415, + "train_best_params": { + "priors": null, + "var_smoothing": 0.1 + }, + "test_ROC_AUC": 0.5066985645933015, + "test_classification_report": { + "0": { + "precision": 0.5842696629213483, + "recall": 0.9454545454545454, + "f1-score": 0.7222222222222222, + "support": 55 + }, + "1": { + "precision": 0.25, + "recall": 0.02631578947368421, + "f1-score": 0.04761904761904762, + "support": 38 + }, + "accuracy": 0.5698924731182796, + "macro avg": { + "precision": 0.41713483146067415, + "recall": 0.4858851674641148, + "f1-score": 0.38492063492063494, + "support": 93 + }, + "weighted avg": { + "precision": 0.44768635979219523, + "recall": 0.5698924731182796, + "f1-score": 0.4465779143198498, + "support": 93 + } + } + }, + "SGDClassifier": { + "train_best_score": 0.5757026439309876, + "train_best_params": { + "alpha": 1e-05, + "average": false, + "class_weight": null, + "early_stopping": false, + "epsilon": 0.1, + "eta0": 0.0, + "fit_intercept": true, + "l1_ratio": 0.2, + "learning_rate": "optimal", + "loss": "log", + "max_iter": 1000, + "n_iter_no_change": 5, + "n_jobs": -1, + "penalty": "l2", + "power_t": 0.5, + "random_state": null, + "shuffle": true, + "tol": 0.001, + "validation_fraction": 0.1, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.5464114832535886, + "test_classification_report": { + "0": { + "precision": 0.5964912280701754, + "recall": 0.6181818181818182, + "f1-score": 0.607142857142857, + "support": 55 + }, + "1": { + "precision": 0.4166666666666667, + "recall": 0.39473684210526316, + "f1-score": 0.40540540540540543, + "support": 38 + }, + "accuracy": 0.5268817204301075, + "macro avg": { + "precision": 0.506578947368421, + "recall": 0.5064593301435407, + "f1-score": 0.5062741312741312, + "support": 93 + }, + "weighted avg": { + "precision": 0.5230145255612149, + "recall": 0.5268817204301075, + "f1-score": 0.524712500518952, + "support": 93 + } + } + }, + "RandomForestClassifier": { + "train_best_score": 0.5829460168335547, + "train_best_params": { + "bootstrap": true, + "ccp_alpha": 0.0, + "class_weight": "balanced", + "criterion": "entropy", + "max_depth": 10, + "max_features": "auto", + "max_leaf_nodes": null, + "max_samples": null, + "min_impurity_decrease": 0.0, + "min_impurity_split": null, + "min_samples_leaf": 4, + "min_samples_split": 8, + "min_weight_fraction_leaf": 0.0, + "n_estimators": 10, + "n_jobs": -1, + "oob_score": false, + "random_state": null, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.47368421052631576, + "test_classification_report": { + "0": { + "precision": 0.5633802816901409, + "recall": 0.7272727272727273, + "f1-score": 0.634920634920635, + "support": 55 + }, + "1": { + "precision": 0.3181818181818182, + "recall": 0.18421052631578946, + "f1-score": 0.23333333333333334, + "support": 38 + }, + "accuracy": 0.5053763440860215, + "macro avg": { + "precision": 0.44078104993597955, + "recall": 0.4557416267942584, + "f1-score": 0.43412698412698414, + "support": 93 + }, + "weighted avg": { + "precision": 0.46319166219211655, + "recall": 0.5053763440860215, + "f1-score": 0.47083119986345795, + "support": 93 + } + } + } +} \ No newline at end of file diff --git a/app/external/model_configs/8477499_1.5.cfg b/app/external/model_configs/8477499_1.5.cfg new file mode 100644 index 00000000..2fb599a2 --- /dev/null +++ b/app/external/model_configs/8477499_1.5.cfg @@ -0,0 +1,239 @@ +{ + "LogisticRegression": { + "train_best_score": 0.5722108701340067, + "train_best_params": { + "C": 0.1, + "class_weight": "balanced", + "dual": false, + "fit_intercept": true, + "intercept_scaling": 1, + "l1_ratio": null, + "max_iter": 100, + "multi_class": "auto", + "n_jobs": null, + "penalty": "l1", + "random_state": null, + "solver": "liblinear", + "tol": 0.01, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.5623529411764706, + "test_classification_report": { + "0": { + "precision": 0.532258064516129, + "recall": 0.66, + "f1-score": 0.5892857142857142, + "support": 50 + }, + "1": { + "precision": 0.5641025641025641, + "recall": 0.43137254901960786, + "f1-score": 0.48888888888888893, + "support": 51 + }, + "accuracy": 0.5445544554455446, + "macro avg": { + "precision": 0.5481803143093466, + "recall": 0.5456862745098039, + "f1-score": 0.5390873015873016, + "support": 101 + }, + "weighted avg": { + "precision": 0.5483379603469032, + "recall": 0.5445544554455446, + "f1-score": 0.5385902876001886, + "support": 101 + } + } + }, + "SVC": { + "train_best_score": 0.5755632510313436, + "train_best_params": { + "C": 0.01, + "break_ties": false, + "cache_size": 200, + "class_weight": "balanced", + "coef0": 0.0, + "decision_function_shape": "ovr", + "degree": 3, + "gamma": "scale", + "kernel": "linear", + "max_iter": -1, + "probability": true, + "random_state": null, + "shrinking": true, + "tol": 0.001, + "verbose": false + }, + "test_ROC_AUC": 0.5701960784313725, + "test_classification_report": { + "0": { + "precision": 0.5161290322580645, + "recall": 0.64, + "f1-score": 0.5714285714285714, + "support": 50 + }, + "1": { + "precision": 0.5384615384615384, + "recall": 0.4117647058823529, + "f1-score": 0.4666666666666667, + "support": 51 + }, + "accuracy": 0.5247524752475248, + "macro avg": { + "precision": 0.5272952853598014, + "recall": 0.5258823529411765, + "f1-score": 0.519047619047619, + "support": 101 + }, + "weighted avg": { + "precision": 0.5274058423212048, + "recall": 0.5247524752475248, + "f1-score": 0.5185289957567185, + "support": 101 + } + } + }, + "GaussianNB": { + "train_best_score": 0.5749104336753043, + "train_best_params": { + "priors": null, + "var_smoothing": 1.0 + }, + "test_ROC_AUC": 0.6352941176470588, + "test_classification_report": { + "0": { + "precision": 0.0, + "recall": 0.0, + "f1-score": 0.0, + "support": 50 + }, + "1": { + "precision": 0.504950495049505, + "recall": 1.0, + "f1-score": 0.6710526315789473, + "support": 51 + }, + "accuracy": 0.504950495049505, + "macro avg": { + "precision": 0.2524752475247525, + "recall": 0.5, + "f1-score": 0.3355263157894737, + "support": 101 + }, + "weighted avg": { + "precision": 0.2549750024507401, + "recall": 0.504950495049505, + "f1-score": 0.3388483585200625, + "support": 101 + } + } + }, + "SGDClassifier": { + "train_best_score": 0.5759067569335427, + "train_best_params": { + "alpha": 0.001, + "average": false, + "class_weight": null, + "early_stopping": false, + "epsilon": 0.1, + "eta0": 0.0, + "fit_intercept": true, + "l1_ratio": 0.1, + "learning_rate": "optimal", + "loss": "modified_huber", + "max_iter": 1000, + "n_iter_no_change": 5, + "n_jobs": -1, + "penalty": "l1", + "power_t": 0.5, + "random_state": null, + "shuffle": true, + "tol": 0.001, + "validation_fraction": 0.1, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.42666666666666675, + "test_classification_report": { + "0": { + "precision": 0.41025641025641024, + "recall": 0.32, + "f1-score": 0.35955056179775285, + "support": 50 + }, + "1": { + "precision": 0.45161290322580644, + "recall": 0.5490196078431373, + "f1-score": 0.49557522123893805, + "support": 51 + }, + "accuracy": 0.43564356435643564, + "macro avg": { + "precision": 0.4309346567411083, + "recall": 0.4345098039215687, + "f1-score": 0.4275628915183455, + "support": 101 + }, + "weighted avg": { + "precision": 0.4311393918548182, + "recall": 0.43564356435643564, + "f1-score": 0.4282362809215196, + "support": 101 + } + } + }, + "RandomForestClassifier": { + "train_best_score": 0.6040532440421146, + "train_best_params": { + "bootstrap": true, + "ccp_alpha": 0.0, + "class_weight": null, + "criterion": "gini", + "max_depth": 5, + "max_features": "auto", + "max_leaf_nodes": null, + "max_samples": null, + "min_impurity_decrease": 0.0, + "min_impurity_split": null, + "min_samples_leaf": 4, + "min_samples_split": 4, + "min_weight_fraction_leaf": 0.0, + "n_estimators": 20, + "n_jobs": -1, + "oob_score": false, + "random_state": null, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.5301960784313726, + "test_classification_report": { + "0": { + "precision": 0.5833333333333334, + "recall": 0.14, + "f1-score": 0.22580645161290325, + "support": 50 + }, + "1": { + "precision": 0.5168539325842697, + "recall": 0.9019607843137255, + "f1-score": 0.6571428571428573, + "support": 51 + }, + "accuracy": 0.5247524752475248, + "macro avg": { + "precision": 0.5500936329588015, + "recall": 0.5209803921568628, + "f1-score": 0.44147465437788025, + "support": 101 + }, + "weighted avg": { + "precision": 0.5497645270144992, + "recall": 0.5247524752475248, + "f1-score": 0.44360998311812755, + "support": 101 + } + } + } +} \ No newline at end of file diff --git a/app/external/model_configs/8477504_1.5.cfg b/app/external/model_configs/8477504_1.5.cfg new file mode 100644 index 00000000..78e159e2 --- /dev/null +++ b/app/external/model_configs/8477504_1.5.cfg @@ -0,0 +1,239 @@ +{ + "LogisticRegression": { + "train_best_score": 0.6058073826961718, + "train_best_params": { + "C": 0.001, + "class_weight": "balanced", + "dual": false, + "fit_intercept": true, + "intercept_scaling": 1, + "l1_ratio": null, + "max_iter": 100, + "multi_class": "auto", + "n_jobs": null, + "penalty": "l2", + "random_state": null, + "solver": "liblinear", + "tol": 0.01, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.6221590909090909, + "test_classification_report": { + "0": { + "precision": 0.5833333333333334, + "recall": 0.6363636363636364, + "f1-score": 0.6086956521739131, + "support": 33 + }, + "1": { + "precision": 0.5862068965517241, + "recall": 0.53125, + "f1-score": 0.5573770491803278, + "support": 32 + }, + "accuracy": 0.5846153846153846, + "macro avg": { + "precision": 0.5847701149425287, + "recall": 0.5838068181818181, + "f1-score": 0.5830363506771205, + "support": 65 + }, + "weighted avg": { + "precision": 0.5847480106100796, + "recall": 0.5846153846153846, + "f1-score": 0.5834311091616865, + "support": 65 + } + } + }, + "SVC": { + "train_best_score": 0.624150794388857, + "train_best_params": { + "C": 0.1, + "break_ties": false, + "cache_size": 200, + "class_weight": "balanced", + "coef0": 0.0, + "decision_function_shape": "ovr", + "degree": 3, + "gamma": "scale", + "kernel": "poly", + "max_iter": -1, + "probability": true, + "random_state": null, + "shrinking": true, + "tol": 0.001, + "verbose": false + }, + "test_ROC_AUC": 0.5776515151515151, + "test_classification_report": { + "0": { + "precision": 0.5357142857142857, + "recall": 0.45454545454545453, + "f1-score": 0.49180327868852464, + "support": 33 + }, + "1": { + "precision": 0.5135135135135135, + "recall": 0.59375, + "f1-score": 0.5507246376811593, + "support": 32 + }, + "accuracy": 0.5230769230769231, + "macro avg": { + "precision": 0.5246138996138996, + "recall": 0.5241477272727273, + "f1-score": 0.521263958184842, + "support": 65 + }, + "weighted avg": { + "precision": 0.5247846747846747, + "recall": 0.5230769230769231, + "f1-score": 0.5208107169618217, + "support": 65 + } + } + }, + "GaussianNB": { + "train_best_score": 0.5922468979642451, + "train_best_params": { + "priors": null, + "var_smoothing": 1.0 + }, + "test_ROC_AUC": 0.5482954545454546, + "test_classification_report": { + "0": { + "precision": 0.5172413793103449, + "recall": 0.9090909090909091, + "f1-score": 0.6593406593406593, + "support": 33 + }, + "1": { + "precision": 0.5714285714285714, + "recall": 0.125, + "f1-score": 0.20512820512820512, + "support": 32 + }, + "accuracy": 0.5230769230769231, + "macro avg": { + "precision": 0.5443349753694582, + "recall": 0.5170454545454546, + "f1-score": 0.43223443223443225, + "support": 65 + }, + "weighted avg": { + "precision": 0.5439181508147025, + "recall": 0.5230769230769231, + "f1-score": 0.4357283741899126, + "support": 65 + } + } + }, + "SGDClassifier": { + "train_best_score": 0.6011552833486745, + "train_best_params": { + "alpha": 0.001, + "average": false, + "class_weight": null, + "early_stopping": false, + "epsilon": 0.1, + "eta0": 0.0, + "fit_intercept": true, + "l1_ratio": 0.2, + "learning_rate": "optimal", + "loss": "modified_huber", + "max_iter": 1000, + "n_iter_no_change": 5, + "n_jobs": -1, + "penalty": "l1", + "power_t": 0.5, + "random_state": null, + "shuffle": true, + "tol": 0.001, + "validation_fraction": 0.1, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.5828598484848485, + "test_classification_report": { + "0": { + "precision": 0.5555555555555556, + "recall": 0.7575757575757576, + "f1-score": 0.6410256410256411, + "support": 33 + }, + "1": { + "precision": 0.6, + "recall": 0.375, + "f1-score": 0.4615384615384615, + "support": 32 + }, + "accuracy": 0.5692307692307692, + "macro avg": { + "precision": 0.5777777777777777, + "recall": 0.5662878787878788, + "f1-score": 0.5512820512820513, + "support": 65 + }, + "weighted avg": { + "precision": 0.5774358974358974, + "recall": 0.5692307692307692, + "f1-score": 0.5526627218934912, + "support": 65 + } + } + }, + "RandomForestClassifier": { + "train_best_score": 0.6711907485059472, + "train_best_params": { + "bootstrap": true, + "ccp_alpha": 0.0, + "class_weight": "balanced", + "criterion": "entropy", + "max_depth": null, + "max_features": "auto", + "max_leaf_nodes": null, + "max_samples": null, + "min_impurity_decrease": 0.0, + "min_impurity_split": null, + "min_samples_leaf": 4, + "min_samples_split": 4, + "min_weight_fraction_leaf": 0.0, + "n_estimators": 10, + "n_jobs": -1, + "oob_score": false, + "random_state": null, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.47537878787878785, + "test_classification_report": { + "0": { + "precision": 0.48484848484848486, + "recall": 0.48484848484848486, + "f1-score": 0.48484848484848486, + "support": 33 + }, + "1": { + "precision": 0.46875, + "recall": 0.46875, + "f1-score": 0.46875, + "support": 32 + }, + "accuracy": 0.47692307692307695, + "macro avg": { + "precision": 0.47679924242424243, + "recall": 0.47679924242424243, + "f1-score": 0.47679924242424243, + "support": 65 + }, + "weighted avg": { + "precision": 0.47692307692307695, + "recall": 0.47692307692307695, + "f1-score": 0.47692307692307695, + "support": 65 + } + } + } +} \ No newline at end of file diff --git a/app/external/model_configs/8478463_2.5.cfg b/app/external/model_configs/8478463_2.5.cfg new file mode 100644 index 00000000..3c9ea7e9 --- /dev/null +++ b/app/external/model_configs/8478463_2.5.cfg @@ -0,0 +1,239 @@ +{ + "LogisticRegression": { + "train_best_score": 0.5945906724854093, + "train_best_params": { + "C": 0.001, + "class_weight": "balanced", + "dual": false, + "fit_intercept": true, + "intercept_scaling": 1, + "l1_ratio": null, + "max_iter": 100, + "multi_class": "auto", + "n_jobs": null, + "penalty": "l2", + "random_state": null, + "solver": "liblinear", + "tol": 0.01, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.6126984126984127, + "test_classification_report": { + "0": { + "precision": 0.75, + "recall": 0.4666666666666667, + "f1-score": 0.5753424657534245, + "support": 45 + }, + "1": { + "precision": 0.3684210526315789, + "recall": 0.6666666666666666, + "f1-score": 0.4745762711864407, + "support": 21 + }, + "accuracy": 0.5303030303030303, + "macro avg": { + "precision": 0.5592105263157895, + "recall": 0.5666666666666667, + "f1-score": 0.5249593684699326, + "support": 66 + }, + "weighted avg": { + "precision": 0.6285885167464115, + "recall": 0.5303030303030303, + "f1-score": 0.5432804947548387, + "support": 66 + } + } + }, + "SVC": { + "train_best_score": 0.634612580402054, + "train_best_params": { + "C": 1, + "break_ties": false, + "cache_size": 200, + "class_weight": null, + "coef0": 0.0, + "decision_function_shape": "ovr", + "degree": 3, + "gamma": "scale", + "kernel": "poly", + "max_iter": -1, + "probability": true, + "random_state": null, + "shrinking": true, + "tol": 0.001, + "verbose": false + }, + "test_ROC_AUC": 0.5428571428571429, + "test_classification_report": { + "0": { + "precision": 0.6923076923076923, + "recall": 1.0, + "f1-score": 0.8181818181818181, + "support": 45 + }, + "1": { + "precision": 1.0, + "recall": 0.047619047619047616, + "f1-score": 0.0909090909090909, + "support": 21 + }, + "accuracy": 0.696969696969697, + "macro avg": { + "precision": 0.8461538461538461, + "recall": 0.5238095238095238, + "f1-score": 0.45454545454545453, + "support": 66 + }, + "weighted avg": { + "precision": 0.7902097902097902, + "recall": 0.696969696969697, + "f1-score": 0.5867768595041322, + "support": 66 + } + } + }, + "GaussianNB": { + "train_best_score": 0.6101091890565574, + "train_best_params": { + "priors": null, + "var_smoothing": 0.1 + }, + "test_ROC_AUC": 0.62010582010582, + "test_classification_report": { + "0": { + "precision": 0.7068965517241379, + "recall": 0.9111111111111111, + "f1-score": 0.7961165048543689, + "support": 45 + }, + "1": { + "precision": 0.5, + "recall": 0.19047619047619047, + "f1-score": 0.27586206896551724, + "support": 21 + }, + "accuracy": 0.6818181818181818, + "macro avg": { + "precision": 0.603448275862069, + "recall": 0.5507936507936508, + "f1-score": 0.5359892869099431, + "support": 66 + }, + "weighted avg": { + "precision": 0.6410658307210031, + "recall": 0.6818181818181818, + "f1-score": 0.630581002526098, + "support": 66 + } + } + }, + "SGDClassifier": { + "train_best_score": 0.6149532923217133, + "train_best_params": { + "alpha": 0.0001, + "average": false, + "class_weight": null, + "early_stopping": false, + "epsilon": 0.1, + "eta0": 0.0, + "fit_intercept": true, + "l1_ratio": 0.1, + "learning_rate": "optimal", + "loss": "log", + "max_iter": 1000, + "n_iter_no_change": 5, + "n_jobs": -1, + "penalty": "elasticnet", + "power_t": 0.5, + "random_state": null, + "shuffle": true, + "tol": 0.001, + "validation_fraction": 0.1, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.553968253968254, + "test_classification_report": { + "0": { + "precision": 0.7111111111111111, + "recall": 0.7111111111111111, + "f1-score": 0.7111111111111111, + "support": 45 + }, + "1": { + "precision": 0.38095238095238093, + "recall": 0.38095238095238093, + "f1-score": 0.38095238095238093, + "support": 21 + }, + "accuracy": 0.6060606060606061, + "macro avg": { + "precision": 0.5460317460317461, + "recall": 0.5460317460317461, + "f1-score": 0.5460317460317461, + "support": 66 + }, + "weighted avg": { + "precision": 0.6060606060606061, + "recall": 0.6060606060606061, + "f1-score": 0.6060606060606061, + "support": 66 + } + } + }, + "RandomForestClassifier": { + "train_best_score": 0.6541816078658185, + "train_best_params": { + "bootstrap": true, + "ccp_alpha": 0.0, + "class_weight": null, + "criterion": "entropy", + "max_depth": null, + "max_features": "auto", + "max_leaf_nodes": null, + "max_samples": null, + "min_impurity_decrease": 0.0, + "min_impurity_split": null, + "min_samples_leaf": 4, + "min_samples_split": 2, + "min_weight_fraction_leaf": 0.0, + "n_estimators": 10, + "n_jobs": -1, + "oob_score": false, + "random_state": null, + "verbose": 0, + "warm_start": false + }, + "test_ROC_AUC": 0.6100529100529101, + "test_classification_report": { + "0": { + "precision": 0.6885245901639344, + "recall": 0.9333333333333333, + "f1-score": 0.7924528301886792, + "support": 45 + }, + "1": { + "precision": 0.4, + "recall": 0.09523809523809523, + "f1-score": 0.15384615384615385, + "support": 21 + }, + "accuracy": 0.6666666666666666, + "macro avg": { + "precision": 0.5442622950819672, + "recall": 0.5142857142857142, + "f1-score": 0.4731494920174165, + "support": 66 + }, + "weighted avg": { + "precision": 0.5967213114754099, + "recall": 0.6666666666666666, + "f1-score": 0.5892597968069666, + "support": 66 + } + } + } +} \ No newline at end of file diff --git a/app/external/predictions/test.json b/app/external/predictions/test.json new file mode 100644 index 00000000..f144d66c --- /dev/null +++ b/app/external/predictions/test.json @@ -0,0 +1 @@ +[{"game_id": "2020020730", "player_id": 8471214, "date": "2021-04-22", "predictions": null}, {"game_id": "2020020048", "player_id": 8475167, "date": "2021-05-07", "predictions": null}, {"game_id": "2020020839", "player_id": 8478463, "date": "2021-05-24", "predictions": null}, {"game_id": "2020020814", "player_id": 8475744, "date": "2021-05-03", "predictions": null}, {"game_id": "2020020834", "player_id": 8477504, "date": "2021-05-05", "predictions": null}, {"game_id": "2020030154", "player_id": 8477492, "date": "2021-05-22", "predictions": null}, {"game_id": "2020020162", "player_id": 8476881, "date": "2021-05-12", "predictions": null}, {"game_id": "2020020842", "player_id": 8477499, "date": "2021-05-06", "predictions": null}, {"game_id": "2020020162", "player_id": 8476881, "date": "2021-05-12", "predictions": null}] \ No newline at end of file diff --git a/app/handler.py b/app/handler.py index 2adaa6f6..1c57e706 100644 --- a/app/handler.py +++ b/app/handler.py @@ -12,6 +12,7 @@ from source.predict import * from tqdm import tqdm from datetime import date, datetime, timedelta +import json import csv @@ -111,9 +112,8 @@ def evaluate_setup(config): # A function that check if data of player contains data for game -def get_data_from_file(player_id, game_id, date): +def get_data_from_file(player_id, date): date = datetime.strptime(date, '%Y-%m-%d') - print(date) # Loop through all files in folder oldpwd=os.getcwd() os.chdir("./external/csvs/data_csvs/") @@ -127,26 +127,36 @@ def get_data_from_file(player_id, game_id, date): return pd.read_csv("./external/csvs/data_csvs/" + file, sep=';', encoding='utf-8') os.chdir(oldpwd) - print("No file sufficient found") - return False + print("No sufficient file found, generating one") + + data, game_date = generate_csv(player_id) + game_date = str(game_date).replace(" ", "-").replace(":", "-") + save_csv(data, str(player_id) + "_" + str(game_date) + ".csv") + return str(player_id) + "_" + str(game_date) + ".csv" def predict_games(games): - for game in games: + results = [] + for game in tqdm(games): print(f"Predicting player: {game['player_id']} in game {game['game_id']}") - # Todo: Check if game is already predicted (If not, predict else use old prediction) (maybe add some sort of id to know if its used same type of prediction config) - # Todo: Generate data if doesn't exist - data = get_data_from_file(game['player_id'], game['game_id'], game['date']) - - # Todo: Predict game + data = get_data_from_file(game['player_id'], game['date']) # Read config from file config = None with open(game['config']) as f: config = json.loads(f.read()) - pred_df = predict_game(data, config) - # Todo: Save prediction \ No newline at end of file + # Generate predictions + predictions = predict_game(data, config, game['game_id'], game['player_id'], game['target']) + + # Add predictions to results + results.append({'game_id': game['game_id'], + 'player_id': game['player_id'], + 'date': game['date'], + 'predictions': predictions + }) + + return results \ No newline at end of file diff --git a/app/main.py b/app/main.py index 93c02aa1..2b7af54e 100644 --- a/app/main.py +++ b/app/main.py @@ -52,10 +52,11 @@ def print_help(): print("Bets database updated") elif arg_in.lower() == 'gen': - player_id = 8475167 - data, game_date = generate_csv(player_id) - game_date = str(game_date).replace(" ", "-").replace(":", "-") - save_csv(data, str(player_id) + "_" + str(game_date) + ".csv") + player_ids = [8471214, 8475167, 8478463, 8475744, 8477504, 8477492, 8480839, 8477499, 8476881] + for player_id in player_ids: + data, game_date = generate_csv(player_id) + game_date = str(game_date).replace(" ", "-").replace(":", "-") + save_csv(data, str(player_id) + "_" + str(game_date) + ".csv") elif arg_in.lower() == 'eval': @@ -67,14 +68,81 @@ def print_help(): save_csv(evaluate_setup(extract_and_select_var), extract_and_select_var['save_path']) elif arg_in.lower() == 'pred': - games = [{ + games = [ + { + 'player_id': 8471214, + 'game_id': '2020020730', + 'date': '2021-04-22', + 'target': ['3.5', '4.5'], + 'config': "./external/configs/default.cfg" + }, + { 'player_id': 8475167, - 'game_id': '201709210', - 'date': "2021-05-01", - 'config': "./external/configs/new_test.cfg" - }] - - predict_games(games) + 'game_id': '2020020048', + 'date': "2021-05-07", + 'target': ['2.5'], + 'config': "./external/configs/default.cfg" + }, + { + 'player_id': 8478463, + 'game_id': '2020020839', + 'date': "2021-05-24", + 'target': ['2.5'], + 'config': "./external/configs/default.cfg" + }, + { + 'player_id': 8475744, + 'game_id': '2020020814', + 'date': '2021-05-03', + 'target': ['1.5'], + 'config': "./external/configs/default.cfg" + }, + { + 'player_id': 8477504, + 'game_id': '2020020834', + 'date': '2021-05-05', + 'target': ['1.5'], + 'config': "./external/configs/default.cfg" + }, + { + 'player_id': 8477492, + 'game_id': '2020030154', + 'date': '2021-05-22', + 'target': ['3.5'], + 'config': "./external/configs/default.cfg" + }, + { + 'player_id': 8476881, + 'game_id': '2020020162', + 'date': '2021-05-12', + 'target': ['2.5'], + 'config': "./external/configs/default.cfg" + }, + { + 'player_id': 8477499, + 'game_id': '2020020842', + 'date': '2021-05-06', + 'target': ['1.5'], + 'config': "./external/configs/default.cfg" + }, + { + 'player_id': 8476881, + 'game_id': '2020020162', + 'date': '2021-05-12', + 'target': ['2.5'], + 'config': "./external/configs/default.cfg" + } + ] + + predictions = predict_games(games) + + # Save predictions dict to a file + with open('./external/predictions/test.json', 'w') as f: + json.dump(predictions, f) + + print("Predictions saved to file") + print("Predictions: ") + print(json.dumps(predictions, indent=4)) else: diff --git a/app/source/predict.py b/app/source/predict.py index 3dc5ae92..1c691c6c 100644 --- a/app/source/predict.py +++ b/app/source/predict.py @@ -14,144 +14,339 @@ from sklearn.ensemble import StackingClassifier from sklearn.model_selection import GridSearchCV from sklearn.metrics import roc_auc_score +from sklearn.linear_model import SGDClassifier +from sklearn.metrics import confusion_matrix +from tqdm import tqdm +import json import numpy as np import pandas as pd +import os +import glob -def predict_game(org_data, config): - for target in config['columns']['targets']['active']: + + +def predict_game(org_data, org_config, game_id, player_id, targets): + results = {} + + for target in targets: + # Clean data + config = org_config.copy() data = data_cleanup(org_data.copy(), config) - # Split data into train and test using sci-kit learn - X_train, X_test, y_train, y_test = train_test_split(data.drop(config['columns']['targets']['all'], axis=1), data[target], test_size=0.2, random_state=42) - - # Create column transformer - col_transformer = ColumnTransformer([ - ('one_hot_encoder', OneHotEncoder(), config['columns']['types']['categorical']) - ], - remainder='passthrough', - n_jobs=-1 - ) - - # Logistic regression - grid_params = None#\ - # { - # 'pca__n_components': [10, 50, 100, 200], - # 'classifier__penalty': ['l1', 'l2'], - # 'classifier__solver': ['liblinear'], - # 'classifier__C': [0.001, 0.01, 0.1, 1, 10], - # } - log_reg_pipeline = run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, LogisticRegression(C=0.1, penalty='l1', solver='liblinear'), grid_params) - - # SVM - grid_params = None#\ - # { - # 'pca__n_components': [7, 8, 9, 10, 11, 12, 13], - # 'classifier__C': [0.001, 0.01, 0.1, 1, 10], - # 'classifier__kernel': ['rbf'], - # 'classifier__gamma': [0.001, 0.01, 0.1, 1, 10] - # } - svm_pipeline = run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, SVC(C=1, gamma=0.01,probability=True), grid_params) - + # Check if game that is to be predicted is in data + if int(game_id) not in data['gamePk_SkaterStats'].values: + print(f"Game {game_id} not found in data") + return None - # Naive Bayes - grid_params = None#\ - # { - # 'pca__n_components': [10, 50, 100, 200], - # 'classifier__var_smoothing': np.logspace(0,-9, num=10) - # } - bayes_pipeline = run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, GaussianNB(var_smoothing=0.3511191734215131), grid_params) - - - # Random forest - grid_params = None#\ - # { - # 'pca__n_components': [10], - # 'classifier__n_estimators': [10, 50, 100, 200], - # 'classifier__max_features': ['auto', 'sqrt', 'log2'], - # 'classifier__min_samples_split': [2, 4, 8, 9, 10], - # 'classifier__n_jobs': [-1], - # } - forest_pipeline = run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, RandomForestClassifier(max_depth=None, max_features='auto', min_samples_split=4, n_estimators=200), grid_params) - - - # Stacking - estimators = [ - ('log_reg', log_reg_pipeline), - ('svm', svm_pipeline), - ('bayes', bayes_pipeline), - ('forest', forest_pipeline) - ] - - # Create meta-pipeline - clf = StackingClassifier( - estimators=estimators, - final_estimator=LogisticRegression(), - cv=5, - verbose=1, - n_jobs=-1, - stack_method='predict_proba' - ) + # Remove identifier columns + data.drop(org_config['columns']['types']['identifier'], axis=1, inplace=True) - clf.fit(X_train, y_train) - y_pred = clf.predict(X_test) - print(f"\n\nStacking report: ") - print("{classification_report(y_test, y_pred)}") - print(f"Stacking acc: {accuracy_score(y_test, y_pred)}") - print(f"{y_train.value_counts(normalize=True)}") - - # Print ROC AUC - print(f"ROC AUC: {roc_auc_score(y_test, y_pred)}") + # Load model config and information + models_config = load_model_config(player_id, data, config, target) - # Neural network +def load_model_config(player_id, data, config, target): + ''' + Loads the model config for a given player + ''' + model_config = None + + # Check if config file exists + oldpwd=os.getcwd() + os.chdir("./external/model_configs/") + for file in glob.glob("*"): + if str(player_id)+"_BAJS"+str(target) == str(file): + os.chdir(oldpwd) + with open(f'./external/model_configs/{str(player_id)+"_"+str(target)}.cfg', 'r') as f: + model_config = json.load(f) + return model_config + + os.chdir(oldpwd) + print("No sufficient file found, generating one") - print("---") + # Generate a model_config file + return generate_models_config(player_id, data, config, target) -def run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, model, grid_params=None): - # Create pipeline with column transformer, standard scaler, and logistic regression +def generate_models_config(player_id, data, config, target): + ''' + Generates a model config file for a given player + ''' + # Split data into train and test using sci-kit learn + X_train, X_test, y_train, y_test = train_test_split(data.drop(config['columns']['targets']['all'], axis=1), data["O_" + str(target)], test_size=0.2, random_state=42) + + # Create column transformer + col_transformer = ColumnTransformer([ + ('one_hot_encoder', OneHotEncoder(handle_unknown='ignore'), config['columns']['types']['categorical']) + ], + remainder='passthrough', + n_jobs=-1 + ) + + # Create pipeline pipeline = Pipeline(steps=[ ('col_transformer', col_transformer), ('standard_scaler', StandardScaler()), ('pca', PCA(n_components=10)), - ('classifier', model), + ('classifier', None), ]) - print("\n") - # Create grid search object - if grid_params: - grid_search = GridSearchCV(pipeline, grid_params, cv=5, n_jobs=-1) - grid_search.fit(X_train, y_train) + # Create grid parameters + grid = [ + {"name": "LogisticRegression", + "parameters": { + 'classifier': [LogisticRegression()], + 'classifier__penalty': ['l1', 'l2'], + 'classifier__C': [0.001, 0.01, 0.1, 1, 10, 100], + 'classifier__solver': ['liblinear'], + 'classifier__class_weight': ['balanced', None], + 'classifier__max_iter': [100, 150, 300], + 'classifier__tol': [0.01, 0.001, 0.0001, 0.00001] + }},{ + "name": "SVC", + "parameters": { + 'classifier': [SVC()], + 'classifier__kernel': ['rbf', 'linear', 'poly', 'sigmoid'], + 'classifier__C': [0.01, 0.1, 1, 10, 100], + 'classifier__gamma': ['scale', 'auto'], + 'classifier__class_weight': ['balanced', None], + 'classifier__probability': [True] + }},{ + "name": "GaussianNB", + "parameters": { + 'classifier': [GaussianNB()], + 'pca__n_components': [10, 50, 100, 200], + 'classifier__var_smoothing': np.logspace(0,-9, num=10) + }},{ + "name": "SGDClassifier", + "parameters": { + 'classifier': [SGDClassifier()], + 'classifier__loss': ['log', 'modified_huber'], + 'classifier__penalty': ['l1', 'l2', 'elasticnet'], + 'classifier__alpha': [0.001, 0.0001, 0.00001], + 'classifier__l1_ratio': [0.10, 0.15, 0.20], + 'classifier__n_jobs': [-1] + }},{ + "name": "RandomForestClassifier", + "parameters": { + 'classifier': [RandomForestClassifier()], + 'classifier__n_estimators': [10, 20, 50, 100], + 'classifier__criterion': ['gini', 'entropy'], + 'classifier__max_depth': [None, 5, 10, 20], + 'classifier__min_samples_split': [2, 4, 8], + 'classifier__min_samples_leaf': [1, 2, 4], + 'classifier__class_weight': ['balanced', None], + 'classifier__n_jobs': [-1] + }} + ] + + results = {} + + # Create grid search + for d in tqdm(grid): + name, parameters = d['name'], d['parameters'] + # grid search + clf = GridSearchCV(pipeline, parameters, cv=5, n_jobs=-1, verbose=1, scoring='roc_auc') + clf.fit(X_train, y_train) + + results[name] = {} + # Save results + results[name]['train_best_score'] = (clf.best_score_) + results[name]['train_best_params'] = (clf.best_params_['classifier'].get_params()) + results[name]['test_ROC_AUC'] = (roc_auc_score(y_test, clf.predict_proba(X_test)[:,1])) + results[name]['test_classification_report'] = classification_report(y_test, clf.predict(X_test), output_dict=True) + + + # Save results + with open(f'./external/model_configs/{str(player_id)+"_"+str(target)}.cfg', 'w') as f: + json.dump(results, f, indent=4) + + return results + + + + + + + + + - # Print ROC AUC score - print(f"ROC AUC: {roc_auc_score(y_test, grid_search.predict_proba(X_test)[:, 1])}") - print("Best score:", grid_search.best_score_) - print("Best params:", grid_search.best_params_) - print("Best estimator:", grid_search.best_estimator_) - # fit best model to train data - y_pred = grid_search.predict(X_test) - print(f"Accuracy on test data: {accuracy_score(y_test, y_pred):.2%}") + + + + + + + + + + +# def predict_game(org_data, org_config, player_id, game_id, results): +# for target in tqdm(org_config['columns']['targets']['active']): +# config = org_config.copy() +# data = data_cleanup(org_data.copy(), config) + +# # Split data into train and test using sci-kit learn +# X_train, X_test, y_train, y_test = train_test_split(data.drop(config['columns']['targets']['all'], axis=1), data[target], test_size=0.2, random_state=42) + +# # Create column transformer +# col_transformer = ColumnTransformer([ +# ('one_hot_encoder', OneHotEncoder(handle_unknown='ignore'), config['columns']['types']['categorical']) +# ], +# remainder='passthrough', +# n_jobs=-1 +# ) + +# # Logistic regression +# grid_params = None#\ +# # { +# # 'pca__n_components': [10, 50, 100, 200], +# # 'classifier__penalty': ['l1', 'l2'], +# # 'classifier__solver': ['liblinear'], +# # 'classifier__C': [0.001, 0.01, 0.1, 1, 10], +# # } +# log_reg_pipeline, log_reg_res = run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, LogisticRegression(C=0.1, penalty='l1', solver='liblinear', class_weight='balanced'), grid_params) + +# # SVM +# grid_params = None#\ +# # { +# # 'pca__n_components': [7, 8, 9, 10, 11, 12, 13], +# # 'classifier__C': [0.001, 0.01, 0.1, 1, 10], +# # 'classifier__kernel': ['rbf'], +# # 'classifier__gamma': [0.001, 0.01, 0.1, 1, 10] +# # } +# svm_pipeline, svm_res = run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, SVC(C=1, gamma=0.01, probability=True), grid_params) + + +# # Naive Bayes +# grid_params = None#\ +# # { +# # 'pca__n_components': [10, 50, 100, 200], +# # 'classifier__var_smoothing': np.logspace(0,-9, num=10) +# # } +# bayes_pipeline, bayes_res = run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, GaussianNB(var_smoothing=0.3511191734215131), grid_params) + + +# # Random forest +# grid_params = None#\ +# # { +# # 'pca__n_components': [10], +# # 'classifier__n_estimators': [10, 50, 100, 200], +# # 'classifier__max_features': ['auto', 'sqrt', 'log2'], +# # 'classifier__min_samples_split': [2, 4, 8, 9, 10], +# # 'classifier__n_jobs': [-1], +# # } +# forest_pipeline, forest_res = run_pipeline( \ +# X_train, X_test, y_train, y_test, col_transformer, target, \ +# RandomForestClassifier(max_depth=None, max_features='auto', min_samples_split=4, n_estimators=1000, class_weight="balanced"), grid_params) + + +# # # Stacking +# # estimators = [ +# # ('log_reg', log_reg_pipeline), +# # ('svm', svm_pipeline), +# # ('bayes', bayes_pipeline), +# # ('forest', forest_pipeline) +# # ] + +# # # Create meta-pipeline +# # clf = StackingClassifier( +# # estimators=estimators, +# # final_estimator=LogisticRegression(), +# # cv=5, +# # verbose=1, +# # n_jobs=-1, +# # stack_method='predict_proba' +# # ) + +# # clf.fit(X_train, y_train) +# # y_pred = clf.predict(X_test) +# #print(f"\n\nStacking report: ") +# #print("{classification_report(y_test, y_pred)}") +# #print(f"Stacking acc: {accuracy_score(y_test, y_pred):.4%}") +# #print(f"{y_train.value_counts(normalize=True)}") + +# # Print ROC AUC +# #print(f"ROC AUC: {roc_auc_score(y_test, y_pred):.4%}") + + +# # Neural network + + +# #print("---") +# # Add new game to results +# new = { +# 'player_id': player_id, +# 'target': target, +# **log_reg_res, +# **svm_res, +# **bayes_res, +# **forest_res +# } +# # Append dict to results df with keys as columns +# results = results.append(pd.DataFrame([new], columns=results.columns)) + +# return results + +# def run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, model, grid_params=None): +# # Create pipeline with column transformer, standard scaler, and logistic regression +# pipeline = Pipeline(steps=[ +# ('col_transformer', col_transformer), +# ('standard_scaler', StandardScaler()), +# ('pca', PCA(n_components=10)), +# ('classifier', model), +# ]) +# #print("\n") + +# results = {} +# name = model.__class__.__name__ + +# # Create grid search object +# if grid_params: +# grid_search = GridSearchCV(pipeline, grid_params, cv=5, n_jobs=-1) +# grid_search.fit(X_train, y_train) + +# # Print ROC AUC score +# #print(f"ROC AUC: {roc_auc_score(y_test, grid_search.predict_proba(X_test)[:, 1]):.4%}") +# results[name + 'ROC AUC'] = roc_auc_score(y_test, grid_search.predict_proba(X_test)[:, 1]) + +# #print("Best score:", grid_search.best_score_) +# results[name + 'Best score'] = grid_search.best_score_ +# #print("Best params:", grid_search.best_params_) +# results[name + 'Best params'] = grid_search.best_params_ +# #print("Best estimator:", grid_search.best_estimator_) +# results[name + 'Best estimator'] = grid_search.best_estimator_ + +# # fit best model to train data +# y_pred = grid_search.predict(X_test) +# #print(f"Accuracy on test data: {accuracy_score(y_test, y_pred):.4%}") +# results[name + 'Accuracy on test data'] = accuracy_score(y_test, y_pred) - else: - # Cross validate pipeline - scores = cross_val_score( - pipeline, X_train, y_train, cv=5, scoring='roc_auc', n_jobs=-1, verbose=0) - print(f'Crossvaledating {target} using {str(model)}') - print(f'Accuracy: {scores.mean():.2%}') - print(f'Std: {scores.std()}') - - # Run the pipeline on test data - pipeline.fit(X_train, y_train) - y_pred = pipeline.predict(X_test) - print(f'Accuracy on test data: {accuracy_score(y_test, y_pred):.2%}') - - # Print ROC AUC score - print(f"ROC AUC: {roc_auc_score(y_test, pipeline.predict_proba(X_test)[:, 1])}") - - return pipeline +# else: +# # Cross validate pipeline +# scores = cross_val_score( +# pipeline, X_train, y_train, cv=5, scoring='roc_auc', n_jobs=-1, verbose=0) +# #print(f'Crossvaledating {target} using {str(model)}') +# #print(f'Accuracy: {scores.mean():.4%}') +# results[name + '_acc'] = scores.mean() +# #print(f'Std: {scores.std():.4%}') +# results[name + '_std'] = scores.std() + +# # Run the pipeline on test data +# pipeline.fit(X_train, y_train) +# y_pred = pipeline.predict(X_test) +# #print(f'Accuracy on test data: {accuracy_score(y_test, y_pred):.4%}') +# results[name + '_acc_test_data'] = accuracy_score(y_test, y_pred) + +# # Print ROC AUC score +# #print(f"ROC AUC: {roc_auc_score(y_test, pipeline.predict_proba(X_test)[:, 1]):.4%}") +# results[name + '_roc_auc'] = roc_auc_score(y_test, pipeline.predict_proba(X_test)[:, 1]) + +# return (pipeline, results) @@ -160,9 +355,6 @@ def data_cleanup(data, config): This function cleans up the data by removing the columns that are not needed ''' - # Remove data before season "2015" - data = data[data['season_Game'] >= 2019] - # Drop all columns with only Nan values data.dropna(axis=1, how='all', inplace=True) @@ -172,19 +364,20 @@ def data_cleanup(data, config): # Remove rows containing NaN values data.dropna(inplace=True) - # Turn all times into a timedelta objects + # Turn all times into a timedelta objects and then to seconds for col in config['columns']['types']['time']: data[col] = pd.to_timedelta(data[col]) # Turn timedelta objects into seconds data[col] = data[col].dt.total_seconds().astype(int) - # Drop all columns in config + # Drop all columns in specified in the config data.drop(config['columns']['drop'], axis=1, inplace=True, errors='ignore') # Get first date in first row as datetime object first_date = pd.to_datetime(data.iloc[0]['gameDate_Game']) + # Change all dates to seconds since first date for col in config['columns']['types']['date']: # Create new column with date difference data[col] = data[col].apply(lambda x: pd.to_datetime(x) - first_date) @@ -192,4 +385,10 @@ def data_cleanup(data, config): # Change col column from datetime object to total seconds data[col] = data[col].dt.total_seconds().astype(int) + # Fix config to work with removed columns + tmp = config['columns']['types']['categorical'].copy() + for name in tmp: + if name not in data.columns: + config['columns']['types']['categorical'].remove(name) + return data From 3316538ba11593f0ecdd9d48e89ae3c4c22ea469 Mon Sep 17 00:00:00 2001 From: Rasmus Rynell Date: Sun, 25 Jul 2021 23:28:21 +0200 Subject: [PATCH 25/26] Redid data generation, scrapped simple models and started work on testing different neural networks --- app/external/configs/default.cfg | 273 ------------ app/external/configs/test.cfg | 270 ------------ .../data_csvs/8471214_2021-05-23-23-00-00.csv | 3 - .../data_csvs/8475167_2021-07-08-00-00-00.csv | 3 - .../data_csvs/8475744_2021-05-23-23-00-00.csv | 3 - .../data_csvs/8476881_2021-05-13-01-00-00.csv | 3 - .../data_csvs/8477492_2021-06-11-01-00-00.csv | 3 - .../data_csvs/8477499_2021-05-08-19-00-00.csv | 3 - .../data_csvs/8477504_2021-06-08-00-00-00.csv | 3 - .../data_csvs/8478463_2021-06-26-00-00-00.csv | 3 - app/external/model_configs/8471214_3.5.cfg | 239 ----------- app/external/model_configs/8471214_4.5.cfg | 239 ----------- app/external/model_configs/8475167_2.5.cfg | 239 ----------- app/external/model_configs/8476881_2.5.cfg | 239 ----------- app/external/model_configs/8477499_1.5.cfg | 239 ----------- app/external/model_configs/8477504_1.5.cfg | 239 ----------- app/external/model_configs/8478463_2.5.cfg | 239 ----------- app/external/player_data/8471214.csv | 3 + app/external/predictions/test.json | 2 +- app/handler.py | 89 ++-- app/main.py | 96 +---- app/source/eval.py | 315 -------------- app/source/nhl_gen.py | 223 +++++++++- app/source/predict.py | 391 +----------------- 24 files changed, 283 insertions(+), 3076 deletions(-) delete mode 100644 app/external/configs/default.cfg delete mode 100644 app/external/configs/test.cfg delete mode 100644 app/external/csvs/data_csvs/8471214_2021-05-23-23-00-00.csv delete mode 100644 app/external/csvs/data_csvs/8475167_2021-07-08-00-00-00.csv delete mode 100644 app/external/csvs/data_csvs/8475744_2021-05-23-23-00-00.csv delete mode 100644 app/external/csvs/data_csvs/8476881_2021-05-13-01-00-00.csv delete mode 100644 app/external/csvs/data_csvs/8477492_2021-06-11-01-00-00.csv delete mode 100644 app/external/csvs/data_csvs/8477499_2021-05-08-19-00-00.csv delete mode 100644 app/external/csvs/data_csvs/8477504_2021-06-08-00-00-00.csv delete mode 100644 app/external/csvs/data_csvs/8478463_2021-06-26-00-00-00.csv delete mode 100644 app/external/model_configs/8471214_3.5.cfg delete mode 100644 app/external/model_configs/8471214_4.5.cfg delete mode 100644 app/external/model_configs/8475167_2.5.cfg delete mode 100644 app/external/model_configs/8476881_2.5.cfg delete mode 100644 app/external/model_configs/8477499_1.5.cfg delete mode 100644 app/external/model_configs/8477504_1.5.cfg delete mode 100644 app/external/model_configs/8478463_2.5.cfg create mode 100644 app/external/player_data/8471214.csv delete mode 100644 app/source/eval.py diff --git a/app/external/configs/default.cfg b/app/external/configs/default.cfg deleted file mode 100644 index dce441f4..00000000 --- a/app/external/configs/default.cfg +++ /dev/null @@ -1,273 +0,0 @@ -{ - "columns": { - "targets": {"active":[ - "O_1.5", - "O_2.5", - "O_3.5", - "O_4.5", - "U_1.5", - "U_2.5", - "U_3.5", - "U_4.5" - ], - "all":[ - "O_1.5", - "O_2.5", - "O_3.5", - "O_4.5", - "U_1.5", - "U_2.5", - "U_3.5", - "U_4.5" - ]}, - "types": - {"time": [ - "timeOnIce_SkaterStats_1_games_back", - "evenTimeOnIce_SkaterStats_1_games_back", - "powerPlayTimeOnIce_SkaterStats_1_games_back", - "shortHandedTimeOnIce_SkaterStats_1_games_back", - - "timeOnIce_SkaterStats_2_games_back", - "evenTimeOnIce_SkaterStats_2_games_back", - "powerPlayTimeOnIce_SkaterStats_2_games_back", - "shortHandedTimeOnIce_SkaterStats_2_games_back", - - "timeOnIce_SkaterStats_3_games_back", - "evenTimeOnIce_SkaterStats_3_games_back", - "powerPlayTimeOnIce_SkaterStats_3_games_back", - "shortHandedTimeOnIce_SkaterStats_3_games_back", - - "timeOnIce_SkaterStats_4_games_back", - "evenTimeOnIce_SkaterStats_4_games_back", - "powerPlayTimeOnIce_SkaterStats_4_games_back", - "shortHandedTimeOnIce_SkaterStats_4_games_back", - - "timeOnIce_SkaterStats_5_games_back", - "evenTimeOnIce_SkaterStats_5_games_back", - "powerPlayTimeOnIce_SkaterStats_5_games_back", - "shortHandedTimeOnIce_SkaterStats_5_games_back" - ], - "date": [ - "gameDate_Game", - "gameDate_Game_1_games_back", - "gameDate_Game_2_games_back", - "gameDate_Game_3_games_back", - "gameDate_Game_4_games_back", - "gameDate_Game_5_games_back" - ], - "categorical" : [ - "gameType_Game", - "position_SkaterStats" - ], - "identifier" : ["gamePk_SkaterStats"] - }, - "drop": [ - "playerId_SkaterStats", - - "timeOnIce_SkaterStats", - "assists_SkaterStats", - "goals_SkaterStats", - "shots_SkaterStats", - "hits_SkaterStats", - "powerPlayGoals_SkaterStats", - "powerPlayAssists_SkaterStats", - "penaltyMinutes_SkaterStats", - "faceOffWins_SkaterStats", - "faceoffTaken_SkaterStats", - "takeaways_SkaterStats", - "giveaways_SkaterStats", - "shortHandedGoals_SkaterStats", - "shortHandedAssists_SkaterStats", - "blocked_SkaterStats", - "plusMinus_SkaterStats", - "evenTimeOnIce_SkaterStats", - "powerPlayTimeOnIce_SkaterStats", - "shortHandedTimeOnIce_SkaterStats", - "added_SkaterStats", - "updated_SkaterStats", - "gamePk_Game", - - - - "abstractGameState_Game", - "codedGameState_Game", - "detailedState_Game", - "statusCode_Game", - "startTimeTBD_Game", - - - "added_Game", - "updated_Game", - "gamePk_PlayerTeamStats", - "teamId_PlayerTeamStats", - "isHome_PlayerTeamStats", - "goals_PlayerTeamStats", - "pim_PlayerTeamStats", - "shots_PlayerTeamStats", - "powerPlayPercentage_PlayerTeamStats", - "powerPlayGoals_PlayerTeamStats", - "powerPlayOpportunities_PlayerTeamStats", - "faceOffWinPercentage_PlayerTeamStats", - "blocked_PlayerTeamStats", - "takeaways_PlayerTeamStats", - "giveaways_PlayerTeamStats", - "hits_PlayerTeamStats", - "goalsAgainst_PlayerTeamStats", - "pimAgainst_PlayerTeamStats", - "shotsAgainst_PlayerTeamStats", - "powerPlayPercentageAgainst_PlayerTeamStats", - "powerPlayGoalsAgainst_PlayerTeamStats", - "powerPlayOpportunitiesAgainst_PlayerTeamStats", - "faceOffWinPercentageAgainst_PlayerTeamStats", - "blockedAgainst_PlayerTeamStats", - "takeawaysAgainst_PlayerTeamStats", - "giveawaysAgainst_PlayerTeamStats", - "hitsAgainst_PlayerTeamStats", - "wins_PlayerTeamStats", - "losses_PlayerTeamStats", - "ot_PlayerTeamStats", - "leagueRecordType_PlayerTeamStats", - "score_PlayerTeamStats", - "added_PlayerTeamStats", - "updated_PlayerTeamStats", - "gamePk_OppTeamStats", - "teamId_OppTeamStats", - "isHome_OppTeamStats", - "goals_OppTeamStats", - "pim_OppTeamStats", - "shots_OppTeamStats", - "powerPlayPercentage_OppTeamStats", - "powerPlayGoals_OppTeamStats", - "powerPlayOpportunities_OppTeamStats", - "faceOffWinPercentage_OppTeamStats", - "blocked_OppTeamStats", - "takeaways_OppTeamStats", - "giveaways_OppTeamStats", - "hits_OppTeamStats", - "goalsAgainst_OppTeamStats", - "pimAgainst_OppTeamStats", - "shotsAgainst_OppTeamStats", - "powerPlayPercentageAgainst_OppTeamStats", - "powerPlayGoalsAgainst_OppTeamStats", - "powerPlayOpportunitiesAgainst_OppTeamStats", - "faceOffWinPercentageAgainst_OppTeamStats", - "blockedAgainst_OppTeamStats", - "takeawaysAgainst_OppTeamStats", - "giveawaysAgainst_OppTeamStats", - "hitsAgainst_OppTeamStats", - "wins_OppTeamStats", - "losses_OppTeamStats", - "ot_OppTeamStats", - "leagueRecordType_OppTeamStats", - "score_OppTeamStats", - "added_OppTeamStats", - "updated_OppTeamStats", - - - "added_SkaterStats_1_games_back", - "updated_SkaterStats_1_games_back", - "gamePk_Game_1_games_back", - "abstractGameState_Game_1_games_back", - "added_Game_1_games_back", - "updated_Game_1_games_back", - "added_PlayerTeamStats_1_games_back", - "updated_PlayerTeamStats_1_games_back", - "added_OppTeamStats_1_games_back", - "updated_OppTeamStats_1_games_back", - "gameType_Game_1_games_back", - "abstractGameState_Game_1_games_back", - "detailedState_Game_1_games_back", - "leagueRecordType_PlayerTeamStats_1_games_back", - "leagueRecordType_OppTeamStats_1_games_back", - "position_SkaterStats_1_games_back", - "gamePk_PlayerTeamStats_1_games_back", - "season_Game_1_games_back", - "gamePk_SkaterStats_1_games_back", - "gamePk_OppTeamStats_1_games_back", - - "added_SkaterStats_2_games_back", - "updated_SkaterStats_2_games_back", - "gamePk_Game_2_games_back", - "abstractGameState_Game_2_games_back", - "added_Game_2_games_back", - "updated_Game_2_games_back", - "added_PlayerTeamStats_2_games_back", - "updated_PlayerTeamStats_2_games_back", - "added_OppTeamStats_2_games_back", - "updated_OppTeamStats_2_games_back", - "gameType_Game_2_games_back", - "abstractGameState_Game_2_games_back", - "detailedState_Game_2_games_back", - "leagueRecordType_PlayerTeamStats_2_games_back", - "leagueRecordType_OppTeamStats_2_games_back", - "position_SkaterStats_2_games_back", - "gamePk_PlayerTeamStats_2_games_back", - "season_Game_2_games_back", - "gamePk_SkaterStats_2_games_back", - "gamePk_OppTeamStats_2_games_back", - - "added_SkaterStats_3_games_back", - "updated_SkaterStats_3_games_back", - "gamePk_Game_3_games_back", - "abstractGameState_Game_3_games_back", - "added_Game_3_games_back", - "updated_Game_3_games_back", - "added_PlayerTeamStats_3_games_back", - "updated_PlayerTeamStats_3_games_back", - "added_OppTeamStats_3_games_back", - "updated_OppTeamStats_3_games_back", - "gameType_Game_3_games_back", - "abstractGameState_Game_3_games_back", - "detailedState_Game_3_games_back", - "leagueRecordType_PlayerTeamStats_3_games_back", - "leagueRecordType_OppTeamStats_3_games_back", - "position_SkaterStats_3_games_back", - "gamePk_PlayerTeamStats_3_games_back", - "season_Game_3_games_back", - "gamePk_SkaterStats_3_games_back", - "gamePk_OppTeamStats_3_games_back", - - "added_SkaterStats_4_games_back", - "updated_SkaterStats_4_games_back", - "gamePk_Game_4_games_back", - "abstractGameState_Game_4_games_back", - "added_Game_4_games_back", - "updated_Game_4_games_back", - "added_PlayerTeamStats_4_games_back", - "updated_PlayerTeamStats_4_games_back", - "added_OppTeamStats_4_games_back", - "updated_OppTeamStats_4_games_back", - "gameType_Game_4_games_back", - "abstractGameState_Game_4_games_back", - "detailedState_Game_4_games_back", - "leagueRecordType_PlayerTeamStats_4_games_back", - "leagueRecordType_OppTeamStats_4_games_back", - "position_SkaterStats_4_games_back", - "gamePk_PlayerTeamStats_4_games_back", - "season_Game_4_games_back", - "gamePk_SkaterStats_4_games_back", - "gamePk_OppTeamStats_4_games_back", - - "added_SkaterStats_5_games_back", - "updated_SkaterStats_5_games_back", - "gamePk_Game_5_games_back", - "abstractGameState_Game_5_games_back", - "added_Game_5_games_back", - "updated_Game_5_games_back", - "added_PlayerTeamStats_5_games_back", - "updated_PlayerTeamStats_5_games_back", - "added_OppTeamStats_5_games_back", - "updated_OppTeamStats_5_games_back", - "gameType_Game_5_games_back", - "abstractGameState_Game_5_games_back", - "detailedState_Game_5_games_back", - "leagueRecordType_PlayerTeamStats_5_games_back", - "leagueRecordType_OppTeamStats_5_games_back", - "position_SkaterStats_5_games_back", - "gamePk_PlayerTeamStats_5_games_back", - "season_Game_5_games_back", - "gamePk_SkaterStats_5_games_back", - "gamePk_OppTeamStats_5_games_back" - ] - } -} \ No newline at end of file diff --git a/app/external/configs/test.cfg b/app/external/configs/test.cfg deleted file mode 100644 index 56243894..00000000 --- a/app/external/configs/test.cfg +++ /dev/null @@ -1,270 +0,0 @@ -{ - "data_path": "8475167.csv", - "save_path": "8475167_results.csv", - "train_test_split": { - "target_col": "U_2.5", - "settings": {"test_size": 0.25, - "random_state": 42, - "shuffle": false} - }, - - "verbose": true, - - "replace_missing_values_with_zero": true, - "drop_all_missing_columns" : true, - "drop_all_missing_rows": true, - - "save_cleaned_csv": true, - - "pipeline": {"settings": {"verbose": true}}, - - "scaler": {"name": "standard", - "settings": {}}, - - "col_transformer": { - "encoders": [{"name": "onehotencoder", - "targets": ["startTimeTBD_Game_1_games_back"], - "settings": {"categories":"auto"} - }], - "settings": {"remainder": "passthrough", - "n_jobs": -1}}, - - "decomposition": {"name": "pca", - "settings": {"n_components": 100}}, - - "model": {"name": "sgd", - "settings": {"penalty": "l2", - "n_jobs": -1}}, - - "cross_validate": {"settings": {"cv": 5, - "scoring": "accuracy"}}, - - "hyperparameter_optimization": {"name": "grid_search", - "params": {"col_transformer__onehotencoder": {"categories":["auto"]}}, - "settings": {"cv":5, "verbose": true, "n_jobs":-1}}, - - - - "remove_cols": [ - "gameType_Game", - "U_4.5", - "O_4.5", - "U_3.5", - "O_3.5", - "U_2.5", - "O_2.5", - "U_1.5", - "O_1.5", - - "playerId_SkaterStats", - "gamePk_SkaterStats", - "position_SkaterStats", - "team_SkaterStats", - - "timeOnIce_SkaterStats", - "assists_SkaterStats", - "goals_SkaterStats", - "shots_SkaterStats", - "hits_SkaterStats", - "powerPlayGoals_SkaterStats", - "powerPlayAssists_SkaterStats", - "penaltyMinutes_SkaterStats", - "faceOffWins_SkaterStats", - "faceoffTaken_SkaterStats", - "takeaways_SkaterStats", - "giveaways_SkaterStats", - "shortHandedGoals_SkaterStats", - "shortHandedAssists_SkaterStats", - "blocked_SkaterStats", - "plusMinus_SkaterStats", - "evenTimeOnIce_SkaterStats", - "powerPlayTimeOnIce_SkaterStats", - "shortHandedTimeOnIce_SkaterStats", - "added_SkaterStats", - "updated_SkaterStats", - "gamePk_Game", - "season_Game", - "gameDate_Game", - "abstractGameState_Game", - "codedGameState_Game", - "detailedState_Game", - "statusCode_Game", - "startTimeTBD_Game", - - "added_Game", - "updated_Game", - "gamePk_PlayerTeamStats", - "teamId_PlayerTeamStats", - "goals_PlayerTeamStats", - "pim_PlayerTeamStats", - "shots_PlayerTeamStats", - "powerPlayPercentage_PlayerTeamStats", - "powerPlayGoals_PlayerTeamStats", - "powerPlayOpportunities_PlayerTeamStats", - "faceOffWinPercentage_PlayerTeamStats", - "blocked_PlayerTeamStats", - "takeaways_PlayerTeamStats", - "giveaways_PlayerTeamStats", - "hits_PlayerTeamStats", - "goalsAgainst_PlayerTeamStats", - "pimAgainst_PlayerTeamStats", - "shotsAgainst_PlayerTeamStats", - "powerPlayPercentageAgainst_PlayerTeamStats", - "powerPlayGoalsAgainst_PlayerTeamStats", - "powerPlayOpportunitiesAgainst_PlayerTeamStats", - "faceOffWinPercentageAgainst_PlayerTeamStats", - "blockedAgainst_PlayerTeamStats", - "takeawaysAgainst_PlayerTeamStats", - "giveawaysAgainst_PlayerTeamStats", - "hitsAgainst_PlayerTeamStats", - "wins_PlayerTeamStats", - "losses_PlayerTeamStats", - "ot_PlayerTeamStats", - "score_PlayerTeamStats", - "added_PlayerTeamStats", - "updated_PlayerTeamStats", - "gamePk_OppTeamStats", - "teamId_OppTeamStats", - "isHome_OppTeamStats", - "goals_OppTeamStats", - "pim_OppTeamStats", - "shots_OppTeamStats", - "powerPlayPercentage_OppTeamStats", - "powerPlayGoals_OppTeamStats", - "powerPlayOpportunities_OppTeamStats", - "faceOffWinPercentage_OppTeamStats", - "blocked_OppTeamStats", - "takeaways_OppTeamStats", - "giveaways_OppTeamStats", - "hits_OppTeamStats", - "goalsAgainst_OppTeamStats", - "pimAgainst_OppTeamStats", - "shotsAgainst_OppTeamStats", - "powerPlayPercentageAgainst_OppTeamStats", - "powerPlayGoalsAgainst_OppTeamStats", - "powerPlayOpportunitiesAgainst_OppTeamStats", - "faceOffWinPercentageAgainst_OppTeamStats", - "blockedAgainst_OppTeamStats", - "takeawaysAgainst_OppTeamStats", - "giveawaysAgainst_OppTeamStats", - "hitsAgainst_OppTeamStats", - "wins_OppTeamStats", - "losses_OppTeamStats", - "ot_OppTeamStats", - "leagueRecordType_OppTeamStats", - "score_OppTeamStats", - "added_OppTeamStats", - "updated_OppTeamStats", - "leagueRecordType_PlayerTeamStats", - - "timeOnIce_SkaterStats_1_games_back", - "evenTimeOnIce_SkaterStats_1_games_back", - "powerPlayTimeOnIce_SkaterStats_1_games_back", - "shortHandedTimeOnIce_SkaterStats_1_games_back", - "added_SkaterStats_1_games_back", - "updated_SkaterStats_1_games_back", - "gamePk_Game_1_games_back", - "gameDate_Game_1_games_back", - "abstractGameState_Game_1_games_back", - "added_Game_1_games_back", - "updated_Game_1_games_back", - "added_PlayerTeamStats_1_games_back", - "updated_PlayerTeamStats_1_games_back", - "added_OppTeamStats_1_games_back", - "updated_OppTeamStats_1_games_back", - "gameType_Game_1_games_back", - "abstractGameState_Game_1_games_back", - "detailedState_Game_1_games_back", - "leagueRecordType_PlayerTeamStats_1_games_back", - "leagueRecordType_OppTeamStats_1_games_back", - "position_SkaterStats_1_games_back", - - "timeOnIce_SkaterStats_2_games_back", - "evenTimeOnIce_SkaterStats_2_games_back", - "powerPlayTimeOnIce_SkaterStats_2_games_back", - "shortHandedTimeOnIce_SkaterStats_2_games_back", - "added_SkaterStats_2_games_back", - "updated_SkaterStats_2_games_back", - "gamePk_Game_2_games_back", - "gameDate_Game_2_games_back", - "abstractGameState_Game_2_games_back", - "added_Game_2_games_back", - "updated_Game_2_games_back", - "added_PlayerTeamStats_2_games_back", - "updated_PlayerTeamStats_2_games_back", - "added_OppTeamStats_2_games_back", - "updated_OppTeamStats_2_games_back", - "gameType_Game_2_games_back", - "abstractGameState_Game_2_games_back", - "detailedState_Game_2_games_back", - "leagueRecordType_PlayerTeamStats_2_games_back", - "leagueRecordType_OppTeamStats_2_games_back", - "position_SkaterStats_2_games_back", - - "timeOnIce_SkaterStats_3_games_back", - "evenTimeOnIce_SkaterStats_3_games_back", - "powerPlayTimeOnIce_SkaterStats_3_games_back", - "shortHandedTimeOnIce_SkaterStats_3_games_back", - "added_SkaterStats_3_games_back", - "updated_SkaterStats_3_games_back", - "gamePk_Game_3_games_back", - "gameDate_Game_3_games_back", - "abstractGameState_Game_3_games_back", - "added_Game_3_games_back", - "updated_Game_3_games_back", - "added_PlayerTeamStats_3_games_back", - "updated_PlayerTeamStats_3_games_back", - "added_OppTeamStats_3_games_back", - "updated_OppTeamStats_3_games_back", - "gameType_Game_3_games_back", - "abstractGameState_Game_3_games_back", - "detailedState_Game_3_games_back", - "leagueRecordType_PlayerTeamStats_3_games_back", - "leagueRecordType_OppTeamStats_3_games_back", - "position_SkaterStats_3_games_back", - - "timeOnIce_SkaterStats_4_games_back", - "evenTimeOnIce_SkaterStats_4_games_back", - "powerPlayTimeOnIce_SkaterStats_4_games_back", - "shortHandedTimeOnIce_SkaterStats_4_games_back", - "added_SkaterStats_4_games_back", - "updated_SkaterStats_4_games_back", - "gamePk_Game_4_games_back", - "gameDate_Game_4_games_back", - "abstractGameState_Game_4_games_back", - "added_Game_4_games_back", - "updated_Game_4_games_back", - "added_PlayerTeamStats_4_games_back", - "updated_PlayerTeamStats_4_games_back", - "added_OppTeamStats_4_games_back", - "updated_OppTeamStats_4_games_back", - "gameType_Game_4_games_back", - "abstractGameState_Game_4_games_back", - "detailedState_Game_4_games_back", - "leagueRecordType_PlayerTeamStats_4_games_back", - "leagueRecordType_OppTeamStats_4_games_back", - "position_SkaterStats_4_games_back", - - "timeOnIce_SkaterStats_5_games_back", - "evenTimeOnIce_SkaterStats_5_games_back", - "powerPlayTimeOnIce_SkaterStats_5_games_back", - "shortHandedTimeOnIce_SkaterStats_5_games_back", - "added_SkaterStats_5_games_back", - "updated_SkaterStats_5_games_back", - "gamePk_Game_5_games_back", - "gameDate_Game_5_games_back", - "abstractGameState_Game_5_games_back", - "added_Game_5_games_back", - "updated_Game_5_games_back", - "added_PlayerTeamStats_5_games_back", - "updated_PlayerTeamStats_5_games_back", - "added_OppTeamStats_5_games_back", - "updated_OppTeamStats_5_games_back", - "gameType_Game_5_games_back", - "abstractGameState_Game_5_games_back", - "detailedState_Game_5_games_back", - "leagueRecordType_PlayerTeamStats_5_games_back", - "leagueRecordType_OppTeamStats_5_games_back", - "position_SkaterStats_5_games_back" - ] -} \ No newline at end of file diff --git a/app/external/csvs/data_csvs/8471214_2021-05-23-23-00-00.csv b/app/external/csvs/data_csvs/8471214_2021-05-23-23-00-00.csv deleted file mode 100644 index d764d04c..00000000 --- a/app/external/csvs/data_csvs/8471214_2021-05-23-23-00-00.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a5e0deb61547ffe6a7165f588e24ceb38a5b1a880941cc704f036f816f0b8cf -size 3150377 diff --git a/app/external/csvs/data_csvs/8475167_2021-07-08-00-00-00.csv b/app/external/csvs/data_csvs/8475167_2021-07-08-00-00-00.csv deleted file mode 100644 index 681461ec..00000000 --- a/app/external/csvs/data_csvs/8475167_2021-07-08-00-00-00.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b45b9e39f712727839078407b71e855de8572d024ae36e7b2e1122ec63985732 -size 3005515 diff --git a/app/external/csvs/data_csvs/8475744_2021-05-23-23-00-00.csv b/app/external/csvs/data_csvs/8475744_2021-05-23-23-00-00.csv deleted file mode 100644 index 83202346..00000000 --- a/app/external/csvs/data_csvs/8475744_2021-05-23-23-00-00.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50717e776b787d96615d0da76cbdee4fb99a8f5d4a34b95817369071140bc685 -size 2076182 diff --git a/app/external/csvs/data_csvs/8476881_2021-05-13-01-00-00.csv b/app/external/csvs/data_csvs/8476881_2021-05-13-01-00-00.csv deleted file mode 100644 index 1ab364d6..00000000 --- a/app/external/csvs/data_csvs/8476881_2021-05-13-01-00-00.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8a1c269ab67ac5373a69afb51d5b6f01cbf6602140104295daf689fff66cdbd -size 1951294 diff --git a/app/external/csvs/data_csvs/8477492_2021-06-11-01-00-00.csv b/app/external/csvs/data_csvs/8477492_2021-06-11-01-00-00.csv deleted file mode 100644 index b2574af6..00000000 --- a/app/external/csvs/data_csvs/8477492_2021-06-11-01-00-00.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b14f59e985b4ec361522b0b6a9c84ac39e21fc41fdcfc235fef79e701b3979d -size 2152449 diff --git a/app/external/csvs/data_csvs/8477499_2021-05-08-19-00-00.csv b/app/external/csvs/data_csvs/8477499_2021-05-08-19-00-00.csv deleted file mode 100644 index 829937c3..00000000 --- a/app/external/csvs/data_csvs/8477499_2021-05-08-19-00-00.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d2000cf97f1243f9f36c3f8ae710a45308a18eac07c4f1b0ef8b4b927c1e44c -size 1861938 diff --git a/app/external/csvs/data_csvs/8477504_2021-06-08-00-00-00.csv b/app/external/csvs/data_csvs/8477504_2021-06-08-00-00-00.csv deleted file mode 100644 index 67aaaed2..00000000 --- a/app/external/csvs/data_csvs/8477504_2021-06-08-00-00-00.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6cbb60c7a8c7705f78c6cea650fd0a35034fecf82a38310695061bb4bf9f0f02 -size 1310939 diff --git a/app/external/csvs/data_csvs/8478463_2021-06-26-00-00-00.csv b/app/external/csvs/data_csvs/8478463_2021-06-26-00-00-00.csv deleted file mode 100644 index dc3cca8f..00000000 --- a/app/external/csvs/data_csvs/8478463_2021-06-26-00-00-00.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b95583b65a81870259f549ac12390330f00729b6b456d9b1edbc962203def1c5 -size 1319741 diff --git a/app/external/model_configs/8471214_3.5.cfg b/app/external/model_configs/8471214_3.5.cfg deleted file mode 100644 index 03b18bc0..00000000 --- a/app/external/model_configs/8471214_3.5.cfg +++ /dev/null @@ -1,239 +0,0 @@ -{ - "LogisticRegression": { - "train_best_score": 0.567945109909823, - "train_best_params": { - "C": 1, - "class_weight": "balanced", - "dual": false, - "fit_intercept": true, - "intercept_scaling": 1, - "l1_ratio": null, - "max_iter": 100, - "multi_class": "auto", - "n_jobs": null, - "penalty": "l1", - "random_state": null, - "solver": "liblinear", - "tol": 0.01, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.4748633879781421, - "test_classification_report": { - "0": { - "precision": 0.39285714285714285, - "recall": 0.5409836065573771, - "f1-score": 0.4551724137931034, - "support": 61 - }, - "1": { - "precision": 0.582089552238806, - "recall": 0.43333333333333335, - "f1-score": 0.4968152866242039, - "support": 90 - }, - "accuracy": 0.4768211920529801, - "macro avg": { - "precision": 0.48747334754797444, - "recall": 0.4871584699453552, - "f1-score": 0.47599385020865365, - "support": 151 - }, - "weighted avg": { - "precision": 0.5056446716276705, - "recall": 0.4768211920529801, - "f1-score": 0.4799926691228984, - "support": 151 - } - } - }, - "SVC": { - "train_best_score": 0.5738738618064151, - "train_best_params": { - "C": 1, - "break_ties": false, - "cache_size": 200, - "class_weight": "balanced", - "coef0": 0.0, - "decision_function_shape": "ovr", - "degree": 3, - "gamma": "scale", - "kernel": "sigmoid", - "max_iter": -1, - "probability": true, - "random_state": null, - "shrinking": true, - "tol": 0.001, - "verbose": false - }, - "test_ROC_AUC": 0.5258652094717668, - "test_classification_report": { - "0": { - "precision": 0.425, - "recall": 0.5573770491803278, - "f1-score": 0.4822695035460992, - "support": 61 - }, - "1": { - "precision": 0.6197183098591549, - "recall": 0.4888888888888889, - "f1-score": 0.5465838509316769, - "support": 90 - }, - "accuracy": 0.5165562913907285, - "macro avg": { - "precision": 0.5223591549295774, - "recall": 0.5231329690346084, - "f1-score": 0.5144266772388881, - "support": 151 - }, - "weighted avg": { - "precision": 0.5410572707769797, - "recall": 0.5165562913907285, - "f1-score": 0.520602558279225, - "support": 151 - } - } - }, - "GaussianNB": { - "train_best_score": 0.5791921684974728, - "train_best_params": { - "priors": null, - "var_smoothing": 0.0001 - }, - "test_ROC_AUC": 0.46921675774134797, - "test_classification_report": { - "0": { - "precision": 0.125, - "recall": 0.01639344262295082, - "f1-score": 0.028985507246376815, - "support": 61 - }, - "1": { - "precision": 0.5804195804195804, - "recall": 0.9222222222222223, - "f1-score": 0.7124463519313305, - "support": 90 - }, - "accuracy": 0.5562913907284768, - "macro avg": { - "precision": 0.3527097902097902, - "recall": 0.46930783242258656, - "f1-score": 0.3707159295888537, - "support": 151 - }, - "weighted avg": { - "precision": 0.3964421340249155, - "recall": 0.5562913907284768, - "f1-score": 0.4363462756016473, - "support": 151 - } - } - }, - "SGDClassifier": { - "train_best_score": 0.5611108696522293, - "train_best_params": { - "alpha": 0.001, - "average": false, - "class_weight": null, - "early_stopping": false, - "epsilon": 0.1, - "eta0": 0.0, - "fit_intercept": true, - "l1_ratio": 0.2, - "learning_rate": "optimal", - "loss": "modified_huber", - "max_iter": 1000, - "n_iter_no_change": 5, - "n_jobs": -1, - "penalty": "elasticnet", - "power_t": 0.5, - "random_state": null, - "shuffle": true, - "tol": 0.001, - "validation_fraction": 0.1, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.5074681238615665, - "test_classification_report": { - "0": { - "precision": 0.4, - "recall": 0.45901639344262296, - "f1-score": 0.4274809160305344, - "support": 61 - }, - "1": { - "precision": 0.5925925925925926, - "recall": 0.5333333333333333, - "f1-score": 0.5614035087719299, - "support": 90 - }, - "accuracy": 0.5033112582781457, - "macro avg": { - "precision": 0.4962962962962963, - "recall": 0.4961748633879781, - "f1-score": 0.49444221240123215, - "support": 151 - }, - "weighted avg": { - "precision": 0.5147902869757175, - "recall": 0.5033112582781457, - "f1-score": 0.5073023289227568, - "support": 151 - } - } - }, - "RandomForestClassifier": { - "train_best_score": 0.5793796520718046, - "train_best_params": { - "bootstrap": true, - "ccp_alpha": 0.0, - "class_weight": "balanced", - "criterion": "gini", - "max_depth": 5, - "max_features": "auto", - "max_leaf_nodes": null, - "max_samples": null, - "min_impurity_decrease": 0.0, - "min_impurity_split": null, - "min_samples_leaf": 1, - "min_samples_split": 4, - "min_weight_fraction_leaf": 0.0, - "n_estimators": 20, - "n_jobs": -1, - "oob_score": false, - "random_state": null, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.44699453551912566, - "test_classification_report": { - "0": { - "precision": 0.30612244897959184, - "recall": 0.2459016393442623, - "f1-score": 0.27272727272727276, - "support": 61 - }, - "1": { - "precision": 0.5490196078431373, - "recall": 0.6222222222222222, - "f1-score": 0.5833333333333334, - "support": 90 - }, - "accuracy": 0.47019867549668876, - "macro avg": { - "precision": 0.4275710284113646, - "recall": 0.4340619307832423, - "f1-score": 0.4280303030303031, - "support": 151 - }, - "weighted avg": { - "precision": 0.4508955900240891, - "recall": 0.47019867549668876, - "f1-score": 0.45785671282360024, - "support": 151 - } - } - } -} \ No newline at end of file diff --git a/app/external/model_configs/8471214_4.5.cfg b/app/external/model_configs/8471214_4.5.cfg deleted file mode 100644 index a12868b4..00000000 --- a/app/external/model_configs/8471214_4.5.cfg +++ /dev/null @@ -1,239 +0,0 @@ -{ - "LogisticRegression": { - "train_best_score": 0.5500706731689501, - "train_best_params": { - "C": 0.1, - "class_weight": null, - "dual": false, - "fit_intercept": true, - "intercept_scaling": 1, - "l1_ratio": null, - "max_iter": 100, - "multi_class": "auto", - "n_jobs": null, - "penalty": "l1", - "random_state": null, - "solver": "liblinear", - "tol": 0.01, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.4819672131147541, - "test_classification_report": { - "0": { - "precision": 0.5894736842105263, - "recall": 0.6222222222222222, - "f1-score": 0.6054054054054053, - "support": 90 - }, - "1": { - "precision": 0.39285714285714285, - "recall": 0.36065573770491804, - "f1-score": 0.37606837606837606, - "support": 61 - }, - "accuracy": 0.5165562913907285, - "macro avg": { - "precision": 0.4911654135338346, - "recall": 0.4914389799635701, - "f1-score": 0.4907368907368907, - "support": 151 - }, - "weighted avg": { - "precision": 0.5100458098889608, - "recall": 0.5165562913907285, - "f1-score": 0.5127593207063404, - "support": 151 - } - } - }, - "SVC": { - "train_best_score": 0.5572473212263084, - "train_best_params": { - "C": 1, - "break_ties": false, - "cache_size": 200, - "class_weight": "balanced", - "coef0": 0.0, - "decision_function_shape": "ovr", - "degree": 3, - "gamma": "scale", - "kernel": "poly", - "max_iter": -1, - "probability": true, - "random_state": null, - "shrinking": true, - "tol": 0.001, - "verbose": false - }, - "test_ROC_AUC": 0.5123861566484517, - "test_classification_report": { - "0": { - "precision": 0.6071428571428571, - "recall": 0.5666666666666667, - "f1-score": 0.5862068965517241, - "support": 90 - }, - "1": { - "precision": 0.417910447761194, - "recall": 0.45901639344262296, - "f1-score": 0.4375, - "support": 61 - }, - "accuracy": 0.5231788079470199, - "macro avg": { - "precision": 0.5125266524520256, - "recall": 0.5128415300546448, - "f1-score": 0.5118534482758621, - "support": 151 - }, - "weighted avg": { - "precision": 0.5306979765317217, - "recall": 0.5231788079470199, - "f1-score": 0.5261332496003653, - "support": 151 - } - } - }, - "GaussianNB": { - "train_best_score": 0.5628785923697082, - "train_best_params": { - "priors": null, - "var_smoothing": 0.0001 - }, - "test_ROC_AUC": 0.45956284153005467, - "test_classification_report": { - "0": { - "precision": 0.5851063829787234, - "recall": 0.6111111111111112, - "f1-score": 0.5978260869565217, - "support": 90 - }, - "1": { - "precision": 0.38596491228070173, - "recall": 0.36065573770491804, - "f1-score": 0.37288135593220334, - "support": 61 - }, - "accuracy": 0.5099337748344371, - "macro avg": { - "precision": 0.4855356476297126, - "recall": 0.4858834244080146, - "f1-score": 0.4853537214443625, - "support": 151 - }, - "weighted avg": { - "precision": 0.5046585040874696, - "recall": 0.5099337748344371, - "f1-score": 0.5069543744235189, - "support": 151 - } - } - }, - "SGDClassifier": { - "train_best_score": 0.5474045178753094, - "train_best_params": { - "alpha": 0.001, - "average": false, - "class_weight": null, - "early_stopping": false, - "epsilon": 0.1, - "eta0": 0.0, - "fit_intercept": true, - "l1_ratio": 0.15, - "learning_rate": "optimal", - "loss": "modified_huber", - "max_iter": 1000, - "n_iter_no_change": 5, - "n_jobs": -1, - "penalty": "elasticnet", - "power_t": 0.5, - "random_state": null, - "shuffle": true, - "tol": 0.001, - "validation_fraction": 0.1, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.46193078324225867, - "test_classification_report": { - "0": { - "precision": 0.5833333333333334, - "recall": 0.4666666666666667, - "f1-score": 0.5185185185185186, - "support": 90 - }, - "1": { - "precision": 0.3924050632911392, - "recall": 0.5081967213114754, - "f1-score": 0.44285714285714284, - "support": 61 - }, - "accuracy": 0.48344370860927155, - "macro avg": { - "precision": 0.4878691983122363, - "recall": 0.48743169398907105, - "f1-score": 0.4806878306878307, - "support": 151 - }, - "weighted avg": { - "precision": 0.5062033699388045, - "recall": 0.48344370860927155, - "f1-score": 0.4879533270261748, - "support": 151 - } - } - }, - "RandomForestClassifier": { - "train_best_score": 0.5682262970664416, - "train_best_params": { - "bootstrap": true, - "ccp_alpha": 0.0, - "class_weight": "balanced", - "criterion": "entropy", - "max_depth": 5, - "max_features": "auto", - "max_leaf_nodes": null, - "max_samples": null, - "min_impurity_decrease": 0.0, - "min_impurity_split": null, - "min_samples_leaf": 1, - "min_samples_split": 8, - "min_weight_fraction_leaf": 0.0, - "n_estimators": 10, - "n_jobs": -1, - "oob_score": false, - "random_state": null, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.44735883424408013, - "test_classification_report": { - "0": { - "precision": 0.5753424657534246, - "recall": 0.4666666666666667, - "f1-score": 0.5153374233128835, - "support": 90 - }, - "1": { - "precision": 0.38461538461538464, - "recall": 0.4918032786885246, - "f1-score": 0.4316546762589928, - "support": 61 - }, - "accuracy": 0.4768211920529801, - "macro avg": { - "precision": 0.47997892518440466, - "recall": 0.4792349726775956, - "f1-score": 0.4734960497859381, - "support": 151 - }, - "weighted avg": { - "precision": 0.49829377734666674, - "recall": 0.4768211920529801, - "f1-score": 0.481531810264623, - "support": 151 - } - } - } -} \ No newline at end of file diff --git a/app/external/model_configs/8475167_2.5.cfg b/app/external/model_configs/8475167_2.5.cfg deleted file mode 100644 index 6a07e8ef..00000000 --- a/app/external/model_configs/8475167_2.5.cfg +++ /dev/null @@ -1,239 +0,0 @@ -{ - "LogisticRegression": { - "train_best_score": 0.6477305908497859, - "train_best_params": { - "C": 0.01, - "class_weight": "balanced", - "dual": false, - "fit_intercept": true, - "intercept_scaling": 1, - "l1_ratio": null, - "max_iter": 100, - "multi_class": "auto", - "n_jobs": null, - "penalty": "l1", - "random_state": null, - "solver": "liblinear", - "tol": 0.001, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.5855874894336432, - "test_classification_report": { - "0": { - "precision": 0.6705882352941176, - "recall": 0.6263736263736264, - "f1-score": 0.6477272727272727, - "support": 91 - }, - "1": { - "precision": 0.41379310344827586, - "recall": 0.46153846153846156, - "f1-score": 0.43636363636363634, - "support": 52 - }, - "accuracy": 0.5664335664335665, - "macro avg": { - "precision": 0.5421906693711968, - "recall": 0.543956043956044, - "f1-score": 0.5420454545454545, - "support": 143 - }, - "weighted avg": { - "precision": 0.5772081873501752, - "recall": 0.5664335664335665, - "f1-score": 0.5708677685950413, - "support": 143 - } - } - }, - "SVC": { - "train_best_score": 0.6286693264170043, - "train_best_params": { - "C": 0.1, - "break_ties": false, - "cache_size": 200, - "class_weight": "balanced", - "coef0": 0.0, - "decision_function_shape": "ovr", - "degree": 3, - "gamma": "scale", - "kernel": "sigmoid", - "max_iter": -1, - "probability": true, - "random_state": null, - "shrinking": true, - "tol": 0.001, - "verbose": false - }, - "test_ROC_AUC": 0.5612848689771767, - "test_classification_report": { - "0": { - "precision": 0.6714285714285714, - "recall": 0.5164835164835165, - "f1-score": 0.5838509316770187, - "support": 91 - }, - "1": { - "precision": 0.3972602739726027, - "recall": 0.5576923076923077, - "f1-score": 0.46399999999999997, - "support": 52 - }, - "accuracy": 0.5314685314685315, - "macro avg": { - "precision": 0.534344422700587, - "recall": 0.5370879120879122, - "f1-score": 0.5239254658385093, - "support": 143 - }, - "weighted avg": { - "precision": 0.57173100871731, - "recall": 0.5314685314685315, - "f1-score": 0.5402687747035574, - "support": 143 - } - } - }, - "GaussianNB": { - "train_best_score": 0.6295238355842071, - "train_best_params": { - "priors": null, - "var_smoothing": 1.0 - }, - "test_ROC_AUC": 0.5564243448858834, - "test_classification_report": { - "0": { - "precision": 0.6428571428571429, - "recall": 0.989010989010989, - "f1-score": 0.7792207792207793, - "support": 91 - }, - "1": { - "precision": 0.6666666666666666, - "recall": 0.038461538461538464, - "f1-score": 0.07272727272727274, - "support": 52 - }, - "accuracy": 0.6433566433566433, - "macro avg": { - "precision": 0.6547619047619048, - "recall": 0.5137362637362638, - "f1-score": 0.425974025974026, - "support": 143 - }, - "weighted avg": { - "precision": 0.6515151515151516, - "recall": 0.6433566433566433, - "f1-score": 0.5223140495867769, - "support": 143 - } - } - }, - "SGDClassifier": { - "train_best_score": 0.6350520048817263, - "train_best_params": { - "alpha": 0.001, - "average": false, - "class_weight": null, - "early_stopping": false, - "epsilon": 0.1, - "eta0": 0.0, - "fit_intercept": true, - "l1_ratio": 0.15, - "learning_rate": "optimal", - "loss": "log", - "max_iter": 1000, - "n_iter_no_change": 5, - "n_jobs": -1, - "penalty": "l1", - "power_t": 0.5, - "random_state": null, - "shuffle": true, - "tol": 0.001, - "validation_fraction": 0.1, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.6115807269653424, - "test_classification_report": { - "0": { - "precision": 0.6341463414634146, - "recall": 0.8571428571428571, - "f1-score": 0.7289719626168224, - "support": 91 - }, - "1": { - "precision": 0.35, - "recall": 0.1346153846153846, - "f1-score": 0.19444444444444445, - "support": 52 - }, - "accuracy": 0.5944055944055944, - "macro avg": { - "precision": 0.4920731707317073, - "recall": 0.49587912087912084, - "f1-score": 0.4617082035306334, - "support": 143 - }, - "weighted avg": { - "precision": 0.530820399113082, - "recall": 0.5944055944055944, - "f1-score": 0.5345983196450487, - "support": 143 - } - } - }, - "RandomForestClassifier": { - "train_best_score": 0.6191494285689333, - "train_best_params": { - "bootstrap": true, - "ccp_alpha": 0.0, - "class_weight": null, - "criterion": "gini", - "max_depth": 5, - "max_features": "auto", - "max_leaf_nodes": null, - "max_samples": null, - "min_impurity_decrease": 0.0, - "min_impurity_split": null, - "min_samples_leaf": 1, - "min_samples_split": 8, - "min_weight_fraction_leaf": 0.0, - "n_estimators": 20, - "n_jobs": -1, - "oob_score": false, - "random_state": null, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.5931952662721893, - "test_classification_report": { - "0": { - "precision": 0.6422764227642277, - "recall": 0.8681318681318682, - "f1-score": 0.7383177570093459, - "support": 91 - }, - "1": { - "precision": 0.4, - "recall": 0.15384615384615385, - "f1-score": 0.2222222222222222, - "support": 52 - }, - "accuracy": 0.6083916083916084, - "macro avg": { - "precision": 0.5211382113821139, - "recall": 0.510989010989011, - "f1-score": 0.48026998961578404, - "support": 143 - }, - "weighted avg": { - "precision": 0.5541759053954176, - "recall": 0.6083916083916084, - "f1-score": 0.5506466534503919, - "support": 143 - } - } - } -} \ No newline at end of file diff --git a/app/external/model_configs/8476881_2.5.cfg b/app/external/model_configs/8476881_2.5.cfg deleted file mode 100644 index 83648bf4..00000000 --- a/app/external/model_configs/8476881_2.5.cfg +++ /dev/null @@ -1,239 +0,0 @@ -{ - "LogisticRegression": { - "train_best_score": 0.5113221643267236, - "train_best_params": { - "C": 10, - "class_weight": "balanced", - "dual": false, - "fit_intercept": true, - "intercept_scaling": 1, - "l1_ratio": null, - "max_iter": 100, - "multi_class": "auto", - "n_jobs": null, - "penalty": "l1", - "random_state": null, - "solver": "liblinear", - "tol": 0.01, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.4444976076555024, - "test_classification_report": { - "0": { - "precision": 0.5423728813559322, - "recall": 0.5818181818181818, - "f1-score": 0.5614035087719298, - "support": 55 - }, - "1": { - "precision": 0.3235294117647059, - "recall": 0.2894736842105263, - "f1-score": 0.30555555555555564, - "support": 38 - }, - "accuracy": 0.46236559139784944, - "macro avg": { - "precision": 0.4329511465603191, - "recall": 0.43564593301435406, - "f1-score": 0.4334795321637427, - "support": 93 - }, - "weighted avg": { - "precision": 0.4529529690498397, - "recall": 0.46236559139784944, - "f1-score": 0.45686348487706724, - "support": 93 - } - } - }, - "SVC": { - "train_best_score": 0.6071942880096376, - "train_best_params": { - "C": 100, - "break_ties": false, - "cache_size": 200, - "class_weight": "balanced", - "coef0": 0.0, - "decision_function_shape": "ovr", - "degree": 3, - "gamma": "scale", - "kernel": "sigmoid", - "max_iter": -1, - "probability": true, - "random_state": null, - "shrinking": true, - "tol": 0.001, - "verbose": false - }, - "test_ROC_AUC": 0.48421052631578954, - "test_classification_report": { - "0": { - "precision": 0.5106382978723404, - "recall": 0.43636363636363634, - "f1-score": 0.4705882352941176, - "support": 55 - }, - "1": { - "precision": 0.32608695652173914, - "recall": 0.39473684210526316, - "f1-score": 0.35714285714285715, - "support": 38 - }, - "accuracy": 0.41935483870967744, - "macro avg": { - "precision": 0.41836262719703976, - "recall": 0.4155502392344498, - "f1-score": 0.41386554621848737, - "support": 93 - }, - "weighted avg": { - "precision": 0.4352302229118797, - "recall": 0.41935483870967744, - "f1-score": 0.4242342098129574, - "support": 93 - } - } - }, - "GaussianNB": { - "train_best_score": 0.5688871445311415, - "train_best_params": { - "priors": null, - "var_smoothing": 0.1 - }, - "test_ROC_AUC": 0.5066985645933015, - "test_classification_report": { - "0": { - "precision": 0.5842696629213483, - "recall": 0.9454545454545454, - "f1-score": 0.7222222222222222, - "support": 55 - }, - "1": { - "precision": 0.25, - "recall": 0.02631578947368421, - "f1-score": 0.04761904761904762, - "support": 38 - }, - "accuracy": 0.5698924731182796, - "macro avg": { - "precision": 0.41713483146067415, - "recall": 0.4858851674641148, - "f1-score": 0.38492063492063494, - "support": 93 - }, - "weighted avg": { - "precision": 0.44768635979219523, - "recall": 0.5698924731182796, - "f1-score": 0.4465779143198498, - "support": 93 - } - } - }, - "SGDClassifier": { - "train_best_score": 0.5757026439309876, - "train_best_params": { - "alpha": 1e-05, - "average": false, - "class_weight": null, - "early_stopping": false, - "epsilon": 0.1, - "eta0": 0.0, - "fit_intercept": true, - "l1_ratio": 0.2, - "learning_rate": "optimal", - "loss": "log", - "max_iter": 1000, - "n_iter_no_change": 5, - "n_jobs": -1, - "penalty": "l2", - "power_t": 0.5, - "random_state": null, - "shuffle": true, - "tol": 0.001, - "validation_fraction": 0.1, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.5464114832535886, - "test_classification_report": { - "0": { - "precision": 0.5964912280701754, - "recall": 0.6181818181818182, - "f1-score": 0.607142857142857, - "support": 55 - }, - "1": { - "precision": 0.4166666666666667, - "recall": 0.39473684210526316, - "f1-score": 0.40540540540540543, - "support": 38 - }, - "accuracy": 0.5268817204301075, - "macro avg": { - "precision": 0.506578947368421, - "recall": 0.5064593301435407, - "f1-score": 0.5062741312741312, - "support": 93 - }, - "weighted avg": { - "precision": 0.5230145255612149, - "recall": 0.5268817204301075, - "f1-score": 0.524712500518952, - "support": 93 - } - } - }, - "RandomForestClassifier": { - "train_best_score": 0.5829460168335547, - "train_best_params": { - "bootstrap": true, - "ccp_alpha": 0.0, - "class_weight": "balanced", - "criterion": "entropy", - "max_depth": 10, - "max_features": "auto", - "max_leaf_nodes": null, - "max_samples": null, - "min_impurity_decrease": 0.0, - "min_impurity_split": null, - "min_samples_leaf": 4, - "min_samples_split": 8, - "min_weight_fraction_leaf": 0.0, - "n_estimators": 10, - "n_jobs": -1, - "oob_score": false, - "random_state": null, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.47368421052631576, - "test_classification_report": { - "0": { - "precision": 0.5633802816901409, - "recall": 0.7272727272727273, - "f1-score": 0.634920634920635, - "support": 55 - }, - "1": { - "precision": 0.3181818181818182, - "recall": 0.18421052631578946, - "f1-score": 0.23333333333333334, - "support": 38 - }, - "accuracy": 0.5053763440860215, - "macro avg": { - "precision": 0.44078104993597955, - "recall": 0.4557416267942584, - "f1-score": 0.43412698412698414, - "support": 93 - }, - "weighted avg": { - "precision": 0.46319166219211655, - "recall": 0.5053763440860215, - "f1-score": 0.47083119986345795, - "support": 93 - } - } - } -} \ No newline at end of file diff --git a/app/external/model_configs/8477499_1.5.cfg b/app/external/model_configs/8477499_1.5.cfg deleted file mode 100644 index 2fb599a2..00000000 --- a/app/external/model_configs/8477499_1.5.cfg +++ /dev/null @@ -1,239 +0,0 @@ -{ - "LogisticRegression": { - "train_best_score": 0.5722108701340067, - "train_best_params": { - "C": 0.1, - "class_weight": "balanced", - "dual": false, - "fit_intercept": true, - "intercept_scaling": 1, - "l1_ratio": null, - "max_iter": 100, - "multi_class": "auto", - "n_jobs": null, - "penalty": "l1", - "random_state": null, - "solver": "liblinear", - "tol": 0.01, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.5623529411764706, - "test_classification_report": { - "0": { - "precision": 0.532258064516129, - "recall": 0.66, - "f1-score": 0.5892857142857142, - "support": 50 - }, - "1": { - "precision": 0.5641025641025641, - "recall": 0.43137254901960786, - "f1-score": 0.48888888888888893, - "support": 51 - }, - "accuracy": 0.5445544554455446, - "macro avg": { - "precision": 0.5481803143093466, - "recall": 0.5456862745098039, - "f1-score": 0.5390873015873016, - "support": 101 - }, - "weighted avg": { - "precision": 0.5483379603469032, - "recall": 0.5445544554455446, - "f1-score": 0.5385902876001886, - "support": 101 - } - } - }, - "SVC": { - "train_best_score": 0.5755632510313436, - "train_best_params": { - "C": 0.01, - "break_ties": false, - "cache_size": 200, - "class_weight": "balanced", - "coef0": 0.0, - "decision_function_shape": "ovr", - "degree": 3, - "gamma": "scale", - "kernel": "linear", - "max_iter": -1, - "probability": true, - "random_state": null, - "shrinking": true, - "tol": 0.001, - "verbose": false - }, - "test_ROC_AUC": 0.5701960784313725, - "test_classification_report": { - "0": { - "precision": 0.5161290322580645, - "recall": 0.64, - "f1-score": 0.5714285714285714, - "support": 50 - }, - "1": { - "precision": 0.5384615384615384, - "recall": 0.4117647058823529, - "f1-score": 0.4666666666666667, - "support": 51 - }, - "accuracy": 0.5247524752475248, - "macro avg": { - "precision": 0.5272952853598014, - "recall": 0.5258823529411765, - "f1-score": 0.519047619047619, - "support": 101 - }, - "weighted avg": { - "precision": 0.5274058423212048, - "recall": 0.5247524752475248, - "f1-score": 0.5185289957567185, - "support": 101 - } - } - }, - "GaussianNB": { - "train_best_score": 0.5749104336753043, - "train_best_params": { - "priors": null, - "var_smoothing": 1.0 - }, - "test_ROC_AUC": 0.6352941176470588, - "test_classification_report": { - "0": { - "precision": 0.0, - "recall": 0.0, - "f1-score": 0.0, - "support": 50 - }, - "1": { - "precision": 0.504950495049505, - "recall": 1.0, - "f1-score": 0.6710526315789473, - "support": 51 - }, - "accuracy": 0.504950495049505, - "macro avg": { - "precision": 0.2524752475247525, - "recall": 0.5, - "f1-score": 0.3355263157894737, - "support": 101 - }, - "weighted avg": { - "precision": 0.2549750024507401, - "recall": 0.504950495049505, - "f1-score": 0.3388483585200625, - "support": 101 - } - } - }, - "SGDClassifier": { - "train_best_score": 0.5759067569335427, - "train_best_params": { - "alpha": 0.001, - "average": false, - "class_weight": null, - "early_stopping": false, - "epsilon": 0.1, - "eta0": 0.0, - "fit_intercept": true, - "l1_ratio": 0.1, - "learning_rate": "optimal", - "loss": "modified_huber", - "max_iter": 1000, - "n_iter_no_change": 5, - "n_jobs": -1, - "penalty": "l1", - "power_t": 0.5, - "random_state": null, - "shuffle": true, - "tol": 0.001, - "validation_fraction": 0.1, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.42666666666666675, - "test_classification_report": { - "0": { - "precision": 0.41025641025641024, - "recall": 0.32, - "f1-score": 0.35955056179775285, - "support": 50 - }, - "1": { - "precision": 0.45161290322580644, - "recall": 0.5490196078431373, - "f1-score": 0.49557522123893805, - "support": 51 - }, - "accuracy": 0.43564356435643564, - "macro avg": { - "precision": 0.4309346567411083, - "recall": 0.4345098039215687, - "f1-score": 0.4275628915183455, - "support": 101 - }, - "weighted avg": { - "precision": 0.4311393918548182, - "recall": 0.43564356435643564, - "f1-score": 0.4282362809215196, - "support": 101 - } - } - }, - "RandomForestClassifier": { - "train_best_score": 0.6040532440421146, - "train_best_params": { - "bootstrap": true, - "ccp_alpha": 0.0, - "class_weight": null, - "criterion": "gini", - "max_depth": 5, - "max_features": "auto", - "max_leaf_nodes": null, - "max_samples": null, - "min_impurity_decrease": 0.0, - "min_impurity_split": null, - "min_samples_leaf": 4, - "min_samples_split": 4, - "min_weight_fraction_leaf": 0.0, - "n_estimators": 20, - "n_jobs": -1, - "oob_score": false, - "random_state": null, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.5301960784313726, - "test_classification_report": { - "0": { - "precision": 0.5833333333333334, - "recall": 0.14, - "f1-score": 0.22580645161290325, - "support": 50 - }, - "1": { - "precision": 0.5168539325842697, - "recall": 0.9019607843137255, - "f1-score": 0.6571428571428573, - "support": 51 - }, - "accuracy": 0.5247524752475248, - "macro avg": { - "precision": 0.5500936329588015, - "recall": 0.5209803921568628, - "f1-score": 0.44147465437788025, - "support": 101 - }, - "weighted avg": { - "precision": 0.5497645270144992, - "recall": 0.5247524752475248, - "f1-score": 0.44360998311812755, - "support": 101 - } - } - } -} \ No newline at end of file diff --git a/app/external/model_configs/8477504_1.5.cfg b/app/external/model_configs/8477504_1.5.cfg deleted file mode 100644 index 78e159e2..00000000 --- a/app/external/model_configs/8477504_1.5.cfg +++ /dev/null @@ -1,239 +0,0 @@ -{ - "LogisticRegression": { - "train_best_score": 0.6058073826961718, - "train_best_params": { - "C": 0.001, - "class_weight": "balanced", - "dual": false, - "fit_intercept": true, - "intercept_scaling": 1, - "l1_ratio": null, - "max_iter": 100, - "multi_class": "auto", - "n_jobs": null, - "penalty": "l2", - "random_state": null, - "solver": "liblinear", - "tol": 0.01, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.6221590909090909, - "test_classification_report": { - "0": { - "precision": 0.5833333333333334, - "recall": 0.6363636363636364, - "f1-score": 0.6086956521739131, - "support": 33 - }, - "1": { - "precision": 0.5862068965517241, - "recall": 0.53125, - "f1-score": 0.5573770491803278, - "support": 32 - }, - "accuracy": 0.5846153846153846, - "macro avg": { - "precision": 0.5847701149425287, - "recall": 0.5838068181818181, - "f1-score": 0.5830363506771205, - "support": 65 - }, - "weighted avg": { - "precision": 0.5847480106100796, - "recall": 0.5846153846153846, - "f1-score": 0.5834311091616865, - "support": 65 - } - } - }, - "SVC": { - "train_best_score": 0.624150794388857, - "train_best_params": { - "C": 0.1, - "break_ties": false, - "cache_size": 200, - "class_weight": "balanced", - "coef0": 0.0, - "decision_function_shape": "ovr", - "degree": 3, - "gamma": "scale", - "kernel": "poly", - "max_iter": -1, - "probability": true, - "random_state": null, - "shrinking": true, - "tol": 0.001, - "verbose": false - }, - "test_ROC_AUC": 0.5776515151515151, - "test_classification_report": { - "0": { - "precision": 0.5357142857142857, - "recall": 0.45454545454545453, - "f1-score": 0.49180327868852464, - "support": 33 - }, - "1": { - "precision": 0.5135135135135135, - "recall": 0.59375, - "f1-score": 0.5507246376811593, - "support": 32 - }, - "accuracy": 0.5230769230769231, - "macro avg": { - "precision": 0.5246138996138996, - "recall": 0.5241477272727273, - "f1-score": 0.521263958184842, - "support": 65 - }, - "weighted avg": { - "precision": 0.5247846747846747, - "recall": 0.5230769230769231, - "f1-score": 0.5208107169618217, - "support": 65 - } - } - }, - "GaussianNB": { - "train_best_score": 0.5922468979642451, - "train_best_params": { - "priors": null, - "var_smoothing": 1.0 - }, - "test_ROC_AUC": 0.5482954545454546, - "test_classification_report": { - "0": { - "precision": 0.5172413793103449, - "recall": 0.9090909090909091, - "f1-score": 0.6593406593406593, - "support": 33 - }, - "1": { - "precision": 0.5714285714285714, - "recall": 0.125, - "f1-score": 0.20512820512820512, - "support": 32 - }, - "accuracy": 0.5230769230769231, - "macro avg": { - "precision": 0.5443349753694582, - "recall": 0.5170454545454546, - "f1-score": 0.43223443223443225, - "support": 65 - }, - "weighted avg": { - "precision": 0.5439181508147025, - "recall": 0.5230769230769231, - "f1-score": 0.4357283741899126, - "support": 65 - } - } - }, - "SGDClassifier": { - "train_best_score": 0.6011552833486745, - "train_best_params": { - "alpha": 0.001, - "average": false, - "class_weight": null, - "early_stopping": false, - "epsilon": 0.1, - "eta0": 0.0, - "fit_intercept": true, - "l1_ratio": 0.2, - "learning_rate": "optimal", - "loss": "modified_huber", - "max_iter": 1000, - "n_iter_no_change": 5, - "n_jobs": -1, - "penalty": "l1", - "power_t": 0.5, - "random_state": null, - "shuffle": true, - "tol": 0.001, - "validation_fraction": 0.1, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.5828598484848485, - "test_classification_report": { - "0": { - "precision": 0.5555555555555556, - "recall": 0.7575757575757576, - "f1-score": 0.6410256410256411, - "support": 33 - }, - "1": { - "precision": 0.6, - "recall": 0.375, - "f1-score": 0.4615384615384615, - "support": 32 - }, - "accuracy": 0.5692307692307692, - "macro avg": { - "precision": 0.5777777777777777, - "recall": 0.5662878787878788, - "f1-score": 0.5512820512820513, - "support": 65 - }, - "weighted avg": { - "precision": 0.5774358974358974, - "recall": 0.5692307692307692, - "f1-score": 0.5526627218934912, - "support": 65 - } - } - }, - "RandomForestClassifier": { - "train_best_score": 0.6711907485059472, - "train_best_params": { - "bootstrap": true, - "ccp_alpha": 0.0, - "class_weight": "balanced", - "criterion": "entropy", - "max_depth": null, - "max_features": "auto", - "max_leaf_nodes": null, - "max_samples": null, - "min_impurity_decrease": 0.0, - "min_impurity_split": null, - "min_samples_leaf": 4, - "min_samples_split": 4, - "min_weight_fraction_leaf": 0.0, - "n_estimators": 10, - "n_jobs": -1, - "oob_score": false, - "random_state": null, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.47537878787878785, - "test_classification_report": { - "0": { - "precision": 0.48484848484848486, - "recall": 0.48484848484848486, - "f1-score": 0.48484848484848486, - "support": 33 - }, - "1": { - "precision": 0.46875, - "recall": 0.46875, - "f1-score": 0.46875, - "support": 32 - }, - "accuracy": 0.47692307692307695, - "macro avg": { - "precision": 0.47679924242424243, - "recall": 0.47679924242424243, - "f1-score": 0.47679924242424243, - "support": 65 - }, - "weighted avg": { - "precision": 0.47692307692307695, - "recall": 0.47692307692307695, - "f1-score": 0.47692307692307695, - "support": 65 - } - } - } -} \ No newline at end of file diff --git a/app/external/model_configs/8478463_2.5.cfg b/app/external/model_configs/8478463_2.5.cfg deleted file mode 100644 index 3c9ea7e9..00000000 --- a/app/external/model_configs/8478463_2.5.cfg +++ /dev/null @@ -1,239 +0,0 @@ -{ - "LogisticRegression": { - "train_best_score": 0.5945906724854093, - "train_best_params": { - "C": 0.001, - "class_weight": "balanced", - "dual": false, - "fit_intercept": true, - "intercept_scaling": 1, - "l1_ratio": null, - "max_iter": 100, - "multi_class": "auto", - "n_jobs": null, - "penalty": "l2", - "random_state": null, - "solver": "liblinear", - "tol": 0.01, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.6126984126984127, - "test_classification_report": { - "0": { - "precision": 0.75, - "recall": 0.4666666666666667, - "f1-score": 0.5753424657534245, - "support": 45 - }, - "1": { - "precision": 0.3684210526315789, - "recall": 0.6666666666666666, - "f1-score": 0.4745762711864407, - "support": 21 - }, - "accuracy": 0.5303030303030303, - "macro avg": { - "precision": 0.5592105263157895, - "recall": 0.5666666666666667, - "f1-score": 0.5249593684699326, - "support": 66 - }, - "weighted avg": { - "precision": 0.6285885167464115, - "recall": 0.5303030303030303, - "f1-score": 0.5432804947548387, - "support": 66 - } - } - }, - "SVC": { - "train_best_score": 0.634612580402054, - "train_best_params": { - "C": 1, - "break_ties": false, - "cache_size": 200, - "class_weight": null, - "coef0": 0.0, - "decision_function_shape": "ovr", - "degree": 3, - "gamma": "scale", - "kernel": "poly", - "max_iter": -1, - "probability": true, - "random_state": null, - "shrinking": true, - "tol": 0.001, - "verbose": false - }, - "test_ROC_AUC": 0.5428571428571429, - "test_classification_report": { - "0": { - "precision": 0.6923076923076923, - "recall": 1.0, - "f1-score": 0.8181818181818181, - "support": 45 - }, - "1": { - "precision": 1.0, - "recall": 0.047619047619047616, - "f1-score": 0.0909090909090909, - "support": 21 - }, - "accuracy": 0.696969696969697, - "macro avg": { - "precision": 0.8461538461538461, - "recall": 0.5238095238095238, - "f1-score": 0.45454545454545453, - "support": 66 - }, - "weighted avg": { - "precision": 0.7902097902097902, - "recall": 0.696969696969697, - "f1-score": 0.5867768595041322, - "support": 66 - } - } - }, - "GaussianNB": { - "train_best_score": 0.6101091890565574, - "train_best_params": { - "priors": null, - "var_smoothing": 0.1 - }, - "test_ROC_AUC": 0.62010582010582, - "test_classification_report": { - "0": { - "precision": 0.7068965517241379, - "recall": 0.9111111111111111, - "f1-score": 0.7961165048543689, - "support": 45 - }, - "1": { - "precision": 0.5, - "recall": 0.19047619047619047, - "f1-score": 0.27586206896551724, - "support": 21 - }, - "accuracy": 0.6818181818181818, - "macro avg": { - "precision": 0.603448275862069, - "recall": 0.5507936507936508, - "f1-score": 0.5359892869099431, - "support": 66 - }, - "weighted avg": { - "precision": 0.6410658307210031, - "recall": 0.6818181818181818, - "f1-score": 0.630581002526098, - "support": 66 - } - } - }, - "SGDClassifier": { - "train_best_score": 0.6149532923217133, - "train_best_params": { - "alpha": 0.0001, - "average": false, - "class_weight": null, - "early_stopping": false, - "epsilon": 0.1, - "eta0": 0.0, - "fit_intercept": true, - "l1_ratio": 0.1, - "learning_rate": "optimal", - "loss": "log", - "max_iter": 1000, - "n_iter_no_change": 5, - "n_jobs": -1, - "penalty": "elasticnet", - "power_t": 0.5, - "random_state": null, - "shuffle": true, - "tol": 0.001, - "validation_fraction": 0.1, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.553968253968254, - "test_classification_report": { - "0": { - "precision": 0.7111111111111111, - "recall": 0.7111111111111111, - "f1-score": 0.7111111111111111, - "support": 45 - }, - "1": { - "precision": 0.38095238095238093, - "recall": 0.38095238095238093, - "f1-score": 0.38095238095238093, - "support": 21 - }, - "accuracy": 0.6060606060606061, - "macro avg": { - "precision": 0.5460317460317461, - "recall": 0.5460317460317461, - "f1-score": 0.5460317460317461, - "support": 66 - }, - "weighted avg": { - "precision": 0.6060606060606061, - "recall": 0.6060606060606061, - "f1-score": 0.6060606060606061, - "support": 66 - } - } - }, - "RandomForestClassifier": { - "train_best_score": 0.6541816078658185, - "train_best_params": { - "bootstrap": true, - "ccp_alpha": 0.0, - "class_weight": null, - "criterion": "entropy", - "max_depth": null, - "max_features": "auto", - "max_leaf_nodes": null, - "max_samples": null, - "min_impurity_decrease": 0.0, - "min_impurity_split": null, - "min_samples_leaf": 4, - "min_samples_split": 2, - "min_weight_fraction_leaf": 0.0, - "n_estimators": 10, - "n_jobs": -1, - "oob_score": false, - "random_state": null, - "verbose": 0, - "warm_start": false - }, - "test_ROC_AUC": 0.6100529100529101, - "test_classification_report": { - "0": { - "precision": 0.6885245901639344, - "recall": 0.9333333333333333, - "f1-score": 0.7924528301886792, - "support": 45 - }, - "1": { - "precision": 0.4, - "recall": 0.09523809523809523, - "f1-score": 0.15384615384615385, - "support": 21 - }, - "accuracy": 0.6666666666666666, - "macro avg": { - "precision": 0.5442622950819672, - "recall": 0.5142857142857142, - "f1-score": 0.4731494920174165, - "support": 66 - }, - "weighted avg": { - "precision": 0.5967213114754099, - "recall": 0.6666666666666666, - "f1-score": 0.5892597968069666, - "support": 66 - } - } - } -} \ No newline at end of file diff --git a/app/external/player_data/8471214.csv b/app/external/player_data/8471214.csv new file mode 100644 index 00000000..461ac56d --- /dev/null +++ b/app/external/player_data/8471214.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f87a26a63c8624b6201644c151733b5984341f2dadfb78f0b25a28ff3908cc69 +size 4982021 diff --git a/app/external/predictions/test.json b/app/external/predictions/test.json index f144d66c..71618b6c 100644 --- a/app/external/predictions/test.json +++ b/app/external/predictions/test.json @@ -1 +1 @@ -[{"game_id": "2020020730", "player_id": 8471214, "date": "2021-04-22", "predictions": null}, {"game_id": "2020020048", "player_id": 8475167, "date": "2021-05-07", "predictions": null}, {"game_id": "2020020839", "player_id": 8478463, "date": "2021-05-24", "predictions": null}, {"game_id": "2020020814", "player_id": 8475744, "date": "2021-05-03", "predictions": null}, {"game_id": "2020020834", "player_id": 8477504, "date": "2021-05-05", "predictions": null}, {"game_id": "2020030154", "player_id": 8477492, "date": "2021-05-22", "predictions": null}, {"game_id": "2020020162", "player_id": 8476881, "date": "2021-05-12", "predictions": null}, {"game_id": "2020020842", "player_id": 8477499, "date": "2021-05-06", "predictions": null}, {"game_id": "2020020162", "player_id": 8476881, "date": "2021-05-12", "predictions": null}] \ No newline at end of file +{"8471214": {"2020020458": {"game_date": "2020-03-16", "odds": [{"bet365": {"3.5": {"Over": "1.71", "Under": "2.0"}}}], "predictions": {}}}} \ No newline at end of file diff --git a/app/handler.py b/app/handler.py index 1c57e706..936abd85 100644 --- a/app/handler.py +++ b/app/handler.py @@ -8,7 +8,6 @@ from source.bets_handler import * from source.nhl_handler import * from source.nhl_gen import * -from source.eval import * from source.predict import * from tqdm import tqdm from datetime import date, datetime, timedelta @@ -95,68 +94,76 @@ def generate_csv(player_id): global Session_nhl nhl_session = Session_nhl() - data, file_name = generate_data_for(player_id, nhl_session, 5, "all") + data = generate_data_for(player_id, nhl_session, 5, "all") nhl_session.close() - return (data, file_name) + return data def save_csv(df, path): - df.to_csv(f"./external/csvs/data_csvs/{path}", sep=';', encoding='utf-8', index=False) - - -def evaluate_setup(config): - return run_eval_pipeline(config) - - + df.to_csv(f"./external/player_data/{path}", sep=';', encoding='utf-8', index=False) # A function that check if data of player contains data for game -def get_data_from_file(player_id, date): - date = datetime.strptime(date, '%Y-%m-%d') +def get_data_from_file(player_id): # Loop through all files in folder oldpwd=os.getcwd() - os.chdir("./external/csvs/data_csvs/") + os.chdir("./external/player_data/") for file in glob.glob("*"): file_name = file.split(".")[0] - file_player_id, file_date = file_name.split("_") - file_date = datetime.strptime(file_date, '%Y-%m-%d-%H-%M-%S') - if str(player_id) == str(file_player_id) and date <= file_date: + if str(player_id) == str(file_name): os.chdir(oldpwd) - return pd.read_csv("./external/csvs/data_csvs/" + file, sep=';', encoding='utf-8') + return pd.read_csv("./external/player_data/" + file, sep=';', encoding='utf-8') os.chdir(oldpwd) print("No sufficient file found, generating one") - data, game_date = generate_csv(player_id) - game_date = str(game_date).replace(" ", "-").replace(":", "-") - save_csv(data, str(player_id) + "_" + str(game_date) + ".csv") - return str(player_id) + "_" + str(game_date) + ".csv" + data = generate_csv(player_id) + save_csv(data, str(player_id) + ".csv") + + return data + + +def predict_games(org_bets): + for player_id, values in tqdm(org_bets.items()): + over_under_games = {} + for game_id, game in values.items(): + for sites in game['odds']: + for site_name, bets in sites.items(): + for O_U in bets.keys(): + if O_U not in list(over_under_games.keys()): + over_under_games[O_U] = [] + over_under_games[O_U].append(game_id) + + for target, games in over_under_games.items(): + # Load data for player + data = get_data_from_file(player_id) + + predictions = predict_game(data, target, games) + + for game_id, bets in predictions.items(): + org_bets[player_id][game_id]['predictions'][target] = bets + + + + + -def predict_games(games): - results = [] - for game in tqdm(games): - print(f"Predicting player: {game['player_id']} in game {game['game_id']}") - # Todo: Generate data if doesn't exist - data = get_data_from_file(game['player_id'], game['date']) + # for target in tqdm(game["target"]): + # print(f"Predicting player: {game['player_id']} in game {game['game_ids']}") - # Read config from file - config = None - with open(game['config']) as f: - config = json.loads(f.read()) + # # Todo: Generate data if doesn't exist + # data = get_data_from_file(game['player_id'], game['date']) + # # Generate predictions + # predictions = predict_game(data, game['game_ids'], target) - # Generate predictions - predictions = predict_game(data, config, game['game_id'], game['player_id'], game['target']) - - # Add predictions to results - results.append({'game_id': game['game_id'], - 'player_id': game['player_id'], - 'date': game['date'], - 'predictions': predictions - }) + # # Add predictions to results + # results.append({'player_id': game['player_id'], + # 'predictions': predictions + # }) - return results \ No newline at end of file + return org_bets \ No newline at end of file diff --git a/app/main.py b/app/main.py index 2b7af54e..11e1cb53 100644 --- a/app/main.py +++ b/app/main.py @@ -52,89 +52,31 @@ def print_help(): print("Bets database updated") elif arg_in.lower() == 'gen': - player_ids = [8471214, 8475167, 8478463, 8475744, 8477504, 8477492, 8480839, 8477499, 8476881] + player_ids = [8471214]#, 8475167, 8478463, 8475744, 8477504, 8477492, 8480839, 8477499, 8476881] for player_id in player_ids: - data, game_date = generate_csv(player_id) - game_date = str(game_date).replace(" ", "-").replace(":", "-") - save_csv(data, str(player_id) + "_" + str(game_date) + ".csv") + data = generate_csv(player_id) + save_csv(data, str(player_id) + ".csv") - elif arg_in.lower() == 'eval': - # Feature extraction / selection - # From file or from "input" - extract_and_select_var = {} - with open('./external/configs/test.cfg') as f: - extract_and_select_var = json.loads(f.read()) - save_csv(evaluate_setup(extract_and_select_var), extract_and_select_var['save_path']) - elif arg_in.lower() == 'pred': - games = [ - { - 'player_id': 8471214, - 'game_id': '2020020730', - 'date': '2021-04-22', - 'target': ['3.5', '4.5'], - 'config': "./external/configs/default.cfg" - }, - { - 'player_id': 8475167, - 'game_id': '2020020048', - 'date': "2021-05-07", - 'target': ['2.5'], - 'config': "./external/configs/default.cfg" - }, - { - 'player_id': 8478463, - 'game_id': '2020020839', - 'date': "2021-05-24", - 'target': ['2.5'], - 'config': "./external/configs/default.cfg" - }, - { - 'player_id': 8475744, - 'game_id': '2020020814', - 'date': '2021-05-03', - 'target': ['1.5'], - 'config': "./external/configs/default.cfg" - }, - { - 'player_id': 8477504, - 'game_id': '2020020834', - 'date': '2021-05-05', - 'target': ['1.5'], - 'config': "./external/configs/default.cfg" - }, - { - 'player_id': 8477492, - 'game_id': '2020030154', - 'date': '2021-05-22', - 'target': ['3.5'], - 'config': "./external/configs/default.cfg" - }, - { - 'player_id': 8476881, - 'game_id': '2020020162', - 'date': '2021-05-12', - 'target': ['2.5'], - 'config': "./external/configs/default.cfg" - }, - { - 'player_id': 8477499, - 'game_id': '2020020842', - 'date': '2021-05-06', - 'target': ['1.5'], - 'config': "./external/configs/default.cfg" - }, - { - 'player_id': 8476881, - 'game_id': '2020020162', - 'date': '2021-05-12', - 'target': ['2.5'], - 'config': "./external/configs/default.cfg" + bets = { + '8471214' : { + '2020020458' : { + 'game_date' : '2020-03-16', + 'odds' : [{ + 'bet365': { + '3.5': { + 'Over' : '1.71', + 'Under' : '2.0' + } + } + }], + 'predictions': {} + } + } } - ] - predictions = predict_games(games) + predictions = predict_games(bets) # Save predictions dict to a file with open('./external/predictions/test.json', 'w') as f: diff --git a/app/source/eval.py b/app/source/eval.py deleted file mode 100644 index 417fde11..00000000 --- a/app/source/eval.py +++ /dev/null @@ -1,315 +0,0 @@ -from numpy import e, float32 -from sklearn.model_selection import train_test_split -from sklearn import preprocessing -from sklearn.pipeline import Pipeline -import pandas as pd - - - -# A function that takes in a configuration dict and runs a scikitlearn pipeline with its settings -def run_eval_pipeline(config): - # Load the data - data = pd.read_csv("./external/csvs/" + config['data_path'], sep=";") - - pre_fix = data.shape - - # Turn false and true into 0 and 1 - if config['replace_missing_values_with_zero']: - print("Replacing true/false with 1/0") - data.replace(['false', 'true'], [0, 1], inplace=True) - data.replace(['False', 'True'], [0, 1], inplace=True) - - # Drop columns with all missing values - if config['drop_all_missing_columns']: - print("Dropping all columns with missing values") - data.dropna(axis=1, how='all', inplace=True) - - # Drop rows with missing values - if config['drop_all_missing_rows']: - print("Dropping rows with missing values") - data = data.dropna(axis=0, how='any') - - print("Data shape before removing missing values: " + str(pre_fix)) - print("Data shape after removing missing values: " + str(data.shape)) - print("") - - # save to csv - if config['save_cleaned_csv']: - data.to_csv("./external/csvs/cleaned_" + config['data_path'], sep=";", index=False) - - # Split the data into train and test sets - X_train, X_test, y_train, y_test = train_test_split(data.drop(config['remove_cols'], axis=1, errors='ignore'), - data[config['train_test_split']['target_col']], - **config['train_test_split']['settings']) - - - # A function call to create the right scaler - scaler = None - if 'scaler' in config: - scaler = construct_scaler(config['scaler']) - - - # A function call to create the right column tranformer - col_transformer = None - if 'col_transformer' in config: - col_transformer = construct_col_transformer(config['col_transformer']) - - - # A function call to create the right matrix decomposition - decomposition = None - if 'decomposition' in config: - decomposition = construct_matrix_decomposition(config['decomposition']) - - - # A function call to create the right model - model = construct_model(config['model']) - if model == None: - return None - - - # Create the pipeline - pipeline = construct_pipeline(config['pipeline'], scaler, col_transformer, decomposition, model) - - - if 'hyperparameter_optimization' in config: - pipeline = hyperparameter_optimization(config['hyperparameter_optimization'], pipeline, X_train, y_train) - - score = None - # Cross validate the pipeline - if 'cross_validate' in config: - if 'verbose' in config and config['verbose']: print(f"Running: {pipeline} \n") - - from sklearn.model_selection import cross_val_score - if 'verbose' in config and config['verbose']: print("Cross validating the pipeline with settings: ") - if 'verbose' in config and config['verbose']: print(config['cross_validate']['settings']) - scores = cross_val_score(pipeline, X_train, y_train, **config['cross_validate']['settings']).mean() - if 'verbose' in config and config['verbose']: print("score on cross validation:", scores) - if 'verbose' in config and config['verbose']: print("std on cross validation:", scores.std()) - - if 'verbose' in config and config['verbose']: print("\nHow many right one would have only guessing on one") - if 'verbose' in config and config['verbose']: print(f"{y_train.value_counts(normalize=True)}\n") - - pipeline.fit(X_train, y_train) - score = pipeline.score(X_test, y_test) - - if 'verbose' in config and config['verbose']: print("\nScore on test: " + str(score)) - if 'verbose' in config and config['verbose']: print("Confusion matrix") - y_pred = pipeline.predict(X_test) - if 'verbose' in config and config['verbose']: print(f"{pd.crosstab(y_test, y_pred, rownames=['True'], colnames=['Predicted'], margins=True)}\n") - - # Save answers - X_test["pred"] = y_pred - - - else: - # Fit the pipeline - if 'verbose' in config and config['verbose']: print("Fitting pipeline without cross validation: " + str(pipeline)) - pipeline.fit(X_train, y_train) - - # Calculate accuracy - accuracy = pipeline.score(X_test, y_test) - if 'verbose' in config and config['verbose']: print("Accuracy:", accuracy) - - # Save answers - X_test["pred"] = pipeline.predict(X_test) - - return X_test - - - - -def hyperparameter_optimization(hp_o_config, pipeline, X_train, y_train): - from sklearn.model_selection import GridSearchCV - - grid_params = [] - for key, value in hp_o_config['params'].items(): - for k,v in value.items(): - grid_params.append({key + "__" + k: v}) - - print(grid_params) - - cv = None - if hp_o_config['name'] == 'grid_search': - if 'verbose' in hp_o_config and hp_o_config['verbose']: print("Running: Grid search") - - # Create the grid - cv = GridSearchCV(pipeline, param_grid=grid_params, **hp_o_config['settings']) - - - elif hp_o_config['name'] == 'random_search': - raise Exception("Not implemented yet") - if 'verbose' in hp_o_config and hp_o_config['verbose']: print("Running: Random search") - - # Fit the grid - cv.fit(X_train, y_train) - - # Print the results - print("Best score:", cv.best_score_) - print("Best parameters:", cv.best_params_) - print(cv.best_estimator_) - return cv.best_estimator_ - - -def construct_pipeline(pipline_config, scaler, col_transformer, decomposition, model): - pipeline = None - if scaler != None and col_transformer != None and decomposition != None: - pipeline = Pipeline([('col_transformer', col_transformer), ('scaler', scaler), ('decomposition', decomposition), ('model', model)], **pipline_config['settings']) - elif scaler != None and col_transformer != None: - pipeline = Pipeline([('col_transformer', col_transformer), ('scaler', scaler), ('model', model)], **pipline_config['settings']) - elif scaler != None and decomposition != None: - pipeline = Pipeline([('scaler', scaler), ('decomposition', decomposition), ('model', model)], **pipline_config['settings']) - elif scaler != None and model != None: - pipeline = Pipeline([('scaler', scaler), ('model', model)], **pipline_config['settings']) - elif col_transformer != None and decomposition != None: - pipeline = Pipeline([('col_transformer', col_transformer), ('decomposition', decomposition), ('model', model)], **pipline_config['settings']) - elif col_transformer != None and model != None: - pipeline = Pipeline([('col_transformer', col_transformer), ('model', model)], **pipline_config['settings']) - elif decomposition != None and model != None: - pipeline = Pipeline([('decomposition', decomposition), ('model', model)], **pipline_config['settings']) - elif scaler != None: - pipeline = Pipeline([('scaler', scaler), ('model', model)], **pipline_config['settings']) - elif col_transformer != None: - pipeline = Pipeline([('col_transformer', col_transformer), ('model', model)], **pipline_config['settings']) - elif decomposition != None: - pipeline = Pipeline([('decomposition', decomposition), ('model', model)], **pipline_config['settings']) - elif model != None: - pipeline = Pipeline([('model', model)], **pipline_config['settings']) - else: - pipeline = Pipeline([('model', model)], **pipline_config['settings']) - - return pipeline - - - -def construct_scaler(scaler_config): - scaler = None - if scaler_config['name'] == 'standard': - from sklearn.preprocessing import StandardScaler - scaler = StandardScaler(**scaler_config['settings']) - elif scaler_config['name'] == 'minmax': - from sklearn.preprocessing import MinMaxScaler - scaler = MinMaxScaler(**scaler_config['settings']) - elif scaler_config['name'] == 'maxabs': - from sklearn.preprocessing import MaxAbsScaler - scaler = MaxAbsScaler(**scaler_config['settings']) - elif scaler_config['name'] == 'robust': - from sklearn.preprocessing import RobustScaler - scaler = RobustScaler(**scaler_config['settings']) - elif scaler_config['name'] == 'quantile': - from sklearn.preprocessing import QuantileTransformer - scaler = QuantileTransformer(**scaler_config['settings']) - elif scaler_config['name'] == 'power': - from sklearn.preprocessing import PowerTransformer - scaler = PowerTransformer(**scaler_config['settings']) - elif scaler_config['name'] == 'normalize': - from sklearn.preprocessing import Normalizer - scaler = Normalizer(**scaler_config['settings']) - - if scaler != None: - return scaler - raise Exception("No scaler found in scaler config") - - -def construct_col_transformer(col_transformer_config): - from sklearn.compose import make_column_transformer - - encoders = [] - for encoder_config in col_transformer_config['encoders']: - encoder = None - if encoder_config['name'] == 'onehotencoder': - from sklearn.preprocessing import OneHotEncoder - encoder = OneHotEncoder(**encoder_config['settings']) - elif encoder_config['name'] == 'label': - from sklearn.preprocessing import LabelEncoder - encoder = LabelEncoder(**encoder_config['settings']) - elif encoder_config['name'] == 'Ordinal': - from sklearn.preprocessing import OrdinalEncoder - encoder = OrdinalEncoder(**encoder_config['settings']) - - encoders.append((encoder, encoder_config['targets'])) - - if len(encoders) > 0: - return make_column_transformer(*encoders, **col_transformer_config['settings']) - raise Exception("No encoders found in col_transformer config") - - -def construct_matrix_decomposition(decomposition_config): - decomposition = None - if decomposition_config['name'] == 'pca': - from sklearn.decomposition import PCA - decomposition = PCA(**decomposition_config['settings']) - elif decomposition_config['name'] == 'kernelpca': - from sklearn.decomposition import KernelPCA - decomposition = KernelPCA(**decomposition_config['settings']) - elif decomposition_config['name'] == 'face': - from sklearn.decomposition import FactorAnalysis - decomposition = FactorAnalysis(**decomposition_config['settings']) - elif decomposition_config['name'] == 'nmf': - from sklearn.decomposition import NMF - decomposition = NMF(**decomposition_config['settings']) - elif decomposition_config['name'] == 'sparsepca': - from sklearn.decomposition import SparsePCA - decomposition = SparsePCA(**decomposition_config['settings']) - elif decomposition_config['name'] == 'factoranalysis': - from sklearn.decomposition import FactorAnalysis - decomposition = FactorAnalysis(**decomposition_config['settings']) - elif decomposition_config['name'] == 'truncatedsvd': - from sklearn.decomposition import TruncatedSVD - decomposition = TruncatedSVD(**decomposition_config['settings']) - elif decomposition_config['name'] == 'pca_sparse': - from sklearn.decomposition import PCA - decomposition = PCA(**decomposition_config['settings']) - - if decomposition != None: - return decomposition - raise Exception("No decomposition found in decomposition config") - - -def construct_model(model_config): - model = None - if model_config['name'] == 'logistic': - from sklearn.linear_model import LogisticRegression - model = LogisticRegression(**model_config['settings']) - elif model_config['name'] == 'svm': - from sklearn.svm import SVC - model = SVC(**model_config['settings']) - elif model_config['name'] == 'knn': - from sklearn.neighbors import KNeighborsClassifier - model = KNeighborsClassifier(**model_config['settings']) - elif model_config['name'] == 'gaussian': - from sklearn.naive_bayes import GaussianNB - model = GaussianNB(**model_config['settings']) - elif model_config['name'] == 'tree': - from sklearn.tree import DecisionTreeClassifier - model = DecisionTreeClassifier(**model_config['settings']) - elif model_config['name'] == 'forest': - from sklearn.ensemble import RandomForestClassifier - model = RandomForestClassifier(**model_config['settings']) - elif model_config['name'] == 'gradient': - from sklearn.ensemble import GradientBoostingClassifier - model = GradientBoostingClassifier(**model_config['settings']) - elif model_config['name'] == 'adaboost': - from sklearn.ensemble import AdaBoostClassifier - model = AdaBoostClassifier(**model_config['settings']) - elif model_config['name'] == 'extra': - from sklearn.ensemble import ExtraTreesClassifier - model = ExtraTreesClassifier(**model_config['settings']) - elif model_config['name'] == 'bagging': - from sklearn.ensemble import BaggingClassifier - model = BaggingClassifier(**model_config['settings']) - elif model_config['name'] == 'gradientboosting': - from sklearn.ensemble import GradientBoostingClassifier - model = GradientBoostingClassifier(**model_config['settings']) - elif model_config['name'] == 'voting': - from sklearn.ensemble import VotingClassifier - model = VotingClassifier(**model_config['settings']) - elif model_config['name'] == 'mlp': - from sklearn.neural_network import MLPClassifier - model = MLPClassifier(**model_config['settings']) - elif model_config['name'] == 'sgd': - from sklearn.linear_model import SGDClassifier - model = SGDClassifier(**model_config['settings']) - - if model != None: - return model - raise Exception("No model found in model config") \ No newline at end of file diff --git a/app/source/nhl_gen.py b/app/source/nhl_gen.py index 85fe2df8..fff0d2f3 100644 --- a/app/source/nhl_gen.py +++ b/app/source/nhl_gen.py @@ -22,35 +22,33 @@ def generate_data_for(player_id, nhl_session, games_to_go_back, season): ) playerStatsForGames = pd.read_sql(query, nhl_session.bind) - playerStatsForGames.columns = [u + "_SkaterStats" for u in SkaterStats.__table__.columns.keys()]\ + playerStatsForGames.columns = [u + "_Skater" for u in SkaterStats.__table__.columns.keys()]\ + [u + "_Game" for u in Game.__table__.columns.keys()] \ - + [u + "_PlayerTeamStats" for u in PlayerTeamStats.__table__.columns.keys()] \ - + [u + "_OppTeamStats" for u in OppTeamStats.__table__.columns.keys()] + + [u + "_PlayerTeam" for u in PlayerTeamStats.__table__.columns.keys()] \ + + [u + "_OppTeam" for u in OppTeamStats.__table__.columns.keys()] - df_total = pd.DataFrame() - if season == "all": - for i in tqdm(range(2008, 2025)): - season = str(i) + str(i+1) - new_df = add_games_back(playerStatsForGames[playerStatsForGames.season_Game == str(season)], games_to_go_back) - df_total = pd.concat([df_total, new_df]) + # df_total = pd.DataFrame() + # if season == "all": + # for i in tqdm(range(2008, 2025)): + # season = str(i) + str(i+1) + # new_df = add_games_back(playerStatsForGames[playerStatsForGames.season_Game == str(season)], games_to_go_back) + # df_total = pd.concat([df_total, new_df]) - else: - df_total = add_games_back(playerStatsForGames[playerStatsForGames.season_Game == str(season)], games_to_go_back) + # else: + # df_total = add_games_back(playerStatsForGames[playerStatsForGames.season_Game == str(season)], games_to_go_back) - df_total["O_1.5"] = (df_total["shots_SkaterStats"] > 1.5).astype(int) - df_total["O_2.5"] = (df_total["shots_SkaterStats"] > 2.5).astype(int) - df_total["O_3.5"] = (df_total["shots_SkaterStats"] > 3.5).astype(int) - df_total["O_4.5"] = (df_total["shots_SkaterStats"] > 4.5).astype(int) - df_total["U_1.5"] = (df_total["shots_SkaterStats"] < 1.5).astype(int) - df_total["U_2.5"] = (df_total["shots_SkaterStats"] < 2.5).astype(int) - df_total["U_3.5"] = (df_total["shots_SkaterStats"] < 3.5).astype(int) - df_total["U_4.5"] = (df_total["shots_SkaterStats"] < 4.5).astype(int) + playerStatsForGames["O_1.5"] = (playerStatsForGames["shots_Skater"] > 1.5).astype(int) + playerStatsForGames["O_2.5"] = (playerStatsForGames["shots_Skater"] > 2.5).astype(int) + playerStatsForGames["O_3.5"] = (playerStatsForGames["shots_Skater"] > 3.5).astype(int) + playerStatsForGames["O_4.5"] = (playerStatsForGames["shots_Skater"] > 4.5).astype(int) - # Get date of last game in df_total - last_game_date = df_total.iloc[-1]["gameDate_Game"] + df = clean_data(playerStatsForGames) + df = generate_prediction_data(df) - return (df_total, last_game_date) + # One hot encode the categorical variables + df = pd.get_dummies(df, columns=one_hot_cols) + return df def add_games_back(df, games_to_go_back): df_total = pd.DataFrame() @@ -61,3 +59,184 @@ def add_games_back(df, games_to_go_back): df_total = pd.concat([df_total, dfc], axis=1) df = pd.concat([df, df_total], axis=1) return df + + +def generate_prediction_data(df): + # Group the data by season + df_grouped = df.groupby(['season']) + + # Create empty df to fill + final_df = pd.DataFrame() + + # loop through the seasons + for season, season_df in df_grouped: + for stat in forbidden_stats: + #season_df[f'{stat}_avr_1_games_back'] = season_df[stat].rolling(window=1, min_periods=1).mean().shift(1)#.fillna(0) + #season_df[f'{stat}_avr_3_games_back'] = season_df[stat].rolling(window=5, min_periods=1).mean().shift(1)#.fillna(0) + #season_df[f'{stat}_avr_10_games_back'] = season_df[stat].rolling(window=5, min_periods=1).mean().shift(1)#.fillna(0) + #season_df[f'{stat}_avr_1_season_back'] = season_df[stat].rolling(window=10000, min_periods=1).mean().shift(1)#.fillna(0) + + # Calculate the EMA for each season + season_df[f'{stat}_ema_1_games_back'] = season_df[stat].ewm(span=1, min_periods=1).mean().shift(1)#.fillna(0) + season_df[f'{stat}_ema_3_season_back'] = season_df[stat].ewm(span=3, min_periods=1).mean().shift(1)#.fillna(0) + season_df[f'{stat}_ema_10_season_back'] = season_df[stat].ewm(span=10, min_periods=1).mean().shift(1)#.fillna(0) + season_df[f'{stat}_ema_1_season_back'] = season_df[stat].ewm(span=10000, min_periods=1).mean().shift(1)#.fillna(0) + + # Save data to the final df + final_df = pd.concat([final_df, season_df]) + + for stat in forbidden_stats: + #final_df[f'{stat}_avr_carrier'] = final_df[stat].rolling(window=100000, min_periods=1).mean().shift(1)#.fillna(0) + final_df[f'{stat}_ema_carrier'] = final_df[stat].ewm(span=100000, min_periods=1).mean().shift(1)#.fillna(0) + + # Remove forbidden_stats from df + final_df = final_df.drop(forbidden_stats, axis=1) + + return final_df + + +def clean_data(df): + + # Drop the unnecessary columns + df.drop(remove_cols, axis=1, inplace=True) + + # Rename columns + df.rename(columns=rename_cols, inplace=True) + + # In each column of "fill_with_zeros" where there is not a number, put a zero + for col in fill_with_zeros: + df[col].replace(r'^\s*$', 0, regex=True, inplace=True) + + # Convert timestamps to datetime objects + for col in time_to_sec: + df[col] = pd.to_timedelta(df[col].astype(str)).dt.total_seconds().astype(int) + + return df + + +remove_cols = [ + "added_Skater", + "updated_Skater", + "gamePk_Game", + "abstractGameState_Game", + "detailedState_Game", + "statusCode_Game", + "startTimeTBD_Game", + "homeTeamId_Game", + "awayTeamId_Game", + "added_Game", + "updated_Game", + + "gamePk_PlayerTeam", + "teamId_PlayerTeam", + "leagueRecordType_PlayerTeam", + "added_PlayerTeam", + "updated_PlayerTeam", + + "gamePk_OppTeam", + "leagueRecordType_OppTeam", + "added_OppTeam", + "updated_OppTeam", + "isHome_OppTeam" +] + +rename_cols = { + "playerId_Skater": "playerId", + "gamePk_Skater": "gamePk", + "gameDate_Game": "date", + "codedGameState_Game": "gameState", + "isHome_PlayerTeam": "isHome", + "season_Game": "season" +} + +one_hot_cols = [ + "position_Skater", + "gameType_Game", + "season" +] + +fill_with_zeros = [ + "ot_OppTeam", + "ot_PlayerTeam" +] + +time_to_sec = [ + "timeOnIce_Skater", + "evenTimeOnIce_Skater", + "powerPlayTimeOnIce_Skater", + "shortHandedTimeOnIce_Skater" +] + +forbidden_stats = [ + "timeOnIce_Skater", + "assists_Skater", + "goals_Skater", + "shots_Skater", + "hits_Skater", + "powerPlayGoals_Skater", + "powerPlayAssists_Skater", + "penaltyMinutes_Skater", + "faceOffWins_Skater", + "faceoffTaken_Skater", + "takeaways_Skater", + "giveaways_Skater", + "shortHandedGoals_Skater", + "shortHandedAssists_Skater", + "blocked_Skater", + "plusMinus_Skater", + "evenTimeOnIce_Skater", + "powerPlayTimeOnIce_Skater", + "shortHandedTimeOnIce_Skater", + "goals_PlayerTeam", + "pim_PlayerTeam", + "shots_PlayerTeam", + "powerPlayPercentage_PlayerTeam", + "powerPlayGoals_PlayerTeam", + "powerPlayOpportunities_PlayerTeam", + "faceOffWinPercentage_PlayerTeam", + "blocked_PlayerTeam", + "takeaways_PlayerTeam", + "giveaways_PlayerTeam", + "hits_PlayerTeam", + "goalsAgainst_PlayerTeam", + "pimAgainst_PlayerTeam", + "shotsAgainst_PlayerTeam", + "powerPlayPercentageAgainst_PlayerTeam", + "powerPlayGoalsAgainst_PlayerTeam", + "powerPlayOpportunitiesAgainst_PlayerTeam", + "faceOffWinPercentageAgainst_PlayerTeam", + "blockedAgainst_PlayerTeam", + "takeawaysAgainst_PlayerTeam", + "giveawaysAgainst_PlayerTeam", + "hitsAgainst_PlayerTeam", + "wins_PlayerTeam", + "losses_PlayerTeam", + "ot_PlayerTeam", + "score_PlayerTeam", + "goals_OppTeam", + "pim_OppTeam", + "shots_OppTeam", + "powerPlayPercentage_OppTeam", + "powerPlayGoals_OppTeam", + "powerPlayOpportunities_OppTeam", + "faceOffWinPercentage_OppTeam", + "blocked_OppTeam", + "takeaways_OppTeam", + "giveaways_OppTeam", + "hits_OppTeam", + "goalsAgainst_OppTeam", + "pimAgainst_OppTeam", + "shotsAgainst_OppTeam", + "powerPlayPercentageAgainst_OppTeam", + "powerPlayGoalsAgainst_OppTeam", + "powerPlayOpportunitiesAgainst_OppTeam", + "faceOffWinPercentageAgainst_OppTeam", + "blockedAgainst_OppTeam", + "takeawaysAgainst_OppTeam", + "giveawaysAgainst_OppTeam", + "hitsAgainst_OppTeam", + "wins_OppTeam", + "losses_OppTeam", + "ot_OppTeam", + "score_OppTeam" +] \ No newline at end of file diff --git a/app/source/predict.py b/app/source/predict.py index 1c691c6c..7041a309 100644 --- a/app/source/predict.py +++ b/app/source/predict.py @@ -1,22 +1,3 @@ -from sklearn.pipeline import Pipeline -from sklearn.model_selection import train_test_split -from sklearn.preprocessing import StandardScaler -from sklearn.preprocessing import OneHotEncoder -from sklearn.linear_model import LogisticRegression -from sklearn.svm import SVC -from sklearn.metrics import classification_report -from sklearn.compose import ColumnTransformer -from sklearn.model_selection import cross_val_score -from sklearn.metrics import accuracy_score -from sklearn.naive_bayes import GaussianNB -from sklearn.ensemble import RandomForestClassifier -from sklearn.decomposition import PCA -from sklearn.ensemble import StackingClassifier -from sklearn.model_selection import GridSearchCV -from sklearn.metrics import roc_auc_score -from sklearn.linear_model import SGDClassifier -from sklearn.metrics import confusion_matrix - from tqdm import tqdm import json import numpy as np @@ -25,370 +6,20 @@ import glob +def predict_game(data, game_ids, target): + results = {} -def predict_game(org_data, org_config, game_id, player_id, targets): - results = {} - - for target in targets: - # Clean data - config = org_config.copy() - data = data_cleanup(org_data.copy(), config) - - # Check if game that is to be predicted is in data - if int(game_id) not in data['gamePk_SkaterStats'].values: - print(f"Game {game_id} not found in data") - return None - - # Remove identifier columns - data.drop(org_config['columns']['types']['identifier'], axis=1, inplace=True) - - # Load model config and information - models_config = load_model_config(player_id, data, config, target) - - -def load_model_config(player_id, data, config, target): - ''' - Loads the model config for a given player - ''' - model_config = None - - # Check if config file exists - oldpwd=os.getcwd() - os.chdir("./external/model_configs/") - for file in glob.glob("*"): - if str(player_id)+"_BAJS"+str(target) == str(file): - os.chdir(oldpwd) - with open(f'./external/model_configs/{str(player_id)+"_"+str(target)}.cfg', 'r') as f: - model_config = json.load(f) - return model_config - - os.chdir(oldpwd) - print("No sufficient file found, generating one") - - # Generate a model_config file - return generate_models_config(player_id, data, config, target) - - -def generate_models_config(player_id, data, config, target): - ''' - Generates a model config file for a given player - ''' - # Split data into train and test using sci-kit learn - X_train, X_test, y_train, y_test = train_test_split(data.drop(config['columns']['targets']['all'], axis=1), data["O_" + str(target)], test_size=0.2, random_state=42) - - # Create column transformer - col_transformer = ColumnTransformer([ - ('one_hot_encoder', OneHotEncoder(handle_unknown='ignore'), config['columns']['types']['categorical']) - ], - remainder='passthrough', - n_jobs=-1 - ) - - # Create pipeline - pipeline = Pipeline(steps=[ - ('col_transformer', col_transformer), - ('standard_scaler', StandardScaler()), - ('pca', PCA(n_components=10)), - ('classifier', None), - ]) - - # Create grid parameters - grid = [ - {"name": "LogisticRegression", - "parameters": { - 'classifier': [LogisticRegression()], - 'classifier__penalty': ['l1', 'l2'], - 'classifier__C': [0.001, 0.01, 0.1, 1, 10, 100], - 'classifier__solver': ['liblinear'], - 'classifier__class_weight': ['balanced', None], - 'classifier__max_iter': [100, 150, 300], - 'classifier__tol': [0.01, 0.001, 0.0001, 0.00001] - }},{ - "name": "SVC", - "parameters": { - 'classifier': [SVC()], - 'classifier__kernel': ['rbf', 'linear', 'poly', 'sigmoid'], - 'classifier__C': [0.01, 0.1, 1, 10, 100], - 'classifier__gamma': ['scale', 'auto'], - 'classifier__class_weight': ['balanced', None], - 'classifier__probability': [True] - }},{ - "name": "GaussianNB", - "parameters": { - 'classifier': [GaussianNB()], - 'pca__n_components': [10, 50, 100, 200], - 'classifier__var_smoothing': np.logspace(0,-9, num=10) - }},{ - "name": "SGDClassifier", - "parameters": { - 'classifier': [SGDClassifier()], - 'classifier__loss': ['log', 'modified_huber'], - 'classifier__penalty': ['l1', 'l2', 'elasticnet'], - 'classifier__alpha': [0.001, 0.0001, 0.00001], - 'classifier__l1_ratio': [0.10, 0.15, 0.20], - 'classifier__n_jobs': [-1] - }},{ - "name": "RandomForestClassifier", - "parameters": { - 'classifier': [RandomForestClassifier()], - 'classifier__n_estimators': [10, 20, 50, 100], - 'classifier__criterion': ['gini', 'entropy'], - 'classifier__max_depth': [None, 5, 10, 20], - 'classifier__min_samples_split': [2, 4, 8], - 'classifier__min_samples_leaf': [1, 2, 4], - 'classifier__class_weight': ['balanced', None], - 'classifier__n_jobs': [-1] - }} - ] - - results = {} - - # Create grid search - for d in tqdm(grid): - name, parameters = d['name'], d['parameters'] - # grid search - clf = GridSearchCV(pipeline, parameters, cv=5, n_jobs=-1, verbose=1, scoring='roc_auc') - clf.fit(X_train, y_train) - - results[name] = {} - # Save results - results[name]['train_best_score'] = (clf.best_score_) - results[name]['train_best_params'] = (clf.best_params_['classifier'].get_params()) - results[name]['test_ROC_AUC'] = (roc_auc_score(y_test, clf.predict_proba(X_test)[:,1])) - results[name]['test_classification_report'] = classification_report(y_test, clf.predict(X_test), output_dict=True) - - - # Save results - with open(f'./external/model_configs/{str(player_id)+"_"+str(target)}.cfg', 'w') as f: - json.dump(results, f, indent=4) - - return results - - - - - - - - - - - - - - - - - - - - - - -# def predict_game(org_data, org_config, player_id, game_id, results): -# for target in tqdm(org_config['columns']['targets']['active']): -# config = org_config.copy() -# data = data_cleanup(org_data.copy(), config) - -# # Split data into train and test using sci-kit learn -# X_train, X_test, y_train, y_test = train_test_split(data.drop(config['columns']['targets']['all'], axis=1), data[target], test_size=0.2, random_state=42) - -# # Create column transformer -# col_transformer = ColumnTransformer([ -# ('one_hot_encoder', OneHotEncoder(handle_unknown='ignore'), config['columns']['types']['categorical']) -# ], -# remainder='passthrough', -# n_jobs=-1 -# ) - -# # Logistic regression -# grid_params = None#\ -# # { -# # 'pca__n_components': [10, 50, 100, 200], -# # 'classifier__penalty': ['l1', 'l2'], -# # 'classifier__solver': ['liblinear'], -# # 'classifier__C': [0.001, 0.01, 0.1, 1, 10], -# # } -# log_reg_pipeline, log_reg_res = run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, LogisticRegression(C=0.1, penalty='l1', solver='liblinear', class_weight='balanced'), grid_params) - -# # SVM -# grid_params = None#\ -# # { -# # 'pca__n_components': [7, 8, 9, 10, 11, 12, 13], -# # 'classifier__C': [0.001, 0.01, 0.1, 1, 10], -# # 'classifier__kernel': ['rbf'], -# # 'classifier__gamma': [0.001, 0.01, 0.1, 1, 10] -# # } -# svm_pipeline, svm_res = run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, SVC(C=1, gamma=0.01, probability=True), grid_params) - - -# # Naive Bayes -# grid_params = None#\ -# # { -# # 'pca__n_components': [10, 50, 100, 200], -# # 'classifier__var_smoothing': np.logspace(0,-9, num=10) -# # } -# bayes_pipeline, bayes_res = run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, GaussianNB(var_smoothing=0.3511191734215131), grid_params) - - -# # Random forest -# grid_params = None#\ -# # { -# # 'pca__n_components': [10], -# # 'classifier__n_estimators': [10, 50, 100, 200], -# # 'classifier__max_features': ['auto', 'sqrt', 'log2'], -# # 'classifier__min_samples_split': [2, 4, 8, 9, 10], -# # 'classifier__n_jobs': [-1], -# # } -# forest_pipeline, forest_res = run_pipeline( \ -# X_train, X_test, y_train, y_test, col_transformer, target, \ -# RandomForestClassifier(max_depth=None, max_features='auto', min_samples_split=4, n_estimators=1000, class_weight="balanced"), grid_params) - - -# # # Stacking -# # estimators = [ -# # ('log_reg', log_reg_pipeline), -# # ('svm', svm_pipeline), -# # ('bayes', bayes_pipeline), -# # ('forest', forest_pipeline) -# # ] - -# # # Create meta-pipeline -# # clf = StackingClassifier( -# # estimators=estimators, -# # final_estimator=LogisticRegression(), -# # cv=5, -# # verbose=1, -# # n_jobs=-1, -# # stack_method='predict_proba' -# # ) - -# # clf.fit(X_train, y_train) -# # y_pred = clf.predict(X_test) -# #print(f"\n\nStacking report: ") -# #print("{classification_report(y_test, y_pred)}") -# #print(f"Stacking acc: {accuracy_score(y_test, y_pred):.4%}") -# #print(f"{y_train.value_counts(normalize=True)}") - -# # Print ROC AUC -# #print(f"ROC AUC: {roc_auc_score(y_test, y_pred):.4%}") - - -# # Neural network - - -# #print("---") -# # Add new game to results -# new = { -# 'player_id': player_id, -# 'target': target, -# **log_reg_res, -# **svm_res, -# **bayes_res, -# **forest_res -# } -# # Append dict to results df with keys as columns -# results = results.append(pd.DataFrame([new], columns=results.columns)) - -# return results - -# def run_pipeline(X_train, X_test, y_train, y_test, col_transformer, target, model, grid_params=None): -# # Create pipeline with column transformer, standard scaler, and logistic regression -# pipeline = Pipeline(steps=[ -# ('col_transformer', col_transformer), -# ('standard_scaler', StandardScaler()), -# ('pca', PCA(n_components=10)), -# ('classifier', model), -# ]) -# #print("\n") - -# results = {} -# name = model.__class__.__name__ - -# # Create grid search object -# if grid_params: -# grid_search = GridSearchCV(pipeline, grid_params, cv=5, n_jobs=-1) -# grid_search.fit(X_train, y_train) - -# # Print ROC AUC score -# #print(f"ROC AUC: {roc_auc_score(y_test, grid_search.predict_proba(X_test)[:, 1]):.4%}") -# results[name + 'ROC AUC'] = roc_auc_score(y_test, grid_search.predict_proba(X_test)[:, 1]) - -# #print("Best score:", grid_search.best_score_) -# results[name + 'Best score'] = grid_search.best_score_ -# #print("Best params:", grid_search.best_params_) -# results[name + 'Best params'] = grid_search.best_params_ -# #print("Best estimator:", grid_search.best_estimator_) -# results[name + 'Best estimator'] = grid_search.best_estimator_ - -# # fit best model to train data -# y_pred = grid_search.predict(X_test) -# #print(f"Accuracy on test data: {accuracy_score(y_test, y_pred):.4%}") -# results[name + 'Accuracy on test data'] = accuracy_score(y_test, y_pred) - -# else: -# # Cross validate pipeline -# scores = cross_val_score( -# pipeline, X_train, y_train, cv=5, scoring='roc_auc', n_jobs=-1, verbose=0) -# #print(f'Crossvaledating {target} using {str(model)}') -# #print(f'Accuracy: {scores.mean():.4%}') -# results[name + '_acc'] = scores.mean() -# #print(f'Std: {scores.std():.4%}') -# results[name + '_std'] = scores.std() - -# # Run the pipeline on test data -# pipeline.fit(X_train, y_train) -# y_pred = pipeline.predict(X_test) -# #print(f'Accuracy on test data: {accuracy_score(y_test, y_pred):.4%}') -# results[name + '_acc_test_data'] = accuracy_score(y_test, y_pred) - -# # Print ROC AUC score -# #print(f"ROC AUC: {roc_auc_score(y_test, pipeline.predict_proba(X_test)[:, 1]):.4%}") -# results[name + '_roc_auc'] = roc_auc_score(y_test, pipeline.predict_proba(X_test)[:, 1]) - -# return (pipeline, results) - - - -def data_cleanup(data, config): - ''' - This function cleans up the data by removing the columns that are not needed - ''' - - # Drop all columns with only Nan values - data.dropna(axis=1, how='all', inplace=True) - - # Remove columns with all same values - data.drop(data.columns[data.nunique() == 1], axis=1, inplace=True) - - # Remove rows containing NaN values - data.dropna(inplace=True) - - # Turn all times into a timedelta objects and then to seconds - for col in config['columns']['types']['time']: - data[col] = pd.to_timedelta(data[col]) - - # Turn timedelta objects into seconds - data[col] = data[col].dt.total_seconds().astype(int) - - # Drop all columns in specified in the config - data.drop(config['columns']['drop'], axis=1, inplace=True, errors='ignore') + cleaned_data = clean_data(data.copy()) - # Get first date in first row as datetime object - first_date = pd.to_datetime(data.iloc[0]['gameDate_Game']) + #X_train, y_train, X_test, y_test = - # Change all dates to seconds since first date - for col in config['columns']['types']['date']: - # Create new column with date difference - data[col] = data[col].apply(lambda x: pd.to_datetime(x) - first_date) + return results - # Change col column from datetime object to total seconds - data[col] = data[col].dt.total_seconds().astype(int) - # Fix config to work with removed columns - tmp = config['columns']['types']['categorical'].copy() - for name in tmp: - if name not in data.columns: - config['columns']['types']['categorical'].remove(name) +def clean_data(data): + # Set the date to a datetime object and set it as the index + data['date'] = pd.to_datetime(data['date']) + data.set_index('date', inplace=True) - return data + print(data) + return data From 2adeac54e3396952d9de2b9b7c36b39ce2e5e08b Mon Sep 17 00:00:00 2001 From: Sourcery AI <> Date: Sun, 25 Jul 2021 21:29:52 +0000 Subject: [PATCH 26/26] 'Refactored by Sourcery' --- app/source/bet_parsers/parse_bet365.py | 8 +- app/source/bet_parsers/parse_betsson.py | 22 ++--- app/source/bet_parsers/parse_betway.py | 4 +- app/source/bet_parsers/parse_ss.py | 4 +- app/source/bet_parsers/parse_unibet.py | 4 +- app/source/bet_parsers/parse_wh.py | 4 +- app/source/bets_handler.py | 39 ++++---- app/source/nhl_handler.py | 119 +++++++++++------------- app/source/predict.py | 4 +- 9 files changed, 93 insertions(+), 115 deletions(-) diff --git a/app/source/bet_parsers/parse_bet365.py b/app/source/bet_parsers/parse_bet365.py index acd50c15..8374cc53 100644 --- a/app/source/bet_parsers/parse_bet365.py +++ b/app/source/bet_parsers/parse_bet365.py @@ -13,7 +13,7 @@ def read_file(file): lines = reader.readlines() except Exception as e: return [] - + matches = {} current_key = "" for line in lines: @@ -46,8 +46,8 @@ def read_file(file): else: start_saving = unidecode(matches[match][i].lower()) == "over" games_under_data = {} + game = [] for match in matches: - game = [] start_saving = False games_under_data[match] = [] for i in range(1, len(matches[match])): @@ -59,10 +59,10 @@ def read_file(file): else: start_saving = matches[match][i] == "Under" res = [] - for match in games_player: + for match in games_player: home_team = match.split(" @ ")[1] away_team = match.split(" @ ")[0] - for i in range(0, len(games_player[match])): + for i in range(len(games_player[match])): player_name = unidecode(games_player[match][i].lower()) player_target = games_over_data[match][2*i] player_odds_O = games_over_data[match][2*i+1] diff --git a/app/source/bet_parsers/parse_betsson.py b/app/source/bet_parsers/parse_betsson.py index 87b8a4fd..fb61ae91 100644 --- a/app/source/bet_parsers/parse_betsson.py +++ b/app/source/bet_parsers/parse_betsson.py @@ -22,11 +22,7 @@ def read_file(file): line = line.replace("\n","") tmp.append(line) find = "–" - res = [] - for i in range(len(tmp)): - if tmp[i] == find: - res.append(i) - + res = [i for i in range(len(tmp)) if tmp[i] == find] res.append(len(tmp)+1) for i in range(len(res)-1): game = tmp[res[i]-1:res[i+1]-1] @@ -34,19 +30,17 @@ def read_file(file): matches[key] = game[3:] res = [] - for match in matches: + for match, value in matches.items(): home_team = unidecode(match.split(" - ")[0]) away_team = unidecode(match.split(" - ")[1]) - for i in range(0, len(matches[match]), 4): + for i in range(0, len(value), 4): info = matches[match][i:(i+4)] - player_name = "" name = info[0].split(" ")[:-2] - for i in range(len(name)): - if i == len(name)-1: - player_name += name[i] - else: - player_name += name[i] + " " - + player_name = "".join( + name[i] if i == len(name) - 1 else name[i] + " " + for i in range(len(name)) + ) + player_name = unidecode(player_name) try: player_target = info[0].split(" ")[-1] diff --git a/app/source/bet_parsers/parse_betway.py b/app/source/bet_parsers/parse_betway.py index eca3dc67..ff665383 100644 --- a/app/source/bet_parsers/parse_betway.py +++ b/app/source/bet_parsers/parse_betway.py @@ -24,10 +24,10 @@ def read_file(file): matches[current_key].append(line) res = [] - for match in matches: + for match, value in matches.items(): home_team = unidecode(match.split(" @ ")[1]) away_team = unidecode(match.split(" @ ")[0]) - for i in range(0, len(matches[match]), 4): + for i in range(0, len(value), 4): info = matches[match][i:(i+4)] if(len(info) > 1): player_name = info[0].split(", ")[0].split(" ") diff --git a/app/source/bet_parsers/parse_ss.py b/app/source/bet_parsers/parse_ss.py index 88c13c30..11b2312d 100644 --- a/app/source/bet_parsers/parse_ss.py +++ b/app/source/bet_parsers/parse_ss.py @@ -24,10 +24,10 @@ def read_file(file): elif line != "": matches[current_key].append(line) res = [] - for match in matches: + for match, value in matches.items(): home_team = unidecode(match.split(" - ")[0]) away_team = unidecode(match.split(" - ")[1]) - for i in range(0, len(matches[match]), 3): + for i in range(0, len(value), 3): name_list = matches[match][i].split(" ")[:-4] first_name = name_list[0] last_name = name_list[1] diff --git a/app/source/bet_parsers/parse_unibet.py b/app/source/bet_parsers/parse_unibet.py index 754747b1..fd09eddf 100644 --- a/app/source/bet_parsers/parse_unibet.py +++ b/app/source/bet_parsers/parse_unibet.py @@ -24,10 +24,10 @@ def read_file(file): elif line != "": matches[current_key].append(line) res = [] - for match in matches: + for match, value in matches.items(): home_team = unidecode(match.split(" - ")[0]) away_team = unidecode(match.split(" - ")[1]) - for i in range(0, len(matches[match]), 5): + for i in range(0, len(value), 5): info = matches[match][i:(i+5)] if(len(info) > 1): player_name = info[0].split(", ") diff --git a/app/source/bet_parsers/parse_wh.py b/app/source/bet_parsers/parse_wh.py index d6a02650..fc52896b 100644 --- a/app/source/bet_parsers/parse_wh.py +++ b/app/source/bet_parsers/parse_wh.py @@ -24,10 +24,10 @@ def read_file(file): elif line != "": matches[current_key].append(line) res = [] - for match in matches: + for match, value in matches.items(): home_team = unidecode(match.split(" - ")[0]) away_team = unidecode(match.split(" - ")[1]) - for i in range(0, len(matches[match]), 5): + for i in range(0, len(value), 5): info = matches[match][i:(i+5)] if(len(info) > 1): player_name = info[0].split(", ") diff --git a/app/source/bets_handler.py b/app/source/bets_handler.py index 287b6df9..92a1c4ac 100644 --- a/app/source/bets_handler.py +++ b/app/source/bets_handler.py @@ -63,30 +63,29 @@ def add_bet_to_db(bet, nhl_session, bets_session): if game_pk == -1: print("Game was not found, not adding bets {}".format(bet)) - else: - if not bets_session.query(Bet).filter(and_(Bet.gamePk == game_pk, + elif not bets_session.query(Bet).filter(and_(Bet.gamePk == game_pk, Bet.playerId == player_id, \ func.lower(Bet.site) == func.lower(bet[4]), \ func.lower(Bet.overUnder) == func.lower(str(bet[7]).replace(",", ".")) \ )).all(): - try: - new_bet = Bet() - new_bet.playerId = player_id - new_bet.homeTeamId = home_team - new_bet.awayTeamId = away_team - new_bet.dateTime = time - new_bet.site = bet[4] - new_bet.gamePk = game_pk - new_bet.overUnder = str(bet[7]).replace(",", ".") - new_bet.oddsOver = str(bet[5]).replace(",", ".") - new_bet.oddsUnder = str(bet[6]).replace(",", ".") - - bets_session.add(new_bet) - except: - print("Something went wrong, did not add {}".format(bet)) - else: - print("Bet already exists") - return + try: + new_bet = Bet() + new_bet.playerId = player_id + new_bet.homeTeamId = home_team + new_bet.awayTeamId = away_team + new_bet.dateTime = time + new_bet.site = bet[4] + new_bet.gamePk = game_pk + new_bet.overUnder = str(bet[7]).replace(",", ".") + new_bet.oddsOver = str(bet[5]).replace(",", ".") + new_bet.oddsUnder = str(bet[6]).replace(",", ".") + + bets_session.add(new_bet) + except: + print("Something went wrong, did not add {}".format(bet)) + else: + print("Bet already exists") + return def get_player_id_from_name(name, nhl_session): diff --git a/app/source/nhl_handler.py b/app/source/nhl_handler.py index 9666e31f..f6ccbe7e 100644 --- a/app/source/nhl_handler.py +++ b/app/source/nhl_handler.py @@ -129,38 +129,37 @@ def add_game_stats_to_db(res, *args, **kwargs): session.add(new_goalie_stats) - else: - if "skaterStats" in player_info["stats"]: - res_skater_stats = player_info["stats"]["skaterStats"] - - new_skater_stats = SkaterStats() - - new_skater_stats.playerId = player_info["person"]["id"] - new_skater_stats.gamePk = info["gamePk"] - new_skater_stats.position = player_info["position"]["code"] - new_skater_stats.team = team_info["team"]["id"] - - new_skater_stats.timeOnIce = convert_string_to_time(res_skater_stats["timeOnIce"]) - new_skater_stats.assists = res_skater_stats["assists"] - new_skater_stats.goals = res_skater_stats["goals"] - new_skater_stats.shots = res_skater_stats["shots"] - new_skater_stats.hits = res_skater_stats["hits"] - new_skater_stats.powerPlayGoals = res_skater_stats["powerPlayGoals"] - new_skater_stats.powerPlayAssists = res_skater_stats["powerPlayAssists"] - new_skater_stats.penaltyMinutes = res_skater_stats["penaltyMinutes"] - new_skater_stats.faceOffWins = res_skater_stats["faceOffWins"] - new_skater_stats.faceoffTaken = res_skater_stats["faceoffTaken"] - new_skater_stats.takeaways = res_skater_stats["takeaways"] - new_skater_stats.giveaways = res_skater_stats["giveaways"] - new_skater_stats.shortHandedGoals = res_skater_stats["shortHandedGoals"] - new_skater_stats.shortHandedAssists = res_skater_stats["shortHandedAssists"] - new_skater_stats.blocked = res_skater_stats["blocked"] - new_skater_stats.plusMinus = res_skater_stats["plusMinus"] - new_skater_stats.evenTimeOnIce = convert_string_to_time(res_skater_stats["evenTimeOnIce"]) - new_skater_stats.powerPlayTimeOnIce = convert_string_to_time(res_skater_stats["powerPlayTimeOnIce"]) - new_skater_stats.shortHandedTimeOnIce = convert_string_to_time(res_skater_stats["shortHandedTimeOnIce"]) - - session.add(new_skater_stats) + elif "skaterStats" in player_info["stats"]: + res_skater_stats = player_info["stats"]["skaterStats"] + + new_skater_stats = SkaterStats() + + new_skater_stats.playerId = player_info["person"]["id"] + new_skater_stats.gamePk = info["gamePk"] + new_skater_stats.position = player_info["position"]["code"] + new_skater_stats.team = team_info["team"]["id"] + + new_skater_stats.timeOnIce = convert_string_to_time(res_skater_stats["timeOnIce"]) + new_skater_stats.assists = res_skater_stats["assists"] + new_skater_stats.goals = res_skater_stats["goals"] + new_skater_stats.shots = res_skater_stats["shots"] + new_skater_stats.hits = res_skater_stats["hits"] + new_skater_stats.powerPlayGoals = res_skater_stats["powerPlayGoals"] + new_skater_stats.powerPlayAssists = res_skater_stats["powerPlayAssists"] + new_skater_stats.penaltyMinutes = res_skater_stats["penaltyMinutes"] + new_skater_stats.faceOffWins = res_skater_stats["faceOffWins"] + new_skater_stats.faceoffTaken = res_skater_stats["faceoffTaken"] + new_skater_stats.takeaways = res_skater_stats["takeaways"] + new_skater_stats.giveaways = res_skater_stats["giveaways"] + new_skater_stats.shortHandedGoals = res_skater_stats["shortHandedGoals"] + new_skater_stats.shortHandedAssists = res_skater_stats["shortHandedAssists"] + new_skater_stats.blocked = res_skater_stats["blocked"] + new_skater_stats.plusMinus = res_skater_stats["plusMinus"] + new_skater_stats.evenTimeOnIce = convert_string_to_time(res_skater_stats["evenTimeOnIce"]) + new_skater_stats.powerPlayTimeOnIce = convert_string_to_time(res_skater_stats["powerPlayTimeOnIce"]) + new_skater_stats.shortHandedTimeOnIce = convert_string_to_time(res_skater_stats["shortHandedTimeOnIce"]) + + session.add(new_skater_stats) except Exception as e: print(e) @@ -174,34 +173,34 @@ def fill_all_games_from_season(session, season): res = requests.get('https://statsapi.web.nhl.com/api/v1/schedule?season={}'.format(season)) res = res.json() - base = "https://statsapi.web.nhl.com/api/v1/game/" urls = [] - games_that_dont_have_to_be_updated = {} games = session.query(Game).filter(Game.statusCode == 7) - for game in games: - games_that_dont_have_to_be_updated[game.gamePk] = game - + games_that_dont_have_to_be_updated = {game.gamePk: game for game in games} if "dates" in res: + base = "https://statsapi.web.nhl.com/api/v1/game/" for date in res["dates"]: for game in date["games"]: - if game["gameType"] == "R" or game["gameType"] == "P": - if game["gamePk"] not in games_that_dont_have_to_be_updated.keys(): - if session.query(Game).filter(Game.gamePk == game["gamePk"]).first(): - remove_gamePk(session, game["gamePk"]) - - add_game_to_db(session, game) - game_pk = game["gamePk"] - urls.append((base + str(game_pk) + "/boxscore", { "session": session, "gamePk": str(game_pk), "stats" : {game["teams"]["home"]["team"]["id"]: {"wins": game["teams"]["home"]["leagueRecord"]["wins"], - "losses": game["teams"]["home"]["leagueRecord"]["losses"], - "ot": game["teams"]["home"]["leagueRecord"]["ot"] if "ot" in game["teams"]["home"]["leagueRecord"] else "", - "type": game["teams"]["home"]["leagueRecord"]["type"], - "score": game["teams"]["home"]["score"]}, - game["teams"]["away"]["team"]["id"]: {"wins": game["teams"]["away"]["leagueRecord"]["wins"], - "losses": game["teams"]["away"]["leagueRecord"]["losses"], - "ot": game["teams"]["away"]["leagueRecord"]["ot"] if "ot" in game["teams"]["away"]["leagueRecord"] else "", - "type": game["teams"]["away"]["leagueRecord"]["type"], - "score": game["teams"]["away"]["score"]}}})) + if ( + game["gameType"] in ["R", "P"] + and game["gamePk"] + not in games_that_dont_have_to_be_updated.keys() + ): + if session.query(Game).filter(Game.gamePk == game["gamePk"]).first(): + remove_gamePk(session, game["gamePk"]) + + add_game_to_db(session, game) + game_pk = game["gamePk"] + urls.append((base + str(game_pk) + "/boxscore", { "session": session, "gamePk": str(game_pk), "stats" : {game["teams"]["home"]["team"]["id"]: {"wins": game["teams"]["home"]["leagueRecord"]["wins"], + "losses": game["teams"]["home"]["leagueRecord"]["losses"], + "ot": game["teams"]["home"]["leagueRecord"]["ot"] if "ot" in game["teams"]["home"]["leagueRecord"] else "", + "type": game["teams"]["home"]["leagueRecord"]["type"], + "score": game["teams"]["home"]["score"]}, + game["teams"]["away"]["team"]["id"]: {"wins": game["teams"]["away"]["leagueRecord"]["wins"], + "losses": game["teams"]["away"]["leagueRecord"]["losses"], + "ot": game["teams"]["away"]["leagueRecord"]["ot"] if "ot" in game["teams"]["away"]["leagueRecord"] else "", + "type": game["teams"]["away"]["leagueRecord"]["type"], + "score": game["teams"]["away"]["score"]}}})) rs = (grequests.get(u[0], hooks={'response': [hook_factory(info=u[1])]}) for u in urls) responses = grequests.map(rs) @@ -280,18 +279,10 @@ def add_person_nickname(nickname, name, nhl_session): print("More than one id for:") print(name) return - print(nhl_session.query(Person).filter( - func.lower(Person.fullName).contains(func.lower(name)))) - raise "More than one id..." - if len(ids) == 0: print("Cant find a player with that name for:") print(name) return - print(nhl_session.query(Person).filter( - func.lower(Person.fullName).contains(func.lower(name)))) - raise "Cant find a player with that name..." - if not nhl_session.query(PersonNicknames).filter(and_(PersonNicknames.id == ids[0].id, func.lower(PersonNicknames.nickname) == func.lower(nickname))).first(): new_nickname = PersonNicknames() @@ -310,15 +301,11 @@ def add_team_nickname(nickname, name, nhl_session): print("More than one id for:") print(name) return - raise "More than one id..." - if len(ids) == 0: print("Cant find a team with that name for:") print(name) print(nhl_session.query(Team).filter(func.lower(Team.name).contains(func.lower(name)))) return - raise "Cant find a team with that name..." - if not nhl_session.query(TeamNicknames).filter(and_(TeamNicknames.id == ids[0].id, func.lower(TeamNicknames.nickname) == func.lower(nickname))).first(): new_nickname = TeamNicknames() diff --git a/app/source/predict.py b/app/source/predict.py index 7041a309..3260c50e 100644 --- a/app/source/predict.py +++ b/app/source/predict.py @@ -7,13 +7,11 @@ def predict_game(data, game_ids, target): - results = {} - cleaned_data = clean_data(data.copy()) #X_train, y_train, X_test, y_test = - return results + return {} def clean_data(data):