From 11e220d51e197436d98d3df605ddf5a565b6f849 Mon Sep 17 00:00:00 2001 From: Joshua Briggs Date: Fri, 10 Jan 2025 16:11:13 +0000 Subject: [PATCH 1/2] feat: yfinance doc added --- .../yfinance-openai-langgraph/.python-version | 1 + .../yfinance-openai-langgraph/README.md | 0 .../yfinance-openai-langgraph/pyproject.toml | 14 + .../agents/yfinance-openai-langgraph/uv.lock | 1253 ++++++ .../yfinance-stocks.ipynb | 3730 +++++++++++++++++ 5 files changed, 4998 insertions(+) create mode 100644 gen-ai/openai/agents/yfinance-openai-langgraph/.python-version create mode 100644 gen-ai/openai/agents/yfinance-openai-langgraph/README.md create mode 100644 gen-ai/openai/agents/yfinance-openai-langgraph/pyproject.toml create mode 100644 gen-ai/openai/agents/yfinance-openai-langgraph/uv.lock create mode 100644 gen-ai/openai/agents/yfinance-openai-langgraph/yfinance-stocks.ipynb diff --git a/gen-ai/openai/agents/yfinance-openai-langgraph/.python-version b/gen-ai/openai/agents/yfinance-openai-langgraph/.python-version new file mode 100644 index 0000000..56bb660 --- /dev/null +++ b/gen-ai/openai/agents/yfinance-openai-langgraph/.python-version @@ -0,0 +1 @@ +3.12.7 diff --git a/gen-ai/openai/agents/yfinance-openai-langgraph/README.md b/gen-ai/openai/agents/yfinance-openai-langgraph/README.md new file mode 100644 index 0000000..e69de29 diff --git a/gen-ai/openai/agents/yfinance-openai-langgraph/pyproject.toml b/gen-ai/openai/agents/yfinance-openai-langgraph/pyproject.toml new file mode 100644 index 0000000..06ac4e9 --- /dev/null +++ b/gen-ai/openai/agents/yfinance-openai-langgraph/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "example" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.12.7" +dependencies = [ + "ipykernel>=6.29.5", + "langchain-openai>=0.2.14", + "langgraph>=0.2.61", + "openai>=1.59.6", + "typing-extensions>=4.12.2", + "yfinance>=0.2.51", +] diff --git a/gen-ai/openai/agents/yfinance-openai-langgraph/uv.lock b/gen-ai/openai/agents/yfinance-openai-langgraph/uv.lock new file mode 100644 index 0000000..6a0b9b2 --- /dev/null +++ b/gen-ai/openai/agents/yfinance-openai-langgraph/uv.lock @@ -0,0 +1,1253 @@ +version = 1 +requires-python = ">=3.12.7" + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "anyio" +version = "4.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, +] + +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 }, +] + +[[package]] +name = "asttokens" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/ca/824b1195773ce6166d388573fc106ce56d4a805bd7427b624e063596ec58/beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", size = 581181 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed", size = 147925 }, +] + +[[package]] +name = "certifi" +version = "2024.12.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 }, +] + +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, + { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, + { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, + { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, + { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, + { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, + { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, + { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, + { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, + { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, + { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, + { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "comm" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 }, +] + +[[package]] +name = "debugpy" +version = "1.8.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/e7/666f4c9b0e24796af50aadc28d36d21c2e01e831a934535f956e09b3650c/debugpy-1.8.11.tar.gz", hash = "sha256:6ad2688b69235c43b020e04fecccdf6a96c8943ca9c2fb340b8adc103c655e57", size = 1640124 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/ae/2cf26f3111e9d94384d9c01e9d6170188b0aeda15b60a4ac6457f7c8a26f/debugpy-1.8.11-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:84e511a7545d11683d32cdb8f809ef63fc17ea2a00455cc62d0a4dbb4ed1c308", size = 2498756 }, + { url = "https://files.pythonhosted.org/packages/b0/16/ec551789d547541a46831a19aa15c147741133da188e7e6acf77510545a7/debugpy-1.8.11-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce291a5aca4985d82875d6779f61375e959208cdf09fcec40001e65fb0a54768", size = 4219136 }, + { url = "https://files.pythonhosted.org/packages/72/6f/b2b3ce673c55f882d27a6eb04a5f0c68bcad6b742ac08a86d8392ae58030/debugpy-1.8.11-cp312-cp312-win32.whl", hash = "sha256:28e45b3f827d3bf2592f3cf7ae63282e859f3259db44ed2b129093ca0ac7940b", size = 5224440 }, + { url = "https://files.pythonhosted.org/packages/77/09/b1f05be802c1caef5b3efc042fc6a7cadd13d8118b072afd04a9b9e91e06/debugpy-1.8.11-cp312-cp312-win_amd64.whl", hash = "sha256:44b1b8e6253bceada11f714acf4309ffb98bfa9ac55e4fce14f9e5d4484287a1", size = 5264578 }, + { url = "https://files.pythonhosted.org/packages/2e/66/931dc2479aa8fbf362dc6dcee707d895a84b0b2d7b64020135f20b8db1ed/debugpy-1.8.11-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:8988f7163e4381b0da7696f37eec7aca19deb02e500245df68a7159739bbd0d3", size = 2483651 }, + { url = "https://files.pythonhosted.org/packages/10/07/6c171d0fe6b8d237e35598b742f20ba062511b3a4631938cc78eefbbf847/debugpy-1.8.11-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c1f6a173d1140e557347419767d2b14ac1c9cd847e0b4c5444c7f3144697e4e", size = 4213770 }, + { url = "https://files.pythonhosted.org/packages/89/f1/0711da6ac250d4fe3bf7b3e9b14b4a86e82a98b7825075c07e19bab8da3d/debugpy-1.8.11-cp313-cp313-win32.whl", hash = "sha256:bb3b15e25891f38da3ca0740271e63ab9db61f41d4d8541745cfc1824252cb28", size = 5223911 }, + { url = "https://files.pythonhosted.org/packages/56/98/5e27fa39050749ed460025bcd0034a0a5e78a580a14079b164cc3abdeb98/debugpy-1.8.11-cp313-cp313-win_amd64.whl", hash = "sha256:d8768edcbeb34da9e11bcb8b5c2e0958d25218df7a6e56adf415ef262cd7b6d1", size = 5264166 }, + { url = "https://files.pythonhosted.org/packages/77/0a/d29a5aacf47b4383ed569b8478c02d59ee3a01ad91224d2cff8562410e43/debugpy-1.8.11-py2.py3-none-any.whl", hash = "sha256:0e22f846f4211383e6a416d04b4c13ed174d24cc5d43f5fd52e7821d0ebc8920", size = 5226874 }, +] + +[[package]] +name = "decorator" +version = "5.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/0c/8d907af351aa16b42caae42f9d6aa37b900c67308052d10fdce809f8d952/decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", size = 35016 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, +] + +[[package]] +name = "example" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "ipykernel" }, + { name = "langchain-openai" }, + { name = "langgraph" }, + { name = "openai" }, + { name = "typing-extensions" }, + { name = "yfinance" }, +] + +[package.metadata] +requires-dist = [ + { name = "ipykernel", specifier = ">=6.29.5" }, + { name = "langchain-openai", specifier = ">=0.2.14" }, + { name = "langgraph", specifier = ">=0.2.61" }, + { name = "openai", specifier = ">=1.59.6" }, + { name = "typing-extensions", specifier = ">=4.12.2" }, + { name = "yfinance", specifier = ">=0.2.51" }, +] + +[[package]] +name = "executing" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/e3/7d45f492c2c4a0e8e0fad57d081a7c8a0286cdd86372b070cca1ec0caa1e/executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab", size = 977485 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf", size = 25805 }, +] + +[[package]] +name = "frozendict" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/59/19eb300ba28e7547538bdf603f1c6c34793240a90e1a7b61b65d8517e35e/frozendict-2.4.6.tar.gz", hash = "sha256:df7cd16470fbd26fc4969a208efadc46319334eb97def1ddf48919b351192b8e", size = 316416 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl", hash = "sha256:d065db6a44db2e2375c23eac816f1a022feb2fa98cbb50df44a9e83700accbea", size = 16148 }, + { url = "https://files.pythonhosted.org/packages/ba/d0/d482c39cee2ab2978a892558cf130681d4574ea208e162da8958b31e9250/frozendict-2.4.6-py312-none-any.whl", hash = "sha256:49344abe90fb75f0f9fdefe6d4ef6d4894e640fadab71f11009d52ad97f370b9", size = 16146 }, + { url = "https://files.pythonhosted.org/packages/a5/8e/b6bf6a0de482d7d7d7a2aaac8fdc4a4d0bb24a809f5ddd422aa7060eb3d2/frozendict-2.4.6-py313-none-any.whl", hash = "sha256:7134a2bb95d4a16556bb5f2b9736dceb6ea848fa5b6f3f6c2d6dba93b44b4757", size = 16146 }, +] + +[[package]] +name = "h11" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, +] + +[[package]] +name = "html5lib" +version = "1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/b6/b55c3f49042f1df3dcd422b7f224f939892ee94f22abcf503a9b7339eaf2/html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f", size = 272215 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d", size = 112173 }, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "ipykernel" +version = "6.29.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "platform_system == 'Darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173 }, +] + +[[package]] +name = "ipython" +version = "8.31.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/35/6f90fdddff7a08b7b715fccbd2427b5212c9525cd043d26fdc45bee0708d/ipython-8.31.0.tar.gz", hash = "sha256:b6a2274606bec6166405ff05e54932ed6e5cfecaca1fc05f2cacde7bb074d70b", size = 5501011 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/60/d0feb6b6d9fe4ab89fe8fe5b47cbf6cd936bfd9f1e7ffa9d0015425aeed6/ipython-8.31.0-py3-none-any.whl", hash = "sha256:46ec58f8d3d076a61d128fe517a51eb730e3aaf0c184ea8c17d16e366660c6a6", size = 821583 }, +] + +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, +] + +[[package]] +name = "jiter" +version = "0.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/70/90bc7bd3932e651486861df5c8ffea4ca7c77d28e8532ddefe2abc561a53/jiter-0.8.2.tar.gz", hash = "sha256:cd73d3e740666d0e639f678adb176fad25c1bcbdae88d8d7b857e1783bb4212d", size = 163007 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/17/c8747af8ea4e045f57d6cfd6fc180752cab9bc3de0e8a0c9ca4e8af333b1/jiter-0.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e6ec2be506e7d6f9527dae9ff4b7f54e68ea44a0ef6b098256ddf895218a2f8f", size = 302027 }, + { url = "https://files.pythonhosted.org/packages/3c/c1/6da849640cd35a41e91085723b76acc818d4b7d92b0b6e5111736ce1dd10/jiter-0.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76e324da7b5da060287c54f2fabd3db5f76468006c811831f051942bf68c9d44", size = 310326 }, + { url = "https://files.pythonhosted.org/packages/06/99/a2bf660d8ccffee9ad7ed46b4f860d2108a148d0ea36043fd16f4dc37e94/jiter-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:180a8aea058f7535d1c84183c0362c710f4750bef66630c05f40c93c2b152a0f", size = 334242 }, + { url = "https://files.pythonhosted.org/packages/a7/5f/cea1c17864828731f11427b9d1ab7f24764dbd9aaf4648a7f851164d2718/jiter-0.8.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:025337859077b41548bdcbabe38698bcd93cfe10b06ff66617a48ff92c9aec60", size = 356654 }, + { url = "https://files.pythonhosted.org/packages/e9/13/62774b7e5e7f5d5043efe1d0f94ead66e6d0f894ae010adb56b3f788de71/jiter-0.8.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecff0dc14f409599bbcafa7e470c00b80f17abc14d1405d38ab02e4b42e55b57", size = 379967 }, + { url = "https://files.pythonhosted.org/packages/ec/fb/096b34c553bb0bd3f2289d5013dcad6074948b8d55212aa13a10d44c5326/jiter-0.8.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffd9fee7d0775ebaba131f7ca2e2d83839a62ad65e8e02fe2bd8fc975cedeb9e", size = 389252 }, + { url = "https://files.pythonhosted.org/packages/17/61/beea645c0bf398ced8b199e377b61eb999d8e46e053bb285c91c3d3eaab0/jiter-0.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14601dcac4889e0a1c75ccf6a0e4baf70dbc75041e51bcf8d0e9274519df6887", size = 345490 }, + { url = "https://files.pythonhosted.org/packages/d5/df/834aa17ad5dcc3cf0118821da0a0cf1589ea7db9832589278553640366bc/jiter-0.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92249669925bc1c54fcd2ec73f70f2c1d6a817928480ee1c65af5f6b81cdf12d", size = 376991 }, + { url = "https://files.pythonhosted.org/packages/67/80/87d140399d382fb4ea5b3d56e7ecaa4efdca17cd7411ff904c1517855314/jiter-0.8.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e725edd0929fa79f8349ab4ec7f81c714df51dc4e991539a578e5018fa4a7152", size = 510822 }, + { url = "https://files.pythonhosted.org/packages/5c/37/3394bb47bac1ad2cb0465601f86828a0518d07828a650722e55268cdb7e6/jiter-0.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bf55846c7b7a680eebaf9c3c48d630e1bf51bdf76c68a5f654b8524335b0ad29", size = 503730 }, + { url = "https://files.pythonhosted.org/packages/f9/e2/253fc1fa59103bb4e3aa0665d6ceb1818df1cd7bf3eb492c4dad229b1cd4/jiter-0.8.2-cp312-cp312-win32.whl", hash = "sha256:7efe4853ecd3d6110301665a5178b9856be7e2a9485f49d91aa4d737ad2ae49e", size = 203375 }, + { url = "https://files.pythonhosted.org/packages/41/69/6d4bbe66b3b3b4507e47aa1dd5d075919ad242b4b1115b3f80eecd443687/jiter-0.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:83c0efd80b29695058d0fd2fa8a556490dbce9804eac3e281f373bbc99045f6c", size = 204740 }, + { url = "https://files.pythonhosted.org/packages/6c/b0/bfa1f6f2c956b948802ef5a021281978bf53b7a6ca54bb126fd88a5d014e/jiter-0.8.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ca1f08b8e43dc3bd0594c992fb1fd2f7ce87f7bf0d44358198d6da8034afdf84", size = 301190 }, + { url = "https://files.pythonhosted.org/packages/a4/8f/396ddb4e292b5ea57e45ade5dc48229556b9044bad29a3b4b2dddeaedd52/jiter-0.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5672a86d55416ccd214c778efccf3266b84f87b89063b582167d803246354be4", size = 309334 }, + { url = "https://files.pythonhosted.org/packages/7f/68/805978f2f446fa6362ba0cc2e4489b945695940656edd844e110a61c98f8/jiter-0.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58dc9bc9767a1101f4e5e22db1b652161a225874d66f0e5cb8e2c7d1c438b587", size = 333918 }, + { url = "https://files.pythonhosted.org/packages/b3/99/0f71f7be667c33403fa9706e5b50583ae5106d96fab997fa7e2f38ee8347/jiter-0.8.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37b2998606d6dadbb5ccda959a33d6a5e853252d921fec1792fc902351bb4e2c", size = 356057 }, + { url = "https://files.pythonhosted.org/packages/8d/50/a82796e421a22b699ee4d2ce527e5bcb29471a2351cbdc931819d941a167/jiter-0.8.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ab9a87f3784eb0e098f84a32670cfe4a79cb6512fd8f42ae3d0709f06405d18", size = 379790 }, + { url = "https://files.pythonhosted.org/packages/3c/31/10fb012b00f6d83342ca9e2c9618869ab449f1aa78c8f1b2193a6b49647c/jiter-0.8.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79aec8172b9e3c6d05fd4b219d5de1ac616bd8da934107325a6c0d0e866a21b6", size = 388285 }, + { url = "https://files.pythonhosted.org/packages/c8/81/f15ebf7de57be488aa22944bf4274962aca8092e4f7817f92ffa50d3ee46/jiter-0.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:711e408732d4e9a0208008e5892c2966b485c783cd2d9a681f3eb147cf36c7ef", size = 344764 }, + { url = "https://files.pythonhosted.org/packages/b3/e8/0cae550d72b48829ba653eb348cdc25f3f06f8a62363723702ec18e7be9c/jiter-0.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:653cf462db4e8c41995e33d865965e79641ef45369d8a11f54cd30888b7e6ff1", size = 376620 }, + { url = "https://files.pythonhosted.org/packages/b8/50/e5478ff9d82534a944c03b63bc217c5f37019d4a34d288db0f079b13c10b/jiter-0.8.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:9c63eaef32b7bebac8ebebf4dabebdbc6769a09c127294db6babee38e9f405b9", size = 510402 }, + { url = "https://files.pythonhosted.org/packages/8e/1e/3de48bbebbc8f7025bd454cedc8c62378c0e32dd483dece5f4a814a5cb55/jiter-0.8.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:eb21aaa9a200d0a80dacc7a81038d2e476ffe473ffdd9c91eb745d623561de05", size = 503018 }, + { url = "https://files.pythonhosted.org/packages/d5/cd/d5a5501d72a11fe3e5fd65c78c884e5164eefe80077680533919be22d3a3/jiter-0.8.2-cp313-cp313-win32.whl", hash = "sha256:789361ed945d8d42850f919342a8665d2dc79e7e44ca1c97cc786966a21f627a", size = 203190 }, + { url = "https://files.pythonhosted.org/packages/51/bf/e5ca301245ba951447e3ad677a02a64a8845b185de2603dabd83e1e4b9c6/jiter-0.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:ab7f43235d71e03b941c1630f4b6e3055d46b6cb8728a17663eaac9d8e83a865", size = 203551 }, + { url = "https://files.pythonhosted.org/packages/2f/3c/71a491952c37b87d127790dd7a0b1ebea0514c6b6ad30085b16bbe00aee6/jiter-0.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b426f72cd77da3fec300ed3bc990895e2dd6b49e3bfe6c438592a3ba660e41ca", size = 308347 }, + { url = "https://files.pythonhosted.org/packages/a0/4c/c02408042e6a7605ec063daed138e07b982fdb98467deaaf1c90950cf2c6/jiter-0.8.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2dd880785088ff2ad21ffee205e58a8c1ddabc63612444ae41e5e4b321b39c0", size = 342875 }, + { url = "https://files.pythonhosted.org/packages/91/61/c80ef80ed8a0a21158e289ef70dac01e351d929a1c30cb0f49be60772547/jiter-0.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:3ac9f578c46f22405ff7f8b1f5848fb753cc4b8377fbec8470a7dc3997ca7566", size = 202374 }, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpointer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", size = 12898 }, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 }, +] + +[[package]] +name = "jupyter-client" +version = "8.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 }, +] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", size = 87629 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 }, +] + +[[package]] +name = "langchain-core" +version = "0.3.29" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpatch" }, + { name = "langsmith" }, + { name = "packaging" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "tenacity" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/05/8fc844c2f79a2c30845de2db948de1cf7c17b94f419f7ae7b616d628a54f/langchain_core-0.3.29.tar.gz", hash = "sha256:773d6aeeb612e7ce3d996c0be403433d8c6a91e77bbb7a7461c13e15cfbe5b06", size = 330785 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/4f/fe1de63f6fc1ac7af3ba4ae12d420af1a19f7893b5fcb72856b9fc67f650/langchain_core-0.3.29-py3-none-any.whl", hash = "sha256:817db1474871611a81105594a3e4d11704949661008e455a10e38ca9ff601a1a", size = 411593 }, +] + +[[package]] +name = "langchain-openai" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "openai" }, + { name = "tiktoken" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e5/fd/8256eba9a159f95a13c5bf7f1f49683de93b3876585b768e6be5dc3a5765/langchain_openai-0.2.14.tar.gz", hash = "sha256:7a514f309e356b182a337c0ed36ab3fbe34d9834a235a3b85cb7f91ae775d978", size = 43647 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/54/63c8264d7dbc3bf31ba61bf97740fdd76386b2d4f9a58f58afd3961ce7d7/langchain_openai-0.2.14-py3-none-any.whl", hash = "sha256:d232496662f79ece9a11caf7d798ba863e559c771bc366814f7688e0fe664fe8", size = 50876 }, +] + +[[package]] +name = "langgraph" +version = "0.2.61" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "langgraph-checkpoint" }, + { name = "langgraph-sdk" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/34/9b/4138fb378cdca747c719015066303532e8be597318d29f7e1b75d6803578/langgraph-0.2.61.tar.gz", hash = "sha256:355aa6b6b3c19505e8b3c5f7bd813ffd59130d48e6aa017c0edf08273f4f42c2", size = 118141 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/d8/724cafff83ea749e6eb0ae48103324675e9308a84c4153947028ea76c8e7/langgraph-0.2.61-py3-none-any.whl", hash = "sha256:615f8bd345bf3a6ac3374ce7b4ecc96549301e598eb0f3e933c73b96af229961", size = 137204 }, +] + +[[package]] +name = "langgraph-checkpoint" +version = "2.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "msgpack" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/64/ac32516240491107d43b62f83313b320a4d655314badb4ef3f35efc38025/langgraph_checkpoint-2.0.9.tar.gz", hash = "sha256:43847d7e385a2d9d2b684155920998e44ed42d2d1780719e4f6111fe3d6db84c", size = 33299 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/63/b2ecb322ffc978e6bcf27e3786a0efa3142c57d58daeb4e4397196117030/langgraph_checkpoint-2.0.9-py3-none-any.whl", hash = "sha256:b546ed6129929b8941ac08af6ce5cd26c8ebe1d25883d3c48638d34ade91ce42", size = 37318 }, +] + +[[package]] +name = "langgraph-sdk" +version = "0.1.48" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "orjson" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/dc/86fd8e3f7f777c7ebfcbcec4bc433a0d4ebc6135e6638d7d856eed60475d/langgraph_sdk-0.1.48.tar.gz", hash = "sha256:a14ddfc0ea444b33fb5a7357ca0359d2d77961b61244a028dd952658d4d6bc92", size = 40536 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/88/95ca5e3ca12659c2d2c26d64c5e481f1fca28b3053e15f5f0aafb3cc5244/langgraph_sdk-0.1.48-py3-none-any.whl", hash = "sha256:2c6c01d48e8eddff7e9688bdbda943ddb107831972667eb08a0c30e3a937fa11", size = 43654 }, +] + +[[package]] +name = "langsmith" +version = "0.2.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "requests-toolbelt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d4/f8/d642c101267101ddeb44f898a98a5700f90c8959a4119c341a9678fe18cc/langsmith-0.2.10.tar.gz", hash = "sha256:153c7b3ccbd823528ff5bec84801e7e50a164e388919fc583252df5b27dd7830", size = 314154 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/91/e72d13f6b57a0ea9d884ab1d3388f544d7fe3354dbe1d4dd67678693a9fd/langsmith-0.2.10-py3-none-any.whl", hash = "sha256:b02f2f174189ff72e54c88b1aa63343defd6f0f676c396a690c63a4b6495dcc2", size = 326432 }, +] + +[[package]] +name = "lxml" +version = "5.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/6b/20c3a4b24751377aaa6307eb230b66701024012c29dd374999cc92983269/lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f", size = 3679318 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/6d/d1f1c5e40c64bf62afd7a3f9b34ce18a586a1cccbf71e783cd0a6d8e8971/lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859", size = 8171753 }, + { url = "https://files.pythonhosted.org/packages/bd/83/26b1864921869784355459f374896dcf8b44d4af3b15d7697e9156cb2de9/lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e", size = 4441955 }, + { url = "https://files.pythonhosted.org/packages/e0/d2/e9bff9fb359226c25cda3538f664f54f2804f4b37b0d7c944639e1a51f69/lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f", size = 5050778 }, + { url = "https://files.pythonhosted.org/packages/88/69/6972bfafa8cd3ddc8562b126dd607011e218e17be313a8b1b9cc5a0ee876/lxml-5.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e", size = 4748628 }, + { url = "https://files.pythonhosted.org/packages/5d/ea/a6523c7c7f6dc755a6eed3d2f6d6646617cad4d3d6d8ce4ed71bfd2362c8/lxml-5.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179", size = 5322215 }, + { url = "https://files.pythonhosted.org/packages/99/37/396fbd24a70f62b31d988e4500f2068c7f3fd399d2fd45257d13eab51a6f/lxml-5.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a", size = 4813963 }, + { url = "https://files.pythonhosted.org/packages/09/91/e6136f17459a11ce1757df864b213efbeab7adcb2efa63efb1b846ab6723/lxml-5.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3", size = 4923353 }, + { url = "https://files.pythonhosted.org/packages/1d/7c/2eeecf87c9a1fca4f84f991067c693e67340f2b7127fc3eca8fa29d75ee3/lxml-5.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1", size = 4740541 }, + { url = "https://files.pythonhosted.org/packages/3b/ed/4c38ba58defca84f5f0d0ac2480fdcd99fc7ae4b28fc417c93640a6949ae/lxml-5.3.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d", size = 5346504 }, + { url = "https://files.pythonhosted.org/packages/a5/22/bbd3995437e5745cb4c2b5d89088d70ab19d4feabf8a27a24cecb9745464/lxml-5.3.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c", size = 4898077 }, + { url = "https://files.pythonhosted.org/packages/0a/6e/94537acfb5b8f18235d13186d247bca478fea5e87d224644e0fe907df976/lxml-5.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99", size = 4946543 }, + { url = "https://files.pythonhosted.org/packages/8d/e8/4b15df533fe8e8d53363b23a41df9be907330e1fa28c7ca36893fad338ee/lxml-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff", size = 4816841 }, + { url = "https://files.pythonhosted.org/packages/1a/e7/03f390ea37d1acda50bc538feb5b2bda6745b25731e4e76ab48fae7106bf/lxml-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a", size = 5417341 }, + { url = "https://files.pythonhosted.org/packages/ea/99/d1133ab4c250da85a883c3b60249d3d3e7c64f24faff494cf0fd23f91e80/lxml-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8", size = 5327539 }, + { url = "https://files.pythonhosted.org/packages/7d/ed/e6276c8d9668028213df01f598f385b05b55a4e1b4662ee12ef05dab35aa/lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d", size = 5012542 }, + { url = "https://files.pythonhosted.org/packages/36/88/684d4e800f5aa28df2a991a6a622783fb73cf0e46235cfa690f9776f032e/lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30", size = 3486454 }, + { url = "https://files.pythonhosted.org/packages/fc/82/ace5a5676051e60355bd8fb945df7b1ba4f4fb8447f2010fb816bfd57724/lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f", size = 3816857 }, + { url = "https://files.pythonhosted.org/packages/94/6a/42141e4d373903bfea6f8e94b2f554d05506dfda522ada5343c651410dc8/lxml-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a", size = 8156284 }, + { url = "https://files.pythonhosted.org/packages/91/5e/fa097f0f7d8b3d113fb7312c6308af702f2667f22644441715be961f2c7e/lxml-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd", size = 4432407 }, + { url = "https://files.pythonhosted.org/packages/2d/a1/b901988aa6d4ff937f2e5cfc114e4ec561901ff00660c3e56713642728da/lxml-5.3.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51", size = 5048331 }, + { url = "https://files.pythonhosted.org/packages/30/0f/b2a54f48e52de578b71bbe2a2f8160672a8a5e103df3a78da53907e8c7ed/lxml-5.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b", size = 4744835 }, + { url = "https://files.pythonhosted.org/packages/82/9d/b000c15538b60934589e83826ecbc437a1586488d7c13f8ee5ff1f79a9b8/lxml-5.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002", size = 5316649 }, + { url = "https://files.pythonhosted.org/packages/e3/ee/ffbb9eaff5e541922611d2c56b175c45893d1c0b8b11e5a497708a6a3b3b/lxml-5.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4", size = 4812046 }, + { url = "https://files.pythonhosted.org/packages/15/ff/7ff89d567485c7b943cdac316087f16b2399a8b997007ed352a1248397e5/lxml-5.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492", size = 4918597 }, + { url = "https://files.pythonhosted.org/packages/c6/a3/535b6ed8c048412ff51268bdf4bf1cf052a37aa7e31d2e6518038a883b29/lxml-5.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3", size = 4738071 }, + { url = "https://files.pythonhosted.org/packages/7a/8f/cbbfa59cb4d4fd677fe183725a76d8c956495d7a3c7f111ab8f5e13d2e83/lxml-5.3.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4", size = 5342213 }, + { url = "https://files.pythonhosted.org/packages/5c/fb/db4c10dd9958d4b52e34d1d1f7c1f434422aeaf6ae2bbaaff2264351d944/lxml-5.3.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367", size = 4893749 }, + { url = "https://files.pythonhosted.org/packages/f2/38/bb4581c143957c47740de18a3281a0cab7722390a77cc6e610e8ebf2d736/lxml-5.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832", size = 4945901 }, + { url = "https://files.pythonhosted.org/packages/fc/d5/18b7de4960c731e98037bd48fa9f8e6e8f2558e6fbca4303d9b14d21ef3b/lxml-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff", size = 4815447 }, + { url = "https://files.pythonhosted.org/packages/97/a8/cd51ceaad6eb849246559a8ef60ae55065a3df550fc5fcd27014361c1bab/lxml-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd", size = 5411186 }, + { url = "https://files.pythonhosted.org/packages/89/c3/1e3dabab519481ed7b1fdcba21dcfb8832f57000733ef0e71cf6d09a5e03/lxml-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb", size = 5324481 }, + { url = "https://files.pythonhosted.org/packages/b6/17/71e9984cf0570cd202ac0a1c9ed5c1b8889b0fc8dc736f5ef0ffb181c284/lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b", size = 5011053 }, + { url = "https://files.pythonhosted.org/packages/69/68/9f7e6d3312a91e30829368c2b3217e750adef12a6f8eb10498249f4e8d72/lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957", size = 3485634 }, + { url = "https://files.pythonhosted.org/packages/7d/db/214290d58ad68c587bd5d6af3d34e56830438733d0d0856c0275fde43652/lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d", size = 3814417 }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, +] + +[[package]] +name = "msgpack" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/d0/7555686ae7ff5731205df1012ede15dd9d927f6227ea151e901c7406af4f/msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e", size = 167260 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/d6/716b7ca1dbde63290d2973d22bbef1b5032ca634c3ff4384a958ec3f093a/msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d", size = 152421 }, + { url = "https://files.pythonhosted.org/packages/70/da/5312b067f6773429cec2f8f08b021c06af416bba340c912c2ec778539ed6/msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2", size = 85277 }, + { url = "https://files.pythonhosted.org/packages/28/51/da7f3ae4462e8bb98af0d5bdf2707f1b8c65a0d4f496e46b6afb06cbc286/msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420", size = 82222 }, + { url = "https://files.pythonhosted.org/packages/33/af/dc95c4b2a49cff17ce47611ca9ba218198806cad7796c0b01d1e332c86bb/msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2", size = 392971 }, + { url = "https://files.pythonhosted.org/packages/f1/54/65af8de681fa8255402c80eda2a501ba467921d5a7a028c9c22a2c2eedb5/msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39", size = 401403 }, + { url = "https://files.pythonhosted.org/packages/97/8c/e333690777bd33919ab7024269dc3c41c76ef5137b211d776fbb404bfead/msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f", size = 385356 }, + { url = "https://files.pythonhosted.org/packages/57/52/406795ba478dc1c890559dd4e89280fa86506608a28ccf3a72fbf45df9f5/msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247", size = 383028 }, + { url = "https://files.pythonhosted.org/packages/e7/69/053b6549bf90a3acadcd8232eae03e2fefc87f066a5b9fbb37e2e608859f/msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c", size = 391100 }, + { url = "https://files.pythonhosted.org/packages/23/f0/d4101d4da054f04274995ddc4086c2715d9b93111eb9ed49686c0f7ccc8a/msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b", size = 394254 }, + { url = "https://files.pythonhosted.org/packages/1c/12/cf07458f35d0d775ff3a2dc5559fa2e1fcd06c46f1ef510e594ebefdca01/msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b", size = 69085 }, + { url = "https://files.pythonhosted.org/packages/73/80/2708a4641f7d553a63bc934a3eb7214806b5b39d200133ca7f7afb0a53e8/msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f", size = 75347 }, + { url = "https://files.pythonhosted.org/packages/c8/b0/380f5f639543a4ac413e969109978feb1f3c66e931068f91ab6ab0f8be00/msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf", size = 151142 }, + { url = "https://files.pythonhosted.org/packages/c8/ee/be57e9702400a6cb2606883d55b05784fada898dfc7fd12608ab1fdb054e/msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330", size = 84523 }, + { url = "https://files.pythonhosted.org/packages/7e/3a/2919f63acca3c119565449681ad08a2f84b2171ddfcff1dba6959db2cceb/msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734", size = 81556 }, + { url = "https://files.pythonhosted.org/packages/7c/43/a11113d9e5c1498c145a8925768ea2d5fce7cbab15c99cda655aa09947ed/msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e", size = 392105 }, + { url = "https://files.pythonhosted.org/packages/2d/7b/2c1d74ca6c94f70a1add74a8393a0138172207dc5de6fc6269483519d048/msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca", size = 399979 }, + { url = "https://files.pythonhosted.org/packages/82/8c/cf64ae518c7b8efc763ca1f1348a96f0e37150061e777a8ea5430b413a74/msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915", size = 383816 }, + { url = "https://files.pythonhosted.org/packages/69/86/a847ef7a0f5ef3fa94ae20f52a4cacf596a4e4a010197fbcc27744eb9a83/msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d", size = 380973 }, + { url = "https://files.pythonhosted.org/packages/aa/90/c74cf6e1126faa93185d3b830ee97246ecc4fe12cf9d2d31318ee4246994/msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434", size = 387435 }, + { url = "https://files.pythonhosted.org/packages/7a/40/631c238f1f338eb09f4acb0f34ab5862c4e9d7eda11c1b685471a4c5ea37/msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c", size = 399082 }, + { url = "https://files.pythonhosted.org/packages/e9/1b/fa8a952be252a1555ed39f97c06778e3aeb9123aa4cccc0fd2acd0b4e315/msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc", size = 69037 }, + { url = "https://files.pythonhosted.org/packages/b6/bc/8bd826dd03e022153bfa1766dcdec4976d6c818865ed54223d71f07862b3/msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f", size = 75140 }, +] + +[[package]] +name = "multitasking" +version = "0.0.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/75/345e196762fc51fb5b4e9504631972b1271a0cb2ba1ce2afe5b185c95b64/multitasking-0.0.11.tar.gz", hash = "sha256:4d6bc3cc65f9b2dca72fb5a787850a88dae8f620c2b36ae9b55248e51bcd6026", size = 8150 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/8a/bb3160e76e844db9e69a413f055818969c8acade64e1a9ac5ce9dfdcf6c1/multitasking-0.0.11-py3-none-any.whl", hash = "sha256:1e5b37a5f8fc1e6cfaafd1a82b6b1cc6d2ed20037d3b89c25a84f499bd7b3dd4", size = 8533 }, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, +] + +[[package]] +name = "numpy" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/fdbf6a7871703df6160b5cf3dd774074b086d278172285c52c2758b76305/numpy-2.2.1.tar.gz", hash = "sha256:45681fd7128c8ad1c379f0ca0776a8b0c6583d2f69889ddac01559dfe4390918", size = 20227662 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/12/b928871c570d4a87ab13d2cc19f8817f17e340d5481621930e76b80ffb7d/numpy-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:694f9e921a0c8f252980e85bce61ebbd07ed2b7d4fa72d0e4246f2f8aa6642ab", size = 20909861 }, + { url = "https://files.pythonhosted.org/packages/3d/c3/59df91ae1d8ad7c5e03efd63fd785dec62d96b0fe56d1f9ab600b55009af/numpy-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3683a8d166f2692664262fd4900f207791d005fb088d7fdb973cc8d663626faa", size = 14095776 }, + { url = "https://files.pythonhosted.org/packages/af/4e/8ed5868efc8e601fb69419644a280e9c482b75691466b73bfaab7d86922c/numpy-2.2.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:780077d95eafc2ccc3ced969db22377b3864e5b9a0ea5eb347cc93b3ea900315", size = 5126239 }, + { url = "https://files.pythonhosted.org/packages/1a/74/dd0bbe650d7bc0014b051f092f2de65e34a8155aabb1287698919d124d7f/numpy-2.2.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:55ba24ebe208344aa7a00e4482f65742969a039c2acfcb910bc6fcd776eb4355", size = 6659296 }, + { url = "https://files.pythonhosted.org/packages/7f/11/4ebd7a3f4a655764dc98481f97bd0a662fb340d1001be6050606be13e162/numpy-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b1d07b53b78bf84a96898c1bc139ad7f10fda7423f5fd158fd0f47ec5e01ac7", size = 14047121 }, + { url = "https://files.pythonhosted.org/packages/7f/a7/c1f1d978166eb6b98ad009503e4d93a8c1962d0eb14a885c352ee0276a54/numpy-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5062dc1a4e32a10dc2b8b13cedd58988261416e811c1dc4dbdea4f57eea61b0d", size = 16096599 }, + { url = "https://files.pythonhosted.org/packages/3d/6d/0e22afd5fcbb4d8d0091f3f46bf4e8906399c458d4293da23292c0ba5022/numpy-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fce4f615f8ca31b2e61aa0eb5865a21e14f5629515c9151850aa936c02a1ee51", size = 15243932 }, + { url = "https://files.pythonhosted.org/packages/03/39/e4e5832820131ba424092b9610d996b37e5557180f8e2d6aebb05c31ae54/numpy-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67d4cda6fa6ffa073b08c8372aa5fa767ceb10c9a0587c707505a6d426f4e046", size = 17861032 }, + { url = "https://files.pythonhosted.org/packages/5f/8a/3794313acbf5e70df2d5c7d2aba8718676f8d054a05abe59e48417fb2981/numpy-2.2.1-cp312-cp312-win32.whl", hash = "sha256:32cb94448be47c500d2c7a95f93e2f21a01f1fd05dd2beea1ccd049bb6001cd2", size = 6274018 }, + { url = "https://files.pythonhosted.org/packages/17/c1/c31d3637f2641e25c7a19adf2ae822fdaf4ddd198b05d79a92a9ce7cb63e/numpy-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:ba5511d8f31c033a5fcbda22dd5c813630af98c70b2661f2d2c654ae3cdfcfc8", size = 12613843 }, + { url = "https://files.pythonhosted.org/packages/20/d6/91a26e671c396e0c10e327b763485ee295f5a5a7a48c553f18417e5a0ed5/numpy-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f1d09e520217618e76396377c81fba6f290d5f926f50c35f3a5f72b01a0da780", size = 20896464 }, + { url = "https://files.pythonhosted.org/packages/8c/40/5792ccccd91d45e87d9e00033abc4f6ca8a828467b193f711139ff1f1cd9/numpy-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ecc47cd7f6ea0336042be87d9e7da378e5c7e9b3c8ad0f7c966f714fc10d821", size = 14111350 }, + { url = "https://files.pythonhosted.org/packages/c0/2a/fb0a27f846cb857cef0c4c92bef89f133a3a1abb4e16bba1c4dace2e9b49/numpy-2.2.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f419290bc8968a46c4933158c91a0012b7a99bb2e465d5ef5293879742f8797e", size = 5111629 }, + { url = "https://files.pythonhosted.org/packages/eb/e5/8e81bb9d84db88b047baf4e8b681a3e48d6390bc4d4e4453eca428ecbb49/numpy-2.2.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b6c390bfaef8c45a260554888966618328d30e72173697e5cabe6b285fb2348", size = 6645865 }, + { url = "https://files.pythonhosted.org/packages/7a/1a/a90ceb191dd2f9e2897c69dde93ccc2d57dd21ce2acbd7b0333e8eea4e8d/numpy-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:526fc406ab991a340744aad7e25251dd47a6720a685fa3331e5c59fef5282a59", size = 14043508 }, + { url = "https://files.pythonhosted.org/packages/f1/5a/e572284c86a59dec0871a49cd4e5351e20b9c751399d5f1d79628c0542cb/numpy-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74e6fdeb9a265624ec3a3918430205dff1df7e95a230779746a6af78bc615af", size = 16094100 }, + { url = "https://files.pythonhosted.org/packages/0c/2c/a79d24f364788386d85899dd280a94f30b0950be4b4a545f4fa4ed1d4ca7/numpy-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:53c09385ff0b72ba79d8715683c1168c12e0b6e84fb0372e97553d1ea91efe51", size = 15239691 }, + { url = "https://files.pythonhosted.org/packages/cf/79/1e20fd1c9ce5a932111f964b544facc5bb9bde7865f5b42f00b4a6a9192b/numpy-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f3eac17d9ec51be534685ba877b6ab5edc3ab7ec95c8f163e5d7b39859524716", size = 17856571 }, + { url = "https://files.pythonhosted.org/packages/be/5b/cc155e107f75d694f562bdc84a26cc930569f3dfdfbccb3420b626065777/numpy-2.2.1-cp313-cp313-win32.whl", hash = "sha256:9ad014faa93dbb52c80d8f4d3dcf855865c876c9660cb9bd7553843dd03a4b1e", size = 6270841 }, + { url = "https://files.pythonhosted.org/packages/44/be/0e5cd009d2162e4138d79a5afb3b5d2341f0fe4777ab6e675aa3d4a42e21/numpy-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:164a829b6aacf79ca47ba4814b130c4020b202522a93d7bff2202bfb33b61c60", size = 12606618 }, + { url = "https://files.pythonhosted.org/packages/a8/87/04ddf02dd86fb17c7485a5f87b605c4437966d53de1e3745d450343a6f56/numpy-2.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4dfda918a13cc4f81e9118dea249e192ab167a0bb1966272d5503e39234d694e", size = 20921004 }, + { url = "https://files.pythonhosted.org/packages/6e/3e/d0e9e32ab14005425d180ef950badf31b862f3839c5b927796648b11f88a/numpy-2.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:733585f9f4b62e9b3528dd1070ec4f52b8acf64215b60a845fa13ebd73cd0712", size = 14119910 }, + { url = "https://files.pythonhosted.org/packages/b5/5b/aa2d1905b04a8fb681e08742bb79a7bddfc160c7ce8e1ff6d5c821be0236/numpy-2.2.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:89b16a18e7bba224ce5114db863e7029803c179979e1af6ad6a6b11f70545008", size = 5153612 }, + { url = "https://files.pythonhosted.org/packages/ce/35/6831808028df0648d9b43c5df7e1051129aa0d562525bacb70019c5f5030/numpy-2.2.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:676f4eebf6b2d430300f1f4f4c2461685f8269f94c89698d832cdf9277f30b84", size = 6668401 }, + { url = "https://files.pythonhosted.org/packages/b1/38/10ef509ad63a5946cc042f98d838daebfe7eaf45b9daaf13df2086b15ff9/numpy-2.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f5cdf9f493b35f7e41e8368e7d7b4bbafaf9660cba53fb21d2cd174ec09631", size = 14014198 }, + { url = "https://files.pythonhosted.org/packages/df/f8/c80968ae01df23e249ee0a4487fae55a4c0fe2f838dfe9cc907aa8aea0fa/numpy-2.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1ad395cf254c4fbb5b2132fee391f361a6e8c1adbd28f2cd8e79308a615fe9d", size = 16076211 }, + { url = "https://files.pythonhosted.org/packages/09/69/05c169376016a0b614b432967ac46ff14269eaffab80040ec03ae1ae8e2c/numpy-2.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:08ef779aed40dbc52729d6ffe7dd51df85796a702afbf68a4f4e41fafdc8bda5", size = 15220266 }, + { url = "https://files.pythonhosted.org/packages/f1/ff/94a4ce67ea909f41cf7ea712aebbe832dc67decad22944a1020bb398a5ee/numpy-2.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:26c9c4382b19fcfbbed3238a14abf7ff223890ea1936b8890f058e7ba35e8d71", size = 17852844 }, + { url = "https://files.pythonhosted.org/packages/46/72/8a5dbce4020dfc595592333ef2fbb0a187d084ca243b67766d29d03e0096/numpy-2.2.1-cp313-cp313t-win32.whl", hash = "sha256:93cf4e045bae74c90ca833cba583c14b62cb4ba2cba0abd2b141ab52548247e2", size = 6326007 }, + { url = "https://files.pythonhosted.org/packages/7b/9c/4fce9cf39dde2562584e4cfd351a0140240f82c0e3569ce25a250f47037d/numpy-2.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bff7d8ec20f5f42607599f9994770fa65d76edca264a87b5e4ea5629bce12268", size = 12693107 }, +] + +[[package]] +name = "openai" +version = "1.59.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/7a/07fbe7bdabffd0a5be1bfe5903a02c4fff232e9acbae894014752a8e4def/openai-1.59.6.tar.gz", hash = "sha256:c7670727c2f1e4473f62fea6fa51475c8bc098c9ffb47bfb9eef5be23c747934", size = 344915 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/45/6de8e5fd670c804b29c777e4716f1916741c71604d5c7d952eee8432f7d3/openai-1.59.6-py3-none-any.whl", hash = "sha256:b28ed44eee3d5ebe1a3ea045ee1b4b50fea36ecd50741aaa5ce5a5559c900cb6", size = 454817 }, +] + +[[package]] +name = "orjson" +version = "3.10.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/f7/3219b56f47b4f5e864fb11cdf4ac0aaa3de608730ad2dc4c6e16382f35ec/orjson-3.10.14.tar.gz", hash = "sha256:cf31f6f071a6b8e7aa1ead1fa27b935b48d00fbfa6a28ce856cfff2d5dd68eed", size = 5282116 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/dc/dc5a882be016ee8688bd867ad3b4e3b2ab039d91383099702301a1adb6ac/orjson-3.10.14-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2ad4b7e367efba6dc3f119c9a0fcd41908b7ec0399a696f3cdea7ec477441b09", size = 249396 }, + { url = "https://files.pythonhosted.org/packages/f0/95/4c23ff5c0505cd687928608e0b7910ccb44ce59490079e1c17b7610aa0d0/orjson-3.10.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f496286fc85e93ce0f71cc84fc1c42de2decf1bf494094e188e27a53694777a7", size = 135689 }, + { url = "https://files.pythonhosted.org/packages/ad/39/b4bdd19604dce9d6509c4d86e8e251a1373a24204b4c4169866dcecbe5f5/orjson-3.10.14-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c7f189bbfcded40e41a6969c1068ba305850ba016665be71a217918931416fbf", size = 150136 }, + { url = "https://files.pythonhosted.org/packages/1d/92/7b9bad96353abd3e89947960252dcf1022ce2df7f29056e434de05e18b6d/orjson-3.10.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cc8204f0b75606869c707da331058ddf085de29558b516fc43c73ee5ee2aadb", size = 139766 }, + { url = "https://files.pythonhosted.org/packages/a6/bd/abb13c86540b7a91b40d7d9f8549d03a026bc22d78fa93f71d68b8f4c36e/orjson-3.10.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deaa2899dff7f03ab667e2ec25842d233e2a6a9e333efa484dfe666403f3501c", size = 154533 }, + { url = "https://files.pythonhosted.org/packages/c0/02/0bcb91ec9c7143012359983aca44f567f87df379957cd4af11336217b12f/orjson-3.10.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1c3ea52642c9714dc6e56de8a451a066f6d2707d273e07fe8a9cc1ba073813d", size = 130658 }, + { url = "https://files.pythonhosted.org/packages/b4/1e/b304596bb1f800d47d6e92305bd09f0eef693ed4f7b2095db63f9808b229/orjson-3.10.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d3f9ed72e7458ded9a1fb1b4d4ed4c4fdbaf82030ce3f9274b4dc1bff7ace2b", size = 138546 }, + { url = "https://files.pythonhosted.org/packages/56/c7/65d72b22080186ef618a46afeb9386e20056f3237664090f3a2f8da1cd6d/orjson-3.10.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:07520685d408a2aba514c17ccc16199ff2934f9f9e28501e676c557f454a37fe", size = 130774 }, + { url = "https://files.pythonhosted.org/packages/4d/85/1ab35a832f32b37ccd673721e845cf302f23453603112255af611c91d1d1/orjson-3.10.14-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:76344269b550ea01488d19a2a369ab572c1ac4449a72e9f6ac0d70eb1cbfb953", size = 414649 }, + { url = "https://files.pythonhosted.org/packages/d1/7d/1d6575f779bab8fe698fa6d52e8aa3aa0a9fca4885d0bf6197700455713a/orjson-3.10.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e2979d0f2959990620f7e62da6cd954e4620ee815539bc57a8ae46e2dacf90e3", size = 141060 }, + { url = "https://files.pythonhosted.org/packages/f8/26/68513e28b3bd1d7633318ed2818e86d1bfc8b782c87c520c7b363092837f/orjson-3.10.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03f61ca3674555adcb1aa717b9fc87ae936aa7a63f6aba90a474a88701278780", size = 129798 }, + { url = "https://files.pythonhosted.org/packages/44/ca/020fb99c98ff7267ba18ce798ff0c8c3aa97cd949b611fc76cad3c87e534/orjson-3.10.14-cp312-cp312-win32.whl", hash = "sha256:d5075c54edf1d6ad81d4c6523ce54a748ba1208b542e54b97d8a882ecd810fd1", size = 142524 }, + { url = "https://files.pythonhosted.org/packages/70/7f/f2d346819a273653825e7c92dc26418c8da506003c9fc1dfe8157e733b2e/orjson-3.10.14-cp312-cp312-win_amd64.whl", hash = "sha256:175cafd322e458603e8ce73510a068d16b6e6f389c13f69bf16de0e843d7d406", size = 133663 }, + { url = "https://files.pythonhosted.org/packages/46/bb/f1b037d89f580c79eda0940772384cc226a697be1cb4eb94ae4e792aa34c/orjson-3.10.14-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:0905ca08a10f7e0e0c97d11359609300eb1437490a7f32bbaa349de757e2e0c7", size = 249333 }, + { url = "https://files.pythonhosted.org/packages/e4/72/12958a073cace3f8acef0f9a30739d95f46bbb1544126fecad11527d4508/orjson-3.10.14-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92d13292249f9f2a3e418cbc307a9fbbef043c65f4bd8ba1eb620bc2aaba3d15", size = 125038 }, + { url = "https://files.pythonhosted.org/packages/c0/ae/461f78b1c98de1bc034af88bc21c6a792cc63373261fbc10a6ee560814fa/orjson-3.10.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90937664e776ad316d64251e2fa2ad69265e4443067668e4727074fe39676414", size = 130604 }, + { url = "https://files.pythonhosted.org/packages/ae/d2/17f50513f56bff7898840fddf7fb88f501305b9b2605d2793ff224789665/orjson-3.10.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9ed3d26c4cb4f6babaf791aa46a029265850e80ec2a566581f5c2ee1a14df4f1", size = 130756 }, + { url = "https://files.pythonhosted.org/packages/fa/bc/673856e4af94c9890dfd8e2054c05dc2ddc16d1728c2aa0c5bd198943105/orjson-3.10.14-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:56ee546c2bbe9599aba78169f99d1dc33301853e897dbaf642d654248280dc6e", size = 414613 }, + { url = "https://files.pythonhosted.org/packages/09/01/08c5b69b0756dd1790fcffa569d6a28dedcd7b97f825e4b46537b788908c/orjson-3.10.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:901e826cb2f1bdc1fcef3ef59adf0c451e8f7c0b5deb26c1a933fb66fb505eae", size = 141010 }, + { url = "https://files.pythonhosted.org/packages/5b/98/72883bb6cf88fd364996e62d2026622ca79bfb8dbaf96ccdd2018ada25b1/orjson-3.10.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:26336c0d4b2d44636e1e1e6ed1002f03c6aae4a8a9329561c8883f135e9ff010", size = 129732 }, + { url = "https://files.pythonhosted.org/packages/e4/99/347418f7ef56dcb478ba131a6112b8ddd5b747942652b6e77a53155a7e21/orjson-3.10.14-cp313-cp313-win32.whl", hash = "sha256:e2bc525e335a8545c4e48f84dd0328bc46158c9aaeb8a1c2276546e94540ea3d", size = 142504 }, + { url = "https://files.pythonhosted.org/packages/59/ac/5e96cad01083015f7bfdb02ccafa489da8e6caa7f4c519e215f04d2bd856/orjson-3.10.14-cp313-cp313-win_amd64.whl", hash = "sha256:eca04dfd792cedad53dc9a917da1a522486255360cb4e77619343a20d9f35364", size = 133388 }, +] + +[[package]] +name = "packaging" +version = "24.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, +] + +[[package]] +name = "pandas" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893 }, + { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475 }, + { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645 }, + { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445 }, + { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 }, + { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 }, + { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 }, + { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 }, + { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 }, + { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 }, + { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 }, + { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 }, + { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 }, + { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 }, + { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 }, + { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 }, + { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 }, + { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 }, + { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 }, + { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 }, +] + +[[package]] +name = "parso" +version = "0.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, +] + +[[package]] +name = "peewee" +version = "3.17.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/dc/832bcf4ea5ee2ebc4ea42ef36e44a451de5d80f8b9858bf2066e30738c67/peewee-3.17.8.tar.gz", hash = "sha256:ce1d05db3438830b989a1b9d0d0aa4e7f6134d5f6fd57686eeaa26a3e6485a8c", size = 948249 } + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, +] + +[[package]] +name = "platformdirs" +version = "4.3.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.48" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/4f/feb5e137aff82f7c7f3248267b97451da3644f6cdc218edfe549fb354127/prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90", size = 424684 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e", size = 386595 }, +] + +[[package]] +name = "psutil" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/5a/07871137bb752428aa4b659f910b399ba6f291156bdea939be3e96cae7cb/psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5", size = 508502 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/99/ca79d302be46f7bdd8321089762dd4476ee725fce16fc2b2e1dbba8cac17/psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8", size = 247511 }, + { url = "https://files.pythonhosted.org/packages/0b/6b/73dbde0dd38f3782905d4587049b9be64d76671042fdcaf60e2430c6796d/psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377", size = 248985 }, + { url = "https://files.pythonhosted.org/packages/17/38/c319d31a1d3f88c5b79c68b3116c129e5133f1822157dd6da34043e32ed6/psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003", size = 284488 }, + { url = "https://files.pythonhosted.org/packages/9c/39/0f88a830a1c8a3aba27fededc642da37613c57cbff143412e3536f89784f/psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160", size = 287477 }, + { url = "https://files.pythonhosted.org/packages/47/da/99f4345d4ddf2845cb5b5bd0d93d554e84542d116934fde07a0c50bd4e9f/psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3", size = 289017 }, + { url = "https://files.pythonhosted.org/packages/38/53/bd755c2896f4461fd4f36fa6a6dcb66a88a9e4b9fd4e5b66a77cf9d4a584/psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53", size = 250602 }, + { url = "https://files.pythonhosted.org/packages/7b/d7/7831438e6c3ebbfa6e01a927127a6cb42ad3ab844247f3c5b96bea25d73d/psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", size = 254444 }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 }, +] + +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + +[[package]] +name = "pydantic" +version = "2.10.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/c7/ca334c2ef6f2e046b1144fe4bb2a5da8a4c574e7f2ebf7e16b34a6a2fa92/pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff", size = 761287 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/26/82663c79010b28eddf29dcdd0ea723439535fa917fce5905885c0e9ba562/pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53", size = 431426 }, +] + +[[package]] +name = "pydantic-core" +version = "2.27.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, + { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, + { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, + { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, + { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, + { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, + { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, + { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, + { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, + { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, + { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, + { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, + { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, + { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, + { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, + { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, + { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, + { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, + { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, + { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, + { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, + { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, + { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, + { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, + { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, + { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, + { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + +[[package]] +name = "pytz" +version = "2024.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/31/3c70bf7603cc2dca0f19bdc53b4537a797747a58875b552c8c413d963a3f/pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", size = 319692 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 }, +] + +[[package]] +name = "pywin32" +version = "308" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/7c/d00d6bdd96de4344e06c4afbf218bc86b54436a94c01c71a8701f613aa56/pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897", size = 5939729 }, + { url = "https://files.pythonhosted.org/packages/21/27/0c8811fbc3ca188f93b5354e7c286eb91f80a53afa4e11007ef661afa746/pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47", size = 6543015 }, + { url = "https://files.pythonhosted.org/packages/9d/0f/d40f8373608caed2255781a3ad9a51d03a594a1248cd632d6a298daca693/pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091", size = 7976033 }, + { url = "https://files.pythonhosted.org/packages/a9/a4/aa562d8935e3df5e49c161b427a3a2efad2ed4e9cf81c3de636f1fdddfd0/pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed", size = 5938579 }, + { url = "https://files.pythonhosted.org/packages/c7/50/b0efb8bb66210da67a53ab95fd7a98826a97ee21f1d22949863e6d588b22/pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4", size = 6542056 }, + { url = "https://files.pythonhosted.org/packages/26/df/2b63e3e4f2df0224f8aaf6d131f54fe4e8c96400eb9df563e2aae2e1a1f9/pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd", size = 7974986 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +] + +[[package]] +name = "pyzmq" +version = "26.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/05/bed626b9f7bb2322cdbbf7b4bd8f54b1b617b0d2ab2d3547d6e39428a48e/pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f", size = 271975 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/2f/78a766c8913ad62b28581777ac4ede50c6d9f249d39c2963e279524a1bbe/pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9", size = 1343105 }, + { url = "https://files.pythonhosted.org/packages/b7/9c/4b1e2d3d4065be715e007fe063ec7885978fad285f87eae1436e6c3201f4/pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52", size = 1008365 }, + { url = "https://files.pythonhosted.org/packages/4f/ef/5a23ec689ff36d7625b38d121ef15abfc3631a9aecb417baf7a4245e4124/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08", size = 665923 }, + { url = "https://files.pythonhosted.org/packages/ae/61/d436461a47437d63c6302c90724cf0981883ec57ceb6073873f32172d676/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5", size = 903400 }, + { url = "https://files.pythonhosted.org/packages/47/42/fc6d35ecefe1739a819afaf6f8e686f7f02a4dd241c78972d316f403474c/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae", size = 860034 }, + { url = "https://files.pythonhosted.org/packages/07/3b/44ea6266a6761e9eefaa37d98fabefa112328808ac41aa87b4bbb668af30/pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711", size = 860579 }, + { url = "https://files.pythonhosted.org/packages/38/6f/4df2014ab553a6052b0e551b37da55166991510f9e1002c89cab7ce3b3f2/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6", size = 1196246 }, + { url = "https://files.pythonhosted.org/packages/38/9d/ee240fc0c9fe9817f0c9127a43238a3e28048795483c403cc10720ddef22/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3", size = 1507441 }, + { url = "https://files.pythonhosted.org/packages/85/4f/01711edaa58d535eac4a26c294c617c9a01f09857c0ce191fd574d06f359/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b", size = 1406498 }, + { url = "https://files.pythonhosted.org/packages/07/18/907134c85c7152f679ed744e73e645b365f3ad571f38bdb62e36f347699a/pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7", size = 575533 }, + { url = "https://files.pythonhosted.org/packages/ce/2c/a6f4a20202a4d3c582ad93f95ee78d79bbdc26803495aec2912b17dbbb6c/pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a", size = 637768 }, + { url = "https://files.pythonhosted.org/packages/5f/0e/eb16ff731632d30554bf5af4dbba3ffcd04518219d82028aea4ae1b02ca5/pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b", size = 540675 }, + { url = "https://files.pythonhosted.org/packages/04/a7/0f7e2f6c126fe6e62dbae0bc93b1bd3f1099cf7fea47a5468defebe3f39d/pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726", size = 1006564 }, + { url = "https://files.pythonhosted.org/packages/31/b6/a187165c852c5d49f826a690857684333a6a4a065af0a6015572d2284f6a/pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3", size = 1340447 }, + { url = "https://files.pythonhosted.org/packages/68/ba/f4280c58ff71f321602a6e24fd19879b7e79793fb8ab14027027c0fb58ef/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50", size = 665485 }, + { url = "https://files.pythonhosted.org/packages/77/b5/c987a5c53c7d8704216f29fc3d810b32f156bcea488a940e330e1bcbb88d/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb", size = 903484 }, + { url = "https://files.pythonhosted.org/packages/29/c9/07da157d2db18c72a7eccef8e684cefc155b712a88e3d479d930aa9eceba/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187", size = 859981 }, + { url = "https://files.pythonhosted.org/packages/43/09/e12501bd0b8394b7d02c41efd35c537a1988da67fc9c745cae9c6c776d31/pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b", size = 860334 }, + { url = "https://files.pythonhosted.org/packages/eb/ff/f5ec1d455f8f7385cc0a8b2acd8c807d7fade875c14c44b85c1bddabae21/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18", size = 1196179 }, + { url = "https://files.pythonhosted.org/packages/ec/8a/bb2ac43295b1950fe436a81fc5b298be0b96ac76fb029b514d3ed58f7b27/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115", size = 1507668 }, + { url = "https://files.pythonhosted.org/packages/a9/49/dbc284ebcfd2dca23f6349227ff1616a7ee2c4a35fe0a5d6c3deff2b4fed/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e", size = 1406539 }, + { url = "https://files.pythonhosted.org/packages/00/68/093cdce3fe31e30a341d8e52a1ad86392e13c57970d722c1f62a1d1a54b6/pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5", size = 575567 }, + { url = "https://files.pythonhosted.org/packages/92/ae/6cc4657148143412b5819b05e362ae7dd09fb9fe76e2a539dcff3d0386bc/pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad", size = 637551 }, + { url = "https://files.pythonhosted.org/packages/6c/67/fbff102e201688f97c8092e4c3445d1c1068c2f27bbd45a578df97ed5f94/pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797", size = 540378 }, + { url = "https://files.pythonhosted.org/packages/3f/fe/2d998380b6e0122c6c4bdf9b6caf490831e5f5e2d08a203b5adff060c226/pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a", size = 1007378 }, + { url = "https://files.pythonhosted.org/packages/4a/f4/30d6e7157f12b3a0390bde94d6a8567cdb88846ed068a6e17238a4ccf600/pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc", size = 1329532 }, + { url = "https://files.pythonhosted.org/packages/82/86/3fe917870e15ee1c3ad48229a2a64458e36036e64b4afa9659045d82bfa8/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5", size = 653242 }, + { url = "https://files.pythonhosted.org/packages/50/2d/242e7e6ef6c8c19e6cb52d095834508cd581ffb925699fd3c640cdc758f1/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672", size = 888404 }, + { url = "https://files.pythonhosted.org/packages/ac/11/7270566e1f31e4ea73c81ec821a4b1688fd551009a3d2bab11ec66cb1e8f/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797", size = 845858 }, + { url = "https://files.pythonhosted.org/packages/91/d5/72b38fbc69867795c8711bdd735312f9fef1e3d9204e2f63ab57085434b9/pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386", size = 847375 }, + { url = "https://files.pythonhosted.org/packages/dd/9a/10ed3c7f72b4c24e719c59359fbadd1a27556a28b36cdf1cd9e4fb7845d5/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306", size = 1183489 }, + { url = "https://files.pythonhosted.org/packages/72/2d/8660892543fabf1fe41861efa222455811adac9f3c0818d6c3170a1153e3/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6", size = 1492932 }, + { url = "https://files.pythonhosted.org/packages/7b/d6/32fd69744afb53995619bc5effa2a405ae0d343cd3e747d0fbc43fe894ee/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0", size = 1392485 }, +] + +[[package]] +name = "regex" +version = "2024.11.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781 }, + { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455 }, + { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759 }, + { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976 }, + { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077 }, + { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160 }, + { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896 }, + { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997 }, + { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725 }, + { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481 }, + { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896 }, + { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138 }, + { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692 }, + { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135 }, + { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567 }, + { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525 }, + { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324 }, + { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617 }, + { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023 }, + { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072 }, + { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130 }, + { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857 }, + { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006 }, + { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650 }, + { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545 }, + { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045 }, + { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182 }, + { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733 }, + { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122 }, + { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, +] + +[[package]] +name = "soupsieve" +version = "2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 }, +] + +[[package]] +name = "tenacity" +version = "9.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/94/91fccdb4b8110642462e653d5dcb27e7b674742ad68efd146367da7bdb10/tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b", size = 47421 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/cb/b86984bed139586d01532a587464b5805f12e397594f19f931c4c2fbfa61/tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539", size = 28169 }, +] + +[[package]] +name = "tiktoken" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "regex" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/02/576ff3a6639e755c4f70997b2d315f56d6d71e0d046f4fb64cb81a3fb099/tiktoken-0.8.0.tar.gz", hash = "sha256:9ccbb2740f24542534369c5635cfd9b2b3c2490754a78ac8831d99f89f94eeb2", size = 35107 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/22/34b2e136a6f4af186b6640cbfd6f93400783c9ef6cd550d9eab80628d9de/tiktoken-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:881839cfeae051b3628d9823b2e56b5cc93a9e2efb435f4cf15f17dc45f21586", size = 1039357 }, + { url = "https://files.pythonhosted.org/packages/04/d2/c793cf49c20f5855fd6ce05d080c0537d7418f22c58e71f392d5e8c8dbf7/tiktoken-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fe9399bdc3f29d428f16a2f86c3c8ec20be3eac5f53693ce4980371c3245729b", size = 982616 }, + { url = "https://files.pythonhosted.org/packages/b3/a1/79846e5ef911cd5d75c844de3fa496a10c91b4b5f550aad695c5df153d72/tiktoken-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a58deb7075d5b69237a3ff4bb51a726670419db6ea62bdcd8bd80c78497d7ab", size = 1144011 }, + { url = "https://files.pythonhosted.org/packages/26/32/e0e3a859136e95c85a572e4806dc58bf1ddf651108ae8b97d5f3ebe1a244/tiktoken-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2908c0d043a7d03ebd80347266b0e58440bdef5564f84f4d29fb235b5df3b04", size = 1175432 }, + { url = "https://files.pythonhosted.org/packages/c7/89/926b66e9025b97e9fbabeaa59048a736fe3c3e4530a204109571104f921c/tiktoken-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:294440d21a2a51e12d4238e68a5972095534fe9878be57d905c476017bff99fc", size = 1236576 }, + { url = "https://files.pythonhosted.org/packages/45/e2/39d4aa02a52bba73b2cd21ba4533c84425ff8786cc63c511d68c8897376e/tiktoken-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:d8f3192733ac4d77977432947d563d7e1b310b96497acd3c196c9bddb36ed9db", size = 883824 }, + { url = "https://files.pythonhosted.org/packages/e3/38/802e79ba0ee5fcbf240cd624143f57744e5d411d2e9d9ad2db70d8395986/tiktoken-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:02be1666096aff7da6cbd7cdaa8e7917bfed3467cd64b38b1f112e96d3b06a24", size = 1039648 }, + { url = "https://files.pythonhosted.org/packages/b1/da/24cdbfc302c98663fbea66f5866f7fa1048405c7564ab88483aea97c3b1a/tiktoken-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94ff53c5c74b535b2cbf431d907fc13c678bbd009ee633a2aca269a04389f9a", size = 982763 }, + { url = "https://files.pythonhosted.org/packages/e4/f0/0ecf79a279dfa41fc97d00adccf976ecc2556d3c08ef3e25e45eb31f665b/tiktoken-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b231f5e8982c245ee3065cd84a4712d64692348bc609d84467c57b4b72dcbc5", size = 1144417 }, + { url = "https://files.pythonhosted.org/packages/ab/d3/155d2d4514f3471a25dc1d6d20549ef254e2aa9bb5b1060809b1d3b03d3a/tiktoken-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4177faa809bd55f699e88c96d9bb4635d22e3f59d635ba6fd9ffedf7150b9953", size = 1175108 }, + { url = "https://files.pythonhosted.org/packages/19/eb/5989e16821ee8300ef8ee13c16effc20dfc26c777d05fbb6825e3c037b81/tiktoken-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5376b6f8dc4753cd81ead935c5f518fa0fbe7e133d9e25f648d8c4dabdd4bad7", size = 1236520 }, + { url = "https://files.pythonhosted.org/packages/40/59/14b20465f1d1cb89cfbc96ec27e5617b2d41c79da12b5e04e96d689be2a7/tiktoken-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:18228d624807d66c87acd8f25fc135665617cab220671eb65b50f5d70fa51f69", size = 883849 }, +] + +[[package]] +name = "tornado" +version = "6.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299 }, + { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253 }, + { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602 }, + { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972 }, + { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173 }, + { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892 }, + { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334 }, + { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261 }, + { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463 }, + { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "platform_system == 'Windows'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "tzdata" +version = "2024.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/34/943888654477a574a86a98e9896bae89c7aa15078ec29f490fef2f1e5384/tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc", size = 193282 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd", size = 346586 }, +] + +[[package]] +name = "urllib3" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, +] + +[[package]] +name = "wcwidth" +version = "0.2.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774 }, +] + +[[package]] +name = "yfinance" +version = "0.2.51" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "frozendict" }, + { name = "html5lib" }, + { name = "lxml" }, + { name = "multitasking" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "peewee" }, + { name = "platformdirs" }, + { name = "pytz" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/22/7f97a168037f957b3df274b16f509489e498d4402cc3fc0c11031c2f43cf/yfinance-0.2.51.tar.gz", hash = "sha256:7902cc9b23699a51efa50f1cc7a965220a56beccc00d189f929b4c7c5c189a60", size = 113892 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/38/7533745b517c34b7b749a7a21f631711354a3d4d39a840d75d20c94d71a0/yfinance-0.2.51-py2.py3-none-any.whl", hash = "sha256:d5cc7a970bb4bb43e4deee853514cbaa3c2b070a0dee6b2861c1ab5076f21dc1", size = 104651 }, +] diff --git a/gen-ai/openai/agents/yfinance-openai-langgraph/yfinance-stocks.ipynb b/gen-ai/openai/agents/yfinance-openai-langgraph/yfinance-stocks.ipynb new file mode 100644 index 0000000..063cedf --- /dev/null +++ b/gen-ai/openai/agents/yfinance-openai-langgraph/yfinance-stocks.ipynb @@ -0,0 +1,3730 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import yfinance as yf" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "msft = yf.Ticker(\"MSFT\")" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OpenHighLowCloseVolumeDividendsStock Splits
Date
1986-03-13 00:00:00-05:000.0544850.0624980.0544850.05982710317888000.00.0
1986-03-14 00:00:00-05:000.0598270.0630320.0598270.0619633081600000.00.0
1986-03-17 00:00:00-05:000.0619630.0635660.0619630.0630321331712000.00.0
1986-03-18 00:00:00-05:000.0630320.0635660.0608950.061429677664000.00.0
1986-03-19 00:00:00-05:000.0614290.0619630.0598270.060361478944000.00.0
........................
2025-01-02 00:00:00-05:00425.529999426.070007414.850006418.579987168965000.00.0
2025-01-03 00:00:00-05:00421.079987424.029999419.540009423.350006166629000.00.0
2025-01-06 00:00:00-05:00428.000000434.320007425.480011427.850006205736000.00.0
2025-01-07 00:00:00-05:00429.000000430.649994420.799988422.369995181391000.00.0
2025-01-08 00:00:00-05:00423.459991426.970001421.540009424.559998150546000.00.0
\n", + "

