diff --git a/content/post/2026/using-pandas-for-getting-data-and-analise-them/cover.png b/content/post/2026/using-pandas-for-getting-data-and-analise-them/cover.png new file mode 100644 index 00000000..43f40d08 Binary files /dev/null and b/content/post/2026/using-pandas-for-getting-data-and-analise-them/cover.png differ diff --git a/content/post/2026/using-pandas-for-getting-data-and-analise-them/index.ipynb b/content/post/2026/using-pandas-for-getting-data-and-analise-them/index.ipynb new file mode 100644 index 00000000..7e64eedf --- /dev/null +++ b/content/post/2026/using-pandas-for-getting-data-and-analise-them/index.ipynb @@ -0,0 +1,307 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ec2a032c", + "metadata": {}, + "source": [ + "---\n", + "date: '2026-03-12T20:00:07+08:00'\n", + "title: 'Using Pandas For Getting Data And Analise Them'\n", + "feature_link: \"https://www.midjourney.com/home/\"\n", + "feature_text: \"by IA Midjourney\"\n", + "description: 'Using Pandas For Getting Data And Analise Them'\n", + "isStarred: false\n", + "tags:\n", + "- pandas\n", + "categories:\n", + "- dev\n", + "images:\n", + "keywords:\n", + "series:\n", + "- Data and Data Tools\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "762356ba-8dd6-4e7d-98bc-413980ba2ba4", + "metadata": {}, + "source": [ + "## The idea" + ] + }, + { + "cell_type": "markdown", + "id": "51dbea95-75af-4def-a8e8-eb95ed8258eb", + "metadata": {}, + "source": [ + "I want to test some of the pandas functionality so I try the import from HTML table for make some data analisys.\n", + "So I choose a web page with data in a table (or two in this case)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "d8948cc6-0a35-4d05-a44c-401ee8ab4523", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib\n", + "import pandas as pd\n" + ] + }, + { + "cell_type": "markdown", + "id": "26008d72-af7f-4684-8bad-b829c2d774d3", + "metadata": {}, + "source": [ + "Here we have the basic import for the needed package for the project." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f4451b98-aff7-4dad-9788-f7cbff92ce21", + "metadata": {}, + "outputs": [], + "source": [ + "url = \"https://www.mangacodex.com/oricon_yearly.php?title_series=&year_series=All&title_volumes=&year_volumes=All\"\n", + "\n", + "pd.set_option(\"display.precision\", 2)" + ] + }, + { + "cell_type": "markdown", + "id": "53634b74-7b71-45d7-a12d-ca4c96cfac05", + "metadata": {}, + "source": [ + "Some basic config (the log, the url,...) for my little script. I allwayse put at the top of the file for easy edit of them, if needed." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b6fb3973-dff2-40c9-b3fb-467ff859c9e9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading data from the page...\n", + "Found 2 tables on the page.\n", + "\n", + "\n" + ] + } + ], + "source": [ + "print(\"Downloading data from the page...\")\n", + "tables = pd.read_html(url, thousands='.', decimal =',')\n", + "print(f\"Found {len(tables)} tables on the page.\")\n", + "\n", + "df1 = pd.DataFrame(tables[0])\n", + "print(type(df1))\n", + "df2 = pd.DataFrame(tables[1])\n", + "print(type(df2))" + ] + }, + { + "cell_type": "markdown", + "id": "7e03d8bb-e520-4a1d-8c24-ccd0863faa0b", + "metadata": {}, + "source": [ + "Starting with the scrape of the page with Pandas. In this case it returnes 2 table in pandas.DataFrame" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "5206887b-37b5-4d23-b7ad-805637b07a3a", + "metadata": {}, + "outputs": [], + "source": [ + "if len(tables) >= 2:\n", + " table_series = tables[0]\n", + " table_volumes = tables[1]\n", + "\n", + "else:\n", + " print(\"Error: The page does not contain enough tables.\")\n", + " raise Error" + ] + }, + { + "cell_type": "markdown", + "id": "54ae5555-b0cb-42f7-9b80-de907e9be379", + "metadata": {}, + "source": [ + "And now we have the two table as pandas Dataframe. Are there some empty data?" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "fcfe611f-a87b-49ff-bc6e-c7daa52bb9a0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-\n", + "Missing value stats for Series:\n", + "Ranking 0\n", + "Title 0\n", + "Sales 0\n", + "Year 0\n", + "dtype: int64\n", + "\n", + "-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-\n", + "Missing value stats for Volumes:\n", + "Ranking 0\n", + "Volume 0\n", + "Sales 0\n", + "Year 0\n", + "dtype: int64\n" + ] + } + ], + "source": [ + "print(\"-*-\" * 20)\n", + "print(\"Missing value stats for Series:\")\n", + "print(table_series.isnull().sum())\n", + "print()\n", + "print(\"-*-\" * 20)\n", + "print(\"Missing value stats for Volumes:\")\n", + "print(table_volumes.isnull().sum())" + ] + }, + { + "cell_type": "markdown", + "id": "e94ecf50-2b48-4b7b-91a3-3baea5823308", + "metadata": {}, + "source": [ + "## Start the analysis" + ] + }, + { + "cell_type": "markdown", + "id": "4d49a38b-3a42-4a61-b6d3-8cc65305ab6e", + "metadata": {}, + "source": [ + "So we know the data is consistant so we need to know some generic data about this two dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "433f803c-dd0b-434e-9425-1d46b6526a4b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-*-\n", + " Ranking Title Sales Year\n", + "0 1 One Piece #50 1678208 2008\n", + "1 2 One Piece #51 1646978 2008\n", + "2 3 Nana #19 1645128 2008\n", + "3 4 One Piece #49 1544000 2008\n", + "4 5 Nana #20 1431335 2008\n", + "\n", + "RangeIndex: 3413 entries, 0 to 3412\n", + "Columns: 4 entries, Ranking to Year\n", + "dtypes: int64(3), str(1)\n", + "memory usage: 106.8 KB\n", + "None\n", + "\n", + "-*-\n", + " Ranking Volume Sales Year\n", + "0 1 One Piece 5956540 2008\n", + "1 2 Naruto 4261054 2008\n", + "2 3 20th Century Boys 3710054 2008\n", + "3 4 Hitman Reborn! 3371618 2008\n", + "4 5 Bleach 3161825 2008\n", + "\n", + "RangeIndex: 860 entries, 0 to 859\n", + "Columns: 4 entries, Ranking to Year\n", + "dtypes: int64(3), str(1)\n", + "memory usage: 27.0 KB\n", + "None\n" + ] + } + ], + "source": [ + "print(\"-*-\")\n", + "print(table_series.head())\n", + "print(table_series.info(verbose=False))\n", + "print()\n", + "print(\"-*-\")\n", + "print(table_volumes.head())\n", + "print(table_volumes.info(verbose=False))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "aedc41b6-a7c4-442e-b56c-fe2fe9a85f51", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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41yZNC7KoHNX2t27d1OZMmUoISHBVgXGQiYtLS3i8qw6gOuA64DxgPsCcwTmShlrBssFFhw1a9akxMTE+LB08AetVauWtPfni+Zm0WGC64DrgPGA+wJzBOZKu9eMSC0cJggkBQAAAIASIDoAAAAAoARtREdqaioNGzZMPLsZXAdcB4wH3BeYIzBXxuqaoTyQFAAAAADuRBtLBwAAAABiG4gOAAAAACgBogMAAAAASoDoAAAAAIASIDoAAAAAoARtRMcHH3xA9erVo+LFi1OnTp1o4cKFpAvPP/+8KBlvfTRr1sz799OnT9PgwYOpUqVKVLp0abr66qtp3759Pu+xY8cO6t+/P5UsWZKqVq1Kjz/+OOXk5FAsM2vWLBowYIAoucvnPH78eJ+/c+LVc889RzVq1KASJUpQr169aOPGjT6vOXz4MA0cOFBU2itfvjzdcccddOLECZ/XrFixgrp27SrGDpcDfv311ymersOtt956xvi45JJLtLsOw4cPp3PPPVe0UOAxfMUVV9D69et9XmPXvTBjxgxq166dSCNs1KgRjR49muLpOnTv3v2MMXHvvfdqdR1GjhxJrVu39lbS7Ny5M02cONFVYyGU6xBzY8HQgLFjxxopKSnGF198Yaxevdq46667jPLlyxv79u0zdGDYsGFGixYtjD179ngfBw4c8P793nvvNWrXrm1MnTrVWLx4sXHeeecZ559/vvfvOTk5RsuWLY1evXoZ//zzj/HHH38YlStXNoYOHWrEMvw5n3nmGePnn3/mtG5j3LhxPn9/9dVXjXLlyhnjx483li9fblx22WVG/fr1jVOnTnlfc8kllxht2rQx5s+fb8yePdto1KiRceONN3r/np6eblSrVs0YOHCgsWrVKuPbb781SpQoYXz88cdGvFyHQYMGifO0jo/Dhw/7vEaH69CnTx9j1KhR4vMtW7bM6Nevn1GnTh3jxIkTtt4LW7ZsMUqWLGk8+uijxpo1a4z333/fSEpKMiZNmmTEy3W48MILxTxoHRP8Het0HX799Vfj999/NzZs2GCsX7/eePrpp41ixYqJ6+KWsRDKdYi1saCF6OjYsaMxePBg7//n5uYaNWvWNIYPH27oIjp4wQjE0aNHxQD74YcfvL9bu3atWJzmzZsn/p8HUWJiorF3717va0aOHGmULVvWyMzMNOIB/8U2Ly/PqF69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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "table_series[[\"Title\",\"Sales\",\"Year\"]].plot(title=\"Manga Series\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0d88d19-decb-4555-9459-c66060f65e9c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/content/post/2026/using-pandas-for-getting-data-and-analise-them/index.md b/content/post/2026/using-pandas-for-getting-data-and-analise-them/index.md new file mode 100644 index 00000000..120597fa --- /dev/null +++ b/content/post/2026/using-pandas-for-getting-data-and-analise-them/index.md @@ -0,0 +1,168 @@ +--- +date: '2026-03-12T20:00:07+08:00' +title: 'Using Pandas For Getting Data And Analise Them' +feature_link: "https://www.midjourney.com/home/" +feature_text: "by IA Midjourney" +description: 'Using Pandas For Getting Data And Analise Them' +isStarred: false +tags: +- pandas +categories: +- dev +images: +keywords: +series: +- Data and Data Tools +--- + +## The idea + +I want to test some of the pandas functionality so I try the import from HTML table for make some data analisys. +So I choose a web page with data in a table (or two in this case) + + +```python +import matplotlib +import pandas as pd + +``` + +Here we have the basic import for the needed package for the project. + + +```python +url = "https://www.mangacodex.com/oricon_yearly.php?title_series=&year_series=All&title_volumes=&year_volumes=All" + +pd.set_option("display.precision", 2) +``` + +Some basic config (the log, the url,...) for my little script. I allwayse put at the top of the file for easy edit of them, if needed. + + +```python +print("Downloading data from the page...") +tables = pd.read_html(url, thousands='.', decimal =',') +print(f"Found {len(tables)} tables on the page.") + +df1 = pd.DataFrame(tables[0]) +print(type(df1)) +df2 = pd.DataFrame(tables[1]) +print(type(df2)) +``` + + Downloading data from the page... + Found 2 tables on the page. + + + + +Starting with the scrape of the page with Pandas. In this case it returnes 2 table in pandas.DataFrame + + +```python +if len(tables) >= 2: + table_series = tables[0] + table_volumes = tables[1] + +else: + print("Error: The page does not contain enough tables.") + raise Error +``` + +And now we have the two table as pandas Dataframe. Are there some empty data? + + +```python +print("-*-" * 20) +print("Missing value stats for Series:") +print(table_series.isnull().sum()) +print() +print("-*-" * 20) +print("Missing value stats for Volumes:") +print(table_volumes.isnull().sum()) +``` + + -*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*- + Missing value stats for Series: + Ranking 0 + Title 0 + Sales 0 + Year 0 + dtype: int64 + + -*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*- + Missing value stats for Volumes: + Ranking 0 + Volume 0 + Sales 0 + Year 0 + dtype: int64 + + +## Start the analysis + +So we know the data is consistant so we need to know some generic data about this two dataset. + + +```python +print("-*-") +print(table_series.head()) +print(table_series.info(verbose=False)) +print() +print("-*-") +print(table_volumes.head()) +print(table_volumes.info(verbose=False)) + +``` + + -*- + Ranking Title Sales Year + 0 1 One Piece #50 1678208 2008 + 1 2 One Piece #51 1646978 2008 + 2 3 Nana #19 1645128 2008 + 3 4 One Piece #49 1544000 2008 + 4 5 Nana #20 1431335 2008 + + RangeIndex: 3413 entries, 0 to 3412 + Columns: 4 entries, Ranking to Year + dtypes: int64(3), str(1) + memory usage: 106.8 KB + None + + -*- + Ranking Volume Sales Year + 0 1 One Piece 5956540 2008 + 1 2 Naruto 4261054 2008 + 2 3 20th Century Boys 3710054 2008 + 3 4 Hitman Reborn! 3371618 2008 + 4 5 Bleach 3161825 2008 + + RangeIndex: 860 entries, 0 to 859 + Columns: 4 entries, Ranking to Year + dtypes: int64(3), str(1) + memory usage: 27.0 KB + None + + + +```python +table_series[["Title","Sales","Year"]].plot(title="Manga Series") +``` + + + + + + + + + + +![png](index_files/output_15_1.png) + + + + +```python + +``` diff --git a/content/post/2026/using-pandas-for-getting-data-and-analise-them/index_files/output_15_1.png b/content/post/2026/using-pandas-for-getting-data-and-analise-them/index_files/output_15_1.png new file mode 100644 index 00000000..5a7c3e15 Binary files /dev/null and b/content/post/2026/using-pandas-for-getting-data-and-analise-them/index_files/output_15_1.png differ diff --git a/notescript/using-pandas-for-getting-data-and-analise-them.sh b/notescript/using-pandas-for-getting-data-and-analise-them.sh new file mode 100755 index 00000000..29ee2afa --- /dev/null +++ b/notescript/using-pandas-for-getting-data-and-analise-them.sh @@ -0,0 +1,2 @@ + #! /bin/bash + uv run hugo_nbconvert content/post/2026/using-pandas-for-getting-data-and-analise-them/index.ipynb diff --git a/pyproject.toml b/pyproject.toml index 98c06f7e..e6a22dbf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,6 +17,7 @@ dependencies = [ "typer", "python-frontmatter", "bleach", + "matplotlib>=3.10.8", ] [project.entry-points.dotenv] diff --git a/resources/_gen/images/img/logo_hu_17c8eb7d9576a0e6.webp b/resources/_gen/images/img/logo_hu_17c8eb7d9576a0e6.webp new file mode 100644 index 00000000..2b617e32 Binary files /dev/null and b/resources/_gen/images/img/logo_hu_17c8eb7d9576a0e6.webp differ diff --git a/resources/_gen/images/img/logo_hu_52e6fa03a9596cbe.webp b/resources/_gen/images/img/logo_hu_52e6fa03a9596cbe.webp new file mode 100644 index 00000000..d2e6fe81 Binary files /dev/null and b/resources/_gen/images/img/logo_hu_52e6fa03a9596cbe.webp differ diff --git a/resources/_gen/images/img/logo_hu_c91ad6d51330a9c4.webp b/resources/_gen/images/img/logo_hu_c91ad6d51330a9c4.webp new file mode 100644 index 00000000..6c4f9c47 Binary files /dev/null and b/resources/_gen/images/img/logo_hu_c91ad6d51330a9c4.webp differ diff --git a/uv.lock b/uv.lock index ae9832b8..0b916055 100644 --- a/uv.lock +++ b/uv.lock @@ -255,6 +255,37 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, ] +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + [[package]] name = "debugpy" version = "1.8.20" @@ -334,6 +365,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9c/0f/5d0c71a1aefeb08efff26272149e07ab922b64f46c63363756224bd6872e/filelock-3.24.3-py3-none-any.whl", hash = "sha256:426e9a4660391f7f8a810d71b0555bce9008b0a1cc342ab1f6947d37639e002d", size = 24331, upload-time = "2026-02-19T00:48:18.465Z" }, ] +[[package]] +name = "fonttools" +version = "4.62.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/96/686339e0fda8142b7ebed39af53f4a5694602a729662f42a6209e3be91d0/fonttools-4.62.0.tar.gz", hash = "sha256:0dc477c12b8076b4eb9af2e440421b0433ffa9e1dcb39e0640a6c94665ed1098", size = 3579521, upload-time = "2026-03-09T16:50:06.217Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/9d/7ad1ffc080619f67d0b1e0fa6a0578f0be077404f13fd8e448d1616a94a3/fonttools-4.62.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:22bde4dc12a9e09b5ced77f3b5053d96cf10c4976c6ac0dee293418ef289d221", size = 2870004, upload-time = "2026-03-09T16:48:50.837Z" }, + { url = "https://files.pythonhosted.org/packages/4d/8b/ba59069a490f61b737e064c3129453dbd28ee38e81d56af0d04d7e6b4de4/fonttools-4.62.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7199c73b326bad892f1cb53ffdd002128bfd58a89b8f662204fbf1daf8d62e85", size = 2414662, upload-time = "2026-03-09T16:48:53.295Z" }, + { url = "https://files.pythonhosted.org/packages/8c/8c/c52a4310de58deeac7e9ea800892aec09b00bb3eb0c53265b31ec02be115/fonttools-4.62.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d732938633681d6e2324e601b79e93f7f72395ec8681f9cdae5a8c08bc167e72", size = 5032975, upload-time = "2026-03-09T16:48:55.718Z" }, + { url = "https://files.pythonhosted.org/packages/0b/a1/d16318232964d786907b9b3613b8409f74cf0be2da400854509d3a864e43/fonttools-4.62.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:31a804c16d76038cc4e3826e07678efb0a02dc4f15396ea8e07088adbfb2578e", size = 4988544, upload-time = "2026-03-09T16:48:57.715Z" }, + { url = "https://files.pythonhosted.org/packages/b2/8d/7e745ca3e65852adc5e52a83dc213fe1b07d61cb5b394970fcd4b1199d1e/fonttools-4.62.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:090e74ac86e68c20150e665ef8e7e0c20cb9f8b395302c9419fa2e4d332c3b51", size = 4971296, upload-time = "2026-03-09T16:48:59.678Z" }, + { url = "https://files.pythonhosted.org/packages/e6/d4/b717a4874175146029ca1517e85474b1af80c9d9a306fc3161e71485eea5/fonttools-4.62.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8f086120e8be9e99ca1288aa5ce519833f93fe0ec6ebad2380c1dee18781f0b5", size = 5122503, upload-time = "2026-03-09T16:49:02.464Z" }, + { url = "https://files.pythonhosted.org/packages/cb/4b/92cfcba4bf8373f51c49c5ae4b512ead6fbda7d61a0e8c35a369d0db40a0/fonttools-4.62.0-cp312-cp312-win32.whl", hash = "sha256:37a73e5e38fd05c637daede6ffed5f3496096be7df6e4a3198d32af038f87527", size = 2281060, upload-time = "2026-03-09T16:49:04.385Z" }, + { url = "https://files.pythonhosted.org/packages/cd/06/cc96468781a4dc8ae2f14f16f32b32f69bde18cb9384aad27ccc7adf76f7/fonttools-4.62.0-cp312-cp312-win_amd64.whl", hash = "sha256:658ab837c878c4d2a652fcbb319547ea41693890e6434cf619e66f79387af3b8", size = 2331193, upload-time = "2026-03-09T16:49:06.598Z" }, + { url = "https://files.pythonhosted.org/packages/9c/57/c2487c281dde03abb2dec244fd67059b8d118bd30a653cbf69e94084cb23/fonttools-4.62.0-py3-none-any.whl", hash = "sha256:75064f19a10c50c74b336aa5ebe7b1f89fd0fb5255807bfd4b0c6317098f4af3", size = 1152427, upload-time = "2026-03-09T16:50:04.074Z" }, +] + [[package]] name = "fqdn" version = "1.5.1" @@ -352,6 +400,7 @@ dependencies = [ { name = "bleach" }, { name = "feedparser" }, { name = "lxml" }, + { name = "matplotlib" }, { name = "pillow" }, { name = "python-dotenv" }, { name = "python-frontmatter" }, @@ -377,6 +426,7 @@ requires-dist = [ { name = "bleach" }, { name = "feedparser" }, { name = "lxml" }, + { name = "matplotlib", specifier = ">=3.10.8" }, { name = "pillow" }, { name = "python-dotenv" }, { name = "python-frontmatter" }, @@ -861,6 +911,33 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" }, ] +[[package]] +name = "kiwisolver" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, + { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, + { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, + { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, + { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, + { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" }, + { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, + { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" }, +] + [[package]] name = "langchain" version = "1.2.10" @@ -1061,6 +1138,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/2f/5108cb3ee4ba6501748c4908b908e55f42a5b66245b4cfe0c99326e1ef6e/marshmallow-3.26.2-py3-none-any.whl", hash = "sha256:013fa8a3c4c276c24d26d84ce934dc964e2aa794345a0f8c7e5a7191482c8a73", size = 50964, upload-time = "2025-12-22T06:53:51.801Z" }, ] +[[package]] +name = "matplotlib" +version = "3.10.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/67/f997cdcbb514012eb0d10cd2b4b332667997fb5ebe26b8d41d04962fa0e6/matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a", size = 8260453, upload-time = "2025-12-10T22:55:30.709Z" }, + { url = "https://files.pythonhosted.org/packages/7e/65/07d5f5c7f7c994f12c768708bd2e17a4f01a2b0f44a1c9eccad872433e2e/matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58", size = 8148321, upload-time = "2025-12-10T22:55:33.265Z" }, + { url = "https://files.pythonhosted.org/packages/3e/f3/c5195b1ae57ef85339fd7285dfb603b22c8b4e79114bae5f4f0fcf688677/matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04", size = 8716944, upload-time = "2025-12-10T22:55:34.922Z" }, + { url = "https://files.pythonhosted.org/packages/00/f9/7638f5cc82ec8a7aa005de48622eecc3ed7c9854b96ba15bd76b7fd27574/matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f", size = 9550099, upload-time = "2025-12-10T22:55:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/78cd5920d35b29fd2a0fe894de8adf672ff52939d2e9b43cb83cd5ce1bc7/matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466", size = 9613040, upload-time = "2025-12-10T22:55:38.715Z" }, + { url = "https://files.pythonhosted.org/packages/30/4e/c10f171b6e2f44d9e3a2b96efa38b1677439d79c99357600a62cc1e9594e/matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf", size = 8142717, upload-time = "2025-12-10T22:55:41.103Z" }, + { url = "https://files.pythonhosted.org/packages/f1/76/934db220026b5fef85f45d51a738b91dea7d70207581063cd9bd8fafcf74/matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b", size = 8012751, upload-time = "2025-12-10T22:55:42.684Z" }, +] + [[package]] name = "matplotlib-inline" version = "0.2.1" @@ -1485,6 +1588,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0"