mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-10-27 12:40:35 +00:00
[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:
@@ -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
|
||||
|
||||
@@ -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
405
openbb_platform/core/poetry.lock
generated
vendored
@@ -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"
|
||||
|
||||
4
openbb_platform/core/pyproject.toml
vendored
4
openbb_platform/core/pyproject.toml
vendored
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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 = {}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"]
|
||||
|
||||
|
||||
@@ -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_)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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": "",
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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"]
|
||||
]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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[
|
||||
[
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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
|
||||
]
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -176,7 +176,7 @@ class FamaFrenchRegionalPortfolioReturnsFetcher(
|
||||
)
|
||||
.copy()
|
||||
)
|
||||
flattened_data.loc[:, "measure"] = query.measure
|
||||
flattened_data["measure"] = query.measure
|
||||
|
||||
return AnnotatedResult(
|
||||
result=[
|
||||
|
||||
@@ -180,7 +180,7 @@ class FamaFrenchUSPortfolioReturnsFetcher(
|
||||
)
|
||||
.copy()
|
||||
)
|
||||
flattened_data.loc[:, "measure"] = query.measure
|
||||
flattened_data["measure"] = query.measure
|
||||
|
||||
return AnnotatedResult(
|
||||
result=[
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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})
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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
|
||||
]
|
||||
|
||||
@@ -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")
|
||||
]
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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]
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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})
|
||||
|
||||
@@ -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')"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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})
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
42
openbb_platform/providers/yfinance/poetry.lock
generated
vendored
42
openbb_platform/providers/yfinance/poetry.lock
generated
vendored
@@ -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"
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user