9784 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " Open High Low Close \\\n", + "Date \n", + "1986-03-13 00:00:00-05:00 0.054485 0.062498 0.054485 0.059827 \n", + "1986-03-14 00:00:00-05:00 0.059827 0.063032 0.059827 0.061963 \n", + "1986-03-17 00:00:00-05:00 0.061963 0.063566 0.061963 0.063032 \n", + "1986-03-18 00:00:00-05:00 0.063032 0.063566 0.060895 0.061429 \n", + "1986-03-19 00:00:00-05:00 0.061429 0.061963 0.059827 0.060361 \n", + "... ... ... ... ... \n", + "2025-01-02 00:00:00-05:00 425.529999 426.070007 414.850006 418.579987 \n", + "2025-01-03 00:00:00-05:00 421.079987 424.029999 419.540009 423.350006 \n", + "2025-01-06 00:00:00-05:00 428.000000 434.320007 425.480011 427.850006 \n", + "2025-01-07 00:00:00-05:00 429.000000 430.649994 420.799988 422.369995 \n", + "2025-01-08 00:00:00-05:00 423.459991 426.970001 421.540009 424.559998 \n", + "\n", + " Volume Dividends Stock Splits \n", + "Date \n", + "1986-03-13 00:00:00-05:00 1031788800 0.0 0.0 \n", + "1986-03-14 00:00:00-05:00 308160000 0.0 0.0 \n", + "1986-03-17 00:00:00-05:00 133171200 0.0 0.0 \n", + "1986-03-18 00:00:00-05:00 67766400 0.0 0.0 \n", + "1986-03-19 00:00:00-05:00 47894400 0.0 0.0 \n", + "... ... ... ... \n", + "2025-01-02 00:00:00-05:00 16896500 0.0 0.0 \n", + "2025-01-03 00:00:00-05:00 16662900 0.0 0.0 \n", + "2025-01-06 00:00:00-05:00 20573600 0.0 0.0 \n", + "2025-01-07 00:00:00-05:00 18139100 0.0 0.0 \n", + "2025-01-08 00:00:00-05:00 15054600 0.0 0.0 \n", + "\n", + "[9784 rows x 7 columns]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "history = msft.history(period=\"max\")\n", + "\n", + "history" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
DividendsStock Splits
Date
1987-09-21 00:00:00-04:000.002.0
1990-04-16 00:00:00-04:000.002.0
1991-06-27 00:00:00-04:000.001.5
1992-06-15 00:00:00-04:000.001.5
1994-05-23 00:00:00-04:000.002.0
.........
2023-11-15 00:00:00-05:000.750.0
2024-02-14 00:00:00-05:000.750.0
2024-05-15 00:00:00-04:000.750.0
2024-08-15 00:00:00-04:000.750.0
2024-11-21 00:00:00-05:000.830.0
\n", + "

93 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " Dividends Stock Splits\n", + "Date \n", + "1987-09-21 00:00:00-04:00 0.00 2.0\n", + "1990-04-16 00:00:00-04:00 0.00 2.0\n", + "1991-06-27 00:00:00-04:00 0.00 1.5\n", + "1992-06-15 00:00:00-04:00 0.00 1.5\n", + "1994-05-23 00:00:00-04:00 0.00 2.0\n", + "... ... ...\n", + "2023-11-15 00:00:00-05:00 0.75 0.0\n", + "2024-02-14 00:00:00-05:00 0.75 0.0\n", + "2024-05-15 00:00:00-04:00 0.75 0.0\n", + "2024-08-15 00:00:00-04:00 0.75 0.0\n", + "2024-11-21 00:00:00-05:00 0.83 0.0\n", + "\n", + "[93 rows x 2 columns]" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "msft.actions" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Date\n", + "1987-09-21 00:00:00-04:00 2.0\n", + "1990-04-16 00:00:00-04:00 2.0\n", + "1991-06-27 00:00:00-04:00 1.5\n", + "1992-06-15 00:00:00-04:00 1.5\n", + "1994-05-23 00:00:00-04:00 2.0\n", + "1996-12-09 00:00:00-05:00 2.0\n", + "1998-02-23 00:00:00-05:00 2.0\n", + "1999-03-29 00:00:00-05:00 2.0\n", + "2003-02-18 00:00:00-05:00 2.0\n", + "Name: Stock Splits, dtype: float64" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "msft.splits" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Date\n", + "2003-02-19 00:00:00-05:00 0.08\n", + "2003-10-15 00:00:00-04:00 0.16\n", + "2004-08-23 00:00:00-04:00 0.08\n", + "2004-11-15 00:00:00-05:00 3.08\n", + "2005-02-15 00:00:00-05:00 0.08\n", + " ... \n", + "2023-11-15 00:00:00-05:00 0.75\n", + "2024-02-14 00:00:00-05:00 0.75\n", + "2024-05-15 00:00:00-04:00 0.75\n", + "2024-08-15 00:00:00-04:00 0.75\n", + "2024-11-21 00:00:00-05:00 0.83\n", + "Name: Dividends, Length: 84, dtype: float64" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "msft.dividends" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 2024-06-30 \\\n", + "Tax Effect Of Unusual Items -99918000.0 \n", + "Tax Rate For Calcs 0.182 \n", + "Normalized EBITDA 133558000000.0 \n", + "Total Unusual Items -549000000.0 \n", + "Total Unusual Items Excluding Goodwill -549000000.0 \n", + "Net Income From Continuing Operation Net Minori... 88136000000.0 \n", + "Reconciled Depreciation 22287000000.0 \n", + "Reconciled Cost Of Revenue 74114000000.0 \n", + "EBITDA 133009000000.0 \n", + "EBIT 110722000000.0 \n", + "Net Interest Income 222000000.0 \n", + "Interest Expense 2935000000.0 \n", + "Interest Income 3157000000.0 \n", + "Normalized Income 88585082000.0 \n", + "Net Income From Continuing And Discontinued Ope... 88136000000.0 \n", + "Total Expenses 135689000000.0 \n", + "Total Operating Income As Reported 109433000000.0 \n", + "Diluted Average Shares 7469000000.0 \n", + "Basic Average Shares 7431000000.0 \n", + "Diluted EPS 11.8 \n", + "Basic EPS 11.86 \n", + "Diluted NI Availto Com Stockholders 88136000000.0 \n", + "Net Income Common Stockholders 88136000000.0 \n", + "Net Income 88136000000.0 \n", + "Net Income Including Noncontrolling Interests 88136000000.0 \n", + "Net Income Continuous Operations 88136000000.0 \n", + "Tax Provision 19651000000.0 \n", + "Pretax Income 107787000000.0 \n", + "Other Income Expense -1868000000.0 \n", + "Other Non Operating Income Expenses -1319000000.0 \n", + "Special Income Charges -206000000.0 \n", + "Write Off 206000000.0 \n", + "Gain On Sale Of Security -343000000.0 \n", + "Net Non Operating Interest Income Expense 222000000.0 \n", + "Interest Expense Non Operating 2935000000.0 \n", + "Interest Income Non Operating 3157000000.0 \n", + "Operating Income 109433000000.0 \n", + "Operating Expense 61575000000.0 \n", + "Research And Development 29510000000.0 \n", + "Selling General And Administration 32065000000.0 \n", + "Selling And Marketing Expense 24456000000.0 \n", + "General And Administrative Expense 7609000000.0 \n", + "Other Gand A 7609000000.0 \n", + "Gross Profit 171008000000.0 \n", + "Cost Of Revenue 74114000000.0 \n", + "Total Revenue 245122000000.0 \n", + "Operating Revenue 245122000000.0 \n", + "\n", + " 2023-06-30 \\\n", + "Tax Effect Of Unusual Items -2850000.0 \n", + "Tax Rate For Calcs 0.19 \n", + "Normalized EBITDA 105155000000.0 \n", + "Total Unusual Items -15000000.0 \n", + "Total Unusual Items Excluding Goodwill -15000000.0 \n", + "Net Income From Continuing Operation Net Minori... 72361000000.0 \n", + "Reconciled Depreciation 13861000000.0 \n", + "Reconciled Cost Of Revenue 65863000000.0 \n", + "EBITDA 105140000000.0 \n", + "EBIT 91279000000.0 \n", + "Net Interest Income 1026000000.0 \n", + "Interest Expense 1968000000.0 \n", + "Interest Income 2994000000.0 \n", + "Normalized Income 72373150000.0 \n", + "Net Income From Continuing And Discontinued Ope... 72361000000.0 \n", + "Total Expenses 123392000000.0 \n", + "Total Operating Income As Reported 88523000000.0 \n", + "Diluted Average Shares 7472000000.0 \n", + "Basic Average Shares 7446000000.0 \n", + "Diluted EPS 9.68 \n", + "Basic EPS 9.72 \n", + "Diluted NI Availto Com Stockholders 72361000000.0 \n", + "Net Income Common Stockholders 72361000000.0 \n", + "Net Income 72361000000.0 \n", + "Net Income Including Noncontrolling Interests 72361000000.0 \n", + "Net Income Continuous Operations 72361000000.0 \n", + "Tax Provision 16950000000.0 \n", + "Pretax Income 89311000000.0 \n", + "Other Income Expense -238000000.0 \n", + "Other Non Operating Income Expenses -223000000.0 \n", + "Special Income Charges -30000000.0 \n", + "Write Off 30000000.0 \n", + "Gain On Sale Of Security 15000000.0 \n", + "Net Non Operating Interest Income Expense 1026000000.0 \n", + "Interest Expense Non Operating 1968000000.0 \n", + "Interest Income Non Operating 2994000000.0 \n", + "Operating Income 88523000000.0 \n", + "Operating Expense 57529000000.0 \n", + "Research And Development 27195000000.0 \n", + "Selling General And Administration 30334000000.0 \n", + "Selling And Marketing Expense 22759000000.0 \n", + "General And Administrative Expense 7575000000.0 \n", + "Other Gand A 7575000000.0 \n", + "Gross Profit 146052000000.0 \n", + "Cost Of Revenue 65863000000.0 \n", + "Total Revenue 211915000000.0 \n", + "Operating Revenue 211915000000.0 \n", + "\n", + " 2022-06-30 \\\n", + "Tax Effect Of Unusual Items 43754000.0 \n", + "Tax Rate For Calcs 0.131 \n", + "Normalized EBITDA 99905000000.0 \n", + "Total Unusual Items 334000000.0 \n", + "Total Unusual Items Excluding Goodwill 334000000.0 \n", + "Net Income From Continuing Operation Net Minori... 72738000000.0 \n", + "Reconciled Depreciation 14460000000.0 \n", + "Reconciled Cost Of Revenue 62650000000.0 \n", + "EBITDA 100239000000.0 \n", + "EBIT 85779000000.0 \n", + "Net Interest Income 31000000.0 \n", + "Interest Expense 2063000000.0 \n", + "Interest Income 2094000000.0 \n", + "Normalized Income 72447754000.0 \n", + "Net Income From Continuing And Discontinued Ope... 72738000000.0 \n", + "Total Expenses 114887000000.0 \n", + "Total Operating Income As Reported 83383000000.0 \n", + "Diluted Average Shares 7540000000.0 \n", + "Basic Average Shares 7496000000.0 \n", + "Diluted EPS 9.65 \n", + "Basic EPS 9.7 \n", + "Diluted NI Availto Com Stockholders 72738000000.0 \n", + "Net Income Common Stockholders 72738000000.0 \n", + "Net Income 72738000000.0 \n", + "Net Income Including Noncontrolling Interests 72738000000.0 \n", + "Net Income Continuous Operations 72738000000.0 \n", + "Tax Provision 10978000000.0 \n", + "Pretax Income 83716000000.0 \n", + "Other Income Expense 302000000.0 \n", + "Other Non Operating Income Expenses -32000000.0 \n", + "Special Income Charges -101000000.0 \n", + "Write Off 101000000.0 \n", + "Gain On Sale Of Security 435000000.0 \n", + "Net Non Operating Interest Income Expense 31000000.0 \n", + "Interest Expense Non Operating 2063000000.0 \n", + "Interest Income Non Operating 2094000000.0 \n", + "Operating Income 83383000000.0 \n", + "Operating Expense 52237000000.0 \n", + "Research And Development 24512000000.0 \n", + "Selling General And Administration 27725000000.0 \n", + "Selling And Marketing Expense 21825000000.0 \n", + "General And Administrative Expense 5900000000.0 \n", + "Other Gand A 5900000000.0 \n", + "Gross Profit 135620000000.0 \n", + "Cost Of Revenue 62650000000.0 \n", + "Total Revenue 198270000000.0 \n", + "Operating Revenue 198270000000.0 \n", + "\n", + " 2021-06-30 \n", + "Tax Effect Of Unusual Items 180160797.164637 \n", + "Tax Rate For Calcs 0.138266 \n", + "Normalized EBITDA 83831000000.0 \n", + "Total Unusual Items 1303000000.0 \n", + "Total Unusual Items Excluding Goodwill 1303000000.0 \n", + "Net Income From Continuing Operation Net Minori... 61271000000.0 \n", + "Reconciled Depreciation 11686000000.0 \n", + "Reconciled Cost Of Revenue 52232000000.0 \n", + "EBITDA 85134000000.0 \n", + "EBIT 73448000000.0 \n", + "Net Interest Income -215000000.0 \n", + "Interest Expense 2346000000.0 \n", + "Interest Income 2131000000.0 \n", + "Normalized Income 60148160797.164635 \n", + "Net Income From Continuing And Discontinued Ope... 61271000000.0 \n", + "Total Expenses 98172000000.0 \n", + "Total Operating Income As Reported 69916000000.0 \n", + "Diluted Average Shares 7608000000.0 \n", + "Basic Average Shares 7547000000.0 \n", + "Diluted EPS 8.05 \n", + "Basic EPS 8.12 \n", + "Diluted NI Availto Com Stockholders 61271000000.0 \n", + "Net Income Common Stockholders 61271000000.0 \n", + "Net Income 61271000000.0 \n", + "Net Income Including Noncontrolling Interests 61271000000.0 \n", + "Net Income Continuous Operations 61271000000.0 \n", + "Tax Provision 9831000000.0 \n", + "Pretax Income 71102000000.0 \n", + "Other Income Expense 1401000000.0 \n", + "Other Non Operating Income Expenses 98000000.0 \n", + "Special Income Charges -13000000.0 \n", + "Write Off 13000000.0 \n", + "Gain On Sale Of Security 1316000000.0 \n", + "Net Non Operating Interest Income Expense -215000000.0 \n", + "Interest Expense Non Operating 2346000000.0 \n", + "Interest Income Non Operating 2131000000.0 \n", + "Operating Income 69916000000.0 \n", + "Operating Expense 45940000000.0 \n", + "Research And Development 20716000000.0 \n", + "Selling General And Administration 25224000000.0 \n", + "Selling And Marketing Expense 20117000000.0 \n", + "General And Administrative Expense 5107000000.0 \n", + "Other Gand A 5107000000.0 \n", + "Gross Profit 115856000000.0 \n", + "Cost Of Revenue 52232000000.0 \n", + "Total Revenue 168088000000.0 \n", + "Operating Revenue 168088000000.0 \n", + " 2024-09-30 \\\n", + "Tax Effect Of Unusual Items 57190000.0 \n", + "Tax Rate For Calcs 0.19 \n", + "Normalized EBITDA 37933000000.0 \n", + "Total Unusual Items 301000000.0 \n", + "Total Unusual Items Excluding Goodwill 301000000.0 \n", + "Net Income From Continuing Operation Net Minori... 24667000000.0 \n", + "Reconciled Depreciation 7383000000.0 \n", + "Reconciled Cost Of Revenue 20099000000.0 \n", + "EBITDA 38234000000.0 \n", + "EBIT 30851000000.0 \n", + "Net Interest Income 99000000.0 \n", + "Interest Expense 582000000.0 \n", + "Interest Income 681000000.0 \n", + "Normalized Income 24423190000.0 \n", + "Net Income From Continuing And Discontinued Ope... 24667000000.0 \n", + "Total Expenses 35033000000.0 \n", + "Total Operating Income As Reported 30552000000.0 \n", + "Diluted Average Shares 7470000000.0 \n", + "Basic Average Shares 7433000000.0 \n", + "Diluted EPS 3.3 \n", + "Basic EPS 3.32 \n", + "Diluted NI Availto Com Stockholders 24667000000.0 \n", + "Net Income Common Stockholders 24667000000.0 \n", + "Net Income 24667000000.0 \n", + "Net Income Including Noncontrolling Interests 24667000000.0 \n", + "Net Income Continuous Operations 24667000000.0 \n", + "Tax Provision 5602000000.0 \n", + "Pretax Income 30269000000.0 \n", + "Other Income Expense -382000000.0 \n", + "Other Non Operating Income Expenses -683000000.0 \n", + "Special Income Charges -7000000.0 \n", + "Write Off 7000000.0 \n", + "Gain On Sale Of Security 308000000.0 \n", + "Net Non Operating Interest Income Expense 99000000.0 \n", + "Interest Expense Non Operating 582000000.0 \n", + "Interest Income Non Operating 681000000.0 \n", + "Operating Income 30552000000.0 \n", + "Operating Expense 14934000000.0 \n", + "Research And Development 7544000000.0 \n", + "Selling General And Administration 7390000000.0 \n", + "Selling And Marketing Expense 5717000000.0 \n", + "General And Administrative Expense 1673000000.0 \n", + "Other Gand A 1673000000.0 \n", + "Gross Profit 45486000000.0 \n", + "Cost Of Revenue 20099000000.0 \n", + "Total Revenue 65585000000.0 \n", + "Operating Revenue 65585000000.0 \n", + "\n", + " 2024-06-30 \\\n", + "Tax Effect Of Unusual Items -16263853.211009 \n", + "Tax Rate For Calcs 0.191339 \n", + "Normalized EBITDA 34416000000.0 \n", + "Total Unusual Items -85000000.0 \n", + "Total Unusual Items Excluding Goodwill -85000000.0 \n", + "Net Income From Continuing Operation Net Minori... 22036000000.0 \n", + "Reconciled Depreciation 6380000000.0 \n", + "Reconciled Cost Of Revenue 19684000000.0 \n", + "EBITDA 34331000000.0 \n", + "EBIT 27951000000.0 \n", + "Net Interest Income -63000000.0 \n", + "Interest Expense 701000000.0 \n", + "Interest Income 638000000.0 \n", + "Normalized Income 22104736146.78899 \n", + "Net Income From Continuing And Discontinued Ope... 22036000000.0 \n", + "Total Expenses 36802000000.0 \n", + "Total Operating Income As Reported 27925000000.0 \n", + "Diluted Average Shares 7472000000.0 \n", + "Basic Average Shares 7433000000.0 \n", + "Diluted EPS 2.95 \n", + "Basic EPS 2.96 \n", + "Diluted NI Availto Com Stockholders 22036000000.0 \n", + "Net Income Common Stockholders 22036000000.0 \n", + "Net Income 22036000000.0 \n", + "Net Income Including Noncontrolling Interests 22036000000.0 \n", + "Net Income Continuous Operations 22036000000.0 \n", + "Tax Provision 5214000000.0 \n", + "Pretax Income 27250000000.0 \n", + "Other Income Expense -612000000.0 \n", + "Other Non Operating Income Expenses -527000000.0 \n", + "Special Income Charges -22000000.0 \n", + "Write Off 22000000.0 \n", + "Gain On Sale Of Security -63000000.0 \n", + "Net Non Operating Interest Income Expense -63000000.0 \n", + "Interest Expense Non Operating 701000000.0 \n", + "Interest Income Non Operating 638000000.0 \n", + "Operating Income 27925000000.0 \n", + "Operating Expense 17118000000.0 \n", + "Research And Development 8056000000.0 \n", + "Selling General And Administration 9062000000.0 \n", + "Selling And Marketing Expense 6816000000.0 \n", + "General And Administrative Expense 2246000000.0 \n", + "Other Gand A 2246000000.0 \n", + "Gross Profit 45043000000.0 \n", + "Cost Of Revenue 19684000000.0 \n", + "Total Revenue 64727000000.0 \n", + "Operating Revenue 64727000000.0 \n", + "\n", + " 2024-03-31 \\\n", + "Tax Effect Of Unusual Items -33660000.0 \n", + "Tax Rate For Calcs 0.18 \n", + "Normalized EBITDA 33741000000.0 \n", + "Total Unusual Items -187000000.0 \n", + "Total Unusual Items Excluding Goodwill -187000000.0 \n", + "Net Income From Continuing Operation Net Minori... 21939000000.0 \n", + "Reconciled Depreciation 6027000000.0 \n", + "Reconciled Cost Of Revenue 18505000000.0 \n", + "EBITDA 33554000000.0 \n", + "EBIT 27527000000.0 \n", + "Net Interest Income -181000000.0 \n", + "Interest Expense 800000000.0 \n", + "Interest Income 619000000.0 \n", + "Normalized Income 22092340000.0 \n", + "Net Income From Continuing And Discontinued Ope... 21939000000.0 \n", + "Total Expenses 34277000000.0 \n", + "Total Operating Income As Reported 27581000000.0 \n", + "Diluted Average Shares 7472000000.0 \n", + "Basic Average Shares 7431000000.0 \n", + "Diluted EPS 2.94 \n", + "Basic EPS 2.95 \n", + "Diluted NI Availto Com Stockholders 21939000000.0 \n", + "Net Income Common Stockholders 21939000000.0 \n", + "Net Income 21939000000.0 \n", + "Net Income Including Noncontrolling Interests 21939000000.0 \n", + "Net Income Continuous Operations 21939000000.0 \n", + "Tax Provision 4788000000.0 \n", + "Pretax Income 26727000000.0 \n", + "Other Income Expense -673000000.0 \n", + "Other Non Operating Income Expenses -486000000.0 \n", + "Special Income Charges -17000000.0 \n", + "Write Off 17000000.0 \n", + "Gain On Sale Of Security -170000000.0 \n", + "Net Non Operating Interest Income Expense -181000000.0 \n", + "Interest Expense Non Operating 800000000.0 \n", + "Interest Income Non Operating 619000000.0 \n", + "Operating Income 27581000000.0 \n", + "Operating Expense 15772000000.0 \n", + "Research And Development 7653000000.0 \n", + "Selling General And Administration 8119000000.0 \n", + "Selling And Marketing Expense 6207000000.0 \n", + "General And Administrative Expense 1912000000.0 \n", + "Other Gand A 1912000000.0 \n", + "Gross Profit 43353000000.0 \n", + "Cost Of Revenue 18505000000.0 \n", + "Total Revenue 61858000000.0 \n", + "Operating Revenue 61858000000.0 \n", + "\n", + " 2023-12-31 \\\n", + "Tax Effect Of Unusual Items -29160000.0 \n", + "Tax Rate For Calcs 0.18 \n", + "Normalized EBITDA 33556000000.0 \n", + "Total Unusual Items -162000000.0 \n", + "Total Unusual Items Excluding Goodwill -162000000.0 \n", + "Net Income From Continuing Operation Net Minori... 21870000000.0 \n", + "Reconciled Depreciation 5959000000.0 \n", + "Reconciled Cost Of Revenue 19623000000.0 \n", + "EBITDA 33394000000.0 \n", + "EBIT 27435000000.0 \n", + "Net Interest Income -175000000.0 \n", + "Interest Expense 909000000.0 \n", + "Interest Income 734000000.0 \n", + "Normalized Income 22002840000.0 \n", + "Net Income From Continuing And Discontinued Ope... 21870000000.0 \n", + "Total Expenses 34988000000.0 \n", + "Total Operating Income As Reported 27032000000.0 \n", + "Diluted Average Shares 7468000000.0 \n", + "Basic Average Shares 7432000000.0 \n", + "Diluted EPS 2.93 \n", + "Basic EPS 2.94 \n", + "Diluted NI Availto Com Stockholders 21870000000.0 \n", + "Net Income Common Stockholders 21870000000.0 \n", + "Net Income 21870000000.0 \n", + "Net Income Including Noncontrolling Interests 21870000000.0 \n", + "Net Income Continuous Operations 21870000000.0 \n", + "Tax Provision 4656000000.0 \n", + "Pretax Income 26526000000.0 \n", + "Other Income Expense -331000000.0 \n", + "Other Non Operating Income Expenses -169000000.0 \n", + "Special Income Charges -161000000.0 \n", + "Write Off 161000000.0 \n", + "Gain On Sale Of Security -1000000.0 \n", + "Net Non Operating Interest Income Expense -175000000.0 \n", + "Interest Expense Non Operating 909000000.0 \n", + "Interest Income Non Operating 734000000.0 \n", + "Operating Income 27032000000.0 \n", + "Operating Expense 15365000000.0 \n", + "Research And Development 7142000000.0 \n", + "Selling General And Administration 8223000000.0 \n", + "Selling And Marketing Expense 6246000000.0 \n", + "General And Administrative Expense 1977000000.0 \n", + "Other Gand A 1977000000.0 \n", + "Gross Profit 42397000000.0 \n", + "Cost Of Revenue 19623000000.0 \n", + "Total Revenue 62020000000.0 \n", + "Operating Revenue 62020000000.0 \n", + "\n", + " 2023-09-30 \n", + "Tax Effect Of Unusual Items -20700000.0 \n", + "Tax Rate For Calcs 0.18 \n", + "Normalized EBITDA 31845000000.0 \n", + "Total Unusual Items -115000000.0 \n", + "Total Unusual Items Excluding Goodwill -115000000.0 \n", + "Net Income From Continuing Operation Net Minori... 22291000000.0 \n", + "Reconciled Depreciation 3921000000.0 \n", + "Reconciled Cost Of Revenue 16302000000.0 \n", + "EBITDA 31730000000.0 \n", + "EBIT 27809000000.0 \n", + "Net Interest Income 641000000.0 \n", + "Interest Expense 525000000.0 \n", + "Interest Income 1166000000.0 \n", + "Normalized Income 22385300000.0 \n", + "Net Income From Continuing And Discontinued Ope... 22291000000.0 \n", + "Total Expenses 29622000000.0 \n", + "Total Operating Income As Reported 26895000000.0 \n", + "Diluted Average Shares 7462000000.0 \n", + "Basic Average Shares 7429000000.0 \n", + "Diluted EPS 2.99 \n", + "Basic EPS 3.0 \n", + "Diluted NI Availto Com Stockholders 22291000000.0 \n", + "Net Income Common Stockholders 22291000000.0 \n", + "Net Income 22291000000.0 \n", + "Net Income Including Noncontrolling Interests 22291000000.0 \n", + "Net Income Continuous Operations 22291000000.0 \n", + "Tax Provision 4993000000.0 \n", + "Pretax Income 27284000000.0 \n", + "Other Income Expense -252000000.0 \n", + "Other Non Operating Income Expenses -137000000.0 \n", + "Special Income Charges -6000000.0 \n", + "Write Off 6000000.0 \n", + "Gain On Sale Of Security -109000000.0 \n", + "Net Non Operating Interest Income Expense 641000000.0 \n", + "Interest Expense Non Operating 525000000.0 \n", + "Interest Income Non Operating 1166000000.0 \n", + "Operating Income 26895000000.0 \n", + "Operating Expense 13320000000.0 \n", + "Research And Development 6659000000.0 \n", + "Selling General And Administration 6661000000.0 \n", + "Selling And Marketing Expense 5187000000.0 \n", + "General And Administrative Expense 1474000000.0 \n", + "Other Gand A 1474000000.0 \n", + "Gross Profit 40215000000.0 \n", + "Cost Of Revenue 16302000000.0 \n", + "Total Revenue 56517000000.0 \n", + "Operating Revenue 56517000000.0 \n" + ] + } + ], + "source": [ + "print(msft.financials)\n", + "print(msft.quarterly_financials)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
BreakdownValue
insidersPercentHeld0.00056
institutionsPercentHeld0.73557
institutionsFloatPercentHeld0.73598
institutionsCount6960.00000
\n", + "
" + ], + "text/plain": [ + "Breakdown Value\n", + "insidersPercentHeld 0.00056\n", + "institutionsPercentHeld 0.73557\n", + "institutionsFloatPercentHeld 0.73598\n", + "institutionsCount 6960.00000" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "msft.major_holders" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Date ReportedHolderpctHeldSharesValue
02023-06-30Vanguard Group Inc0.0879653247546222456919314
12023-06-30Blackrock Inc.0.0722536245027182612881494
22023-06-30State Street Corporation0.039529361407899987338122
32023-06-30FMR, LLC0.028321011125071551285075
42023-06-30Price (T.Rowe) Associates Inc0.021515990421954453782738
52023-06-30Geode Capital Management, LLC0.019914812947050444009713
62023-06-30Morgan Stanley0.016612349832242056118573
72023-06-30JP Morgan Chase & Company0.015211302483738489477991
82022-12-31Norges Bank Investment Management0.01168631692620700525193
92023-06-30Capital World Investors0.01158550726129118642660
\n", + "
" + ], + "text/plain": [ + " Date Reported Holder pctHeld Shares \\\n", + "0 2023-06-30 Vanguard Group Inc 0.0879 653247546 \n", + "1 2023-06-30 Blackrock Inc. 0.0722 536245027 \n", + "2 2023-06-30 State Street Corporation 0.0395 293614078 \n", + "3 2023-06-30 FMR, LLC 0.0283 210111250 \n", + "4 2023-06-30 Price (T.Rowe) Associates Inc 0.0215 159904219 \n", + "5 2023-06-30 Geode Capital Management, LLC 0.0199 148129470 \n", + "6 2023-06-30 Morgan Stanley 0.0166 123498322 \n", + "7 2023-06-30 JP Morgan Chase & Company 0.0152 113024837 \n", + "8 2022-12-31 Norges Bank Investment Management 0.0116 86316926 \n", + "9 2023-06-30 Capital World Investors 0.0115 85507261 \n", + "\n", + " Value \n", + "0 222456919314 \n", + "1 182612881494 \n", + "2 99987338122 \n", + "3 71551285075 \n", + "4 54453782738 \n", + "5 50444009713 \n", + "6 42056118573 \n", + "7 38489477991 \n", + "8 20700525193 \n", + "9 29118642660 " + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "msft.institutional_holders" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 2024-06-30 \\\n", + "Ordinary Shares Number 7434000000.0 \n", + "Share Issued 7434000000.0 \n", + "Net Debt 33315000000.0 \n", + "Total Debt 67127000000.0 \n", + "Tangible Book Value 121660000000.0 \n", + "... ... \n", + "Cash Cash Equivalents And Short Term Investments 75531000000.0 \n", + "Other Short Term Investments 57216000000.0 \n", + "Cash And Cash Equivalents 18315000000.0 \n", + "Cash Equivalents 6744000000.0 \n", + "Cash Financial 11571000000.0 \n", + "\n", + " 2023-06-30 \\\n", + "Ordinary Shares Number 7432000000.0 \n", + "Share Issued 7432000000.0 \n", + "Net Debt 12533000000.0 \n", + "Total Debt 59965000000.0 \n", + "Tangible Book Value 128971000000.0 \n", + "... ... \n", + "Cash Cash Equivalents And Short Term Investments 111256000000.0 \n", + "Other Short Term Investments 76552000000.0 \n", + "Cash And Cash Equivalents 34704000000.0 \n", + "Cash Equivalents 26226000000.0 \n", + "Cash Financial 8478000000.0 \n", + "\n", + " 2022-06-30 \\\n", + "Ordinary Shares Number 7464000000.0 \n", + "Share Issued 7464000000.0 \n", + "Net Debt 35850000000.0 \n", + "Total Debt 61270000000.0 \n", + "Tangible Book Value 87720000000.0 \n", + "... ... \n", + "Cash Cash Equivalents And Short Term Investments 104749000000.0 \n", + "Other Short Term Investments 90818000000.0 \n", + "Cash And Cash Equivalents 13931000000.0 \n", + "Cash Equivalents 5673000000.0 \n", + "Cash Financial 8258000000.0 \n", + "\n", + " 2021-06-30 \n", + "Ordinary Shares Number 7519000000.0 \n", + "Share Issued 7519000000.0 \n", + "Net Debt 43922000000.0 \n", + "Total Debt 67775000000.0 \n", + "Tangible Book Value 84477000000.0 \n", + "... ... \n", + "Cash Cash Equivalents And Short Term Investments 130256000000.0 \n", + "Other Short Term Investments 116032000000.0 \n", + "Cash And Cash Equivalents 14224000000.0 \n", + "Cash Equivalents 6952000000.0 \n", + "Cash Financial 7272000000.0 \n", + "\n", + "[73 rows x 4 columns]\n", + " 2024-09-30 \\\n", + "Ordinary Shares Number 7436000000.0 \n", + "Share Issued 7436000000.0 \n", + "Net Debt 24277000000.0 \n", + "Total Debt 61478000000.0 \n", + "Tangible Book Value 141598000000.0 \n", + "... ... \n", + "Cash Cash Equivalents And Short Term Investments 78429000000.0 \n", + "Other Short Term Investments 57589000000.0 \n", + "Cash And Cash Equivalents 20840000000.0 \n", + "Cash Equivalents 10252000000.0 \n", + "Cash Financial 10588000000.0 \n", + "\n", + " 2024-06-30 \\\n", + "Ordinary Shares Number 7434000000.0 \n", + "Share Issued 7434000000.0 \n", + "Net Debt 33315000000.0 \n", + "Total Debt 67127000000.0 \n", + "Tangible Book Value 121660000000.0 \n", + "... ... \n", + "Cash Cash Equivalents And Short Term Investments 75531000000.0 \n", + "Other Short Term Investments 57216000000.0 \n", + "Cash And Cash Equivalents 18315000000.0 \n", + "Cash Equivalents 6744000000.0 \n", + "Cash Financial 11571000000.0 \n", + "\n", + " 2024-03-31 \\\n", + "Ordinary Shares Number 7432305794.0 \n", + "Share Issued 7432305794.0 \n", + "Net Debt 45808000000.0 \n", + "Total Debt 79911000000.0 \n", + "Tangible Book Value 105161000000.0 \n", + "... ... \n", + "Cash Cash Equivalents And Short Term Investments 80013000000.0 \n", + "Other Short Term Investments 60379000000.0 \n", + "Cash And Cash Equivalents 19634000000.0 \n", + "Cash Equivalents 8053000000.0 \n", + "Cash Financial 11581000000.0 \n", + "\n", + " 2023-12-31 \\\n", + "Ordinary Shares Number 7431612107.0 \n", + "Share Issued 7431612107.0 \n", + "Net Debt 56914000000.0 \n", + "Total Debt 88374000000.0 \n", + "Tangible Book Value 89441000000.0 \n", + "... ... \n", + "Cash Cash Equivalents And Short Term Investments 80982000000.0 \n", + "Other Short Term Investments 63677000000.0 \n", + "Cash And Cash Equivalents 17305000000.0 \n", + "Cash Equivalents 7769000000.0 \n", + "Cash Financial 9536000000.0 \n", + "\n", + " 2023-09-30 \\\n", + "Ordinary Shares Number 7431000000.0 \n", + "Share Issued 7431000000.0 \n", + "Net Debt NaN \n", + "Total Debt 84989000000.0 \n", + "Tangible Book Value 144029000000.0 \n", + "... ... \n", + "Cash Cash Equivalents And Short Term Investments 143945000000.0 \n", + "Other Short Term Investments 63493000000.0 \n", + "Cash And Cash Equivalents 80452000000.0 \n", + "Cash Equivalents 73074000000.0 \n", + "Cash Financial 7378000000.0 \n", + "\n", + " 2023-06-30 \n", + "Ordinary Shares Number NaN \n", + "Share Issued NaN \n", + "Net Debt 12533000000.0 \n", + "Total Debt NaN \n", + "Tangible Book Value NaN \n", + "... ... \n", + "Cash Cash Equivalents And Short Term Investments NaN \n", + "Other Short Term Investments NaN \n", + "Cash And Cash Equivalents NaN \n", + "Cash Equivalents NaN \n", + "Cash Financial NaN \n", + "\n", + "[78 rows x 6 columns]\n" + ] + } + ], + "source": [ + "print(msft.balance_sheet)\n", + "print(msft.quarterly_balance_sheet)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "df = msft.balance_sheet" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
2024-06-302023-06-302022-06-302021-06-30
Ordinary Shares Number7434000000.07432000000.07464000000.07519000000.0
Share Issued7434000000.07432000000.07464000000.07519000000.0
Net Debt33315000000.012533000000.035850000000.043922000000.0
Total Debt67127000000.059965000000.061270000000.067775000000.0
Tangible Book Value121660000000.0128971000000.087720000000.084477000000.0
...............
Cash Cash Equivalents And Short Term Investments75531000000.0111256000000.0104749000000.0130256000000.0
Other Short Term Investments57216000000.076552000000.090818000000.0116032000000.0
Cash And Cash Equivalents18315000000.034704000000.013931000000.014224000000.0
Cash Equivalents6744000000.026226000000.05673000000.06952000000.0
Cash Financial11571000000.08478000000.08258000000.07272000000.0
\n", + "

73 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " 2024-06-30 \\\n", + "Ordinary Shares Number 7434000000.0 \n", + "Share Issued 7434000000.0 \n", + "Net Debt 33315000000.0 \n", + "Total Debt 67127000000.0 \n", + "Tangible Book Value 121660000000.0 \n", + "... ... \n", + "Cash Cash Equivalents And Short Term Investments 75531000000.0 \n", + "Other Short Term Investments 57216000000.0 \n", + "Cash And Cash Equivalents 18315000000.0 \n", + "Cash Equivalents 6744000000.0 \n", + "Cash Financial 11571000000.0 \n", + "\n", + " 2023-06-30 \\\n", + "Ordinary Shares Number 7432000000.0 \n", + "Share Issued 7432000000.0 \n", + "Net Debt 12533000000.0 \n", + "Total Debt 59965000000.0 \n", + "Tangible Book Value 128971000000.0 \n", + "... ... \n", + "Cash Cash Equivalents And Short Term Investments 111256000000.0 \n", + "Other Short Term Investments 76552000000.0 \n", + "Cash And Cash Equivalents 34704000000.0 \n", + "Cash Equivalents 26226000000.0 \n", + "Cash Financial 8478000000.0 \n", + "\n", + " 2022-06-30 \\\n", + "Ordinary Shares Number 7464000000.0 \n", + "Share Issued 7464000000.0 \n", + "Net Debt 35850000000.0 \n", + "Total Debt 61270000000.0 \n", + "Tangible Book Value 87720000000.0 \n", + "... ... \n", + "Cash Cash Equivalents And Short Term Investments 104749000000.0 \n", + "Other Short Term Investments 90818000000.0 \n", + "Cash And Cash Equivalents 13931000000.0 \n", + "Cash Equivalents 5673000000.0 \n", + "Cash Financial 8258000000.0 \n", + "\n", + " 2021-06-30 \n", + "Ordinary Shares Number 7519000000.0 \n", + "Share Issued 7519000000.0 \n", + "Net Debt 43922000000.0 \n", + "Total Debt 67775000000.0 \n", + "Tangible Book Value 84477000000.0 \n", + "... ... \n", + "Cash Cash Equivalents And Short Term Investments 130256000000.0 \n", + "Other Short Term Investments 116032000000.0 \n", + "Cash And Cash Equivalents 14224000000.0 \n", + "Cash Equivalents 6952000000.0 \n", + "Cash Financial 7272000000.0 \n", + "\n", + "[73 rows x 4 columns]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Ordinary Shares Number', 'Share Issued', 'Net Debt', 'Total Debt',\n", + " 'Tangible Book Value', 'Invested Capital', 'Working Capital',\n", + " 'Net Tangible Assets', 'Capital Lease Obligations',\n", + " 'Common Stock Equity', 'Total Capitalization',\n", + " 'Total Equity Gross Minority Interest', 'Stockholders Equity',\n", + " 'Gains Losses Not Affecting Retained Earnings',\n", + " 'Other Equity Adjustments', 'Retained Earnings', 'Capital Stock',\n", + " 'Common Stock', 'Total Liabilities Net Minority Interest',\n", + " 'Total Non Current Liabilities Net Minority Interest',\n", + " 'Other Non Current Liabilities', 'Tradeand Other Payables Non Current',\n", + " 'Non Current Deferred Liabilities', 'Non Current Deferred Revenue',\n", + " 'Non Current Deferred Taxes Liabilities',\n", + " 'Long Term Debt And Capital Lease Obligation',\n", + " 'Long Term Capital Lease Obligation', 'Long Term Debt',\n", + " 'Current Liabilities', 'Other Current Liabilities',\n", + " 'Current Deferred Liabilities', 'Current Deferred Revenue',\n", + " 'Current Debt And Capital Lease Obligation', 'Current Debt',\n", + " 'Pensionand Other Post Retirement Benefit Plans Current',\n", + " 'Payables And Accrued Expenses', 'Payables', 'Total Tax Payable',\n", + " 'Income Tax Payable', 'Accounts Payable', 'Total Assets',\n", + " 'Total Non Current Assets', 'Other Non Current Assets',\n", + " 'Investments And Advances', 'Long Term Equity Investment',\n", + " 'Goodwill And Other Intangible Assets', 'Other Intangible Assets',\n", + " 'Goodwill', 'Net PPE', 'Accumulated Depreciation', 'Gross PPE',\n", + " 'Leases', 'Other Properties', 'Machinery Furniture Equipment',\n", + " 'Buildings And Improvements', 'Land And Improvements', 'Properties',\n", + " 'Current Assets', 'Other Current Assets', 'Hedging Assets Current',\n", + " 'Inventory', 'Finished Goods', 'Work In Process', 'Raw Materials',\n", + " 'Receivables', 'Accounts Receivable',\n", + " 'Allowance For Doubtful Accounts Receivable',\n", + " 'Gross Accounts Receivable',\n", + " 'Cash Cash Equivalents And Short Term Investments',\n", + " 'Other Short Term Investments', 'Cash And Cash Equivalents',\n", + " 'Cash Equivalents', 'Cash Financial'],\n", + " dtype='object')" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.index" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "TotalDebt = df.loc['Total Debt']" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2024-06-30 67127000000.0\n", + "2023-06-30 59965000000.0\n", + "2022-06-30 61270000000.0\n", + "2021-06-30 67775000000.0\n", + "Name: Total Debt, dtype: object" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "TotalDebt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 2024-06-30 2023-06-30 \\\n", + "Free Cash Flow 74071000000.0 59475000000.0 \n", + "Repurchase Of Capital Stock -17254000000.0 -22245000000.0 \n", + "Repayment Of Debt -29070000000.0 -2750000000.0 \n", + "Issuance Of Debt 29645000000.0 0.0 \n", + "Issuance Of Capital Stock 2002000000.0 1866000000.0 \n", + "Capital Expenditure -44477000000.0 -28107000000.0 \n", + "End Cash Position 18315000000.0 34704000000.0 \n", + "Beginning Cash Position 34704000000.0 13931000000.0 \n", + "Effect Of Exchange Rate Changes -210000000.0 -194000000.0 \n", + "Changes In Cash -16179000000.0 20967000000.0 \n", + "Financing Cash Flow -37757000000.0 -43935000000.0 \n", + "Cash Flow From Continuing Financing Activities -37757000000.0 -43935000000.0 \n", + "Net Other Financing Charges -1309000000.0 -1006000000.0 \n", + "Cash Dividends Paid -21771000000.0 -19800000000.0 \n", + "Common Stock Dividend Paid -21771000000.0 -19800000000.0 \n", + "Net Common Stock Issuance -15252000000.0 -20379000000.0 \n", + "Common Stock Payments -17254000000.0 -22245000000.0 \n", + "Common Stock Issuance 2002000000.0 1866000000.0 \n", + "Net Issuance Payments Of Debt 575000000.0 -2750000000.0 \n", + "Net Short Term Debt Issuance 5250000000.0 0.0 \n", + "Short Term Debt Issuance 5250000000.0 0.0 \n", + "Net Long Term Debt Issuance -4675000000.0 -2750000000.0 \n", + "Long Term Debt Payments -29070000000.0 -2750000000.0 \n", + "Long Term Debt Issuance 24395000000.0 0.0 \n", + "Investing Cash Flow -96970000000.0 -22680000000.0 \n", + "Cash Flow From Continuing Investing Activities -96970000000.0 -22680000000.0 \n", + "Net Other Investing Changes -1298000000.0 -3116000000.0 \n", + "Net Investment Purchase And Sale 17937000000.0 10213000000.0 \n", + "Sale Of Investment 35669000000.0 47864000000.0 \n", + "Purchase Of Investment -17732000000.0 -37651000000.0 \n", + "Net Business Purchase And Sale -69132000000.0 -1670000000.0 \n", + "Purchase Of Business -69132000000.0 -1670000000.0 \n", + "Net PPE Purchase And Sale -44477000000.0 -28107000000.0 \n", + "Purchase Of PPE -44477000000.0 -28107000000.0 \n", + "Operating Cash Flow 118548000000.0 87582000000.0 \n", + "Cash Flow From Continuing Operating Activities 118548000000.0 87582000000.0 \n", + "Change In Working Capital 1824000000.0 -2388000000.0 \n", + "Change In Other Working Capital 5348000000.0 5535000000.0 \n", + "Change In Other Current Liabilities 5616000000.0 2825000000.0 \n", + "Change In Other Current Assets -8465000000.0 -4824000000.0 \n", + "Change In Payables And Accrued Expense 5232000000.0 -3079000000.0 \n", + "Change In Payable 5232000000.0 -3079000000.0 \n", + "Change In Account Payable 3545000000.0 -2721000000.0 \n", + "Change In Tax Payable 1687000000.0 -358000000.0 \n", + "Change In Income Tax Payable 1687000000.0 -358000000.0 \n", + "Change In Inventory 1284000000.0 1242000000.0 \n", + "Change In Receivables -7191000000.0 -4087000000.0 \n", + "Changes In Account Receivables -7191000000.0 -4087000000.0 \n", + "Stock Based Compensation 10734000000.0 9611000000.0 \n", + "Deferred Tax -4738000000.0 -6059000000.0 \n", + "Deferred Income Tax -4738000000.0 -6059000000.0 \n", + "Depreciation Amortization Depletion 22287000000.0 13861000000.0 \n", + "Depreciation And Amortization 22287000000.0 13861000000.0 \n", + "Depreciation 22287000000.0 13861000000.0 \n", + "Operating Gains Losses 305000000.0 196000000.0 \n", + "Gain Loss On Investment Securities NaN NaN \n", + "Net Income From Continuing Operations 88136000000.0 72361000000.0 \n", + "\n", + " 2022-06-30 2021-06-30 \\\n", + "Free Cash Flow 65149000000.0 56118000000.0 \n", + "Repurchase Of Capital Stock -32696000000.0 -27385000000.0 \n", + "Repayment Of Debt -9023000000.0 -3750000000.0 \n", + "Issuance Of Debt 0.0 NaN \n", + "Issuance Of Capital Stock 1841000000.0 1693000000.0 \n", + "Capital Expenditure -23886000000.0 -20622000000.0 \n", + "End Cash Position 13931000000.0 14224000000.0 \n", + "Beginning Cash Position 14224000000.0 13576000000.0 \n", + "Effect Of Exchange Rate Changes -141000000.0 -29000000.0 \n", + "Changes In Cash -152000000.0 677000000.0 \n", + "Financing Cash Flow -58876000000.0 -48486000000.0 \n", + "Cash Flow From Continuing Financing Activities -58876000000.0 -48486000000.0 \n", + "Net Other Financing Charges -863000000.0 -2523000000.0 \n", + "Cash Dividends Paid -18135000000.0 -16521000000.0 \n", + "Common Stock Dividend Paid -18135000000.0 -16521000000.0 \n", + "Net Common Stock Issuance -30855000000.0 -25692000000.0 \n", + "Common Stock Payments -32696000000.0 -27385000000.0 \n", + "Common Stock Issuance 1841000000.0 1693000000.0 \n", + "Net Issuance Payments Of Debt -9023000000.0 -3750000000.0 \n", + "Net Short Term Debt Issuance 0.0 NaN \n", + "Short Term Debt Issuance 0.0 NaN \n", + "Net Long Term Debt Issuance -9023000000.0 -3750000000.0 \n", + "Long Term Debt Payments -9023000000.0 -3750000000.0 \n", + "Long Term Debt Issuance 0.0 NaN \n", + "Investing Cash Flow -30311000000.0 -27577000000.0 \n", + "Cash Flow From Continuing Investing Activities -30311000000.0 -27577000000.0 \n", + "Net Other Investing Changes -2825000000.0 -922000000.0 \n", + "Net Investment Purchase And Sale 18438000000.0 2876000000.0 \n", + "Sale Of Investment 44894000000.0 65800000000.0 \n", + "Purchase Of Investment -26456000000.0 -62924000000.0 \n", + "Net Business Purchase And Sale -22038000000.0 -8909000000.0 \n", + "Purchase Of Business -22038000000.0 -8909000000.0 \n", + "Net PPE Purchase And Sale -23886000000.0 -20622000000.0 \n", + "Purchase Of PPE -23886000000.0 -20622000000.0 \n", + "Operating Cash Flow 89035000000.0 76740000000.0 \n", + "Cash Flow From Continuing Operating Activities 89035000000.0 76740000000.0 \n", + "Change In Working Capital 446000000.0 -936000000.0 \n", + "Change In Other Working Capital 5805000000.0 2324000000.0 \n", + "Change In Other Current Liabilities 3169000000.0 5551000000.0 \n", + "Change In Other Current Assets -3514000000.0 -4391000000.0 \n", + "Change In Payables And Accrued Expense 2943000000.0 2798000000.0 \n", + "Change In Payable 2943000000.0 2798000000.0 \n", + "Change In Account Payable 2943000000.0 2798000000.0 \n", + "Change In Tax Payable NaN NaN \n", + "Change In Income Tax Payable NaN NaN \n", + "Change In Inventory -1123000000.0 -737000000.0 \n", + "Change In Receivables -6834000000.0 -6481000000.0 \n", + "Changes In Account Receivables -6834000000.0 -6481000000.0 \n", + "Stock Based Compensation 7502000000.0 6118000000.0 \n", + "Deferred Tax -5702000000.0 -150000000.0 \n", + "Deferred Income Tax -5702000000.0 -150000000.0 \n", + "Depreciation Amortization Depletion 14460000000.0 11686000000.0 \n", + "Depreciation And Amortization 14460000000.0 11686000000.0 \n", + "Depreciation 14460000000.0 11686000000.0 \n", + "Operating Gains Losses -409000000.0 -1249000000.0 \n", + "Gain Loss On Investment Securities NaN NaN \n", + "Net Income From Continuing Operations 72738000000.0 61271000000.0 \n", + "\n", + " 2020-06-30 \n", + "Free Cash Flow NaN \n", + "Repurchase Of Capital Stock NaN \n", + "Repayment Of Debt NaN \n", + "Issuance Of Debt 0.0 \n", + "Issuance Of Capital Stock NaN \n", + "Capital Expenditure NaN \n", + "End Cash Position NaN \n", + "Beginning Cash Position NaN \n", + "Effect Of Exchange Rate Changes NaN \n", + "Changes In Cash NaN \n", + "Financing Cash Flow NaN \n", + "Cash Flow From Continuing Financing Activities NaN \n", + "Net Other Financing Charges NaN \n", + "Cash Dividends Paid NaN \n", + "Common Stock Dividend Paid NaN \n", + "Net Common Stock Issuance NaN \n", + "Common Stock Payments NaN \n", + "Common Stock Issuance NaN \n", + "Net Issuance Payments Of Debt NaN \n", + "Net Short Term Debt Issuance 0.0 \n", + "Short Term Debt Issuance NaN \n", + "Net Long Term Debt Issuance NaN \n", + "Long Term Debt Payments NaN \n", + "Long Term Debt Issuance 0.0 \n", + "Investing Cash Flow NaN \n", + "Cash Flow From Continuing Investing Activities NaN \n", + "Net Other Investing Changes NaN \n", + "Net Investment Purchase And Sale NaN \n", + "Sale Of Investment NaN \n", + "Purchase Of Investment NaN \n", + "Net Business Purchase And Sale NaN \n", + "Purchase Of Business NaN \n", + "Net PPE Purchase And Sale NaN \n", + "Purchase Of PPE NaN \n", + "Operating Cash Flow NaN \n", + "Cash Flow From Continuing Operating Activities NaN \n", + "Change In Working Capital NaN \n", + "Change In Other Working Capital NaN \n", + "Change In Other Current Liabilities NaN \n", + "Change In Other Current Assets NaN \n", + "Change In Payables And Accrued Expense NaN \n", + "Change In Payable NaN \n", + "Change In Account Payable NaN \n", + "Change In Tax Payable NaN \n", + "Change In Income Tax Payable NaN \n", + "Change In Inventory NaN \n", + "Change In Receivables NaN \n", + "Changes In Account Receivables NaN \n", + "Stock Based Compensation NaN \n", + "Deferred Tax NaN \n", + "Deferred Income Tax NaN \n", + "Depreciation Amortization Depletion NaN \n", + "Depreciation And Amortization NaN \n", + "Depreciation NaN \n", + "Operating Gains Losses NaN \n", + "Gain Loss On Investment Securities -219000000.0 \n", + "Net Income From Continuing Operations NaN \n", + " 2024-09-30 2024-06-30 \\\n", + "Free Cash Flow 19257000000.0 23322000000.0 \n", + "Repurchase Of Capital Stock -4107000000.0 -4210000000.0 \n", + "Repayment Of Debt -966000000.0 -13065000000.0 \n", + "Issuance Of Debt 0.0 5447000000.0 \n", + "Issuance Of Capital Stock 706000000.0 534000000.0 \n", + "Capital Expenditure -14923000000.0 -13873000000.0 \n", + "End Cash Position 20840000000.0 18315000000.0 \n", + "Beginning Cash Position 18315000000.0 19634000000.0 \n", + "Effect Of Exchange Rate Changes 122000000.0 -103000000.0 \n", + "Changes In Cash 2403000000.0 -1216000000.0 \n", + "Financing Cash Flow -16576000000.0 -23563000000.0 \n", + "Cash Flow From Continuing Financing Activities -16576000000.0 -23563000000.0 \n", + "Net Other Financing Charges -889000000.0 -303000000.0 \n", + "Cash Dividends Paid -5574000000.0 -5574000000.0 \n", + "Common Stock Dividend Paid -5574000000.0 -5574000000.0 \n", + "Net Common Stock Issuance -3401000000.0 -3676000000.0 \n", + "Common Stock Payments -4107000000.0 -4210000000.0 \n", + "Common Stock Issuance 706000000.0 534000000.0 \n", + "Net Issuance Payments Of Debt -6712000000.0 -14010000000.0 \n", + "Net Short Term Debt Issuance -5746000000.0 -1142000000.0 \n", + "Short Term Debt Issuance NaN NaN \n", + "Net Long Term Debt Issuance -966000000.0 -12868000000.0 \n", + "Long Term Debt Payments -966000000.0 -13065000000.0 \n", + "Long Term Debt Issuance 0.0 197000000.0 \n", + "Investing Cash Flow -15201000000.0 -14848000000.0 \n", + "Cash Flow From Continuing Investing Activities -15201000000.0 -14848000000.0 \n", + "Net Other Investing Changes -913000000.0 -382000000.0 \n", + "Net Investment Purchase And Sale 2484000000.0 749000000.0 \n", + "Sale Of Investment 4104000000.0 3580000000.0 \n", + "Purchase Of Investment -1620000000.0 -2831000000.0 \n", + "Net Business Purchase And Sale -1849000000.0 -1342000000.0 \n", + "Purchase Of Business -1849000000.0 -1342000000.0 \n", + "Net PPE Purchase And Sale -14923000000.0 -13873000000.0 \n", + "Purchase Of PPE -14923000000.0 -13873000000.0 \n", + "Operating Cash Flow 34180000000.0 37195000000.0 \n", + "Cash Flow From Continuing Operating Activities 34180000000.0 37195000000.0 \n", + "Change In Working Capital 856000000.0 7184000000.0 \n", + "Change In Other Working Capital -4537000000.0 13164000000.0 \n", + "Change In Other Current Liabilities -5512000000.0 5088000000.0 \n", + "Change In Other Current Assets -1843000000.0 -3768000000.0 \n", + "Change In Payables And Accrued Expense -916000000.0 5891000000.0 \n", + "Change In Payable -916000000.0 5891000000.0 \n", + "Change In Account Payable -916000000.0 4204000000.0 \n", + "Change In Inventory -373000000.0 55000000.0 \n", + "Change In Receivables 14037000000.0 -13246000000.0 \n", + "Changes In Account Receivables 14037000000.0 -13246000000.0 \n", + "Stock Based Compensation 2832000000.0 2696000000.0 \n", + "Deferred Tax -1433000000.0 -1145000000.0 \n", + "Deferred Income Tax -1433000000.0 -1145000000.0 \n", + "Depreciation Amortization Depletion 7383000000.0 6380000000.0 \n", + "Depreciation And Amortization 7383000000.0 6380000000.0 \n", + "Depreciation 7383000000.0 6380000000.0 \n", + "Operating Gains Losses -125000000.0 44000000.0 \n", + "Net Income From Continuing Operations 24667000000.0 22036000000.0 \n", + "\n", + " 2024-03-31 2023-12-31 \\\n", + "Free Cash Flow 20965000000.0 9118000000.0 \n", + "Repurchase Of Capital Stock -4213000000.0 -4000000000.0 \n", + "Repayment Of Debt -11589000000.0 -2916000000.0 \n", + "Issuance Of Debt 6352000000.0 10773000000.0 \n", + "Issuance Of Capital Stock 522000000.0 261000000.0 \n", + "Capital Expenditure -10952000000.0 -9735000000.0 \n", + "End Cash Position 19634000000.0 17305000000.0 \n", + "Beginning Cash Position 17305000000.0 80452000000.0 \n", + "Effect Of Exchange Rate Changes -80000000.0 72000000.0 \n", + "Changes In Cash 2409000000.0 -63219000000.0 \n", + "Financing Cash Flow -18808000000.0 -10147000000.0 \n", + "Cash Flow From Continuing Financing Activities -18808000000.0 -10147000000.0 \n", + "Net Other Financing Charges -498000000.0 -201000000.0 \n", + "Cash Dividends Paid -5572000000.0 -5574000000.0 \n", + "Common Stock Dividend Paid -5572000000.0 -5574000000.0 \n", + "Net Common Stock Issuance -3691000000.0 -3739000000.0 \n", + "Common Stock Payments -4213000000.0 -4000000000.0 \n", + "Common Stock Issuance 522000000.0 261000000.0 \n", + "Net Issuance Payments Of Debt -9047000000.0 -633000000.0 \n", + "Net Short Term Debt Issuance -3810000000.0 -8490000000.0 \n", + "Short Term Debt Issuance NaN NaN \n", + "Net Long Term Debt Issuance -5237000000.0 7857000000.0 \n", + "Long Term Debt Payments -11589000000.0 -2916000000.0 \n", + "Long Term Debt Issuance 6352000000.0 10773000000.0 \n", + "Investing Cash Flow -10700000000.0 -71925000000.0 \n", + "Cash Flow From Continuing Investing Activities -10700000000.0 -71925000000.0 \n", + "Net Other Investing Changes -1281000000.0 1347000000.0 \n", + "Net Investment Purchase And Sale 3108000000.0 1492000000.0 \n", + "Sale Of Investment 5291000000.0 5750000000.0 \n", + "Purchase Of Investment -2183000000.0 -4258000000.0 \n", + "Net Business Purchase And Sale -1575000000.0 -65029000000.0 \n", + "Purchase Of Business -1575000000.0 -65029000000.0 \n", + "Net PPE Purchase And Sale -10952000000.0 -9735000000.0 \n", + "Purchase Of PPE -10952000000.0 -9735000000.0 \n", + "Operating Cash Flow 31917000000.0 18853000000.0 \n", + "Cash Flow From Continuing Operating Activities 31917000000.0 18853000000.0 \n", + "Change In Working Capital 2522000000.0 -10300000000.0 \n", + "Change In Other Working Capital 1977000000.0 -7092000000.0 \n", + "Change In Other Current Liabilities 2851000000.0 1492000000.0 \n", + "Change In Other Current Assets -1186000000.0 -702000000.0 \n", + "Change In Payables And Accrued Expense 648000000.0 -2521000000.0 \n", + "Change In Payable 648000000.0 -2521000000.0 \n", + "Change In Account Payable 648000000.0 -2521000000.0 \n", + "Change In Inventory 260000000.0 1474000000.0 \n", + "Change In Receivables -2028000000.0 -2951000000.0 \n", + "Changes In Account Receivables -2028000000.0 -2951000000.0 \n", + "Stock Based Compensation 2703000000.0 2828000000.0 \n", + "Deferred Tax -1323000000.0 -1702000000.0 \n", + "Deferred Income Tax -1323000000.0 -1702000000.0 \n", + "Depreciation Amortization Depletion 6027000000.0 5959000000.0 \n", + "Depreciation And Amortization 6027000000.0 5959000000.0 \n", + "Depreciation 6027000000.0 5959000000.0 \n", + "Operating Gains Losses 49000000.0 198000000.0 \n", + "Net Income From Continuing Operations 21939000000.0 21870000000.0 \n", + "\n", + " 2023-09-30 \n", + "Free Cash Flow 20666000000.0 \n", + "Repurchase Of Capital Stock -4831000000.0 \n", + "Repayment Of Debt -1500000000.0 \n", + "Issuance Of Debt 7073000000.0 \n", + "Issuance Of Capital Stock 685000000.0 \n", + "Capital Expenditure -9917000000.0 \n", + "End Cash Position 80452000000.0 \n", + "Beginning Cash Position 34704000000.0 \n", + "Effect Of Exchange Rate Changes -99000000.0 \n", + "Changes In Cash 45847000000.0 \n", + "Financing Cash Flow 14761000000.0 \n", + "Cash Flow From Continuing Financing Activities 14761000000.0 \n", + "Net Other Financing Charges -307000000.0 \n", + "Cash Dividends Paid -5051000000.0 \n", + "Common Stock Dividend Paid -5051000000.0 \n", + "Net Common Stock Issuance -4146000000.0 \n", + "Common Stock Payments -4831000000.0 \n", + "Common Stock Issuance 685000000.0 \n", + "Net Issuance Payments Of Debt 24265000000.0 \n", + "Net Short Term Debt Issuance 18692000000.0 \n", + "Short Term Debt Issuance 18692000000.0 \n", + "Net Long Term Debt Issuance 5573000000.0 \n", + "Long Term Debt Payments -1500000000.0 \n", + "Long Term Debt Issuance 7073000000.0 \n", + "Investing Cash Flow 503000000.0 \n", + "Cash Flow From Continuing Investing Activities 503000000.0 \n", + "Net Other Investing Changes -982000000.0 \n", + "Net Investment Purchase And Sale 12588000000.0 \n", + "Sale Of Investment 21048000000.0 \n", + "Purchase Of Investment -8460000000.0 \n", + "Net Business Purchase And Sale -1186000000.0 \n", + "Purchase Of Business -1186000000.0 \n", + "Net PPE Purchase And Sale -9917000000.0 \n", + "Purchase Of PPE -9917000000.0 \n", + "Operating Cash Flow 30583000000.0 \n", + "Cash Flow From Continuing Operating Activities 30583000000.0 \n", + "Change In Working Capital 2418000000.0 \n", + "Change In Other Working Capital -2701000000.0 \n", + "Change In Other Current Liabilities -3815000000.0 \n", + "Change In Other Current Assets -2809000000.0 \n", + "Change In Payables And Accrued Expense 1214000000.0 \n", + "Change In Payable 1214000000.0 \n", + "Change In Account Payable 1214000000.0 \n", + "Change In Inventory -505000000.0 \n", + "Change In Receivables 11034000000.0 \n", + "Changes In Account Receivables 11034000000.0 \n", + "Stock Based Compensation 2507000000.0 \n", + "Deferred Tax -568000000.0 \n", + "Deferred Income Tax -568000000.0 \n", + "Depreciation Amortization Depletion 3921000000.0 \n", + "Depreciation And Amortization 3921000000.0 \n", + "Depreciation 3921000000.0 \n", + "Operating Gains Losses 14000000.0 \n", + "Net Income From Continuing Operations 22291000000.0 \n" + ] + } + ], + "source": [ + "print(msft.cash_flow)\n", + "print(msft.quarterly_cash_flow)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 2024-06-30 \\\n", + "Tax Effect Of Unusual Items -99918000.0 \n", + "Tax Rate For Calcs 0.182 \n", + "Normalized EBITDA 133558000000.0 \n", + "Total Unusual Items -549000000.0 \n", + "Total Unusual Items Excluding Goodwill -549000000.0 \n", + "Net Income From Continuing Operation Net Minori... 88136000000.0 \n", + "Reconciled Depreciation 22287000000.0 \n", + "Reconciled Cost Of Revenue 74114000000.0 \n", + "EBITDA 133009000000.0 \n", + "EBIT 110722000000.0 \n", + "Net Interest Income 222000000.0 \n", + "Interest Expense 2935000000.0 \n", + "Interest Income 3157000000.0 \n", + "Normalized Income 88585082000.0 \n", + "Net Income From Continuing And Discontinued Ope... 88136000000.0 \n", + "Total Expenses 135689000000.0 \n", + "Total Operating Income As Reported 109433000000.0 \n", + "Diluted Average Shares 7469000000.0 \n", + "Basic Average Shares 7431000000.0 \n", + "Diluted EPS 11.8 \n", + "Basic EPS 11.86 \n", + "Diluted NI Availto Com Stockholders 88136000000.0 \n", + "Net Income Common Stockholders 88136000000.0 \n", + "Net Income 88136000000.0 \n", + "Net Income Including Noncontrolling Interests 88136000000.0 \n", + "Net Income Continuous Operations 88136000000.0 \n", + "Tax Provision 19651000000.0 \n", + "Pretax Income 107787000000.0 \n", + "Other Income Expense -1868000000.0 \n", + "Other Non Operating Income Expenses -1319000000.0 \n", + "Special Income Charges -206000000.0 \n", + "Write Off 206000000.0 \n", + "Gain On Sale Of Security -343000000.0 \n", + "Net Non Operating Interest Income Expense 222000000.0 \n", + "Interest Expense Non Operating 2935000000.0 \n", + "Interest Income Non Operating 3157000000.0 \n", + "Operating Income 109433000000.0 \n", + "Operating Expense 61575000000.0 \n", + "Research And Development 29510000000.0 \n", + "Selling General And Administration 32065000000.0 \n", + "Selling And Marketing Expense 24456000000.0 \n", + "General And Administrative Expense 7609000000.0 \n", + "Other Gand A 7609000000.0 \n", + "Gross Profit 171008000000.0 \n", + "Cost Of Revenue 74114000000.0 \n", + "Total Revenue 245122000000.0 \n", + "Operating Revenue 245122000000.0 \n", + "\n", + " 2023-06-30 \\\n", + "Tax Effect Of Unusual Items -2850000.0 \n", + "Tax Rate For Calcs 0.19 \n", + "Normalized EBITDA 105155000000.0 \n", + "Total Unusual Items -15000000.0 \n", + "Total Unusual Items Excluding Goodwill -15000000.0 \n", + "Net Income From Continuing Operation Net Minori... 72361000000.0 \n", + "Reconciled Depreciation 13861000000.0 \n", + "Reconciled Cost Of Revenue 65863000000.0 \n", + "EBITDA 105140000000.0 \n", + "EBIT 91279000000.0 \n", + "Net Interest Income 1026000000.0 \n", + "Interest Expense 1968000000.0 \n", + "Interest Income 2994000000.0 \n", + "Normalized Income 72373150000.0 \n", + "Net Income From Continuing And Discontinued Ope... 72361000000.0 \n", + "Total Expenses 123392000000.0 \n", + "Total Operating Income As Reported 88523000000.0 \n", + "Diluted Average Shares 7472000000.0 \n", + "Basic Average Shares 7446000000.0 \n", + "Diluted EPS 9.68 \n", + "Basic EPS 9.72 \n", + "Diluted NI Availto Com Stockholders 72361000000.0 \n", + "Net Income Common Stockholders 72361000000.0 \n", + "Net Income 72361000000.0 \n", + "Net Income Including Noncontrolling Interests 72361000000.0 \n", + "Net Income Continuous Operations 72361000000.0 \n", + "Tax Provision 16950000000.0 \n", + "Pretax Income 89311000000.0 \n", + "Other Income Expense -238000000.0 \n", + "Other Non Operating Income Expenses -223000000.0 \n", + "Special Income Charges -30000000.0 \n", + "Write Off 30000000.0 \n", + "Gain On Sale Of Security 15000000.0 \n", + "Net Non Operating Interest Income Expense 1026000000.0 \n", + "Interest Expense Non Operating 1968000000.0 \n", + "Interest Income Non Operating 2994000000.0 \n", + "Operating Income 88523000000.0 \n", + "Operating Expense 57529000000.0 \n", + "Research And Development 27195000000.0 \n", + "Selling General And Administration 30334000000.0 \n", + "Selling And Marketing Expense 22759000000.0 \n", + "General And Administrative Expense 7575000000.0 \n", + "Other Gand A 7575000000.0 \n", + "Gross Profit 146052000000.0 \n", + "Cost Of Revenue 65863000000.0 \n", + "Total Revenue 211915000000.0 \n", + "Operating Revenue 211915000000.0 \n", + "\n", + " 2022-06-30 \\\n", + "Tax Effect Of Unusual Items 43754000.0 \n", + "Tax Rate For Calcs 0.131 \n", + "Normalized EBITDA 99905000000.0 \n", + "Total Unusual Items 334000000.0 \n", + "Total Unusual Items Excluding Goodwill 334000000.0 \n", + "Net Income From Continuing Operation Net Minori... 72738000000.0 \n", + "Reconciled Depreciation 14460000000.0 \n", + "Reconciled Cost Of Revenue 62650000000.0 \n", + "EBITDA 100239000000.0 \n", + "EBIT 85779000000.0 \n", + "Net Interest Income 31000000.0 \n", + "Interest Expense 2063000000.0 \n", + "Interest Income 2094000000.0 \n", + "Normalized Income 72447754000.0 \n", + "Net Income From Continuing And Discontinued Ope... 72738000000.0 \n", + "Total Expenses 114887000000.0 \n", + "Total Operating Income As Reported 83383000000.0 \n", + "Diluted Average Shares 7540000000.0 \n", + "Basic Average Shares 7496000000.0 \n", + "Diluted EPS 9.65 \n", + "Basic EPS 9.7 \n", + "Diluted NI Availto Com Stockholders 72738000000.0 \n", + "Net Income Common Stockholders 72738000000.0 \n", + "Net Income 72738000000.0 \n", + "Net Income Including Noncontrolling Interests 72738000000.0 \n", + "Net Income Continuous Operations 72738000000.0 \n", + "Tax Provision 10978000000.0 \n", + "Pretax Income 83716000000.0 \n", + "Other Income Expense 302000000.0 \n", + "Other Non Operating Income Expenses -32000000.0 \n", + "Special Income Charges -101000000.0 \n", + "Write Off 101000000.0 \n", + "Gain On Sale Of Security 435000000.0 \n", + "Net Non Operating Interest Income Expense 31000000.0 \n", + "Interest Expense Non Operating 2063000000.0 \n", + "Interest Income Non Operating 2094000000.0 \n", + "Operating Income 83383000000.0 \n", + "Operating Expense 52237000000.0 \n", + "Research And Development 24512000000.0 \n", + "Selling General And Administration 27725000000.0 \n", + "Selling And Marketing Expense 21825000000.0 \n", + "General And Administrative Expense 5900000000.0 \n", + "Other Gand A 5900000000.0 \n", + "Gross Profit 135620000000.0 \n", + "Cost Of Revenue 62650000000.0 \n", + "Total Revenue 198270000000.0 \n", + "Operating Revenue 198270000000.0 \n", + "\n", + " 2021-06-30 \n", + "Tax Effect Of Unusual Items 180160797.164637 \n", + "Tax Rate For Calcs 0.138266 \n", + "Normalized EBITDA 83831000000.0 \n", + "Total Unusual Items 1303000000.0 \n", + "Total Unusual Items Excluding Goodwill 1303000000.0 \n", + "Net Income From Continuing Operation Net Minori... 61271000000.0 \n", + "Reconciled Depreciation 11686000000.0 \n", + "Reconciled Cost Of Revenue 52232000000.0 \n", + "EBITDA 85134000000.0 \n", + "EBIT 73448000000.0 \n", + "Net Interest Income -215000000.0 \n", + "Interest Expense 2346000000.0 \n", + "Interest Income 2131000000.0 \n", + "Normalized Income 60148160797.164635 \n", + "Net Income From Continuing And Discontinued Ope... 61271000000.0 \n", + "Total Expenses 98172000000.0 \n", + "Total Operating Income As Reported 69916000000.0 \n", + "Diluted Average Shares 7608000000.0 \n", + "Basic Average Shares 7547000000.0 \n", + "Diluted EPS 8.05 \n", + "Basic EPS 8.12 \n", + "Diluted NI Availto Com Stockholders 61271000000.0 \n", + "Net Income Common Stockholders 61271000000.0 \n", + "Net Income 61271000000.0 \n", + "Net Income Including Noncontrolling Interests 61271000000.0 \n", + "Net Income Continuous Operations 61271000000.0 \n", + "Tax Provision 9831000000.0 \n", + "Pretax Income 71102000000.0 \n", + "Other Income Expense 1401000000.0 \n", + "Other Non Operating Income Expenses 98000000.0 \n", + "Special Income Charges -13000000.0 \n", + "Write Off 13000000.0 \n", + "Gain On Sale Of Security 1316000000.0 \n", + "Net Non Operating Interest Income Expense -215000000.0 \n", + "Interest Expense Non Operating 2346000000.0 \n", + "Interest Income Non Operating 2131000000.0 \n", + "Operating Income 69916000000.0 \n", + "Operating Expense 45940000000.0 \n", + "Research And Development 20716000000.0 \n", + "Selling General And Administration 25224000000.0 \n", + "Selling And Marketing Expense 20117000000.0 \n", + "General And Administrative Expense 5107000000.0 \n", + "Other Gand A 5107000000.0 \n", + "Gross Profit 115856000000.0 \n", + "Cost Of Revenue 52232000000.0 \n", + "Total Revenue 168088000000.0 \n", + "Operating Revenue 168088000000.0 \n", + " 2024-09-30 \\\n", + "Tax Effect Of Unusual Items 57190000.0 \n", + "Tax Rate For Calcs 0.19 \n", + "Normalized EBITDA 37933000000.0 \n", + "Total Unusual Items 301000000.0 \n", + "Total Unusual Items Excluding Goodwill 301000000.0 \n", + "Net Income From Continuing Operation Net Minori... 24667000000.0 \n", + "Reconciled Depreciation 7383000000.0 \n", + "Reconciled Cost Of Revenue 20099000000.0 \n", + "EBITDA 38234000000.0 \n", + "EBIT 30851000000.0 \n", + "Net Interest Income 99000000.0 \n", + "Interest Expense 582000000.0 \n", + "Interest Income 681000000.0 \n", + "Normalized Income 24423190000.0 \n", + "Net Income From Continuing And Discontinued Ope... 24667000000.0 \n", + "Total Expenses 35033000000.0 \n", + "Total Operating Income As Reported 30552000000.0 \n", + "Diluted Average Shares 7470000000.0 \n", + "Basic Average Shares 7433000000.0 \n", + "Diluted EPS 3.3 \n", + "Basic EPS 3.32 \n", + "Diluted NI Availto Com Stockholders 24667000000.0 \n", + "Net Income Common Stockholders 24667000000.0 \n", + "Net Income 24667000000.0 \n", + "Net Income Including Noncontrolling Interests 24667000000.0 \n", + "Net Income Continuous Operations 24667000000.0 \n", + "Tax Provision 5602000000.0 \n", + "Pretax Income 30269000000.0 \n", + "Other Income Expense -382000000.0 \n", + "Other Non Operating Income Expenses -683000000.0 \n", + "Special Income Charges -7000000.0 \n", + "Write Off 7000000.0 \n", + "Gain On Sale Of Security 308000000.0 \n", + "Net Non Operating Interest Income Expense 99000000.0 \n", + "Interest Expense Non Operating 582000000.0 \n", + "Interest Income Non Operating 681000000.0 \n", + "Operating Income 30552000000.0 \n", + "Operating Expense 14934000000.0 \n", + "Research And Development 7544000000.0 \n", + "Selling General And Administration 7390000000.0 \n", + "Selling And Marketing Expense 5717000000.0 \n", + "General And Administrative Expense 1673000000.0 \n", + "Other Gand A 1673000000.0 \n", + "Gross Profit 45486000000.0 \n", + "Cost Of Revenue 20099000000.0 \n", + "Total Revenue 65585000000.0 \n", + "Operating Revenue 65585000000.0 \n", + "\n", + " 2024-06-30 \\\n", + "Tax Effect Of Unusual Items -16263853.211009 \n", + "Tax Rate For Calcs 0.191339 \n", + "Normalized EBITDA 34416000000.0 \n", + "Total Unusual Items -85000000.0 \n", + "Total Unusual Items Excluding Goodwill -85000000.0 \n", + "Net Income From Continuing Operation Net Minori... 22036000000.0 \n", + "Reconciled Depreciation 6380000000.0 \n", + "Reconciled Cost Of Revenue 19684000000.0 \n", + "EBITDA 34331000000.0 \n", + "EBIT 27951000000.0 \n", + "Net Interest Income -63000000.0 \n", + "Interest Expense 701000000.0 \n", + "Interest Income 638000000.0 \n", + "Normalized Income 22104736146.78899 \n", + "Net Income From Continuing And Discontinued Ope... 22036000000.0 \n", + "Total Expenses 36802000000.0 \n", + "Total Operating Income As Reported 27925000000.0 \n", + "Diluted Average Shares 7472000000.0 \n", + "Basic Average Shares 7433000000.0 \n", + "Diluted EPS 2.95 \n", + "Basic EPS 2.96 \n", + "Diluted NI Availto Com Stockholders 22036000000.0 \n", + "Net Income Common Stockholders 22036000000.0 \n", + "Net Income 22036000000.0 \n", + "Net Income Including Noncontrolling Interests 22036000000.0 \n", + "Net Income Continuous Operations 22036000000.0 \n", + "Tax Provision 5214000000.0 \n", + "Pretax Income 27250000000.0 \n", + "Other Income Expense -612000000.0 \n", + "Other Non Operating Income Expenses -527000000.0 \n", + "Special Income Charges -22000000.0 \n", + "Write Off 22000000.0 \n", + "Gain On Sale Of Security -63000000.0 \n", + "Net Non Operating Interest Income Expense -63000000.0 \n", + "Interest Expense Non Operating 701000000.0 \n", + "Interest Income Non Operating 638000000.0 \n", + "Operating Income 27925000000.0 \n", + "Operating Expense 17118000000.0 \n", + "Research And Development 8056000000.0 \n", + "Selling General And Administration 9062000000.0 \n", + "Selling And Marketing Expense 6816000000.0 \n", + "General And Administrative Expense 2246000000.0 \n", + "Other Gand A 2246000000.0 \n", + "Gross Profit 45043000000.0 \n", + "Cost Of Revenue 19684000000.0 \n", + "Total Revenue 64727000000.0 \n", + "Operating Revenue 64727000000.0 \n", + "\n", + " 2024-03-31 \\\n", + "Tax Effect Of Unusual Items -33660000.0 \n", + "Tax Rate For Calcs 0.18 \n", + "Normalized EBITDA 33741000000.0 \n", + "Total Unusual Items -187000000.0 \n", + "Total Unusual Items Excluding Goodwill -187000000.0 \n", + "Net Income From Continuing Operation Net Minori... 21939000000.0 \n", + "Reconciled Depreciation 6027000000.0 \n", + "Reconciled Cost Of Revenue 18505000000.0 \n", + "EBITDA 33554000000.0 \n", + "EBIT 27527000000.0 \n", + "Net Interest Income -181000000.0 \n", + "Interest Expense 800000000.0 \n", + "Interest Income 619000000.0 \n", + "Normalized Income 22092340000.0 \n", + "Net Income From Continuing And Discontinued Ope... 21939000000.0 \n", + "Total Expenses 34277000000.0 \n", + "Total Operating Income As Reported 27581000000.0 \n", + "Diluted Average Shares 7472000000.0 \n", + "Basic Average Shares 7431000000.0 \n", + "Diluted EPS 2.94 \n", + "Basic EPS 2.95 \n", + "Diluted NI Availto Com Stockholders 21939000000.0 \n", + "Net Income Common Stockholders 21939000000.0 \n", + "Net Income 21939000000.0 \n", + "Net Income Including Noncontrolling Interests 21939000000.0 \n", + "Net Income Continuous Operations 21939000000.0 \n", + "Tax Provision 4788000000.0 \n", + "Pretax Income 26727000000.0 \n", + "Other Income Expense -673000000.0 \n", + "Other Non Operating Income Expenses -486000000.0 \n", + "Special Income Charges -17000000.0 \n", + "Write Off 17000000.0 \n", + "Gain On Sale Of Security -170000000.0 \n", + "Net Non Operating Interest Income Expense -181000000.0 \n", + "Interest Expense Non Operating 800000000.0 \n", + "Interest Income Non Operating 619000000.0 \n", + "Operating Income 27581000000.0 \n", + "Operating Expense 15772000000.0 \n", + "Research And Development 7653000000.0 \n", + "Selling General And Administration 8119000000.0 \n", + "Selling And Marketing Expense 6207000000.0 \n", + "General And Administrative Expense 1912000000.0 \n", + "Other Gand A 1912000000.0 \n", + "Gross Profit 43353000000.0 \n", + "Cost Of Revenue 18505000000.0 \n", + "Total Revenue 61858000000.0 \n", + "Operating Revenue 61858000000.0 \n", + "\n", + " 2023-12-31 \\\n", + "Tax Effect Of Unusual Items -29160000.0 \n", + "Tax Rate For Calcs 0.18 \n", + "Normalized EBITDA 33556000000.0 \n", + "Total Unusual Items -162000000.0 \n", + "Total Unusual Items Excluding Goodwill -162000000.0 \n", + "Net Income From Continuing Operation Net Minori... 21870000000.0 \n", + "Reconciled Depreciation 5959000000.0 \n", + "Reconciled Cost Of Revenue 19623000000.0 \n", + "EBITDA 33394000000.0 \n", + "EBIT 27435000000.0 \n", + "Net Interest Income -175000000.0 \n", + "Interest Expense 909000000.0 \n", + "Interest Income 734000000.0 \n", + "Normalized Income 22002840000.0 \n", + "Net Income From Continuing And Discontinued Ope... 21870000000.0 \n", + "Total Expenses 34988000000.0 \n", + "Total Operating Income As Reported 27032000000.0 \n", + "Diluted Average Shares 7468000000.0 \n", + "Basic Average Shares 7432000000.0 \n", + "Diluted EPS 2.93 \n", + "Basic EPS 2.94 \n", + "Diluted NI Availto Com Stockholders 21870000000.0 \n", + "Net Income Common Stockholders 21870000000.0 \n", + "Net Income 21870000000.0 \n", + "Net Income Including Noncontrolling Interests 21870000000.0 \n", + "Net Income Continuous Operations 21870000000.0 \n", + "Tax Provision 4656000000.0 \n", + "Pretax Income 26526000000.0 \n", + "Other Income Expense -331000000.0 \n", + "Other Non Operating Income Expenses -169000000.0 \n", + "Special Income Charges -161000000.0 \n", + "Write Off 161000000.0 \n", + "Gain On Sale Of Security -1000000.0 \n", + "Net Non Operating Interest Income Expense -175000000.0 \n", + "Interest Expense Non Operating 909000000.0 \n", + "Interest Income Non Operating 734000000.0 \n", + "Operating Income 27032000000.0 \n", + "Operating Expense 15365000000.0 \n", + "Research And Development 7142000000.0 \n", + "Selling General And Administration 8223000000.0 \n", + "Selling And Marketing Expense 6246000000.0 \n", + "General And Administrative Expense 1977000000.0 \n", + "Other Gand A 1977000000.0 \n", + "Gross Profit 42397000000.0 \n", + "Cost Of Revenue 19623000000.0 \n", + "Total Revenue 62020000000.0 \n", + "Operating Revenue 62020000000.0 \n", + "\n", + " 2023-09-30 \n", + "Tax Effect Of Unusual Items -20700000.0 \n", + "Tax Rate For Calcs 0.18 \n", + "Normalized EBITDA 31845000000.0 \n", + "Total Unusual Items -115000000.0 \n", + "Total Unusual Items Excluding Goodwill -115000000.0 \n", + "Net Income From Continuing Operation Net Minori... 22291000000.0 \n", + "Reconciled Depreciation 3921000000.0 \n", + "Reconciled Cost Of Revenue 16302000000.0 \n", + "EBITDA 31730000000.0 \n", + "EBIT 27809000000.0 \n", + "Net Interest Income 641000000.0 \n", + "Interest Expense 525000000.0 \n", + "Interest Income 1166000000.0 \n", + "Normalized Income 22385300000.0 \n", + "Net Income From Continuing And Discontinued Ope... 22291000000.0 \n", + "Total Expenses 29622000000.0 \n", + "Total Operating Income As Reported 26895000000.0 \n", + "Diluted Average Shares 7462000000.0 \n", + "Basic Average Shares 7429000000.0 \n", + "Diluted EPS 2.99 \n", + "Basic EPS 3.0 \n", + "Diluted NI Availto Com Stockholders 22291000000.0 \n", + "Net Income Common Stockholders 22291000000.0 \n", + "Net Income 22291000000.0 \n", + "Net Income Including Noncontrolling Interests 22291000000.0 \n", + "Net Income Continuous Operations 22291000000.0 \n", + "Tax Provision 4993000000.0 \n", + "Pretax Income 27284000000.0 \n", + "Other Income Expense -252000000.0 \n", + "Other Non Operating Income Expenses -137000000.0 \n", + "Special Income Charges -6000000.0 \n", + "Write Off 6000000.0 \n", + "Gain On Sale Of Security -109000000.0 \n", + "Net Non Operating Interest Income Expense 641000000.0 \n", + "Interest Expense Non Operating 525000000.0 \n", + "Interest Income Non Operating 1166000000.0 \n", + "Operating Income 26895000000.0 \n", + "Operating Expense 13320000000.0 \n", + "Research And Development 6659000000.0 \n", + "Selling General And Administration 6661000000.0 \n", + "Selling And Marketing Expense 5187000000.0 \n", + "General And Administrative Expense 1474000000.0 \n", + "Other Gand A 1474000000.0 \n", + "Gross Profit 40215000000.0 \n", + "Cost Of Revenue 16302000000.0 \n", + "Total Revenue 56517000000.0 \n", + "Operating Revenue 56517000000.0 \n" + ] + } + ], + "source": [ + "print(msft.income_stmt)\n", + "print(msft.quarterly_income_stmt)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
esgScores
maxAge86400
totalEsg14.23
environmentScore1.65
socialScore7.62
governanceScore4.96
ratingYear2025
ratingMonth1
highestControversy3.0
peerCount604
esgPerformanceLAG_PERF
peerGroupSoftware & Services
relatedControversy[Customer Incidents]
peerEsgScorePerformance{'min': 7.44, 'avg': 20.74918874172186, 'max':...
peerGovernancePerformance{'min': 1.34, 'avg': 5.767258687258689, 'max':...
peerSocialPerformance{'min': 4.49, 'avg': 9.80806949806949, 'max': ...
peerEnvironmentPerformance{'min': 0.05, 'avg': 3.0050579150579146, 'max'...
peerHighestControversyPerformance{'min': 0.0, 'avg': 0.6539735099337748, 'max':...
percentileNone
environmentPercentileNone
socialPercentileNone
governancePercentileNone
adultFalse
alcoholicFalse
animalTestingFalse
catholicNone
controversialWeaponsFalse
smallArmsFalse
furLeatherFalse
gamblingFalse
gmoFalse
militaryContractFalse
nuclearFalse
pesticidesFalse
palmOilFalse
coalFalse
tobaccoFalse
\n", + "
" + ], + "text/plain": [ + " esgScores\n", + "maxAge 86400\n", + "totalEsg 14.23\n", + "environmentScore 1.65\n", + "socialScore 7.62\n", + "governanceScore 4.96\n", + "ratingYear 2025\n", + "ratingMonth 1\n", + "highestControversy 3.0\n", + "peerCount 604\n", + "esgPerformance LAG_PERF\n", + "peerGroup Software & Services\n", + "relatedControversy [Customer Incidents]\n", + "peerEsgScorePerformance {'min': 7.44, 'avg': 20.74918874172186, 'max':...\n", + "peerGovernancePerformance {'min': 1.34, 'avg': 5.767258687258689, 'max':...\n", + "peerSocialPerformance {'min': 4.49, 'avg': 9.80806949806949, 'max': ...\n", + "peerEnvironmentPerformance {'min': 0.05, 'avg': 3.0050579150579146, 'max'...\n", + "peerHighestControversyPerformance {'min': 0.0, 'avg': 0.6539735099337748, 'max':...\n", + "percentile None\n", + "environmentPercentile None\n", + "socialPercentile None\n", + "governancePercentile None\n", + "adult False\n", + "alcoholic False\n", + "animalTesting False\n", + "catholic None\n", + "controversialWeapons False\n", + "smallArms False\n", + "furLeather False\n", + "gambling False\n", + "gmo False\n", + "militaryContract False\n", + "nuclear False\n", + "pesticides False\n", + "palmOil False\n", + "coal False\n", + "tobacco False" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "msft.sustainability" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " period strongBuy buy hold sell strongSell\n", + "0 0m 14 38 5 0 0\n", + "1 -1m 14 38 5 0 0\n", + "2 -2m 14 38 5 0 0\n", + "3 -3m 14 38 5 0 0\n" + ] + } + ], + "source": [ + "msft.recommendations" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Dividend Date': datetime.date(2025, 3, 13),\n", + " 'Ex-Dividend Date': datetime.date(2025, 2, 20),\n", + " 'Earnings Date': [datetime.date(2025, 1, 29)],\n", + " 'Earnings High': 3.47,\n", + " 'Earnings Low': 3.02,\n", + " 'Earnings Average': 3.13371,\n", + " 'Revenue High': 70520000000,\n", + " 'Revenue Low': 68261000000,\n", + " 'Revenue Average': 68861379010}" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "msft.calendar" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'id': '9d141c88-e564-49d7-b2b6-d01b666411a8',\n", + " 'content': {'id': '9d141c88-e564-49d7-b2b6-d01b666411a8',\n", + " 'contentType': 'STORY',\n", + " 'title': \"TikTok's future is now in the hands of the Supreme Court\",\n", + " 'description': '',\n", + " 'summary': 'TikTok and its Chinese parent company are facing off against the Justice Department Friday in a hearing before the Supreme Court that will help determine the fate of the popular social media app.',\n", + " 'pubDate': '2025-01-09T15:28:54Z',\n", + " 'isHosted': True,\n", + " 'bypassModal': False,\n", + " 'previewUrl': None,\n", + " 'thumbnail': {'originalUrl': 'https://s.yimg.com/os/creatr-uploaded-images/2025-01/c0f690f0-ce98-11ef-9b53-60aab1d1b31d',\n", + " 'originalWidth': 3000,\n", + " 'originalHeight': 2000,\n", + " 'caption': '',\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/Imin228yYHOZBwpns7sUCw--~B/aD0yMDAwO3c9MzAwMDthcHBpZD15dGFjaHlvbg--/https://s.yimg.com/os/creatr-uploaded-images/2025-01/c0f690f0-ce98-11ef-9b53-60aab1d1b31d',\n", + " 'width': 3000,\n", + " 'height': 2000,\n", + " 'tag': 'original'},\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/a28M8PHJ09LiQLo6yuPi8Q--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://s.yimg.com/os/creatr-uploaded-images/2025-01/c0f690f0-ce98-11ef-9b53-60aab1d1b31d',\n", + " 'width': 170,\n", + " 'height': 128,\n", + " 'tag': '170x128'}]},\n", + " 'provider': {'displayName': 'Yahoo Finance',\n", + " 'url': 'http://finance.yahoo.com/'},\n", + " 'canonicalUrl': {'url': 'https://finance.yahoo.com/news/tiktoks-future-is-now-in-the-hands-of-the-supreme-court-152854307.html',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/tiktoks-future-is-now-in-the-hands-of-the-supreme-court-152854307.html',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'metadata': {'editorsPick': True},\n", + " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", + " 'isPremiumFreeNews': False}},\n", + " 'storyline': {'storylineItems': [{'content': {'id': '2809a22b-eeda-3d2c-8e92-eca8f7ee6027',\n", + " 'contentType': 'VIDEO',\n", + " 'isHosted': True,\n", + " 'title': 'Top 3 tech trends that dominated CES 2025',\n", + " 'thumbnail': {'originalUrl': 'https://s.yimg.com/os/creatr-uploaded-images/2025-01/08565e40-ce9d-11ef-b9ff-758569a84cb2',\n", + " 'originalWidth': 3600,\n", + " 'originalHeight': 2027,\n", + " 'caption': '',\n", + " 'resolutions': None},\n", + " 'provider': {'displayName': 'Yahoo Finance Video',\n", + " 'sourceId': 'video.yahoofinance.com'},\n", + " 'previewUrl': None,\n", + " 'providerContentUrl': '',\n", + " 'canonicalUrl': {'url': 'https://finance.yahoo.com/video/top-3-tech-trends-dominated-152212309.html'},\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/video/top-3-tech-trends-dominated-152212309.html'}}},\n", + " {'content': {'id': '8e080afd-f198-43c6-adef-808d9dca83d5',\n", + " 'contentType': 'STORY',\n", + " 'isHosted': True,\n", + " 'title': \"Stocks are priced for 'perfection' and more vulnerable to a correction, Goldman warns\",\n", + " 'thumbnail': {'originalUrl': 'https://s.yimg.com/os/creatr-uploaded-images/2024-12/dfb6ff80-c7a8-11ef-8fff-d96912c6b9f9',\n", + " 'originalWidth': 7539,\n", + " 'originalHeight': 5026,\n", + " 'caption': '',\n", + " 'resolutions': None},\n", + " 'provider': {'displayName': 'Yahoo Finance',\n", + " 'sourceId': 'yahoofinance.com'},\n", + " 'previewUrl': None,\n", + " 'providerContentUrl': '',\n", + " 'canonicalUrl': {'url': 'https://finance.yahoo.com/news/stocks-are-priced-for-perfection-and-more-vulnerable-to-a-correction-goldman-warns-114026237.html'},\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/stocks-are-priced-for-perfection-and-more-vulnerable-to-a-correction-goldman-warns-114026237.html'}}}]}}},\n", + " {'id': '54ac2316-dbd0-379c-a86e-d44cf9705bf5',\n", + " 'content': {'id': '54ac2316-dbd0-379c-a86e-d44cf9705bf5',\n", + " 'contentType': 'STORY',\n", + " 'title': 'Artificial Intelligence (AI), Quantum Computing, and RoboTaxis: Here\\'s 1 \"Magnificent Seven\" Stock That Has It All',\n", + " 'description': '',\n", + " 'summary': 'Artificial intelligence (AI) could be the greatest game-changing technology ever. Here\\'s one \"Magnificent Seven\" stock that has it all. Google parent Alphabet (NASDAQ: GOOG) (NASDAQ: GOOGL) has pioneered AI for years.',\n", + " 'pubDate': '2025-01-10T09:45:00Z',\n", + " 'isHosted': True,\n", + " 'bypassModal': False,\n", + " 'previewUrl': None,\n", + " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/motleyfool.com/c33e2d0e7845c947afe6733e9d49e946',\n", + " 'originalWidth': 2121,\n", + " 'originalHeight': 1414,\n", + " 'caption': '',\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/sb4A_RWX900d2FZU71xt0w--~B/aD0xNDE0O3c9MjEyMTthcHBpZD15dGFjaHlvbg--/https://media.zenfs.com/en/motleyfool.com/c33e2d0e7845c947afe6733e9d49e946',\n", + " 'width': 2121,\n", + " 'height': 1414,\n", + " 'tag': 'original'},\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/h_BQjtk3J7zDu.OzPzcIpQ--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/motleyfool.com/c33e2d0e7845c947afe6733e9d49e946',\n", + " 'width': 170,\n", + " 'height': 128,\n", + " 'tag': '170x128'}]},\n", + " 'provider': {'displayName': 'Motley Fool', 'url': 'http://www.fool.com/'},\n", + " 'canonicalUrl': {'url': 'https://www.fool.com/investing/2025/01/10/ai-quantum-computing-magnificent-seven-stock/?source=eptyholnk0000202&utm_source=yahoo-host-full&utm_medium=feed&utm_campaign=article&referring_guid=e56824b8-f3c2-4c54-9cf5-126803df28ba',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/artificial-intelligence-ai-quantum-computing-094500001.html',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'metadata': {'editorsPick': False},\n", + " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", + " 'isPremiumFreeNews': False}},\n", + " 'storyline': None}},\n", + " {'id': 'c7f72eae-b363-32ba-9736-fae3373c0094',\n", + " 'content': {'id': 'c7f72eae-b363-32ba-9736-fae3373c0094',\n", + " 'contentType': 'STORY',\n", + " 'title': 'Prediction: 1 Unstoppable Artificial Intelligence (AI) Stock Will Lead the \"Third Wave\" of AI Development and Be Worth More Than Nvidia by 2030',\n", + " 'description': '',\n", + " 'summary': \"Nvidia (NASDAQ: NVDA) has been among the best-performing stocks of 2024, and it's easy to see why. The company provides the graphics processing units (GPUs) that quickly became the gold standard for powering artificial intelligence (AI) systems. The wave of demand for its chips has pushed the company's market cap to nearly $3.7 trillion as of this writing, currently making it the world's second most valuable company.\",\n", + " 'pubDate': '2025-01-10T09:05:00Z',\n", + " 'isHosted': True,\n", + " 'bypassModal': False,\n", + " 'previewUrl': None,\n", + " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/motleyfool.com/7bc0d30db52efd8c30a09faa3324ab1b',\n", + " 'originalWidth': 1400,\n", + " 'originalHeight': 932,\n", + " 'caption': 'A person\\'s hand cupped open with a hologram of an AI chatbot above saying \"Hi, can I help you?\"',\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/p4w179om5_B64AFbWSuEuw--~B/aD05MzI7dz0xNDAwO2FwcGlkPXl0YWNoeW9u/https://media.zenfs.com/en/motleyfool.com/7bc0d30db52efd8c30a09faa3324ab1b',\n", + " 'width': 1400,\n", + " 'height': 932,\n", + " 'tag': 'original'},\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/PnkCbEk8qsr7POGGrudGVQ--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/motleyfool.com/7bc0d30db52efd8c30a09faa3324ab1b',\n", + " 'width': 170,\n", + " 'height': 128,\n", + " 'tag': '170x128'}]},\n", + " 'provider': {'displayName': 'Motley Fool', 'url': 'http://www.fool.com/'},\n", + " 'canonicalUrl': {'url': 'https://www.fool.com/investing/2025/01/10/prediction-1-unstoppable-artificial-intelligence-a/?source=eptyholnk0000202&utm_source=yahoo-host-full&utm_medium=feed&utm_campaign=article&referring_guid=df931381-4d24-4749-a2e6-152e3a93dd0f',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/prediction-1-unstoppable-artificial-intelligence-090500102.html',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'metadata': {'editorsPick': False},\n", + " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", + " 'isPremiumFreeNews': False}},\n", + " 'storyline': None}},\n", + " {'id': '514567bc-4750-49ea-ba6c-2c6dca7651ac',\n", + " 'content': {'id': '514567bc-4750-49ea-ba6c-2c6dca7651ac',\n", + " 'contentType': 'STORY',\n", + " 'title': 'Bitcoin ETFs and the race to institutionalise crypto',\n", + " 'description': '',\n", + " 'summary': '2024 was pivotal for bitcoin and the crypto market, fuelled by a surge in institutional adoption through bitcoin and ether exchange-traded funds.',\n", + " 'pubDate': '2025-01-10T06:00:59Z',\n", + " 'isHosted': True,\n", + " 'bypassModal': False,\n", + " 'previewUrl': None,\n", + " 'thumbnail': {'originalUrl': 'https://s.yimg.com/os/creatr-uploaded-images/2024-10/47d95570-9f6a-11ef-a9be-5f7d6fd83f98',\n", + " 'originalWidth': 5797,\n", + " 'originalHeight': 3867,\n", + " 'caption': '',\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/uRMJOIguvXATMjaQkRlC7Q--~B/aD0zODY3O3c9NTc5NzthcHBpZD15dGFjaHlvbg--/https://s.yimg.com/os/creatr-uploaded-images/2024-10/47d95570-9f6a-11ef-a9be-5f7d6fd83f98',\n", + " 'width': 5797,\n", + " 'height': 3867,\n", + " 'tag': 'original'},\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/.CqkiDiHYL.PrPJRQav_9w--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://s.yimg.com/os/creatr-uploaded-images/2024-10/47d95570-9f6a-11ef-a9be-5f7d6fd83f98',\n", + " 'width': 170,\n", + " 'height': 128,\n", + " 'tag': '170x128'}]},\n", + " 'provider': {'displayName': 'Yahoo Finance UK',\n", + " 'url': 'http://uk.finance.yahoo.com/'},\n", + " 'canonicalUrl': {'url': 'https://uk.finance.yahoo.com/news/bitcoin-etf-institutionalise-crypto-060059019.html',\n", + " 'site': 'finance',\n", + " 'region': 'GB',\n", + " 'lang': 'en-GB'},\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/bitcoin-etf-institutionalise-crypto-060059019.html',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'metadata': {'editorsPick': False},\n", + " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", + " 'isPremiumFreeNews': False}},\n", + " 'storyline': None}},\n", + " {'id': '0219136d-ac3c-383b-aa34-8ee1a2f7fda0',\n", + " 'content': {'id': '0219136d-ac3c-383b-aa34-8ee1a2f7fda0',\n", + " 'contentType': 'STORY',\n", + " 'title': 'Even Companies That Aren’t Struggling Keep Laying Off Workers',\n", + " 'description': '',\n", + " 'summary': 'It’s natural for companies to slash workers when times are tough. But some firms, such as Microsoft and BlackRock, are cutting even as they thrive.',\n", + " 'pubDate': '2025-01-09T22:33:00Z',\n", + " 'isHosted': False,\n", + " 'bypassModal': False,\n", + " 'previewUrl': 'https://finance.yahoo.com/m/0219136d-ac3c-383b-aa34-8ee1a2f7fda0/even-companies-that-aren%E2%80%99t.html',\n", + " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/Barrons.com/12ea0f43d8f8307249a68d1cb2e0587e',\n", + " 'originalWidth': 320,\n", + " 'originalHeight': 65,\n", + " 'caption': '',\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/_kc6REYMS1JrAuV5bYtjfA--~B/aD02NTt3PTMyMDthcHBpZD15dGFjaHlvbg--/https://media.zenfs.com/en/Barrons.com/12ea0f43d8f8307249a68d1cb2e0587e',\n", + " 'width': 320,\n", + " 'height': 65,\n", + " 'tag': 'original'},\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/Eugzn1_7mDocWpeqoc2fFg--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/Barrons.com/12ea0f43d8f8307249a68d1cb2e0587e',\n", + " 'width': 170,\n", + " 'height': 128,\n", + " 'tag': '170x128'}]},\n", + " 'provider': {'displayName': 'Barrons.com',\n", + " 'url': 'http://www.barrons.com/'},\n", + " 'canonicalUrl': {'url': 'https://www.barrons.com/articles/jobs-microsoft-blackrock-bridgewater-ally-washington-post-61a6324f?siteid=yhoof2&yptr=yahoo',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'clickThroughUrl': None,\n", + " 'metadata': {'editorsPick': False},\n", + " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", + " 'isPremiumFreeNews': False}},\n", + " 'storyline': None}},\n", + " {'id': '57648756-895b-3bc0-bbd2-ea061138963b',\n", + " 'content': {'id': '57648756-895b-3bc0-bbd2-ea061138963b',\n", + " 'contentType': 'STORY',\n", + " 'title': 'Is Microsoft Corp. (MSFT) the Best Technology Stock to Invest In for the Long Term',\n", + " 'description': '',\n", + " 'summary': 'We recently compiled a list of the 12 Best Technology Stocks to Invest In for the Long Term. In this article, we are going to take a look at where Microsoft Corp. (NASDAQ:MSFT) stands against the other technology stocks. On January 1, King Lip, BakerAvenue Wealth Management’s chief strategist and partner, joined CNBC’s ‘Closing Bell’ to […]',\n", + " 'pubDate': '2025-01-09T19:23:14Z',\n", + " 'isHosted': True,\n", + " 'bypassModal': False,\n", + " 'previewUrl': None,\n", + " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/insidermonkey.com/ae3cb2a93ad8e5ddf6f94148e71f74b9',\n", + " 'originalWidth': 1456,\n", + " 'originalHeight': 816,\n", + " 'caption': 'Is Microsoft Corporation (MSFT) the Best Edge Computing Stock to Invest in According to Analysts?',\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/FPV7LMJx9t7xViBmxMrZWw--~B/aD04MTY7dz0xNDU2O2FwcGlkPXl0YWNoeW9u/https://media.zenfs.com/en/insidermonkey.com/ae3cb2a93ad8e5ddf6f94148e71f74b9',\n", + " 'width': 1456,\n", + " 'height': 816,\n", + " 'tag': 'original'},\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/7FVXaC.qNKFr6Wz4v4sdRQ--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/insidermonkey.com/ae3cb2a93ad8e5ddf6f94148e71f74b9',\n", + " 'width': 170,\n", + " 'height': 128,\n", + " 'tag': '170x128'}]},\n", + " 'provider': {'displayName': 'Insider Monkey',\n", + " 'url': 'http://www.insidermonkey.com'},\n", + " 'canonicalUrl': {'url': 'https://finance.yahoo.com/news/microsoft-corp-msft-best-technology-192314588.html',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/microsoft-corp-msft-best-technology-192314588.html',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'metadata': {'editorsPick': False},\n", + " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", + " 'isPremiumFreeNews': False}},\n", + " 'storyline': None}},\n", + " {'id': '899dde68-557f-3635-adcd-319f021913b6',\n", + " 'content': {'id': '899dde68-557f-3635-adcd-319f021913b6',\n", + " 'contentType': 'STORY',\n", + " 'title': 'Microsoft, Google, Adobe Give $1 Million Each to Trump Inaugural Fund',\n", + " 'description': '',\n", + " 'summary': '(Bloomberg) -- Microsoft Corp., Alphabet Inc.’s Google, and Adobe Inc. are each donating $1 million to Donald Trump’s inauguration fund, joining the roster of technology companies shelling out to back the incoming US president’s festivities later this month. Most Read from BloombergWhat Robotaxis Brought San FranciscoNYC Condo Owners May Bear Costs of Landmark Green Building LawAmbitious High-Speed Rail Plans Advance in the Baltic RegionNYC’s Subway Violence Deters Drive to Bring Workers Back to',\n", + " 'pubDate': '2025-01-09T19:01:21Z',\n", + " 'isHosted': True,\n", + " 'bypassModal': False,\n", + " 'previewUrl': None,\n", + " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/bloomberg_technology_68/5a9186104e5ad33e032ce0fa6e2748a2',\n", + " 'originalWidth': 2000,\n", + " 'originalHeight': 1334,\n", + " 'caption': '',\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/xdX7DbGQXYQUmxeen.ZIqQ--~B/aD0xMzM0O3c9MjAwMDthcHBpZD15dGFjaHlvbg--/https://media.zenfs.com/en/bloomberg_technology_68/5a9186104e5ad33e032ce0fa6e2748a2',\n", + " 'width': 2000,\n", + " 'height': 1334,\n", + " 'tag': 'original'},\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/BLaKhtv3d1GKodSAtFOMpA--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/bloomberg_technology_68/5a9186104e5ad33e032ce0fa6e2748a2',\n", + " 'width': 170,\n", + " 'height': 128,\n", + " 'tag': '170x128'}]},\n", + " 'provider': {'displayName': 'Bloomberg',\n", + " 'url': 'https://www.bloomberg.com/'},\n", + " 'canonicalUrl': {'url': 'https://finance.yahoo.com/news/microsoft-google-adobe-1-million-190121729.html',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/microsoft-google-adobe-1-million-190121729.html',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'metadata': {'editorsPick': False},\n", + " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", + " 'isPremiumFreeNews': False}},\n", + " 'storyline': None}},\n", + " {'id': '5dd00a9b-8305-3862-b01d-ed9edac80eb4',\n", + " 'content': {'id': '5dd00a9b-8305-3862-b01d-ed9edac80eb4',\n", + " 'contentType': 'STORY',\n", + " 'title': \"Is Microsoft Stock, Up Mildly In 2025 So Far, A Buy In January? Here's What The Fundamentals, Chart Action Say Now\",\n", + " 'description': '',\n", + " 'summary': 'Microsoft has started the new year with a small gain year to date. On Wednesday, shares rose 0.5% to 424.56 ahead of the market holiday to honor the late U.S. President Jimmy Carter. This story will assess fundamental, technical and institutional sponsorship criteria on the veteran tech giant and long-term leader of the stock market.',\n", + " 'pubDate': '2025-01-09T17:35:01Z',\n", + " 'isHosted': False,\n", + " 'bypassModal': False,\n", + " 'previewUrl': 'https://finance.yahoo.com/m/5dd00a9b-8305-3862-b01d-ed9edac80eb4/is-microsoft-stock-up-mildly.html',\n", + " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/ibd.com/0a1f36e6a637c56a99c29443cfe8d30c',\n", + " 'originalWidth': 945,\n", + " 'originalHeight': 533,\n", + " 'caption': '',\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/yit1MvSuQg39B9tvp9OnMQ--~B/aD01MzM7dz05NDU7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/ibd.com/0a1f36e6a637c56a99c29443cfe8d30c',\n", + " 'width': 945,\n", + " 'height': 533,\n", + " 'tag': 'original'},\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/.j92vhN.oSt1hzZUsIeDfQ--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/ibd.com/0a1f36e6a637c56a99c29443cfe8d30c',\n", + " 'width': 170,\n", + " 'height': 128,\n", + " 'tag': '170x128'}]},\n", + " 'provider': {'displayName': \"Investor's Business Daily\",\n", + " 'url': 'http://www.investors.com/'},\n", + " 'canonicalUrl': {'url': 'https://www.investors.com/research/microsoft-stock-msft-buy-january/?src=A00220&yptr=yahoo',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'clickThroughUrl': None,\n", + " 'metadata': {'editorsPick': False},\n", + " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", + " 'isPremiumFreeNews': False}},\n", + " 'storyline': None}},\n", + " {'id': '284cbcf5-4463-3442-9fe8-13af64e93281',\n", + " 'content': {'id': '284cbcf5-4463-3442-9fe8-13af64e93281',\n", + " 'contentType': 'STORY',\n", + " 'title': \"Layoffs Amid Growth: Microsoft Trims Staff but Signals Strong Confidence in Azure's Future\",\n", + " 'description': '',\n", + " 'summary': 'Microsoft announces minor layoffs while emphasizing Azure growth and maintaining investor confidence',\n", + " 'pubDate': '2025-01-09T17:23:21Z',\n", + " 'isHosted': True,\n", + " 'bypassModal': False,\n", + " 'previewUrl': None,\n", + " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/us.finance.gurufocus/61d052cba829dcaa8e969ad093b21ab1',\n", + " 'originalWidth': 550,\n", + " 'originalHeight': 366,\n", + " 'caption': '',\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/0kzRl.07.e5VAQ0EwkLanQ--~B/aD0zNjY7dz01NTA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/us.finance.gurufocus/61d052cba829dcaa8e969ad093b21ab1',\n", + " 'width': 550,\n", + " 'height': 366,\n", + " 'tag': 'original'},\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/R0Nu.dymZql3xmV9as2h4g--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/us.finance.gurufocus/61d052cba829dcaa8e969ad093b21ab1',\n", + " 'width': 170,\n", + " 'height': 128,\n", + " 'tag': '170x128'}]},\n", + " 'provider': {'displayName': 'GuruFocus.com',\n", + " 'url': 'http://www.gurufocus.com/'},\n", + " 'canonicalUrl': {'url': 'https://finance.yahoo.com/news/layoffs-amid-growth-microsoft-trims-172321645.html',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/layoffs-amid-growth-microsoft-trims-172321645.html',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'metadata': {'editorsPick': False},\n", + " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", + " 'isPremiumFreeNews': False}},\n", + " 'storyline': None}},\n", + " {'id': '265134ef-3101-3c73-872f-a0489124984e',\n", + " 'content': {'id': '265134ef-3101-3c73-872f-a0489124984e',\n", + " 'contentType': 'STORY',\n", + " 'title': 'Will AI Replace Your Job? What Microsoft’s Latest Moves Say About Layoff Fears.',\n", + " 'description': '',\n", + " 'summary': 'Fresh job cuts are sweeping the technology sector with Microsoft the latest\\xa0company to be making layoffs. CNBC cited a person familiar with the matter and reported Microsoft had confirmed the cuts. Microsoft didn’t immediately respond to a request for comment early on Thursday.',\n", + " 'pubDate': '2025-01-09T16:03:00Z',\n", + " 'isHosted': False,\n", + " 'bypassModal': False,\n", + " 'previewUrl': 'https://finance.yahoo.com/m/265134ef-3101-3c73-872f-a0489124984e/will-ai-replace-your-job-.html',\n", + " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/Barrons.com/12ea0f43d8f8307249a68d1cb2e0587e',\n", + " 'originalWidth': 320,\n", + " 'originalHeight': 65,\n", + " 'caption': '',\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/_kc6REYMS1JrAuV5bYtjfA--~B/aD02NTt3PTMyMDthcHBpZD15dGFjaHlvbg--/https://media.zenfs.com/en/Barrons.com/12ea0f43d8f8307249a68d1cb2e0587e',\n", + " 'width': 320,\n", + " 'height': 65,\n", + " 'tag': 'original'},\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/Eugzn1_7mDocWpeqoc2fFg--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/Barrons.com/12ea0f43d8f8307249a68d1cb2e0587e',\n", + " 'width': 170,\n", + " 'height': 128,\n", + " 'tag': '170x128'}]},\n", + " 'provider': {'displayName': 'Barrons.com',\n", + " 'url': 'http://www.barrons.com/'},\n", + " 'canonicalUrl': {'url': 'https://www.barrons.com/articles/microsoft-jobs-cuts-ai-5818fe31?siteid=yhoof2&yptr=yahoo',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'clickThroughUrl': None,\n", + " 'metadata': {'editorsPick': False},\n", + " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", + " 'isPremiumFreeNews': False}},\n", + " 'storyline': None}}]" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "msft.news" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "df = msft.analyst_price_targets" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'current': 424.56,\n", + " 'low': 420.0,\n", + " 'high': 650.0,\n", + " 'mean': 508.4636,\n", + " 'median': 500.0}" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "424.56" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['current']" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from getpass import getpass\n", + "import openai\n", + "\n", + "os.environ[\"OPENAI_API_KEY\"] = os.getenv(\"OPENAI_API_KEY\") or getpass(\n", + " \"Enter OpenAI API Key: \"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [], + "source": [ + "openai_model = \"gpt-4o-mini\"" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_openai import ChatOpenAI\n", + "\n", + "# For normal accurate responses\n", + "llm = ChatOpenAI(temperature=0.0, model=openai_model, openai_api_key = os.environ[\"OPENAI_API_KEY\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "from typing_extensions import TypedDict\n", + "\n", + "class State(TypedDict):\n", + " graph_state: str\n", + " graph_ticker: str" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": {}, + "outputs": [], + "source": [ + "def node_1(state):\n", + " print(\"---Node 1---\")\n", + " return {\"graph_state\": state['graph_state']}\n", + "\n", + "def node_2(state):\n", + " print(\"---Analyst Valuation---\")\n", + " ticker = yf.Ticker(state['graph_ticker'])\n", + " df = ticker.analyst_price_targets\n", + " current = df['current']\n", + " return {\"graph_state\": current}\n", + "\n", + "def node_3(state):\n", + " print(\"---Sustainability---\")\n", + " ticker = yf.Ticker(state['graph_ticker'])\n", + " df = ticker.sustainability\n", + " \n", + " response = llm(f\"\"\"using this data frame {df} tell me if this company is a ethically \n", + " sustainable company, I would also like you to format it as \n", + " ?/10 for topic, this is due to...\"\"\")\n", + "\n", + " return {\"graph_state\": response.content}\n", + "\n", + "def node_4(state):\n", + " print(\"---Profitability---\")\n", + " ticker = yf.Ticker(state['graph_ticker'])\n", + " df = ticker.financials\n", + " \n", + " response = llm(f\"\"\"using this data frame {df} tell me if this company is a \n", + " profitable company, I would also like you to format it as \n", + " ?/10 for topic, this is due to...\"\"\")\n", + "\n", + " return {\"graph_state\": response.content}" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": {}, + "outputs": [], + "source": [ + "from typing import Literal\n", + "\n", + "def decide_mood(state) -> Literal[\"node_2\", \"node_3\", \"node_4\"]:\n", + " \n", + " # Often, we will use state to decide on the next node to visit\n", + " user_input = state['graph_state'] \n", + " print(user_input)\n", + " # Here, let's just do a 50 / 50 split between nodes 2, 3\n", + " if user_input == \"profit\":\n", + "\n", + " # 50% of the time, we return Node 2\n", + " return \"node_4\"\n", + " \n", + " if user_input == \"price\":\n", + "\n", + " # 50% of the time, we return Node 4\n", + " return \"node_2\"\n", + " \n", + " if user_input == \"sustain\":\n", + " # 50% of the time, we return Node 3\n", + " return \"node_3\"" + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import Image, display\n", + "from langgraph.graph import StateGraph, START, END" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Build graph\n", + "builder = StateGraph(State)\n", + "\n", + "builder.add_node(\"node_1\", node_1)\n", + "builder.add_node(\"node_2\", node_2)\n", + "builder.add_node(\"node_3\", node_3)\n", + "builder.add_node(\"node_4\", node_4)\n", + "\n", + "# Logic\n", + "builder.add_edge(START, \"node_1\")\n", + "builder.add_conditional_edges(\"node_1\", decide_mood)\n", + "builder.add_edge(\"node_2\", END)\n", + "builder.add_edge(\"node_3\", END)\n", + "builder.add_edge(\"node_4\", END)\n", + "\n", + "# Add\n", + "graph = builder.compile()\n", + "\n", + "# View\n", + "display(Image(graph.get_graph().draw_mermaid_png()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "{ sustain - profit - price } - graph_state variables" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---Node 1---\n", + "profit\n", + "---Profitability---\n" + ] + } + ], + "source": [ + "result = graph.invoke({\"graph_state\": \"profit\", \"graph_ticker\": \"MSFT\"})" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "To determine if the company is profitable, we can analyze key financial metrics from the provided data. Here are some important indicators of profitability:\n", + "---\n", + "\n", + "---\n", + "1. **Net Income**: This is the profit after all expenses, taxes, and costs have been deducted from total revenue. The net income for the most recent year (2024-06-30) is **$88,136,000,000**, which is a positive figure, indicating profitability.\n", + "---\n", + "\n", + "---\n", + "2. **EBITDA**: Earnings Before Interest, Taxes, Depreciation, and Amortization is another measure of profitability. The EBITDA for 2024 is **$133,009,000,000**, which is also positive.\n", + "---\n", + "\n", + "---\n", + "3. **EPS (Earnings Per Share)**: The diluted EPS for 2024 is **$11.8**, which indicates that the company is generating earnings for its shareholders.\n", + "---\n", + "\n", + "---\n", + "4. **Total Revenue**: The total revenue for 2024 is **$245,122,000,000**, which is significantly higher than total expenses of **$135,689,000,000**. This indicates that the company is generating more income than it is spending.\n", + "---\n", + "\n", + "---\n", + "5. **Profit Margin**: The profit margin can be calculated as Net Income divided by Total Revenue. For 2024, the profit margin is approximately **36%** ($88,136,000,000 / $245,122,000,000), which is quite healthy.\n", + "---\n", + "\n", + "---\n", + "Based on these indicators, we can conclude that the company is indeed profitable.\n", + "---\n", + "\n", + "---\n", + "### Profitability Rating: 9/10\n", + "---\n", + "This is due to the strong net income, high EBITDA, positive EPS, and a healthy profit margin, indicating that the company is effectively generating profit from its operations. The only reason it is not rated a perfect 10 is that there may be fluctuations in future performance or external factors that could impact profitability.\n" + ] + } + ], + "source": [ + "text = result['graph_state']\n", + "\n", + "formatted_text = text.replace(\"\\n\", \"\\n---\\n\")\n", + "\n", + "print(formatted_text)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Super Agent" + ] + }, + { + "cell_type": "code", + "execution_count": 314, + "metadata": {}, + "outputs": [], + "source": [ + "from typing_extensions import TypedDict\n", + "\n", + "class State(TypedDict):\n", + " response: str\n", + " final_answer: str\n", + " question: str\n", + " ticker: str\n", + " next_action: str\n", + " history: str" + ] + }, + { + "cell_type": "code", + "execution_count": 315, + "metadata": {}, + "outputs": [], + "source": [ + "def assistant_node(state):\n", + " print(\"--- Assistant Node ---\")\n", + " tools = \"\"\"\"Stock_Price_Value_Node\", \"Sustainability_Node\", \"Financials_Node\", \"Finalise_Node\", \"Cashflow_Node\"\"\"\"\"\n", + " response = llm(f\"\"\"Based on the question, do you believe this can be answered using \n", + " the current content, \n", + " if this is the case, please reply\n", + " with \"Finalise_Node\", otherwise, think based on what tools we have available\n", + " could help you find the correct answer, and answer as the name of the \n", + " tool, here is the list of tools {tools}, here is the question \n", + " {state['question']} here is the response so far \n", + " {state['final_answer']}, if you have used all the tools in the\n", + " history, enter the \"Finalise_Node\" here is the history {state['history']}\"\"\")\n", + " print(response.content)\n", + " return {\"response\": response.content, \"history\": state['history'] + \" \" + response.content}" + ] + }, + { + "cell_type": "code", + "execution_count": 316, + "metadata": {}, + "outputs": [], + "source": [ + "def Valuation(state):\n", + " print(\"---Analyst Valuation---\")\n", + " ticker = yf.Ticker(state['ticker'])\n", + " df = ticker.analyst_price_targets\n", + " answer = df.values\n", + "\n", + " return {\"final_answer\": df}\n", + "\n", + "def Sustainability(state):\n", + " print(\"---Sustainability---\")\n", + " ticker = yf.Ticker(state['ticker'])\n", + " df = ticker.sustainability\n", + "\n", + " answer = df.values\n", + "\n", + " return {\"final_answer\": df}\n", + "\n", + "def Financials(state):\n", + " print(\"---Financials---\")\n", + " ticker = yf.Ticker(state['ticker'])\n", + " df = ticker.financials\n", + " answer = df.values\n", + "\n", + " return {\"final_answer\": df}\n", + "\n", + "def Cashflow(state):\n", + " print(\"---Cashflow---\")\n", + " ticker = yf.Ticker(state['ticker'])\n", + " df = ticker.cash_flow\n", + "\n", + " answer = df.values\n", + "\n", + " return {\"final_answer\": df}\n", + "\n", + "def Finalise(state):\n", + " print(\"---Final---\")\n", + " print(state['final_answer'])\n", + " response = llm(f\"\"\"using the current context {state['final_answer']} try to \n", + " answer the question {state['question']}, do not lie.\"\"\")\n", + " print(state['history'])\n", + " return {\"final_answer\": response}" + ] + }, + { + "cell_type": "code", + "execution_count": 317, + "metadata": {}, + "outputs": [], + "source": [ + "from typing import Literal\n", + "\n", + "def decide_node(state) -> Literal[\"Stock_Price_Value_Node\", \"Sustainability_Node\", \"Financials_Node\", \"Finalise_Node\", \"Cashflow_Node\"]:\n", + " print(\"Deciding\")\n", + " # Often, we will use state to decide on the next node to visit\n", + " response_input = state['response'] \n", + " print(response_input)\n", + " # Here, let's just do a 50 / 50 split between nodes 2, 3\n", + " return response_input" + ] + }, + { + "cell_type": "code", + "execution_count": 318, + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import Image, display\n", + "from langgraph.graph import StateGraph, START, END" + ] + }, + { + "cell_type": "code", + "execution_count": 319, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Build graph\n", + "builder = StateGraph(State)\n", + "\n", + "builder.add_node(\"Assistant_Node\", assistant_node)\n", + "builder.add_node(\"Stock_Price_Value_Node\", Valuation)\n", + "builder.add_node(\"Sustainability_Node\", Sustainability)\n", + "builder.add_node(\"Financials_Node\", Financials)\n", + "builder.add_node(\"Finalise_Node\", Finalise)\n", + "builder.add_node(\"Cashflow_Node\", Cashflow)\n", + "\n", + "# Logic\n", + "builder.add_edge(START, \"Assistant_Node\")\n", + "builder.add_conditional_edges(\"Assistant_Node\", decide_node)\n", + "builder.add_edge(\"Cashflow_Node\", \"Assistant_Node\")\n", + "builder.add_edge(\"Stock_Price_Value_Node\", \"Assistant_Node\")\n", + "builder.add_edge(\"Sustainability_Node\", \"Assistant_Node\")\n", + "builder.add_edge(\"Financials_Node\", \"Assistant_Node\")\n", + "builder.add_edge(\"Finalise_Node\", END)\n", + "\n", + "# Add\n", + "graph = builder.compile()\n", + "\n", + "# View\n", + "display(Image(graph.get_graph().draw_mermaid_png()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**python" + ] + }, + { + "cell_type": "code", + "execution_count": 320, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--- Assistant Node ---\n", + "Stock_Price_Value_Node\n", + "Deciding\n", + "Stock_Price_Value_Node\n", + "---Analyst Valuation---\n", + "--- Assistant Node ---\n", + "Cashflow_Node\n", + "Deciding\n", + "Cashflow_Node\n", + "---Cashflow---\n", + "--- Assistant Node ---\n", + "Finalise_Node\n", + "Deciding\n", + "Finalise_Node\n", + "---Final---\n", + " 2024-06-30 2023-06-30 \\\n", + "Free Cash Flow 74071000000.0 59475000000.0 \n", + "Repurchase Of Capital Stock -17254000000.0 -22245000000.0 \n", + "Repayment Of Debt -29070000000.0 -2750000000.0 \n", + "Issuance Of Debt 29645000000.0 0.0 \n", + "Issuance Of Capital Stock 2002000000.0 1866000000.0 \n", + "Capital Expenditure -44477000000.0 -28107000000.0 \n", + "End Cash Position 18315000000.0 34704000000.0 \n", + "Beginning Cash Position 34704000000.0 13931000000.0 \n", + "Effect Of Exchange Rate Changes -210000000.0 -194000000.0 \n", + "Changes In Cash -16179000000.0 20967000000.0 \n", + "Financing Cash Flow -37757000000.0 -43935000000.0 \n", + "Cash Flow From Continuing Financing Activities -37757000000.0 -43935000000.0 \n", + "Net Other Financing Charges -1309000000.0 -1006000000.0 \n", + "Cash Dividends Paid -21771000000.0 -19800000000.0 \n", + "Common Stock Dividend Paid -21771000000.0 -19800000000.0 \n", + "Net Common Stock Issuance -15252000000.0 -20379000000.0 \n", + "Common Stock Payments -17254000000.0 -22245000000.0 \n", + "Common Stock Issuance 2002000000.0 1866000000.0 \n", + "Net Issuance Payments Of Debt 575000000.0 -2750000000.0 \n", + "Net Short Term Debt Issuance 5250000000.0 0.0 \n", + "Short Term Debt Issuance 5250000000.0 0.0 \n", + "Net Long Term Debt Issuance -4675000000.0 -2750000000.0 \n", + "Long Term Debt Payments -29070000000.0 -2750000000.0 \n", + "Long Term Debt Issuance 24395000000.0 0.0 \n", + "Investing Cash Flow -96970000000.0 -22680000000.0 \n", + "Cash Flow From Continuing Investing Activities -96970000000.0 -22680000000.0 \n", + "Net Other Investing Changes -1298000000.0 -3116000000.0 \n", + "Net Investment Purchase And Sale 17937000000.0 10213000000.0 \n", + "Sale Of Investment 35669000000.0 47864000000.0 \n", + "Purchase Of Investment -17732000000.0 -37651000000.0 \n", + "Net Business Purchase And Sale -69132000000.0 -1670000000.0 \n", + "Purchase Of Business -69132000000.0 -1670000000.0 \n", + "Net PPE Purchase And Sale -44477000000.0 -28107000000.0 \n", + "Purchase Of PPE -44477000000.0 -28107000000.0 \n", + "Operating Cash Flow 118548000000.0 87582000000.0 \n", + "Cash Flow From Continuing Operating Activities 118548000000.0 87582000000.0 \n", + "Change In Working Capital 1824000000.0 -2388000000.0 \n", + "Change In Other Working Capital 5348000000.0 5535000000.0 \n", + "Change In Other Current Liabilities 5616000000.0 2825000000.0 \n", + "Change In Other Current Assets -8465000000.0 -4824000000.0 \n", + "Change In Payables And Accrued Expense 5232000000.0 -3079000000.0 \n", + "Change In Payable 5232000000.0 -3079000000.0 \n", + "Change In Account Payable 3545000000.0 -2721000000.0 \n", + "Change In Tax Payable 1687000000.0 -358000000.0 \n", + "Change In Income Tax Payable 1687000000.0 -358000000.0 \n", + "Change In Inventory 1284000000.0 1242000000.0 \n", + "Change In Receivables -7191000000.0 -4087000000.0 \n", + "Changes In Account Receivables -7191000000.0 -4087000000.0 \n", + "Stock Based Compensation 10734000000.0 9611000000.0 \n", + "Deferred Tax -4738000000.0 -6059000000.0 \n", + "Deferred Income Tax -4738000000.0 -6059000000.0 \n", + "Depreciation Amortization Depletion 22287000000.0 13861000000.0 \n", + "Depreciation And Amortization 22287000000.0 13861000000.0 \n", + "Depreciation 22287000000.0 13861000000.0 \n", + "Operating Gains Losses 305000000.0 196000000.0 \n", + "Gain Loss On Investment Securities NaN NaN \n", + "Net Income From Continuing Operations 88136000000.0 72361000000.0 \n", + "\n", + " 2022-06-30 2021-06-30 \\\n", + "Free Cash Flow 65149000000.0 56118000000.0 \n", + "Repurchase Of Capital Stock -32696000000.0 -27385000000.0 \n", + "Repayment Of Debt -9023000000.0 -3750000000.0 \n", + "Issuance Of Debt 0.0 NaN \n", + "Issuance Of Capital Stock 1841000000.0 1693000000.0 \n", + "Capital Expenditure -23886000000.0 -20622000000.0 \n", + "End Cash Position 13931000000.0 14224000000.0 \n", + "Beginning Cash Position 14224000000.0 13576000000.0 \n", + "Effect Of Exchange Rate Changes -141000000.0 -29000000.0 \n", + "Changes In Cash -152000000.0 677000000.0 \n", + "Financing Cash Flow -58876000000.0 -48486000000.0 \n", + "Cash Flow From Continuing Financing Activities -58876000000.0 -48486000000.0 \n", + "Net Other Financing Charges -863000000.0 -2523000000.0 \n", + "Cash Dividends Paid -18135000000.0 -16521000000.0 \n", + "Common Stock Dividend Paid -18135000000.0 -16521000000.0 \n", + "Net Common Stock Issuance -30855000000.0 -25692000000.0 \n", + "Common Stock Payments -32696000000.0 -27385000000.0 \n", + "Common Stock Issuance 1841000000.0 1693000000.0 \n", + "Net Issuance Payments Of Debt -9023000000.0 -3750000000.0 \n", + "Net Short Term Debt Issuance 0.0 NaN \n", + "Short Term Debt Issuance 0.0 NaN \n", + "Net Long Term Debt Issuance -9023000000.0 -3750000000.0 \n", + "Long Term Debt Payments -9023000000.0 -3750000000.0 \n", + "Long Term Debt Issuance 0.0 NaN \n", + "Investing Cash Flow -30311000000.0 -27577000000.0 \n", + "Cash Flow From Continuing Investing Activities -30311000000.0 -27577000000.0 \n", + "Net Other Investing Changes -2825000000.0 -922000000.0 \n", + "Net Investment Purchase And Sale 18438000000.0 2876000000.0 \n", + "Sale Of Investment 44894000000.0 65800000000.0 \n", + "Purchase Of Investment -26456000000.0 -62924000000.0 \n", + "Net Business Purchase And Sale -22038000000.0 -8909000000.0 \n", + "Purchase Of Business -22038000000.0 -8909000000.0 \n", + "Net PPE Purchase And Sale -23886000000.0 -20622000000.0 \n", + "Purchase Of PPE -23886000000.0 -20622000000.0 \n", + "Operating Cash Flow 89035000000.0 76740000000.0 \n", + "Cash Flow From Continuing Operating Activities 89035000000.0 76740000000.0 \n", + "Change In Working Capital 446000000.0 -936000000.0 \n", + "Change In Other Working Capital 5805000000.0 2324000000.0 \n", + "Change In Other Current Liabilities 3169000000.0 5551000000.0 \n", + "Change In Other Current Assets -3514000000.0 -4391000000.0 \n", + "Change In Payables And Accrued Expense 2943000000.0 2798000000.0 \n", + "Change In Payable 2943000000.0 2798000000.0 \n", + "Change In Account Payable 2943000000.0 2798000000.0 \n", + "Change In Tax Payable NaN NaN \n", + "Change In Income Tax Payable NaN NaN \n", + "Change In Inventory -1123000000.0 -737000000.0 \n", + "Change In Receivables -6834000000.0 -6481000000.0 \n", + "Changes In Account Receivables -6834000000.0 -6481000000.0 \n", + "Stock Based Compensation 7502000000.0 6118000000.0 \n", + "Deferred Tax -5702000000.0 -150000000.0 \n", + "Deferred Income Tax -5702000000.0 -150000000.0 \n", + "Depreciation Amortization Depletion 14460000000.0 11686000000.0 \n", + "Depreciation And Amortization 14460000000.0 11686000000.0 \n", + "Depreciation 14460000000.0 11686000000.0 \n", + "Operating Gains Losses -409000000.0 -1249000000.0 \n", + "Gain Loss On Investment Securities NaN NaN \n", + "Net Income From Continuing Operations 72738000000.0 61271000000.0 \n", + "\n", + " 2020-06-30 \n", + "Free Cash Flow NaN \n", + "Repurchase Of Capital Stock NaN \n", + "Repayment Of Debt NaN \n", + "Issuance Of Debt 0.0 \n", + "Issuance Of Capital Stock NaN \n", + "Capital Expenditure NaN \n", + "End Cash Position NaN \n", + "Beginning Cash Position NaN \n", + "Effect Of Exchange Rate Changes NaN \n", + "Changes In Cash NaN \n", + "Financing Cash Flow NaN \n", + "Cash Flow From Continuing Financing Activities NaN \n", + "Net Other Financing Charges NaN \n", + "Cash Dividends Paid NaN \n", + "Common Stock Dividend Paid NaN \n", + "Net Common Stock Issuance NaN \n", + "Common Stock Payments NaN \n", + "Common Stock Issuance NaN \n", + "Net Issuance Payments Of Debt NaN \n", + "Net Short Term Debt Issuance 0.0 \n", + "Short Term Debt Issuance NaN \n", + "Net Long Term Debt Issuance NaN \n", + "Long Term Debt Payments NaN \n", + "Long Term Debt Issuance 0.0 \n", + "Investing Cash Flow NaN \n", + "Cash Flow From Continuing Investing Activities NaN \n", + "Net Other Investing Changes NaN \n", + "Net Investment Purchase And Sale NaN \n", + "Sale Of Investment NaN \n", + "Purchase Of Investment NaN \n", + "Net Business Purchase And Sale NaN \n", + "Purchase Of Business NaN \n", + "Net PPE Purchase And Sale NaN \n", + "Purchase Of PPE NaN \n", + "Operating Cash Flow NaN \n", + "Cash Flow From Continuing Operating Activities NaN \n", + "Change In Working Capital NaN \n", + "Change In Other Working Capital NaN \n", + "Change In Other Current Liabilities NaN \n", + "Change In Other Current Assets NaN \n", + "Change In Payables And Accrued Expense NaN \n", + "Change In Payable NaN \n", + "Change In Account Payable NaN \n", + "Change In Tax Payable NaN \n", + "Change In Income Tax Payable NaN \n", + "Change In Inventory NaN \n", + "Change In Receivables NaN \n", + "Changes In Account Receivables NaN \n", + "Stock Based Compensation NaN \n", + "Deferred Tax NaN \n", + "Deferred Income Tax NaN \n", + "Depreciation Amortization Depletion NaN \n", + "Depreciation And Amortization NaN \n", + "Depreciation NaN \n", + "Operating Gains Losses NaN \n", + "Gain Loss On Investment Securities -219000000.0 \n", + "Net Income From Continuing Operations NaN \n", + "started Stock_Price_Value_Node Cashflow_Node Finalise_Node\n" + ] + } + ], + "source": [ + "result = graph.invoke({\"question\": \"what is the price difference between the current price of microsoft and the average of the brokers price target of microsoft\", \"ticker\": \"MSFT\", \"final_answer\": \"not completed\", \"history\": \"started\"})" + ] + }, + { + "cell_type": "code", + "execution_count": 321, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'response': 'Finalise_Node',\n", + " 'final_answer': AIMessage(content=\"To answer your question about the price difference between the current price of Microsoft and the average of the brokers' price target, I would need the current stock price of Microsoft and the average price target from brokers. Unfortunately, I do not have access to real-time data or the latest stock prices or broker price targets.\\n\\nYou can find the current stock price of Microsoft (MSFT) on financial news websites, stock market apps, or brokerage platforms. Similarly, the average broker price target can typically be found on financial news websites or investment research platforms.\\n\\nOnce you have both figures, you can calculate the price difference by subtracting the average broker price target from the current stock price:\\n\\n**Price Difference = Current Price - Average Broker Price Target**\\n\\nIf you provide me with those numbers, I can help you with the calculation!\", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 163, 'prompt_tokens': 2935, 'total_tokens': 3098, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_f2cd28694a', 'finish_reason': 'stop', 'logprobs': None}, id='run-55cd8fde-5f36-40ef-9390-3d4c7e836146-0', usage_metadata={'input_tokens': 2935, 'output_tokens': 163, 'total_tokens': 3098, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}),\n", + " 'question': 'what is the price difference between the current price of microsoft and the average of the brokers price target of microsoft',\n", + " 'ticker': 'MSFT',\n", + " 'history': 'started Stock_Price_Value_Node Cashflow_Node Finalise_Node'}" + ] + }, + "execution_count": 321, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 54a3b621c5df81a688a38e9d6299c7be05564c20 Mon Sep 17 00:00:00 2001 From: Joshua Briggs Date: Mon, 13 Jan 2025 10:21:26 +0000 Subject: [PATCH 2/2] feat: doc working as expected now --- .../yfinance-stocks.ipynb | 851 ++++++++---------- 1 file changed, 381 insertions(+), 470 deletions(-) diff --git a/gen-ai/openai/agents/yfinance-openai-langgraph/yfinance-stocks.ipynb b/gen-ai/openai/agents/yfinance-openai-langgraph/yfinance-stocks.ipynb index 063cedf..fd4e5ef 100644 --- a/gen-ai/openai/agents/yfinance-openai-langgraph/yfinance-stocks.ipynb +++ b/gen-ai/openai/agents/yfinance-openai-langgraph/yfinance-stocks.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -125,16 +125,6 @@ " ...\n", " \n", " \n", - " 2025-01-02 00:00:00-05:00\n", - " 425.529999\n", - " 426.070007\n", - " 414.850006\n", - " 418.579987\n", - " 16896500\n", - " 0.0\n", - " 0.0\n", - " \n", - " \n", " 2025-01-03 00:00:00-05:00\n", " 421.079987\n", " 424.029999\n", @@ -174,9 +164,19 @@ " 0.0\n", " 0.0\n", " \n", + " \n", + " 2025-01-10 00:00:00-05:00\n", + " 424.630005\n", + " 424.709991\n", + " 415.019989\n", + " 418.950012\n", + " 20186800\n", + " 0.0\n", + " 0.0\n", + " \n", " \n", "\n", - "

9784 rows × 7 columns

\n", + "

9785 rows × 7 columns

\n", "" ], "text/plain": [ @@ -188,11 +188,11 @@ "1986-03-18 00:00:00-05:00 0.063032 0.063566 0.060895 0.061429 \n", "1986-03-19 00:00:00-05:00 0.061429 0.061963 0.059827 0.060361 \n", "... ... ... ... ... \n", - "2025-01-02 00:00:00-05:00 425.529999 426.070007 414.850006 418.579987 \n", "2025-01-03 00:00:00-05:00 421.079987 424.029999 419.540009 423.350006 \n", "2025-01-06 00:00:00-05:00 428.000000 434.320007 425.480011 427.850006 \n", "2025-01-07 00:00:00-05:00 429.000000 430.649994 420.799988 422.369995 \n", "2025-01-08 00:00:00-05:00 423.459991 426.970001 421.540009 424.559998 \n", + "2025-01-10 00:00:00-05:00 424.630005 424.709991 415.019989 418.950012 \n", "\n", " Volume Dividends Stock Splits \n", "Date \n", @@ -202,16 +202,16 @@ "1986-03-18 00:00:00-05:00 67766400 0.0 0.0 \n", "1986-03-19 00:00:00-05:00 47894400 0.0 0.0 \n", "... ... ... ... \n", - "2025-01-02 00:00:00-05:00 16896500 0.0 0.0 \n", "2025-01-03 00:00:00-05:00 16662900 0.0 0.0 \n", "2025-01-06 00:00:00-05:00 20573600 0.0 0.0 \n", "2025-01-07 00:00:00-05:00 18139100 0.0 0.0 \n", "2025-01-08 00:00:00-05:00 15054600 0.0 0.0 \n", + "2025-01-10 00:00:00-05:00 20186800 0.0 0.0 \n", "\n", - "[9784 rows x 7 columns]" + "[9785 rows x 7 columns]" ] }, - "execution_count": 23, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -224,7 +224,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -336,7 +336,7 @@ "[93 rows x 2 columns]" ] }, - "execution_count": 24, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -347,7 +347,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -366,7 +366,7 @@ "Name: Stock Splits, dtype: float64" ] }, - "execution_count": 27, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -377,7 +377,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -398,7 +398,7 @@ "Name: Dividends, Length: 84, dtype: float64" ] }, - "execution_count": 28, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -409,7 +409,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -865,7 +865,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -899,15 +899,15 @@ " \n", " \n", " institutionsPercentHeld\n", - " 0.73557\n", + " 0.73564\n", " \n", " \n", " institutionsFloatPercentHeld\n", - " 0.73598\n", + " 0.73605\n", " \n", " \n", " institutionsCount\n", - " 6960.00000\n", + " 6961.00000\n", " \n", " \n", "\n", @@ -916,12 +916,12 @@ "text/plain": [ "Breakdown Value\n", "insidersPercentHeld 0.00056\n", - "institutionsPercentHeld 0.73557\n", - "institutionsFloatPercentHeld 0.73598\n", - "institutionsCount 6960.00000" + "institutionsPercentHeld 0.73564\n", + "institutionsFloatPercentHeld 0.73605\n", + "institutionsCount 6961.00000" ] }, - "execution_count": 29, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -932,7 +932,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -1074,7 +1074,7 @@ "9 29118642660 " ] }, - "execution_count": 30, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -1085,7 +1085,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -1234,7 +1234,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -1243,7 +1243,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -1412,7 +1412,7 @@ "[73 rows x 4 columns]" ] }, - "execution_count": 18, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -1423,7 +1423,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -1466,7 +1466,7 @@ " dtype='object')" ] }, - "execution_count": 22, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -1477,7 +1477,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -1486,7 +1486,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -1499,7 +1499,7 @@ "Name: Total Debt, dtype: object" ] }, - "execution_count": 21, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -1517,7 +1517,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -1877,7 +1877,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -2333,7 +2333,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -2549,7 +2549,7 @@ "tobacco False" ] }, - "execution_count": 31, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -2560,19 +2560,90 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 19, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - " period strongBuy buy hold sell strongSell\n", - "0 0m 14 38 5 0 0\n", - "1 -1m 14 38 5 0 0\n", - "2 -2m 14 38 5 0 0\n", - "3 -3m 14 38 5 0 0\n" - ] + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
periodstrongBuybuyholdsellstrongSell
00m1438500
1-1m1438500
2-2m1438500
3-3m1438500
\n", + "
" + ], + "text/plain": [ + " period strongBuy buy hold sell strongSell\n", + "0 0m 14 38 5 0 0\n", + "1 -1m 14 38 5 0 0\n", + "2 -2m 14 38 5 0 0\n", + "3 -3m 14 38 5 0 0" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -2581,7 +2652,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -2598,7 +2669,7 @@ " 'Revenue Average': 68861379010}" ] }, - "execution_count": 32, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -2609,105 +2680,93 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[{'id': '9d141c88-e564-49d7-b2b6-d01b666411a8',\n", - " 'content': {'id': '9d141c88-e564-49d7-b2b6-d01b666411a8',\n", + "[{'id': 'c2181653-4239-35f0-9ddb-8d29c833be97',\n", + " 'content': {'id': 'c2181653-4239-35f0-9ddb-8d29c833be97',\n", " 'contentType': 'STORY',\n", - " 'title': \"TikTok's future is now in the hands of the Supreme Court\",\n", + " 'title': \"Nvidia's AI empire: A look at its top startup investments\",\n", " 'description': '',\n", - " 'summary': 'TikTok and its Chinese parent company are facing off against the Justice Department Friday in a hearing before the Supreme Court that will help determine the fate of the popular social media app.',\n", - " 'pubDate': '2025-01-09T15:28:54Z',\n", + " 'summary': 'No company has capitalized on the AI revolution more dramatically than Nvidia. Its revenue, profitability, and cash reserves have skyrocketed since the introduction of ChatGPT a little over two years ago — and the many competitive generative AI services that have launched since. And its stock price soared more than eightfold. During that period, the world’s leading high-performance GPU maker has used its ballooning fortunes to significantly increase investments in all sorts of startups but parti',\n", + " 'pubDate': '2025-01-13T03:39:17Z',\n", " 'isHosted': True,\n", " 'bypassModal': False,\n", " 'previewUrl': None,\n", - " 'thumbnail': {'originalUrl': 'https://s.yimg.com/os/creatr-uploaded-images/2025-01/c0f690f0-ce98-11ef-9b53-60aab1d1b31d',\n", - " 'originalWidth': 3000,\n", - " 'originalHeight': 2000,\n", - " 'caption': '',\n", - " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/Imin228yYHOZBwpns7sUCw--~B/aD0yMDAwO3c9MzAwMDthcHBpZD15dGFjaHlvbg--/https://s.yimg.com/os/creatr-uploaded-images/2025-01/c0f690f0-ce98-11ef-9b53-60aab1d1b31d',\n", - " 'width': 3000,\n", - " 'height': 2000,\n", - " 'tag': 'original'},\n", - " {'url': 'https://s.yimg.com/uu/api/res/1.2/a28M8PHJ09LiQLo6yuPi8Q--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://s.yimg.com/os/creatr-uploaded-images/2025-01/c0f690f0-ce98-11ef-9b53-60aab1d1b31d',\n", - " 'width': 170,\n", - " 'height': 128,\n", - " 'tag': '170x128'}]},\n", - " 'provider': {'displayName': 'Yahoo Finance',\n", - " 'url': 'http://finance.yahoo.com/'},\n", - " 'canonicalUrl': {'url': 'https://finance.yahoo.com/news/tiktoks-future-is-now-in-the-hands-of-the-supreme-court-152854307.html',\n", + " 'thumbnail': None,\n", + " 'provider': {'displayName': 'TechCrunch', 'url': 'https://techcrunch.com/'},\n", + " 'canonicalUrl': {'url': 'https://techcrunch.com/2025/01/11/nvidias-ai-empire-a-look-at-its-top-startup-investments/',\n", " 'site': 'finance',\n", " 'region': 'US',\n", " 'lang': 'en-US'},\n", - " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/tiktoks-future-is-now-in-the-hands-of-the-supreme-court-152854307.html',\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/nvidias-ai-empire-look-top-150000334.html',\n", " 'site': 'finance',\n", " 'region': 'US',\n", " 'lang': 'en-US'},\n", " 'metadata': {'editorsPick': True},\n", " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", " 'isPremiumFreeNews': False}},\n", - " 'storyline': {'storylineItems': [{'content': {'id': '2809a22b-eeda-3d2c-8e92-eca8f7ee6027',\n", - " 'contentType': 'VIDEO',\n", + " 'storyline': {'storylineItems': [{'content': {'id': 'f7f907e3-079a-4e76-8b01-fb2ed41c38ed',\n", + " 'contentType': 'STORY',\n", " 'isHosted': True,\n", - " 'title': 'Top 3 tech trends that dominated CES 2025',\n", - " 'thumbnail': {'originalUrl': 'https://s.yimg.com/os/creatr-uploaded-images/2025-01/08565e40-ce9d-11ef-b9ff-758569a84cb2',\n", - " 'originalWidth': 3600,\n", - " 'originalHeight': 2027,\n", + " 'title': \"Top plays among the 'Magnificent 7' and Big Tech stocks as Trump returns to the White House\",\n", + " 'thumbnail': {'originalUrl': 'https://s.yimg.com/os/creatr-uploaded-images/2025-01/118ad8a0-ce12-11ef-bfec-f2b203388def',\n", + " 'originalWidth': 6000,\n", + " 'originalHeight': 4000,\n", " 'caption': '',\n", " 'resolutions': None},\n", - " 'provider': {'displayName': 'Yahoo Finance Video',\n", - " 'sourceId': 'video.yahoofinance.com'},\n", + " 'provider': {'displayName': 'Yahoo Finance',\n", + " 'sourceId': 'yahoofinance.com'},\n", " 'previewUrl': None,\n", " 'providerContentUrl': '',\n", - " 'canonicalUrl': {'url': 'https://finance.yahoo.com/video/top-3-tech-trends-dominated-152212309.html'},\n", - " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/video/top-3-tech-trends-dominated-152212309.html'}}},\n", - " {'content': {'id': '8e080afd-f198-43c6-adef-808d9dca83d5',\n", + " 'canonicalUrl': {'url': 'https://finance.yahoo.com/news/top-plays-among-the-magnificent-7-and-big-tech-stocks-as-trump-returns-to-the-white-house-162315184.html'},\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/top-plays-among-the-magnificent-7-and-big-tech-stocks-as-trump-returns-to-the-white-house-162315184.html'}}},\n", + " {'content': {'id': 'bde198dd-0660-4fbf-90ec-091119b9c995',\n", " 'contentType': 'STORY',\n", " 'isHosted': True,\n", - " 'title': \"Stocks are priced for 'perfection' and more vulnerable to a correction, Goldman warns\",\n", - " 'thumbnail': {'originalUrl': 'https://s.yimg.com/os/creatr-uploaded-images/2024-12/dfb6ff80-c7a8-11ef-8fff-d96912c6b9f9',\n", - " 'originalWidth': 7539,\n", - " 'originalHeight': 5026,\n", + " 'title': \"The blunt truth on Nvidia, the 'Magnificent 7,' and markets\",\n", + " 'thumbnail': {'originalUrl': 'https://s.yimg.com/os/creatr-uploaded-images/2025-01/69dcb560-ceb1-11ef-93f6-b6a39dae8358',\n", + " 'originalWidth': 5000,\n", + " 'originalHeight': 3333,\n", " 'caption': '',\n", " 'resolutions': None},\n", " 'provider': {'displayName': 'Yahoo Finance',\n", " 'sourceId': 'yahoofinance.com'},\n", " 'previewUrl': None,\n", " 'providerContentUrl': '',\n", - " 'canonicalUrl': {'url': 'https://finance.yahoo.com/news/stocks-are-priced-for-perfection-and-more-vulnerable-to-a-correction-goldman-warns-114026237.html'},\n", - " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/stocks-are-priced-for-perfection-and-more-vulnerable-to-a-correction-goldman-warns-114026237.html'}}}]}}},\n", - " {'id': '54ac2316-dbd0-379c-a86e-d44cf9705bf5',\n", - " 'content': {'id': '54ac2316-dbd0-379c-a86e-d44cf9705bf5',\n", + " 'canonicalUrl': {'url': 'https://finance.yahoo.com/news/the-blunt-truth-on-nvidia-the-magnificent-7-and-markets-133035656.html'},\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/the-blunt-truth-on-nvidia-the-magnificent-7-and-markets-133035656.html'}}}]}}},\n", + " {'id': '6571c3dc-e7b8-325c-9208-75d8f6f0a4de',\n", + " 'content': {'id': '6571c3dc-e7b8-325c-9208-75d8f6f0a4de',\n", " 'contentType': 'STORY',\n", - " 'title': 'Artificial Intelligence (AI), Quantum Computing, and RoboTaxis: Here\\'s 1 \"Magnificent Seven\" Stock That Has It All',\n", + " 'title': '1 Unstoppable Stock That Could Join Nvidia, Apple, and Microsoft in the $3 Trillion Club in 2025',\n", " 'description': '',\n", - " 'summary': 'Artificial intelligence (AI) could be the greatest game-changing technology ever. Here\\'s one \"Magnificent Seven\" stock that has it all. Google parent Alphabet (NASDAQ: GOOG) (NASDAQ: GOOGL) has pioneered AI for years.',\n", - " 'pubDate': '2025-01-10T09:45:00Z',\n", + " 'summary': \"Alphabet (NASDAQ: GOOG)(NASDAQ: GOOGL) is the world's fourth-largest company, with a market capitalization of $2.36 trillion as of this writing. Alphabet has become a leader in artificial intelligence (AI) and it's embedding the technology across many of its legacy businesses, including Google Search. Alphabet investors were concerned because Google Search is the conglomerate's primary source of revenue, and its 90% market share in the internet search industry was suddenly under threat.\",\n", + " 'pubDate': '2025-01-13T09:28:00Z',\n", " 'isHosted': True,\n", " 'bypassModal': False,\n", " 'previewUrl': None,\n", - " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/motleyfool.com/c33e2d0e7845c947afe6733e9d49e946',\n", - " 'originalWidth': 2121,\n", - " 'originalHeight': 1414,\n", - " 'caption': '',\n", - " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/sb4A_RWX900d2FZU71xt0w--~B/aD0xNDE0O3c9MjEyMTthcHBpZD15dGFjaHlvbg--/https://media.zenfs.com/en/motleyfool.com/c33e2d0e7845c947afe6733e9d49e946',\n", - " 'width': 2121,\n", - " 'height': 1414,\n", + " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/motleyfool.com/bfdb7991582d83036c38fe8d184e476e',\n", + " 'originalWidth': 1400,\n", + " 'originalHeight': 787,\n", + " 'caption': \"An image of Google's office headquarters.\",\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/i_YaIzqADmNg1aOqK2VhMQ--~B/aD03ODc7dz0xNDAwO2FwcGlkPXl0YWNoeW9u/https://media.zenfs.com/en/motleyfool.com/bfdb7991582d83036c38fe8d184e476e',\n", + " 'width': 1400,\n", + " 'height': 787,\n", " 'tag': 'original'},\n", - " {'url': 'https://s.yimg.com/uu/api/res/1.2/h_BQjtk3J7zDu.OzPzcIpQ--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/motleyfool.com/c33e2d0e7845c947afe6733e9d49e946',\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/u7UEmqzHvIyUIJFsaL87Kg--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/motleyfool.com/bfdb7991582d83036c38fe8d184e476e',\n", " 'width': 170,\n", " 'height': 128,\n", " 'tag': '170x128'}]},\n", " 'provider': {'displayName': 'Motley Fool', 'url': 'http://www.fool.com/'},\n", - " 'canonicalUrl': {'url': 'https://www.fool.com/investing/2025/01/10/ai-quantum-computing-magnificent-seven-stock/?source=eptyholnk0000202&utm_source=yahoo-host-full&utm_medium=feed&utm_campaign=article&referring_guid=e56824b8-f3c2-4c54-9cf5-126803df28ba',\n", + " 'canonicalUrl': {'url': 'https://www.fool.com/investing/2025/01/13/1-stock-nvidia-apple-microsoft-in-3-trillion-2025/?source=eptyholnk0000202&utm_source=yahoo-host-full&utm_medium=feed&utm_campaign=article&referring_guid=4e070079-9058-43e8-8ab8-3ded3a0359bc',\n", " 'site': 'finance',\n", " 'region': 'US',\n", " 'lang': 'en-US'},\n", - " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/artificial-intelligence-ai-quantum-computing-094500001.html',\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/1-unstoppable-stock-could-join-092800321.html',\n", " 'site': 'finance',\n", " 'region': 'US',\n", " 'lang': 'en-US'},\n", @@ -2715,70 +2774,67 @@ " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", " 'isPremiumFreeNews': False}},\n", " 'storyline': None}},\n", - " {'id': 'c7f72eae-b363-32ba-9736-fae3373c0094',\n", - " 'content': {'id': 'c7f72eae-b363-32ba-9736-fae3373c0094',\n", + " {'id': 'c69d009d-95e5-3dd5-9d7d-f1d16852836f',\n", + " 'content': {'id': 'c69d009d-95e5-3dd5-9d7d-f1d16852836f',\n", " 'contentType': 'STORY',\n", - " 'title': 'Prediction: 1 Unstoppable Artificial Intelligence (AI) Stock Will Lead the \"Third Wave\" of AI Development and Be Worth More Than Nvidia by 2030',\n", + " 'title': 'Investors Hope Earnings Season Can Revive Faltering Stock Rally',\n", " 'description': '',\n", - " 'summary': \"Nvidia (NASDAQ: NVDA) has been among the best-performing stocks of 2024, and it's easy to see why. The company provides the graphics processing units (GPUs) that quickly became the gold standard for powering artificial intelligence (AI) systems. The wave of demand for its chips has pushed the company's market cap to nearly $3.7 trillion as of this writing, currently making it the world's second most valuable company.\",\n", - " 'pubDate': '2025-01-10T09:05:00Z',\n", - " 'isHosted': True,\n", + " 'summary': 'With the Fed unlikely to cut interest rates as quickly as hoped, corporate earnings growth becomes even more critical to keeping the market afloat.',\n", + " 'pubDate': '2025-01-13T05:03:00Z',\n", + " 'isHosted': False,\n", " 'bypassModal': False,\n", - " 'previewUrl': None,\n", - " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/motleyfool.com/7bc0d30db52efd8c30a09faa3324ab1b',\n", - " 'originalWidth': 1400,\n", - " 'originalHeight': 932,\n", - " 'caption': 'A person\\'s hand cupped open with a hologram of an AI chatbot above saying \"Hi, can I help you?\"',\n", - " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/p4w179om5_B64AFbWSuEuw--~B/aD05MzI7dz0xNDAwO2FwcGlkPXl0YWNoeW9u/https://media.zenfs.com/en/motleyfool.com/7bc0d30db52efd8c30a09faa3324ab1b',\n", - " 'width': 1400,\n", - " 'height': 932,\n", + " 'previewUrl': 'https://finance.yahoo.com/m/c69d009d-95e5-3dd5-9d7d-f1d16852836f/investors-hope-earnings.html',\n", + " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/wsj.com/7b2c285183be07ca3c4e8242b25a59a8',\n", + " 'originalWidth': 1200,\n", + " 'originalHeight': 630,\n", + " 'caption': '',\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/Fwf5HL4GsEGPbDfR3MJBPg--~B/aD02MzA7dz0xMjAwO2FwcGlkPXl0YWNoeW9u/https://media.zenfs.com/en/wsj.com/7b2c285183be07ca3c4e8242b25a59a8',\n", + " 'width': 1200,\n", + " 'height': 630,\n", " 'tag': 'original'},\n", - " {'url': 'https://s.yimg.com/uu/api/res/1.2/PnkCbEk8qsr7POGGrudGVQ--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/motleyfool.com/7bc0d30db52efd8c30a09faa3324ab1b',\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/c34MZxHLZOfDYN2BBjM9ww--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/wsj.com/7b2c285183be07ca3c4e8242b25a59a8',\n", " 'width': 170,\n", " 'height': 128,\n", " 'tag': '170x128'}]},\n", - " 'provider': {'displayName': 'Motley Fool', 'url': 'http://www.fool.com/'},\n", - " 'canonicalUrl': {'url': 'https://www.fool.com/investing/2025/01/10/prediction-1-unstoppable-artificial-intelligence-a/?source=eptyholnk0000202&utm_source=yahoo-host-full&utm_medium=feed&utm_campaign=article&referring_guid=df931381-4d24-4749-a2e6-152e3a93dd0f',\n", - " 'site': 'finance',\n", - " 'region': 'US',\n", - " 'lang': 'en-US'},\n", - " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/prediction-1-unstoppable-artificial-intelligence-090500102.html',\n", + " 'provider': {'displayName': 'The Wall Street Journal',\n", + " 'url': 'http://www.wsj.com/'},\n", + " 'canonicalUrl': {'url': 'https://www.wsj.com/finance/stocks/bank-earnings-q4-2024-preview-0e5f701e?siteid=yhoof2&yptr=yahoo',\n", " 'site': 'finance',\n", " 'region': 'US',\n", " 'lang': 'en-US'},\n", + " 'clickThroughUrl': None,\n", " 'metadata': {'editorsPick': False},\n", " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", " 'isPremiumFreeNews': False}},\n", " 'storyline': None}},\n", - " {'id': '514567bc-4750-49ea-ba6c-2c6dca7651ac',\n", - " 'content': {'id': '514567bc-4750-49ea-ba6c-2c6dca7651ac',\n", + " {'id': 'f57279be-704a-315d-87ba-432565f961d6',\n", + " 'content': {'id': 'f57279be-704a-315d-87ba-432565f961d6',\n", " 'contentType': 'STORY',\n", - " 'title': 'Bitcoin ETFs and the race to institutionalise crypto',\n", + " 'title': '3 Best Artificial Intelligence (AI) Stocks to Buy in January',\n", " 'description': '',\n", - " 'summary': '2024 was pivotal for bitcoin and the crypto market, fuelled by a surge in institutional adoption through bitcoin and ether exchange-traded funds.',\n", - " 'pubDate': '2025-01-10T06:00:59Z',\n", + " 'summary': 'One of the biggest themes in the stock market in 2024 was artificial intelligence (AI), which is showing signs of becoming a breakthrough technology. Nvidia (NASDAQ: NVDA) has arguably been the biggest winner from AI, as its revenue absolutely skyrocketed the past two years. Meanwhile, it amassed a whopping 90% market share in the GPU space over rival Advanced Micro Devices due to its superior software platform CUDA, which includes developer tools and micro-libraries that easily allow its chips to be programmed to handle various AI-related tasks.',\n", + " 'pubDate': '2025-01-12T20:17:00Z',\n", " 'isHosted': True,\n", " 'bypassModal': False,\n", " 'previewUrl': None,\n", - " 'thumbnail': {'originalUrl': 'https://s.yimg.com/os/creatr-uploaded-images/2024-10/47d95570-9f6a-11ef-a9be-5f7d6fd83f98',\n", - " 'originalWidth': 5797,\n", - " 'originalHeight': 3867,\n", + " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/motleyfool.com/c489657d0a6350c0a69b82e5909ee8a2',\n", + " 'originalWidth': 1400,\n", + " 'originalHeight': 787,\n", " 'caption': '',\n", - " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/uRMJOIguvXATMjaQkRlC7Q--~B/aD0zODY3O3c9NTc5NzthcHBpZD15dGFjaHlvbg--/https://s.yimg.com/os/creatr-uploaded-images/2024-10/47d95570-9f6a-11ef-a9be-5f7d6fd83f98',\n", - " 'width': 5797,\n", - " 'height': 3867,\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/qL.sGwV2AMQ3NoOZm8i3TQ--~B/aD03ODc7dz0xNDAwO2FwcGlkPXl0YWNoeW9u/https://media.zenfs.com/en/motleyfool.com/c489657d0a6350c0a69b82e5909ee8a2',\n", + " 'width': 1400,\n", + " 'height': 787,\n", " 'tag': 'original'},\n", - " {'url': 'https://s.yimg.com/uu/api/res/1.2/.CqkiDiHYL.PrPJRQav_9w--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://s.yimg.com/os/creatr-uploaded-images/2024-10/47d95570-9f6a-11ef-a9be-5f7d6fd83f98',\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/mfOz1AD4AhFsI7U.v3ppHw--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/motleyfool.com/c489657d0a6350c0a69b82e5909ee8a2',\n", " 'width': 170,\n", " 'height': 128,\n", " 'tag': '170x128'}]},\n", - " 'provider': {'displayName': 'Yahoo Finance UK',\n", - " 'url': 'http://uk.finance.yahoo.com/'},\n", - " 'canonicalUrl': {'url': 'https://uk.finance.yahoo.com/news/bitcoin-etf-institutionalise-crypto-060059019.html',\n", + " 'provider': {'displayName': 'Motley Fool', 'url': 'http://www.fool.com/'},\n", + " 'canonicalUrl': {'url': 'https://www.fool.com/investing/2025/01/12/3-best-artificial-intelligence-ai-stocks-to-buy-in/?source=eptyholnk0000202&utm_source=yahoo-host-full&utm_medium=feed&utm_campaign=article&referring_guid=2107d8af-cc8b-49c0-846b-58f95f4067e9',\n", " 'site': 'finance',\n", - " 'region': 'GB',\n", - " 'lang': 'en-GB'},\n", - " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/bitcoin-etf-institutionalise-crypto-060059019.html',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/3-best-artificial-intelligence-ai-201700604.html',\n", " 'site': 'finance',\n", " 'region': 'US',\n", " 'lang': 'en-US'},\n", @@ -2786,53 +2842,55 @@ " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", " 'isPremiumFreeNews': False}},\n", " 'storyline': None}},\n", - " {'id': '0219136d-ac3c-383b-aa34-8ee1a2f7fda0',\n", - " 'content': {'id': '0219136d-ac3c-383b-aa34-8ee1a2f7fda0',\n", + " {'id': '6f69424d-69d9-37af-bf7e-1ba6a2db8466',\n", + " 'content': {'id': '6f69424d-69d9-37af-bf7e-1ba6a2db8466',\n", " 'contentType': 'STORY',\n", - " 'title': 'Even Companies That Aren’t Struggling Keep Laying Off Workers',\n", + " 'title': 'Think Nvidia Stock Is Expensive? This Chart Might Change Your Mind.',\n", " 'description': '',\n", - " 'summary': 'It’s natural for companies to slash workers when times are tough. But some firms, such as Microsoft and BlackRock, are cutting even as they thrive.',\n", - " 'pubDate': '2025-01-09T22:33:00Z',\n", - " 'isHosted': False,\n", + " 'summary': 'Nvidia (NASDAQ: NVDA) was one of the best-performing stocks of 2024. It even dwarfed the returns of the Nasdaq Composite index in a year the index itself returned an amazing 28.6%. Its stock price soared as the market became enthused by consistent triple-digit revenue gains that led to triple-digit net income gains.',\n", + " 'pubDate': '2025-01-12T16:05:00Z',\n", + " 'isHosted': True,\n", " 'bypassModal': False,\n", - " 'previewUrl': 'https://finance.yahoo.com/m/0219136d-ac3c-383b-aa34-8ee1a2f7fda0/even-companies-that-aren%E2%80%99t.html',\n", - " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/Barrons.com/12ea0f43d8f8307249a68d1cb2e0587e',\n", - " 'originalWidth': 320,\n", - " 'originalHeight': 65,\n", - " 'caption': '',\n", - " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/_kc6REYMS1JrAuV5bYtjfA--~B/aD02NTt3PTMyMDthcHBpZD15dGFjaHlvbg--/https://media.zenfs.com/en/Barrons.com/12ea0f43d8f8307249a68d1cb2e0587e',\n", - " 'width': 320,\n", - " 'height': 65,\n", + " 'previewUrl': None,\n", + " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/motleyfool.com/08d83fe18d5b5b1541c74a14432cd13f',\n", + " 'originalWidth': 1095,\n", + " 'originalHeight': 750,\n", + " 'caption': 'bar chart showing global market size for generative AI through 2030.',\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/_NvqSaFAHBgvMjfEMKwncg--~B/aD03NTA7dz0xMDk1O2FwcGlkPXl0YWNoeW9u/https://media.zenfs.com/en/motleyfool.com/08d83fe18d5b5b1541c74a14432cd13f',\n", + " 'width': 1095,\n", + " 'height': 750,\n", " 'tag': 'original'},\n", - " {'url': 'https://s.yimg.com/uu/api/res/1.2/Eugzn1_7mDocWpeqoc2fFg--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/Barrons.com/12ea0f43d8f8307249a68d1cb2e0587e',\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/aTXUdI29lMMSdP09SVbRMQ--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/motleyfool.com/08d83fe18d5b5b1541c74a14432cd13f',\n", " 'width': 170,\n", " 'height': 128,\n", " 'tag': '170x128'}]},\n", - " 'provider': {'displayName': 'Barrons.com',\n", - " 'url': 'http://www.barrons.com/'},\n", - " 'canonicalUrl': {'url': 'https://www.barrons.com/articles/jobs-microsoft-blackrock-bridgewater-ally-washington-post-61a6324f?siteid=yhoof2&yptr=yahoo',\n", + " 'provider': {'displayName': 'Motley Fool', 'url': 'http://www.fool.com/'},\n", + " 'canonicalUrl': {'url': 'https://www.fool.com/investing/2025/01/12/think-nvidia-stock-is-expensive-this-chart-might-c/?source=eptyholnk0000202&utm_source=yahoo-host-full&utm_medium=feed&utm_campaign=article&referring_guid=7c23f676-dd77-4e1d-895f-c0e85084e303',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/think-nvidia-stock-expensive-chart-160500906.html',\n", " 'site': 'finance',\n", " 'region': 'US',\n", " 'lang': 'en-US'},\n", - " 'clickThroughUrl': None,\n", " 'metadata': {'editorsPick': False},\n", " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", " 'isPremiumFreeNews': False}},\n", " 'storyline': None}},\n", - " {'id': '57648756-895b-3bc0-bbd2-ea061138963b',\n", - " 'content': {'id': '57648756-895b-3bc0-bbd2-ea061138963b',\n", + " {'id': '93385f46-7405-33e0-a995-09de98d42262',\n", + " 'content': {'id': '93385f46-7405-33e0-a995-09de98d42262',\n", " 'contentType': 'STORY',\n", - " 'title': 'Is Microsoft Corp. (MSFT) the Best Technology Stock to Invest In for the Long Term',\n", + " 'title': 'Is Microsoft Corporation (MSFT) the Best Cloud Computing Stock to Buy According to Analysts?',\n", " 'description': '',\n", - " 'summary': 'We recently compiled a list of the 12 Best Technology Stocks to Invest In for the Long Term. In this article, we are going to take a look at where Microsoft Corp. (NASDAQ:MSFT) stands against the other technology stocks. On January 1, King Lip, BakerAvenue Wealth Management’s chief strategist and partner, joined CNBC’s ‘Closing Bell’ to […]',\n", - " 'pubDate': '2025-01-09T19:23:14Z',\n", + " 'summary': 'We recently compiled a list of the 12 Best Cloud Computing Stocks to Buy According to Analysts. In this article, we are going to take a look at where Microsoft Corporation (NASDAQ:MSFT) stands against the other cloud computing stocks. Cloud computing enables companies to store their infrastructures remotely using the Internet, ultimately reducing costs and creating […]',\n", + " 'pubDate': '2025-01-12T14:45:22Z',\n", " 'isHosted': True,\n", " 'bypassModal': False,\n", " 'previewUrl': None,\n", " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/insidermonkey.com/ae3cb2a93ad8e5ddf6f94148e71f74b9',\n", " 'originalWidth': 1456,\n", " 'originalHeight': 816,\n", - " 'caption': 'Is Microsoft Corporation (MSFT) the Best Edge Computing Stock to Invest in According to Analysts?',\n", + " 'caption': \"Microsoft (MSFT) AI Strategy: Cramer Weighs In on Brad Smith's Vision for the New Industrial Revolution\",\n", " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/FPV7LMJx9t7xViBmxMrZWw--~B/aD04MTY7dz0xNDU2O2FwcGlkPXl0YWNoeW9u/https://media.zenfs.com/en/insidermonkey.com/ae3cb2a93ad8e5ddf6f94148e71f74b9',\n", " 'width': 1456,\n", " 'height': 816,\n", @@ -2843,11 +2901,11 @@ " 'tag': '170x128'}]},\n", " 'provider': {'displayName': 'Insider Monkey',\n", " 'url': 'http://www.insidermonkey.com'},\n", - " 'canonicalUrl': {'url': 'https://finance.yahoo.com/news/microsoft-corp-msft-best-technology-192314588.html',\n", + " 'canonicalUrl': {'url': 'https://finance.yahoo.com/news/microsoft-corporation-msft-best-cloud-144522029.html',\n", " 'site': 'finance',\n", " 'region': 'US',\n", " 'lang': 'en-US'},\n", - " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/microsoft-corp-msft-best-technology-192314588.html',\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/microsoft-corporation-msft-best-cloud-144522029.html',\n", " 'site': 'finance',\n", " 'region': 'US',\n", " 'lang': 'en-US'},\n", @@ -2855,35 +2913,34 @@ " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", " 'isPremiumFreeNews': False}},\n", " 'storyline': None}},\n", - " {'id': '899dde68-557f-3635-adcd-319f021913b6',\n", - " 'content': {'id': '899dde68-557f-3635-adcd-319f021913b6',\n", + " {'id': '15b3e963-b5e9-3c0d-ad2a-9520617c4b45',\n", + " 'content': {'id': '15b3e963-b5e9-3c0d-ad2a-9520617c4b45',\n", " 'contentType': 'STORY',\n", - " 'title': 'Microsoft, Google, Adobe Give $1 Million Each to Trump Inaugural Fund',\n", + " 'title': '3 Artificial Intelligence (AI) Software Names to Buy in 2025, According to Dan Ives',\n", " 'description': '',\n", - " 'summary': '(Bloomberg) -- Microsoft Corp., Alphabet Inc.’s Google, and Adobe Inc. are each donating $1 million to Donald Trump’s inauguration fund, joining the roster of technology companies shelling out to back the incoming US president’s festivities later this month. Most Read from BloombergWhat Robotaxis Brought San FranciscoNYC Condo Owners May Bear Costs of Landmark Green Building LawAmbitious High-Speed Rail Plans Advance in the Baltic RegionNYC’s Subway Violence Deters Drive to Bring Workers Back to',\n", - " 'pubDate': '2025-01-09T19:01:21Z',\n", + " 'summary': 'Software is expected to have another great year in 2025 fueled by ongoing and rising investment in artificial intelligence (AI).',\n", + " 'pubDate': '2025-01-12T11:05:00Z',\n", " 'isHosted': True,\n", " 'bypassModal': False,\n", " 'previewUrl': None,\n", - " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/bloomberg_technology_68/5a9186104e5ad33e032ce0fa6e2748a2',\n", - " 'originalWidth': 2000,\n", - " 'originalHeight': 1334,\n", - " 'caption': '',\n", - " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/xdX7DbGQXYQUmxeen.ZIqQ--~B/aD0xMzM0O3c9MjAwMDthcHBpZD15dGFjaHlvbg--/https://media.zenfs.com/en/bloomberg_technology_68/5a9186104e5ad33e032ce0fa6e2748a2',\n", - " 'width': 2000,\n", - " 'height': 1334,\n", + " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/motleyfool.com/d1f6968fa2813b7c528ad7d9503c269d',\n", + " 'originalWidth': 1400,\n", + " 'originalHeight': 784,\n", + " 'caption': 'An office worker using software to derive data-driven insights.',\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/F_1AFosLS0Dx1PqEdG_Y1A--~B/aD03ODQ7dz0xNDAwO2FwcGlkPXl0YWNoeW9u/https://media.zenfs.com/en/motleyfool.com/d1f6968fa2813b7c528ad7d9503c269d',\n", + " 'width': 1400,\n", + " 'height': 784,\n", " 'tag': 'original'},\n", - " {'url': 'https://s.yimg.com/uu/api/res/1.2/BLaKhtv3d1GKodSAtFOMpA--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/bloomberg_technology_68/5a9186104e5ad33e032ce0fa6e2748a2',\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/BSgN07TAGTjahGI70CWLoA--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/motleyfool.com/d1f6968fa2813b7c528ad7d9503c269d',\n", " 'width': 170,\n", " 'height': 128,\n", " 'tag': '170x128'}]},\n", - " 'provider': {'displayName': 'Bloomberg',\n", - " 'url': 'https://www.bloomberg.com/'},\n", - " 'canonicalUrl': {'url': 'https://finance.yahoo.com/news/microsoft-google-adobe-1-million-190121729.html',\n", + " 'provider': {'displayName': 'Motley Fool', 'url': 'http://www.fool.com/'},\n", + " 'canonicalUrl': {'url': 'https://www.fool.com/investing/2025/01/12/3-artificial-intelligence-ai-software-names-to-buy/?source=eptyholnk0000202&utm_source=yahoo-host-full&utm_medium=feed&utm_campaign=article&referring_guid=3caac5cf-bc52-4cbf-9874-acacb04d9683',\n", " 'site': 'finance',\n", " 'region': 'US',\n", " 'lang': 'en-US'},\n", - " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/microsoft-google-adobe-1-million-190121729.html',\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/3-artificial-intelligence-ai-software-110500082.html',\n", " 'site': 'finance',\n", " 'region': 'US',\n", " 'lang': 'en-US'},\n", @@ -2891,68 +2948,69 @@ " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", " 'isPremiumFreeNews': False}},\n", " 'storyline': None}},\n", - " {'id': '5dd00a9b-8305-3862-b01d-ed9edac80eb4',\n", - " 'content': {'id': '5dd00a9b-8305-3862-b01d-ed9edac80eb4',\n", + " {'id': 'b3d8745f-516a-3508-a751-539d74d42253',\n", + " 'content': {'id': 'b3d8745f-516a-3508-a751-539d74d42253',\n", " 'contentType': 'STORY',\n", - " 'title': \"Is Microsoft Stock, Up Mildly In 2025 So Far, A Buy In January? Here's What The Fundamentals, Chart Action Say Now\",\n", + " 'title': 'Is Intel Ready for an AI Comeback in 2025?',\n", " 'description': '',\n", - " 'summary': 'Microsoft has started the new year with a small gain year to date. On Wednesday, shares rose 0.5% to 424.56 ahead of the market holiday to honor the late U.S. President Jimmy Carter. This story will assess fundamental, technical and institutional sponsorship criteria on the veteran tech giant and long-term leader of the stock market.',\n", - " 'pubDate': '2025-01-09T17:35:01Z',\n", - " 'isHosted': False,\n", + " 'summary': 'One area where Intel (NASDAQ: INTC) has seriously dropped the ball has been artificial intelligence (AI). Nvidia essentially owns the market for AI accelerator chips, and AMD is at least competitive with its Instinct line of data center graphics processing units (GPUs). Nvidia is generating tens of billions of dollars in revenue each quarter from its data center GPUs, and AMD is producing a few billion per year.',\n", + " 'pubDate': '2025-01-12T10:55:00Z',\n", + " 'isHosted': True,\n", " 'bypassModal': False,\n", - " 'previewUrl': 'https://finance.yahoo.com/m/5dd00a9b-8305-3862-b01d-ed9edac80eb4/is-microsoft-stock-up-mildly.html',\n", - " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/ibd.com/0a1f36e6a637c56a99c29443cfe8d30c',\n", - " 'originalWidth': 945,\n", - " 'originalHeight': 533,\n", + " 'previewUrl': None,\n", + " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/motleyfool.com/dd9cbc351a583f185c3fc4601b91f159',\n", + " 'originalWidth': 1920,\n", + " 'originalHeight': 1096,\n", " 'caption': '',\n", - " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/yit1MvSuQg39B9tvp9OnMQ--~B/aD01MzM7dz05NDU7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/ibd.com/0a1f36e6a637c56a99c29443cfe8d30c',\n", - " 'width': 945,\n", - " 'height': 533,\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/Ib.42bRCzlOoqxcGP.xszw--~B/aD0xMDk2O3c9MTkyMDthcHBpZD15dGFjaHlvbg--/https://media.zenfs.com/en/motleyfool.com/dd9cbc351a583f185c3fc4601b91f159',\n", + " 'width': 1920,\n", + " 'height': 1096,\n", " 'tag': 'original'},\n", - " {'url': 'https://s.yimg.com/uu/api/res/1.2/.j92vhN.oSt1hzZUsIeDfQ--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/ibd.com/0a1f36e6a637c56a99c29443cfe8d30c',\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/cOWnyq4KAFMwSl0hS.VH2w--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/motleyfool.com/dd9cbc351a583f185c3fc4601b91f159',\n", " 'width': 170,\n", " 'height': 128,\n", " 'tag': '170x128'}]},\n", - " 'provider': {'displayName': \"Investor's Business Daily\",\n", - " 'url': 'http://www.investors.com/'},\n", - " 'canonicalUrl': {'url': 'https://www.investors.com/research/microsoft-stock-msft-buy-january/?src=A00220&yptr=yahoo',\n", + " 'provider': {'displayName': 'Motley Fool', 'url': 'http://www.fool.com/'},\n", + " 'canonicalUrl': {'url': 'https://www.fool.com/investing/2025/01/12/is-intel-ready-for-an-ai-comeback-in-2025/?source=eptyholnk0000202&utm_source=yahoo-host-full&utm_medium=feed&utm_campaign=article&referring_guid=0f0478e8-eb67-452a-8d8b-7674ba02f842',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/intel-ready-ai-comeback-2025-105500316.html',\n", " 'site': 'finance',\n", " 'region': 'US',\n", " 'lang': 'en-US'},\n", - " 'clickThroughUrl': None,\n", " 'metadata': {'editorsPick': False},\n", " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", " 'isPremiumFreeNews': False}},\n", " 'storyline': None}},\n", - " {'id': '284cbcf5-4463-3442-9fe8-13af64e93281',\n", - " 'content': {'id': '284cbcf5-4463-3442-9fe8-13af64e93281',\n", + " {'id': 'f83cb4a0-163b-3b8e-8419-0cc2ec0927a3',\n", + " 'content': {'id': 'f83cb4a0-163b-3b8e-8419-0cc2ec0927a3',\n", " 'contentType': 'STORY',\n", - " 'title': \"Layoffs Amid Growth: Microsoft Trims Staff but Signals Strong Confidence in Azure's Future\",\n", + " 'title': \"Can 2024's Best-Performing Dow Jones Stock Beat the S&P 500 Again in 2025?\",\n", " 'description': '',\n", - " 'summary': 'Microsoft announces minor layoffs while emphasizing Azure growth and maintaining investor confidence',\n", - " 'pubDate': '2025-01-09T17:23:21Z',\n", + " 'summary': \"Nvidia (NASDAQ: NVDA) was added to the Dow Jones Industrial Average (DJINDICES: ^DJI) in November 2024. Nvidia stock went up a mind-numbing 818.9% between 2023 and 2024, which may lead some investors to question how much further it can run before its valuation gets stretched too thin. Here's why the rally in Nvidia stock is somewhat justified, why Nvidia could continue outperforming the market and is worth buying, and some reasons to keep Nvidia on a watchlist for now.\",\n", + " 'pubDate': '2025-01-12T10:15:00Z',\n", " 'isHosted': True,\n", " 'bypassModal': False,\n", " 'previewUrl': None,\n", - " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/us.finance.gurufocus/61d052cba829dcaa8e969ad093b21ab1',\n", - " 'originalWidth': 550,\n", - " 'originalHeight': 366,\n", - " 'caption': '',\n", - " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/0kzRl.07.e5VAQ0EwkLanQ--~B/aD0zNjY7dz01NTA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/us.finance.gurufocus/61d052cba829dcaa8e969ad093b21ab1',\n", - " 'width': 550,\n", - " 'height': 366,\n", + " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/motleyfool.com/d7c455756e4655a5706228b767b5f06f',\n", + " 'originalWidth': 1200,\n", + " 'originalHeight': 800,\n", + " 'caption': 'A person sitting at a table, looking calmly at a laptop computer.',\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/Plo0Vd1Aeq7w_FOfWf2.zA--~B/aD04MDA7dz0xMjAwO2FwcGlkPXl0YWNoeW9u/https://media.zenfs.com/en/motleyfool.com/d7c455756e4655a5706228b767b5f06f',\n", + " 'width': 1200,\n", + " 'height': 800,\n", " 'tag': 'original'},\n", - " {'url': 'https://s.yimg.com/uu/api/res/1.2/R0Nu.dymZql3xmV9as2h4g--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/us.finance.gurufocus/61d052cba829dcaa8e969ad093b21ab1',\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/thsAemu1iWVM9xA.Y8IQCA--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/motleyfool.com/d7c455756e4655a5706228b767b5f06f',\n", " 'width': 170,\n", " 'height': 128,\n", " 'tag': '170x128'}]},\n", - " 'provider': {'displayName': 'GuruFocus.com',\n", - " 'url': 'http://www.gurufocus.com/'},\n", - " 'canonicalUrl': {'url': 'https://finance.yahoo.com/news/layoffs-amid-growth-microsoft-trims-172321645.html',\n", + " 'provider': {'displayName': 'Motley Fool', 'url': 'http://www.fool.com/'},\n", + " 'canonicalUrl': {'url': 'https://www.fool.com/investing/2025/01/12/nvidia-best-performing-dow-jones-stock-buy-2025/?source=eptyholnk0000202&utm_source=yahoo-host-full&utm_medium=feed&utm_campaign=article&referring_guid=bd575f91-f672-4a6c-a18e-1fb2966a8a10',\n", " 'site': 'finance',\n", " 'region': 'US',\n", " 'lang': 'en-US'},\n", - " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/layoffs-amid-growth-microsoft-trims-172321645.html',\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/2024s-best-performing-dow-jones-101500139.html',\n", " 'site': 'finance',\n", " 'region': 'US',\n", " 'lang': 'en-US'},\n", @@ -2960,42 +3018,44 @@ " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", " 'isPremiumFreeNews': False}},\n", " 'storyline': None}},\n", - " {'id': '265134ef-3101-3c73-872f-a0489124984e',\n", - " 'content': {'id': '265134ef-3101-3c73-872f-a0489124984e',\n", + " {'id': '9e3c01fe-7755-326f-9bb3-8fd4ee368656',\n", + " 'content': {'id': '9e3c01fe-7755-326f-9bb3-8fd4ee368656',\n", " 'contentType': 'STORY',\n", - " 'title': 'Will AI Replace Your Job? What Microsoft’s Latest Moves Say About Layoff Fears.',\n", + " 'title': \"Apple Is the Largest Company in the World. Here's Why Investors Should Be Wary of the Stock in 2025.\",\n", " 'description': '',\n", - " 'summary': 'Fresh job cuts are sweeping the technology sector with Microsoft the latest\\xa0company to be making layoffs. CNBC cited a person familiar with the matter and reported Microsoft had confirmed the cuts. Microsoft didn’t immediately respond to a request for comment early on Thursday.',\n", - " 'pubDate': '2025-01-09T16:03:00Z',\n", - " 'isHosted': False,\n", + " 'summary': \"Almost everyone knows Apple (NASDAQ: AAPL). Many millions of us have the company's devices in our pockets, handbags, or desktops, and many millions send Apple lots of money every year. Indeed, in Apple's last fiscal year, it raked in $391 billion in revenue.\",\n", + " 'pubDate': '2025-01-12T10:10:00Z',\n", + " 'isHosted': True,\n", " 'bypassModal': False,\n", - " 'previewUrl': 'https://finance.yahoo.com/m/265134ef-3101-3c73-872f-a0489124984e/will-ai-replace-your-job-.html',\n", - " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/Barrons.com/12ea0f43d8f8307249a68d1cb2e0587e',\n", - " 'originalWidth': 320,\n", - " 'originalHeight': 65,\n", - " 'caption': '',\n", - " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/_kc6REYMS1JrAuV5bYtjfA--~B/aD02NTt3PTMyMDthcHBpZD15dGFjaHlvbg--/https://media.zenfs.com/en/Barrons.com/12ea0f43d8f8307249a68d1cb2e0587e',\n", - " 'width': 320,\n", - " 'height': 65,\n", + " 'previewUrl': None,\n", + " 'thumbnail': {'originalUrl': 'https://media.zenfs.com/en/motleyfool.com/3ee99c507c4b3f3321e846d97335ac0a',\n", + " 'originalWidth': 1400,\n", + " 'originalHeight': 934,\n", + " 'caption': 'Someone in a red-and-white striped shirt is looking up, thinking.',\n", + " 'resolutions': [{'url': 'https://s.yimg.com/uu/api/res/1.2/1TQc739ALiM0qCHPDscBTQ--~B/aD05MzQ7dz0xNDAwO2FwcGlkPXl0YWNoeW9u/https://media.zenfs.com/en/motleyfool.com/3ee99c507c4b3f3321e846d97335ac0a',\n", + " 'width': 1400,\n", + " 'height': 934,\n", " 'tag': 'original'},\n", - " {'url': 'https://s.yimg.com/uu/api/res/1.2/Eugzn1_7mDocWpeqoc2fFg--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/Barrons.com/12ea0f43d8f8307249a68d1cb2e0587e',\n", + " {'url': 'https://s.yimg.com/uu/api/res/1.2/J_3qM9BXkVNNA86G7cHmFw--~B/Zmk9c3RyaW07aD0xMjg7dz0xNzA7YXBwaWQ9eXRhY2h5b24-/https://media.zenfs.com/en/motleyfool.com/3ee99c507c4b3f3321e846d97335ac0a',\n", " 'width': 170,\n", " 'height': 128,\n", " 'tag': '170x128'}]},\n", - " 'provider': {'displayName': 'Barrons.com',\n", - " 'url': 'http://www.barrons.com/'},\n", - " 'canonicalUrl': {'url': 'https://www.barrons.com/articles/microsoft-jobs-cuts-ai-5818fe31?siteid=yhoof2&yptr=yahoo',\n", + " 'provider': {'displayName': 'Motley Fool', 'url': 'http://www.fool.com/'},\n", + " 'canonicalUrl': {'url': 'https://www.fool.com/investing/2025/01/12/apple-is-the-largest-company-in-the-world-heres-wh/?source=eptyholnk0000202&utm_source=yahoo-host-full&utm_medium=feed&utm_campaign=article&referring_guid=ae82e460-4c57-4908-86bd-3787413d6c50',\n", + " 'site': 'finance',\n", + " 'region': 'US',\n", + " 'lang': 'en-US'},\n", + " 'clickThroughUrl': {'url': 'https://finance.yahoo.com/news/apple-largest-company-world-heres-101000169.html',\n", " 'site': 'finance',\n", " 'region': 'US',\n", " 'lang': 'en-US'},\n", - " 'clickThroughUrl': None,\n", " 'metadata': {'editorsPick': False},\n", " 'finance': {'premiumFinance': {'isPremiumNews': False,\n", " 'isPremiumFreeNews': False}},\n", " 'storyline': None}}]" ] }, - "execution_count": 33, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -3006,7 +3066,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -3015,20 +3075,20 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'current': 424.56,\n", + "{'current': 418.95,\n", " 'low': 420.0,\n", " 'high': 650.0,\n", " 'mean': 508.4636,\n", " 'median': 500.0}" ] }, - "execution_count": 42, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -3039,16 +3099,16 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "424.56" + "418.95" ] }, - "execution_count": 41, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -3059,7 +3119,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -3074,7 +3134,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -3083,7 +3143,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -3095,7 +3155,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ @@ -3108,7 +3168,7 @@ }, { "cell_type": "code", - "execution_count": 169, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ @@ -3148,7 +3208,7 @@ }, { "cell_type": "code", - "execution_count": 170, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ @@ -3177,7 +3237,7 @@ }, { "cell_type": "code", - "execution_count": 171, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ @@ -3187,7 +3247,7 @@ }, { "cell_type": "code", - "execution_count": 172, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -3233,7 +3293,7 @@ }, { "cell_type": "code", - "execution_count": 173, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -3244,6 +3304,14 @@ "profit\n", "---Profitability---\n" ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Joshu\\AppData\\Local\\Temp\\ipykernel_19980\\4002034012.py:28: LangChainDeprecationWarning: The method `BaseChatModel.__call__` was deprecated in langchain-core 0.1.7 and will be removed in 1.0. Use :meth:`~invoke` instead.\n", + " response = llm(f\"\"\"using this data frame {df} tell me if this company is a\n" + ] } ], "source": [ @@ -3252,7 +3320,7 @@ }, { "cell_type": "code", - "execution_count": 174, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -3279,17 +3347,21 @@ "---\n", "\n", "---\n", - "5. **Profit Margin**: The profit margin can be calculated as Net Income divided by Total Revenue. For 2024, the profit margin is approximately **36%** ($88,136,000,000 / $245,122,000,000), which is quite healthy.\n", + "5. **Profit Margins**: The net income margin can be calculated as (Net Income / Total Revenue). For 2024, this is approximately **36%**, which is a strong indicator of profitability.\n", "---\n", "\n", "---\n", - "Based on these indicators, we can conclude that the company is indeed profitable.\n", + "Based on these metrics, we can conclude that the company is indeed profitable.\n", "---\n", "\n", "---\n", - "### Profitability Rating: 9/10\n", + "### Profitability Rating\n", + "---\n", + "**Rating: 9/10 for profitability. This is due to strong net income, positive EBITDA, high EPS, and a significant profit margin, indicating that the company is effectively generating profit from its operations.** \n", "---\n", - "This is due to the strong net income, high EBITDA, positive EPS, and a healthy profit margin, indicating that the company is effectively generating profit from its operations. The only reason it is not rated a perfect 10 is that there may be fluctuations in future performance or external factors that could impact profitability.\n" + "\n", + "---\n", + "The only reason it is not rated a perfect 10 is that there may be fluctuations in future performance or external factors that could impact profitability, but based on the current data, the company is performing very well.\n" ] } ], @@ -3310,7 +3382,7 @@ }, { "cell_type": "code", - "execution_count": 314, + "execution_count": 36, "metadata": {}, "outputs": [], "source": [ @@ -3327,7 +3399,7 @@ }, { "cell_type": "code", - "execution_count": 315, + "execution_count": 37, "metadata": {}, "outputs": [], "source": [ @@ -3349,7 +3421,7 @@ }, { "cell_type": "code", - "execution_count": 316, + "execution_count": 49, "metadata": {}, "outputs": [], "source": [ @@ -3358,25 +3430,27 @@ " ticker = yf.Ticker(state['ticker'])\n", " df = ticker.analyst_price_targets\n", " answer = df.values\n", - "\n", - " return {\"final_answer\": df}\n", + " response = llm(f\"\"\"This is the table of contents: {df}, Summarise the table of contents, make sure we do not get rid of any details that might help with answering questions on this text.\"\"\")\n", + " return {\"final_answer\": df, \"history\": state['history'] + response.content}\n", "\n", "def Sustainability(state):\n", " print(\"---Sustainability---\")\n", " ticker = yf.Ticker(state['ticker'])\n", " df = ticker.sustainability\n", + " response = llm(f\"\"\"This is the table of contents: {df}, Summarise the table of contents, make sure we do not get rid of any details that might help with answering questions on this text.\"\"\")\n", "\n", " answer = df.values\n", "\n", - " return {\"final_answer\": df}\n", + " return {\"final_answer\": df, \"history\": state['history'] + response.content}\n", "\n", "def Financials(state):\n", " print(\"---Financials---\")\n", " ticker = yf.Ticker(state['ticker'])\n", " df = ticker.financials\n", " answer = df.values\n", + " response = llm(f\"\"\"This is the table of contents: {df}, Summarise the table of contents, make sure we do not get rid of any details that might help with answering questions on this text.\"\"\")\n", "\n", - " return {\"final_answer\": df}\n", + " return {\"final_answer\": df, \"history\": state['history'] + response.content}\n", "\n", "def Cashflow(state):\n", " print(\"---Cashflow---\")\n", @@ -3384,8 +3458,9 @@ " df = ticker.cash_flow\n", "\n", " answer = df.values\n", + " response = llm(f\"\"\"This is the table of contents: {df}, Summarise the table of contents, make sure we do not get rid of any details that might help with answering questions on this text.\"\"\")\n", "\n", - " return {\"final_answer\": df}\n", + " return {\"final_answer\": df, \"history\": state['history'] + response.content}\n", "\n", "def Finalise(state):\n", " print(\"---Final---\")\n", @@ -3393,12 +3468,13 @@ " response = llm(f\"\"\"using the current context {state['final_answer']} try to \n", " answer the question {state['question']}, do not lie.\"\"\")\n", " print(state['history'])\n", - " return {\"final_answer\": response}" + "\n", + " return {\"final_answer\": response, \"history\": state['history'] + response.content}" ] }, { "cell_type": "code", - "execution_count": 317, + "execution_count": 50, "metadata": {}, "outputs": [], "source": [ @@ -3415,7 +3491,7 @@ }, { "cell_type": "code", - "execution_count": 318, + "execution_count": 51, "metadata": {}, "outputs": [], "source": [ @@ -3425,7 +3501,7 @@ }, { "cell_type": "code", - "execution_count": 319, + "execution_count": 52, "metadata": {}, "outputs": [ { @@ -3475,7 +3551,7 @@ }, { "cell_type": "code", - "execution_count": 320, + "execution_count": 53, "metadata": {}, "outputs": [ { @@ -3488,192 +3564,20 @@ "Stock_Price_Value_Node\n", "---Analyst Valuation---\n", "--- Assistant Node ---\n", - "Cashflow_Node\n", - "Deciding\n", - "Cashflow_Node\n", - "---Cashflow---\n", - "--- Assistant Node ---\n", "Finalise_Node\n", "Deciding\n", "Finalise_Node\n", "---Final---\n", - " 2024-06-30 2023-06-30 \\\n", - "Free Cash Flow 74071000000.0 59475000000.0 \n", - "Repurchase Of Capital Stock -17254000000.0 -22245000000.0 \n", - "Repayment Of Debt -29070000000.0 -2750000000.0 \n", - "Issuance Of Debt 29645000000.0 0.0 \n", - "Issuance Of Capital Stock 2002000000.0 1866000000.0 \n", - "Capital Expenditure -44477000000.0 -28107000000.0 \n", - "End Cash Position 18315000000.0 34704000000.0 \n", - "Beginning Cash Position 34704000000.0 13931000000.0 \n", - "Effect Of Exchange Rate Changes -210000000.0 -194000000.0 \n", - "Changes In Cash -16179000000.0 20967000000.0 \n", - "Financing Cash Flow -37757000000.0 -43935000000.0 \n", - "Cash Flow From Continuing Financing Activities -37757000000.0 -43935000000.0 \n", - "Net Other Financing Charges -1309000000.0 -1006000000.0 \n", - "Cash Dividends Paid -21771000000.0 -19800000000.0 \n", - "Common Stock Dividend Paid -21771000000.0 -19800000000.0 \n", - "Net Common Stock Issuance -15252000000.0 -20379000000.0 \n", - "Common Stock Payments -17254000000.0 -22245000000.0 \n", - "Common Stock Issuance 2002000000.0 1866000000.0 \n", - "Net Issuance Payments Of Debt 575000000.0 -2750000000.0 \n", - "Net Short Term Debt Issuance 5250000000.0 0.0 \n", - "Short Term Debt Issuance 5250000000.0 0.0 \n", - "Net Long Term Debt Issuance -4675000000.0 -2750000000.0 \n", - "Long Term Debt Payments -29070000000.0 -2750000000.0 \n", - "Long Term Debt Issuance 24395000000.0 0.0 \n", - "Investing Cash Flow -96970000000.0 -22680000000.0 \n", - "Cash Flow From Continuing Investing Activities -96970000000.0 -22680000000.0 \n", - "Net Other Investing Changes -1298000000.0 -3116000000.0 \n", - "Net Investment Purchase And Sale 17937000000.0 10213000000.0 \n", - "Sale Of Investment 35669000000.0 47864000000.0 \n", - "Purchase Of Investment -17732000000.0 -37651000000.0 \n", - "Net Business Purchase And Sale -69132000000.0 -1670000000.0 \n", - "Purchase Of Business -69132000000.0 -1670000000.0 \n", - "Net PPE Purchase And Sale -44477000000.0 -28107000000.0 \n", - "Purchase Of PPE -44477000000.0 -28107000000.0 \n", - "Operating Cash Flow 118548000000.0 87582000000.0 \n", - "Cash Flow From Continuing Operating Activities 118548000000.0 87582000000.0 \n", - "Change In Working Capital 1824000000.0 -2388000000.0 \n", - "Change In Other Working Capital 5348000000.0 5535000000.0 \n", - "Change In Other Current Liabilities 5616000000.0 2825000000.0 \n", - "Change In Other Current Assets -8465000000.0 -4824000000.0 \n", - "Change In Payables And Accrued Expense 5232000000.0 -3079000000.0 \n", - "Change In Payable 5232000000.0 -3079000000.0 \n", - "Change In Account Payable 3545000000.0 -2721000000.0 \n", - "Change In Tax Payable 1687000000.0 -358000000.0 \n", - "Change In Income Tax Payable 1687000000.0 -358000000.0 \n", - "Change In Inventory 1284000000.0 1242000000.0 \n", - "Change In Receivables -7191000000.0 -4087000000.0 \n", - "Changes In Account Receivables -7191000000.0 -4087000000.0 \n", - "Stock Based Compensation 10734000000.0 9611000000.0 \n", - "Deferred Tax -4738000000.0 -6059000000.0 \n", - "Deferred Income Tax -4738000000.0 -6059000000.0 \n", - "Depreciation Amortization Depletion 22287000000.0 13861000000.0 \n", - "Depreciation And Amortization 22287000000.0 13861000000.0 \n", - "Depreciation 22287000000.0 13861000000.0 \n", - "Operating Gains Losses 305000000.0 196000000.0 \n", - "Gain Loss On Investment Securities NaN NaN \n", - "Net Income From Continuing Operations 88136000000.0 72361000000.0 \n", + "{'current': 418.95, 'low': 420.0, 'high': 650.0, 'mean': 508.4636, 'median': 500.0}\n", + "started Stock_Price_Value_NodeThe table of contents provides a summary of a dataset with the following key statistics:\n", "\n", - " 2022-06-30 2021-06-30 \\\n", - "Free Cash Flow 65149000000.0 56118000000.0 \n", - "Repurchase Of Capital Stock -32696000000.0 -27385000000.0 \n", - "Repayment Of Debt -9023000000.0 -3750000000.0 \n", - "Issuance Of Debt 0.0 NaN \n", - "Issuance Of Capital Stock 1841000000.0 1693000000.0 \n", - "Capital Expenditure -23886000000.0 -20622000000.0 \n", - "End Cash Position 13931000000.0 14224000000.0 \n", - "Beginning Cash Position 14224000000.0 13576000000.0 \n", - "Effect Of Exchange Rate Changes -141000000.0 -29000000.0 \n", - "Changes In Cash -152000000.0 677000000.0 \n", - "Financing Cash Flow -58876000000.0 -48486000000.0 \n", - "Cash Flow From Continuing Financing Activities -58876000000.0 -48486000000.0 \n", - "Net Other Financing Charges -863000000.0 -2523000000.0 \n", - "Cash Dividends Paid -18135000000.0 -16521000000.0 \n", - "Common Stock Dividend Paid -18135000000.0 -16521000000.0 \n", - "Net Common Stock Issuance -30855000000.0 -25692000000.0 \n", - "Common Stock Payments -32696000000.0 -27385000000.0 \n", - "Common Stock Issuance 1841000000.0 1693000000.0 \n", - "Net Issuance Payments Of Debt -9023000000.0 -3750000000.0 \n", - "Net Short Term Debt Issuance 0.0 NaN \n", - "Short Term Debt Issuance 0.0 NaN \n", - "Net Long Term Debt Issuance -9023000000.0 -3750000000.0 \n", - "Long Term Debt Payments -9023000000.0 -3750000000.0 \n", - "Long Term Debt Issuance 0.0 NaN \n", - "Investing Cash Flow -30311000000.0 -27577000000.0 \n", - "Cash Flow From Continuing Investing Activities -30311000000.0 -27577000000.0 \n", - "Net Other Investing Changes -2825000000.0 -922000000.0 \n", - "Net Investment Purchase And Sale 18438000000.0 2876000000.0 \n", - "Sale Of Investment 44894000000.0 65800000000.0 \n", - "Purchase Of Investment -26456000000.0 -62924000000.0 \n", - "Net Business Purchase And Sale -22038000000.0 -8909000000.0 \n", - "Purchase Of Business -22038000000.0 -8909000000.0 \n", - "Net PPE Purchase And Sale -23886000000.0 -20622000000.0 \n", - "Purchase Of PPE -23886000000.0 -20622000000.0 \n", - "Operating Cash Flow 89035000000.0 76740000000.0 \n", - "Cash Flow From Continuing Operating Activities 89035000000.0 76740000000.0 \n", - "Change In Working Capital 446000000.0 -936000000.0 \n", - "Change In Other Working Capital 5805000000.0 2324000000.0 \n", - "Change In Other Current Liabilities 3169000000.0 5551000000.0 \n", - "Change In Other Current Assets -3514000000.0 -4391000000.0 \n", - "Change In Payables And Accrued Expense 2943000000.0 2798000000.0 \n", - "Change In Payable 2943000000.0 2798000000.0 \n", - "Change In Account Payable 2943000000.0 2798000000.0 \n", - "Change In Tax Payable NaN NaN \n", - "Change In Income Tax Payable NaN NaN \n", - "Change In Inventory -1123000000.0 -737000000.0 \n", - "Change In Receivables -6834000000.0 -6481000000.0 \n", - "Changes In Account Receivables -6834000000.0 -6481000000.0 \n", - "Stock Based Compensation 7502000000.0 6118000000.0 \n", - "Deferred Tax -5702000000.0 -150000000.0 \n", - "Deferred Income Tax -5702000000.0 -150000000.0 \n", - "Depreciation Amortization Depletion 14460000000.0 11686000000.0 \n", - "Depreciation And Amortization 14460000000.0 11686000000.0 \n", - "Depreciation 14460000000.0 11686000000.0 \n", - "Operating Gains Losses -409000000.0 -1249000000.0 \n", - "Gain Loss On Investment Securities NaN NaN \n", - "Net Income From Continuing Operations 72738000000.0 61271000000.0 \n", + "- **Current Value**: 418.95\n", + "- **Lowest Value**: 420.0\n", + "- **Highest Value**: 650.0\n", + "- **Mean (Average)**: 508.4636\n", + "- **Median (Middle Value)**: 500.0\n", "\n", - " 2020-06-30 \n", - "Free Cash Flow NaN \n", - "Repurchase Of Capital Stock NaN \n", - "Repayment Of Debt NaN \n", - "Issuance Of Debt 0.0 \n", - "Issuance Of Capital Stock NaN \n", - "Capital Expenditure NaN \n", - "End Cash Position NaN \n", - "Beginning Cash Position NaN \n", - "Effect Of Exchange Rate Changes NaN \n", - "Changes In Cash NaN \n", - "Financing Cash Flow NaN \n", - "Cash Flow From Continuing Financing Activities NaN \n", - "Net Other Financing Charges NaN \n", - "Cash Dividends Paid NaN \n", - "Common Stock Dividend Paid NaN \n", - "Net Common Stock Issuance NaN \n", - "Common Stock Payments NaN \n", - "Common Stock Issuance NaN \n", - "Net Issuance Payments Of Debt NaN \n", - "Net Short Term Debt Issuance 0.0 \n", - "Short Term Debt Issuance NaN \n", - "Net Long Term Debt Issuance NaN \n", - "Long Term Debt Payments NaN \n", - "Long Term Debt Issuance 0.0 \n", - "Investing Cash Flow NaN \n", - "Cash Flow From Continuing Investing Activities NaN \n", - "Net Other Investing Changes NaN \n", - "Net Investment Purchase And Sale NaN \n", - "Sale Of Investment NaN \n", - "Purchase Of Investment NaN \n", - "Net Business Purchase And Sale NaN \n", - "Purchase Of Business NaN \n", - "Net PPE Purchase And Sale NaN \n", - "Purchase Of PPE NaN \n", - "Operating Cash Flow NaN \n", - "Cash Flow From Continuing Operating Activities NaN \n", - "Change In Working Capital NaN \n", - "Change In Other Working Capital NaN \n", - "Change In Other Current Liabilities NaN \n", - "Change In Other Current Assets NaN \n", - "Change In Payables And Accrued Expense NaN \n", - "Change In Payable NaN \n", - "Change In Account Payable NaN \n", - "Change In Tax Payable NaN \n", - "Change In Income Tax Payable NaN \n", - "Change In Inventory NaN \n", - "Change In Receivables NaN \n", - "Changes In Account Receivables NaN \n", - "Stock Based Compensation NaN \n", - "Deferred Tax NaN \n", - "Deferred Income Tax NaN \n", - "Depreciation Amortization Depletion NaN \n", - "Depreciation And Amortization NaN \n", - "Depreciation NaN \n", - "Operating Gains Losses NaN \n", - "Gain Loss On Investment Securities -219000000.0 \n", - "Net Income From Continuing Operations NaN \n", - "started Stock_Price_Value_Node Cashflow_Node Finalise_Node\n" + "This information indicates that the current value is slightly below the lowest recorded value, while the mean and median suggest that the dataset has a central tendency around 500. The highest value is significantly above both the current and lowest values. Finalise_Node\n" ] } ], @@ -3683,20 +3587,20 @@ }, { "cell_type": "code", - "execution_count": 321, + "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'response': 'Finalise_Node',\n", - " 'final_answer': AIMessage(content=\"To answer your question about the price difference between the current price of Microsoft and the average of the brokers' price target, I would need the current stock price of Microsoft and the average price target from brokers. Unfortunately, I do not have access to real-time data or the latest stock prices or broker price targets.\\n\\nYou can find the current stock price of Microsoft (MSFT) on financial news websites, stock market apps, or brokerage platforms. Similarly, the average broker price target can typically be found on financial news websites or investment research platforms.\\n\\nOnce you have both figures, you can calculate the price difference by subtracting the average broker price target from the current stock price:\\n\\n**Price Difference = Current Price - Average Broker Price Target**\\n\\nIf you provide me with those numbers, I can help you with the calculation!\", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 163, 'prompt_tokens': 2935, 'total_tokens': 3098, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_f2cd28694a', 'finish_reason': 'stop', 'logprobs': None}, id='run-55cd8fde-5f36-40ef-9390-3d4c7e836146-0', usage_metadata={'input_tokens': 2935, 'output_tokens': 163, 'total_tokens': 3098, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}),\n", + " 'final_answer': AIMessage(content=\"To find the price difference between the current price of Microsoft and the average of the brokers' price target, we can use the values provided in the context.\\n\\n- Current price: 418.95\\n- Mean (average of brokers' price target): 508.4636\\n\\nNow, we calculate the price difference:\\n\\nPrice difference = Mean - Current price \\nPrice difference = 508.4636 - 418.95 \\nPrice difference = 89.5136\\n\\nThe price difference between the current price of Microsoft and the average of the brokers' price target is approximately 89.51.\", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 121, 'prompt_tokens': 85, 'total_tokens': 206, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_bd83329f63', 'finish_reason': 'stop', 'logprobs': None}, id='run-f1d38ed7-7a85-4a7c-a3e0-96bef46bfeaa-0', usage_metadata={'input_tokens': 85, 'output_tokens': 121, 'total_tokens': 206, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}),\n", " 'question': 'what is the price difference between the current price of microsoft and the average of the brokers price target of microsoft',\n", " 'ticker': 'MSFT',\n", - " 'history': 'started Stock_Price_Value_Node Cashflow_Node Finalise_Node'}" + " 'history': \"started Stock_Price_Value_NodeThe table of contents provides a summary of a dataset with the following key statistics:\\n\\n- **Current Value**: 418.95\\n- **Lowest Value**: 420.0\\n- **Highest Value**: 650.0\\n- **Mean (Average)**: 508.4636\\n- **Median (Middle Value)**: 500.0\\n\\nThis information indicates that the current value is slightly below the lowest recorded value, while the mean and median suggest that the dataset has a central tendency around 500. The highest value is significantly above both the current and lowest values. Finalise_NodeTo find the price difference between the current price of Microsoft and the average of the brokers' price target, we can use the values provided in the context.\\n\\n- Current price: 418.95\\n- Mean (average of brokers' price target): 508.4636\\n\\nNow, we calculate the price difference:\\n\\nPrice difference = Mean - Current price \\nPrice difference = 508.4636 - 418.95 \\nPrice difference = 89.5136\\n\\nThe price difference between the current price of Microsoft and the average of the brokers' price target is approximately 89.51.\"}" ] }, - "execution_count": 321, + "execution_count": 54, "metadata": {}, "output_type": "execute_result" } @@ -3704,6 +3608,13 @@ "source": [ "result" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": {