diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 1c261e3..62f01db 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -6,6 +6,10 @@ jobs: build: runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.8, 3.9, 3.10, 3.11, 3.12] + steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} diff --git a/Changelog.md b/Changelog.md index d25f2e7..89c4a1c 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,12 @@ # Change Log +## 1.1.5 2024-03-28 +* Moved from requirements.txt to pyproject.toml +* Fixed fotmob team colors and player stat issues in fm_match_data +* Team id bug fixes for transfermarkt +* Transfermarkt tm_player_data bug fix for previous seasons + + ## 1.1.4 2024-01-15 * added fbref functions * fb_player_match_logs_data diff --git a/LICENSE b/LICENSE index ab54d88..f56a370 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 ian-shepherd +Copyright (c) 2024 ian-shepherd Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..9fb5993 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,362 @@ +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "certifi" +version = "2024.2.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "idna" +version = "3.6" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, +] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "pandas" +version = "2.2.1" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8df8612be9cd1c7797c93e1c5df861b2ddda0b48b08f2c3eaa0702cf88fb5f88"}, + {file = "pandas-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0f573ab277252ed9aaf38240f3b54cfc90fff8e5cab70411ee1d03f5d51f3944"}, + {file = "pandas-2.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f02a3a6c83df4026e55b63c1f06476c9aa3ed6af3d89b4f04ea656ccdaaaa359"}, + {file = "pandas-2.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c38ce92cb22a4bea4e3929429aa1067a454dcc9c335799af93ba9be21b6beb51"}, + {file = "pandas-2.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c2ce852e1cf2509a69e98358e8458775f89599566ac3775e70419b98615f4b06"}, + {file = "pandas-2.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53680dc9b2519cbf609c62db3ed7c0b499077c7fefda564e330286e619ff0dd9"}, + {file = "pandas-2.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:94e714a1cca63e4f5939cdce5f29ba8d415d85166be3441165edd427dc9f6bc0"}, + {file = "pandas-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f821213d48f4ab353d20ebc24e4faf94ba40d76680642fb7ce2ea31a3ad94f9b"}, + {file = "pandas-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c70e00c2d894cb230e5c15e4b1e1e6b2b478e09cf27cc593a11ef955b9ecc81a"}, + {file = "pandas-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e97fbb5387c69209f134893abc788a6486dbf2f9e511070ca05eed4b930b1b02"}, + {file = "pandas-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101d0eb9c5361aa0146f500773395a03839a5e6ecde4d4b6ced88b7e5a1a6403"}, + {file = "pandas-2.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7d2ed41c319c9fb4fd454fe25372028dfa417aacb9790f68171b2e3f06eae8cd"}, + {file = "pandas-2.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:af5d3c00557d657c8773ef9ee702c61dd13b9d7426794c9dfeb1dc4a0bf0ebc7"}, + {file = "pandas-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:06cf591dbaefb6da9de8472535b185cba556d0ce2e6ed28e21d919704fef1a9e"}, + {file = "pandas-2.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:88ecb5c01bb9ca927ebc4098136038519aa5d66b44671861ffab754cae75102c"}, + {file = "pandas-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:04f6ec3baec203c13e3f8b139fb0f9f86cd8c0b94603ae3ae8ce9a422e9f5bee"}, + {file = "pandas-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a935a90a76c44fe170d01e90a3594beef9e9a6220021acfb26053d01426f7dc2"}, + {file = "pandas-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c391f594aae2fd9f679d419e9a4d5ba4bce5bb13f6a989195656e7dc4b95c8f0"}, + {file = "pandas-2.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9d1265545f579edf3f8f0cb6f89f234f5e44ba725a34d86535b1a1d38decbccc"}, + {file = "pandas-2.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:11940e9e3056576ac3244baef2fedade891977bcc1cb7e5cc8f8cc7d603edc89"}, + {file = "pandas-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:4acf681325ee1c7f950d058b05a820441075b0dd9a2adf5c4835b9bc056bf4fb"}, + {file = "pandas-2.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9bd8a40f47080825af4317d0340c656744f2bfdb6819f818e6ba3cd24c0e1397"}, + {file = "pandas-2.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df0c37ebd19e11d089ceba66eba59a168242fc6b7155cba4ffffa6eccdfb8f16"}, + {file = "pandas-2.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:739cc70eaf17d57608639e74d63387b0d8594ce02f69e7a0b046f117974b3019"}, + {file = "pandas-2.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9d3558d263073ed95e46f4650becff0c5e1ffe0fc3a015de3c79283dfbdb3df"}, + {file = "pandas-2.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4aa1d8707812a658debf03824016bf5ea0d516afdea29b7dc14cf687bc4d4ec6"}, + {file = "pandas-2.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:76f27a809cda87e07f192f001d11adc2b930e93a2b0c4a236fde5429527423be"}, + {file = "pandas-2.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:1ba21b1d5c0e43416218db63037dbe1a01fc101dc6e6024bcad08123e48004ab"}, + {file = "pandas-2.2.1.tar.gz", hash = "sha256:0ab90f87093c13f3e8fa45b48ba9f39181046e8f3317d3aadb2fffbb1b978572"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0,<2", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + +[[package]] +name = "urllib3" +version = "2.2.1" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.9" +content-hash = "b510f2956579e52c4ecf1129d9fea6c56d667f2e8c9bf5881124affdbd37ecb9" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..77d0fd5 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,19 @@ +[tool.poetry] +name = "reus" +version = "1.1.5" +description = "A package that allows you to pull soccer statistics, player market values, and transfer information, primarily from FBref, Fotmob, and Transfermarkt" +authors = ["ian-shepherd "] +license = "MIT" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.9" +pandas = "^2.2.0" +numpy = "^1.26.4" +requests = "^2.23.0" +beautifulsoup4 = "^4.10.0" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/reus/fotmob/fm_match_data.py b/reus/fotmob/fm_match_data.py index c0c278c..ed64027 100644 --- a/reus/fotmob/fm_match_data.py +++ b/reus/fotmob/fm_match_data.py @@ -376,18 +376,24 @@ def fm_match_data( "team_y": general.get("awayTeam").get("name"), "id_x": general.get("homeTeam").get("id"), "id_y": general.get("awayTeam").get("id"), - "color_x": general.get("teamColors").get("home") - if isinstance(general.get("teamColors"), dict) - else general.get("teamColors")[0].get("color"), - "color_y": general.get("teamColors").get("away") - if isinstance(general.get("teamColors"), dict) - else general.get("teamColors")[1].get("color"), + "color_x": ( + general.get("teamColors").get("lightMode").get("home") + if isinstance(general.get("teamColors"), dict) + else general.get("teamColors")[0].get("color") + ), + "color_y": ( + general.get("teamColors").get("lightMode").get("away") + if isinstance(general.get("teamColors"), dict) + else general.get("teamColors")[1].get("color") + ), "score_x": header.get("teams")[0].get("score"), "score_y": header.get("teams")[1].get("score"), "reason": header.get("status").get("reason").get("long"), - "highlights": matchFacts.get("highlights").get("url") - if matchFacts.get("highlights") - else None, + "highlights": ( + matchFacts.get("highlights").get("url") + if matchFacts.get("highlights") + else None + ), "venue": matchFacts.get("infoBox").get("Stadium").get("name"), "city": matchFacts.get("infoBox").get("Stadium").get("city"), "country": matchFacts.get("infoBox").get("Stadium").get("country"), @@ -395,14 +401,16 @@ def fm_match_data( "long": matchFacts.get("infoBox").get("Stadium").get("long"), "referee": matchFacts.get("infoBox").get("Referee").get("text"), "attendance": matchFacts.get("infoBox").get("Attendance"), - "player_of_match": " ".join( - matchFacts.get("playerOfTheMatch").get("name").values() - ) - if matchFacts.get("playerOfTheMatch") - else None, - "player_of_match_id": matchFacts.get("playerOfTheMatch").get("id") - if matchFacts.get("playerOfTheMatch") - else None, + "player_of_match": ( + " ".join(matchFacts.get("playerOfTheMatch").get("name").values()) + if matchFacts.get("playerOfTheMatch") + else None + ), + "player_of_match_id": ( + matchFacts.get("playerOfTheMatch").get("id") + if matchFacts.get("playerOfTheMatch") + else None + ), } events = matchFacts.get("events")["events"] diff --git a/reus/fotmob/util.py b/reus/fotmob/util.py index 98ab6bf..8ce5156 100644 --- a/reus/fotmob/util.py +++ b/reus/fotmob/util.py @@ -1,10 +1,16 @@ -def extract_player_stats(stats): +def extract_player_stats(stats): # noqa: C901 mydict = {} playerStats = stats[0].get("stats") tmp = {} for k, v in playerStats.items(): - tmp[k] = v.get("value") + val = v["stat"].get("value") + total = v["stat"].get("total") + if total is not None: + tmp[k] = f"{val}/{total}" + else: + tmp[k] = val + playerStats = tmp mydict["rating"] = playerStats.get("FotMob rating") @@ -26,7 +32,12 @@ def extract_player_stats(stats): playerStatsAttack = stats[1].get("stats") tmp = {} for k, v in playerStatsAttack.items(): - tmp[k] = v.get("value") + val = v["stat"].get("value") + total = v["stat"].get("total") + if total is not None: + tmp[k] = f"{val}/{total}" + else: + tmp[k] = val playerStatsAttack = tmp mydict["shot_accuracy"] = playerStatsAttack.get("Shot accuracy") @@ -50,7 +61,12 @@ def extract_player_stats(stats): playerStatsDefense = stats[2].get("stats") tmp = {} for k, v in playerStatsDefense.items(): - tmp[k] = v.get("value") + val = v["stat"].get("value") + total = v["stat"].get("total") + if total is not None: + tmp[k] = f"{val}/{total}" + else: + tmp[k] = val playerStatsDefense = tmp mydict["tackles_won"] = playerStatsDefense.get("Tackles won") @@ -67,7 +83,12 @@ def extract_player_stats(stats): playerStatsDuels = stats[3].get("stats") tmp = {} for k, v in playerStatsDuels.items(): - tmp[k] = v.get("value") + val = v["stat"].get("value") + total = v["stat"].get("total") + if total is not None: + tmp[k] = f"{val}/{total}" + else: + tmp[k] = val playerStatsDuels = tmp mydict["ground_duels_won"] = playerStatsDuels.get("Ground duels won") diff --git a/reus/transfermarkt/tm_player_metadata.py b/reus/transfermarkt/tm_player_metadata.py index e3e8069..ecff288 100644 --- a/reus/transfermarkt/tm_player_metadata.py +++ b/reus/transfermarkt/tm_player_metadata.py @@ -173,7 +173,7 @@ def tm_player_metadata(pageSoup=None, url: str = None) -> dict: meta_attributes = { "joined": "Joined:", "contracted": "Contract expires:", - "extension": "Date of last contract extension:", + "extension": "Last contract extension:", } for attr, pattern in meta_attributes.items(): diff --git a/reus/transfermarkt/tm_team_player_data.py b/reus/transfermarkt/tm_team_player_data.py index 082ac5a..ab0299a 100644 --- a/reus/transfermarkt/tm_team_player_data.py +++ b/reus/transfermarkt/tm_team_player_data.py @@ -18,7 +18,7 @@ def _get_team_id_and_club(team_id, club): ) filtered_df = df[filter_condition] club = filtered_df.transfermarkt_link.iloc[0] - team_id = int(filtered_df.transfermarkt.iloc[0]) + team_id = int(float(filtered_df.transfermarkt.iloc[0])) return club, team_id diff --git a/reus/transfermarkt/tm_team_staff.py b/reus/transfermarkt/tm_team_staff.py index 0a2dae6..fb9ae6c 100644 --- a/reus/transfermarkt/tm_team_staff.py +++ b/reus/transfermarkt/tm_team_staff.py @@ -17,7 +17,7 @@ def _get_team_id_and_club(team_id, club): ) filtered_df = df[filter_condition] club = filtered_df.transfermarkt_link.iloc[0] - team_id = int(filtered_df.transfermarkt.iloc[0]) + team_id = int(float(filtered_df.transfermarkt.iloc[0])) return club, team_id diff --git a/reus/transfermarkt/tm_team_staff_history.py b/reus/transfermarkt/tm_team_staff_history.py index 3e3fdb8..83206d6 100644 --- a/reus/transfermarkt/tm_team_staff_history.py +++ b/reus/transfermarkt/tm_team_staff_history.py @@ -17,7 +17,7 @@ def _get_team_id_and_club(team_id, club): ) filtered_df = df[filter_condition] club = filtered_df.transfermarkt_link.iloc[0] - team_id = int(filtered_df.transfermarkt.iloc[0]) + team_id = int(float(filtered_df.transfermarkt.iloc[0])) return club, team_id diff --git a/reus/transfermarkt/tm_team_transfers.py b/reus/transfermarkt/tm_team_transfers.py index 3807892..967dca7 100644 --- a/reus/transfermarkt/tm_team_transfers.py +++ b/reus/transfermarkt/tm_team_transfers.py @@ -18,7 +18,7 @@ def _get_team_id_and_club(team_id, club): ) filtered_df = df[filter_condition] club = filtered_df.transfermarkt_link.iloc[0] - team_id = int(filtered_df.transfermarkt.iloc[0]) + team_id = int(float(filtered_df.transfermarkt.iloc[0])) return club, team_id diff --git a/setup.py b/setup.py index 0205a24..a748696 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ import setuptools -VERSION = "1.1.4" -DESCRIPTION = "A package that allows you to soccer information" +VERSION = "1.1.5" +DESCRIPTION = "A package that allows you scrape soccer information" LONG_DESCRIPTION = """ A package that allows you to pull soccer statistics, player market values, and transfer information, primarily from FBref, Fotmob, and Transfermarkt""" @@ -13,7 +13,12 @@ long_description=LONG_DESCRIPTION, url="https://github.com/ian-shepherd/reus", author="Ian Shepherd", - install_requires=["pandas", "numpy", "requests", "beautifulsoup4>=4.10.0"], + install_requires=[ + "pandas>=2.2.0", + "numpy>=1.26.4", + "requests>=2.23.0", + "beautifulsoup4>=4.10.0", + ], keywords=["python", "fbref", "fotmob", "transfermarkt", "soccer", "football"], classifiers=[ "Programming Language :: Python :: 3", diff --git a/tests/fbref/data/pulisic_2019_2020_scouting.json b/tests/fbref/data/pulisic_2019_2020_scouting.json index 19f9981..a4a4cc1 100644 --- a/tests/fbref/data/pulisic_2019_2020_scouting.json +++ b/tests/fbref/data/pulisic_2019_2020_scouting.json @@ -10,7 +10,7 @@ "Red Cards": {"value": "0.00", "percentile": 54}, "xG: Expected Goals": {"value": "0.47", "percentile": 93}, "npxG: Non-Penalty xG": {"value": "0.47", "percentile": 96}, - "xAG: Expected Assisted Goals": {"value": "0.19", "percentile": 66}, + "xAG: Exp. Assisted Goals": {"value": "0.19", "percentile": 66}, "npxG + xAG": {"value": "0.66", "percentile": 93}, "Progressive Carries": {"value": "5.59", "percentile": 92}, "Progressive Passes": {"value": "3.82", "percentile": 51}, @@ -49,7 +49,7 @@ "Passes Attempted (Long)": {"value": "2.56", "percentile": 27}, "Pass Completion % (Long)": {"value": "51.0", "percentile": 49}, "Assists": {"value": "0.21", "percentile": 70}, - "xAG: Expected Assisted Goals": {"value": "0.19", "percentile": 66}, + "xAG: Exp. Assisted Goals": {"value": "0.19", "percentile": 66}, "xA: Expected Assists": {"value": "0.14", "percentile": 51}, "Key Passes": {"value": "1.57", "percentile": 53}, "Passes into Final Third": {"value": "1.31", "percentile": 25}, diff --git a/tests/fbref/data/reus_2018_2019_scouting.json b/tests/fbref/data/reus_2018_2019_scouting.json index 382513c..a5d6c97 100644 --- a/tests/fbref/data/reus_2018_2019_scouting.json +++ b/tests/fbref/data/reus_2018_2019_scouting.json @@ -10,7 +10,7 @@ "Red Cards": {"value": "0.04", "percentile": 8}, "xG: Expected Goals": {"value": "0.61", "percentile": 97}, "npxG: Non-Penalty xG": {"value": "0.52", "percentile": 97}, - "xAG: Expected Assisted Goals": {"value": "0.25", "percentile": 75}, + "xAG: Exp. Assisted Goals": {"value": "0.25", "percentile": 75}, "npxG + xAG": {"value": "0.77", "percentile": 96}, "Progressive Carries": {"value": "2.99", "percentile": 50}, "Progressive Passes": {"value": "4.86", "percentile": 76}, @@ -49,7 +49,7 @@ "Passes Attempted (Long)": {"value": "3.26", "percentile": 36}, "Pass Completion % (Long)": {"value": "76.2", "percentile": 96}, "Assists": {"value": "0.31", "percentile": 82}, - "xAG: Expected Assisted Goals": {"value": "0.25", "percentile": 75}, + "xAG: Exp. Assisted Goals": {"value": "0.25", "percentile": 75}, "xA: Expected Assists": {"value": "0.27", "percentile": 83}, "Key Passes": {"value": "1.48", "percentile": 62}, "Passes into Final Third": {"value": "3.30", "percentile": 89}, diff --git a/tests/fotmob/data/3901251.json b/tests/fotmob/data/3901251.json index b478fc6..3805f39 100644 --- a/tests/fotmob/data/3901251.json +++ b/tests/fotmob/data/3901251.json @@ -15,8 +15,8 @@ "team_y": "Tottenham Hotspur", "id_x": 10261, "id_y": 8586, - "color_x": null, - "color_y": null, + "color_x": "#141413", + "color_y": "#132257", "score_x": 6, "score_y": 1, "reason": "Full-Time", @@ -1879,22 +1879,22 @@ "goals": 1, "assists": 0, "total_shots": 1, - "accurate_passes": "4/4 (100%)", + "accurate_passes": "4/4", "chances_created": 1, - "xG": "0.29", - "xGOT": "0.94", - "xA": "0.02", + "xG": 0.29, + "xGOT": 0.94, + "xA": 0.02, "conceded_penalty": null, "fantasy_points": 5, "errors_lead_to_goal": null, - "shot_accuracy": "1/1 (100%)", + "shot_accuracy": "1/1", "blocked_shots": null, "big_chances_missed": null, "touches": 11, - "successful_dribbles": "2/2 (100%)", + "successful_dribbles": "2/2", "passes_into_final_third": null, "accurate_crosses": null, - "accurate_long_balls": "1/1 (100%)", + "accurate_long_balls": "1/1", "corners": null, "offsides": null, "dispossessed": 0, @@ -1905,10 +1905,10 @@ "interceptions": null, "recoveries": null, "dribbled_past": null, - "ground_duels_won": "4/4 (100%)", - "aerial_duels_won": 0, + "ground_duels_won": "4/4", + "aerial_duels_won": "0/0", "was_fouled": 2, - "fouls_committed": 0, + "fouls_committed": null, "saves": null, "goals_conceded": null, "xGOT_faced": null, @@ -1936,11 +1936,11 @@ "goals": 0, "assists": 0, "total_shots": 1, - "accurate_passes": "14/18 (78%)", + "accurate_passes": "14/18", "chances_created": 1, - "xG": "0.04", + "xG": 0.04, "xGOT": null, - "xA": "0.04", + "xA": 0.04, "conceded_penalty": null, "fantasy_points": 4, "errors_lead_to_goal": null, @@ -1948,7 +1948,7 @@ "blocked_shots": 1, "big_chances_missed": null, "touches": 23, - "successful_dribbles": "0/1 (0%)", + "successful_dribbles": "0/1", "passes_into_final_third": 3, "accurate_crosses": null, "accurate_long_balls": null, @@ -1962,8 +1962,8 @@ "interceptions": null, "recoveries": null, "dribbled_past": 1, - "ground_duels_won": "1/5 (20%)", - "aerial_duels_won": 0, + "ground_duels_won": "1/5", + "aerial_duels_won": "0/0", "was_fouled": 1, "fouls_committed": 1, "saves": null, @@ -1993,21 +1993,21 @@ "goals": 0, "assists": 0, "total_shots": 1, - "accurate_passes": "11/11 (100%)", + "accurate_passes": "11/11", "chances_created": 1, - "xG": "0.28", - "xGOT": "0.76", - "xA": "0.07", + "xG": 0.28, + "xGOT": 0.76, + "xA": 0.07, "conceded_penalty": null, "fantasy_points": 1, "errors_lead_to_goal": null, - "shot_accuracy": "1/1 (100%)", + "shot_accuracy": "1/1", "blocked_shots": null, "big_chances_missed": null, "touches": 18, "successful_dribbles": null, "passes_into_final_third": 3, - "accurate_crosses": "1/2 (50%)", + "accurate_crosses": "1/2", "accurate_long_balls": null, "corners": 2, "offsides": null, @@ -2019,10 +2019,10 @@ "interceptions": null, "recoveries": null, "dribbled_past": 2, - "ground_duels_won": "0/2 (0%)", - "aerial_duels_won": 0, - "was_fouled": 0, - "fouls_committed": 0, + "ground_duels_won": "0/2", + "aerial_duels_won": "0/0", + "was_fouled": null, + "fouls_committed": null, "saves": null, "goals_conceded": null, "xGOT_faced": null, @@ -2050,11 +2050,11 @@ "goals": 0, "assists": 0, "total_shots": 0, - "accurate_passes": "15/16 (94%)", + "accurate_passes": "15/16", "chances_created": 0, "xG": null, "xGOT": null, - "xA": "0.01", + "xA": 0.01, "conceded_penalty": null, "fantasy_points": 1, "errors_lead_to_goal": null, @@ -2064,22 +2064,22 @@ "touches": 24, "successful_dribbles": null, "passes_into_final_third": 2, - "accurate_crosses": "1/1 (100%)", - "accurate_long_balls": "1/1 (100%)", + "accurate_crosses": "1/1", + "accurate_long_balls": "1/1", "corners": null, "offsides": null, "dispossessed": 0, - "tackles_won": "1/1 (100%)", + "tackles_won": "1/1", "blocks": null, "clearances": 1, "headed_clearances": null, "interceptions": 1, "recoveries": null, "dribbled_past": null, - "ground_duels_won": "1/1 (100%)", - "aerial_duels_won": 0, - "was_fouled": 0, - "fouls_committed": 0, + "ground_duels_won": "1/1", + "aerial_duels_won": "0/0", + "was_fouled": null, + "fouls_committed": null, "saves": null, "goals_conceded": null, "xGOT_faced": null, @@ -2107,9 +2107,9 @@ "goals": 0, "assists": 0, "total_shots": 1, - "accurate_passes": "14/14 (100%)", + "accurate_passes": "14/14", "chances_created": 0, - "xG": "0.04", + "xG": 0.04, "xGOT": null, "xA": null, "conceded_penalty": null, @@ -2133,10 +2133,10 @@ "interceptions": null, "recoveries": null, "dribbled_past": null, - "ground_duels_won": 0, - "aerial_duels_won": 0, - "was_fouled": 0, - "fouls_committed": 0, + "ground_duels_won": null, + "aerial_duels_won": "0/0", + "was_fouled": null, + "fouls_committed": null, "saves": null, "goals_conceded": null, "xGOT_faced": null, @@ -2156,7 +2156,7 @@ "shirt_number": 11, "time_subbed_on": null, "time_subbed_off": null, - "minutes_played": 0, + "minutes_played": null, "usual_position": 3, "role": "Attacker", "is_captain": false @@ -2170,7 +2170,7 @@ "shirt_number": 32, "time_subbed_on": null, "time_subbed_off": null, - "minutes_played": 0, + "minutes_played": null, "usual_position": 2, "role": "Midfielder", "is_captain": false @@ -2184,7 +2184,7 @@ "shirt_number": 13, "time_subbed_on": null, "time_subbed_off": null, - "minutes_played": 0, + "minutes_played": null, "usual_position": 1, "role": "Defender", "is_captain": false @@ -2198,7 +2198,7 @@ "shirt_number": 1, "time_subbed_on": null, "time_subbed_off": null, - "minutes_played": 0, + "minutes_played": null, "usual_position": 0, "role": "Keeper", "is_captain": false @@ -2220,7 +2220,7 @@ "goals": 0, "assists": 0, "total_shots": 0, - "accurate_passes": "24/30 (80%)", + "accurate_passes": "24/30", "chances_created": 0, "xG": null, "xGOT": null, @@ -2232,24 +2232,24 @@ "blocked_shots": null, "big_chances_missed": null, "touches": 44, - "successful_dribbles": "1/2 (50%)", + "successful_dribbles": "1/2", "passes_into_final_third": 3, "accurate_crosses": null, - "accurate_long_balls": "1/1 (100%)", + "accurate_long_balls": "1/1", "corners": null, "offsides": null, "dispossessed": 0, - "tackles_won": "2/2 (100%)", + "tackles_won": "2/2", "blocks": 2, "clearances": 1, "headed_clearances": null, "interceptions": 1, "recoveries": null, "dribbled_past": 1, - "ground_duels_won": "3/5 (60%)", - "aerial_duels_won": 0, - "was_fouled": 0, - "fouls_committed": 0, + "ground_duels_won": "3/5", + "aerial_duels_won": "0/0", + "was_fouled": null, + "fouls_committed": null, "saves": null, "goals_conceded": null, "xGOT_faced": null, @@ -2277,7 +2277,7 @@ "goals": null, "assists": null, "total_shots": null, - "accurate_passes": "8/16 (50%)", + "accurate_passes": "8/16", "chances_created": null, "xG": null, "xGOT": null, @@ -2286,10 +2286,10 @@ "fantasy_points": 1, "errors_lead_to_goal": null, "touches": 17, - "accurate_long_balls": "2/9 (22%)", - "saves": "1/8 (13%)", + "accurate_long_balls": "2/9", + "saves": 1, "goals_conceded": 1, - "xGOT_faced": "1.70", + "xGOT_faced": 1.7, "diving_save": 0, "saves_inside_box": 1, "acted_as_sweeper": 0, @@ -2315,15 +2315,15 @@ "goals": 0, "assists": 0, "total_shots": 1, - "accurate_passes": "2/4 (50%)", + "accurate_passes": "2/4", "chances_created": 0, - "xG": "0.34", - "xGOT": "0.16", + "xG": 0.34, + "xGOT": 0.16, "xA": null, "conceded_penalty": null, "fantasy_points": 1, "errors_lead_to_goal": null, - "shot_accuracy": "1/1 (100%)", + "shot_accuracy": "1/1", "blocked_shots": null, "big_chances_missed": null, "touches": 6, @@ -2341,10 +2341,10 @@ "interceptions": null, "recoveries": null, "dribbled_past": null, - "ground_duels_won": 0, - "aerial_duels_won": 0, - "was_fouled": 0, - "fouls_committed": 0, + "ground_duels_won": null, + "aerial_duels_won": "0/0", + "was_fouled": null, + "fouls_committed": null, "saves": null, "goals_conceded": null, "xGOT_faced": null, @@ -2368,15 +2368,15 @@ "usual_position": 3, "role": "Attacker", "is_captain": false, - "rating": 0, + "rating": null, "goals": 0, "assists": 0, "total_shots": 0, - "accurate_passes": "0/1 (0%)", + "accurate_passes": "0/1", "chances_created": 1, "xG": null, "xGOT": null, - "xA": "0.06", + "xA": 0.06, "conceded_penalty": null, "fantasy_points": 1, "errors_lead_to_goal": null, @@ -2384,9 +2384,9 @@ "blocked_shots": null, "big_chances_missed": null, "touches": 3, - "successful_dribbles": "1/1 (100%)", + "successful_dribbles": "1/1", "passes_into_final_third": 1, - "accurate_crosses": "1/1 (100%)", + "accurate_crosses": "1/1", "accurate_long_balls": null, "corners": null, "offsides": null, @@ -2398,10 +2398,10 @@ "interceptions": null, "recoveries": null, "dribbled_past": null, - "ground_duels_won": "1/1 (100%)", - "aerial_duels_won": 0, - "was_fouled": 0, - "fouls_committed": 0, + "ground_duels_won": "1/1", + "aerial_duels_won": "0/0", + "was_fouled": null, + "fouls_committed": null, "saves": null, "goals_conceded": null, "xGOT_faced": null, @@ -2421,7 +2421,7 @@ "shirt_number": 45, "time_subbed_on": null, "time_subbed_off": null, - "minutes_played": 0, + "minutes_played": null, "usual_position": 2, "role": "Midfielder", "is_captain": false @@ -2435,7 +2435,7 @@ "shirt_number": 55, "time_subbed_on": null, "time_subbed_off": null, - "minutes_played": 0, + "minutes_played": null, "usual_position": 2, "role": "Midfielder", "is_captain": false @@ -2449,7 +2449,7 @@ "shirt_number": 33, "time_subbed_on": null, "time_subbed_off": null, - "minutes_played": 0, + "minutes_played": null, "usual_position": 1, "role": "Defender", "is_captain": false @@ -2463,7 +2463,7 @@ "shirt_number": 34, "time_subbed_on": null, "time_subbed_off": null, - "minutes_played": 0, + "minutes_played": null, "usual_position": 1, "role": "Defender", "is_captain": false @@ -2477,7 +2477,7 @@ "shirt_number": 25, "time_subbed_on": null, "time_subbed_off": null, - "minutes_played": 0, + "minutes_played": null, "usual_position": 1, "role": "Defender", "is_captain": false @@ -2503,7 +2503,7 @@ "goals": null, "assists": null, "total_shots": null, - "accurate_passes": "7/14 (50%)", + "accurate_passes": "7/14", "chances_created": null, "xG": null, "xGOT": null, @@ -2511,10 +2511,10 @@ "conceded_penalty": null, "errors_lead_to_goal": null, "touches": 23, - "accurate_long_balls": "5/12 (42%)", - "saves": "2/3 (67%)", + "accurate_long_balls": "5/12", + "saves": 2, "goals_conceded": 1, - "xGOT_faced": "1.07", + "xGOT_faced": 1.07, "diving_save": 0, "saves_inside_box": 2, "acted_as_sweeper": 1, @@ -2542,21 +2542,21 @@ "goals": 0, "assists": 0, "total_shots": 0, - "accurate_passes": "44/51 (86%)", + "accurate_passes": "44/51", "chances_created": 5, "xG": null, "xGOT": null, - "xA": "0.39", + "xA": 0.39, "conceded_penalty": null, "errors_lead_to_goal": null, "shot_accuracy": null, "blocked_shots": null, "big_chances_missed": null, "touches": 68, - "successful_dribbles": "1/1 (100%)", + "successful_dribbles": "1/1", "passes_into_final_third": 6, - "accurate_crosses": "4/10 (40%)", - "accurate_long_balls": "3/4 (75%)", + "accurate_crosses": "4/10", + "accurate_long_balls": "3/4", "corners": 6, "offsides": null, "dispossessed": 0, @@ -2567,9 +2567,9 @@ "interceptions": null, "recoveries": null, "dribbled_past": 2, - "ground_duels_won": "1/4 (25%)", - "aerial_duels_won": "1/1 (100%)", - "was_fouled": 0, + "ground_duels_won": "1/4", + "aerial_duels_won": "1/1", + "was_fouled": null, "fouls_committed": 1, "saves": null, "goals_conceded": null, @@ -2600,35 +2600,35 @@ "goals": 0, "assists": 2, "total_shots": 1, - "accurate_passes": "31/40 (78%)", + "accurate_passes": "31/40", "chances_created": 2, - "xG": "0.03", + "xG": 0.03, "xGOT": null, - "xA": "0.19", + "xA": 0.19, "conceded_penalty": null, "errors_lead_to_goal": null, - "shot_accuracy": "0/1 (0%)", + "shot_accuracy": "0/1", "blocked_shots": null, "big_chances_missed": null, "touches": 47, "successful_dribbles": null, "passes_into_final_third": 2, "accurate_crosses": null, - "accurate_long_balls": "6/7 (86%)", + "accurate_long_balls": "6/7", "corners": null, "offsides": null, "dispossessed": 0, - "tackles_won": "4/4 (100%)", + "tackles_won": "4/4", "blocks": null, "clearances": null, "headed_clearances": null, "interceptions": 1, "recoveries": null, "dribbled_past": 1, - "ground_duels_won": "4/5 (80%)", - "aerial_duels_won": "4/5 (80%)", - "was_fouled": 0, - "fouls_committed": 0, + "ground_duels_won": "4/5", + "aerial_duels_won": "4/5", + "was_fouled": null, + "fouls_committed": null, "saves": null, "goals_conceded": null, "xGOT_faced": null, @@ -2658,9 +2658,9 @@ "goals": 0, "assists": 0, "total_shots": 1, - "accurate_passes": "47/49 (96%)", + "accurate_passes": "47/49", "chances_created": 0, - "xG": "0.02", + "xG": 0.02, "xGOT": null, "xA": null, "conceded_penalty": null, @@ -2672,7 +2672,7 @@ "successful_dribbles": null, "passes_into_final_third": null, "accurate_crosses": null, - "accurate_long_balls": "0/1 (0%)", + "accurate_long_balls": "0/1", "corners": null, "offsides": null, "dispossessed": 0, @@ -2683,10 +2683,10 @@ "interceptions": null, "recoveries": null, "dribbled_past": null, - "ground_duels_won": 0, - "aerial_duels_won": "2/2 (100%)", - "was_fouled": 0, - "fouls_committed": 0, + "ground_duels_won": null, + "aerial_duels_won": "2/2", + "was_fouled": null, + "fouls_committed": null, "saves": null, "goals_conceded": null, "xGOT_faced": null, @@ -2716,33 +2716,33 @@ "goals": 0, "assists": 0, "total_shots": 2, - "accurate_passes": "40/50 (80%)", + "accurate_passes": "40/50", "chances_created": 0, - "xG": "0.18", + "xG": 0.18, "xGOT": null, - "xA": "0.02", + "xA": 0.02, "conceded_penalty": null, "errors_lead_to_goal": null, - "shot_accuracy": "0/1 (0%)", + "shot_accuracy": "0/1", "blocked_shots": 1, "big_chances_missed": null, "touches": 81, - "successful_dribbles": "1/2 (50%)", + "successful_dribbles": "1/2", "passes_into_final_third": 9, - "accurate_crosses": "0/1 (0%)", - "accurate_long_balls": "1/6 (17%)", + "accurate_crosses": "0/1", + "accurate_long_balls": "1/6", "corners": null, "offsides": null, "dispossessed": 1, - "tackles_won": "1/4 (25%)", + "tackles_won": "1/4", "blocks": 1, "clearances": 3, "headed_clearances": 1, "interceptions": 1, "recoveries": null, "dribbled_past": null, - "ground_duels_won": "6/10 (60%)", - "aerial_duels_won": "0/1 (0%)", + "ground_duels_won": "6/10", + "aerial_duels_won": "0/1", "was_fouled": 1, "fouls_committed": 2, "saves": null, @@ -2774,35 +2774,35 @@ "goals": 0, "assists": 1, "total_shots": 3, - "accurate_passes": "34/35 (97%)", + "accurate_passes": "34/35", "chances_created": 2, - "xG": "0.27", + "xG": 0.27, "xGOT": null, - "xA": "0.02", + "xA": 0.02, "conceded_penalty": null, "errors_lead_to_goal": null, "shot_accuracy": null, "blocked_shots": 3, "big_chances_missed": null, "touches": 47, - "successful_dribbles": "0/1 (0%)", + "successful_dribbles": "0/1", "passes_into_final_third": 2, "accurate_crosses": null, - "accurate_long_balls": "1/1 (100%)", + "accurate_long_balls": "1/1", "corners": null, "offsides": 1, "dispossessed": 1, - "tackles_won": "0/1 (0%)", + "tackles_won": "0/1", "blocks": null, "clearances": null, "headed_clearances": null, "interceptions": null, "recoveries": null, "dribbled_past": null, - "ground_duels_won": "2/4 (50%)", - "aerial_duels_won": "0/1 (0%)", + "ground_duels_won": "2/4", + "aerial_duels_won": "0/1", "was_fouled": 1, - "fouls_committed": 0, + "fouls_committed": null, "saves": null, "goals_conceded": null, "xGOT_faced": null, @@ -2832,35 +2832,35 @@ "goals": 0, "assists": 0, "total_shots": 0, - "accurate_passes": "61/68 (90%)", + "accurate_passes": "61/68", "chances_created": 4, "xG": null, "xGOT": null, - "xA": "0.36", + "xA": 0.36, "conceded_penalty": null, "errors_lead_to_goal": null, "shot_accuracy": null, "blocked_shots": null, "big_chances_missed": null, "touches": 81, - "successful_dribbles": "1/1 (100%)", + "successful_dribbles": "1/1", "passes_into_final_third": 10, - "accurate_crosses": "1/3 (33%)", - "accurate_long_balls": "9/10 (90%)", + "accurate_crosses": "1/3", + "accurate_long_balls": "9/10", "corners": null, "offsides": null, "dispossessed": 2, - "tackles_won": "1/2 (50%)", + "tackles_won": "1/2", "blocks": null, "clearances": null, "headed_clearances": null, "interceptions": null, "recoveries": null, "dribbled_past": null, - "ground_duels_won": "6/8 (75%)", - "aerial_duels_won": "0/1 (0%)", + "ground_duels_won": "6/8", + "aerial_duels_won": "0/1", "was_fouled": 3, - "fouls_committed": 0, + "fouls_committed": null, "saves": null, "goals_conceded": null, "xGOT_faced": null, @@ -2890,33 +2890,33 @@ "goals": 0, "assists": 1, "total_shots": 3, - "accurate_passes": "42/48 (88%)", + "accurate_passes": "42/48", "chances_created": 3, - "xG": "0.39", + "xG": 0.39, "xGOT": null, - "xA": "0.27", + "xA": 0.27, "conceded_penalty": null, "errors_lead_to_goal": null, - "shot_accuracy": "0/1 (0%)", + "shot_accuracy": "0/1", "blocked_shots": 2, "big_chances_missed": null, "touches": 62, - "successful_dribbles": "3/5 (60%)", + "successful_dribbles": "3/5", "passes_into_final_third": 8, "accurate_crosses": null, - "accurate_long_balls": "1/2 (50%)", + "accurate_long_balls": "1/2", "corners": null, "offsides": null, "dispossessed": 1, - "tackles_won": "0/1 (0%)", + "tackles_won": "0/1", "blocks": null, "clearances": null, "headed_clearances": null, "interceptions": null, "recoveries": null, "dribbled_past": 2, - "ground_duels_won": "5/11 (45%)", - "aerial_duels_won": "1/1 (100%)", + "ground_duels_won": "5/11", + "aerial_duels_won": "1/1", "was_fouled": 1, "fouls_committed": 1, "saves": null, @@ -2943,26 +2943,26 @@ "usual_position": 3, "role": "Attacker", "is_captain": false, - "fantasy_points": "12 + 1", + "fantasy_points": 13, "rating": 9.01, "goals": 2, "assists": 0, "total_shots": 3, - "accurate_passes": "14/21 (67%)", + "accurate_passes": "14/21", "chances_created": 1, - "xG": "0.36", - "xGOT": "1.13", - "xA": "0.08", + "xG": 0.36, + "xGOT": 1.13, + "xA": 0.08, "conceded_penalty": null, "errors_lead_to_goal": null, - "shot_accuracy": "2/3 (67%)", + "shot_accuracy": "2/3", "blocked_shots": null, "big_chances_missed": null, "touches": 35, - "successful_dribbles": "1/2 (50%)", + "successful_dribbles": "1/2", "passes_into_final_third": 1, - "accurate_crosses": "1/3 (33%)", - "accurate_long_balls": "1/1 (100%)", + "accurate_crosses": "1/3", + "accurate_long_balls": "1/1", "corners": 1, "offsides": 1, "dispossessed": 0, @@ -2973,10 +2973,10 @@ "interceptions": 1, "recoveries": null, "dribbled_past": 1, - "ground_duels_won": "3/5 (60%)", - "aerial_duels_won": 0, + "ground_duels_won": "3/5", + "aerial_duels_won": "0/0", "was_fouled": 2, - "fouls_committed": 0, + "fouls_committed": null, "saves": null, "goals_conceded": null, "xGOT_faced": null, @@ -3001,26 +3001,26 @@ "usual_position": 3, "role": "Attacker", "is_captain": false, - "fantasy_points": "10 + 3", + "fantasy_points": 13, "rating": 8.86, "goals": 2, "assists": 0, "total_shots": 4, - "accurate_passes": "14/17 (82%)", + "accurate_passes": "14/17", "chances_created": 0, - "xG": "0.68", - "xGOT": "1.16", - "xA": "0.02", + "xG": 0.68, + "xGOT": 1.16, + "xA": 0.02, "conceded_penalty": null, "errors_lead_to_goal": null, - "shot_accuracy": "2/3 (67%)", + "shot_accuracy": "2/3", "blocked_shots": 1, "big_chances_missed": null, "touches": 29, - "successful_dribbles": "2/3 (67%)", + "successful_dribbles": "2/3", "passes_into_final_third": 4, "accurate_crosses": null, - "accurate_long_balls": "3/3 (100%)", + "accurate_long_balls": "3/3", "corners": null, "offsides": null, "dispossessed": 1, @@ -3031,9 +3031,9 @@ "interceptions": null, "recoveries": null, "dribbled_past": null, - "ground_duels_won": "2/5 (40%)", - "aerial_duels_won": 0, - "was_fouled": 0, + "ground_duels_won": "2/5", + "aerial_duels_won": "0/0", + "was_fouled": null, "fouls_committed": 1, "saves": null, "goals_conceded": null, @@ -3059,26 +3059,26 @@ "usual_position": 2, "role": "Midfielder", "is_captain": false, - "fantasy_points": "10 + 2", + "fantasy_points": 12, "rating": 8.64, "goals": 1, "assists": 0, "total_shots": 4, - "accurate_passes": "54/60 (90%)", + "accurate_passes": "54/60", "chances_created": 1, - "xG": "1.30", - "xGOT": "1.05", - "xA": "0.03", + "xG": 1.3, + "xGOT": 1.05, + "xA": 0.03, "conceded_penalty": null, "errors_lead_to_goal": null, - "shot_accuracy": "2/2 (100%)", + "shot_accuracy": "2/2", "blocked_shots": 2, "big_chances_missed": null, "touches": 83, - "successful_dribbles": "5/7 (71%)", + "successful_dribbles": "5/7", "passes_into_final_third": 4, "accurate_crosses": null, - "accurate_long_balls": "1/1 (100%)", + "accurate_long_balls": "1/1", "corners": null, "offsides": null, "dispossessed": 1, @@ -3089,8 +3089,8 @@ "interceptions": 2, "recoveries": null, "dribbled_past": 3, - "ground_duels_won": "7/14 (50%)", - "aerial_duels_won": "2/2 (100%)", + "ground_duels_won": "7/14", + "aerial_duels_won": "2/2", "was_fouled": 2, "fouls_committed": 1, "saves": null, @@ -3122,18 +3122,18 @@ "goals": 0, "assists": 0, "total_shots": 3, - "accurate_passes": "12/16 (75%)", + "accurate_passes": "12/16", "chances_created": 2, - "xG": "0.16", + "xG": 0.16, "xGOT": null, - "xA": "0.01", + "xA": 0.01, "conceded_penalty": null, "errors_lead_to_goal": null, - "shot_accuracy": "0/1 (0%)", + "shot_accuracy": "0/1", "blocked_shots": 2, "big_chances_missed": null, "touches": 28, - "successful_dribbles": "1/3 (33%)", + "successful_dribbles": "1/3", "passes_into_final_third": 1, "accurate_crosses": null, "accurate_long_balls": null, @@ -3147,10 +3147,10 @@ "interceptions": null, "recoveries": null, "dribbled_past": 1, - "ground_duels_won": "2/7 (29%)", - "aerial_duels_won": "0/1 (0%)", + "ground_duels_won": "2/7", + "aerial_duels_won": "0/1", "was_fouled": 1, - "fouls_committed": 0, + "fouls_committed": null, "saves": null, "goals_conceded": null, "xGOT_faced": null, @@ -3180,33 +3180,33 @@ "goals": 1, "assists": 0, "total_shots": 3, - "accurate_passes": "17/23 (74%)", + "accurate_passes": "17/23", "chances_created": 0, - "xG": "0.37", - "xGOT": "0.91", - "xA": "0.01", + "xG": 0.37, + "xGOT": 0.91, + "xA": 0.01, "conceded_penalty": null, "errors_lead_to_goal": null, - "shot_accuracy": "2/3 (67%)", + "shot_accuracy": "2/3", "blocked_shots": null, "big_chances_missed": null, "touches": 37, - "successful_dribbles": "1/1 (100%)", + "successful_dribbles": "1/1", "passes_into_final_third": 6, - "accurate_crosses": "0/1 (0%)", - "accurate_long_balls": "2/5 (40%)", + "accurate_crosses": "0/1", + "accurate_long_balls": "2/5", "corners": null, "offsides": null, "dispossessed": 0, - "tackles_won": "0/1 (0%)", + "tackles_won": "0/1", "blocks": null, "clearances": null, "headed_clearances": null, "interceptions": null, "recoveries": null, "dribbled_past": 1, - "ground_duels_won": "3/5 (60%)", - "aerial_duels_won": "2/4 (50%)", + "ground_duels_won": "3/5", + "aerial_duels_won": "2/4", "was_fouled": 1, "fouls_committed": 1, "saves": null, @@ -3238,33 +3238,33 @@ "goals": 0, "assists": 0, "total_shots": 1, - "accurate_passes": "19/19 (100%)", + "accurate_passes": "19/19", "chances_created": 1, - "xG": "0.04", + "xG": 0.04, "xGOT": null, - "xA": "0.01", + "xA": 0.01, "conceded_penalty": null, "errors_lead_to_goal": null, - "shot_accuracy": "0/1 (0%)", + "shot_accuracy": "0/1", "blocked_shots": null, "big_chances_missed": null, "touches": 42, - "successful_dribbles": "3/3 (100%)", + "successful_dribbles": "3/3", "passes_into_final_third": 1, - "accurate_crosses": "1/1 (100%)", + "accurate_crosses": "1/1", "accurate_long_balls": null, "corners": 1, "offsides": null, "dispossessed": 5, - "tackles_won": "1/4 (25%)", + "tackles_won": "1/4", "blocks": null, "clearances": null, "headed_clearances": null, "interceptions": null, "recoveries": null, "dribbled_past": 1, - "ground_duels_won": "8/16 (50%)", - "aerial_duels_won": 0, + "ground_duels_won": "8/16", + "aerial_duels_won": "0/0", "was_fouled": 1, "fouls_committed": 2, "saves": null, @@ -3281,7 +3281,7 @@ "team_id": 8586, "opta_id": false, "player_id": "266523", - "player_name": "Pierre-Emile H\u00f8jbjerg", + "player_name": "Pierre-Emile H\u00f8jbjerg", "player_url": "/players/266523/pierre-emile-hojbjerg", "shirt_number": 5, "time_subbed_on": null, @@ -3296,35 +3296,35 @@ "goals": 0, "assists": 1, "total_shots": 0, - "accurate_passes": "45/54 (83%)", + "accurate_passes": "45/54", "chances_created": 1, "xG": null, "xGOT": null, - "xA": "0.02", + "xA": 0.02, "conceded_penalty": null, "errors_lead_to_goal": null, "shot_accuracy": null, "blocked_shots": null, "big_chances_missed": null, "touches": 68, - "successful_dribbles": "2/3 (67%)", + "successful_dribbles": "2/3", "passes_into_final_third": 9, "accurate_crosses": null, - "accurate_long_balls": "5/9 (56%)", + "accurate_long_balls": "5/9", "corners": null, "offsides": null, "dispossessed": 0, - "tackles_won": "0/1 (0%)", + "tackles_won": "0/1", "blocks": 2, "clearances": 1, "headed_clearances": 1, "interceptions": 1, "recoveries": null, "dribbled_past": 5, - "ground_duels_won": "3/9 (33%)", - "aerial_duels_won": 0, - "was_fouled": 0, - "fouls_committed": 0, + "ground_duels_won": "3/9", + "aerial_duels_won": "0/0", + "was_fouled": null, + "fouls_committed": null, "saves": null, "goals_conceded": null, "xGOT_faced": null, @@ -3354,34 +3354,34 @@ "goals": 0, "assists": 0, "total_shots": 0, - "accurate_passes": "42/42 (100%)", + "accurate_passes": "42/42", "chances_created": 1, "xG": null, "xGOT": null, - "xA": "0.04", + "xA": 0.04, "conceded_penalty": null, "errors_lead_to_goal": null, "shot_accuracy": null, "blocked_shots": null, "big_chances_missed": null, "touches": 57, - "successful_dribbles": "1/1 (100%)", + "successful_dribbles": "1/1", "passes_into_final_third": 2, - "accurate_crosses": "0/1 (0%)", - "accurate_long_balls": "1/1 (100%)", + "accurate_crosses": "0/1", + "accurate_long_balls": "1/1", "corners": null, "offsides": null, "dispossessed": 1, - "tackles_won": "1/1 (100%)", + "tackles_won": "1/1", "blocks": 1, "clearances": 2, "headed_clearances": null, "interceptions": 3, "recoveries": null, "dribbled_past": 1, - "ground_duels_won": "2/7 (29%)", - "aerial_duels_won": "0/4 (0%)", - "was_fouled": 0, + "ground_duels_won": "2/7", + "aerial_duels_won": "0/4", + "was_fouled": null, "fouls_committed": 3, "saves": null, "goals_conceded": null, @@ -3412,7 +3412,7 @@ "goals": 0, "assists": 0, "total_shots": 0, - "accurate_passes": "15/16 (94%)", + "accurate_passes": "15/16", "chances_created": 0, "xG": null, "xGOT": null, @@ -3430,17 +3430,17 @@ "corners": null, "offsides": null, "dispossessed": 0, - "tackles_won": "1/1 (100%)", + "tackles_won": "1/1", "blocks": null, "clearances": null, "headed_clearances": null, "interceptions": null, "recoveries": null, "dribbled_past": null, - "ground_duels_won": "1/1 (100%)", - "aerial_duels_won": "0/1 (0%)", - "was_fouled": 0, - "fouls_committed": 0, + "ground_duels_won": "1/1", + "aerial_duels_won": "0/1", + "was_fouled": null, + "fouls_committed": null, "saves": null, "goals_conceded": null, "xGOT_faced": null, @@ -3470,33 +3470,33 @@ "goals": 0, "assists": 0, "total_shots": 1, - "accurate_passes": "13/22 (59%)", + "accurate_passes": "13/22", "chances_created": 1, - "xG": "0.04", + "xG": 0.04, "xGOT": null, "xA": null, "conceded_penalty": null, "errors_lead_to_goal": null, - "shot_accuracy": "0/1 (0%)", + "shot_accuracy": "0/1", "blocked_shots": null, "big_chances_missed": null, "touches": 45, - "successful_dribbles": "2/2 (100%)", + "successful_dribbles": "2/2", "passes_into_final_third": 2, "accurate_crosses": null, - "accurate_long_balls": "1/2 (50%)", + "accurate_long_balls": "1/2", "corners": null, "offsides": null, "dispossessed": 1, - "tackles_won": "2/2 (100%)", + "tackles_won": "2/2", "blocks": null, "clearances": 4, "headed_clearances": 3, "interceptions": 1, "recoveries": null, "dribbled_past": null, - "ground_duels_won": "5/7 (71%)", - "aerial_duels_won": "2/3 (67%)", + "ground_duels_won": "5/7", + "aerial_duels_won": "2/3", "was_fouled": 1, "fouls_committed": 1, "saves": null, @@ -3528,7 +3528,7 @@ "goals": 0, "assists": 0, "total_shots": 0, - "accurate_passes": "40/53 (75%)", + "accurate_passes": "40/53", "chances_created": 0, "xG": null, "xGOT": null, @@ -3542,19 +3542,19 @@ "successful_dribbles": null, "passes_into_final_third": 10, "accurate_crosses": null, - "accurate_long_balls": "2/13 (15%)", + "accurate_long_balls": "2/13", "corners": null, "offsides": null, "dispossessed": 0, - "tackles_won": "1/2 (50%)", + "tackles_won": "1/2", "blocks": 2, "clearances": null, "headed_clearances": null, "interceptions": null, "recoveries": null, "dribbled_past": null, - "ground_duels_won": "4/7 (57%)", - "aerial_duels_won": 0, + "ground_duels_won": "4/7", + "aerial_duels_won": "0/0", "was_fouled": 2, "fouls_committed": 3, "saves": null, @@ -3586,7 +3586,7 @@ "goals": 0, "assists": 0, "total_shots": 0, - "accurate_passes": "44/49 (90%)", + "accurate_passes": "44/49", "chances_created": 1, "xG": null, "xGOT": null, @@ -3600,7 +3600,7 @@ "successful_dribbles": null, "passes_into_final_third": 2, "accurate_crosses": null, - "accurate_long_balls": "1/3 (33%)", + "accurate_long_balls": "1/3", "corners": null, "offsides": null, "dispossessed": 0, @@ -3611,8 +3611,8 @@ "interceptions": 1, "recoveries": null, "dribbled_past": 3, - "ground_duels_won": "1/5 (20%)", - "aerial_duels_won": 0, + "ground_duels_won": "1/5", + "aerial_duels_won": "0/0", "was_fouled": 1, "fouls_committed": 1, "saves": null, @@ -3644,34 +3644,34 @@ "goals": 0, "assists": 0, "total_shots": 2, - "accurate_passes": "30/44 (68%)", + "accurate_passes": "30/44", "chances_created": 2, - "xG": "0.09", + "xG": 0.09, "xGOT": null, - "xA": "0.02", + "xA": 0.02, "conceded_penalty": null, "errors_lead_to_goal": null, - "shot_accuracy": "0/1 (0%)", + "shot_accuracy": "0/1", "blocked_shots": 1, "big_chances_missed": null, "touches": 68, "successful_dribbles": null, "passes_into_final_third": 4, - "accurate_crosses": "1/4 (25%)", - "accurate_long_balls": "1/4 (25%)", + "accurate_crosses": "1/4", + "accurate_long_balls": "1/4", "corners": 2, "offsides": null, "dispossessed": 0, - "tackles_won": "3/3 (100%)", + "tackles_won": "3/3", "blocks": null, "clearances": 1, "headed_clearances": 1, "interceptions": null, "recoveries": null, "dribbled_past": 2, - "ground_duels_won": "3/7 (43%)", - "aerial_duels_won": "0/1 (0%)", - "was_fouled": 0, + "ground_duels_won": "3/7", + "aerial_duels_won": "0/1", + "was_fouled": null, "fouls_committed": 2, "saves": null, "goals_conceded": null, @@ -3702,7 +3702,7 @@ "goals": null, "assists": null, "total_shots": null, - "accurate_passes": "6/12 (50%)", + "accurate_passes": "6/12", "chances_created": null, "xG": null, "xGOT": null, @@ -3710,10 +3710,10 @@ "conceded_penalty": null, "errors_lead_to_goal": null, "touches": 15, - "accurate_long_balls": "5/11 (45%)", - "saves": "1/8 (13%)", + "accurate_long_balls": "5/11", + "saves": 1, "goals_conceded": 5, - "xGOT_faced": "3.34", + "xGOT_faced": 3.34, "diving_save": 1, "saves_inside_box": 1, "acted_as_sweeper": 0, diff --git a/tests/fotmob/data/bundesliga_form_table_2022_2023.json b/tests/fotmob/data/bundesliga_form_table_2022_2023.json index 1ee61d6..cde007b 100644 --- a/tests/fotmob/data/bundesliga_form_table_2022_2023.json +++ b/tests/fotmob/data/bundesliga_form_table_2022_2023.json @@ -1 +1 @@ -[{"name": "RB Leipzig", "shortName": "RB Leipzig", "featuredInMatch": false, "id": 178475, "pageUrl": "/teams/178475/overview/rb-leipzig", "played": 5, "wins": 5, "draws": 0, "losses": 0, "scoresStr": "11-4", "goalConDiff": 7, "pts": 15, "ongoing": null, "idx": 1, "qualColor": "#2AD572"}, {"name": "Bayern M\u00fcnchen", "shortName": "Bayern M\u00fcnchen", "featuredInMatch": false, "id": 9823, "pageUrl": "/teams/9823/overview/bayern-munchen", "played": 5, "wins": 4, "draws": 0, "losses": 1, "scoresStr": "13-5", "goalConDiff": 8, "pts": 12, "ongoing": null, "idx": 2, "qualColor": "#2AD572"}, {"name": "Borussia Dortmund", "shortName": "Dortmund", "featuredInMatch": false, "id": 9789, "pageUrl": "/teams/9789/overview/borussia-dortmund", "played": 5, "wins": 3, "draws": 2, "losses": 0, "scoresStr": "17-5", "goalConDiff": 12, "pts": 11, "ongoing": null, "idx": 3, "qualColor": "#2AD572"}, {"name": "VfB Stuttgart", "shortName": "VfB Stuttgart", "featuredInMatch": false, "id": 10269, "pageUrl": "/teams/10269/overview/vfb-stuttgart", "played": 5, "wins": 2, "draws": 2, "losses": 1, "scoresStr": "9-6", "goalConDiff": 3, "pts": 8, "ongoing": null, "idx": 4, "qualColor": "#2AD572"}, {"name": "Eintracht Frankfurt", "shortName": "Frankfurt", "featuredInMatch": false, "id": 9810, "pageUrl": "/teams/9810/overview/eintracht-frankfurt", "played": 5, "wins": 2, "draws": 2, "losses": 1, "scoresStr": "9-7", "goalConDiff": 2, "pts": 8, "ongoing": null, "idx": 5, "qualColor": "#0046A7"}, {"name": "VfL Bochum", "shortName": "VfL Bochum", "featuredInMatch": false, "id": 9911, "pageUrl": "/teams/9911/overview/vfl-bochum", "played": 5, "wins": 2, "draws": 2, "losses": 1, "scoresStr": "8-6", "goalConDiff": 2, "pts": 8, "ongoing": null, "idx": 6, "qualColor": "#0046A7"}, {"name": "TSG Hoffenheim", "shortName": "Hoffenheim", "featuredInMatch": false, "id": 8226, "pageUrl": "/teams/8226/overview/tsg-hoffenheim", "played": 5, "wins": 2, "draws": 1, "losses": 2, "scoresStr": "9-7", "goalConDiff": 2, "pts": 7, "ongoing": null, "idx": 7, "qualColor": "#02CCF0"}, {"name": "1. FC K\u00f6ln", "shortName": "K\u00f6ln", "featuredInMatch": false, "id": 8722, "pageUrl": "/teams/8722/overview/1-fc-koln", "played": 5, "wins": 2, "draws": 1, "losses": 2, "scoresStr": "9-7", "goalConDiff": 2, "pts": 7, "ongoing": null, "idx": 8, "qualColor": null}, {"name": "Union Berlin", "shortName": "Union Berlin", "featuredInMatch": false, "id": 8149, "pageUrl": "/teams/8149/overview/union-berlin", "played": 5, "wins": 2, "draws": 1, "losses": 2, "scoresStr": "7-7", "goalConDiff": 0, "pts": 7, "ongoing": null, "idx": 9, "qualColor": null}, {"name": "Borussia M'Gladbach", "shortName": "M'gladbach", "featuredInMatch": false, "id": 9788, "pageUrl": "/teams/9788/overview/borussia-mgladbach", "played": 5, "wins": 2, "draws": 1, "losses": 2, "scoresStr": "9-9", "goalConDiff": 0, "pts": 7, "ongoing": null, "idx": 10, "qualColor": null}, {"name": "Hertha Berlin", "shortName": "Hertha Berlin", "featuredInMatch": false, "id": 8177, "pageUrl": "/teams/8177/overview/hertha-berlin", "played": 5, "wins": 2, "draws": 1, "losses": 2, "scoresStr": "7-10", "goalConDiff": -3, "pts": 7, "ongoing": null, "idx": 11, "qualColor": null}, {"name": "Schalke 04", "shortName": "Schalke 04", "featuredInMatch": false, "id": 10189, "pageUrl": "/teams/10189/overview/schalke-04", "played": 5, "wins": 2, "draws": 1, "losses": 2, "scoresStr": "9-15", "goalConDiff": -6, "pts": 7, "ongoing": null, "idx": 12, "qualColor": null}, {"name": "SC Freiburg", "shortName": "Freiburg", "featuredInMatch": false, "id": 8358, "pageUrl": "/teams/8358/overview/sc-freiburg", "played": 5, "wins": 2, "draws": 0, "losses": 3, "scoresStr": "6-7", "goalConDiff": -1, "pts": 6, "ongoing": null, "idx": 13, "qualColor": null}, {"name": "Wolfsburg", "shortName": "Wolfsburg", "featuredInMatch": false, "id": 8721, "pageUrl": "/teams/8721/overview/wolfsburg", "played": 5, "wins": 2, "draws": 0, "losses": 3, "scoresStr": "6-11", "goalConDiff": -5, "pts": 6, "ongoing": null, "idx": 14, "qualColor": null}, {"name": "FC Augsburg", "shortName": "Augsburg", "featuredInMatch": false, "id": 8406, "pageUrl": "/teams/8406/overview/fc-augsburg", "played": 5, "wins": 1, "draws": 1, "losses": 3, "scoresStr": "4-9", "goalConDiff": -5, "pts": 4, "ongoing": null, "idx": 15, "qualColor": null}, {"name": "Bayer Leverkusen", "shortName": "Leverkusen", "featuredInMatch": false, "id": 8178, "pageUrl": "/teams/8178/overview/bayer-leverkusen", "played": 5, "wins": 0, "draws": 3, "losses": 2, "scoresStr": "4-8", "goalConDiff": -4, "pts": 3, "ongoing": null, "idx": 16, "qualColor": "#FFA72F"}, {"name": "Werder Bremen", "shortName": "Werder Bremen", "featuredInMatch": false, "id": 8697, "pageUrl": "/teams/8697/overview/werder-bremen", "played": 5, "wins": 0, "draws": 1, "losses": 4, "scoresStr": "4-8", "goalConDiff": -4, "pts": 1, "ongoing": null, "idx": 17, "qualColor": "#FF4646"}, {"name": "Mainz 05", "shortName": "Mainz", "featuredInMatch": false, "id": 9905, "pageUrl": "/teams/9905/overview/mainz-05", "played": 5, "wins": 0, "draws": 1, "losses": 4, "scoresStr": "5-15", "goalConDiff": -10, "pts": 1, "ongoing": null, "idx": 18, "qualColor": "#FF4646"}] \ No newline at end of file +[{"name": "RB Leipzig", "shortName": "RB Leipzig", "featuredInMatch": false, "id": 178475, "pageUrl": "/teams/178475/overview/rb-leipzig", "played": 5, "wins": 5, "draws": 0, "losses": 0, "scoresStr": "11-4", "goalConDiff": 7, "pts": 15, "ongoing": null, "idx": 1, "qualColor": "#2AD572"}, {"name": "Bayern M\u00fcnchen", "shortName": "Bayern M\u00fcnchen", "featuredInMatch": false, "id": 9823, "pageUrl": "/teams/9823/overview/bayern-munchen", "played": 5, "wins": 4, "draws": 0, "losses": 1, "scoresStr": "13-5", "goalConDiff": 8, "pts": 12, "ongoing": null, "idx": 2, "qualColor": "#2AD572"}, {"name": "Borussia Dortmund", "shortName": "Dortmund", "featuredInMatch": false, "id": 9789, "pageUrl": "/teams/9789/overview/borussia-dortmund", "played": 5, "wins": 3, "draws": 2, "losses": 0, "scoresStr": "17-5", "goalConDiff": 12, "pts": 11, "ongoing": null, "idx": 3, "qualColor": "#2AD572"}, {"name": "VfB Stuttgart", "shortName": "VfB Stuttgart", "featuredInMatch": false, "id": 10269, "pageUrl": "/teams/10269/overview/vfb-stuttgart", "played": 5, "wins": 2, "draws": 2, "losses": 1, "scoresStr": "9-6", "goalConDiff": 3, "pts": 8, "ongoing": null, "idx": 4, "qualColor": "#2AD572"}, {"name": "Eintracht Frankfurt", "shortName": "Frankfurt", "featuredInMatch": false, "id": 9810, "pageUrl": "/teams/9810/overview/eintracht-frankfurt", "played": 5, "wins": 2, "draws": 2, "losses": 1, "scoresStr": "9-7", "goalConDiff": 2, "pts": 8, "ongoing": null, "idx": 5, "qualColor": "#0046A7"}, {"name": "VfL Bochum", "shortName": "VfL Bochum", "featuredInMatch": false, "id": 9911, "pageUrl": "/teams/9911/overview/vfl-bochum", "played": 5, "wins": 2, "draws": 2, "losses": 1, "scoresStr": "8-6", "goalConDiff": 2, "pts": 8, "ongoing": null, "idx": 6, "qualColor": "#0046A7"}, {"name": "TSG Hoffenheim", "shortName": "Hoffenheim", "featuredInMatch": false, "id": 8226, "pageUrl": "/teams/8226/overview/tsg-hoffenheim", "played": 5, "wins": 2, "draws": 1, "losses": 2, "scoresStr": "9-7", "goalConDiff": 2, "pts": 7, "ongoing": null, "idx": 7, "qualColor": "#02CCF0"}, {"name": "FC K\u00f6ln", "shortName": "K\u00f6ln", "featuredInMatch": false, "id": 8722, "pageUrl": "/teams/8722/overview/fc-koln", "played": 5, "wins": 2, "draws": 1, "losses": 2, "scoresStr": "9-7", "goalConDiff": 2, "pts": 7, "ongoing": null, "idx": 8, "qualColor": null}, {"name": "Union Berlin", "shortName": "Union Berlin", "featuredInMatch": false, "id": 8149, "pageUrl": "/teams/8149/overview/union-berlin", "played": 5, "wins": 2, "draws": 1, "losses": 2, "scoresStr": "7-7", "goalConDiff": 0, "pts": 7, "ongoing": null, "idx": 9, "qualColor": null}, {"name": "Borussia M\u00f6nchengladbach", "shortName": "M'gladbach", "featuredInMatch": false, "id": 9788, "pageUrl": "/teams/9788/overview/borussia-monchengladbach", "played": 5, "wins": 2, "draws": 1, "losses": 2, "scoresStr": "9-9", "goalConDiff": 0, "pts": 7, "ongoing": null, "idx": 10, "qualColor": null}, {"name": "Hertha Berlin", "shortName": "Hertha Berlin", "featuredInMatch": false, "id": 8177, "pageUrl": "/teams/8177/overview/hertha-berlin", "played": 5, "wins": 2, "draws": 1, "losses": 2, "scoresStr": "7-10", "goalConDiff": -3, "pts": 7, "ongoing": null, "idx": 11, "qualColor": null}, {"name": "Schalke 04", "shortName": "Schalke 04", "featuredInMatch": false, "id": 10189, "pageUrl": "/teams/10189/overview/schalke-04", "played": 5, "wins": 2, "draws": 1, "losses": 2, "scoresStr": "9-15", "goalConDiff": -6, "pts": 7, "ongoing": null, "idx": 12, "qualColor": null}, {"name": "SC Freiburg", "shortName": "Freiburg", "featuredInMatch": false, "id": 8358, "pageUrl": "/teams/8358/overview/sc-freiburg", "played": 5, "wins": 2, "draws": 0, "losses": 3, "scoresStr": "6-7", "goalConDiff": -1, "pts": 6, "ongoing": null, "idx": 13, "qualColor": null}, {"name": "Wolfsburg", "shortName": "Wolfsburg", "featuredInMatch": false, "id": 8721, "pageUrl": "/teams/8721/overview/wolfsburg", "played": 5, "wins": 2, "draws": 0, "losses": 3, "scoresStr": "6-11", "goalConDiff": -5, "pts": 6, "ongoing": null, "idx": 14, "qualColor": null}, {"name": "FC Augsburg", "shortName": "Augsburg", "featuredInMatch": false, "id": 8406, "pageUrl": "/teams/8406/overview/fc-augsburg", "played": 5, "wins": 1, "draws": 1, "losses": 3, "scoresStr": "4-9", "goalConDiff": -5, "pts": 4, "ongoing": null, "idx": 15, "qualColor": null}, {"name": "Bayer Leverkusen", "shortName": "Leverkusen", "featuredInMatch": false, "id": 8178, "pageUrl": "/teams/8178/overview/bayer-leverkusen", "played": 5, "wins": 0, "draws": 3, "losses": 2, "scoresStr": "4-8", "goalConDiff": -4, "pts": 3, "ongoing": null, "idx": 16, "qualColor": "#FFA72F"}, {"name": "Werder Bremen", "shortName": "Werder Bremen", "featuredInMatch": false, "id": 8697, "pageUrl": "/teams/8697/overview/werder-bremen", "played": 5, "wins": 0, "draws": 1, "losses": 4, "scoresStr": "4-8", "goalConDiff": -4, "pts": 1, "ongoing": null, "idx": 17, "qualColor": "#FF4646"}, {"name": "Mainz 05", "shortName": "Mainz", "featuredInMatch": false, "id": 9905, "pageUrl": "/teams/9905/overview/mainz-05", "played": 5, "wins": 0, "draws": 1, "losses": 4, "scoresStr": "5-15", "goalConDiff": -10, "pts": 1, "ongoing": null, "idx": 18, "qualColor": "#FF4646"}] \ No newline at end of file diff --git a/tests/fotmob/data/epl_table_2022_2023_2.json b/tests/fotmob/data/epl_table_2022_2023_2.json new file mode 100644 index 0000000..8083550 --- /dev/null +++ b/tests/fotmob/data/epl_table_2022_2023_2.json @@ -0,0 +1,342 @@ +[ + { + "name": "Manchester City", + "shortName": "Man City", + "id": 8456, + "pageUrl": "/teams/8456/overview/manchester-city", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 28, + "draws": 5, + "losses": 5, + "scoresStr": "94-33", + "goalConDiff": 61, + "pts": 89, + "idx": 1, + "qualColor": "#2AD572" + }, + { + "name": "Arsenal", + "shortName": "Arsenal", + "id": 9825, + "pageUrl": "/teams/9825/overview/arsenal", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 26, + "draws": 6, + "losses": 6, + "scoresStr": "88-43", + "goalConDiff": 45, + "pts": 84, + "idx": 2, + "qualColor": "#2AD572" + }, + { + "name": "Manchester United", + "shortName": "Man United", + "id": 10260, + "pageUrl": "/teams/10260/overview/manchester-united", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 23, + "draws": 6, + "losses": 9, + "scoresStr": "58-43", + "goalConDiff": 15, + "pts": 75, + "idx": 3, + "qualColor": "#2AD572" + }, + { + "name": "Newcastle United", + "shortName": "Newcastle", + "id": 10261, + "pageUrl": "/teams/10261/overview/newcastle-united", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 19, + "draws": 14, + "losses": 5, + "scoresStr": "68-33", + "goalConDiff": 35, + "pts": 71, + "idx": 4, + "qualColor": "#2AD572" + }, + { + "name": "Liverpool", + "shortName": "Liverpool", + "id": 8650, + "pageUrl": "/teams/8650/overview/liverpool", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 19, + "draws": 10, + "losses": 9, + "scoresStr": "75-47", + "goalConDiff": 28, + "pts": 67, + "idx": 5, + "qualColor": "#0046A7" + }, + { + "name": "Brighton & Hove Albion", + "shortName": "Brighton", + "id": 10204, + "pageUrl": "/teams/10204/overview/brighton-hove-albion", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 18, + "draws": 8, + "losses": 12, + "scoresStr": "72-53", + "goalConDiff": 19, + "pts": 62, + "idx": 6, + "qualColor": "#0046A7" + }, + { + "name": "Aston Villa", + "shortName": "Aston Villa", + "id": 10252, + "pageUrl": "/teams/10252/overview/aston-villa", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 18, + "draws": 7, + "losses": 13, + "scoresStr": "51-46", + "goalConDiff": 5, + "pts": 61, + "idx": 7, + "qualColor": "#02CCF0" + }, + { + "name": "Tottenham Hotspur", + "shortName": "Tottenham", + "id": 8586, + "pageUrl": "/teams/8586/overview/tottenham-hotspur", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 18, + "draws": 6, + "losses": 14, + "scoresStr": "70-63", + "goalConDiff": 7, + "pts": 60, + "idx": 8, + "qualColor": null + }, + { + "name": "Brentford", + "shortName": "Brentford", + "id": 9937, + "pageUrl": "/teams/9937/overview/brentford", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 15, + "draws": 14, + "losses": 9, + "scoresStr": "58-46", + "goalConDiff": 12, + "pts": 59, + "idx": 9, + "qualColor": null + }, + { + "name": "Fulham", + "shortName": "Fulham", + "id": 9879, + "pageUrl": "/teams/9879/overview/fulham", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 15, + "draws": 7, + "losses": 16, + "scoresStr": "55-53", + "goalConDiff": 2, + "pts": 52, + "idx": 10, + "qualColor": null + }, + { + "name": "Crystal Palace", + "shortName": "Crystal Palace", + "id": 9826, + "pageUrl": "/teams/9826/overview/crystal-palace", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 11, + "draws": 12, + "losses": 15, + "scoresStr": "40-49", + "goalConDiff": -9, + "pts": 45, + "idx": 11, + "qualColor": null + }, + { + "name": "Chelsea", + "shortName": "Chelsea", + "id": 8455, + "pageUrl": "/teams/8455/overview/chelsea", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 11, + "draws": 11, + "losses": 16, + "scoresStr": "38-47", + "goalConDiff": -9, + "pts": 44, + "idx": 12, + "qualColor": null + }, + { + "name": "Wolverhampton Wanderers", + "shortName": "Wolves", + "id": 8602, + "pageUrl": "/teams/8602/overview/wolverhampton-wanderers", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 11, + "draws": 8, + "losses": 19, + "scoresStr": "31-58", + "goalConDiff": -27, + "pts": 41, + "idx": 13, + "qualColor": null + }, + { + "name": "West Ham United", + "shortName": "West Ham", + "id": 8654, + "pageUrl": "/teams/8654/overview/west-ham-united", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 11, + "draws": 7, + "losses": 20, + "scoresStr": "42-55", + "goalConDiff": -13, + "pts": 40, + "idx": 14, + "qualColor": null + }, + { + "name": "AFC Bournemouth", + "shortName": "Bournemouth", + "id": 8678, + "pageUrl": "/teams/8678/overview/afc-bournemouth", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 11, + "draws": 6, + "losses": 21, + "scoresStr": "37-71", + "goalConDiff": -34, + "pts": 39, + "idx": 15, + "qualColor": null + }, + { + "name": "Nottingham Forest", + "shortName": "Nottm Forest", + "id": 10203, + "pageUrl": "/teams/10203/overview/nottingham-forest", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 9, + "draws": 11, + "losses": 18, + "scoresStr": "38-68", + "goalConDiff": -30, + "pts": 38, + "idx": 16, + "qualColor": null + }, + { + "name": "Everton", + "shortName": "Everton", + "id": 8668, + "pageUrl": "/teams/8668/overview/everton", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 8, + "draws": 12, + "losses": 18, + "scoresStr": "34-57", + "goalConDiff": -23, + "pts": 36, + "idx": 17, + "qualColor": null + }, + { + "name": "Leicester City", + "shortName": "Leicester", + "id": 8197, + "pageUrl": "/teams/8197/overview/leicester-city", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 9, + "draws": 7, + "losses": 22, + "scoresStr": "51-68", + "goalConDiff": -17, + "pts": 34, + "idx": 18, + "qualColor": "#FF4646" + }, + { + "name": "Leeds United", + "shortName": "Leeds", + "id": 8463, + "pageUrl": "/teams/8463/overview/leeds-united", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 7, + "draws": 10, + "losses": 21, + "scoresStr": "48-78", + "goalConDiff": -30, + "pts": 31, + "idx": 19, + "qualColor": "#FF4646" + }, + { + "name": "Southampton", + "shortName": "Southampton", + "id": 8466, + "pageUrl": "/teams/8466/overview/southampton", + "deduction": null, + "ongoing": null, + "played": 38, + "wins": 6, + "draws": 7, + "losses": 25, + "scoresStr": "36-73", + "goalConDiff": -37, + "pts": 25, + "idx": 20, + "qualColor": "#FF4646" + } +] \ No newline at end of file diff --git a/tests/transfermarkt/data/dortmund_players.json b/tests/transfermarkt/data/dortmund_players.json index 340fe35..29a2fe8 100644 --- a/tests/transfermarkt/data/dortmund_players.json +++ b/tests/transfermarkt/data/dortmund_players.json @@ -368,7 +368,7 @@ "arrival_type": "Transfer", "birth_date": "Jan 11, 1998", "age": "25", - "nation": "Turkey", + "nation": "T\u00fcrkiye", "height": "1.83", "foot": "right", "joined": "Jul 1, 2022", @@ -406,7 +406,7 @@ "arrival_type": "free transfer", "birth_date": "Jan 1, 1996", "age": "27", - "nation": "Germany", + "nation": "Syria", "height": "1.78", "foot": "right", "joined": "Jul 1, 2017", @@ -501,8 +501,8 @@ "arrival_type": "N/A", "birth_date": "Jan 22, 2003", "age": "20", - "nation": "Turkey", - "height": "1.76", + "nation": "T\u00fcrkiye", + "height": "1.75", "foot": "right", "joined": null, "signed_from": null, @@ -596,7 +596,7 @@ "birth_date": "May 5, 2006", "age": "17", "nation": "Belgium", - "height": "1.70", + "height": "1.73", "foot": "right", "joined": "Jan 27, 2023", "signed_from": "RSC Anderlecht", diff --git a/tests/transfermarkt/data/dortmund_transfers.json b/tests/transfermarkt/data/dortmund_transfers.json index a965fbd..c341a05 100644 --- a/tests/transfermarkt/data/dortmund_transfers.json +++ b/tests/transfermarkt/data/dortmund_transfers.json @@ -91,7 +91,7 @@ "url": "/salih-ozcan/profil/spieler/244940", "position": "Defensive Midfield", "age": "24", - "nation": "Turkey", + "nation": "T\u00fcrkiye", "transfer_club": "1.FC K\u00f6ln", "transfer_club_url": "/1-fc-koln/startseite/verein/3", "transfer_league": "Bundesliga", diff --git a/tests/transfermarkt/data/newcastle_manager_history_data.json b/tests/transfermarkt/data/newcastle_manager_history_data.json index 7d83cb4..d21f558 100644 --- a/tests/transfermarkt/data/newcastle_manager_history_data.json +++ b/tests/transfermarkt/data/newcastle_manager_history_data.json @@ -367,21 +367,21 @@ "url": "/andy-cunningham/profil/trainer/102375", "dob": "Jan 31, 1891", "nation": "Scotland", - "appointed": "Jan 9, 1930", + "appointed": "Jan 2, 1930", "left": "Jun 30, 1935", - "time_in_post": "1998 days\u00a0", - "matches": "182", - "ppg": "1.48" + "time_in_post": "2005 days\u00a0", + "matches": "251", + "ppg": "1.43" }, { "name": "Frank Watt", "url": "/frank-watt/profil/trainer/93888", - "dob": "-", + "dob": "Jan 1, 1854", "nation": "Scotland", "appointed": "Aug 1, 1895", "left": "Jan 1, 1930", "time_in_post": "12571 days\u00a0", - "matches": "2", - "ppg": "3.00" + "matches": "69", + "ppg": "1.42" } ] \ No newline at end of file diff --git a/tests/transfermarkt/data/newcastle_staff_data.json b/tests/transfermarkt/data/newcastle_staff_data.json index 7b5fa02..3ce70ec 100644 --- a/tests/transfermarkt/data/newcastle_staff_data.json +++ b/tests/transfermarkt/data/newcastle_staff_data.json @@ -33,10 +33,10 @@ "last_club_url": "/sheffield-united/startseite/verein/350/saison_id/2020" }, { - "name": "Stephen Purches", - "url": "/stephen-purches/profil/trainer/59153", + "name": "Simon Weatherstone", + "url": "/simon-weatherstone/profil/trainer/28239", "role": "Assistant Manager", - "age": "44", + "age": "43", "nation": "England", "appointed": "Nov 8, 2021", "contracted": "30.06.2024", @@ -44,10 +44,10 @@ "last_club_url": "/afc-bournemouth/startseite/verein/989/saison_id/2020" }, { - "name": "Simon Weatherstone", - "url": "/simon-weatherstone/profil/trainer/28239", + "name": "Stephen Purches", + "url": "/stephen-purches/profil/trainer/59153", "role": "Assistant Manager", - "age": "43", + "age": "44", "nation": "England", "appointed": "Nov 8, 2021", "contracted": "30.06.2024", @@ -175,17 +175,6 @@ "last_club": "Brighton & Hove Albion", "last_club_url": "/brighton-amp-hove-albion/startseite/verein/1237/saison_id/2023" }, - { - "name": "Dan Ashworth", - "url": "/dan-ashworth/profil/trainer/93634", - "role": "Sporting Director", - "age": "52", - "nation": "England", - "appointed": "May 30, 2022", - "contracted": "-", - "last_club": "Brighton & Hove Albion", - "last_club_url": "/brighton-amp-hove-albion/startseite/verein/1237/saison_id/2021" - }, { "name": "Darren Eales", "url": "/darren-eales/profil/trainer/34004", @@ -436,8 +425,8 @@ "nation": "England", "appointed": "Jun 1, 2023", "contracted": "-", - "last_club": "England", - "last_club_url": "/england/startseite/verein/3299" + "last_club": "Leeds United", + "last_club_url": "/leeds-united/startseite/verein/399/saison_id/2022" }, { "name": "Paul Catterson", @@ -491,8 +480,8 @@ "nation": "Scotland", "appointed": "Oct 21, 2022", "contracted": "-", - "last_club": "England U21", - "last_club_url": "/england-u21/startseite/verein/9565" + "last_club": "Hibernian FC", + "last_club_url": "/hibernian-fc/startseite/verein/903/saison_id/2022" }, { "name": "Aaron Harris", @@ -505,6 +494,17 @@ "last_club": "Queens Park Rangers", "last_club_url": "/queens-park-rangers/startseite/verein/1039/saison_id/2022" }, + { + "name": "Jonny King", + "url": "/jonny-king/profil/trainer/109278", + "role": "Physiotherapist", + "age": "35", + "nation": "England", + "appointed": "Feb 1, 2024", + "contracted": "-", + "last_club": "Leicester City", + "last_club_url": "/leicester-city/startseite/verein/1003/saison_id/2023" + }, { "name": "Simon Tweddle", "url": "/simon-tweddle/profil/trainer/91631", diff --git a/tests/transfermarkt/test_tm_team_staff.py b/tests/transfermarkt/test_tm_team_staff.py index 2390e6d..1096de0 100644 --- a/tests/transfermarkt/test_tm_team_staff.py +++ b/tests/transfermarkt/test_tm_team_staff.py @@ -22,6 +22,12 @@ class TestTmTeamStaffData(unittest.TestCase): time.sleep(4) + # drop age + for dicts in expected: + dicts.pop("age", None) + for dicts in actual: + dicts.pop("age", None) + def test_team_staff_data(self): npt.assert_array_equal(self.actual, self.expected) diff --git a/tests/transfermarkt/test_tm_team_staff_history.py b/tests/transfermarkt/test_tm_team_staff_history.py index 6ea55e1..34863d3 100644 --- a/tests/transfermarkt/test_tm_team_staff_history.py +++ b/tests/transfermarkt/test_tm_team_staff_history.py @@ -24,7 +24,7 @@ class TestTmTeamStaffHistoryData(unittest.TestCase): time.sleep(4) def test_team_staff_history_data(self): - npt.assert_array_equal(self.actual, self.expected) + npt.assert_array_equal(self.actual[1:], self.expected[1:]) if __name__ == "__main__":