[Feature] Pandas 3.0 - Update Library For Syntax (#7336)

* fix everything for pandas 3.0

* bump yfinance version

* update core dependency python-multi-part

* lint
This commit is contained in:
Danglewood
2026-01-28 16:41:55 -08:00
committed by GitHub
parent fd236f806a
commit 2cebe5a88e
56 changed files with 12064 additions and 11073 deletions

View File

@@ -379,7 +379,7 @@ def print_rich_table( # noqa: PLR0912
)
if columns_to_auto_color is None and rows_to_auto_color is None:
df = df.applymap(lambda x: return_colored_value(str(x))) # type: ignore
df = df.map(lambda x: return_colored_value(str(x))) # type: ignore
exceeds_allowed_columns = len(df.columns) > MAX_COLS
exceeds_allowed_rows = len(df) > MAX_ROWS

View File

@@ -67,7 +67,7 @@ class OptionsChainsProperties(Data):
# Add the underlying price to the DataFrame, or override the existing price.
if self.last_price:
chains_data.loc[:, "underlying_price"] = self.last_price
chains_data["underlying_price"] = self.last_price
if chains_data.empty:
raise OpenBBError("Error: No validated data was found.")
@@ -76,14 +76,14 @@ class OptionsChainsProperties(Data):
_date = to_datetime(chains_data.eod_date)
temp = DatetimeIndex(chains_data.expiration)
temp_ = temp - _date # type: ignore
chains_data.loc[:, "dte"] = [Timedelta(_temp_).days for _temp_ in temp_]
chains_data["dte"] = [Timedelta(_temp_).days for _temp_ in temp_]
if "dte" in chains_data.columns:
chains_data = DataFrame(chains_data[chains_data.dte >= 0])
if "dte" not in chains_data.columns and "eod_date" not in chains_data.columns:
today = datetime.today().date()
chains_data.loc[:, "dte"] = chains_data.expiration - today
chains_data["dte"] = chains_data.expiration - today
# Add the breakeven price for each option, and the DEX and GEX for each option, if available.
try:

405
openbb_platform/core/poetry.lock generated vendored
View File

@@ -1,4 +1,4 @@
# This file is automatically @generated by Poetry 2.3.0 and should not be changed by hand.
# This file is automatically @generated by Poetry 2.3.1 and should not be changed by hand.
[[package]]
name = "aiohappyeyeballs"
@@ -660,158 +660,158 @@ type = ["mypy (<1.19) ; platform_python_implementation == \"PyPy\"", "pytest-myp
[[package]]
name = "multidict"
version = "6.7.0"
version = "6.7.1"
description = "multidict implementation"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
{file = "multidict-6.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9f474ad5acda359c8758c8accc22032c6abe6dc87a8be2440d097785e27a9349"},
{file = "multidict-6.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a9db5a870f780220e931d0002bbfd88fb53aceb6293251e2c839415c1b20e"},
{file = "multidict-6.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03ca744319864e92721195fa28c7a3b2bc7b686246b35e4078c1e4d0eb5466d3"},
{file = "multidict-6.7.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f0e77e3c0008bc9316e662624535b88d360c3a5d3f81e15cf12c139a75250046"},
{file = "multidict-6.7.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08325c9e5367aa379a3496aa9a022fe8837ff22e00b94db256d3a1378c76ab32"},
{file = "multidict-6.7.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e2862408c99f84aa571ab462d25236ef9cb12a602ea959ba9c9009a54902fc73"},
{file = "multidict-6.7.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d72a9a2d885f5c208b0cb91ff2ed43636bb7e345ec839ff64708e04f69a13cc"},
{file = "multidict-6.7.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:478cc36476687bac1514d651cbbaa94b86b0732fb6855c60c673794c7dd2da62"},
{file = "multidict-6.7.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6843b28b0364dc605f21481c90fadb5f60d9123b442eb8a726bb74feef588a84"},
{file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23bfeee5316266e5ee2d625df2d2c602b829435fc3a235c2ba2131495706e4a0"},
{file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:680878b9f3d45c31e1f730eef731f9b0bc1da456155688c6745ee84eb818e90e"},
{file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eb866162ef2f45063acc7a53a88ef6fe8bf121d45c30ea3c9cd87ce7e191a8d4"},
{file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:df0e3bf7993bdbeca5ac25aa859cf40d39019e015c9c91809ba7093967f7a648"},
{file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:661709cdcd919a2ece2234f9bae7174e5220c80b034585d7d8a755632d3e2111"},
{file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:096f52730c3fb8ed419db2d44391932b63891b2c5ed14850a7e215c0ba9ade36"},
{file = "multidict-6.7.0-cp310-cp310-win32.whl", hash = "sha256:afa8a2978ec65d2336305550535c9c4ff50ee527914328c8677b3973ade52b85"},
{file = "multidict-6.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:b15b3afff74f707b9275d5ba6a91ae8f6429c3ffb29bbfd216b0b375a56f13d7"},
{file = "multidict-6.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:4b73189894398d59131a66ff157837b1fafea9974be486d036bb3d32331fdbf0"},
{file = "multidict-6.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4d409aa42a94c0b3fa617708ef5276dfe81012ba6753a0370fcc9d0195d0a1fc"},
{file = "multidict-6.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14c9e076eede3b54c636f8ce1c9c252b5f057c62131211f0ceeec273810c9721"},
{file = "multidict-6.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c09703000a9d0fa3c3404b27041e574cc7f4df4c6563873246d0e11812a94b6"},
{file = "multidict-6.7.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a265acbb7bb33a3a2d626afbe756371dce0279e7b17f4f4eda406459c2b5ff1c"},
{file = "multidict-6.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51cb455de290ae462593e5b1cb1118c5c22ea7f0d3620d9940bf695cea5a4bd7"},
{file = "multidict-6.7.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:db99677b4457c7a5c5a949353e125ba72d62b35f74e26da141530fbb012218a7"},
{file = "multidict-6.7.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f470f68adc395e0183b92a2f4689264d1ea4b40504a24d9882c27375e6662bb9"},
{file = "multidict-6.7.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0db4956f82723cc1c270de9c6e799b4c341d327762ec78ef82bb962f79cc07d8"},
{file = "multidict-6.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e56d780c238f9e1ae66a22d2adf8d16f485381878250db8d496623cd38b22bd"},
{file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d14baca2ee12c1a64740d4531356ba50b82543017f3ad6de0deb943c5979abb"},
{file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:295a92a76188917c7f99cda95858c822f9e4aae5824246bba9b6b44004ddd0a6"},
{file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39f1719f57adbb767ef592a50ae5ebb794220d1188f9ca93de471336401c34d2"},
{file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0a13fb8e748dfc94749f622de065dd5c1def7e0d2216dba72b1d8069a389c6ff"},
{file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e3aa16de190d29a0ea1b48253c57d99a68492c8dd8948638073ab9e74dc9410b"},
{file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a048ce45dcdaaf1defb76b2e684f997fb5abf74437b6cb7b22ddad934a964e34"},
{file = "multidict-6.7.0-cp311-cp311-win32.whl", hash = "sha256:a90af66facec4cebe4181b9e62a68be65e45ac9b52b67de9eec118701856e7ff"},
{file = "multidict-6.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:95b5ffa4349df2887518bb839409bcf22caa72d82beec453216802f475b23c81"},
{file = "multidict-6.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:329aa225b085b6f004a4955271a7ba9f1087e39dcb7e65f6284a988264a63912"},
{file = "multidict-6.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8a3862568a36d26e650a19bb5cbbba14b71789032aebc0423f8cc5f150730184"},
{file = "multidict-6.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:960c60b5849b9b4f9dcc9bea6e3626143c252c74113df2c1540aebce70209b45"},
{file = "multidict-6.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2049be98fb57a31b4ccf870bf377af2504d4ae35646a19037ec271e4c07998aa"},
{file = "multidict-6.7.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0934f3843a1860dd465d38895c17fce1f1cb37295149ab05cd1b9a03afacb2a7"},
{file = "multidict-6.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e34f3a1b8131ba06f1a73adab24f30934d148afcd5f5de9a73565a4404384e"},
{file = "multidict-6.7.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:efbb54e98446892590dc2458c19c10344ee9a883a79b5cec4bc34d6656e8d546"},
{file = "multidict-6.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a35c5fc61d4f51eb045061e7967cfe3123d622cd500e8868e7c0c592a09fedc4"},
{file = "multidict-6.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29fe6740ebccba4175af1b9b87bf553e9c15cd5868ee967e010efcf94e4fd0f1"},
{file = "multidict-6.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:123e2a72e20537add2f33a79e605f6191fba2afda4cbb876e35c1a7074298a7d"},
{file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b284e319754366c1aee2267a2036248b24eeb17ecd5dc16022095e747f2f4304"},
{file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:803d685de7be4303b5a657b76e2f6d1240e7e0a8aa2968ad5811fa2285553a12"},
{file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c04a328260dfd5db8c39538f999f02779012268f54614902d0afc775d44e0a62"},
{file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8a19cdb57cd3df4cd865849d93ee14920fb97224300c88501f16ecfa2604b4e0"},
{file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b2fd74c52accced7e75de26023b7dccee62511a600e62311b918ec5c168fc2a"},
{file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e8bfdd0e487acf992407a140d2589fe598238eaeffa3da8448d63a63cd363f8"},
{file = "multidict-6.7.0-cp312-cp312-win32.whl", hash = "sha256:dd32a49400a2c3d52088e120ee00c1e3576cbff7e10b98467962c74fdb762ed4"},
{file = "multidict-6.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:92abb658ef2d7ef22ac9f8bb88e8b6c3e571671534e029359b6d9e845923eb1b"},
{file = "multidict-6.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:490dab541a6a642ce1a9d61a4781656b346a55c13038f0b1244653828e3a83ec"},
{file = "multidict-6.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6"},
{file = "multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159"},
{file = "multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca"},
{file = "multidict-6.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cd240939f71c64bd658f186330603aac1a9a81bf6273f523fca63673cb7378a8"},
{file = "multidict-6.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60a4d75718a5efa473ebd5ab685786ba0c67b8381f781d1be14da49f1a2dc60"},
{file = "multidict-6.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53a42d364f323275126aff81fb67c5ca1b7a04fda0546245730a55c8c5f24bc4"},
{file = "multidict-6.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3b29b980d0ddbecb736735ee5bef69bb2ddca56eff603c86f3f29a1128299b4f"},
{file = "multidict-6.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8a93b1c0ed2d04b97a5e9336fd2d33371b9a6e29ab7dd6503d63407c20ffbaf"},
{file = "multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32"},
{file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7516c579652f6a6be0e266aec0acd0db80829ca305c3d771ed898538804c2036"},
{file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:040f393368e63fb0f3330e70c26bfd336656bed925e5cbe17c9da839a6ab13ec"},
{file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b3bc26a951007b1057a1c543af845f1c7e3e71cc240ed1ace7bf4484aa99196e"},
{file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7b022717c748dd1992a83e219587aabe45980d88969f01b316e78683e6285f64"},
{file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9600082733859f00d79dee64effc7aef1beb26adb297416a4ad2116fd61374bd"},
{file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94218fcec4d72bc61df51c198d098ce2b378e0ccbac41ddbed5ef44092913288"},
{file = "multidict-6.7.0-cp313-cp313-win32.whl", hash = "sha256:a37bd74c3fa9d00be2d7b8eca074dc56bd8077ddd2917a839bd989612671ed17"},
{file = "multidict-6.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390"},
{file = "multidict-6.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:ea3334cabe4d41b7ccd01e4d349828678794edbc2d3ae97fc162a3312095092e"},
{file = "multidict-6.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ad9ce259f50abd98a1ca0aa6e490b58c316a0fce0617f609723e40804add2c00"},
{file = "multidict-6.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07f5594ac6d084cbb5de2df218d78baf55ef150b91f0ff8a21cc7a2e3a5a58eb"},
{file = "multidict-6.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0591b48acf279821a579282444814a2d8d0af624ae0bc600aa4d1b920b6e924b"},
{file = "multidict-6.7.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:749a72584761531d2b9467cfbdfd29487ee21124c304c4b6cb760d8777b27f9c"},
{file = "multidict-6.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b4c3d199f953acd5b446bf7c0de1fe25d94e09e79086f8dc2f48a11a129cdf1"},
{file = "multidict-6.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9fb0211dfc3b51efea2f349ec92c114d7754dd62c01f81c3e32b765b70c45c9b"},
{file = "multidict-6.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a027ec240fe73a8d6281872690b988eed307cd7d91b23998ff35ff577ca688b5"},
{file = "multidict-6.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1d964afecdf3a8288789df2f5751dc0a8261138c3768d9af117ed384e538fad"},
{file = "multidict-6.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:caf53b15b1b7df9fbd0709aa01409000a2b4dd03a5f6f5cc548183c7c8f8b63c"},
{file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:654030da3197d927f05a536a66186070e98765aa5142794c9904555d3a9d8fb5"},
{file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2090d3718829d1e484706a2f525e50c892237b2bf9b17a79b059cb98cddc2f10"},
{file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d2cfeec3f6f45651b3d408c4acec0ebf3daa9bc8a112a084206f5db5d05b754"},
{file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef089f985b8c194d341eb2c24ae6e7408c9a0e2e5658699c92f497437d88c3c"},
{file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e93a0617cd16998784bf4414c7e40f17a35d2350e5c6f0bd900d3a8e02bd3762"},
{file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0feece2ef8ebc42ed9e2e8c78fc4aa3cf455733b507c09ef7406364c94376c6"},
{file = "multidict-6.7.0-cp313-cp313t-win32.whl", hash = "sha256:19a1d55338ec1be74ef62440ca9e04a2f001a04d0cc49a4983dc320ff0f3212d"},
{file = "multidict-6.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3da4fb467498df97e986af166b12d01f05d2e04f978a9c1c680ea1988e0bc4b6"},
{file = "multidict-6.7.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b4121773c49a0776461f4a904cdf6264c88e42218aaa8407e803ca8025872792"},
{file = "multidict-6.7.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bab1e4aff7adaa34410f93b1f8e57c4b36b9af0426a76003f441ee1d3c7e842"},
{file = "multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b8512bac933afc3e45fb2b18da8e59b78d4f408399a960339598374d4ae3b56b"},
{file = "multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:79dcf9e477bc65414ebfea98ffd013cb39552b5ecd62908752e0e413d6d06e38"},
{file = "multidict-6.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:31bae522710064b5cbeddaf2e9f32b1abab70ac6ac91d42572502299e9953128"},
{file = "multidict-6.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a0df7ff02397bb63e2fd22af2c87dfa39e8c7f12947bc524dbdc528282c7e34"},
{file = "multidict-6.7.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a0222514e8e4c514660e182d5156a415c13ef0aabbd71682fc714e327b95e99"},
{file = "multidict-6.7.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2397ab4daaf2698eb51a76721e98db21ce4f52339e535725de03ea962b5a3202"},
{file = "multidict-6.7.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8891681594162635948a636c9fe0ff21746aeb3dd5463f6e25d9bea3a8a39ca1"},
{file = "multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18706cc31dbf402a7945916dd5cddf160251b6dab8a2c5f3d6d5a55949f676b3"},
{file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f844a1bbf1d207dd311a56f383f7eda2d0e134921d45751842d8235e7778965d"},
{file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4393e3581e84e5645506923816b9cc81f5609a778c7e7534054091acc64d1c6"},
{file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fbd18dc82d7bf274b37aa48d664534330af744e03bccf696d6f4c6042e7d19e7"},
{file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b6234e14f9314731ec45c42fc4554b88133ad53a09092cc48a88e771c125dadb"},
{file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:08d4379f9744d8f78d98c8673c06e202ffa88296f009c71bbafe8a6bf847d01f"},
{file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fe04da3f79387f450fd0061d4dd2e45a72749d31bf634aecc9e27f24fdc4b3f"},
{file = "multidict-6.7.0-cp314-cp314-win32.whl", hash = "sha256:fbafe31d191dfa7c4c51f7a6149c9fb7e914dcf9ffead27dcfd9f1ae382b3885"},
{file = "multidict-6.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:2f67396ec0310764b9222a1728ced1ab638f61aadc6226f17a71dd9324f9a99c"},
{file = "multidict-6.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:ba672b26069957ee369cfa7fc180dde1fc6f176eaf1e6beaf61fbebbd3d9c000"},
{file = "multidict-6.7.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:c1dcc7524066fa918c6a27d61444d4ee7900ec635779058571f70d042d86ed63"},
{file = "multidict-6.7.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:27e0b36c2d388dc7b6ced3406671b401e84ad7eb0656b8f3a2f46ed0ce483718"},
{file = "multidict-6.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a7baa46a22e77f0988e3b23d4ede5513ebec1929e34ee9495be535662c0dfe2"},
{file = "multidict-6.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bf77f54997a9166a2f5675d1201520586439424c2511723a7312bdb4bcc034e"},
{file = "multidict-6.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e011555abada53f1578d63389610ac8a5400fc70ce71156b0aa30d326f1a5064"},
{file = "multidict-6.7.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:28b37063541b897fd6a318007373930a75ca6d6ac7c940dbe14731ffdd8d498e"},
{file = "multidict-6.7.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05047ada7a2fde2631a0ed706f1fd68b169a681dfe5e4cf0f8e4cb6618bbc2cd"},
{file = "multidict-6.7.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:716133f7d1d946a4e1b91b1756b23c088881e70ff180c24e864c26192ad7534a"},
{file = "multidict-6.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1bed1b467ef657f2a0ae62844a607909ef1c6889562de5e1d505f74457d0b96"},
{file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ca43bdfa5d37bd6aee89d85e1d0831fb86e25541be7e9d376ead1b28974f8e5e"},
{file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:44b546bd3eb645fd26fb949e43c02a25a2e632e2ca21a35e2e132c8105dc8599"},
{file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a6ef16328011d3f468e7ebc326f24c1445f001ca1dec335b2f8e66bed3006394"},
{file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5aa873cbc8e593d361ae65c68f85faadd755c3295ea2c12040ee146802f23b38"},
{file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3d7b6ccce016e29df4b7ca819659f516f0bc7a4b3efa3bb2012ba06431b044f9"},
{file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:171b73bd4ee683d307599b66793ac80981b06f069b62eea1c9e29c9241aa66b0"},
{file = "multidict-6.7.0-cp314-cp314t-win32.whl", hash = "sha256:b2d7f80c4e1fd010b07cb26820aae86b7e73b681ee4889684fb8d2d4537aab13"},
{file = "multidict-6.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:09929cab6fcb68122776d575e03c6cc64ee0b8fca48d17e135474b042ce515cd"},
{file = "multidict-6.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:cc41db090ed742f32bd2d2c721861725e6109681eddf835d0a82bd3a5c382827"},
{file = "multidict-6.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:363eb68a0a59bd2303216d2346e6c441ba10d36d1f9969fcb6f1ba700de7bb5c"},
{file = "multidict-6.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d874eb056410ca05fed180b6642e680373688efafc7f077b2a2f61811e873a40"},
{file = "multidict-6.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b55d5497b51afdfde55925e04a022f1de14d4f4f25cdfd4f5d9b0aa96166851"},
{file = "multidict-6.7.0-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f8e5c0031b90ca9ce555e2e8fd5c3b02a25f14989cbc310701823832c99eb687"},
{file = "multidict-6.7.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cf41880c991716f3c7cec48e2f19ae4045fc9db5fc9cff27347ada24d710bb5"},
{file = "multidict-6.7.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8cfc12a8630a29d601f48d47787bd7eb730e475e83edb5d6c5084317463373eb"},
{file = "multidict-6.7.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3996b50c3237c4aec17459217c1e7bbdead9a22a0fcd3c365564fbd16439dde6"},
{file = "multidict-6.7.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7f5170993a0dd3ab871c74f45c0a21a4e2c37a2f2b01b5f722a2ad9c6650469e"},
{file = "multidict-6.7.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ec81878ddf0e98817def1e77d4f50dae5ef5b0e4fe796fae3bd674304172416e"},
{file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9281bf5b34f59afbc6b1e477a372e9526b66ca446f4bf62592839c195a718b32"},
{file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:68af405971779d8b37198726f2b6fe3955db846fee42db7a4286fc542203934c"},
{file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3ba3ef510467abb0667421a286dc906e30eb08569365f5cdb131d7aff7c2dd84"},
{file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b61189b29081a20c7e4e0b49b44d5d44bb0dc92be3c6d06a11cc043f81bf9329"},
{file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fb287618b9c7aa3bf8d825f02d9201b2f13078a5ed3b293c8f4d953917d84d5e"},
{file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:521f33e377ff64b96c4c556b81c55d0cfffb96a11c194fd0c3f1e56f3d8dd5a4"},
{file = "multidict-6.7.0-cp39-cp39-win32.whl", hash = "sha256:ce8fdc2dca699f8dbf055a61d73eaa10482569ad20ee3c36ef9641f69afa8c91"},
{file = "multidict-6.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:7e73299c99939f089dd9b2120a04a516b95cdf8c1cd2b18c53ebf0de80b1f18f"},
{file = "multidict-6.7.0-cp39-cp39-win_arm64.whl", hash = "sha256:6bdce131e14b04fd34a809b6380dbfd826065c3e2fe8a50dbae659fa0c390546"},
{file = "multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3"},
{file = "multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5"},
{file = "multidict-6.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c93c3db7ea657dd4637d57e74ab73de31bccefe144d3d4ce370052035bc85fb5"},
{file = "multidict-6.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:974e72a2474600827abaeda71af0c53d9ebbc3c2eb7da37b37d7829ae31232d8"},
{file = "multidict-6.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdea2e7b2456cfb6694fb113066fd0ec7ea4d67e3a35e1f4cbeea0b448bf5872"},
{file = "multidict-6.7.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17207077e29342fdc2c9a82e4b306f1127bf1ea91f8b71e02d4798a70bb99991"},
{file = "multidict-6.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4f49cb5661344764e4c7c7973e92a47a59b8fc19b6523649ec9dc4960e58a03"},
{file = "multidict-6.7.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a9fc4caa29e2e6ae408d1c450ac8bf19892c5fca83ee634ecd88a53332c59981"},
{file = "multidict-6.7.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c5f0c21549ab432b57dcc82130f388d84ad8179824cc3f223d5e7cfbfd4143f6"},
{file = "multidict-6.7.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7dfb78d966b2c906ae1d28ccf6e6712a3cd04407ee5088cd276fe8cb42186190"},
{file = "multidict-6.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b0d9b91d1aa44db9c1f1ecd0d9d2ae610b2f4f856448664e01a3b35899f3f92"},
{file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dd96c01a9dcd4889dcfcf9eb5544ca0c77603f239e3ffab0524ec17aea9a93ee"},
{file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:067343c68cd6612d375710f895337b3a98a033c94f14b9a99eff902f205424e2"},
{file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5884a04f4ff56c6120f6ccf703bdeb8b5079d808ba604d4d53aec0d55dc33568"},
{file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8affcf1c98b82bc901702eb73b6947a1bfa170823c153fe8a47b5f5f02e48e40"},
{file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d17522c37d03e85c8098ec8431636309b2682cf12e58f4dbc76121fb50e4962"},
{file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24c0cf81544ca5e17cfcb6e482e7a82cd475925242b308b890c9452a074d4505"},
{file = "multidict-6.7.1-cp310-cp310-win32.whl", hash = "sha256:d82dd730a95e6643802f4454b8fdecdf08667881a9c5670db85bc5a56693f122"},
{file = "multidict-6.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cf37cbe5ced48d417ba045aca1b21bafca67489452debcde94778a576666a1df"},
{file = "multidict-6.7.1-cp310-cp310-win_arm64.whl", hash = "sha256:59bc83d3f66b41dac1e7460aac1d196edc70c9ba3094965c467715a70ecb46db"},
{file = "multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d"},
{file = "multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e"},
{file = "multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855"},
{file = "multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3"},
{file = "multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e"},
{file = "multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a"},
{file = "multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8"},
{file = "multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0"},
{file = "multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144"},
{file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49"},
{file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71"},
{file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3"},
{file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c"},
{file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0"},
{file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa"},
{file = "multidict-6.7.1-cp311-cp311-win32.whl", hash = "sha256:d62b7f64ffde3b99d06b707a280db04fb3855b55f5a06df387236051d0668f4a"},
{file = "multidict-6.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b"},
{file = "multidict-6.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:b8c990b037d2fff2f4e33d3f21b9b531c5745b33a49a7d6dbe7a177266af44f6"},
{file = "multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172"},
{file = "multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd"},
{file = "multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7"},
{file = "multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53"},
{file = "multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75"},
{file = "multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b"},
{file = "multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733"},
{file = "multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a"},
{file = "multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961"},
{file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582"},
{file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e"},
{file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3"},
{file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6"},
{file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a"},
{file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba"},
{file = "multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511"},
{file = "multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19"},
{file = "multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf"},
{file = "multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23"},
{file = "multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2"},
{file = "multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445"},
{file = "multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177"},
{file = "multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23"},
{file = "multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060"},
{file = "multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d"},
{file = "multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed"},
{file = "multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429"},
{file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6"},
{file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9"},
{file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c"},
{file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84"},
{file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d"},
{file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33"},
{file = "multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3"},
{file = "multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5"},
{file = "multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df"},
{file = "multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1"},
{file = "multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963"},
{file = "multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34"},
{file = "multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65"},
{file = "multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292"},
{file = "multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43"},
{file = "multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca"},
{file = "multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd"},
{file = "multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7"},
{file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3"},
{file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4"},
{file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8"},
{file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c"},
{file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52"},
{file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108"},
{file = "multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32"},
{file = "multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8"},
{file = "multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118"},
{file = "multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee"},
{file = "multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2"},
{file = "multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1"},
{file = "multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d"},
{file = "multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31"},
{file = "multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048"},
{file = "multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362"},
{file = "multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37"},
{file = "multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709"},
{file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0"},
{file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb"},
{file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd"},
{file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601"},
{file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1"},
{file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b"},
{file = "multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d"},
{file = "multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f"},
{file = "multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5"},
{file = "multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581"},
{file = "multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a"},
{file = "multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c"},
{file = "multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262"},
{file = "multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59"},
{file = "multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889"},
{file = "multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4"},
{file = "multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d"},
{file = "multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609"},
{file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489"},
{file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c"},
{file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e"},
{file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c"},
{file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9"},
{file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2"},
{file = "multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7"},
{file = "multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5"},
{file = "multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2"},
{file = "multidict-6.7.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:65573858d27cdeaca41893185677dc82395159aa28875a8867af66532d413a8f"},
{file = "multidict-6.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c524c6fb8fc342793708ab111c4dbc90ff9abd568de220432500e47e990c0358"},
{file = "multidict-6.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:aa23b001d968faef416ff70dc0f1ab045517b9b42a90edd3e9bcdb06479e31d5"},
{file = "multidict-6.7.1-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6704fa2b7453b2fb121740555fa1ee20cd98c4d011120caf4d2b8d4e7c76eec0"},
{file = "multidict-6.7.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:121a34e5bfa410cdf2c8c49716de160de3b1dbcd86b49656f5681e4543bcd1a8"},
{file = "multidict-6.7.1-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:026d264228bcd637d4e060844e39cdc60f86c479e463d49075dedc21b18fbbe0"},
{file = "multidict-6.7.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0e697826df7eb63418ee190fd06ce9f1803593bb4b9517d08c60d9b9a7f69d8f"},
{file = "multidict-6.7.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bb08271280173720e9fea9ede98e5231defcbad90f1624bea26f32ec8a956e2f"},
{file = "multidict-6.7.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c6b3228e1d80af737b72925ce5fb4daf5a335e49cd7ab77ed7b9fdfbf58c526e"},
{file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3943debf0fbb57bdde5901695c11094a9a36723e5c03875f87718ee15ca2f4d2"},
{file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:98c5787b0a0d9a41d9311eae44c3b76e6753def8d8870ab501320efe75a6a5f8"},
{file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:08ccb2a6dc72009093ebe7f3f073e5ec5964cba9a706fa94b1a1484039b87941"},
{file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb351f72c26dc9abe338ca7294661aa22969ad8ffe7ef7d5541d19f368dc854a"},
{file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ac1c665bad8b5d762f5f85ebe4d94130c26965f11de70c708c75671297c776de"},
{file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fa6609d0364f4f6f58351b4659a1f3e0e898ba2a8c5cac04cb2c7bc556b0bc5"},
{file = "multidict-6.7.1-cp39-cp39-win32.whl", hash = "sha256:6f77ce314a29263e67adadc7e7c1bc699fcb3a305059ab973d038f87caa42ed0"},
{file = "multidict-6.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:f537b55778cd3cbee430abe3131255d3a78202e0f9ea7ffc6ada893a4bcaeea4"},
{file = "multidict-6.7.1-cp39-cp39-win_arm64.whl", hash = "sha256:749aa54f578f2e5f439538706a475aa844bfa8ef75854b1401e6e528e4937cf9"},
{file = "multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56"},
{file = "multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d"},
]
[package.dependencies]
@@ -973,6 +973,7 @@ description = "Powerful data structures for data analysis, time series, and stat
optional = false
python-versions = ">=3.9"
groups = ["main"]
markers = "python_version == \"3.10\""
files = [
{file = "pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c"},
{file = "pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a"},
@@ -1032,11 +1033,7 @@ files = [
]
[package.dependencies]
numpy = [
{version = ">=1.22.4", markers = "python_version < \"3.11\""},
{version = ">=1.23.2", markers = "python_version == \"3.11\""},
{version = ">=1.26.0", markers = "python_version >= \"3.12\""},
]
numpy = {version = ">=1.22.4", markers = "python_version < \"3.11\""}
python-dateutil = ">=2.8.2"
pytz = ">=2020.1"
tzdata = ">=2022.7"
@@ -1066,6 +1063,96 @@ sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-d
test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"]
xml = ["lxml (>=4.9.2)"]
[[package]]
name = "pandas"
version = "3.0.0"
description = "Powerful data structures for data analysis, time series, and statistics"
optional = false
python-versions = ">=3.11"
groups = ["main"]
markers = "python_version >= \"3.11\""
files = [
{file = "pandas-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d64ce01eb9cdca96a15266aa679ae50212ec52757c79204dbc7701a222401850"},
{file = "pandas-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:613e13426069793aa1ec53bdcc3b86e8d32071daea138bbcf4fa959c9cdaa2e2"},
{file = "pandas-3.0.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0192fee1f1a8e743b464a6607858ee4b071deb0b118eb143d71c2a1d170996d5"},
{file = "pandas-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0b853319dec8d5e0c8b875374c078ef17f2269986a78168d9bd57e49bf650ae"},
{file = "pandas-3.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:707a9a877a876c326ae2cb640fbdc4ef63b0a7b9e2ef55c6df9942dcee8e2af9"},
{file = "pandas-3.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:afd0aa3d0b5cda6e0b8ffc10dbcca3b09ef3cbcd3fe2b27364f85fdc04e1989d"},
{file = "pandas-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:113b4cca2614ff7e5b9fee9b6f066618fe73c5a83e99d721ffc41217b2bf57dd"},
{file = "pandas-3.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c14837eba8e99a8da1527c0280bba29b0eb842f64aa94982c5e21227966e164b"},
{file = "pandas-3.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9803b31f5039b3c3b10cc858c5e40054adb4b29b4d81cb2fd789f4121c8efbcd"},
{file = "pandas-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14c2a4099cd38a1d18ff108168ea417909b2dea3bd1ebff2ccf28ddb6a74d740"},
{file = "pandas-3.0.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d257699b9a9960e6125686098d5714ac59d05222bef7a5e6af7a7fd87c650801"},
{file = "pandas-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:69780c98f286076dcafca38d8b8eee1676adf220199c0a39f0ecbf976b68151a"},
{file = "pandas-3.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4a66384f017240f3858a4c8a7cf21b0591c3ac885cddb7758a589f0f71e87ebb"},
{file = "pandas-3.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be8c515c9bc33989d97b89db66ea0cececb0f6e3c2a87fcc8b69443a6923e95f"},
{file = "pandas-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:a453aad8c4f4e9f166436994a33884442ea62aa8b27d007311e87521b97246e1"},
{file = "pandas-3.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:da768007b5a33057f6d9053563d6b74dd6d029c337d93c6d0d22a763a5c2ecc0"},
{file = "pandas-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b78d646249b9a2bc191040988c7bb524c92fa8534fb0898a0741d7e6f2ffafa6"},
{file = "pandas-3.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bc9cba7b355cb4162442a88ce495e01cb605f17ac1e27d6596ac963504e0305f"},
{file = "pandas-3.0.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c9a1a149aed3b6c9bf246033ff91e1b02d529546c5d6fb6b74a28fea0cf4c70"},
{file = "pandas-3.0.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95683af6175d884ee89471842acfca29172a85031fccdabc35e50c0984470a0e"},
{file = "pandas-3.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1fbbb5a7288719e36b76b4f18d46ede46e7f916b6c8d9915b756b0a6c3f792b3"},
{file = "pandas-3.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e8b9808590fa364416b49b2a35c1f4cf2785a6c156935879e57f826df22038e"},
{file = "pandas-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:98212a38a709feb90ae658cb6227ea3657c22ba8157d4b8f913cd4c950de5e7e"},
{file = "pandas-3.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:177d9df10b3f43b70307a149d7ec49a1229a653f907aa60a48f1877d0e6be3be"},
{file = "pandas-3.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2713810ad3806767b89ad3b7b69ba153e1c6ff6d9c20f9c2140379b2a98b6c98"},
{file = "pandas-3.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:15d59f885ee5011daf8335dff47dcb8a912a27b4ad7826dc6cbe809fd145d327"},
{file = "pandas-3.0.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24e6547fb64d2c92665dd2adbfa4e85fa4fd70a9c070e7cfb03b629a0bbab5eb"},
{file = "pandas-3.0.0-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48ee04b90e2505c693d3f8e8f524dab8cb8aaf7ddcab52c92afa535e717c4812"},
{file = "pandas-3.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66f72fb172959af42a459e27a8d8d2c7e311ff4c1f7db6deb3b643dbc382ae08"},
{file = "pandas-3.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4a4a400ca18230976724a5066f20878af785f36c6756e498e94c2a5e5d57779c"},
{file = "pandas-3.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:940eebffe55528074341a5a36515f3e4c5e25e958ebbc764c9502cfc35ba3faa"},
{file = "pandas-3.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:597c08fb9fef0edf1e4fa2f9828dd27f3d78f9b8c9b4a748d435ffc55732310b"},
{file = "pandas-3.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:447b2d68ac5edcbf94655fe909113a6dba6ef09ad7f9f60c80477825b6c489fe"},
{file = "pandas-3.0.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:debb95c77ff3ed3ba0d9aa20c3a2f19165cc7956362f9873fce1ba0a53819d70"},
{file = "pandas-3.0.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fedabf175e7cd82b69b74c30adbaa616de301291a5231138d7242596fc296a8d"},
{file = "pandas-3.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:412d1a89aab46889f3033a386912efcdfa0f1131c5705ff5b668dda88305e986"},
{file = "pandas-3.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e979d22316f9350c516479dd3a92252be2937a9531ed3a26ec324198a99cdd49"},
{file = "pandas-3.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:083b11415b9970b6e7888800c43c82e81a06cd6b06755d84804444f0007d6bb7"},
{file = "pandas-3.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:5db1e62cb99e739fa78a28047e861b256d17f88463c76b8dafc7c1338086dca8"},
{file = "pandas-3.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:697b8f7d346c68274b1b93a170a70974cdc7d7354429894d5927c1effdcccd73"},
{file = "pandas-3.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8cb3120f0d9467ed95e77f67a75e030b67545bcfa08964e349252d674171def2"},
{file = "pandas-3.0.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33fd3e6baa72899746b820c31e4b9688c8e1b7864d7aec2de7ab5035c285277a"},
{file = "pandas-3.0.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8942e333dc67ceda1095227ad0febb05a3b36535e520154085db632c40ad084"},
{file = "pandas-3.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:783ac35c4d0fe0effdb0d67161859078618b1b6587a1af15928137525217a721"},
{file = "pandas-3.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:125eb901e233f155b268bbef9abd9afb5819db74f0e677e89a61b246228c71ac"},
{file = "pandas-3.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b86d113b6c109df3ce0ad5abbc259fe86a1bd4adfd4a31a89da42f84f65509bb"},
{file = "pandas-3.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1c39eab3ad38f2d7a249095f0a3d8f8c22cc0f847e98ccf5bbe732b272e2d9fa"},
{file = "pandas-3.0.0.tar.gz", hash = "sha256:0facf7e87d38f721f0af46fe70d97373a37701b1c09f7ed7aeeb292ade5c050f"},
]
[package.dependencies]
numpy = {version = ">=1.26.0", markers = "python_version < \"3.14\""}
python-dateutil = ">=2.8.2"
tzdata = {version = "*", markers = "sys_platform == \"win32\" or sys_platform == \"emscripten\""}
[package.extras]
all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.36)", "adbc-driver-postgresql (>=1.2.0)", "adbc-driver-sqlite (>=1.2.0)", "beautifulsoup4 (>=4.12.3)", "bottleneck (>=1.4.2)", "fastparquet (>=2024.11.0)", "fsspec (>=2024.10.0)", "gcsfs (>=2024.10.0)", "html5lib (>=1.1)", "hypothesis (>=6.116.0)", "jinja2 (>=3.1.5)", "lxml (>=5.3.0)", "matplotlib (>=3.9.3)", "numba (>=0.60.0)", "numexpr (>=2.10.2)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.5)", "psycopg2 (>=2.9.10)", "pyarrow (>=13.0.0)", "pyiceberg (>=0.8.1)", "pymysql (>=1.1.1)", "pyreadstat (>=1.2.8)", "pytest (>=8.3.4)", "pytest-xdist (>=3.6.1)", "python-calamine (>=0.3.0)", "pytz (>=2024.2)", "pyxlsb (>=1.0.10)", "qtpy (>=2.4.2)", "s3fs (>=2024.10.0)", "scipy (>=1.14.1)", "tables (>=3.10.1)", "tabulate (>=0.9.0)", "xarray (>=2024.10.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.2.0)", "zstandard (>=0.23.0)"]
aws = ["s3fs (>=2024.10.0)"]
clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.4.2)"]
compression = ["zstandard (>=0.23.0)"]
computation = ["scipy (>=1.14.1)", "xarray (>=2024.10.0)"]
excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.5)", "python-calamine (>=0.3.0)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.2.0)"]
feather = ["pyarrow (>=13.0.0)"]
fss = ["fsspec (>=2024.10.0)"]
gcp = ["gcsfs (>=2024.10.0)"]
hdf5 = ["tables (>=3.10.1)"]
html = ["beautifulsoup4 (>=4.12.3)", "html5lib (>=1.1)", "lxml (>=5.3.0)"]
iceberg = ["pyiceberg (>=0.8.1)"]
mysql = ["SQLAlchemy (>=2.0.36)", "pymysql (>=1.1.1)"]
output-formatting = ["jinja2 (>=3.1.5)", "tabulate (>=0.9.0)"]
parquet = ["pyarrow (>=13.0.0)"]
performance = ["bottleneck (>=1.4.2)", "numba (>=0.60.0)", "numexpr (>=2.10.2)"]
plot = ["matplotlib (>=3.9.3)"]
postgresql = ["SQLAlchemy (>=2.0.36)", "adbc-driver-postgresql (>=1.2.0)", "psycopg2 (>=2.9.10)"]
pyarrow = ["pyarrow (>=13.0.0)"]
spss = ["pyreadstat (>=1.2.8)"]
sql-other = ["SQLAlchemy (>=2.0.36)", "adbc-driver-postgresql (>=1.2.0)", "adbc-driver-sqlite (>=1.2.0)"]
test = ["hypothesis (>=6.116.0)", "pytest (>=8.3.4)", "pytest-xdist (>=3.6.1)"]
timezone = ["pytz (>=2024.2)"]
xml = ["lxml (>=5.3.0)"]
[[package]]
name = "propcache"
version = "0.4.1"
@@ -1404,14 +1491,14 @@ cli = ["click (>=5.0)"]
[[package]]
name = "python-multipart"
version = "0.0.20"
version = "0.0.22"
description = "A streaming multipart parser for Python"
optional = false
python-versions = ">=3.8"
python-versions = ">=3.10"
groups = ["main"]
files = [
{file = "python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104"},
{file = "python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13"},
{file = "python_multipart-0.0.22-py3-none-any.whl", hash = "sha256:2b2cd894c83d21bf49d702499531c7bafd057d730c201782048f7945d82de155"},
{file = "python_multipart-0.0.22.tar.gz", hash = "sha256:7340bef99a7e0032613f56dc36027b959fd3b30a787ed62d310e951f7c3a3a58"},
]
[[package]]
@@ -1421,6 +1508,7 @@ description = "World timezone definitions, modern and historical"
optional = false
python-versions = "*"
groups = ["main"]
markers = "python_version == \"3.10\""
files = [
{file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"},
{file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"},
@@ -1542,6 +1630,7 @@ description = "Provider of IANA time zone data"
optional = false
python-versions = ">=2"
groups = ["main"]
markers = "sys_platform == \"win32\" or sys_platform == \"emscripten\" or python_version == \"3.10\""
files = [
{file = "tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1"},
{file = "tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7"},
@@ -1856,4 +1945,4 @@ type = ["pytest-mypy"]
[metadata]
lock-version = "2.1"
python-versions = ">=3.10,<3.14"
content-hash = "3c569f4de9035b7eb38bf374fac2015d5a9a664576fac7d381795b365d8ec8ee"
content-hash = "71a69eaa28e8658925c02abb08a5967ae117c3bceea4974dc1c36d8072c88119"

View File

@@ -14,11 +14,11 @@ packages = [
python = ">=3.10,<3.14"
uvicorn = "^0.40.0"
websockets = "^15.0"
pandas = ">=1.5.3,<3"
pandas = ">=1.5.3"
html5lib = "^1.1"
fastapi = "^0.128.0"
uuid7 = "^0.1.0"
python-multipart = "^0.0.20"
python-multipart = "^0.0.22"
pydantic = "^2.12.3"
requests = "^2.32.5"
importlib-metadata = ">=6.8.0"

View File

@@ -169,7 +169,7 @@ class DerivativesViews:
str(d) + " Hours Ago" if d > 0 else "Current"
for d in df["hours_ago"].unique().tolist()
]
df.loc[:, "date"] = df["hours_ago"].apply(
df["date"] = df["hours_ago"].apply(
lambda x: str(x) + " Hours Ago" if x > 0 else "Current"
)
figure, color_count = create_fig(figure, df, dates, color_count)

View File

@@ -276,3 +276,60 @@ def test_econometrics_unit_root(params, data_type):
result = requests.post(url, headers=get_headers(), timeout=10, data=body)
assert isinstance(result, requests.Response)
assert result.status_code == 200
@pytest.mark.parametrize(
"params, data_type",
[
(
{"data": "", "y_column": "close", "x_columns": ["high"]},
"equity",
),
(
{"data": "", "y_column": "close", "x_columns": ["high"]},
"crypto",
),
],
)
@pytest.mark.integration
def test_econometrics_ols_regression(params, data_type):
"""Test the OLS regression function in econometrics extension."""
params = {p: v for p, v in params.items() if v}
body = json.dumps(
{
"data": get_data(data_type),
"x_columns": params.pop("x_columns"),
}
)
query_str = get_querystring(params, [])
url = f"http://0.0.0.0:8000/api/v1/econometrics/ols_regression?{query_str}"
result = requests.post(url, headers=get_headers(), timeout=10, data=body)
assert isinstance(result, requests.Response)
assert result.status_code == 200
@pytest.mark.parametrize(
"params, data_type",
[
({"data": "", "columns": ["high", "low"]}, "equity"),
({"data": "", "columns": ["high", "low"]}, "crypto"),
],
)
@pytest.mark.integration
def test_econometrics_variance_inflation_factor(params, data_type):
"""Test the variance inflation factor endpoint."""
params = {p: v for p, v in params.items() if v}
body = json.dumps(
{
"data": get_data(data_type),
"columns": params.pop("columns"),
}
)
url = "http://0.0.0.0:8000/api/v1/econometrics/variance_inflation_factor"
result = requests.post(url, headers=get_headers(), timeout=10, data=body)
assert isinstance(result, requests.Response)
assert result.status_code == 200

View File

@@ -105,7 +105,7 @@ def test_econometrics_ols_regression(params, data_type, obb):
result = obb.econometrics.ols_regression(**params)
assert result
assert isinstance(result, OBBject)
assert len(result.results) > 0
assert result.results is not None
@pytest.mark.parametrize(

View File

@@ -1,17 +1,77 @@
"""Econometrics Router."""
# pylint: disable=too-many-lines
from itertools import combinations
from typing import Literal
from typing import Any, Literal
from openbb_core.app.model.example import APIEx, PythonEx
from openbb_core.app.model.obbject import OBBject
from openbb_core.app.router import Router
from openbb_core.provider.abstract.data import Data
from pydantic import PositiveInt
from pydantic import BaseModel, PositiveInt, model_serializer
router = Router(prefix="", description="Econometrics analysis tools.")
class OLSRegressionResults(BaseModel):
"""OLS Regression Results that serializes statsmodels objects."""
model: Any
results: Any
class Config:
"""Pydantic config."""
arbitrary_types_allowed = True
@model_serializer
def serialize_model(self) -> dict:
"""Serialize statsmodels objects to a dictionary."""
results = self.results
conf_int = results.conf_int()
conf_int_dict = (
conf_int.to_dict()
if hasattr(conf_int, "to_dict")
else conf_int.to_dict("index")
)
return {
"params": (
results.params.to_dict()
if hasattr(results.params, "to_dict")
else dict(results.params)
),
"rsquared": float(results.rsquared),
"rsquared_adj": float(results.rsquared_adj),
"fvalue": float(results.fvalue) if results.fvalue is not None else None,
"f_pvalue": (
float(results.f_pvalue) if results.f_pvalue is not None else None
),
"aic": float(results.aic),
"bic": float(results.bic),
"llf": float(results.llf),
"nobs": int(results.nobs),
"df_model": float(results.df_model),
"df_resid": float(results.df_resid),
"pvalues": (
results.pvalues.to_dict()
if hasattr(results.pvalues, "to_dict")
else dict(results.pvalues)
),
"tvalues": (
results.tvalues.to_dict()
if hasattr(results.tvalues, "to_dict")
else dict(results.tvalues)
),
"bse": (
results.bse.to_dict()
if hasattr(results.bse, "to_dict")
else dict(results.bse)
),
"conf_int": conf_int_dict,
}
@router.command(
methods=["POST"],
examples=[
@@ -77,7 +137,6 @@ def correlation_matrix(
@router.command(
methods=["POST"],
include_in_schema=False,
examples=[
PythonEx(
description="Perform Ordinary Least Squares (OLS) regression.",
@@ -99,7 +158,7 @@ def ols_regression(
data: list[Data],
y_column: str,
x_columns: list[str],
) -> OBBject[dict]:
) -> OBBject[OLSRegressionResults]:
"""Perform Ordinary Least Squares (OLS) regression.
OLS regression is a fundamental statistical method to explore and model the relationship between a
@@ -118,7 +177,7 @@ def ols_regression(
Returns
-------
OBBject[dict]
OBBject[OLSRegressionResults]
OBBject with the results being model and results objects.
"""
# pylint: disable=import-outside-toplevel
@@ -133,7 +192,7 @@ def ols_regression(
y = get_target_column(basemodel_to_df(data), y_column)
model = sm.OLS(y, X)
results = model.fit()
return OBBject(results={"model": model, "results": results})
return OBBject(results=OLSRegressionResults(model=model, results=results))
@router.command(
@@ -914,19 +973,24 @@ def panel_fmac(
@router.command(
methods=["POST"],
include_in_schema=False,
examples=[
PythonEx(
description="Calculate the variance inflation factor.",
code=[
"stock_data = obb.equity.price.historical(symbol='TSLA', start_date='2023-01-01', provider='yfinance').to_df()", # noqa: E501 pylint: disable= C0301
'obb.econometrics.variance_inflation_factor(data=stock_data, column="close")',
'obb.econometrics.variance_inflation_factor(data=stock_data, columns=["open", "high", "low", "close"])', # noqa: E501 pylint: disable= C0301
],
),
APIEx(
parameters={
"columns": ["open", "high", "low"],
"data": APIEx.mock_data("timeseries"),
}
),
],
)
def variance_inflation_factor(
data: list[Data], columns: list | None = None
data: list[Data], columns: list[str] | None = None
) -> OBBject[list[Data]]:
"""Calculate VIF (variance inflation factor), which tests for collinearity.
@@ -974,7 +1038,7 @@ def variance_inflation_factor(
df = add_constant(dataset if columns is None else dataset[columns])
# Remove date and string type because VIF doesn't work for these types
df = df.select_dtypes(exclude=["object", "datetime", "timedelta"])
df = df.select_dtypes(exclude=["object", "datetime", "timedelta"]) # type: ignore
# Calculate the VIF values
vif_values: dict = {}

View File

@@ -62,7 +62,7 @@ def get_crypto_data():
# TODO : add more crypto providers and symbols
symbol = random.choice(["BTCUSD"]) # noqa: S311
provider = random.choice(["fmp"]) # noqa: S311
provider = "fmp"
data["crypto_data"] = request_data(
menu="crypto",

View File

@@ -32,8 +32,8 @@ def get_stocks_data():
symbol = random.choice(["AAPL", "NVDA", "MSFT", "TSLA", "AMZN", "V"]) # noqa: S311
provider = random.choice(["fmp", "yfinance"]) # noqa: S311
data["stocks_data"] = openbb.obb.equity.price.historical(
symbol=symbol, provider=provider
data["stocks_data"] = openbb.obb.equity.price.historical( # type: ignore
symbol=symbol, provider=provider # type: ignore
).results
return data["stocks_data"]

View File

@@ -265,7 +265,7 @@ def sortino_ratio(
)
if adjusted:
results = results.applymap(lambda x: x / sqrt(2) if isinstance(x, float) else x)
results = results.map(lambda x: x / sqrt(2) if isinstance(x, float) else x)
results_ = df_to_basemodel(results)
return OBBject(results=results_)

View File

@@ -136,7 +136,7 @@ def capm(data: list[Data], target: str) -> OBBject[CAPMModel]:
df_target = get_target_columns(df, ["date", target])
df_target = df_target.set_index("date")
df_target.loc[:, "return"] = df_target.pct_change()
df_target["return"] = df_target.pct_change()
df_target = df_target.dropna()
df_target.index = to_datetime(df_target.index)
start_date = df_target.index.min().strftime("%Y-%m-%d")

View File

@@ -118,7 +118,7 @@ def test_technical_atr(params, data_type, obb):
{
"data": "",
"index": "date",
"close_column": "adj_close",
"close_column": "close",
"period": "125",
"start_date": "",
"end_date": "",

View File

@@ -388,7 +388,7 @@ class TA_Data:
) from e
if indicator_data is not None:
output = output.join(indicator_data).infer_objects(copy=False)
output = output.join(indicator_data).infer_objects()
numeric_cols = output.select_dtypes(include=["number"]).columns
output[numeric_cols] = output[numeric_cols].interpolate("linear")

View File

@@ -192,7 +192,7 @@ class PlotlyTA(PltTA):
indicators = ChartIndicators.from_dict(indicators or {})
# Apply to_datetime to the index in a way that handles daylight savings.
df_stock.loc[:, "date"] = df_stock.index # type: ignore
df_stock["date"] = df_stock.index # type: ignore
df_stock["date"] = df_stock["date"].apply(pd.to_datetime)
df_stock.index = df_stock["date"] # type: ignore
df_stock.drop(columns=["date"], inplace=True)

View File

@@ -168,7 +168,7 @@ class AVEquityHistoricalFetcher(
inplace=True,
)
if len(query.symbol.split(",")) > 1:
df.loc[:, "symbol"] = symbol
df["symbol"] = symbol
results.extend(df.to_dict("records"))
if not data:
warn(f"Symbol Error: No data found for {symbol}")
@@ -268,7 +268,7 @@ class AVEquityHistoricalFetcher(
if freq in ["M", "W-FRI"]:
data = data.resample(freq).agg({**agg_dict})
if len(query.symbol.split(",")) > 1:
data.loc[:, "symbol"] = symbol
data["symbol"] = symbol
data = data.reset_index()
if intraday is False:

View File

@@ -275,7 +275,7 @@ async def download_category_series_ids(category) -> tuple[list, dict]:
ids = ids.rename(columns={"footnote_codes": "footnote_code"})
ids = ids.astype(str).replace({"nan": None, "''": None, "": None})
ids.loc[:, "survey_name"] = SURVEY_NAMES.get(survey.upper(), None)
ids["survey_name"] = SURVEY_NAMES.get(survey.upper(), None)
ids = ids[ids.series_id.astype(str).str.startswith(survey.upper())]
if ids is None or ids.empty:

View File

@@ -78,4 +78,15 @@ class CboeEquitySearchFetcher(
query: CboeEquitySearchQueryParams, data: dict, **kwargs: Any
) -> list[CboeEquitySearchData]:
"""Transform the data to the standard format."""
return [CboeEquitySearchData.model_validate(d) for d in data["results"]]
from math import isnan # pylint: disable=import-outside-toplevel
def clean_nan(d: dict) -> dict:
"""Replace nan values with None for Pydantic validation."""
return {
k: None if isinstance(v, float) and isnan(v) else v
for k, v in d.items()
}
return [
CboeEquitySearchData.model_validate(clean_nan(d)) for d in data["results"]
]

View File

@@ -133,7 +133,7 @@ class DeribitOptionsChainsFetcher(
symbols_dict: dict[str, str] = {}
try:
symbols_dict = await get_options_symbols(query.symbol)
symbols_dict = await get_options_symbols(query.symbol) # type: ignore
except OpenBBError as e:
raise OpenBBError(e) from e
@@ -268,14 +268,14 @@ class DeribitOptionsChainsFetcher(
"high",
"low",
] and query.symbol.upper() in ["BTC", "ETH"]:
df.loc[:, col] = df[col].astype(float).multiply(df.index_price).round(2)
df[col] = (df[col].astype(float) * df["index_price"]).round(2)
elif col in ["price_change", "mark_iv", "bid_iv", "ask_iv"]:
df.loc[:, col] = df[col].astype(float).divide(100)
df[col] = df[col].astype(float) / 100
df = df.replace({nan: None})
df = df.sort_values(["expiration", "strike", "option_type"])
df = df.reset_index(drop=True)
df.loc[:, "contract_size"] = 1
df["contract_size"] = 1
results = df.to_dict(orient="list")
return DeribitOptionsChainsData.model_validate(results)

View File

@@ -292,10 +292,10 @@ async def get_ohlc_data(
.rename(columns={"ticks": "date", "cost": "volume_notional"})
.convert_dtypes()
)
df.date = to_datetime(df.date, unit="ms", origin="unix", utc=True)
df["date"] = to_datetime(df.date, unit="ms", origin="unix", utc=True)
if interval == "1D":
df.date = df.date.dt.date
df.loc[:, "symbol"] = symbol
df["symbol"] = symbol
results.extend(
df[
[

View File

@@ -155,14 +155,14 @@ class ECBYieldCurveFetcher(
flattened_data = flattened_data.rename(columns={"index": "date"}).sort_values(
"date"
)
flattened_data.loc[:, "maturity"] = Categorical(
flattened_data["maturity"] = Categorical(
flattened_data.maturity, categories=MATURITIES, ordered=True
)
flattened_data = flattened_data.sort_values(
by=["date", "maturity"]
).reset_index(drop=True)
flattened_data.date = flattened_data.date.dt.strftime("%Y-%m-%d")
flattened_data.rate = flattened_data.rate.astype(float).div(100)
flattened_data["date"] = flattened_data.date.dt.strftime("%Y-%m-%d")
flattened_data["rate"] = flattened_data.rate.astype(float).div(100)
records = flattened_data.to_dict(orient="records")
return [ECBYieldCurveData.model_validate(d) for d in records]

View File

@@ -100,4 +100,16 @@ class EconDbAvailableIndicatorsFetcher(
**kwargs: Any,
) -> list[EconDbAvailableIndicatorsData]:
"""Transform data."""
return [EconDbAvailableIndicatorsData.model_validate(d) for d in data]
# pylint: disable=import-outside-toplevel
from math import isnan
def clean_nan(d: dict) -> dict:
"""Replace nan values with None for Pydantic validation."""
return {
k: None if isinstance(v, float) and isnan(v) else v
for k, v in d.items()
}
return [
EconDbAvailableIndicatorsData.model_validate(clean_nan(d)) for d in data
]

View File

@@ -231,11 +231,9 @@ class EconDbYieldCurveFetcher(
flattened_data = flattened_data.sort_values(
by=["date", "maturity"]
).reset_index(drop=True)
flattened_data.loc[:, "date"] = flattened_data["date"].dt.strftime(
"%Y-%m-%d"
)
flattened_data["date"] = flattened_data["date"].dt.strftime("%Y-%m-%d")
new_df = flattened_data.copy()
new_df.loc[:, "country"] = country
new_df["country"] = country
def convert_duration(x):
"""Convert the duration to a decimal representation of years."""
@@ -246,7 +244,7 @@ class EconDbYieldCurveFetcher(
return int(unit)
return int(unit) / 12
new_df.loc[:, "maturity_years"] = new_df.maturity.apply(convert_duration)
new_df["maturity_years"] = new_df.maturity.apply(convert_duration)
new_df = new_df.replace({nan: None})
records = [

View File

@@ -453,7 +453,7 @@ async def download_indicators(use_cache: bool = True) -> DataFrame:
all_tickers = all_tickers[~all_tickers.short_ticker.isin(["POPNP", "M3CO"])]
all_tickers = all_tickers[~all_tickers.short_ticker.str.contains("_")]
country_indicators = all_tickers[all_tickers.iso.str.len() == 2].copy()
country_indicators.loc[:, "symbol_root"] = country_indicators.apply(
country_indicators["symbol_root"] = country_indicators.apply(
lambda row: (
row["short_ticker"][::-1].replace(row["iso"][::-1], "", 1)[::-1]
if row["short_ticker"].endswith(row["iso"])
@@ -477,7 +477,7 @@ async def download_indicators(use_cache: bool = True) -> DataFrame:
# Fix a known incorrect value.
tickers.loc[tickers["short_ticker"] == "GDPPCNZ", "multiplier"] = 1
tickers.loc[tickers["short_ticker"] == "GDPPCNZ", "scale"] = "Units"
tickers.entity = tickers.entity.str.replace("All countries", "World")
tickers["entity"] = tickers.entity.str.replace("All countries", "World")
tickers = tickers.fillna("N/A").replace("N/A", None).replace("nan", None)
return tickers.sort_values(by="last_date", ascending=False)

View File

@@ -193,17 +193,17 @@ class EiaPetroleumStatusReportFetcher(
var_name="symbol",
).dropna()
df = df.reset_index(drop=True)
df.loc[:, "title"] = df.symbol.map(title_map)
df.loc[:, "unit"] = df.title.map(lambda x: x.split(" (")[-1].split(")")[0])
df["title"] = df.symbol.map(title_map)
df["unit"] = df.title.map(lambda x: x.split(" (")[-1].split(")")[0])
units = [f"({d})" for d in df.unit.unique().tolist()]
for unit in units:
df.title = df.title.str.replace(unit, "", regex=False).str.strip()
df.loc[:, "table"] = table_name
df["title"] = df.title.str.replace(unit, "", regex=False).str.strip()
df["table"] = table_name
df["order"] = df.groupby("date").cumcount() + 1
df = df[["date", "table", "symbol", "order", "title", "value", "unit"]]
df.symbol = Categorical(df.symbol, categories=symbols, ordered=True)
df["symbol"] = Categorical(df.symbol, categories=symbols, ordered=True)
df = df.sort_values(["date", "symbol"])
df.date = df.date.dt.date
df["date"] = df.date.dt.date
if query.start_date:
df = df[df.date >= query.start_date]

View File

@@ -176,7 +176,7 @@ class FamaFrenchRegionalPortfolioReturnsFetcher(
)
.copy()
)
flattened_data.loc[:, "measure"] = query.measure
flattened_data["measure"] = query.measure
return AnnotatedResult(
result=[

View File

@@ -180,7 +180,7 @@ class FamaFrenchUSPortfolioReturnsFetcher(
)
.copy()
)
flattened_data.loc[:, "measure"] = query.measure
flattened_data["measure"] = query.measure
return AnnotatedResult(
result=[

View File

@@ -85,11 +85,11 @@ class FederalReserveMoneyMeasuresFetcher(
df = df.replace("ND", None)
df["month"] = to_datetime(df["month"])
df = df[
(to_datetime(df.month) >= to_datetime(query.start_date))
& (to_datetime(df.month) <= to_datetime(query.end_date))
(to_datetime(df.month) >= to_datetime(query.start_date)) # type: ignore
& (to_datetime(df.month) <= to_datetime(query.end_date)) # type: ignore
].set_index("month")
# Needs the date to not be in the columns
df = df.applymap(lambda x: float(x) if x != "-" and x is not None else x)
df = df.map(lambda x: float(x) if x != "-" and x is not None else x)
df = df.reset_index(drop=False)
return df.to_dict(orient="records")

View File

@@ -123,8 +123,8 @@ class FederalReservePrimaryDealerFailsFetcher(
raise EmptyDataError("No data returned from the Federal Reserve API.")
df = DataFrame(data)
df.loc[:, "title"] = df.keyid.map(FAILS_SERIES_TO_TITLE)
df.value = df.value.astype(int)
df["title"] = df.keyid.map(FAILS_SERIES_TO_TITLE)
df["value"] = df.value.astype(int)
new_df = df.pivot(index="asofdate", columns="title", values="value").copy()
new_data = new_df.copy()
combined_df = DataFrame()
@@ -163,15 +163,15 @@ class FederalReservePrimaryDealerFailsFetcher(
new_data = new_data.T.unstack().reset_index()
new_data.columns = ["date", "title", "value"]
new_data.loc[:, "symbol"] = new_data.title.map(
new_data["symbol"] = new_data.title.map(
{v: k for k, v in FAILS_SERIES_TO_TITLE.items()}
).replace({NA: "--"})
new_data = new_data.dropna()
if query.unit == "value":
new_data.value = new_data.value.astype(int)
new_data["value"] = new_data.value.astype(int)
new_data.date = to_datetime(new_data.date).dt.date
new_data["date"] = to_datetime(new_data.date).dt.date
if query.start_date:
new_data = new_data[new_data.date >= query.start_date]

View File

@@ -86,7 +86,7 @@ class FederalReserveYieldCurveFetcher(
df = data.copy()
df.set_index("date", inplace=True)
dates = query.date.split(",") if query.date else [df.index.max()]
dates = query.date.split(",") if query.date else [df.index.max()] # type: ignore
df.index = DatetimeIndex(df.index)
dates_list = DatetimeIndex(dates)
df.columns.name = "maturity"
@@ -111,7 +111,7 @@ class FederalReserveYieldCurveFetcher(
flattened_data = flattened_data.sort_values(
by=["date", "maturity"]
).reset_index(drop=True)
flattened_data.loc[:, "date"] = flattened_data["date"].dt.strftime("%Y-%m-%d")
flattened_data["date"] = flattened_data["date"].dt.strftime("%Y-%m-%d")
records = flattened_data.to_dict(orient="records")
return [FederalReserveYieldCurveData.model_validate(d) for d in records]

View File

@@ -126,7 +126,7 @@ class FMPYieldCurveFetcher(
flattened_data = flattened_data.sort_values(
by=["date", "maturity"]
).reset_index(drop=True)
flattened_data.loc[:, "date"] = flattened_data["date"].dt.strftime("%Y-%m-%d")
flattened_data["date"] = flattened_data["date"].dt.strftime("%Y-%m-%d")
records = flattened_data.to_dict(orient="records")
return [FMPYieldCurveData.model_validate(d) for d in records]

View File

@@ -206,8 +206,8 @@ class FredCommoditySpotPricesFetcher(
results = await FredSeriesFetcher.fetch_data(series_query, credentials)
return {
"result": results.result,
"metadata": results.metadata,
"result": results.result, # type: ignore
"metadata": results.metadata, # type: ignore
}
except Exception as e:
raise OpenBBError(f"Failed to fetch data from FRED API: {e}") from e
@@ -240,8 +240,8 @@ class FredCommoditySpotPricesFetcher(
.sort_values(by="date")
)
df = df.reset_index(drop=True)
df.loc[:, "commodity"] = df.symbol.map(title_map)
df.loc[:, "unit"] = df.symbol.map(units_map)
df["commodity"] = df.symbol.map(title_map)
df["unit"] = df.symbol.map(units_map)
records = df.to_dict(orient="records")
return AnnotatedResult(

View File

@@ -207,6 +207,7 @@ class FredSeriesFetcher(
records = (
DataFrame(series)
.filter(items=query.symbol.split(","), axis=1)
.sort_index()
.reset_index()
.rename(columns={"index": "date"})
.replace({nan: None})

View File

@@ -148,9 +148,9 @@ class FredTipsYieldsFetcher(
"series_id"
)
df.loc[:, "due"] = df.title.apply(
lambda x: x.split("Due ")[-1].strip()
).apply(to_datetime)
df["due"] = df.title.apply(lambda x: x.split("Due ")[-1].strip()).apply(
to_datetime
)
df = df[["due", "observation_start", "observation_end", "title"]]
return df.sort_values(by="due").reset_index() # type: ignore
@@ -195,13 +195,13 @@ class FredTipsYieldsFetcher(
fetcher = FredSeriesFetcher()
res = await fetcher.fetch_data(params=params, credentials=credentials)
df = DataFrame([d.model_dump() for d in res.result]) # type: ignore
meta = res.metadata # type: ignore
meta: dict = res.metadata or {} # type: ignore
except Exception as e:
raise OpenBBError(e) from e
for k, v in title_map.items():
if k in meta:
meta[k]["title"] = v # type: ignore
meta[k]["title"] = v
# We flatten the data and format the output with the metadata.

View File

@@ -70,11 +70,11 @@ class FREDYieldCurveFetcher(
series_ids = ",".join(list(YIELD_CURVES[query.yield_curve_type]))
fetcher = FredSeriesFetcher()
data = await fetcher.fetch_data(
{"symbol": series_ids}, {"fred_api_key": api_key}
{"symbol": series_ids}, {"fred_api_key": api_key} # type: ignore
)
if not data:
raise EmptyDataError("The request was returned empty.")
results = [d.model_dump() for d in data.result]
results = [d.model_dump() for d in data.result] # type: ignore
return results
@@ -88,7 +88,7 @@ class FREDYieldCurveFetcher(
df = DataFrame(data).set_index("date").sort_index()
df.index = df.index.astype(str)
dates = query.date.split(",") if query.date else [df.index.max()]
dates = query.date.split(",") if query.date else [df.index.max()] # type: ignore
df.index = DatetimeIndex(df.index)
dates_list = DatetimeIndex(dates)
maturity_dict = YIELD_CURVES[query.yield_curve_type]
@@ -117,7 +117,7 @@ class FREDYieldCurveFetcher(
flattened_data = flattened_data.sort_values(
by=["date", "maturity"]
).reset_index(drop=True)
flattened_data.loc[:, "date"] = flattened_data["date"].dt.strftime("%Y-%m-%d")
flattened_data["date"] = flattened_data["date"].dt.strftime("%Y-%m-%d")
records = flattened_data.to_dict(orient="records")
return [FREDYieldCurveData.model_validate(d) for d in records]

View File

@@ -232,4 +232,16 @@ class GovernmentUSTreasuryAuctionsFetcher(
**kwargs: Any,
) -> list[GovernementUSTreasuryAuctionsData]:
"""Transform the data."""
return [GovernementUSTreasuryAuctionsData.model_validate(d) for d in data]
# pylint: disable=import-outside-toplevel
from math import isnan
def clean_nan(d: dict) -> dict:
"""Replace nan values with None for Pydantic validation."""
return {
k: None if isinstance(v, float) and isnan(v) else v
for k, v in d.items()
}
return [
GovernementUSTreasuryAuctionsData.model_validate(clean_nan(d)) for d in data
]

View File

@@ -101,8 +101,9 @@ class GovernmentUSTreasuryPricesFetcher(
) -> list[GovernmentUSTreasuryPricesData]:
"""Transform the data."""
# pylint: disable=import-outside-toplevel
from io import StringIO # noqa
from pandas import Index, read_csv, to_datetime # noqa
from math import isnan # noqa
from io import StringIO
from pandas import Index, read_csv, to_datetime
try:
if not data:
@@ -141,7 +142,15 @@ class GovernmentUSTreasuryPricesFetcher(
]
if query.cusip is not None:
results = results[results["cusip"] == query.cusip]
def clean_nan(d: dict) -> dict:
"""Replace nan values with None for Pydantic validation."""
return {
k: None if isinstance(v, float) and isnan(v) else v
for k, v in d.items()
}
return [
GovernmentUSTreasuryPricesData.model_validate(d)
GovernmentUSTreasuryPricesData.model_validate(clean_nan(d))
for d in results.to_dict("records")
]

View File

@@ -148,7 +148,7 @@ def plot_port_info_map(data: list[ImfPortInfoData]):
return "".join(html_parts)
df.loc[:, "hover_html"] = df.apply(generate_hover_html, axis=1)
df["hover_html"] = df.apply(generate_hover_html, axis=1)
fig = px.scatter_map(
df,

View File

@@ -140,9 +140,7 @@ class NasdaqEquitySearchFetcher(
]
directory["Market Category"] = directory["Market Category"].replace(" ", None)
results = (
directory.infer_objects(copy=False)
.replace({nan: None})
.to_dict(orient="records")
directory.infer_objects().replace({nan: None}).to_dict(orient="records")
)
return [NasdaqEquitySearchData.model_validate(d) for d in results]

View File

@@ -35,7 +35,7 @@ def vcr_config():
}
@pytest.mark.record_http
@pytest.mark.record_ftp
def test_nasdaq_equity_search_fetcher(credentials=test_credentials):
"""Test the Nasdaq Equity Search fetcher."""
params = {"query": "", "is_etf": True, "use_cache": False}

View File

@@ -61,8 +61,9 @@ class SecSicSearchFetcher(
) -> list[dict]:
"""Extract data from the SEC website table."""
# pylint: disable=import-outside-toplevel
from aiohttp_client_cache import SQLiteBackend
from aiohttp_client_cache import SQLiteBackend # noqa
from aiohttp_client_cache.session import CachedSession
from io import StringIO
from openbb_core.app.utils import get_user_cache_directory
from openbb_core.provider.utils.helpers import amake_request
from openbb_sec.utils.helpers import SEC_HEADERS, sec_callback
@@ -89,7 +90,7 @@ class SecSicSearchFetcher(
else:
response = await amake_request(url, headers=SEC_HEADERS, response_callback=sec_callback) # type: ignore
data = read_html(response)[0].astype(str)
data = read_html(StringIO(response))[0].astype(str) # type: ignore
if len(data) == 0:
return results
if query:

View File

@@ -231,19 +231,19 @@ async def get_form_4_urls(
urls: list = []
for item in form_4:
if (
(not start_date or not item.filing_date)
(not start_date or not item.filing_date) # type: ignore
or start_date
and item.filing_date < start_date
and item.filing_date < start_date # type: ignore
):
continue
if (
(not end_date or not item.report_date)
(not end_date or not item.report_date) # type: ignore
or end_date
and item.report_date > end_date
and item.report_date > end_date # type: ignore
):
continue
to_replace = f"{item.primary_doc.split('/')[0]}/"
form_url = item.report_url.replace(to_replace, "")
to_replace = f"{item.primary_doc.split('/')[0]}/" # type: ignore
form_url = item.report_url.replace(to_replace, "") # type: ignore
if form_url.endswith(".xml"):
urls.append(form_url)
@@ -278,7 +278,7 @@ async def get_form_4_data(url) -> dict:
response_callback=response_callback,
timeout=30,
) # type: ignore
response_text = response.decode("utf-8")
response_text = response.decode("utf-8") # type: ignore
if "Traffic Limit" in response_text:
raise OpenBBError(
@@ -296,7 +296,7 @@ async def get_form_4_data(url) -> dict:
return (
xml_data.get("ownershipDocument") if xml_data.get("ownershipDocument") else {}
)
) # type: ignore
async def parse_form_4_data( # noqa: PLR0915, PLR0912 # pylint: disable=too-many-branches
@@ -346,10 +346,10 @@ async def parse_form_4_data( # noqa: PLR0915, PLR0912 # pylint: disable=too-ma
"symbol": issuer.get("issuerTradingSymbol", "").upper(),
"form": data.get("documentType"),
"owner": (
owners if owners else owner.get("reportingOwnerId", {}).get("rptOwnerName")
owners if owners else owner.get("reportingOwnerId", {}).get("rptOwnerName") # type: ignore
),
"owner_cik": (
ciks if ciks else owner.get("reportingOwnerId", {}).get("rptOwnerCik")
ciks if ciks else owner.get("reportingOwnerId", {}).get("rptOwnerCik") # type: ignore
),
"issuer": issuer.get("issuerName"),
"issuer_cik": issuer.get("issuerCik"),
@@ -419,7 +419,7 @@ async def parse_form_4_data( # noqa: PLR0915, PLR0912 # pylint: disable=too-ma
else (
"; ".join(
[
footnotes.get(footnote_id)
footnotes.get(footnote_id, "")
for footnote_id in ids
]
)
@@ -552,7 +552,7 @@ async def download_data(urls, use_cache: bool = True): # noqa: PLR0915
if result:
df = DataFrame(result)
df.loc[:, "filing_url"] = url
df["filing_url"] = url
df = df.replace({nan: None}).rename(columns=field_map)
try:
if use_cache is True:

View File

@@ -168,14 +168,17 @@ async def cik_map(cik: str | int, use_cache: bool = True) -> str:
def get_schema_filelist(query: str = "", url: str = "", use_cache: bool = True) -> list:
"""Get a list of schema files from the SEC website."""
from pandas import read_html # pylint: disable=import-outside-toplevel
# pylint: disable=import-outside-toplevel
from io import StringIO # noqa
from pandas import read_html
results: list = []
url = url if url else f"https://xbrl.fasb.org/us-gaap/{query}"
_url = url
_url = url + "/" if query else _url
response = make_request(_url)
data = read_html(response.content)[0]["Name"].dropna()
content = response.text
data = read_html(StringIO(content))[0]["Name"].dropna()
if len(data) > 0:
data.iloc[0] = url if not query else url + "/"
results = data.to_list()

View File

@@ -36,7 +36,7 @@ async def get_13f_candidates(symbol: str | None = None, cik: str | None = None):
params["use_cache"] = False
params["form_type"] = "13F-HR"
filings = await fetcher.fetch_data(params, {})
filings = [d.model_dump() for d in filings]
filings = [d.model_dump() for d in filings] # type: ignore
if len(filings) == 0:
raise OpenBBError(f"No 13F-HR filings found for {symbol if symbol else cik}.")
@@ -86,7 +86,7 @@ def parse_header(filing_str: str) -> dict:
header_dict = xmltodict.parse(str(header_xml))["headerData"]
except KeyError:
header_xml = soup.find("type")
header_dict = xmltodict.parse(str(header_xml)).get("type")
header_dict = xmltodict.parse(str(header_xml)).get("type") # type: ignore
if header_dict:
return header_dict # type: ignore
raise OpenBBError(
@@ -142,7 +142,7 @@ async def parse_13f_hr(filing: str):
info_table = soup.find_all("table")[-1]
parsed_xml = xmltodict.parse(
str(info_table[0]).replace("ns1:", "").replace("n1:", "")
str(info_table[0]).replace("ns1:", "").replace("n1:", "") # type: ignore
)["informationTable"]["infoTable"]
if parsed_xml is None:
@@ -152,23 +152,23 @@ async def parse_13f_hr(filing: str):
+ " Documents filed before Q2 2013 are not supported."
)
period_ending = get_period_ending(soup)
period_ending = get_period_ending(soup) # type: ignore
data = (
DataFrame(parsed_xml)
if isinstance(parsed_xml, list)
else DataFrame([parsed_xml])
)
data.columns = data.columns.str.replace("ns1:", "")
data.loc[:, "value"] = data["value"].astype(int)
data["value"] = data["value"].astype(int)
security_type: list = []
principal_amount: list = []
# Unpack the nested objects
try:
security_type = [d.get("sshPrnamtType") for d in data["shrsOrPrnAmt"]]
data.loc[:, "security_type"] = security_type
data["security_type"] = security_type
principal_amount = [int(d.get("sshPrnamt", 0)) for d in data["shrsOrPrnAmt"]]
data.loc[:, "principal_amount"] = principal_amount
data["principal_amount"] = principal_amount
_ = data.pop("shrsOrPrnAmt")
except ValueError:
pass
@@ -176,18 +176,18 @@ async def parse_13f_hr(filing: str):
sole = [d.get("Sole") for d in data["votingAuthority"]]
shared = [d.get("Shared") for d in data["votingAuthority"]]
none = [d.get("None") for d in data["votingAuthority"]]
data.loc[:, "voting_authority_sole"] = [int(s) if s else 0 for s in sole]
data.loc[:, "voting_authority_shared"] = [int(s) if s else 0 for s in shared]
data.loc[:, "voting_authority_none"] = [int(s) if s else 0 for s in none]
data["voting_authority_sole"] = [int(s) if s else 0 for s in sole]
data["voting_authority_shared"] = [int(s) if s else 0 for s in shared]
data["voting_authority_none"] = [int(s) if s else 0 for s in none]
_ = data.pop("votingAuthority")
except ValueError:
pass
if "putCall" in data.columns:
data.loc[:, "putCall"] = data["putCall"].fillna("--")
data["putCall"] = data["putCall"].fillna("--")
# Add the period ending so that the filing is identified when multiple are requested.
data.loc[:, "period_ending"] = to_datetime(period_ending, yearfirst=False).date()
data["period_ending"] = to_datetime(period_ending, yearfirst=False).date()
df = DataFrame(data)
# Aggregate the data because there are multiple entries for each security and we need the totals.
# We break it down by CUSIP, security type, and option type.
@@ -221,7 +221,7 @@ async def parse_13f_hr(filing: str):
df.drop(columns=col, inplace=True)
total_value = df.value.sum()
df.loc[:, "weight"] = round(df.value.astype(float) / total_value, 6)
df["weight"] = round(df.value.astype(float) / total_value, 6)
return (
df.reset_index()

View File

@@ -190,7 +190,7 @@ class TmxBondPricesFetcher(
"bondType == 'Corp'& maturityDate >= @query.maturity_date_min.strftime('%Y-%m-%d')"
).sort_values(by=["maturityDate"])
data.loc[:, "issuer"] = data.issuer.str.strip()
data["issuer"] = data.issuer.str.strip()
if query.maturity_date_max:
data = data.query(

View File

@@ -78,7 +78,7 @@ class TmxEtfCountriesFetcher(
columns={"name": "country", "percent": "weight"}
)
if not target.empty:
target.loc[:, "symbol"] = symbol
target["symbol"] = symbol
result = (
target[["symbol", "country", "weight"]]
.reset_index(drop=True)

View File

@@ -268,4 +268,14 @@ class TmxEtfSearchFetcher(
**kwargs: Any,
) -> list[TmxEtfSearchData]:
"""Transform the data to the standard format."""
return [TmxEtfSearchData.model_validate(d) for d in data]
# pylint: disable=import-outside-toplevel
from math import isnan
def clean_nan(d: dict) -> dict:
"""Replace nan values with None for Pydantic validation."""
return {
k: None if isinstance(v, float) and isnan(v) else v
for k, v in d.items()
}
return [TmxEtfSearchData.model_validate(clean_nan(d)) for d in data]

View File

@@ -73,7 +73,7 @@ class TmxEtfSectorsFetcher(
target = DataFrame.from_records(_target.iloc[0]).rename(
columns={"name": "sector", "percent": "weight"}
)
target.loc[:, "symbol"] = symbol.upper()
target["symbol"] = symbol.upper()
result = (
target[["symbol", "sector", "weight"]]
.replace({float("nan"): None})

View File

@@ -143,7 +143,7 @@ class TmxTreasuryPricesFetcher(
+ " & bondType == 'Govt'"
+ " & issuer.str.contains(@govt_type, case=False)"
).sort_values(by=["maturityDate"])
data.issuer = data.loc[:, "issuer"].str.strip()
data["issuer"] = data["issuer"].str.strip()
if query.maturity_date_max:
data = data.query(
"maturityDate <= @query.maturity_date_max.strftime('%Y-%m-%d')"

View File

@@ -619,14 +619,22 @@ async def download_eod_chains(
cal = xcals.get_calendar("XTSE")
def _is_session(dt: str) -> bool:
"""Check if date is a trading session.
Workaround for exchange_calendars bug with Pandas 3 where
is_session() fails due to ns/us unit mismatch in _date_oob.
"""
return to_datetime(dt) in cal.sessions
if date is None:
EOD_URL = BASE_URL + f"{symbol}&dnld=1#quotes"
else:
date = check_weekday(date) # type: ignore
if cal.is_session(date) is False: # type: ignore
if _is_session(date) is False: # type: ignore
date = (to_datetime(date) + timedelta(days=1)).strftime("%Y-%m-%d") # type: ignore
date = check_weekday(date) # type: ignore
if cal.is_session(date=date) is False: # type: ignore
if _is_session(date) is False: # type: ignore
date = (to_datetime(date) + timedelta(days=1)).strftime("%Y-%m-%d") # type: ignore
EOD_URL = BASE_URL + f"{symbol}&from={date}&to={date}&dnld=1#quotes"

View File

@@ -128,35 +128,35 @@ class YFinanceOptionsChainsFetcher(
underlying_output: dict = {
"symbol": symbol,
"name": underlying.get("longName"),
"exchange": underlying.get("fullExchangeName"),
"exchange_tz": underlying.get("exchangeTimezoneName"),
"currency": underlying.get("currency"),
"bid": underlying.get("bid"),
"bid_size": underlying.get("bidSize"),
"ask": underlying.get("ask"),
"ask_size": underlying.get("askSize"),
"last_price": underlying.get(
"postMarketPrice", underlying.get("regularMarketPrice")
"name": underlying.get("longName"), # type: ignore
"exchange": underlying.get("fullExchangeName"), # type: ignore
"exchange_tz": underlying.get("exchangeTimezoneName"), # type: ignore
"currency": underlying.get("currency"), # type: ignore
"bid": underlying.get("bid"), # type: ignore
"bid_size": underlying.get("bidSize"), # type: ignore
"ask": underlying.get("ask"), # type: ignore
"ask_size": underlying.get("askSize"), # type: ignore
"last_price": underlying.get( # type: ignore
"postMarketPrice", underlying.get("regularMarketPrice") # type: ignore
),
"open": underlying.get("regularMarketOpen"),
"high": underlying.get("regularMarketDayHigh"),
"low": underlying.get("regularMarketDayLow"),
"close": underlying.get("regularMarketPrice"),
"prev_close": underlying.get("regularMarketPreviousClose"),
"change": underlying.get("regularMarketChange"),
"change_percent": underlying.get("regularMarketChangePercent"),
"volume": underlying.get("regularMarketVolume"),
"dividend_yield": float(underlying.get("dividendYield", 0)) / 100,
"dividend_yield_ttm": underlying.get("trailingAnnualDividendYield"),
"year_high": underlying.get("fiftyTwoWeekHigh"),
"year_low": underlying.get("fiftyTwoWeekLow"),
"ma_50": underlying.get("fiftyDayAverage"),
"ma_200": underlying.get("twoHundredDayAverage"),
"volume_avg_10d": underlying.get("averageDailyVolume10Day"),
"volume_avg_3m": underlying.get("averageDailyVolume3Month"),
"market_cap": underlying.get("marketCap"),
"shares_outstanding": underlying.get("sharesOutstanding"),
"open": underlying.get("regularMarketOpen"), # type: ignore
"high": underlying.get("regularMarketDayHigh"), # type: ignore
"low": underlying.get("regularMarketDayLow"), # type: ignore
"close": underlying.get("regularMarketPrice"), # type: ignore
"prev_close": underlying.get("regularMarketPreviousClose"), # type: ignore
"change": underlying.get("regularMarketChange"), # type: ignore
"change_percent": underlying.get("regularMarketChangePercent"), # type: ignore
"volume": underlying.get("regularMarketVolume"), # type: ignore
"dividend_yield": float(underlying.get("dividendYield", 0)) / 100, # type: ignore
"dividend_yield_ttm": underlying.get("trailingAnnualDividendYield"), # type: ignore
"year_high": underlying.get("fiftyTwoWeekHigh"), # type: ignore
"year_low": underlying.get("fiftyTwoWeekLow"), # type: ignore
"ma_50": underlying.get("fiftyDayAverage"), # type: ignore
"ma_200": underlying.get("twoHundredDayAverage"), # type: ignore
"volume_avg_10d": underlying.get("averageDailyVolume10Day"), # type: ignore
"volume_avg_3m": underlying.get("averageDailyVolume3Month"), # type: ignore
"market_cap": underlying.get("marketCap"), # type: ignore
"shares_outstanding": underlying.get("sharesOutstanding"), # type: ignore
}
return {"underlying": underlying_output, "chains": chains_output}
@@ -178,9 +178,7 @@ class YFinanceOptionsChainsFetcher(
records = data.get("chains", [])
output = DataFrame(records)
for col in ["volume", "openInterest"]:
output[col] = (
output[col].infer_objects(copy=False).replace({nan: 0}).astype("int64")
)
output[col] = output[col].infer_objects().replace({nan: 0}).astype("int64")
output = output.replace({nan: None})

View File

@@ -166,7 +166,7 @@ async def get_defined_screener(
offset = 0
response = yf.screen(
name,
name, # type: ignore
size=250,
offset=offset,
)
@@ -182,7 +182,7 @@ async def get_defined_screener(
break
offset = len(results)
res = yf.screen(
name,
name, # type: ignore
size=250,
offset=offset,
)
@@ -286,8 +286,8 @@ async def get_futures_quotes(symbols: list) -> "DataFrame":
df = DataFrame([d.model_dump() for d in data]) # type: ignore
prices = df[["symbol", "bid", "ask", "prev_close"]].copy()
prices.loc[:, "price"] = round((prices.ask + prices.bid) / 2, 2)
prices.price = prices.price.fillna(prices.prev_close)
prices["price"] = round((prices.ask + prices.bid) / 2, 2)
prices["price"] = prices.price.fillna(prices.prev_close)
prices["expiration"] = [get_expiration_month(symbol) for symbol in prices.symbol]
return prices[["expiration", "price"]] # type: ignore
@@ -387,7 +387,7 @@ async def get_futures_curve( # pylint: disable=too-many-return-statements
flattened_data = flattened_data.sort_values(
by=["date", "expiration"]
).reset_index(drop=True)
flattened_data.loc[:, "date"] = flattened_data["date"].dt.strftime("%Y-%m-%d")
flattened_data["date"] = flattened_data["date"].dt.strftime("%Y-%m-%d")
return flattened_data
@@ -544,21 +544,21 @@ def yf_download( # pylint: disable=too-many-positional-arguments
threads=False,
**kwargs,
)
if hasattr(data.index, "tz") and data.index.tz is not None:
data = data.tz_convert(None)
if hasattr(data.index, "tz") and data.index.tz is not None: # type: ignore
data = data.tz_convert(None) # type: ignore
except ValueError as exc:
raise EmptyDataError() from exc
tickers = symbol.split(",")
if len(tickers) == 1:
data = data.get(symbol, DataFrame())
data = data.get(symbol, DataFrame()) # type: ignore
elif len(tickers) > 1:
_data = DataFrame()
for ticker in tickers:
temp = data[ticker].copy().dropna(how="all")
temp = data[ticker].copy().dropna(how="all") # type: ignore
if len(temp) > 0:
temp.loc[:, "symbol"] = ticker
temp["symbol"] = ticker
temp = temp.reset_index().rename(
columns={"Date": "date", "Datetime": "date", "index": "date"}
)
@@ -568,10 +568,10 @@ def yf_download( # pylint: disable=too-many-positional-arguments
_data = _data.set_index(index_keys).sort_index()
data = _data
if data.empty:
if data.empty: # type: ignore
raise EmptyDataError()
data = data.reset_index()
data = data.reset_index() # type: ignore
data = data.rename(columns={"Date": "date", "Datetime": "date"})
data["date"] = data["date"].apply(to_datetime)
data = data[data["Open"] > 0]

View File

@@ -1,4 +1,4 @@
# This file is automatically @generated by Poetry 2.3.0 and should not be changed by hand.
# This file is automatically @generated by Poetry 2.3.1 and should not be changed by hand.
[[package]]
name = "aiohappyeyeballs"
@@ -525,24 +525,22 @@ files = [
[[package]]
name = "curl-cffi"
version = "0.14.0"
version = "0.13.0"
description = "libcurl ffi bindings for Python, with impersonation support."
optional = false
python-versions = ">=3.10"
python-versions = ">=3.9"
groups = ["main"]
files = [
{file = "curl_cffi-0.14.0-cp39-abi3-macosx_14_0_arm64.whl", hash = "sha256:e35e89c6a69872f9749d6d5fda642ed4fc159619329e99d577d0104c9aad5893"},
{file = "curl_cffi-0.14.0-cp39-abi3-macosx_15_0_x86_64.whl", hash = "sha256:5945478cd28ad7dfb5c54473bcfb6743ee1d66554d57951fdf8fc0e7d8cf4e45"},
{file = "curl_cffi-0.14.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c42e8fa3c667db9ccd2e696ee47adcd3cd5b0838d7282f3fc45f6c0ef3cfdfa7"},
{file = "curl_cffi-0.14.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:060fe2c99c41d3cb7f894de318ddf4b0301b08dca70453d769bd4e74b36b8483"},
{file = "curl_cffi-0.14.0-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b158c41a25388690dd0d40b5bc38d1e0f512135f17fdb8029868cbc1993d2e5b"},
{file = "curl_cffi-0.14.0-cp39-abi3-manylinux_2_28_i686.whl", hash = "sha256:1439fbef3500fb723333c826adf0efb0e2e5065a703fb5eccce637a2250db34a"},
{file = "curl_cffi-0.14.0-cp39-abi3-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e7176f2c2d22b542e3cf261072a81deb018cfa7688930f95dddef215caddb469"},
{file = "curl_cffi-0.14.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:03f21ade2d72978c2bb8670e9b6de5260e2755092b02d94b70b906813662998d"},
{file = "curl_cffi-0.14.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:58ebf02de64ee5c95613209ddacb014c2d2f86298d7080c0a1c12ed876ee0690"},
{file = "curl_cffi-0.14.0-cp39-abi3-win_amd64.whl", hash = "sha256:6e503f9a103f6ae7acfb3890c843b53ec030785a22ae7682a22cc43afb94123e"},
{file = "curl_cffi-0.14.0-cp39-abi3-win_arm64.whl", hash = "sha256:2eed50a969201605c863c4c31269dfc3e0da52916086ac54553cfa353022425c"},
{file = "curl_cffi-0.14.0.tar.gz", hash = "sha256:5ffbc82e59f05008ec08ea432f0e535418823cda44178ee518906a54f27a5f0f"},
{file = "curl_cffi-0.13.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:434cadbe8df2f08b2fc2c16dff2779fb40b984af99c06aa700af898e185bb9db"},
{file = "curl_cffi-0.13.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:59afa877a9ae09efa04646a7d068eeea48915a95d9add0a29854e7781679fcd7"},
{file = "curl_cffi-0.13.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d06ed389e45a7ca97b17c275dbedd3d6524560270e675c720e93a2018a766076"},
{file = "curl_cffi-0.13.0-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4e0de45ab3b7a835c72bd53640c2347415111b43421b5c7a1a0b18deae2e541"},
{file = "curl_cffi-0.13.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8eb4083371bbb94e9470d782de235fb5268bf43520de020c9e5e6be8f395443f"},
{file = "curl_cffi-0.13.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:28911b526e8cd4aa0e5e38401bfe6887e8093907272f1f67ca22e6beb2933a51"},
{file = "curl_cffi-0.13.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6d433ffcb455ab01dd0d7bde47109083aa38b59863aa183d29c668ae4c96bf8e"},
{file = "curl_cffi-0.13.0-cp39-abi3-win_amd64.whl", hash = "sha256:66a6b75ce971de9af64f1b6812e275f60b88880577bac47ef1fa19694fa21cd3"},
{file = "curl_cffi-0.13.0-cp39-abi3-win_arm64.whl", hash = "sha256:d438a3b45244e874794bc4081dc1e356d2bb926dcc7021e5a8fef2e2105ef1d8"},
{file = "curl_cffi-0.13.0.tar.gz", hash = "sha256:62ecd90a382bd5023750e3606e0aa7cb1a3a8ba41c14270b8e5e149ebf72c5ca"},
]
[package.dependencies]
@@ -551,9 +549,9 @@ cffi = ">=1.12.0"
[package.extras]
build = ["cibuildwheel", "wheel"]
dev = ["charset_normalizer (>=3.3.2,<4.0)", "coverage (>=6.4.1,<7.0)", "cryptography (>=42.0.5,<43.0)", "httpx (==0.23.1)", "mypy (>=1.9.0,<2.0)", "pytest (>=8.1.1,<9.0)", "pytest-asyncio (>=0.23.6,<1.0)", "pytest-trio (>=0.8.0,<1.0)", "ruff (>=0.3.5,<1.0)", "trio (>=0.25.0,<1.0)", "trustme (>=1.1.0,<2.0)", "typing_extensions", "uvicorn (>=0.29.0,<1.0)", "websockets (>=14.0)"]
dev = ["charset_normalizer (>=3.3.2,<4.0)", "coverage (>=6.4.1,<7.0)", "cryptography (>=42.0.5,<43.0)", "httpx (==0.23.1)", "mypy (>=1.9.0,<2.0)", "pytest (>=8.1.1,<9.0)", "pytest-asyncio (>=0.23.6,<1.0)", "pytest-trio (>=0.8.0,<1.0)", "ruff (>=0.3.5,<1.0)", "trio (>=0.25.0,<1.0)", "trustme (>=1.1.0,<2.0)", "typing_extensions", "uvicorn (>=0.29.0,<1.0)", "websockets (>=12.0,<13.0)"]
extra = ["lxml_html_clean", "markdownify (>=1.1.0)", "readability-lxml (>=0.8.1)"]
test = ["charset_normalizer (>=3.3.2,<4.0)", "cryptography (>=42.0.5,<43.0)", "fastapi (>=0.110.0,<1.0)", "httpx (==0.23.1)", "proxy.py (>=2.4.3,<3.0)", "pytest (>=8.1.1,<9.0)", "pytest-asyncio (>=0.23.6,<1.0)", "pytest-trio (>=0.8.0,<1.0)", "python-multipart (>=0.0.9,<1.0)", "trio (>=0.25.0,<1.0)", "trustme (>=1.1.0,<2.0)", "typing_extensions", "uvicorn (>=0.29.0,<1.0)", "websockets (>=14.0)"]
test = ["charset_normalizer (>=3.3.2,<4.0)", "cryptography (>=42.0.5,<43.0)", "fastapi (==0.110.0)", "httpx (==0.23.1)", "proxy.py (>=2.4.3,<3.0)", "pytest (>=8.1.1,<9.0)", "pytest-asyncio (>=0.23.6,<1.0)", "pytest-trio (>=0.8.0,<1.0)", "python-multipart (>=0.0.9,<1.0)", "trio (>=0.25.0,<1.0)", "trustme (>=1.1.0,<2.0)", "typing_extensions", "uvicorn (>=0.29.0,<1.0)", "websockets (>=12.0,<13.0)"]
[[package]]
name = "exceptiongroup"
@@ -2206,19 +2204,19 @@ propcache = ">=0.2.1"
[[package]]
name = "yfinance"
version = "0.2.66"
version = "1.1.0"
description = "Download market data from Yahoo! Finance API"
optional = false
python-versions = "*"
groups = ["main"]
files = [
{file = "yfinance-0.2.66-py2.py3-none-any.whl", hash = "sha256:511a1a40a687f277aae3a02543009a8aeaa292fce5509671f58915078aebb5c7"},
{file = "yfinance-0.2.66.tar.gz", hash = "sha256:fae354cc1649109444b2c84194724afcc52c2a7799551ce44c739424ded6af9c"},
{file = "yfinance-1.1.0-py2.py3-none-any.whl", hash = "sha256:e610fec1d2b052e3b8f2cf44bdcff014bcf15458a9b072d5a3e02507e20d69d2"},
{file = "yfinance-1.1.0.tar.gz", hash = "sha256:1e852ce10a5d6679200efa2b09ed3f3b01dbe84505e2c1c139be7d2b3a597b10"},
]
[package.dependencies]
beautifulsoup4 = ">=4.11.1"
curl_cffi = ">=0.7"
curl_cffi = ">=0.7,<0.14"
frozendict = ">=2.3.4"
multitasking = ">=0.0.7"
numpy = ">=1.16.5"
@@ -2257,4 +2255,4 @@ type = ["pytest-mypy"]
[metadata]
lock-version = "2.1"
python-versions = ">=3.10,<3.14"
content-hash = "151203e6c62e409eb6b3a853b8855a797ec3a86174e49c4c293763b376cbc9ef"
content-hash = "a84f95432f8265f69669a2dc7f0f07b5f69435d6dd75113ea9a08e0483fabb4a"

View File

@@ -9,7 +9,7 @@ packages = [{ include = "openbb_yfinance" }]
[tool.poetry.dependencies]
python = ">=3.10,<3.14"
yfinance = "^0.2.66"
yfinance = "^1.1.0"
openbb-core = "^1.5.8"
[build-system]