From 41ef08698290cdf0c8039f6fc6bfe0e922b16a8e Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Mon, 7 Oct 2024 23:00:43 +0200 Subject: [PATCH 1/4] add benchmark for feols compression --- pixi.lock | 153 +++++++++++++++++++++++++++++++++----- pyproject.toml | 2 +- timining_benchmarks.ipynb | 126 +++++-------------------------- utils/estimators.py | 7 +- 4 files changed, 160 insertions(+), 128 deletions(-) diff --git a/pixi.lock b/pixi.lock index 74db883..1b7dbec 100644 --- a/pixi.lock +++ b/pixi.lock @@ -50,11 +50,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/e4/c0b6746fd2eb62fe702118b3ca0cb384ce95e1261cfada58ff693aeec08a/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a7/24/47be185d81bdbb8afccdedd6f134d070aefb6ca520e5419b92316bd6b4fe/lets_plot-4.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/5f/323c4d56e8401c50185fd0e875fcf06b71bf825a863699be1eb10aa2a9cb/llvmlite-0.43.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/27/75/de5b9cd67648051cae40039da0c8cbc497a0d99acb1a1f3d087cd66d27b7/matplotlib-3.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl @@ -73,7 +75,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/19/74/f59e7e0d392bc1070e9a70e2f9190d652487ac115bb16e2eff6b22ad1d24/psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/99/b57491e97cc46e55bbd7c6a760d161d6a9e58acadce08790024fca2f2dd3/pyfixest-0.24.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/c4/9625418a1413005e486c006e56675334929fad864347c5ae7c1b2e7fe639/pyarrow-17.0.0-cp312-cp312-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ef/ff/c4c4a8e82fd1238636c17faaf3b47b3c08a306ede2482e20974d0b93f5a8/pyfixest-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/0c/0e3c05b1c87bb6a1c76d281b0f35e78d2d80ac91b5f8f524cebf77f51049/pyparsing-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3e/b9/3766cc361d93edb2ce81e2e1f87dd98f314d7d513877a342d31b30741680/pypng-0.20220715.0-py3-none-any.whl @@ -87,7 +90,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/fa/e1/60a652f18996a40a7410aeb7eb476c18da8a39792c7effe67f06883e9852/statsmodels-0.14.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/d4/54f9d12668b58336bd30defe0307e6c61589a3e687b05c366f804b7faaf0/tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/eb/fdb7eb9e48b7b02554e1664afd3bd3f117f6b6d6c5881438a0b055554f9b/tqdm-4.66.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl @@ -131,11 +134,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f2/d8/0fe8c5f5d35878ddd135f44f2af0e4e1d379e1c7b0716f97cdcb88d4fd27/kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ff/82/4a3769d1c7855d9a1b54cba5174b20c7ab133ac6a38b4a4ad5464171d13c/lets_plot-4.4.1-cp312-cp312-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0b/67/9443509e5d2b6d8587bae3ede5598fa8bd586b1c7701696663ea8af15b5b/llvmlite-0.43.0-cp312-cp312-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/82/de/54f7f38ce6de79cb77d513bb3eaa4e0b1031e9fd6022214f47943fa53a88/matplotlib-3.9.2-cp312-cp312-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl @@ -154,7 +159,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/0b/37/f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf/psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/99/b57491e97cc46e55bbd7c6a760d161d6a9e58acadce08790024fca2f2dd3/pyfixest-0.24.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/62/ce6ac1275a432b4a27c55fe96c58147f111d8ba1ad800a112d31859fae2f/pyarrow-17.0.0-cp312-cp312-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ef/ff/c4c4a8e82fd1238636c17faaf3b47b3c08a306ede2482e20974d0b93f5a8/pyfixest-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/0c/0e3c05b1c87bb6a1c76d281b0f35e78d2d80ac91b5f8f524cebf77f51049/pyparsing-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3e/b9/3766cc361d93edb2ce81e2e1f87dd98f314d7d513877a342d31b30741680/pypng-0.20220715.0-py3-none-any.whl @@ -168,7 +174,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/f5/99/654fd41a9024643ee70b239e5ebc987bf98ce9fc2693bd550bee58136564/statsmodels-0.14.4-cp312-cp312-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/0f/721e113a2fac2f1d7d124b3279a1da4c77622e104084f56119875019ffab/tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/eb/fdb7eb9e48b7b02554e1664afd3bd3f117f6b6d6c5881438a0b055554f9b/tqdm-4.66.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl @@ -212,11 +218,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/c5/57fa58276dfdfa612241d640a64ca2f76adc6ffcebdbd135b4ef60095098/kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4f/c4/834efcdd54068bc63eb0422a4f45d9957c3dafb127c842f045b0b9724f1d/lets_plot-4.4.1-cp312-cp312-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/a2/9c/24139d3712d2d352e300c39c0e00d167472c08b3bd350c3c33d72c88ff8d/llvmlite-0.43.0-cp312-cp312-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/35/3e/5713b84a02b24b2a4bd4d6673bfc03017e6654e1d8793ece783b7ed4d484/matplotlib-3.9.2-cp312-cp312-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl @@ -235,7 +243,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/7c/06/63872a64c312a24fb9b4af123ee7007a306617da63ff13bcc1432386ead7/psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/99/b57491e97cc46e55bbd7c6a760d161d6a9e58acadce08790024fca2f2dd3/pyfixest-0.24.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/0a/dbd0c134e7a0c30bea439675cc120012337202e5fac7163ba839aa3691d2/pyarrow-17.0.0-cp312-cp312-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ef/ff/c4c4a8e82fd1238636c17faaf3b47b3c08a306ede2482e20974d0b93f5a8/pyfixest-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/0c/0e3c05b1c87bb6a1c76d281b0f35e78d2d80ac91b5f8f524cebf77f51049/pyparsing-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3e/b9/3766cc361d93edb2ce81e2e1f87dd98f314d7d513877a342d31b30741680/pypng-0.20220715.0-py3-none-any.whl @@ -249,7 +258,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/67/d8/ac30cf4cf97adaa48548be57e7cf02e894f31b45fd55bf9213358d9781c9/statsmodels-0.14.4-cp312-cp312-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/d9/c33be3c1a7564f7d42d87a8d186371a75fd142097076767a5c27da941fef/tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/eb/fdb7eb9e48b7b02554e1664afd3bd3f117f6b6d6c5881438a0b055554f9b/tqdm-4.66.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl @@ -295,11 +304,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/19/93/c05f0a6d825c643779fc3c70876bff1ac221f0e31e6f701f0e9578690d70/kiwisolver-1.4.7-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/29/6f/7f31a52589d26e1780dea0b3960ed882577e3e144b1f1a3a287461b57f59/lets_plot-4.4.1-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c6/94/dea10e263655ce78d777e78d904903faae39d1fc440762be4a9dc46bed49/llvmlite-0.43.0-cp312-cp312-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d2/92/c2b9464a0562feb6ae780bdc152364810862e07ef5e6affa2b7686028db2/matplotlib-3.9.2-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl @@ -316,7 +327,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/73/44/561092313ae925f3acfaace6f9ddc4f6a9c748704317bad9c8c8f8a36a79/psutil-6.0.0-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/99/b57491e97cc46e55bbd7c6a760d161d6a9e58acadce08790024fca2f2dd3/pyfixest-0.24.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/49/baafe2a964f663413be3bd1cf5c45ed98c5e42e804e2328e18f4570027c1/pyarrow-17.0.0-cp312-cp312-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ef/ff/c4c4a8e82fd1238636c17faaf3b47b3c08a306ede2482e20974d0b93f5a8/pyfixest-0.25.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/0c/0e3c05b1c87bb6a1c76d281b0f35e78d2d80ac91b5f8f524cebf77f51049/pyparsing-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3e/b9/3766cc361d93edb2ce81e2e1f87dd98f314d7d513877a342d31b30741680/pypng-0.20220715.0-py3-none-any.whl @@ -331,7 +343,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/59/9a/e466a1b887a1441141e52dbcc98152f013d85076576da6eed2357f2016ae/statsmodels-0.14.4-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/2f/3f2f05e84a7aff787a96d5fb06821323feb370fe0baed4db6ea7b1088f32/tornado-6.4.1-cp38-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/eb/fdb7eb9e48b7b02554e1664afd3bd3f117f6b6d6c5881438a0b055554f9b/tqdm-4.66.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl @@ -1130,6 +1142,15 @@ packages: - docopt ; extra == 'testing' - pytest<7.0.0 ; extra == 'testing' requires_python: '>=3.6' +- kind: pypi + name: jinja2 + version: 3.1.4 + url: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl + sha256: bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + requires_dist: + - markupsafe>=2.0 + - babel>=2.7 ; extra == 'i18n' + requires_python: '>=3.7' - kind: pypi name: jupyter-client version: 8.6.3 @@ -1644,6 +1665,30 @@ packages: url: https://files.pythonhosted.org/packages/c6/94/dea10e263655ce78d777e78d904903faae39d1fc440762be4a9dc46bed49/llvmlite-0.43.0-cp312-cp312-win_amd64.whl sha256: 7a2872ee80dcf6b5dbdc838763d26554c2a18aa833d31a2635bff16aafefb9c9 requires_python: '>=3.9' +- kind: pypi + name: markupsafe + version: 2.1.5 + url: https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 + requires_python: '>=3.7' +- kind: pypi + name: markupsafe + version: 2.1.5 + url: https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl + sha256: 823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb + requires_python: '>=3.7' +- kind: pypi + name: markupsafe + version: 2.1.5 + url: https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl + sha256: 3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 + requires_python: '>=3.7' +- kind: pypi + name: markupsafe + version: 2.1.5 + url: https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl + sha256: 8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 + requires_python: '>=3.7' - kind: pypi name: matplotlib version: 3.9.2 @@ -2303,13 +2348,14 @@ packages: name: panel-scale-code version: 0.1.0 path: . - sha256: c96fe22b4d4b8ce2df3ef34b313ac40a52f61fc4db4865c6cc45bcb78a0ad3bd + sha256: 86500655d723b267ad3d875c04673f128297f752448027ee3e60acd901352a96 requires_dist: - - pyfixest - duckreg - statsmodels - ipykernel - duckdb + - pyfixest>=0.25.2 + - pyarrow>=17.0.0,<18 - statsmodels ; extra == 'default' - duckdb ; extra == 'default' requires_python: '>=3.11' @@ -2681,15 +2727,68 @@ packages: sha256: 1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0 requires_dist: - pytest ; extra == 'tests' +- kind: pypi + name: pyarrow + version: 17.0.0 + url: https://files.pythonhosted.org/packages/8e/0a/dbd0c134e7a0c30bea439675cc120012337202e5fac7163ba839aa3691d2/pyarrow-17.0.0-cp312-cp312-macosx_11_0_arm64.whl + sha256: f1e70de6cb5790a50b01d2b686d54aaf73da01266850b05e3af2a1bc89e16053 + requires_dist: + - numpy>=1.16.6 + - pytest ; extra == 'test' + - hypothesis ; extra == 'test' + - cffi ; extra == 'test' + - pytz ; extra == 'test' + - pandas ; extra == 'test' + requires_python: '>=3.8' +- kind: pypi + name: pyarrow + version: 17.0.0 + url: https://files.pythonhosted.org/packages/ae/49/baafe2a964f663413be3bd1cf5c45ed98c5e42e804e2328e18f4570027c1/pyarrow-17.0.0-cp312-cp312-win_amd64.whl + sha256: 392bc9feabc647338e6c89267635e111d71edad5fcffba204425a7c8d13610d7 + requires_dist: + - numpy>=1.16.6 + - pytest ; extra == 'test' + - hypothesis ; extra == 'test' + - cffi ; extra == 'test' + - pytz ; extra == 'test' + - pandas ; extra == 'test' + requires_python: '>=3.8' +- kind: pypi + name: pyarrow + version: 17.0.0 + url: https://files.pythonhosted.org/packages/d4/62/ce6ac1275a432b4a27c55fe96c58147f111d8ba1ad800a112d31859fae2f/pyarrow-17.0.0-cp312-cp312-macosx_10_15_x86_64.whl + sha256: 9b8a823cea605221e61f34859dcc03207e52e409ccf6354634143e23af7c8d22 + requires_dist: + - numpy>=1.16.6 + - pytest ; extra == 'test' + - hypothesis ; extra == 'test' + - cffi ; extra == 'test' + - pytz ; extra == 'test' + - pandas ; extra == 'test' + requires_python: '>=3.8' +- kind: pypi + name: pyarrow + version: 17.0.0 + url: https://files.pythonhosted.org/packages/f1/c4/9625418a1413005e486c006e56675334929fad864347c5ae7c1b2e7fe639/pyarrow-17.0.0-cp312-cp312-manylinux_2_28_x86_64.whl + sha256: b0c6ac301093b42d34410b187bba560b17c0330f64907bfa4f7f7f2444b0cf9b + requires_dist: + - numpy>=1.16.6 + - pytest ; extra == 'test' + - hypothesis ; extra == 'test' + - cffi ; extra == 'test' + - pytz ; extra == 'test' + - pandas ; extra == 'test' + requires_python: '>=3.8' - kind: pypi name: pyfixest - version: 0.24.2 - url: https://files.pythonhosted.org/packages/c0/99/b57491e97cc46e55bbd7c6a760d161d6a9e58acadce08790024fca2f2dd3/pyfixest-0.24.2-py3-none-any.whl - sha256: 88a072adefeed1df48f3b8263ea34940d771de338a7215586294785e0f4f4a03 + version: 0.25.2 + url: https://files.pythonhosted.org/packages/ef/ff/c4c4a8e82fd1238636c17faaf3b47b3c08a306ede2482e20974d0b93f5a8/pyfixest-0.25.2-py3-none-any.whl + sha256: ea055a99c33f1bc055087739cc2c92888921cf56ded2cfacd655b4a94ab32975 requires_dist: - formulaic>=1.0.0 - great-tables>=0.10.0 - - lets-plot>=4.0.1 + - jinja2<4,>=3.1.4 + - lets-plot>=4.0.0 - numba>=0.58.0 - numpy>=1.19.0 - pandas>=1.1.0 @@ -2697,8 +2796,24 @@ packages: - scipy>=1.6 - seaborn>=0.13.2 - tabulate>=0.9.0 - - tqdm>=4.66.4,<5.0.0 - requires_python: '>=3.9,<4.0' + - tqdm==4.66.4 + - doubleml==0.7.1 ; extra == 'dev' + - pre-commit==3.6.0 ; extra == 'dev' + - pyarrow>=14.0.0 ; extra == 'dev' + - pyhdfe>=0.2.0 ; extra == 'dev' + - pytest-cov>=4.1.0 ; extra == 'dev' + - pytest-xdist>=3.5.0 ; extra == 'dev' + - pytest>=7.2.0 ; extra == 'dev' + - wildboottest>=0.3.2 ; extra == 'dev' + - causaldata<0.2,>=0.1.4 ; extra == 'docs' + - jupyterlab>=4.0.12 ; extra == 'docs' + - jupytext==1.16.1 ; extra == 'docs' + - marginaleffects>=0.0.10 ; extra == 'docs' + - pylatex<2,>=1.4.2 ; extra == 'docs' + - quartodoc>=0.7.2 ; extra == 'docs' + - watermark==2.4.3 ; extra == 'docs' + - wildboottest>=0.3.2 ; extra == 'docs' + requires_python: '>=3.9' - kind: pypi name: pygments version: 2.18.0 @@ -3379,9 +3494,9 @@ packages: requires_python: '>=3.8' - kind: pypi name: tqdm - version: 4.66.5 - url: https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl - sha256: 90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd + version: 4.66.4 + url: https://files.pythonhosted.org/packages/18/eb/fdb7eb9e48b7b02554e1664afd3bd3f117f6b6d6c5881438a0b055554f9b/tqdm-4.66.4-py3-none-any.whl + sha256: b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644 requires_dist: - colorama ; platform_system == 'Windows' - pytest>=6 ; extra == 'dev' diff --git a/pyproject.toml b/pyproject.toml index 1295abb..75bbaae 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] authors = [{name = "Alexander Fischer", email = "alexander-fischer1801@t-online.de"}] -dependencies = ["pyfixest", "duckreg", "statsmodels", "ipykernel", "duckdb"] +dependencies = [ "duckreg", "statsmodels", "ipykernel", "duckdb", "pyfixest>=0.25.2", "pyarrow>=17.0.0,<18"] description = "Add a short description here" name = "panel-scale-code" requires-python = ">= 3.11" diff --git a/timining_benchmarks.ipynb b/timining_benchmarks.ipynb index cdacd7c..8a67dd4 100644 --- a/timining_benchmarks.ipynb +++ b/timining_benchmarks.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 26, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -33,13 +33,13 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "%%capture\n", "\n", - "N_values = [1000, 10_000, 100_000, 1_000_000]\n", + "N_values = [100_000]\n", "# 2-5 weeks of runtime, daily data\n", "T_values = [14, 21, 28]\n", "# one week prior\n", @@ -55,6 +55,7 @@ " #bench.mark(fun = twfe_statsmodels)\n", " # add mundlak twfe via pyfixest in memory once on PyPi\n", " # duck_mundlak runs with 1 bootstrap iteration\n", + " bench.mark(fun = twfe_fixest_compressed)\n", " bench.mark(fun = duck_mundlak)\n", " \n", " bench_df = bench.to_dataframe()\n", @@ -70,137 +71,48 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
twfe_fixestduck_mundlakNTT0
00.0153220.0326151000147
10.0160940.0302161000147
20.0171990.0291181000147
00.0175080.0346901000217
10.0179870.0332271000217
\n", - "
" - ], - "text/plain": [ - " twfe_fixest duck_mundlak N T T0\n", - "0 0.015322 0.032615 1000 14 7\n", - "1 0.016094 0.030216 1000 14 7\n", - "2 0.017199 0.029118 1000 14 7\n", - "0 0.017508 0.034690 1000 21 7\n", - "1 0.017987 0.033227 1000 21 7" - ] - }, - "execution_count": null, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "all_benchmarks_df.head()" ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# drop first column due to numba burn-in\n", "all_benchmarks_df_melted = all_benchmarks_df.iloc[1:,:].melt(id_vars=['N', 'T', 'T0'], value_vars=['twfe_fixest', 'duck_mundlak'], \n", - " var_name='model', value_name='value')" + " var_name='model', value_name='value') \n", + "all_benchmarks_df_melted['N'] = all_benchmarks_df_melted['N'].apply(lambda x: f'{x:.0e}')" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABKYAAAYkCAYAAADQ+QccAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9fZxXdZ0//j8GkMELGLwABmwEr0lMSFYRJS+SBHRVzCxJVzQv2tJtC8myUiFbSftk6uLF5qaYiZXfvMpWFNFQFzSRKG2VFeQik8GrmBHUAeH9+6Ofs04wOAMDZ0bu99vt3OSc8zqv8zrvmXkijznndcpKpVIpAAAAALCZtSt6AAAAAABsmQRTAAAAABRCMAUAAABAIQRTAAAAABRCMAUAAABAIQRTAAAAABRCMAUAAABAIQRTAAAAABRCMAUAAABAIQRTALQ5kyZNSllZWRYuXNjsY08//fT06dOnwbaysrKMGzeuRcbWHOPGjUtZWdlmP+/GWrp0aT7zmc9kxx13TFlZWa666qqih7SWdX2dm+rwww/P4Ycf3iLjaO2f1cKFC1NWVpZJkyY12D5lypQMGDAgnTp1SllZWZYtW5YkufXWW9O3b99stdVW6dq162YfL3/z29/+NmVlZfntb39b9FAAYKMJpgAo3HHHHZdtttkmb775ZqNtTjnllHTs2DGvv/76ZhzZhjn99NNTVlZWv3Tp0iX9+/fPD3/4w9TV1bXIOa677rq1woTN5Wtf+1oeeOCBXHjhhbn11lszfPjwRtu+9xmcddZZ69z/7W9/u77Na6+9tqmGXJjmfFYt4f3fdx06dMgOO+yQgQMH5l//9V/zP//zP03q4/XXX89nP/vZbL311rn22mtz6623Ztttt83zzz+f008/PbvvvntuvPHG/PjHP96k17Ix/ud//ifjxo1rcnj9Xkjco0ePvPXWW2vt79OnT/7xH/+xhUe5ab3/e2F9i3ALgKJ1KHoAAHDKKafk17/+de66666cdtppa+1/6623cs8992T48OHZcccd80//9E85+eSTU15e3iLnf/vtt9OhQ8v+lVheXp7//M//TJIsW7Ysv/rVrzJ27Ng89dRT+fnPf77R/V933XXZaaedcvrpp290X8318MMP5/jjj8/YsWOb1L5Tp0751a9+leuuuy4dO3ZssO/2229Pp06d8s4772yKoRauuZ9VS/jUpz6V0047LaVSKTU1NfnDH/6QW265Jdddd10uv/zyjBkzpr5t79698/bbb2errbaq3/bUU0/lzTffzKWXXpqhQ4fWb//tb3+bNWvW5Oqrr84ee+yx2a5nQ/zP//xPxo8fn8MPP7xZd8698soruf7663P++edvusFtJrfeemuD9Z/+9KeZOnXqWts/+tGPbs5hAcBaBFMAFO64445L586dM3ny5HUGU/fcc09WrFiRU045JUnSvn37tG/fvsXO36lTpxbr6z0dOnTIqaeeWr/+5S9/OYMGDcovfvGLXHnllenVq1eLn3NzeeWVV5r1GNfw4cNz77335v7778/xxx9fv33GjBlZsGBBTjzxxPzqV7/aBCMtXnM/qw/yzjvvpGPHjmnXrvGb3vfaa68G33tJ8v3vfz/HHntszj///PTt2zdHH310kr/dVfP33/+vvPJKkqw17sa2b4wVK1Zk2223bbH+NtaAAQPygx/8IF/+8pez9dZbFz2cjfL33wNPPPFEpk6dutZ2ACiaR/kAKNzWW2+dT3/605k2bVr9P37fb/LkyencuXOOO+64JI3PMXXdddelX79+KS8vT69evXLuuefWz42zPn8/x9R7j/XMmzcvp59+erp27ZqKioqcccYZ63zMpynatWtXP2/R+h4vevfdd3PppZdm9913T3l5efr06ZNvfetbDR4B7NOnT/70pz9l+vTp9Y/jvNf3qlWrMn78+Oy5557p1KlTdtxxxwwZMiRTp079wDG++OKLOemkk7LDDjtkm222yUEHHZTf/OY39fvf+9xLpVKuvfba+nN/kJ133jmHHnpoJk+e3GD7bbfdlo997GPZd99913ncHXfckYEDB2brrbfOTjvtlFNPPTV/+ctf1mp39913Z999902nTp2y77775q677lpnf2vWrMlVV12Vfv36pVOnTunRo0e++MUv5q9//esHXsO///u/p1+/ftlmm22y/fbb5x/+4R/Wup73+6DP6oM+6+T/5hH6+c9/nu985zvZeeeds80226S2tvYDx/v3dtxxx/z85z9Phw4d8m//9m/12/9+jqnDDz88o0ePTpIccMABKSsrq5+v65JLLkmSdOvWba2fmfvvvz+f+MQnsu2226Zz58455phj8qc//anBGE4//fRst912mT9/fo4++uh07ty5Pmxu6tfmvUfqHn/88Rx44IHp1KlTdtttt/z0pz9t8NmfdNJJSZIjjjiiWY+sXXzxxVm6dGmuv/76pn2wf+eee+7JMccck169eqW8vDy77757Lr300qxevbpBu8MPPzz77rtv/ud//idHHHFEttlmm+y888654oor1urzpZdeysiRI7Ptttume/fu+drXvtZijwQDQGsgmAKgVTjllFPy7rvv5pe//GWD7W+88UYeeOCBnHDCCeu9g2HcuHE599xz06tXr/zwhz/MiSeemP/4j//IUUcdlVWrVm3QmD772c/mzTffzIQJE/LZz342kyZNyvjx4zeorySZP39+kr+FBI0566yzcvHFF2f//ffPj370oxx22GGZMGFCTj755Po2V111VT7ykY+kb9++ufXWW3Prrbfm29/+dpK/fQ7jx4/PEUcckYkTJ+bb3/52dtlll8yePXu9Y1u6dGkOPvjgPPDAA/nyl7+cf/u3f8s777yT4447rj7oOfTQQ+sfA/rUpz5Vf+6m+PznP59f//rXWb58eZK/BXB33HFHPv/5z6+z/aRJk/LZz3427du3z4QJE3L22WfnzjvvzJAhQxqEjQ8++GBOPPHElJWVZcKECRk5cmTOOOOMzJo1a60+v/jFL+brX/96DjnkkFx99dU544wzctttt2XYsGHr/R658cYb85WvfCX77LNPrrrqqowfPz4DBgzIk08+2egx6/usmvJZv9+ll16a3/zmNxk7dmwuu+yytR6HbKpddtklhx12WJ544olGw61vf/vbOeecc5Ik3/3ud3Prrbfmi1/8Yq666qqccMIJSZLrr78+t956az796U8n+dsjY8ccc0y22267XH755bnooovyP//zPxkyZMhaIey7776bYcOGpXv37vl//+//5cQTT0zSvK/NvHnz8pnPfCaf+tSn8sMf/jDbb799Tj/99Pog7NBDD81XvvKVJMm3vvWt+s++KY+sfeITn8gnP/nJXHHFFXn77beb+Mn+n0mTJmW77bbLmDFjcvXVV2fgwIG5+OKL881vfnOttn/9618zfPjw+vnn+vbtm2984xu5//7769u8/fbbOfLII/PAAw/kvPPOy7e//e089thjueCCC5o9NgBotUoA0Aq8++67pZ49e5YGDx7cYPsNN9xQSlJ64IEH6rfdfPPNpSSlBQsWlEqlUumVV14pdezYsXTUUUeVVq9eXd9u4sSJpSSlm266qX7b6NGjS717925wjiSlSy65pH79kksuKSUpfeELX2jQ7oQTTijtuOOOH3gto0ePLm277balV199tfTqq6+W5s2bV7rssstKZWVlpf3222+t87xnzpw5pSSls846q0F/Y8eOLSUpPfzww/Xb+vXrVzrssMPWOnf//v1LxxxzzAeO8e999atfLSUpPfbYY/Xb3nzzzdKuu+5a6tOnT4PPNUnp3HPPbVK/77V94403Sh07dizdeuutpVKpVPrNb35TKisrKy1cuLD+c3j11VdLpVKptHLlylL37t1L++67b+ntt9+u7+u+++4rJSldfPHF9dsGDBhQ6tmzZ2nZsmX12x588MFSkgZf58cee6yUpHTbbbc1GN+UKVPW2n7YYYc1+GyPP/74Ur9+/Zp0vY1d//s19bN+5JFHSklKu+22W+mtt97a4PO937/+67+WkpT+8Ic/lEqlUmnBggWlJKWbb765vs17P19PPfVUg2P//uv03ri7du1aOvvssxu0ra6uLlVUVDTYPnr06FKS0je/+c0GbZvztendu3cpSenRRx+t3/bKK6+UysvLS+eff379tjvuuKOUpPTII480+lk0dm3Tp08vJSldeeWVDc7blJ+rdX2dvvjFL5a22Wab0jvvvFO/7bDDDislKf30pz+t31ZXV1eqrKwsnXjiifXbrrrqqlKS0i9/+cv6bStWrCjtsccezbq+UqlUOvfccxvUGwBoLdwxBUCr0L59+5x88smZOXNmg7ssJk+enB49euTII49s9NiHHnooK1euzFe/+tUGc++cffbZ6dKly1qPSDXVP//zPzdY/8QnPpHXX3+9SY9SrVixIt26dUu3bt2yxx575Fvf+lYGDx7c6GNmSfJf//VfSdJgcuok9RMxN+U6unbtmj/96U954YUXPrDt35/7wAMPzJAhQ+q3bbfddjnnnHOycOHCJr/RrTHbb799hg8fnttvvz3J376uBx98cHr37r1W21mzZuWVV17Jl7/85QbzHx1zzDHp27dv/eewZMmSzJkzJ6NHj05FRUV9u0996lPZZ599GvR5xx13pKKiIp/61Kfy2muv1S8DBw7Mdtttl0ceeaTRsXft2jUvvfRSnnrqqY36DN7T3M969OjRLTbf0XbbbZck630DZnNMnTo1y5Yty6hRoxp8ru3bt8+gQYPW+bl+6UtfarDe3K/NPvvsk0984hP16926dcvee++dF198sUWu6dBDD80RRxyxQXdNvf/r9Oabb+a1117LJz7xibz11lt5/vnnG7TdbrvtGsz31LFjxxx44IENruO//uu/0rNnz3zmM5+p37bNNtvU39UGAB8GgikAWo335pt5b+6el156KY899lhOPvnk9U52vmjRoiTJ3nvv3WB7x44ds9tuu9Xvb65ddtmlwfr222+fJE2ak6hTp06ZOnVqpk6dmkcffTR//vOf89///d/ZbbfdGj1m0aJFadeu3VpvPKusrEzXrl2bdB3f/e53s2zZsuy111752Mc+lq9//ev54x//+IHHLVq0aK3PL/m/N3Zt6Gf4fp///OczderULF68OHfffXejj/E19vVMkr59+9bvf++/e+6551rt/v7YF154ITU1NenevXt9YPjesnz58nXObfaeb3zjG9luu+1y4IEHZs8998y5556b//7v/27aRTdyfc35rHfdddcNPtffe+9Rys6dO7dIf+8FoJ/85CfX+lwffPDBtT7XDh065CMf+chafTTna/P3P5fJ3342m/Jz2VTjxo1LdXV1brjhhmYd96c//SknnHBCKioq0qVLl3Tr1q0+fKqpqWnQ9iMf+chac7T9/XUsWrQoe+yxx1rt1vX9AwBtlbfyAdBqDBw4MH379s3tt9+eb33rW7n99ttTKpXqA6vNrbEwrFQqNenYoUOHbtB5mzKheGMOPfTQzJ8/P/fcc08efPDB/Od//md+9KMf5YYbbshZZ521wf22hOOOOy7l5eUZPXp06urq8tnPfnaznXvNmjXp3r17brvttnXu79atW6PHfvSjH83cuXNz3333ZcqUKfnVr36V6667LhdffPFGzTnWVC35drhnn3027du3b7Gwa82aNUn+Ns9UZWXlWvs7dGj4v5rl5eVrvVGwuV+bjfm5bKpDDz00hx9+eK644oq17pxszLJly3LYYYelS5cu+e53v5vdd989nTp1yuzZs/ONb3yj/rN6z+a4DgBoCwRTALQqp5xySi666KL88Y9/zOTJk7PnnnvmgAMOWO8x7z0ONnfu3AZ3JK1cuTILFizY4IBoc+vdu3fWrFmTF154ocFEzUuXLs2yZcsaPPa2vvBqhx12yBlnnJEzzjgjy5cvz6GHHppx48atN5jq3bt35s6du9b29x4/Wtcjd8219dZbZ+TIkfnZz36WESNGZKeddmp0LMnfvp6f/OQnG+ybO3du/f73/ruuxxb//lp23333PPTQQznkkEM2KOjZdttt87nPfS6f+9znsnLlynz605/Ov/3bv+XCCy9s8LhhU2yOz3pdFi9enOnTp2fw4MEtdsfU7rvvniTp3r37Bv+cbezXZl02Jtx9z7hx43L44YfnP/7jP5rU/re//W1ef/313HnnnTn00EPrty9YsGCDx9C7d+88++yzKZVKDa5pXd8/ANBWeZQPgFblvbujLr744syZM6dJd0sNHTo0HTt2zDXXXNPgboOf/OQnqampyTHHHLPJxtuSjj766CR/e+ve+1155ZVJ0uA6tt122wZvp3vP66+/3mB9u+22yx577PGBr5c/+uij87vf/S4zZ86s37ZixYr8+Mc/Tp8+fdaas2lDjR07NpdcckkuuuiiRtv8wz/8Q7p3754bbrihwbjvv//+PPfcc/WfQ8+ePTNgwIDccsstDR6Tmjp16lrzNH32s5/N6tWrc+mll651vnfffXedn+V7/v4z7dixY/bZZ5+USqUNeuPj5vqs3++NN97IqFGjsnr16vo3OLaEYcOGpUuXLrnsssvW+Vm8+uqrH9jHxnxtGrPtttsmyQYd+57DDjsshx9+eC6//PK88847H9j+vTug3l+DVq5cmeuuu26Dx3D00Ufn5Zdfzv/3//1/9dveeuut/PjHP97gPgGgtXHHFACtyq677pqDDz4499xzT5I0KZjq1q1bLrzwwowfPz7Dhw/Pcccdl7lz5+a6667LAQcc0GCC4dasf//+GT16dH784x/XPxb0u9/9LrfccktGjhyZI444or7twIEDc/311+d73/te9thjj3Tv3j2f/OQns88+++Twww/PwIEDs8MOO2TWrFn5//6//y/nnXfees/9zW9+M7fffntGjBiRr3zlK9lhhx1yyy23ZMGCBfnVr3611uNXG3ON/fv3X2+brbbaKpdffnnOOOOMHHbYYRk1alSWLl2aq6++On369MnXvva1+rYTJkzIMccckyFDhuQLX/hC3njjjfz7v/97+vXrVz+fUvK3kOGLX/xiJkyYkDlz5uSoo47KVlttlRdeeCF33HFHrr766gYTTL/fUUcdlcrKyhxyyCHp0aNHnnvuuUycODHHHHPMBt15tKk/6//93//Nz372s5RKpdTW1uYPf/hD7rjjjixfvjxXXnllhg8fvlH9v1+XLl1y/fXX55/+6Z+y//775+STT063bt2yePHi/OY3v8khhxySiRMnrrePjfnaNGbAgAFp3759Lr/88tTU1KS8vDyf/OQn071792b1c8kllzT4uVufgw8+ONtvv31Gjx6dr3zlKykrK8utt966UY/mnX322Zk4cWJOO+20PP300+nZs2duvfXWbLPNNhvcJwC0NoIpAFqdU045JTNmzMiBBx641kTgjRk3bly6deuWiRMn5mtf+1p22GGHnHPOObnsssuy1VZbbeIRt5z//M//zG677ZZJkyblrrvuSmVlZS688MJccsklDdpdfPHFWbRoUa644oq8+eabOeyww/LJT34yX/nKV3LvvffmwQcfTF1dXXr37p3vfe97+frXv77e8/bo0SMzZszIN77xjfz7v/973nnnney333759a9/XcgdZ6effnq22WabfP/73883vvGNbLvttjnhhBNy+eWXp2vXrvXthg8fnjvuuCPf+c53cuGFF2b33XfPzTffnHvuuSe//e1vG/R5ww03ZODAgfmP//iPfOtb30qHDh3Sp0+fnHrqqTnkkEMaHcsXv/jF3HbbbbnyyiuzfPnyfOQjH8lXvvKVfOc739mga9vUn/V7k+63a9cuXbp0ya677prRo0fnnHPO2SR3Y33+859Pr1698v3vfz8/+MEPUldXl5133jmf+MQncsYZZzSpjw392jSmsrIyN9xwQyZMmJAzzzwzq1evziOPPNLsYOrwww/PYYcdlunTp39g2x133DH33Xdfzj///HznO9/J9ttvn1NPPTVHHnlkhg0b1uxrSP72Br5p06blX/7lX/Lv//7v2WabbXLKKadkxIgRLRowAkCRykpmWAQAAACgAOaYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikoQFlZ2XqXcePGbZLz3nnnnTnqqKOy4447pqysLHPmzGm0balUyogRI1JWVpa77757k4wHoC0qooavWrUq3/jGN/Kxj30s2267bXr16pXTTjstL7/8coN2//Zv/5aDDz4422yzTbp27dri4wD4MGjNdfx///d/c/zxx2ennXZKly5dMmTIkDzyyCMtPh5oTQRTUIAlS5bUL1dddVW6dOnSYNvYsWM3yXlXrFiRIUOG5PLLL//AtldddVXKyso2yTgA2rIiavhbb72V2bNn56KLLsrs2bNz5513Zu7cuTnuuOMatFu5cmVOOumkfOlLX2rxMQB8WLTmOv6P//iPeffdd/Pwww/n6aefTv/+/fOP//iPqa6ubvExQWvRoegBwJaosrKy/s8VFRUpKytrsG1T+ad/+qckycKFC9fbbs6cOfnhD3+YWbNmpWfPnpt8XABtSRE1vKKiIlOnTm2wbeLEiTnwwAOzePHi7LLLLkmS8ePHJ0kmTZq0SccD0Ja11jr+2muv5YUXXshPfvKT7LfffkmS73//+7nuuuvy7LPPbpZ/L0AR3DEFbcg///M/Z7vttlvvsrHeeuutfP7zn8+1117rLz+AFtTSNbympiZlZWUe2QPYTDZ1Hd9xxx2z995756c//WlWrFiRd999N//xH/+R7t27Z+DAgZvgiqB1cMcUtCHf/e53N9ljfu/52te+loMPPjjHH3/8Jj0PwJamJWv4O++8k2984xsZNWpUunTp0iJ9ArB+m7qOl5WV5aGHHsrIkSPTuXPntGvXLt27d8+UKVOy/fbbt8h5oTUSTEEb0r1793Tv3n2T9X/vvffm4Ycfzu9///tNdg6ALVVL1fBVq1bls5/9bEqlUq6//voWGBkATbGp63ipVMq5556b7t2757HHHsvWW2+d//zP/8yxxx6bp556yhQbfGh5lA/akE39KN/DDz+c+fPnp2vXrunQoUM6dPhbdn3iiSfm8MMPb4ErANhytUQNf+8fM4sWLcrUqVPdLQWwGW3qOv7www/nvvvuy89//vMccsgh2X///XPddddl6623zi233LIpLw0K5Y4paEM29aN83/zmN3PWWWc12Paxj30sP/rRj3LsscdusvMCbAk2toa/94+ZF154IY888kh23HHHFhwdAB9kU9fxt956K0nSrl3D+0fatWuXNWvWbPB5obUTTEEbsrG3D7/xxhtZvHhxXn755STJ3Llzk/ztzSTvX/7eLrvskl133XWDzwvAxtXwVatW5TOf+Uxmz56d++67L6tXr65/dfgOO+yQjh07JkkWL15cX+tXr16dOXPmJEn22GOPFnlBBsCWbFPX8cGDB2f77bfP6NGjc/HFF2frrbfOjTfemAULFuSYY45pyUuBVkUwBVuQe++9N2eccUb9+sknn5wkueSSSzJu3LiCRgXAB/nLX/6Se++9N0kyYMCABvseeeSR+setL7744gaPe3z84x9fqw0Am19T6vhOO+2UKVOm5Nvf/nY++clPZtWqVenXr1/uueee9O/fv4BRw+ZRViqVSkUPAgAAAIAtj8nPAQAAACiEYAoAAACAQgimAAAAACiEYAoAAACAQgimAAAAACiEYGodSqVSamtr44WFAG2TOg7QdqnhAFsWwdQ6vPnmm6moqMibb75Z9FAA2ADqOEDbpYYDbFkEUwAAAAAUQjAFAAAAQCEEUwAAAAAUQjAFAAAAQCEEUwAAAAAUQjAFAAAAQCEKDaYmTJiQAw44IJ07d0737t0zcuTIzJ07t0Gbd955J+eee2523HHHbLfddjnxxBOzdOnS9fZbKpVy8cUXp2fPntl6660zdOjQvPDCC5vyUgAAAABopkKDqenTp+fcc8/NE088kalTp2bVqlU56qijsmLFivo2X/va1/LrX/86d9xxR6ZPn56XX345n/70p9fb7xVXXJFrrrkmN9xwQ5588slsu+22GTZsWN55551NfUkAAAAANFFZqVQqFT2I97z66qvp3r17pk+fnkMPPTQ1NTXp1q1bJk+enM985jNJkueffz4f/ehHM3PmzBx00EFr9VEqldKrV6+cf/75GTt2bJKkpqYmPXr0yKRJk3LyySevdUxdXV3q6urq12tra1NVVZWampp06dJlE10tAC1FHQdou9RwgC1bq5pjqqamJkmyww47JEmefvrprFq1KkOHDq1v07dv3+yyyy6ZOXPmOvtYsGBBqqurGxxTUVGRQYMGNXrMhAkTUlFRUb9UVVW11CUBsBmo4wBtlxoOsGVrNcHUmjVr8tWvfjWHHHJI9t133yRJdXV1OnbsmK5duzZo26NHj1RXV6+zn/e29+jRo8nHXHjhhampqalf/vznP2/k1QCwOanjAG2XGg6wZetQ9ADec+655+bZZ5/N448/vtnPXV5envLy8s1+XgBahjoO0Hap4QBbtlZxx9R5552X++67L4888kg+8pGP1G+vrKzMypUrs2zZsgbtly5dmsrKynX29d72v39z3/qOAQAAAGDzKzSYKpVKOe+883LXXXfl4Ycfzq677tpg/8CBA7PVVltl2rRp9dvmzp2bxYsXZ/Dgwevsc9ddd01lZWWDY2pra/Pkk082egwAAAAAm1+hwdS5556bn/3sZ5k8eXI6d+6c6urqVFdX5+23307yt0nLzzzzzIwZMyaPPPJInn766ZxxxhkZPHhwgzfy9e3bN3fddVeSpKysLF/96lfzve99L/fee2+eeeaZnHbaaenVq1dGjhxZxGUCAAAAsA6FzjF1/fXXJ0kOP/zwBttvvvnmnH766UmSH/3oR2nXrl1OPPHE1NXVZdiwYbnuuusatJ87d279G/2S5IILLsiKFStyzjnnZNmyZRkyZEimTJmSTp06bdLrAQAAAKDpykqlUqnoQbQ2tbW1qaioSE1NTbp06VL0cABoJnUcoO1SwwG2LK1i8nMA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sWMzffr0LFy4MDNmzMgJJ5yQ9u3bZ9SoUZv78gAAAABYj0If5Zs1a1aOOOKI+vUxY8YkSUaPHp1x48bl3nvvTZIMGDCgwXGPPPJIDj/88CTJ/Pnz89prr9Xve+mllzJq1Ki8/vrr6datW4YMGZInnngi3bp127QXAwAAAECztJq38rUmtbW1qaio8CYQgDZKHQdou9RwgC1Lq55jCgAAAIAPL8EUAAAAAIUQTAEAAABQiEInPwcAAACg7TjjjDM+sE2pVMqkSZOa1J9gCgAAAIAmqampaXTf6tWr89BDD+Xtt98WTAEAAADQsu688851br/nnnvyrW99K506dcoll1zS5P7MMQUAAADABnnsscdy8MEHZ9SoUfnHf/zHvPjii7nggguafLxgCgAAAIBmefbZZ3PsscfmyCOPTL9+/TJv3rxcfvnlqaioaFY/gikAAAAAmmTRokUZPXp0BgwYkA4dOuSZZ57JjTfemF69em1Qf+aYAgAAAKBJ9t5777Rr1y5jx47N4MGD8/zzz+f5559fq93xxx/fpP4EUwAAAAA0ybvvvptSqZQf/OAHjbYplUpZs2ZNk/oTTAEAAADQJO+++26L9meOKQAAAAAKIZgCAAAAoBCCKQAAAAAKIZgCAAAAoBCCKQAAAAAKscHB1Lx58/LAAw/k7bffTvK3VwECAAAAQFM1O5h6/fXXM3To0Oy11145+uijs2TJkiTJmWeemfPPP7/FBwgAAABA67JkyZIcffTRa/25uZodTH3ta19Lhw4dsnjx4myzzTb12z/3uc9lypQpGzQIAAAAANqOt99+O4899thaf26uDs094MEHH8wDDzyQj3zkIw2277nnnlm0aNEGDQIAAACALU+z75hasWJFgzul3vPGG2+kvLy8RQYFAAAAwIdfs4OpT3ziE/npT39av15WVpY1a9bkiiuuyBFHHNGigwMAAADgw6vZj/JdccUVOfLIIzNr1qysXLkyF1xwQf70pz/ljTfeyH//939vijECAAAA8CHU7Dum9t133/zv//5vhgwZkuOPPz4rVqzIpz/96fz+97/P7rvvvinGCAAAAMCHULPvmEqSioqKfPvb327psQAAAACwBWl2MPXoo4+ud/+hhx66wYMBAAAAoPXbaqut0qdPn7X+3FzNfpTv8MMPX2s54ogj6pfmePTRR3PsscemV69eKSsry913391gf6lUysUXX5yePXtm6623ztChQ/PCCy98YL/XXntt+vTpk06dOmXQoEH53e9+16xxAQAAANC4qqqqPPPMM2v9ubmaHUz99a9/bbC88sormTJlSg444IA8+OCDzeprxYoV6d+/f6699tp17r/iiityzTXX5IYbbsiTTz6ZbbfdNsOGDcs777zTaJ+/+MUvMmbMmFxyySWZPXt2+vfvn2HDhuWVV15p1tgAAAAA2LTKSqVSqSU6mj59esaMGZOnn356wwZSVpa77rorI0eOTPK3u6V69eqV888/P2PHjk2S1NTUpEePHpk0aVJOPvnkdfYzaNCgHHDAAZk4cWKSZM2aNamqqsq//Mu/5Jvf/OY6j6mrq0tdXV39em1tbaqqqlJTU5MuXbps0PUAsPmo4wBtlxoOsGVr9h1TjenRo0fmzp3bUt1lwYIFqa6uztChQ+u3VVRUZNCgQZk5c+Y6j1m5cmWefvrpBse0a9cuQ4cObfSYJJkwYUIqKirql6qqqha7DgA2PXUcoO1SwwG2bM0Opv74xz82WP7whz9kypQp+ed//ucMGDCgxQZWXV2d5G+B1/v16NGjft/fe+2117J69epmHZMkF154YWpqauqXP//5zxs5egA2J3UcoO1SwwG2bM1+K9+AAQNSVlaWv38C8KCDDspNN93UYgPbnMrLy1NeXl70MADYQOo4QNulhgNs2ZodTC1YsKDBert27dKtW7d06tSpxQaVJJWVlUmSpUuXpmfPnvXbly5d2uidWTvttFPat2+fpUuXNti+dOnS+v4AAAAAaB2a/Shf7969GyxVVVUtHkolya677prKyspMmzatflttbW2efPLJDB48eJ3HdOzYMQMHDmxwzJo1azJt2rRGjwEAAACgacaPH7/WDUHvd8011+TGG29scn9NumPqmmuuaXKHX/nKV5rcdvny5Zk3b179+oIFCzJnzpzssMMO2WWXXfLVr3413/ve97Lnnntm1113zUUXXZRevXrVv7kvSY488siccMIJOe+885IkY8aMyejRo/MP//APOfDAA3PVVVdlxYoVOeOMM5o8LgAAAADWNn78+IwcOXKt+b3f88477+Suu+7K2Wef3aT+mhRM/ehHP2pSZ2VlZc0KpmbNmpUjjjiifn3MmDFJktGjR2fSpEm54IILsmLFipxzzjlZtmxZhgwZkilTpjS4Q2v+/Pl57bXX6tc/97nP5dVXX83FF1+c6urqDBgwIFOmTGn0AwMAAACgacrKyvLUU09l2bJljbaZPXt20/sr/f0s5qS2tjYVFRWpqalJly5dih4OAM2kjgO0XWo4QOvWvn37lEqllJWVNdqmVCplzZo1Teqv2ZOfAwAAALDlevTRR7Pffvu1SF8bFEy99NJLuffee7N48eKsXLmywb4rr7yyRQYGAAAAQOvTuXPnFrurtdnB1LRp03Lcccdlt912y/PPP5999903CxcuTKlUyv77798igwIAAACg9bn55puzyy67tFh/7Zp7wIUXXpixY8fmmWeeSadOnfKrX/0qf/7zn3PYYYflpJNOarGBAQAAANC6nHbaadl+++1brL9m3zH13HPP5fbbb//bwR065O233852222X7373uzn++OPzpS99qcUGBwAAAEDr8/zzz2fmzJmprq5OklRWVmbw4MHp27dvs/ppdjC17bbb1s8r1bNnz8yfPz/9+vVLkrz22mvN7Q4AAACANmLZsmX5/Oc/nwceeCBdu3ZN9+7dkySvvPJK/vrXv2bYsGGZPHlyk++qavajfAcddFAef/zxJMnRRx+d888/P//2b/+WL3zhCznooIOa2x0AAAAAbcR5552XV155JbNmzcrrr7+e5557Ls8991xef/31PP3001m6dGnOO++8JvdXViqVSs0ZwIsvvpjly5dnv/32y4oVK3L++ednxowZ2XPPPXPllVemd+/ezb6o1qa2tjYVFRWpqalpsVnmAdh81HGAtksNB2jdKioq8tBDD+WAAw5Y5/5Zs2blyCOPTE1NTZP6a/ajfJdddllOPfXUJH97rO+GG25obhcAAAAAtEHt2rWrn+JpXVauXJl27Zr+gF6zH+V79dVXM3z48FRVVeXrX/96/vCHPzS3CwAAAADaoM985jP5whe+kAcffDCrV6+u37569eo88MADOf3003PiiSc2ub9mB1P33HNPlixZkosuuihPPfVU9t9///Tr1y+XXXZZFi5c2NzuAAAAAGgjrr766hx44IE5+uij06lTp/To0SM9evRIp06dcswxx+TAAw/M1Vdf3eT+mj3H1N976aWXcvvtt+emm27KCy+8kHfffXdjumsVPNcO0Lap4wBtlxoO0DZUV1fnd7/7XZYsWZIkqayszKBBg1JZWdmsfpo9x9T7rVq1KrNmzcqTTz6ZhQsXpkePHhvTHQAAAABtQGVlZY477riN7meDgqlHHnkkkydPzq9+9ausWbMmn/70p3Pfffflk5/85EYPCAAAAIDWq7a2NpMnT87MmTNTXV2d5G9B1UEHHZRTTz01nTt3bnJfzX6Ub+edd84bb7yR4cOH55RTTsmxxx6b8vLy5l1BK+f2YYC2TR0HaLvUcIDW7dlnn81RRx2VlStX5tBDD61/em7p0qV59NFHs9VWW+WBBx7Ifvvt16T+mh1M3XjjjTnppJPStWvXZg++rfCXIUDbpo4DtF1qOEDrdthhh6VPnz656aab0r59+wb73n333Zx55plZsGBBHn300Sb1t9GTn38Y+csQoG1TxwHaLjUcoHXbZpttMmvWrOyzzz7r3P/cc89l//33z9tvv92k/tq15OAAAAAA+PDaaaed8swzzzS6/5lnnkn37t2b3N9GvZUPAAAAgC3HV77ylZx55pn5wx/+kKOOOqrBHFMPPPBArrnmmowbN67J/QmmAAAAAGiSsWPHZvvtt88Pf/jDXH755SmVSikrK0uS7L333rn66qtz1llnNbk/c0ytg+faAdo2dRyg7VLDAdqOmpqaVFdXJ0kqKytTUVHR7D7cMQUAAABAs1VUVGxQGPV+Jj8HAAAAoMlmzpyZk08+Ob179055eXnKy8vTu3fvnHzyyZkxY0az+nLHFAAAAABN8qtf/Sqf//znM3z48Jx//vkNJj9/6KGHcthhh2Xy5Mk56aSTmtSfOabWwXPtAG2bOg7QdqnhAK1b3759c84552TMmDHr3H/llVfmxhtvzHPPPdek/jzKBwAAAECTLFq0KMccc0yj+4855pgsXLiwyf0JpgAAAABokj333DO33357o/tvu+227LXXXk3ur9XPMdWnT58sWrRore1f/vKXc+211661fdKkSTnjjDMabCsvL88777yzycYIAAAAsCX4wQ9+kOOPPz5Tp07Npz71qQZzTD3wwAOZPXt27r777ib31+qDqaeeeiqrV6+uX3/22WfzqU99ar2TaHXp0iVz586tXy8rK9ukYwQAAADYEgwbNiyzZ8/OxIkTc88996S6ujpJUllZmcGDB+cnP/lJ9tlnnyb31+qDqW7dujVY//73v5/dd989hx12WKPHlJWVpbKyclMPDQAAAGCLs88+++S6665rkb5afTD1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NTn44IPz0ksvNXrMhAkTUlFRUb9UVVVtiksAYBNRxwHaLjUcYMtWViqVSkUPoim+9KUv5f7778/jjz+ej3zkI00+btWqVfnoRz+aUaNG5dJLL11nm3X9lqaqqio1NTXp0qXLRo8dgE1LHQdou9RwgC1bm3iU77zzzst9992XRx99tFmhVJJstdVW+fjHP5558+Y12qa8vDzl5eUbO0wACqKOA7RdajjAlq1VP8pXKpVy3nnn5a677srDDz+cXXfdtdl9rF69Os8880x69uy5CUYIAAAAwIZq1XdMnXvuuZk8eXLuueeedO7cOdXV1UmSioqKbL311kmS0047LTvvvHMmTJiQJPnud7+bgw46KHvssUeWLVuWH/zgB1m0aFHOOuuswq4DAAAAgLW16mDq+uuvT5IcfvjhDbbffPPNOf3005MkixcvTrt2/3fj11//+tecffbZqa6uzvbbb5+BAwdmxowZ2WeffTbXsAEAAABogjYz+fnmVFtbm4qKChMuArRR6jhA26WGA2xZWvUcUwAAAAB8eAmmAAAAACiEYAoAAACAQgimAAAAACiEYAoAAACAQgimAAAAACiEYAoAAACAQgimAAAAACiEYAoAAACAQgimAAAAACiEYAoAAACAQgimAAAAACiEYAoAAACAQgimAAAAACiEYAoAAACAQgimAAAAACiEYAoAAACAQgimAAAAACiEYAoAAACAQgimAAAAACiEYAoAAACAQgimAAAAACiEYAoAAACAQgimAAAAACiEYAoAAACAQgimAAAAACiEYAoAAACAQrSJYOraa69Nnz590qlTpwwaNCi/+93v1tv+jjvuSN++fdOpU6d87GMfy3/9139tppECAAAA0FStPpj6xS9+kTFjxuSSSy7J7Nmz079//wwbNiyvvPLKOtvPmDEjo0aNyplnnpnf//73GTlyZEaOHJlnn312M48cAAAAgPUpK5VKpaIHsT6DBg3KAQcckIkTJyZJ1qxZk6qqqvzLv/xLvvnNb67V/nOf+1xWrFiR++67r37bQQcdlAEDBuSGG25o0jlra2tTUVGRmpqadOnSpWUuBIDNRh2Hplvf/wo2538T19V2Y/4384OObWrfHTp0WOf2d999t8ljKSsr26B9G9p3c/rclGMrihoOyerVqz+wrjalDrZEbd7QPpo61vf2NdZmm222Wef2t956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tvfo0aPJx1x44YWpqampX/785z9v5NUAsDmp4wBtlxoOsGXrUPQA3nPuuefm2WefzeOPP77Zz11eXp7y8vLNfl4AWoY6DtB2qeEAW7ZWccfUeeedl/vuuy+PPPJIPvKRj9Rvr6yszMqVK7Ns2bIG7ZcuXZrKysp19vXe9r9/c9/6jgEAAABg8ys0mCqVSjnvvPNy11135eGHH86uu+7aYP/AgQOz1VZbZdq0afXb5s6dm8WLF2fw4MHr7HPXXXdNZWVlg2Nqa2vz5JNPNnoMAAAAAJtfocHUueeem5/97GeZPHlyOnfunOrq6lRXV+ftt99O8rdJy88888yMGTMmjzzySJ5++umcccYZGTx4cIM38vXt2zd33XVXkqSsrCxf/epX873vfS/33ntvnnnmmZx22mnp1atXRo4cWcRlAgAAALAOhc4xdf311ydJDj/88Abbb7755px++ulJkh/96Edp165dTjzxxNTV1WXYsGG57rrrGrSfO3du/Rv9kuSCCy7IihUrcs4552TZsmUZMmRIpkyZkk6dOm3S6wEAAACg6cpKpVKp6EG0NrW1tamoqEhNTU26dOlS9HAAaCZ1HKDtUsMBtiytYvJzAAAAALY8gikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQgikAAAAACiGYAgAAAKAQhQZTjz76aI499tj06tUrZWVlufvuuxvsLysrW+fygx/8oNE+x40bt1b7vn37buIrAQAAAKC5Cg2mVqxYkf79++faa69d5/4lS5Y0WG666aaUlZXlxBNPXG+//fr1a3Dc448/vimGDwAAAMBG6FDkyUeMGJERI0Y0ur+ysrLB+j333JMjjjgiu+2223r77dChw1rHrk9dXV3q6urq12tra5t8LADFU8cB2i41HGDL1mbmmFq6dGl+85vf5Mwzz/zAti+88EJ69eqV3XbbLaecckoWL1683vYTJkxIRUVF/VJVVdVSwwZgM1DHAdouNRxgy1ZWKpVKRQ8i+dt8UnfddVdGjhy5zv1XXHFFvv/97+fll19Op06dGu3n/vvvz/Lly7P33ntnyZIlGT9+fP7yl7/k2WefTefOndd5zLp+S1NVVZWampp06dJlo64LgE1PHQdou9RwgC1boY/yNcdNN92UU045Zb2hVJIGjwbut99+GTRoUHr37p1f/vKXjd5tVV5envLy8hYdLwCbjzoO0Hap4QBbtjYRTD322GOZO3dufvGLXzT72K5du2avvfbKvHnzNsHIAAAAANhQbWKOqZ/85CcZOHBg+vfv3+xjly9fnvnz56dnz56bYGQAAAAAbKhCg6nly5dnzpw5mTNnTpJkwYIFmTNnToPJymtra3PHHXfkrLPOWmcfRx55ZCZOnFi/Pnbs2EyfPj0LFy7MjBkzcsIJJ6R9+/YZNWrUJr0WAAAAAJqn0Ef5Zs2alSOOOKJ+fcyYMUmS0aNHZ9KkSUmSn//85ymVSo0GS/Pnz89rr71Wv/7SSy9l1KhRef3119OtW7cMGTIkTzzxRLp167bpLgQAAACAZms1b+VrTWpra1NRUeFNIABtlDoO0Hap4QBbljYxxxQAAAAAHz6CKQAAAAAKIZgCAAAAoBCCKQAAAAAKIZgCAAAAoBCCKQAAAAAKIZgCAAAAoBCCKQAAAAAKIZgCAAAAoBCCKQAAAAAKIZgCAAAAoBCCKQAAAAAKIZgCAAAAoBCCKQAAAAAKIZgCAAAAoBCCKQAAAAAKIZgCAAAAoBCCKQAAAAAKIZgCAAAAoBCCKQAAAAAKIZgCAAAAoBCCKQAAAAAKIZgCAAAAoBCCKQAAAAAKIZgCAAAAoBCCKQAAAAAKIZgCAAAAoBCFBlOPPvpojj322PTq1StlZWW5++67G+w//fTTU1ZW1mAZPnz4B/Z77bXXpk+fPunUqVMGDRqU3/3ud5voCgAAAADYUIUGUytWrEj//v1z7bXXNtpm+PDhWbJkSf1y++23r7fPX/ziFxkzZkwuueSSzJ49O/3798+wYcPyyiuvtPTwAQAAANgIHYo8+YgRIzJixIj1tikvL09lZWWT+7zyyitz9tln54wzzkiS3HDDDfnNb36Tm266Kd/85jc3arwAAAAAtJxWP8fUb3/723Tv3j177713vvSlL+X1119vtO3KlSvz9NNPZ+jQofXb2rVrl6FDh2bmzJmNHldXV5fa2toGCwBthzoO0Hap4QBbtlYdTA0fPjw//elPM23atFx++eWZPn16RowYkdWrV6+z/WuvvZbVq1enR48eDbb36NEj1dXVjZ5nwoQJqaioqF+qqqpa9DoA2LTUcYC2Sw0H2LKVlUqlUtGDSJKysrLcddddGTlyZKNtXnzxxey+++556KGHcuSRR661/+WXX87OO++cGTNmZPDgwfXbL7jggkyfPj1PPvnkOvutq6tLXV1d/XptbW2qqqpSU1OTLl26bPhFAbBZqOMAbZcaDrBlK3SOqebabbfdstNOO2XevHnrDKZ22mmntG/fPkuXLm2wfenSpeudp6q8vDzl5eUtPl4ANg91HKDtUsMBtmyt+lG+v/fSSy/l9ddfT8+ePde5v2PHjhk4cGCmTZtWv23NmjWZNm1agzuoAAAAACheocHU8uXLM2fOnMyZMydJsmDBgsyZMyeLFy/O8uXL8/Wvfz1PPPFEFi5cmGnTpuX444/PHnvskWHDhtX3ceSRR2bixIn162PGjMmNN96YW265Jc8991y+9KUvZcWKFfVv6QMAAACgdSj0Ub5Zs2bliCOOqF8fM2ZMkmT06NG5/vrr88c//jG33HJLli1bll69euWoo47KpZde2uBW3/nz5+e1116rX//c5z6XV199NRdffHGqq6szYMCATJkyZa0J0QEAAAAoVquZ/Lw1qa2tTUVFhQkXAdoodRyg7VLDAbYsbWqOKQAAAAA+PARTAAAAABRCMAUAAABAIQRTAAAAABRCMAUAAABAIQRTAAAAABRCMAUAAABAIQRTAAAAABRCMAUAAABAIQRTAAAAABRCMAUAAABAIQRTAAAAABRCMAUAAABAIQRTAAAAABRCMAUAAABAIQRTAAAAABRCMAUAAABAIQRTAAAAABRCMAUAAABAIQRTAAAAABRCMAUAAABAIQRTAAAAABRCMAUAAABAIQRTAAAAABRCMAUAAABAIQRTAAAAABRCMAUAAABAIQRTAAAAABSi0GDq0UcfzbHHHptevXqlrKwsd999d/2+VatW5Rvf+EY+9rGPZdttt02vXr1y2mmn5eWXX15vn+PGjUtZWVmDpW/fvpv4SgAAAABorkKDqRUrVqR///659tpr19r31ltvZfbs2bnooosye/bs3HnnnZk7d26OO+64D+y3X79+WbJkSf3y+OOPb4rhAwAAALAROhR58hEjRmTEiBHr3FdRUZGpU6c22DZx4sQceOCBWbx4cXbZZZdG++3QoUMqKyubPI66urrU1dXVr9fW1jb5WACKp44DtF1qOMCWrU3NMVVTU5OysrJ07dp1ve1eeOGF9OrVK7vttltOOeWULF68eL3tJ0yYkIqKivqlqqqqBUcNwKamjgO0XWo4wJatrFQqlYoeRJKUlZXlrrvuysiRI9e5/5133skhhxySvn375rbbbmu0n/vvvz/Lly/P3nvvnSVLlmT8+PH5y1/+kmeffTadO3de5zHr+i1NVVVVampq0qVLl426LgA2PXUcoO1SwwG2bIU+ytdUq1atymc/+9mUSqVcf/316237/kcD99tvvwwaNCi9e/fOL3/5y5x55pnrPKa8vDzl5eUtOmYANh91HKDtUsMBtmytPph6L5RatGhRHn744Wb/1qRr167Za6+9Mm/evE00QgAAAAA2RKueY+q9UOqFF17IQw89lB133LHZfSxfvjzz589Pz549N8EIAQAAANhQhQZTy5cvz5w5czJnzpwkyYIFCzJnzpwsXrw4q1atymc+85nMmjUrt912W1avXp3q6upUV1dn5cqV9X0ceeSRmThxYv362LFjM3369CxcuDAzZszICSeckPbt22fUqFGb+/IAAAAAWI9CH+WbNWtWjjjiiPr1MWPGJElGjx6dcePG5d57702SDBgwoMFxjzzySA4//PAkyfz58/Paa6/V73vppZcyatSovP766+nWrVuGDBmSJ554It26ddu0FwMAAABAs7Sat/K1JrW1tamoqPAmEIA2Sh0HaLvUcIDW7YwzzvjANqVSKZMmTWpSf61+8nMAAAAAWoeamppG961evToPPfRQ3n77bcEUAAAAAC3rzjvvXOf2e+65J9/61rfSqVOnXHLJJU3ur1W/lQ8AAACA1uuxxx7LwQcfnFGjRuUf//Ef8+KLL+aCCy5o8vGCKQAAAACa5dlnn82xxx6bI488Mv369cu8efNy+eWXp6Kioln9CKYAAAAAaJJFixZl9OjRGTBgQDp06JBnnnkmN954Y3r16rVB/ZljCgAAAIAm2XvvvdOuXbuMHTs2gwcPzvPPP5/nn39+rXbHH398k/oTTAEAAADQJO+++25KpVJ+8IMfNNqmVCplzZo1TepPMAUAAABAk7z77rst2p85pgAAAAAohGAKAAAAgEIIpgAAAAAohGAKAAAAgEIIpgAAAAAohGAKAAAAgEIIpgAAAABoliVLluToo49e68/NJZgCAAAAoFnefvvtPPbYY2v9ubkEUwAAAAAUYoODqXnz5uWBBx7I22+/nSQplUotNigAAAAAPvyaHUy9/vrrGTp0aPbaa68cffTRWbJkSZLkzDPPzPnnn9/iAwQAAADgw6nZwdTXvva1dOjQIYsXL84222xTv/1zn/tcpkyZ0qKDAwAAAODDq0NzD3jwwQfzwAMP5CMf+UiD7XvuuWcWLVrUYgMDAAAA4MOt2XdMrVixosGdUu954403Ul5e3iKDAgAAAODDr9nB1Cc+8Yn89Kc/rV8vKyvLmjVrcsUVV+SII45o0cEBAAAA0PpstdVW6dOnz1p/bq5mP8p3xRVX5Mgjj8ysWbOycuXKXHDBBfnTn/6UN954I//93/+9QYMAAAAAoO2oqqrKM888s9afm6vZd0ztu++++d///d8MGTIkxx9/fFasWJFPf/rT+f3vf5/dd999gwYBAAAAwJan2XdMJUlFRUW+/e1vt/RYAAAAANiCNDuYevTRR9e7/9BDD93gwQAAAACw5Wj2o3yHH374WssRRxxRvzTHo48+mmOPPTa9evVKWVlZ7r777gb7S6VSLr744vTs2TNbb711hg4dmhdeeOED+7322mvTp0+fdOrUKYMGDcrvfve7Zo0LAAAAgE2v2cHUX//61wbLK6+8kilTpuSAAw7Igw8+2Ky+VqxYkf79++faa69d5/4rrrgi11xzTW644YY8+eST2XbbbTNs2LC88847jfb5i1/8ImPGjMkll1yS2bNnp3///hk2bFheeeWVZo0NAAAAgE2rrFQqlVqio+nTp2fMmDF5+umnN2wgZWW56667MnLkyCR/u1uqV69eOf/88zN27NgkSU1NTXr06JFJkybl5JNPXmc/gwYNygEHHJCJEycmSdasWZOqqqr8y7/8S775zW+u85i6urrU1dXVr9fW1qaqqio1NTXp0qXLBl0PAJuPOg7QdqnhAFu2Zt8x1ZgePXpk7ty5LdVdFixYkOrq6gwdOrR+W0VFRQYNGpSZM2eu85iVK1fm6aefbnBMu3btMnTo0EaPSZIJEyakoqKifqmqqmqx6wBg01PHAdouNRygbRk/fnyWLl3a6P5rrrkmN954Y5P7a3Yw9cc//rHB8oc//CFTpkzJP//zP2fAgAHN7a5R1dXVSf4WeL1fjx496vf9vddeey2rV69u1jFJcuGFF6ampqZ++fOf/7yRowdgc1LHAdouNRygbRk/fvx6M5Z33nknkydPbnJ/zX4r34ABA1JWVpa/fwLwoIMOyk033dTc7lqF8vLylJeXFz0MADaQOg7QdqnhAG1LWVlZnnrqqSxbtqzRNrNnz25yf80OphYsWNBgvV27dunWrVs6derU3K7Wq7KyMkmydOnS9OzZs3770qVLG70za6eddkr79u3XuqVs6dKl9f0BAAAAsOHOOeeclJWVNbq/OdOZN/tRvt69ezdYqqqqWjyUSpJdd901lZWVmTZtWv222traPPnkkxk8ePA6j+nYsWMGDhzY4Jg1a9Zk2rRpjR4DAAAAQNM9+uij+etf/9rosr67qf5ek+6Yuuaaa5rc4Ve+8pUmt12+fHnmzZtXv75gwYLMmTMnO+ywQ3bZZZd89atfzfe+973sueee2XXXXXPRRRelV69e9W/uS5IjjzwyJ5xwQs4777wkyZgxYzJ69Oj8wz/8Qw488MBcddVVWbFiRc4444wmjwsAAACAdevcuXOLvTm1ScHUj370oyZ1VlZW1qxgatasWTniiCPq18eMGZMkGT16dCZNmpQLLrggK1asyDnnnJNly5ZlyJAhmTJlSoM7tObPn5/XXnutfv1zn/tcXn311Vx88cWprq7OgAEDMmXKlLUmRAcAAACgeW6++ebssssuLdZfWak5D/5tIWpra1NRUZGampoWSwAB2HzUcYC2Sw0H2LI0e/JzAAAAALZszz//fGbOnJnq6uokf3uJ3eDBg9O3b99m9bNBwdRLL72Ue++9N4sXL87KlSsb7Lvyyis3pEsAAAAAWrlly5bl85//fB544IF07do13bt3T5K88sor+etf/5phw4Zl8uTJ2X777ZvUX7ODqWnTpuW4447Lbrvtlueffz777rtvFi5cmFKplP3337+53QEAAADQRpx33nl55ZVXMmvWrHz84x9vsO/3v/99zjzzzJx33nm57bbbmtRfu+YO4MILL8zYsWPzzDPPpFOnTvnVr36VP//5zznssMNy0kknNbc7AAAAANqIX//617n++uvXCqWS5OMf/3h+/OMf57777mtyf80Opp577rmcdtppSZIOHTrk7bffznbbbZfvfve7ufzyy5vbHQAAAABtRLt27daa1un9Vq5cmXbtmh43NTuY2nbbbesH0LNnz8yfP79+32uvvdbc7gAAAABoIz7zmc/kC1/4Qh588MGsXr26fvvq1avzwAMP5PTTT8+JJ57Y5P6aPcfUQQcdlMcffzwf/ehHc/TRR+f888/PM888kzvvvDMHHXRQc7sDAAAAoI24+uqr88UvfjFHH310ysrKssMOOyRJ3njjjZRKpZx88sm5+uqrm9xfWalUKjVnAC+++GKWL1+e/fbbLytWrMj555+fGTNmZM8998yVV16Z3r17N++KWqHa2tpUVFSkpqYmXbp0KXo4ADSTOg7QdqnhAG1DdXV1fve732XJkiVJksrKygwaNCiVlZXN6qfZd0xddtllOfXUU5P87bG+G264obldAAAAANCGVVZW5rjjjtvofpodTL366qsZPnx4unXrlpNPPjmnnnpq+vfvv9EDAQAAAKD1q62tzeTJkzNz5sxUV1cn+VtQddBBB+XUU09N586dm9xXsyc/v+eee7JkyZJcdNFFeeqpp7L//vunX79+ueyyy7Jw4cLmdgcAAABAG/Hss8+mb9+++c53vpM333wzu+22W3bbbbe8+eabueiii7LXXnvlj3/8Y5P7a/YcU3/vpZdeyu23356bbropL7zwQt59992N6a5V8Fw7QNumjgO0XWo4QOt22GGHpU+fPrnpppvSvn37BvvefffdnHnmmVmwYEEeffTRJvXX7Ef53m/VqlWZNWtWnnzyySxcuDA9evTYmO4AAAAAaMWeeuqpXH/99WuFUknSoUOHfPOb38z+++/f5P6a/ShfkjzyyCM5++yz06NHj5x++unp0qVL7rvvvrz00ksb0h0AAAAAbcBOO+2UZ555ptH9zzzzTLp3797k/pp9x9TOO++cN954I8OHD8+Pf/zjHHvssSkvL29uNwAAAAC0MV/5yldy5pln5g9/+EOOOuqo+qfnli5dmgceeCDXXHNNxo0b1+T+mh1MjRs3LieddFK6du3a3EMBAAAAaMPGjh2b7bffPj/84Q9z+eWXp1QqpaysLEmy99575+qrr85ZZ53V5P42evLzDyMTLgK0beo4QNulhgO0HTU1Namurk6SVFZWpqKiotl9bNTk5wAAAABsmSoqKjYojHq/DZr8HAAAAIAt08yZM3PyySend+/eKS8vT3l5eXr37p2TTz45M2bMaFZf7pgCAAAAoEl+9atf5fOf/3yGDx+e888/v8Hk5w899FAOO+ywTJ48OSeddFKT+jPH1Dp4rh2gbVPHAdouNRygdevbt2/OOeecjBkzZp37r7zyytx444157rnnmtSfR/kAAAAAaJJFixblmGOOaXT/Mccck4ULFza5P8EUAAAAAE2y55575vbbb290/2233Za99tqryf2ZYwoAAACAJvnBD36Q448/PlOnTs2nPvWpBnNMPfDAA5k9e3buvvvuJvcnmAIAAACgSYYNG5bZs2dn4sSJueeee1JdXZ0kqayszODBg/OTn/wk++yzT5P7E0wBAAAA0GT77LNPrrvuuhbpSzAFAAAAQLMtWLCg/o6pHj16ZLfddmt2H61+8vM+ffqkrKxsreXcc89dZ/tJkyat1bZTp06bedQAAAAAH05XXHFFevXqld133z1DhgzJkCFDsscee6RXr165/PLLm9VXq79j6qmnnsrq1avr15999tl86lOfykknndToMV26dMncuXPr18vKyjbpGAEAAAC2BOPGjcu///u/5zvf+U6OPPLIBpOfT5s2LZdeemlWrFiR7373u03qr9UHU926dWuw/v3vfz+77757DjvssEaPKSsrS2Vl5aYeGgAAAMAW5cc//nEmTZqUY489tsH2Hj16ZL/99suee+6Zc84558MTTL3fypUr87Of/SxjxoxZ711Qy5cvT+/evbNmzZrsv//+ueyyy9KvX79G29fV1aWurq5+vba2tkXHDcCmpY4DtF1qOEDbsmzZsvTp06fR/X369MmyZcua3F+rn2Pq/e6+++4sW7Ysp59+eqNt9t5779x0002555578rOf/Sxr1qzJwQcfnJdeeqnRYyZMmJCKior6paqqahOMHoBNRR0HaLvUcIC25ROf+EQuuuiidf4ioba2Nt/5zndyyCGHNLm/slKpVGrJAW5Kw4YNS8eOHfPrX/+6ycesWrUqH/3oRzNq1Khceuml62yzrt/SVFVVpaamJl26dNnocQOwaanjAG2XGg7QtsybNy8jRozISy+9lEGDBjWYY+rJJ59Mr1698sADD2SPPfZoUn9t5lG+RYsW5aGHHsqdd97ZrOO22mqrfPzjH8+8efMabVNeXp7y8vKNHSIABVHHAdouNRygbdljjz3ypz/9Kffcc09mzJiR6urqJMnHP/7xfPnLX87IkSPT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kSO67rrrtHjxYsXExCghIUGStG/fPh0+fFhjxozRggULFBsbW6f26hRMPf3003Uu8I9//GOdjy0oKNDWrVt969u3b9eGDRsUFxen9u3b6/bbb9fDDz+sbt26qVOnTrr//vuVnJzsC50kadSoUbriiit8wdO0adM0adIknXPOOTr33HM1Z84cFRYW6uabb65zXQAAAAAAADje1KlTtW/fPmVkZKh///419q1fv16TJ0/W1KlT9frrr9epvToFU08++WSdGjMMo17BVEZGhkaOHOlbnzZtmiRp0qRJmj9/vu666y4VFhbq1ltv1ZEjRzRs2DAtWrSoxmWD27Zt04EDB3zr11xzjfbv368HHnhAubm56tevnxYtWnTchOgAAAAAAAConw8//FBLly49LpSSpP79++vFF1/UqFGj6tye4T12FnPI7XbL6XTK5XLV6xaHAIDAQD8OAMGLPhwAAltsbKw++ugjDR061O/+lStX6pJLLtHhw4fr1J6lIYsDAAAAAABA83X11VfrN7/5jT777DNVVlb6tldWVmrx4sW66aabdNVVV9W5vXpPfi5Ju3fv1gcffKDs7GyVlZXV2PfEE0+cSpMAAAAAAAAIcE899ZT+3//7f7r44otlGIbi4uIkSYcOHZLX69W1116rp556qs7t1TuYSktL0+WXX67OnTsrMzNTffr00Y4dO+T1enX22WfXtzkAAAAAAAAEifDwcL322muaPXu2vv76a+3du1eSlJSUpEGDBikpKale7dU7mJo+fbruvPNOzZo1S1FRUfrvf/+rhIQEXX/99Ro7dmx9mwMAAAAAAECQSUpK0uWXX37a7dQ7mPr+++/1xhtvHD3ZZlNxcbEiIyP14IMPavz48brttttOuygAAAAAAAAEJrfbrQULFmjVqlXKzc2VdDSoGjx4sG644QZFRUXVua16T34eERHhm1eqTZs22rZtm2/fgQMH6tscAAAAAAAAgsSmTZvUs2dP3XfffcrPz1fnzp3VuXNn5efn6/7771f37t313Xff1bm9eo+YGjx4sFasWKFevXrp4osv1h133KGNGzfq3Xff1eDBg+vbHAAAAAAAAILElClTdOGFF+rll1+W1Wqtsa+iokKTJ0/W1KlTtXz58jq1Z3i9Xm99Cvjxxx9VUFCgs846S4WFhbrjjju0cuVKdevWTU888YQ6dOhQn+YCktvtltPplMvlUnR0tNnlAADqiX4cAIIXfTgABLbw8HBlZGTojDPO8Lv/+++/19lnn63i4uI6tVfvEVN/+9vfdMMNN0g6elnf888/X98mAAAAAAAAEIRat26tjRs31hpMbdy4UQkJCXVur97B1P79+zV27FjFx8fr2muv1Q033KC+ffvWtxkAAAAAAAAEmT/+8Y+aPHmyvv32W1100UVKTEyUJOXl5Wnx4sV6+umnNXPmzDq3V+9L+STp8OHDevvtt7VgwQJ9+eWX6tmzp66//npdd9116tixY32bCzgMHwaA4EY/DgDBiz4cAALfP//5Tz3++OPKysqS1+uVYRiSpB49emjatGn67W9/W+e2TimYqm737t1644039PLLL2vLli2qqKg4neYCAr8MASC40Y8DQPCiDweA4OFyuZSbmytJSkpKktPprHcb9b6Ur7ry8nJlZGRozZo12rFjh2/4FgAAAAAAAJo3p9N5SmFUdZZTOWnZsmW65ZZblJiYqJtuuknR0dH66KOPtHv37tMqBgAAAAAAAIFt1apVuvbaa9WhQwc5HA45HA516NBB1157rVauXFmvtuo9Yqpt27Y6dOiQxo4dqxdffFGXXXaZHA5HfZsBAAAAAABAkPnvf/+r6667TmPHjtUdd9xRY/LzpUuX6oILLtCCBQv0y1/+sk7t1XuOqZdeekm//OUvFRMTU+/igwXXtQNAcKMfB4DgRR8OAIGtZ8+euvXWWzVt2jS/+5944gm99NJL+v777+vUXr0v5bvllluadSgFAAAAAAAA/3bu3KlLLrmk1v2XXHKJduzYUef2TmmOKQAAAAAAALQ83bp10xtvvFHr/tdff13du3evc3undVc+AAAAAAAAtByzZ8/W+PHjtWTJEl144YU15phavHix1q1bp4ULF9a5PYIpAAAAAAAA1MmYMWO0bt06zZ07V++//75yc3MlSUlJSRoyZIj++c9/6owzzqhzewRTAAAAAAAAqLMzzjhDzz33XIO0RTAFAAAAAACAetu+fbtvxFRiYqI6d+5c7zaY/BwAAAAAAAB19uijjyo5OVldunTRsGHDNGzYMHXt2lXJycl65JFH6tUWI6YAAAAAAABQJzNnztQzzzyj++67T6NGjaox+XlaWpoeeughFRYW6sEHH6xTe4bX6/U2ZsHByO12y+l0yuVyKTo62uxyAAD1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Ne4PCAhATk5Orcfk5OTUa38AmD9/PrRare0WGhp68+GJiKjJsI4TETku1nAiIudm142ppjJr1iyUlpbabpmZmWJHIiKiemAdJyJyXKzhRETOTS52gGvx9fWFTCZDbm5ujftzc3MRGBhY6zGBgYH12h8AlEollErlzQcmIiJRsI4TETku1nAiIudm1yOmFAoFunXrhm3bttnus1qt2LZtG3r37l3rMb17966xPwD89ttvV92fiIiIiIiIiIjEYdcjpgBg+vTpeOSRR9C9e3f07NkTH330EfR6PR577DEAwPjx4xEcHIz58+cDAKZNm4YBAwZg4cKFuPPOO7Fq1SocOXIEX375pZjfBhERERERERER/YvdN6bGjh2L/Px8vPbaa8jJyUHnzp2xZcsW2wLnGRkZkEr/HvjVp08frFy5ErNnz8Yrr7yCyMhIrFu3Dh06dBDrWyAiIiIiIiIiolpIBEEQxA5hb3Q6HbRaLUpLS+Hh4SF2HCIiqifWcSIix8UaTkTkXOx6jSkiIiIiIiIiImq+2JgiIiIiIiIiIiJRsDFFRERERERERESiYGOKiIiIiIiIiIhEwcYUERERERERERGJgo0pIiIiIiIiIiISBRtTREREREREREQkCrnYAeyRIAgAAJ1OJ3ISIiLnotFoIJFIbvo8rONERE2PNZyIyLE1VB2vLzamalFWVgYACA0NFTkJEZFzKS0thYeHx02fh3WciKjpsYYTETm2hqrj9SUR/vpIgmysVisuX74sWrewOdPpdAgNDUVmZqYoT3iiG8XnbtNoqLrLOt54+LNAjorP3cbHGu4Y+LNAjorP3cbHEVN2RCqVIiQkROwYzZqHhweLCTkkPncdA+t44+PPAjkqPnftH2t40+DPAjkqPnebHy5+TkREREREREREomBjioiIiIiIiIiIRMHGFDUppVKJOXPmQKlUih2FqF743CWqxp8FclR87hJV488COSo+d5svLn5ORERERERERESi4IgpIiIiIiIiIiISBRtTREREREREREQkCjamiIiIiIiIiIhIFGxM0XVVVFTg3nvvhYeHByQSCUpKSm76nOvWrUNERARkMhmee+45LF26FJ6enjd9XnI88fHxeO655xrkXHPnzkXnzp0b5Fxi+/fPxI18bxKJBOvWrWvQXOSYWMepsbCG1441nBoSazg1Jtbx2rGONy02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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "g = sns.FacetGrid(all_benchmarks_df_melted, col=\"T\", row=\"N\", margin_titles=True, height=4, aspect=1)\n", "g.map_dataframe(sns.violinplot, x='model', y='value', hue='model', palette='Set2', legend=False)\n", "\n", "# Adjust layout\n", + "plt.yscale('log')\n", "plt.subplots_adjust(top=0.9)\n", "g.fig.suptitle('Violin Plots of Models for Different N and T')\n", "\n", "plt.show()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/utils/estimators.py b/utils/estimators.py index 0814cf6..2f014f6 100644 --- a/utils/estimators.py +++ b/utils/estimators.py @@ -13,7 +13,12 @@ def twfe_fixest(df, T, T0): def twfe_fixest_compressed(df, T, T0): try: - m = pf.feols("Y~W | unit + time", df, use_compression = True).tidy() + m = pf.feols( + fml = "Y~W | unit + time", + data = df, + use_compression = True, + reps = 1 + ).tidy() except MemoryError: print("MemoryError: Not enough memory to run.") From 111229782e173f1863586d36f7a43828d82443dd Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Wed, 9 Oct 2024 23:14:42 +0200 Subject: [PATCH 2/4] add event study benchmarks --- data/benchmark100000_14_7.csv | 4 + data/benchmark100000_28_7.csv | 4 + data/benchmark100000_42_7.csv | 4 + data/benchmark10000_14_7.csv | 4 + pixi.lock | 125 +++++++++++++++++- pyproject.toml | 2 +- timining_benchmarks.ipynb | 240 +++++++++++++++++++++++++++------- utils/benchmark.py | 19 ++- utils/estimators.py | 72 +++++----- 9 files changed, 391 insertions(+), 83 deletions(-) create mode 100644 data/benchmark100000_14_7.csv create mode 100644 data/benchmark100000_28_7.csv create mode 100644 data/benchmark100000_42_7.csv create mode 100644 data/benchmark10000_14_7.csv diff --git a/data/benchmark100000_14_7.csv b/data/benchmark100000_14_7.csv new file mode 100644 index 0000000..6ec83fc --- /dev/null +++ b/data/benchmark100000_14_7.csv @@ -0,0 +1,4 @@ +,twfe_statsmodels,twfe_fixest_compressed,twfe_fixest,event_study_fixest,duck_mundlak,duck_mundlak_event,N,T,T0 +0,,1.5650169849395752,1.025242805480957,2.8195056915283203,0.3231985569000244,0.012965917587280273,100000,14,7 +1,,1.5771527290344238,1.1382153034210205,1.9317655563354492,0.2892742156982422,0.013964414596557617,100000,14,7 +2,,1.5973916053771973,1.1420490741729736,1.9872798919677734,0.3146228790283203,0.013991355895996094,100000,14,7 diff --git a/data/benchmark100000_28_7.csv b/data/benchmark100000_28_7.csv new file mode 100644 index 0000000..f3a994c --- /dev/null +++ b/data/benchmark100000_28_7.csv @@ -0,0 +1,4 @@ +,twfe_statsmodels,twfe_fixest_compressed,twfe_fixest,event_study_fixest,duck_mundlak,duck_mundlak_event,N,T,T0 +0,,2.3644139766693115,1.222491979598999,6.415189743041992,0.818631649017334,0.016979694366455078,100000,28,7 +1,,2.3045310974121094,1.1898529529571533,6.398603200912476,0.6646432876586914,0.016531944274902344,100000,28,7 +2,,2.285304546356201,1.252234935760498,9.608892440795898,0.6715579032897949,0.01595783233642578,100000,28,7 diff --git a/data/benchmark100000_42_7.csv b/data/benchmark100000_42_7.csv new file mode 100644 index 0000000..51539b6 --- /dev/null +++ b/data/benchmark100000_42_7.csv @@ -0,0 +1,4 @@ +,twfe_statsmodels,twfe_fixest_compressed,twfe_fixest,event_study_fixest,duck_mundlak,duck_mundlak_event,N,T,T0 +0,,3.5332040786743164,1.544895887374878,15.637751817703247,1.35536789894104,0.020453691482543945,100000,42,7 +1,,3.681572437286377,1.5531425476074219,21.96467161178589,0.8629484176635742,0.026926517486572266,100000,42,7 +2,,3.58103609085083,1.4542961120605469,16.58826994895935,0.9000434875488281,0.021899700164794922,100000,42,7 diff --git a/data/benchmark10000_14_7.csv b/data/benchmark10000_14_7.csv new file mode 100644 index 0000000..4ae2e35 --- /dev/null +++ b/data/benchmark10000_14_7.csv @@ -0,0 +1,4 @@ +,twfe_statsmodels,twfe_fixest_compressed,twfe_fixest,event_study_fixest,duck_mundlak,duck_mundlak_event,N,T,T0 +0,,2.6141197681427,0.6356804370880127,0.7050578594207764,0.22404909133911133,0.015578031539916992,10000,14,7 +1,,0.7215888500213623,0.6314306259155273,0.6742532253265381,0.0789484977722168,0.014959096908569336,10000,14,7 +2,,0.6667027473449707,0.7373080253601074,0.6585514545440674,0.08377385139465332,0.013962507247924805,10000,14,7 diff --git a/pixi.lock b/pixi.lock index 1b7dbec..5d45b86 100644 --- a/pixi.lock +++ b/pixi.lock @@ -49,10 +49,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/02/3f/a6ec28c88e2d8e54d32598a1e0b5208a4baa72a8e7f6e241beab5731eb9d/interface_meta-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/93/858e87edc634d628e5d752ba944c2833133a28fa87bb093e6832ced36a3e/jupyterlab_widgets-3.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/21/e4/c0b6746fd2eb62fe702118b3ca0cb384ce95e1261cfada58ff693aeec08a/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a7/24/47be185d81bdbb8afccdedd6f134d070aefb6ca520e5419b92316bd6b4fe/lets_plot-4.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/5f/323c4d56e8401c50185fd0e875fcf06b71bf825a863699be1eb10aa2a9cb/llvmlite-0.43.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl @@ -85,6 +87,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/07/3b/44ea6266a6761e9eefaa37d98fabefa112328808ac41aa87b4bbb668af30/pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8e/ee/8a26858ca517e9c64f84b4c7734b89bda8e63bec85c3d2f432d225bb1886/scipy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ff/ae/f19306b5a221f6a436d8f2238d5b80925004093fa3edea59835b514d9057/setuptools-75.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fa/e1/60a652f18996a40a7410aeb7eb476c18da8a39792c7effe67f06883e9852/statsmodels-0.14.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl @@ -94,7 +97,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c3/ac/1847959031ce09eb65a70b16d0f07633d7ddaf8a97752cc924f9a8cbe253/watermark-2.5.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/62/30ca2405de6a20448ee557ab2cd61ab9c5900be7cbd18a2639db595f0b98/wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: . @@ -133,10 +138,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/02/3f/a6ec28c88e2d8e54d32598a1e0b5208a4baa72a8e7f6e241beab5731eb9d/interface_meta-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/93/858e87edc634d628e5d752ba944c2833133a28fa87bb093e6832ced36a3e/jupyterlab_widgets-3.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f2/d8/0fe8c5f5d35878ddd135f44f2af0e4e1d379e1c7b0716f97cdcb88d4fd27/kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ff/82/4a3769d1c7855d9a1b54cba5174b20c7ab133ac6a38b4a4ad5464171d13c/lets_plot-4.4.1-cp312-cp312-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0b/67/9443509e5d2b6d8587bae3ede5598fa8bd586b1c7701696663ea8af15b5b/llvmlite-0.43.0-cp312-cp312-macosx_10_9_x86_64.whl @@ -169,6 +176,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/28/2f/78a766c8913ad62b28581777ac4ede50c6d9f249d39c2963e279524a1bbe/pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/c0/04/2bdacc8ac6387b15db6faa40295f8bd25eccf33f1f13e68a72dc3c60a99e/scipy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ff/ae/f19306b5a221f6a436d8f2238d5b80925004093fa3edea59835b514d9057/setuptools-75.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/99/654fd41a9024643ee70b239e5ebc987bf98ce9fc2693bd550bee58136564/statsmodels-0.14.4-cp312-cp312-macosx_10_13_x86_64.whl @@ -178,7 +186,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c3/ac/1847959031ce09eb65a70b16d0f07633d7ddaf8a97752cc924f9a8cbe253/watermark-2.5.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/17/224132494c1e23521868cdd57cd1e903f3b6a7ba6996b7b8f077ff8ac7fe/wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: . @@ -217,10 +227,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/02/3f/a6ec28c88e2d8e54d32598a1e0b5208a4baa72a8e7f6e241beab5731eb9d/interface_meta-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/93/858e87edc634d628e5d752ba944c2833133a28fa87bb093e6832ced36a3e/jupyterlab_widgets-3.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/c5/57fa58276dfdfa612241d640a64ca2f76adc6ffcebdbd135b4ef60095098/kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4f/c4/834efcdd54068bc63eb0422a4f45d9957c3dafb127c842f045b0b9724f1d/lets_plot-4.4.1-cp312-cp312-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/a2/9c/24139d3712d2d352e300c39c0e00d167472c08b3bd350c3c33d72c88ff8d/llvmlite-0.43.0-cp312-cp312-macosx_11_0_arm64.whl @@ -253,6 +265,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/28/2f/78a766c8913ad62b28581777ac4ede50c6d9f249d39c2963e279524a1bbe/pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/c8/53/35b4d41f5fd42f5781dbd0dd6c05d35ba8aa75c84ecddc7d44756cd8da2e/scipy-1.14.1-cp312-cp312-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ff/ae/f19306b5a221f6a436d8f2238d5b80925004093fa3edea59835b514d9057/setuptools-75.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/67/d8/ac30cf4cf97adaa48548be57e7cf02e894f31b45fd55bf9213358d9781c9/statsmodels-0.14.4-cp312-cp312-macosx_11_0_arm64.whl @@ -262,7 +275,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c3/ac/1847959031ce09eb65a70b16d0f07633d7ddaf8a97752cc924f9a8cbe253/watermark-2.5.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/d7/cfcd73e8f4858079ac59d9db1ec5a1349bc486ae8e9ba55698cc1f4a1dff/wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: . @@ -303,10 +318,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/02/3f/a6ec28c88e2d8e54d32598a1e0b5208a4baa72a8e7f6e241beab5731eb9d/interface_meta-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/3a/5d8680279ada9571de8469220069d27024ee47624af534e537c9ff49a450/ipython-8.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/93/858e87edc634d628e5d752ba944c2833133a28fa87bb093e6832ced36a3e/jupyterlab_widgets-3.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/19/93/c05f0a6d825c643779fc3c70876bff1ac221f0e31e6f701f0e9578690d70/kiwisolver-1.4.7-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/29/6f/7f31a52589d26e1780dea0b3960ed882577e3e144b1f1a3a287461b57f59/lets_plot-4.4.1-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c6/94/dea10e263655ce78d777e78d904903faae39d1fc440762be4a9dc46bed49/llvmlite-0.43.0-cp312-cp312-win_amd64.whl @@ -338,6 +355,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ce/2c/a6f4a20202a4d3c582ad93f95ee78d79bbdc26803495aec2912b17dbbb6c/pyzmq-26.2.0-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/aa/7d/43ab67228ef98c6b5dd42ab386eae2d7877036970a0d7e3dd3eb47a0d530/scipy-1.14.1-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ff/ae/f19306b5a221f6a436d8f2238d5b80925004093fa3edea59835b514d9057/setuptools-75.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/59/9a/e466a1b887a1441141e52dbcc98152f013d85076576da6eed2357f2016ae/statsmodels-0.14.4-cp312-cp312-win_amd64.whl @@ -347,7 +365,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c3/ac/1847959031ce09eb65a70b16d0f07633d7ddaf8a97752cc924f9a8cbe253/watermark-2.5.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/cc/8297f9658506b224aa4bd71906447dea6bb0ba629861a758c28f67428b91/wrapt-1.16.0-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - pypi: . @@ -1101,6 +1121,23 @@ packages: - pandas ; extra == 'test-extra' - trio ; extra == 'test-extra' requires_python: '>=3.10' +- kind: pypi + name: ipywidgets + version: 8.1.5 + url: https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl + sha256: 3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245 + requires_dist: + - comm>=0.1.3 + - ipython>=6.1.0 + - traitlets>=4.3.1 + - widgetsnbextension~=4.0.12 + - jupyterlab-widgets~=3.0.12 + - jsonschema ; extra == 'test' + - ipykernel ; extra == 'test' + - pytest>=3.6.0 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytz ; extra == 'test' + requires_python: '>=3.7' - kind: pypi name: jedi version: 0.19.1 @@ -1201,6 +1238,12 @@ packages: - pytest-timeout ; extra == 'test' - pytest<8 ; extra == 'test' requires_python: '>=3.8' +- kind: pypi + name: jupyterlab-widgets + version: 3.0.13 + url: https://files.pythonhosted.org/packages/a9/93/858e87edc634d628e5d752ba944c2833133a28fa87bb093e6832ced36a3e/jupyterlab_widgets-3.0.13-py3-none-any.whl + sha256: e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54 + requires_python: '>=3.7' - kind: pypi name: kiwisolver version: 1.4.7 @@ -2348,7 +2391,7 @@ packages: name: panel-scale-code version: 0.1.0 path: . - sha256: 86500655d723b267ad3d875c04673f128297f752448027ee3e60acd901352a96 + sha256: 5032f4eab228c3a0435add6df5a2f63c7f6200ef16e922f87cb308a67bc85adc requires_dist: - duckreg - statsmodels @@ -2356,6 +2399,8 @@ packages: - duckdb - pyfixest>=0.25.2 - pyarrow>=17.0.0,<18 + - ipywidgets>=8.1.5,<9 + - watermark>=2.5.0,<3 - statsmodels ; extra == 'default' - duckdb ; extra == 'default' requires_python: '>=3.11' @@ -3237,6 +3282,67 @@ packages: - scipy>=1.7 ; extra == 'stats' - statsmodels>=0.12 ; extra == 'stats' requires_python: '>=3.8' +- kind: pypi + name: setuptools + version: 75.1.0 + url: https://files.pythonhosted.org/packages/ff/ae/f19306b5a221f6a436d8f2238d5b80925004093fa3edea59835b514d9057/setuptools-75.1.0-py3-none-any.whl + sha256: 35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2 + requires_dist: + - pytest-checkdocs>=2.4 ; extra == 'check' + - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' + - ruff>=0.5.2 ; sys_platform != 'cygwin' and extra == 'check' + - packaging>=24 ; extra == 'core' + - more-itertools>=8.8 ; extra == 'core' + - jaraco-text>=3.7 ; extra == 'core' + - wheel>=0.43.0 ; extra == 'core' + - platformdirs>=2.6.2 ; extra == 'core' + - jaraco-collections ; extra == 'core' + - jaraco-functools ; extra == 'core' + - packaging ; extra == 'core' + - more-itertools ; extra == 'core' + - importlib-metadata>=6 ; python_full_version < '3.10' and extra == 'core' + - tomli>=2.0.1 ; python_full_version < '3.11' and extra == 'core' + - importlib-resources>=5.10.2 ; python_full_version < '3.9' and extra == 'core' + - pytest-cov ; extra == 'cover' + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pygments-github-lexers==0.0.5 ; extra == 'doc' + - sphinx-favicon ; extra == 'doc' + - sphinx-inline-tabs ; extra == 'doc' + - sphinx-reredirects ; extra == 'doc' + - sphinxcontrib-towncrier ; extra == 'doc' + - sphinx-notfound-page<2,>=1 ; extra == 'doc' + - pyproject-hooks!=1.1 ; extra == 'doc' + - towncrier<24.7 ; extra == 'doc' + - pytest-enabler>=2.2 ; extra == 'enabler' + - pytest!=8.1.*,>=6 ; extra == 'test' + - virtualenv>=13.0.0 ; extra == 'test' + - wheel>=0.44.0 ; extra == 'test' + - pip>=19.1 ; extra == 'test' + - packaging>=23.2 ; extra == 'test' + - jaraco-envs>=2.2 ; extra == 'test' + - pytest-xdist>=3 ; extra == 'test' + - jaraco-path>=3.2.0 ; extra == 'test' + - build[virtualenv]>=1.0.3 ; extra == 'test' + - filelock>=3.4.0 ; extra == 'test' + - ini2toml[lite]>=0.14 ; extra == 'test' + - tomli-w>=1.0.0 ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-home>=0.5 ; extra == 'test' + - pytest-subprocess ; extra == 'test' + - pyproject-hooks!=1.1 ; extra == 'test' + - jaraco-test ; extra == 'test' + - jaraco-develop>=7.21 ; python_full_version >= '3.9' and sys_platform != 'cygwin' and extra == 'test' + - pytest-perf ; sys_platform != 'cygwin' and extra == 'test' + - pytest-mypy ; extra == 'type' + - mypy==1.11.* ; extra == 'type' + - importlib-metadata>=7.0.2 ; python_full_version < '3.10' and extra == 'type' + - jaraco-develop>=7.21 ; sys_platform != 'cygwin' and extra == 'type' + requires_python: '>=3.8' - kind: pypi name: six version: 1.16.0 @@ -3615,6 +3721,17 @@ packages: purls: [] size: 17241 timestamp: 1725984096440 +- kind: pypi + name: watermark + version: 2.5.0 + url: https://files.pythonhosted.org/packages/c3/ac/1847959031ce09eb65a70b16d0f07633d7ddaf8a97752cc924f9a8cbe253/watermark-2.5.0-py2.py3-none-any.whl + sha256: d775afa075f5ea15152ad9f4c82dfc95bffb9d0cb4341c9b62073b627191464d + requires_dist: + - ipython>=6.0 + - importlib-metadata>=1.4 + - setuptools + - py3nvml>=0.2 ; extra == 'gpu' + requires_python: '>=3.7' - kind: pypi name: wcwidth version: 0.2.13 @@ -3622,6 +3739,12 @@ packages: sha256: 3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 requires_dist: - backports-functools-lru-cache>=1.2.1 ; python_full_version < '3.2' +- kind: pypi + name: widgetsnbextension + version: 4.0.13 + url: https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl + sha256: 74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71 + requires_python: '>=3.7' - kind: pypi name: wrapt version: 1.16.0 diff --git a/pyproject.toml b/pyproject.toml index 75bbaae..8674f42 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] authors = [{name = "Alexander Fischer", email = "alexander-fischer1801@t-online.de"}] -dependencies = [ "duckreg", "statsmodels", "ipykernel", "duckdb", "pyfixest>=0.25.2", "pyarrow>=17.0.0,<18"] +dependencies = [ "duckreg", "statsmodels", "ipykernel", "duckdb", "pyfixest>=0.25.2", "pyarrow>=17.0.0,<18", "ipywidgets>=8.1.5,<9", "watermark>=2.5.0,<3"] description = "Add a short description here" name = "panel-scale-code" requires-python = ">= 3.11" diff --git a/timining_benchmarks.ipynb b/timining_benchmarks.ipynb index 8a67dd4..2e95dcb 100644 --- a/timining_benchmarks.ipynb +++ b/timining_benchmarks.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -11,8 +11,24 @@ "text": [ "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n", + "The watermark extension is already loaded. To reload it, use:\n", + " %reload_ext watermark\n", + "sys : 3.12.7 | packaged by conda-forge | (main, Oct 4 2024, 15:47:54) [MSC v.1941 64 bit (AMD64)]\n", + "matplotlib: 3.9.2\n", + "tqdm : 4.66.4\n", + "seaborn : 0.13.2\n", + "pandas : 2.2.3\n", + "\n", "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" + " %reload_ext autoreload\n", + "The watermark extension is already loaded. To reload it, use:\n", + " %reload_ext watermark\n", + "sys : 3.12.7 | packaged by conda-forge | (main, Oct 4 2024, 15:47:54) [MSC v.1941 64 bit (AMD64)]\n", + "matplotlib: 3.9.2\n", + "tqdm : 4.66.4\n", + "seaborn : 0.13.2\n", + "pandas : 2.2.3\n", + "\n" ] } ], @@ -20,93 +36,225 @@ "%load_ext autoreload\n", "%autoreload 2\n", "\n", - "from itertools import product\n", + "%load_ext watermark\n", + "%watermark --iversions\n", + "\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import sys\n", + "import io\n", + "from utils.benchmark import Bench\n", + "from tqdm.notebook import tqdm\n", + "\n", "from utils.dgps import generate_benchmark_data\n", "from utils.estimators import (\n", - " twfe_fixest, twfe_fixest_compressed, twfe_statsmodels, duck_mundlak\n", + " twfe_fixest, \n", + " twfe_fixest_compressed, \n", + " twfe_statsmodels, \n", + " duck_mundlak, \n", + " event_study_fixest, \n", + " duck_mundlak_event, \n", + " event_study_statsmodels\n", ")\n", "from utils.benchmark import Bench\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "import seaborn as sns" + "from itertools import product\n" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 46, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a59b403f75b1441192ff0d9990e5427e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Processing benchmarks: 0%| | 0/3 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "g = sns.FacetGrid(median_run_pooled, col=\"T\", row=\"N\", margin_titles=True, height=4, aspect=1)\n", + "g.map_dataframe(sns.barplot, x='model', y='value', hue='model', palette='Set2', legend=False)\n", + "\n", + "# Adjust the x-axis labels' rotation for each subplot\n", + "for ax in g.axes.flat:\n", + " plt.setp(ax.get_xticklabels(), rotation=45, ha='right')\n", "\n", "# Adjust layout\n", "plt.yscale('log')\n", "plt.subplots_adjust(top=0.9)\n", - "g.fig.suptitle('Violin Plots of Models for Different N and T')\n", + "g.fig.suptitle('Benchmarks of Panel Implementations')\n", "\n", - "plt.show()" + "plt.show()\n" ] }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, diff --git a/utils/benchmark.py b/utils/benchmark.py index 0f9f08b..b35c2d7 100644 --- a/utils/benchmark.py +++ b/utils/benchmark.py @@ -15,15 +15,24 @@ def __init__(self, N, T, T0, iter): self.df = generate_benchmark_data(N = N, T = T, T0 = T0) self.timings = {} - def mark(self, fun): + def mark(self, fun, reps = 0): - fun_name = fun.__name__ # Get the name of the function + if fun in ["duckreg", "feols_compressed"]: + fun_name = f"{fun.__name__} + reps = {reps}" + else: + fun_name = fun.__name__ + self.timings[fun_name] = np.zeros(self.iter) for i in range(self.iter): - start = time.time() - fun(df = self.df, T = self.T, T0 = self.T0) - self.timings[fun_name][i] = time.time() - start + + try: + start = time.time() + fun(df=self.df, T=self.T, T0=self.T0, reps = reps) + self.timings[fun_name][i] = time.time() - start + except MemoryError: + print(f"MemoryError encountered in {fun_name}. Assigning np.nan.") + self.timings[fun_name][i] = np.nan def to_dataframe(self): diff --git a/utils/estimators.py b/utils/estimators.py index 2f014f6..7bbda87 100644 --- a/utils/estimators.py +++ b/utils/estimators.py @@ -1,45 +1,40 @@ import pyfixest as pf import numpy as np -from duckreg.estimators import DuckMundlak +from duckreg.estimators import DuckMundlak, DuckMundlakEventStudy import statsmodels.formula.api as smf -def twfe_fixest(df, T, T0): - try: - print("MemoryError: Not enough memory to run twfe_fixest.") - m = pf.feols("Y~W | unit + time", df).tidy() - except MemoryError: - print("MemoryError: Not enough memory to run.") +def twfe_fixest(df, T, T0, reps = 0): + m = pf.feols("Y~W | unit + time", df, lean = True) return None -def twfe_fixest_compressed(df, T, T0): - try: - m = pf.feols( - fml = "Y~W | unit + time", - data = df, - use_compression = True, - reps = 1 - ).tidy() - except MemoryError: - print("MemoryError: Not enough memory to run.") +def twfe_fixest_compressed(df, T, T0, reps = 0): + m = pf.feols( + fml = "Y~W | unit + time", + data = df, + use_compression = True, + reps = reps + ).tidy() return None -def twfe_statsmodels(df, T, T0): - try: - m = smf.ols(formula="Y ~ W + C(unit) + C(time)", data=df).fit() - except MemoryError: - print("MemoryError: Not enough memory to run.") +def twfe_statsmodels(df, T, T0, reps = 0): + m = smf.ols(formula="Y ~ W + C(unit) + C(time)", data=df).fit() return None -def event_study_fixest(df, T, T0): - try: - df["ever_treated"] = df.groupby("unit")["W"].transform("max") - m = pf.feols(f"Y ~ i(time, ever_treated, ref = {T0-1}) | unit + time", df) - except MemoryError: - print("MemoryError: Not enough memory to run.") +def event_study_statsmodels(df, T, T0, reps = 0): + df['ever_treated'] = df.groupby('unit')['W'].transform('max') + m = smf.ols( + formula="Y ~ C(time):C(ever_treated) + C(unit) + C(time)", + data=df + ).fit() + return m + +def event_study_fixest(df, T, T0, reps = 0): + df["ever_treated"] = df.groupby("unit")["W"].transform("max") + m = pf.feols(f"Y ~ i(time, ever_treated, ref = {T0-1}) | unit + time", df, lean = True) return None -def duck_mundlak(df, T, T0): +def duck_mundlak(df, T, T0, reps = 0): mundlak = DuckMundlak( db_name="benchmarks.db", @@ -49,9 +44,26 @@ def duck_mundlak(df, T, T0): unit_col="unit", time_col="time", cluster_col="unit", - n_bootstraps=1, + n_bootstraps=reps, seed = 929 ) mundlak.fit() + return mundlak + +def duck_mundlak_event(df, T, T0, reps): + + mundlak = DuckMundlakEventStudy( + db_name="benchmarks.db", + table_name="data", + outcome_var="Y", + treatment_col="W", + unit_col="unit", + time_col="time", + cluster_col="unit", + n_bootstraps=0, # set to nonzero to get block-bootstrapped standard errors + seed=42, + pre_treat_interactions=True, + ) + return mundlak \ No newline at end of file From 9a979e5161f68db654f7069c878dad50d448cd60 Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Wed, 9 Oct 2024 23:25:44 +0200 Subject: [PATCH 3/4] update figures for N = 10_000 --- data/benchmark1000_14_7.csv | 4 ++++ data/benchmark1000_28_7.csv | 4 ++++ data/benchmark1000_42_7.csv | 4 ++++ 3 files changed, 12 insertions(+) create mode 100644 data/benchmark1000_14_7.csv create mode 100644 data/benchmark1000_28_7.csv create mode 100644 data/benchmark1000_42_7.csv diff --git a/data/benchmark1000_14_7.csv b/data/benchmark1000_14_7.csv new file mode 100644 index 0000000..5cb0042 --- /dev/null +++ b/data/benchmark1000_14_7.csv @@ -0,0 +1,4 @@ +,twfe_statsmodels,event_study_statsmodels,twfe_fixest_compressed,twfe_fixest,event_study_fixest,duck_mundlak,duck_mundlak_event,N,T,T0 +0,3.524947166442871,3.8372230529785156,1.391993761062622,7.044592618942261,1.0851032733917236,0.025202512741088867,0.014397859573364258,1000,14,7 +1,3.586045503616333,3.8418402671813965,0.1384873390197754,0.1546306610107422,0.16529107093811035,0.025308609008789062,0.016378164291381836,1000,14,7 +2,3.498058557510376,3.7085466384887695,0.13840508460998535,0.15597152709960938,0.16927051544189453,0.02742910385131836,0.01682305335998535,1000,14,7 diff --git a/data/benchmark1000_28_7.csv b/data/benchmark1000_28_7.csv new file mode 100644 index 0000000..86741ef --- /dev/null +++ b/data/benchmark1000_28_7.csv @@ -0,0 +1,4 @@ +,twfe_statsmodels,event_study_statsmodels,twfe_fixest_compressed,twfe_fixest,event_study_fixest,duck_mundlak,duck_mundlak_event,N,T,T0 +0,6.603718280792236,8.796046733856201,0.21630644798278809,0.17549967765808105,0.23299789428710938,0.03426074981689453,0.018976926803588867,1000,28,7 +1,6.700540781021118,9.069744110107422,0.17578649520874023,0.17682957649230957,0.23126792907714844,0.03191041946411133,0.01741170883178711,1000,28,7 +2,7.750951290130615,8.068708181381226,0.1765155792236328,0.17908310890197754,0.22946405410766602,0.03245687484741211,0.016439437866210938,1000,28,7 diff --git a/data/benchmark1000_42_7.csv b/data/benchmark1000_42_7.csv new file mode 100644 index 0000000..2e1a426 --- /dev/null +++ b/data/benchmark1000_42_7.csv @@ -0,0 +1,4 @@ +,twfe_statsmodels,event_study_statsmodels,twfe_fixest_compressed,twfe_fixest,event_study_fixest,duck_mundlak,duck_mundlak_event,N,T,T0 +0,12.831220388412476,12.35423469543457,0.2366042137145996,0.1718442440032959,0.3121190071105957,0.038512468338012695,0.01694774627685547,1000,42,7 +1,14.023149490356445,12.454074621200562,0.19021940231323242,0.17430496215820312,0.3458282947540283,0.03442883491516113,0.016968488693237305,1000,42,7 +2,11.490947008132935,12.42515230178833,0.17162346839904785,0.17591285705566406,0.32230591773986816,0.03468441963195801,0.016361236572265625,1000,42,7 From be4baf55862175af6ff9a021020882e1723c24fb Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Thu, 10 Oct 2024 14:20:51 +0200 Subject: [PATCH 4/4] save individual model output --- data/benchmark100000_14_7.csv | 4 - data/benchmark100000_28_7.csv | 4 - data/benchmark100000_42_7.csv | 4 - data/benchmark10000_14_7.csv | 4 - data/benchmark_twfe_fixest_1000000_14_7.csv | 4 + data/benchmark_twfe_fixest_100000_14_7.csv | 4 + data/benchmark_twfe_fixest_100000_28_7.csv | 4 + data/benchmark_twfe_fixest_100000_42_7.csv | 4 + data/benchmark_twfe_fixest_10000_14_7.csv | 4 + data/benchmark_twfe_fixest_10000_28_7.csv | 4 + data/benchmark_twfe_fixest_10000_42_7.csv | 4 + timining_benchmarks.ipynb | 128 +++++++++++--------- utils/benchmark.py | 29 ++++- 13 files changed, 122 insertions(+), 79 deletions(-) delete mode 100644 data/benchmark100000_14_7.csv delete mode 100644 data/benchmark100000_28_7.csv delete mode 100644 data/benchmark100000_42_7.csv delete mode 100644 data/benchmark10000_14_7.csv create mode 100644 data/benchmark_twfe_fixest_1000000_14_7.csv create mode 100644 data/benchmark_twfe_fixest_100000_14_7.csv create mode 100644 data/benchmark_twfe_fixest_100000_28_7.csv create mode 100644 data/benchmark_twfe_fixest_100000_42_7.csv create mode 100644 data/benchmark_twfe_fixest_10000_14_7.csv create mode 100644 data/benchmark_twfe_fixest_10000_28_7.csv create mode 100644 data/benchmark_twfe_fixest_10000_42_7.csv diff --git a/data/benchmark100000_14_7.csv b/data/benchmark100000_14_7.csv deleted file mode 100644 index 6ec83fc..0000000 --- a/data/benchmark100000_14_7.csv +++ /dev/null @@ -1,4 +0,0 @@ -,twfe_statsmodels,twfe_fixest_compressed,twfe_fixest,event_study_fixest,duck_mundlak,duck_mundlak_event,N,T,T0 -0,,1.5650169849395752,1.025242805480957,2.8195056915283203,0.3231985569000244,0.012965917587280273,100000,14,7 -1,,1.5771527290344238,1.1382153034210205,1.9317655563354492,0.2892742156982422,0.013964414596557617,100000,14,7 -2,,1.5973916053771973,1.1420490741729736,1.9872798919677734,0.3146228790283203,0.013991355895996094,100000,14,7 diff --git a/data/benchmark100000_28_7.csv b/data/benchmark100000_28_7.csv deleted file mode 100644 index f3a994c..0000000 --- a/data/benchmark100000_28_7.csv +++ /dev/null @@ -1,4 +0,0 @@ -,twfe_statsmodels,twfe_fixest_compressed,twfe_fixest,event_study_fixest,duck_mundlak,duck_mundlak_event,N,T,T0 -0,,2.3644139766693115,1.222491979598999,6.415189743041992,0.818631649017334,0.016979694366455078,100000,28,7 -1,,2.3045310974121094,1.1898529529571533,6.398603200912476,0.6646432876586914,0.016531944274902344,100000,28,7 -2,,2.285304546356201,1.252234935760498,9.608892440795898,0.6715579032897949,0.01595783233642578,100000,28,7 diff --git a/data/benchmark100000_42_7.csv b/data/benchmark100000_42_7.csv deleted file mode 100644 index 51539b6..0000000 --- a/data/benchmark100000_42_7.csv +++ /dev/null @@ -1,4 +0,0 @@ -,twfe_statsmodels,twfe_fixest_compressed,twfe_fixest,event_study_fixest,duck_mundlak,duck_mundlak_event,N,T,T0 -0,,3.5332040786743164,1.544895887374878,15.637751817703247,1.35536789894104,0.020453691482543945,100000,42,7 -1,,3.681572437286377,1.5531425476074219,21.96467161178589,0.8629484176635742,0.026926517486572266,100000,42,7 -2,,3.58103609085083,1.4542961120605469,16.58826994895935,0.9000434875488281,0.021899700164794922,100000,42,7 diff --git a/data/benchmark10000_14_7.csv b/data/benchmark10000_14_7.csv deleted file mode 100644 index 4ae2e35..0000000 --- a/data/benchmark10000_14_7.csv +++ /dev/null @@ -1,4 +0,0 @@ -,twfe_statsmodels,twfe_fixest_compressed,twfe_fixest,event_study_fixest,duck_mundlak,duck_mundlak_event,N,T,T0 -0,,2.6141197681427,0.6356804370880127,0.7050578594207764,0.22404909133911133,0.015578031539916992,10000,14,7 -1,,0.7215888500213623,0.6314306259155273,0.6742532253265381,0.0789484977722168,0.014959096908569336,10000,14,7 -2,,0.6667027473449707,0.7373080253601074,0.6585514545440674,0.08377385139465332,0.013962507247924805,10000,14,7 diff --git a/data/benchmark_twfe_fixest_1000000_14_7.csv b/data/benchmark_twfe_fixest_1000000_14_7.csv new file mode 100644 index 0000000..a657183 --- /dev/null +++ b/data/benchmark_twfe_fixest_1000000_14_7.csv @@ -0,0 +1,4 @@ +,twfe_fixest,N,T,T0 +0,3.9811136722564697,1000000,14,7 +1,3.9024667739868164,1000000,14,7 +2,3.94681453704834,1000000,14,7 diff --git a/data/benchmark_twfe_fixest_100000_14_7.csv b/data/benchmark_twfe_fixest_100000_14_7.csv new file mode 100644 index 0000000..447d147 --- /dev/null +++ b/data/benchmark_twfe_fixest_100000_14_7.csv @@ -0,0 +1,4 @@ +,twfe_fixest,N,T,T0 +0,0.6330029964447021,100000,14,7 +1,0.5921123027801514,100000,14,7 +2,0.6203744411468506,100000,14,7 diff --git a/data/benchmark_twfe_fixest_100000_28_7.csv b/data/benchmark_twfe_fixest_100000_28_7.csv new file mode 100644 index 0000000..1bb134b --- /dev/null +++ b/data/benchmark_twfe_fixest_100000_28_7.csv @@ -0,0 +1,4 @@ +,twfe_fixest,N,T,T0 +0,0.9080502986907959,100000,28,7 +1,0.9044373035430908,100000,28,7 +2,0.8909964561462402,100000,28,7 diff --git a/data/benchmark_twfe_fixest_100000_42_7.csv b/data/benchmark_twfe_fixest_100000_42_7.csv new file mode 100644 index 0000000..36037a5 --- /dev/null +++ b/data/benchmark_twfe_fixest_100000_42_7.csv @@ -0,0 +1,4 @@ +,twfe_fixest,N,T,T0 +0,1.3070573806762695,100000,42,7 +1,1.1962721347808838,100000,42,7 +2,1.2006416320800781,100000,42,7 diff --git a/data/benchmark_twfe_fixest_10000_14_7.csv b/data/benchmark_twfe_fixest_10000_14_7.csv new file mode 100644 index 0000000..b9c272b --- /dev/null +++ b/data/benchmark_twfe_fixest_10000_14_7.csv @@ -0,0 +1,4 @@ +,twfe_fixest,N,T,T0 +0,0.24356484413146973,10000,14,7 +1,0.25767970085144043,10000,14,7 +2,0.24818849563598633,10000,14,7 diff --git a/data/benchmark_twfe_fixest_10000_28_7.csv b/data/benchmark_twfe_fixest_10000_28_7.csv new file mode 100644 index 0000000..ac9e8af --- /dev/null +++ b/data/benchmark_twfe_fixest_10000_28_7.csv @@ -0,0 +1,4 @@ +,twfe_fixest,N,T,T0 +0,0.2967844009399414,10000,28,7 +1,0.3072526454925537,10000,28,7 +2,0.30050110816955566,10000,28,7 diff --git a/data/benchmark_twfe_fixest_10000_42_7.csv b/data/benchmark_twfe_fixest_10000_42_7.csv new file mode 100644 index 0000000..0e27c78 --- /dev/null +++ b/data/benchmark_twfe_fixest_10000_42_7.csv @@ -0,0 +1,4 @@ +,twfe_fixest,N,T,T0 +0,0.30553364753723145,10000,42,7 +1,0.32700133323669434,10000,42,7 +2,0.3112492561340332,10000,42,7 diff --git a/timining_benchmarks.ipynb b/timining_benchmarks.ipynb index 2e95dcb..a3979dd 100644 --- a/timining_benchmarks.ipynb +++ b/timining_benchmarks.ipynb @@ -2,32 +2,15 @@ "cells": [ { "cell_type": "code", - "execution_count": 38, + "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n", - "The watermark extension is already loaded. To reload it, use:\n", - " %reload_ext watermark\n", - "sys : 3.12.7 | packaged by conda-forge | (main, Oct 4 2024, 15:47:54) [MSC v.1941 64 bit (AMD64)]\n", - "matplotlib: 3.9.2\n", - "tqdm : 4.66.4\n", - "seaborn : 0.13.2\n", - "pandas : 2.2.3\n", "\n", - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n", - "The watermark extension is already loaded. To reload it, use:\n", - " %reload_ext watermark\n", - "sys : 3.12.7 | packaged by conda-forge | (main, Oct 4 2024, 15:47:54) [MSC v.1941 64 bit (AMD64)]\n", - "matplotlib: 3.9.2\n", - "tqdm : 4.66.4\n", - "seaborn : 0.13.2\n", - "pandas : 2.2.3\n", + "\n", "\n" ] } @@ -63,31 +46,23 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "a59b403f75b1441192ff0d9990e5427e", + "model_id": "a7ad3aceb06946b58820e7245ef9b16c", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Processing benchmarks: 0%| | 0/3 [00:00" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "g = sns.FacetGrid(median_run_pooled, col=\"T\", row=\"N\", margin_titles=True, height=4, aspect=1)\n", "g.map_dataframe(sns.barplot, x='model', y='value', hue='model', palette='Set2', legend=False)\n", @@ -248,9 +230,37 @@ "plt.show()\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualize Event Study" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "g = sns.FacetGrid(median_run_event, col=\"T\", row=\"N\", margin_titles=True, height=4, aspect=1)\n", + "g.map_dataframe(sns.barplot, x='model', y='value', hue='model', palette='Set2', legend=False)\n", + "\n", + "# Adjust the x-axis labels' rotation for each subplot\n", + "for ax in g.axes.flat:\n", + " plt.setp(ax.get_xticklabels(), rotation=45, ha='right')\n", + "\n", + "# Adjust layout\n", + "plt.yscale('log')\n", + "plt.subplots_adjust(top=0.9)\n", + "g.fig.suptitle('Benchmarks of Panel Implementations')\n", + "\n", + "plt.show()" + ] + }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [] diff --git a/utils/benchmark.py b/utils/benchmark.py index b35c2d7..49e73a8 100644 --- a/utils/benchmark.py +++ b/utils/benchmark.py @@ -28,12 +28,33 @@ def mark(self, fun, reps = 0): try: start = time.time() - fun(df=self.df, T=self.T, T0=self.T0, reps = reps) - self.timings[fun_name][i] = time.time() - start - except MemoryError: - print(f"MemoryError encountered in {fun_name}. Assigning np.nan.") + timeout = 600 # 10 minutes in seconds + + # Run the function in a while loop to monitor its execution time + while True: + if time.time() - start > timeout: + print(f"Timeout reached for {fun_name}. Assigning np.nan.") + self.timings[fun_name][i] = np.nan + break + + try: + fun(df=self.df, T=self.T, T0=self.T0, reps=reps) + self.timings[fun_name][i] = time.time() - start + break # Break if the function completes within the time limit + + except MemoryError: + print(f"MemoryError encountered in {fun_name}. Assigning np.nan.") + self.timings[fun_name][i] = np.nan + break + + except Exception as e: + print(f"An unexpected error occurred: {e}") self.timings[fun_name][i] = np.nan + self.timings_df = pd.DataFrame(self.timings) + + return self.timings_df + def to_dataframe(self): self.timings_df = pd.DataFrame(self.timings)