{ "cells": [ { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting pyarrow\n", " Downloading pyarrow-19.0.1-cp310-cp310-win_amd64.whl (25.3 MB)\n", " ---------------------------------------- 25.3/25.3 MB 2.4 MB/s eta 0:00:00\n", "Installing collected packages: pyarrow\n", "Successfully installed pyarrow-19.0.1\n", "Note: you may need to restart the kernel to use updated packages.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING: You are using pip version 22.0.4; however, version 25.0.1 is available.\n", "You should consider upgrading via the 'c:\\Users\\Romain\\AppData\\Local\\Programs\\Python\\Python310\\python.exe -m pip install --upgrade pip' command.\n" ] } ], "source": [ "%pip install pyarrow" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import csv\n", "import re\n", "import polars as pl" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from __future__ import annotations\n", "import re, csv, pathlib, polars as pl\n", "\n", "ROOT = pathlib.Path(r\"C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\")\n", "DATASETS = [\n", " \"project\",\n", " \"projectDeliverables\",\n", " \"projectPublications\",\n", " \"reportSummaries\",\n", " \"organization\",\n", " \"euroSciVoc\",\n", " \"topics\",\n", " \"webItem\",\n", " \"webLink\",\n", " \"legalBasis\",\n", "]\n", "OUTDIR = ROOT / \"combined\"\n", "OUTDIR.mkdir(exist_ok=True)\n", "\n", "###############################################################################\n", "# 2. Generic cleaner –– parameterised version of the loop you wrote\n", "###############################################################################\n", "_PROJECT_ID_RE = re.compile(r\"^(?:19|20)\\d{2}\")\n", "_GENERIC_NUM_RE = re.compile(r\"\\d{4}\")\n", "\n", "import csv, pathlib, polars as pl, re\n", "\n", "import csv, re, pathlib\n", "import polars as pl # >=0.20\n", "\n", "import csv, pathlib, re\n", "import polars as pl # ≥ 0.20\n", "\n", "\n", "def _clean_one_file(csv_path: pathlib.Path,\n", " number_regex: re.Pattern[str], dataset: str) -> pl.DataFrame:\n", " \"\"\"\n", " Clean a CORDIS CSV whose long *objective* field sometimes explodes into\n", " extra columns because of stray quotes / semicolons.\n", "\n", " Strategy\n", " --------\n", " * A well-formed row has 21 semicolon-separated columns.\n", " * If we get more than 21 columns we treat columns 16 … -4 as belonging\n", " to *objective* and stitch them back together with a semicolon.\n", " * The last three columns are contentUpdateDate | rcn | grantDoi.\n", " \"\"\"\n", " # ---------- constants --------------------------------------------------\n", " if dataset==\"project\":\n", " EXPECTED_COLS = 20 # final width\n", " TITLE_COL = 3 # 0-based index of *title*\n", " DATE1_COL = 4 # 0-based index of startDate\n", " DATE2_COL = 5 # 0-based index of endDate\n", " OBJECTIVE_COL = 16 # 0-based index of objective\n", " TRAILING_KEEP = 3 # last three fixed columns\n", " elif dataset==\"organization\":\n", " EXPECTED_COLS = 25 # final width\n", " TITLE_COL = 3 # 0-based index of *title*\n", " DATE1_COL = 4 # 0-based index of startDate\n", " DATE2_COL = 5 # 0-based index of endDate\n", " OBJECTIVE_COL = 4 # 0-based index of objective\n", " TRAILING_KEEP = 20 # last three fixed columns\n", " else:\n", " EXPECTED_COLS = 20 # final width\n", " TITLE_COL = 3 # 0-based index of *title*\n", " DATE1_COL = 4 # 0-based index of startDate\n", " DATE2_COL = 5 # 0-based index of endDate\n", " OBJECTIVE_COL = 16 # 0-based index of objective\n", " TRAILING_KEEP = 3 # last three fixed columns\n", "\n", "\n", "\n", " date_rx = re.compile(r\"\\d{4}-\\d{2}-\\d{2}$\")\n", " is_date = lambda s: (s == \"\") or bool(date_rx.match(s))\n", "\n", " tmp_clean = csv_path.with_suffix(\".cleaned.csv\")\n", "\n", " with csv_path.open(encoding=\"utf-8\", newline=\"\") as fin, \\\n", " tmp_clean.open(\"w\", encoding=\"utf-8\", newline=\"\") as fout:\n", "\n", " writer = csv.writer(\n", " fout,\n", " delimiter=\"|\",\n", " quotechar='\"',\n", " quoting=csv.QUOTE_MINIMAL,\n", " lineterminator=\"\\n\",\n", " )\n", "\n", " # ---------- iterate raw lines -------------------------------------\n", " for raw in fin:\n", " #print(raw)\n", " raw = raw.rstrip(\"\\n\")\n", " #print(raw)\n", " cells = raw.split(\";\") # blind split\n", "\n", " # ---- 1️⃣ repair *title* if dates are not where they belong --\n", " if (len(cells) > EXPECTED_COLS) and (not is_date(cells[DATE1_COL]) or not is_date(cells[DATE2_COL])) and dataset==\"project\":\n", " # look for the first position where *two successive* cells\n", " # are both valid dates / nulls\n", " i = DATE1_COL\n", " while i + 1 < len(cells):\n", " if is_date(cells[i]) and is_date(cells[i + 1]):\n", " break\n", " i += 1\n", " else:\n", " # cannot find a valid date pair → give up on this line\n", " continue\n", "\n", " head = cells[:TITLE_COL] # 0 … 2\n", " title = \";\".join(cells[TITLE_COL:i]) # glue spill-over\n", " cells = head + [title] + cells[i:] # rebuild the row\n", " # ---- 2️⃣ repair *objective* overflow ------------------------\n", " if len(cells) > EXPECTED_COLS and (dataset==\"project\" or dataset==\"organization\"):\n", " head = cells[:OBJECTIVE_COL]\n", " tail = cells[-TRAILING_KEEP:]\n", " obj = \";\".join(cells[OBJECTIVE_COL:-TRAILING_KEEP])\n", " cells = head + [obj] + tail\n", " #print(\"here 2\")\n", "\n", " # ---- 3️⃣ pad short rows, skip malformed ---------------------\n", " if len(cells) < EXPECTED_COLS and (dataset==\"project\" or dataset==\"organization\"):\n", " cells.extend([\"\"] * (EXPECTED_COLS - len(cells)))\n", " #print(\"here again\")\n", "\n", " if len(cells) != EXPECTED_COLS and (dataset==\"project\" or dataset==\"organization\"): # still wrong → skip\n", " #print(cells)\n", " continue\n", "\n", " # ---- 4️⃣ cell-level clean-ups -------------------------------\n", " cleaned: list[str] = []\n", " for cell in cells:\n", "\n", " if cell in ('\"\"', \"\"):\n", " cell = \"\"\n", " else:\n", " cell = (cell.replace(\"\\t\", \" \")\n", " .replace('\"\"\"', '\"')\n", " .strip())\n", " if number_regex.fullmatch(cell):\n", " cell = cell.lstrip(\"0\") or \"0\"\n", " cleaned.append(cell.strip('\"'))\n", " cleaned[-1]=cleaned[-1].replace('\"','').replace(',','')\n", " cleaned[0]=cleaned[0].replace('\"','')\n", " writer.writerow(cleaned)\n", "\n", " # ---------- read into Polars (all Utf8) -------------------------------\n", " return pl.read_csv(\n", " tmp_clean,\n", " separator=\"|\",\n", " quote_char='\"',\n", " has_header=True,\n", " infer_schema_length=0,\n", " null_values=[\"\"],\n", " truncate_ragged_lines=True,\n", " )\n", "\n", "\n", "def combine_all_programmes() -> None:\n", " from pathlib import Path\n", " for dataset in DATASETS:\n", " combined: list[pl.DataFrame] = []\n", "\n", " for i,programme_dir in enumerate(ROOT.iterdir()):\n", " if not programme_dir.is_dir():\n", " continue\n", " csv_file = programme_dir / f\"{dataset}.csv\"\n", " if not csv_file.exists():\n", " continue\n", "\n", " regex = _PROJECT_ID_RE if dataset == \"project\" else _GENERIC_NUM_RE\n", " df = _clean_one_file(csv_file, regex, dataset)\n", " print(programme_dir)\n", " # ---------- type coercions matching your original code ----------\n", " if dataset == \"project\":\n", " df = (\n", " df\n", " .with_columns([\n", " pl.col(\"id\"),#.cast(pl.Int64),\n", " pl.col(\"acronym\").cast(pl.Utf8, strict=False).str.strip_chars('\"'),\n", " pl.col(\"status\").cast(pl.Utf8, strict=False).str.strip_chars('\"'),\n", " pl.col(\"title\").cast(pl.Utf8, strict=False).str.strip_chars('\"'),\n", " pl.col(\"legalBasis\").cast(pl.Utf8, strict=False).str.strip_chars('\"'),\n", " pl.col(\"topics\").cast(pl.Utf8, strict=False).str.strip_chars('\"'),\n", " pl.col(\"frameworkProgramme\").cast(pl.Utf8, strict=False).str.strip_chars('\"'),\n", " pl.col(\"masterCall\").cast(pl.Utf8, strict=False).str.strip_chars('\"'),\n", " pl.col(\"subCall\").cast(pl.Utf8, strict=False).str.strip_chars('\"'),\n", " pl.col(\"fundingScheme\").cast(pl.Utf8, strict=False).str.strip_chars('\"'),\n", " pl.col(\"nature\").cast(pl.Utf8, strict=False).str.strip_chars('\"'),\n", " pl.col(\"objective\").cast(pl.Utf8, strict=False).str.strip_chars('\"'),\n", " pl.col(\"grantDoi\").cast(pl.Utf8, strict=False).str.strip_chars('\"'),\n", " pl.col(\"totalCost\").cast(pl.Utf8, strict=False).str.strip_chars('\"').str.replace_all('\"','').str.replace(\",\",\".\").cast(pl.Float64),\n", " pl.col(\"ecMaxContribution\").cast(pl.Utf8, strict=False).str.strip_chars('\"').str.replace_all('\"','').str.replace(\",\",\".\").cast(pl.Float64),\n", " pl.col(\"startDate\").cast(pl.Utf8, strict=False).str.strip_chars('\"').str.strptime(pl.Date, \"%Y-%m-%d\", strict=False),\n", " pl.col(\"endDate\").cast(pl.Utf8, strict=False).str.strip_chars('\"').str.strptime(pl.Date, \"%Y-%m-%d\", strict=False),\n", " pl.col(\"ecSignatureDate\").cast(pl.Utf8, strict=False).str.strip_chars('\"').str.strptime(pl.Date, \"%Y-%m-%d\", strict=False),\n", " pl.col(\"contentUpdateDate\").cast(pl.Utf8, strict=False).str.strip_chars('\"').str.strptime(pl.Datetime, \"%Y-%m-%d %H:%M:%S\", strict=False),\n", " pl.col(\"rcn\").cast(pl.Int64),\n", " ])\n", " .with_columns(\n", " pl.lit(programme_dir.name).alias(\"programmeFolder\") # <-- NEW COLUMN\n", " )\n", " )\n", " elif dataset == \"organization\":\n", " df = df.with_columns([\n", " pl.col(\"contentUpdateDate\").cast(pl.Utf8, strict=False).str.strptime(pl.Datetime, \"%Y-%m-%d %H:%M:%S\", strict=False),\n", " pl.col(\"totalCost\").cast(pl.Utf8, strict=False).str.replace(\",\",\".\").cast(pl.Float64),\n", " ])\n", " elif dataset == \"projectDeliverables\":\n", " df = df.with_columns([\n", " #pl.col(\"projectID\").cast(pl.Int64),\n", " pl.col(\"contentUpdateDate\").cast(pl.Utf8, strict=False)\n", " .str.strptime(pl.Datetime, \"%Y-%m-%d %H:%M:%S\", strict=False),\n", " ])\n", " elif dataset == \"projectPublications\":\n", " if programme_dir==Path(r\"C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2013\"):\n", " rename_map = {\n", " \"RECORD_ID\": \"id\",\n", " \"TITLE\": \"title\",\n", " \"AUTHOR\": \"authors\",\n", " \"DOI\": \"doi\",\n", " \"PROJECT_ID\": \"projectID\",\n", " \"JOURNAL_TITLE\": \"journalTitle\",\n", " \"PAGES\": \"publishedPages\",\n", " \"PUBLICATION_TYPE\": \"isPublishedAs\",\n", " }\n", "\n", " df = df.rename(rename_map)\n", " else:\n", " df = df.with_columns([\n", " pl.col(\"contentUpdateDate\").cast(pl.Utf8, strict=False)\n", " .str.strptime(pl.Datetime, \"%Y-%m-%d %H:%M:%S\", strict=False),\n", " pl.col(\"id\").cast(pl.Utf8, strict=False)\n", " .str.extract(r\"^(\\d+)_\", 1)\n", " #.cast(pl.Int64)\n", " .alias(\"projectID\"),\n", " ])\n", " elif dataset == \"reportSummaries\":\n", " df = df.with_columns(\n", " pl.col(\"contentUpdateDate\").cast(pl.Utf8, strict=False)\n", " .str.strptime(pl.Datetime, \"%Y-%m-%d %H:%M:%S\", strict=False),\n", " )\n", " elif dataset == \"organization\":\n", " df = df.with_columns([\n", " pl.col(\"contentUpdateDate\").cast(pl.Utf8, strict=False)\n", " .str.strptime(pl.Datetime, \"%Y-%m-%d %H:%M:%S\", strict=False),\n", " pl.col(\"totalCost\").cast(pl.Utf8, strict=False)\n", " .str.replace(\",\", \".\")\n", " .cast(pl.Float64),\n", " ])\n", " elif dataset == \"webItem\":\n", " df = df.with_columns(\n", " pl.col(\"uri\").cast(pl.Utf8, strict=False)\n", " .str.extract(r\"/files/\\d+/(\\d+)/\", 1)\n", " .cast(pl.Int64)\n", " .alias(\"projectID\"),\n", " )\n", "\n", " # ---------------------------------------------------------------\n", " combined.append(df)\n", "\n", " # --------------------------------------------------------------------\n", " # Write out per-dataset parquet\n", " # --------------------------------------------------------------------\n", " if combined:\n", " how=\"vertical_relaxed\"\n", " if dataset==\"projectPublications\":\n", " how=\"diagonal\"\n", " result = pl.concat(combined, how=how)\n", " parquet_path = OUTDIR / f\"{dataset}_all.parquet\"\n", " result.write_parquet(parquet_path)\n", " print(f\"✔ {dataset:15s} → {parquet_path}\")" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1984\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1987\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1990\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1994\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1998\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2006\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2013\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2020\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2027\n", "✔ project → C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\combined\\project_all.parquet\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2020\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2027\n", "✔ projectDeliverables → C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\combined\\projectDeliverables_all.parquet\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2013\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2020\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2027\n", "✔ projectPublications → C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\combined\\projectPublications_all.parquet\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2006\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2013\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2020\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2027\n", "✔ reportSummaries → C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\combined\\reportSummaries_all.parquet\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1984\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1987\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1990\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1994\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1998\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2006\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2013\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2020\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2027\n", "✔ organization → C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\combined\\organization_all.parquet\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1984\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1987\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1990\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1994\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1998\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2006\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2013\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2020\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2027\n", "✔ euroSciVoc → C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\combined\\euroSciVoc_all.parquet\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1987\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1990\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1994\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1998\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2006\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2013\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2020\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2027\n", "✔ topics → C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\combined\\topics_all.parquet\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1987\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1990\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1994\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1998\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2006\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2013\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2020\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2027\n", "✔ webItem → C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\combined\\webItem_all.parquet\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1987\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1990\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1994\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1998\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2006\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2013\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2020\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2027\n", "✔ webLink → C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\combined\\webLink_all.parquet\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1984\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1987\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1990\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1994\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H1998\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2006\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2013\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2020\n", "C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\H2027\n", "✔ legalBasis → C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\\combined\\legalBasis_all.parquet\n" ] } ], "source": [ "combine_all_programmes()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Consolidate projects" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pathlib\n", "import polars as pl\n", "\n", "ROOT = pathlib.Path(r\"C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\")\n", "OUTDIR = ROOT / \"combined\"\n", "DATASETS = [\n", " \"project\",\n", " \"projectDeliverables\",\n", " \"projectPublications\",\n", " \"reportSummaries\",\n", " \"organization\",\n", " \"euroSciVoc\",\n", " \"topics\",\n", " \"webItem\",\n", " \"webLink\",\n", " \"legalBasis\",\n", "]\n", "\n", "dfs = {}\n", "for dataset in DATASETS:\n", " path = OUTDIR / f\"{dataset}_all.parquet\"\n", " dfs[dataset] = pl.read_parquet(path)\n", "\n", "projects = dfs[\"project\"]\n", "\n", "projects_deliv = (\n", " dfs[\"projectDeliverables\"]\n", " .group_by(\"projectID\")\n", " .agg([\n", " pl.col(\"deliverableType\").alias(\"list_deliverableType\"),\n", " pl.col(\"url\") .alias(\"list_url\"),\n", " pl.col(\"contentUpdateDate\").alias(\"list_contentUpdateDate\"),\n", " ])\n", ")\n", "\n", "projects_publi = (\n", " dfs[\"projectPublications\"]\n", " .group_by(\"projectID\")\n", " .agg([\n", " pl.col(\"authors\") .alias(\"list_authors\"),\n", " pl.col(\"title\") .alias(\"list_title\"),\n", " pl.col(\"doi\") .alias(\"list_doi\"),\n", " pl.col(\"journalTitle\") .alias(\"list_journalTitle\"),\n", " pl.col(\"isPublishedAs\") .alias(\"list_isPublishedAs\"),\n", " pl.col(\"publishedYear\") .alias(\"list_publishedYear\"),\n", " pl.col(\"contentUpdateDate\").alias(\"list_contentUpdateDate\"),\n", " ])\n", ")\n", "\n", "report = (\n", " dfs[\"reportSummaries\"]\n", " .group_by(\"projectID\")\n", " .agg([\n", " pl.col(\"title\") .alias(\"list_title\"),\n", " pl.col(\"attachment\") .alias(\"list_attachment\"),\n", " pl.col(\"contentUpdateDate\").alias(\"list_contentUpdateDate\"),\n", " ])\n", ")\n", "\n", "org = (\n", " dfs[\"organization\"]\n", " .group_by(\"projectID\")\n", " .agg([\n", " pl.col(\"organisationID\") .alias(\"list_organisationID\"),\n", " pl.col(\"country\") .alias(\"list_country\"),\n", " pl.col(\"name\") .alias(\"list_name\"),\n", " pl.col(\"SME\") .alias(\"list_SME\"),\n", " pl.col(\"city\") .alias(\"list_city\"),\n", " pl.col(\"geolocation\") .alias(\"list_geolocation\"),\n", " pl.col(\"organizationURL\") .alias(\"list_organizationURL\"),\n", " pl.col(\"role\") .alias(\"list_role\"),\n", " pl.col(\"ecContribution\") .alias(\"list_ecContribution\"),\n", " pl.col(\"netEcContribution\").alias(\"list_netEcContribution\"),\n", " pl.col(\"totalCost\") .alias(\"list_totalCost\"),\n", " pl.col(\"endOfParticipation\").alias(\"list_endOfParticipation\"),\n", " pl.col(\"activityType\") .alias(\"list_activityType\"),\n", " pl.col(\"contentUpdateDate\").alias(\"list_contentUpdateDate\"),\n", " ])\n", ")\n", "\n", "voc = (\n", " dfs[\"euroSciVoc\"]\n", " .group_by(\"projectID\")\n", " .agg([\n", " pl.col(\"euroSciVocTitle\") .alias(\"list_euroSciVocTitle\"),\n", " pl.col(\"euroSciVocPath\") .alias(\"list_euroSciVocPath\"),\n", " pl.col(\"euroSciVocDescription\").alias(\"list_description\"),\n", " ])\n", ")\n", "\n", "topic = (\n", " dfs[\"topics\"]\n", " .group_by(\"projectID\")\n", " .agg([\n", " pl.col(\"topic\") .alias(\"list_topic\"),\n", " pl.col(\"title\") .alias(\"list_title\"),\n", " ])\n", ")\n", "\n", "web_item = dfs[\"webItem\"] # no aggregation\n", "\n", "web_link = (\n", " dfs[\"webLink\"]\n", " .group_by(\"projectID\")\n", " .agg([\n", " pl.col(\"physUrl\") .alias(\"list_physUrl\"),\n", " pl.col(\"availableLanguages\") .alias(\"list_availableLanguages\"),\n", " pl.col(\"status\") .alias(\"list_status\"),\n", " pl.col(\"archivedDate\") .alias(\"list_archivedDate\"),\n", " pl.col(\"type\") .alias(\"list_type\"),\n", " pl.col(\"source\") .alias(\"list_source\"),\n", " pl.col(\"represents\") .alias(\"list_represents\"),\n", " ])\n", ")\n", "\n", "legal = (\n", " dfs[\"legalBasis\"]\n", " .group_by(\"projectID\")\n", " .agg([\n", " pl.col(\"legalBasis\") .alias(\"list_legalBasis\"),\n", " pl.col(\"title\") .alias(\"list_title\"),\n", " pl.col(\"uniqueProgrammePart\").alias(\"list_uniqueProgrammePart\"),\n", " ])\n", ")\n", "\n", "consolidated = (\n", " projects\n", " .join(projects_deliv, left_on=\"id\", right_on=\"projectID\", suffix=\"_deliv\", how=\"left\")\n", " .join(projects_publi, left_on=\"id\", right_on=\"projectID\", suffix=\"_publi\", how=\"left\")\n", " .join(report, left_on=\"id\", right_on=\"projectID\", suffix=\"_report\", how=\"left\")\n", " .join(org, left_on=\"id\", right_on=\"projectID\", suffix=\"_org\", how=\"left\")\n", " .join(web_link, left_on=\"id\", right_on=\"projectID\", suffix=\"_link\", how=\"left\")\n", " .join(legal, left_on=\"id\", right_on=\"projectID\", suffix=\"_legal\", how=\"left\")\n", " .join(topic, left_on=\"id\", right_on=\"projectID\", suffix=\"_topic\", how=\"left\")\n", " .join(voc, left_on=\"id\", right_on=\"projectID\", suffix=\"_voc\", how=\"left\")\n", ")\n", "\n", "for col in [\"startDate\", \"endDate\"]:\n", " if consolidated[col].dtype == pl.Utf8:\n", " consolidated = consolidated.with_column(\n", " pl.col(col).str.strptime(pl.Date, \"%Y-%m-%d\").alias(col)\n", " )\n", "\n", "consolidated = consolidated.with_columns(\n", " pl.col(\"list_netEcContribution\").list.eval(pl.element().cast(pl.Float64),parallel=True)\n", " .list.sum().alias(\"netEcContribution\")\n", ")\n", "\n", "consolidated = consolidated.with_columns(\n", " pl.col(\"totalCost\").cast(pl.Float64),\n", " pl.col(\"netEcContribution\").cast(pl.Float64)\n", ")\n", "\n", "consolidated = consolidated.with_columns([\n", " pl.col(\"startDate\").dt.year().alias(\"startYear\"),\n", " pl.col(\"endDate\"). dt.year().alias(\"endYear\"),\n", " (pl.col(\"endDate\") - pl.col(\"startDate\")).dt.total_days().alias(\"durationDays\"),\n", " (pl.col(\"netEcContribution\") / pl.col(\"totalCost\")).alias(\"ecRatio\"),\n", "])\n", "\n", "consolidated.write_parquet(OUTDIR / \"consolidated.parquet\")\n", "\n", "excluded_frameworks = [\"FP1\", \"FP2\", \"FP3\", \"FP4\", \"FP5\", \"FP6\"]\n", "\n", "consolidated_clean = (consolidated.filter(~pl.col(\"frameworkProgramme\").is_in(excluded_frameworks)))\n", "\n", "consolidated_clean.write_parquet(OUTDIR / \"consolidated_clean.parquet\")\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import polars as pl\n", "import pathlib\n", "ROOT = pathlib.Path(r\"C:\\Users\\Romain\\OneDrive - KU Leuven\\MDA\\backend\\data\")\n", "OUTDIR = ROOT #/ \"combined\"\n", "\n", "#consolidated = pl.read_parquet(OUTDIR / \"consolidated.parquet\")\n", "consolidated_clean = pl.read_parquet(OUTDIR / \"consolidated_clean.parquet\")\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "shape: (5, 68)
idacronymstatustitlestartDateendDatetotalCostecMaxContributionlegalBasistopicsecSignatureDateframeworkProgrammemasterCallsubCallfundingSchemenatureobjectivecontentUpdateDatercngrantDoiprogrammeFolderlist_deliverableTypelist_urllist_contentUpdateDatelist_authorslist_titlelist_doilist_journalTitlelist_isPublishedAslist_publishedYearlist_contentUpdateDate_publilist_title_reportlist_attachmentlist_contentUpdateDate_reportlist_organisationIDlist_countrylist_namelist_SMElist_citylist_geolocationlist_organizationURLlist_rolelist_ecContributionlist_netEcContributionlist_totalCostlist_endOfParticipationlist_activityTypelist_contentUpdateDate_orglist_physUrllist_availableLanguageslist_statuslist_archivedDatelist_typelist_sourcelist_representslist_legalBasislist_title_legallist_uniqueProgrammePartlist_topiclist_title_topiclist_euroSciVocTitlelist_euroSciVocPathlist_descriptionnetEcContributionstartYearendYeardurationDaysecRatio
strstrstrstrdatedatef64f64strstrdatestrstrstrstrstrstrdatetime[μs]i64strstrlist[str]list[str]list[datetime[μs]]list[str]list[str]list[str]list[str]list[str]list[str]list[datetime[μs]]list[str]list[str]list[datetime[μs]]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[f64]list[str]list[str]list[datetime[μs]]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]f64i32i32i64f64
"624794""COMPACTABILITY""CLOSED""Contribution of Compact Neighb…2014-12-012016-11-30309235.2309235.2"FP7-PEOPLE""FP7-PEOPLE-2013-IEF"null"FP7"null"FP7-PEOPLE-2013-IEF""MC-IEF"null"This research investigates how…2017-04-10 11:25:29187874null"H2013"nullnullnullnullnullnullnullnullnullnull["Final Report Summary - COMPACTABILITY (Contribution of Compact Neighbourhoods to Social Sustainability)"]["/docs/results/624/624794/final1-table-1.jpg"][2017-03-07 17:25:15]["999446873"]["UK"]["OXFORD BROOKES UNIVERSITY"][null]["Oxford"]["51.7520131,-1.2578498"]["http://www.brookes.ac.uk"]["coordinator"]["309235.2"][null][null]["false"]["HES"][2017-04-10 11:25:29]nullnullnullnullnullnullnull["FP7-PEOPLE"]["Specific programme "People" implementing the Seventh Framework Programme of the European Community for research, technological development and demonstration activities (2007 to 2013)"][null]["FP7-PEOPLE-2013-IEF"]["Marie-Curie Action: Intra-European fellowships for career development"]nullnullnull0.0201420167300.0
"276810""ARCHOSL""CLOSED""Archives of Early Human Occupa…2011-03-012014-02-2875000.075000.0"FP7-PEOPLE""FP7-PEOPLE-2009-RG"null"FP7"null"FP7-PEOPLE-2010-RG""MC-IRG"null"A number of important archaeol…2019-08-02 13:24:5198178null"H2013"nullnullnull["Arnold, L.J., Demuro, M., Parés, J.M., Arsuaga, J.L., Aranburu, A.,", "Lee J. Arnold , Martina Demuro , Marta Navazo , Alfonso Benito-Calvo , Alfredo Pérez-González", … "F. Gutiérrez , B. Valero-Garcés , G. Desir , P. González-Sampériz , M. Gutiérrez , R. Linares , M. Zarroca , A. Moreno , J. Guerrero , C. Roqué"]["Luminescence dating and palaeomagnetic age constraint on hominins from Sima de los Huesos, Atapuerca, Spain", "OSL dating of the Middle Palaeolithic Hotel California site, Sierra de Atapuerca, north-central Spain", … "Late Holocene evolution of playa lakes in the central Ebro depression based on geophysical surveys and morpho-stratigraphic analysis of lacustrine terraces"]["http://dx.doi.org/10.1016/j.jhevol.2013.12.001", "10.1111/j.1502-3885.2012.00262.x", … "http://dx.doi.org/10.1016/j.geomorph.2012.02.013"]["Journal of Human Evolution", "Boreas", … "Geomorphology"]["PEER REVIEWED ARTICLE", "PEER REVIEWED ARTICLE", … "PEER REVIEWED ARTICLE"][null, null, … null][null, null, … null]["Final Report Summary - ARCHOSL (Archives of Early Human Occupation in Western Europe: OSL Chronologies beyond the Middle Pleistocene in the Iberian Peninsula)"][null][2014-11-07 13:26:06]["986579241"]["ES"]["CENTRO NACIONAL DE INVESTIGACION SOBRE LA EVOLUCION HUMANA"][null]["Burgos"]["42.3396185,-3.6967044"]["http://www.cenieh.es"]["coordinator"]["75000"][null][null]["false"]["REC"][2019-08-02 13:24:51]nullnullnullnullnullnullnull["FP7-PEOPLE"]["Specific programme "People" implementing the Seventh Framework Programme of the European Community for research, technological development and demonstration activities (2007 to 2013)"][null]["FP7-PEOPLE-2009-RG"]["Marie Curie Action: Reintegration Grants"]["ethnoarchaeology", "physical anthropology"]["/humanities/history and archaeology/archaeology/ethnoarchaeology", "/social sciences/sociology/anthropology/physical anthropology"][null, null]0.02011201410950.0
"622478""DETforDRF 2.0""CLOSED""Design and Expansion Turbine f…nullnull161968.8161968.8"FP7-PEOPLE""FP7-PEOPLE-2013-IEF"null"FP7"null"FP7-PEOPLE-2013-IEF""MC-IEF"null"This proposal for a Marie Curi…2016-03-31 21:10:31187686null"H2013"nullnullnullnullnullnullnullnullnullnullnullnullnull["953573536"]["DE"]["BSH HAUSGERATE GMBH"][null]["Munchen"]["48.0887063,11.6433468"]["http://www.bsh-group.com"]["coordinator"]["161968.8"][null][null]["false"]["PRC"][2016-03-31 21:10:31]nullnullnullnullnullnullnull["FP7-PEOPLE"]["Specific programme "People" implementing the Seventh Framework Programme of the European Community for research, technological development and demonstration activities (2007 to 2013)"][null]["FP7-PEOPLE-2013-IEF"]["Marie-Curie Action: Intra-European fellowships for career development"]["fluid dynamics"]["/natural sciences/physical sciences/classical mechanics/fluid mechanics/fluid dynamics"][null]0.0nullnullnull0.0
"615785""EMERGING SUBJECTS""CLOSED""Emerging Subjects of the New E…2014-09-012019-06-301.658373e61.658373e6"FP7-IDEAS-ERC""ERC-CG-2013-SH2"null"FP7"null"ERC-2013-CoG""ERC-CG"null"This project examines how pred…2023-04-05 11:40:06188675null"H2013"nullnullnull["Rebekah Plueckhahn", "Dulam, Bumochir", … "•Empson, R. A."]["Tragic Spirits: Shamanism, Memory, and Gender in Contemporary Mongolia by Manduhai Buyandelger.", "The Afterlife of Nomadism: Pastoralism, environmentalism, civilization and identity in Mongolia and China", … "A Space That Will Never Be Filled Sharp Communication and the Simultaneity of Opposites."]["10.1111/aman.12304", null, … null]["American Anthropologist", "Pastoralist Livelihoods in Asian Drylands: Environment, Governance and Risk", … "Current Anthropology"]["PEER_REVIEWED_ARTICLE", "ARTICLE", … "ARTICLE"][null, null, … null][null, null, … null]["Final Report Summary - EMERGING SUBJECTS (Emerging Subjects of the New Economy: Tracing Economic Growth in Mongolia)"][null][2018-01-15 17:25:25]["888898146"][null]["UNIVERSITY COLLEGE LONDON"][null]["LONDON"]["51.5236746,-0.1339608"]["http://www.ucl.ac.uk"]["coordinator"]["1658373"][null][null]["false"]["HES"][2023-04-05 11:40:06]nullnullnullnullnullnullnull["FP7-IDEAS-ERC"]["Specific programme: "Ideas" implementing the Seventh Framework Programme of the European Community for research, technological development and demonstration activities (2007 to 2013)"][null]["ERC-CG-2013-SH2"]["ERC Consolidator Grant - Institutions Values Beliefs and behaviour"]["anthropology"]["/social sciences/sociology/anthropology"][null]0.02014201917630.0
"237010""DEER PALAEOBIOLOGY""CLOSED""Palaeobiological inference thr…2009-04-092011-01-08173416.47173416.47"FP7-PEOPLE""FP7-PEOPLE-IEF-2008"null"FP7"null"FP7-PEOPLE-IEF-2008""MC-IEF"null"The present research aims to r…2019-07-16 19:18:2590424null"H2013"nullnullnull["Lister, A.M., Breda, M. and others", "Breda, M., Lister, A.M. & others"]["Metric analysis of ungulate mammals in the early Middle Pleistocene of Britain, in relation to taxonomy and biostratigraphy. II. Cervidae, Equidae and Suidae.", "Metric analysis of ungulate mammals in the early Middle Pleistocene of Britain, in relation to taxonomy and biostratigraphy. I: Rhinocerotidae and Bovidae."][null, null]["Quaternary International", "Quaternary International"]["PEER REVIEWED ARTICLE", "PEER REVIEWED ARTICLE"][null, null][null, null]["Final Report Summary - DEER PALAEOBIOLOGY (Palaeobiological inference through phylogenetic analysis of Pleistocene deer)"][null][2013-07-05 00:02:53]["999642037"]["UK"]["NATURAL HISTORY MUSEUM"][null]["London"]["51.494882,-0.1847716"]["http://www.nhm.ac.uk/"]["coordinator"]["173416.47"][null][null]["false"]["PUB"][2019-07-16 19:18:25]nullnullnullnullnullnullnull["FP7-PEOPLE"]["Specific programme "People" implementing the Seventh Framework Programme of the European Community for research, technological development and demonstration activities (2007 to 2013)"][null]["FP7-PEOPLE-IEF-2008"]["Marie Curie Action: Intra-European Fellowships for Career Development"]["comparative morphology"]["/natural sciences/biological sciences/biological morphology/comparative morphology"][null]0.0200920116390.0
" ], "text/plain": [ "shape: (5, 68)\n", "┌────────┬──────────────┬────────┬──────────────┬───┬───────────┬─────────┬──────────────┬─────────┐\n", "│ id ┆ acronym ┆ status ┆ title ┆ … ┆ startYear ┆ endYear ┆ durationDays ┆ ecRatio │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ str ┆ str ┆ str ┆ str ┆ ┆ i32 ┆ i32 ┆ i64 ┆ f64 │\n", "╞════════╪══════════════╪════════╪══════════════╪═══╪═══════════╪═════════╪══════════════╪═════════╡\n", "│ 624794 ┆ COMPACTABILI ┆ CLOSED ┆ Contribution ┆ … ┆ 2014 ┆ 2016 ┆ 730 ┆ 0.0 │\n", "│ ┆ TY ┆ ┆ of Compact ┆ ┆ ┆ ┆ ┆ │\n", "│ ┆ ┆ ┆ Neighb… ┆ ┆ ┆ ┆ ┆ │\n", "│ 276810 ┆ ARCHOSL ┆ CLOSED ┆ Archives of ┆ … ┆ 2011 ┆ 2014 ┆ 1095 ┆ 0.0 │\n", "│ ┆ ┆ ┆ Early Human ┆ ┆ ┆ ┆ ┆ │\n", "│ ┆ ┆ ┆ Occupa… ┆ ┆ ┆ ┆ ┆ │\n", "│ 622478 ┆ DETforDRF ┆ CLOSED ┆ Design and ┆ … ┆ null ┆ null ┆ null ┆ 0.0 │\n", "│ ┆ 2.0 ┆ ┆ Expansion ┆ ┆ ┆ ┆ ┆ │\n", "│ ┆ ┆ ┆ Turbine f… ┆ ┆ ┆ ┆ ┆ │\n", "│ 615785 ┆ EMERGING ┆ CLOSED ┆ Emerging ┆ … ┆ 2014 ┆ 2019 ┆ 1763 ┆ 0.0 │\n", "│ ┆ SUBJECTS ┆ ┆ Subjects of ┆ ┆ ┆ ┆ ┆ │\n", "│ ┆ ┆ ┆ the New E… ┆ ┆ ┆ ┆ ┆ │\n", "│ 237010 ┆ DEER PALAEOB ┆ CLOSED ┆ Palaeobiolog ┆ … ┆ 2009 ┆ 2011 ┆ 639 ┆ 0.0 │\n", "│ ┆ IOLOGY ┆ ┆ ical ┆ ┆ ┆ ┆ ┆ │\n", "│ ┆ ┆ ┆ inference ┆ ┆ ┆ ┆ ┆ │\n", "│ ┆ ┆ ┆ thr… ┆ ┆ ┆ ┆ ┆ │\n", "└────────┴──────────────┴────────┴──────────────┴───┴───────────┴─────────┴──────────────┴─────────┘" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "consolidated_clean.head()\n", "#ecMaxContribution, endDate, status, legalBasis, frameworkProgramme, fundingScheme, list_title_report, list_name, list_role, list_city, list_country, list_ecContribution, list_activityType, durationDays" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "RAG should be able to answer questions related to funding for: EuroSciVoc classifications, Topic, Projects, Organizations, legalBasis.\n", "\n", "- Expand each of these datasets with summary statistics (some based on the dataset itself, other based on the counts of status (terminated/closed) etc.)\n", "- Write in the prompt to for example ask if they want more information on the topics of a project, or for example some short information about the different project done by an organisation.\n", "- ..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "org = pl.read_parquet(OUTDIR / \"organization_all.parquet\")\n", "org_cleaned = (\n", " org.group_by([\"organisationID\",\"name\",\"vatNumber\",\"shortName\",\"SME\",\"activityType\",\"street\",\"postCode\",\"city\",\"country\",\"nutsCode\",\"geolocation\",\"organizationURL\"])\n", " .agg([\n", " pl.col(\"projectID\") .alias(\"list_projectID\"),\n", " pl.col(\"projectAcronym\") .alias(\"list_projectAcronym\"),\n", " pl.col(\"rcn\").alias(\"list_rcn\"),\n", " pl.col(\"order\") .alias(\"list_order\"),\n", " pl.col(\"role\") .alias(\"list_role\"),\n", " pl.col(\"ecContribution\") .alias(\"list_ecContribution\"),\n", " pl.col(\"netEcContribution\") .alias(\"list_netEcContribution\"),\n", " pl.col(\"totalCost\") .alias(\"list_totalCost\"),\n", " pl.col(\"endOfParticipation\") .alias(\"endOfParticipation\"),\n", " ])\n", ")\n", "org_cleaned.head()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "shape: (5, 68)
idacronymstatustitlestartDateendDatetotalCostecMaxContributionlegalBasistopicsecSignatureDateframeworkProgrammemasterCallsubCallfundingSchemenatureobjectivecontentUpdateDatercngrantDoiprogrammeFolderlist_deliverableTypelist_urllist_contentUpdateDatelist_authorslist_titlelist_doilist_journalTitlelist_isPublishedAslist_publishedYearlist_contentUpdateDate_publilist_title_reportlist_attachmentlist_contentUpdateDate_reportlist_organisationIDlist_countrylist_namelist_SMElist_citylist_geolocationlist_organizationURLlist_rolelist_ecContributionlist_netEcContributionlist_totalCostlist_endOfParticipationlist_activityTypelist_contentUpdateDate_orglist_physUrllist_availableLanguageslist_statuslist_archivedDatelist_typelist_sourcelist_representslist_legalBasislist_title_legallist_uniqueProgrammePartlist_topiclist_title_topiclist_euroSciVocTitlelist_euroSciVocPathlist_descriptionnetEcContributionstartYearendYeardurationDaysecRatio
strstrstrstrdatedatef64f64strstrdatestrstrstrstrstrstrdatetime[μs]i64strstrlist[str]list[str]list[datetime[μs]]list[str]list[str]list[str]list[str]list[str]list[str]list[datetime[μs]]list[str]list[str]list[datetime[μs]]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[f64]list[str]list[str]list[datetime[μs]]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]f64i32i32i64f64
"1476"nullnull"Integrated Sensor-Based Robot …1985-01-011988-01-01nullnull"FP1-ESPRIT 1"nullnull"FP1"nullnullnullnull"The objective of this project …1992-12-04 01:04:588338null"H1984"nullnullnullnullnullnullnullnullnullnullnullnullnull[null, null, … null]["UK", "PT", … "UK"]["UNIVERSITY OF NEWCASTLE UPON TYNE", "UNIV NOVA DE LISBOA", … "MARI Applied Technologies Ltd"][null, null, … null]["Newcastle upon Tyne", "CAPARICA", … "Boldon"][null, "38.6633229,-9.2032444", … null][null, null, … null]["participant", "participant", … "coordinator"][null, null, … null][null, null, … null][null, null, … null][null, null, … null][null, null, … null][1992-12-04 01:04:58, 1992-12-04 01:04:58, … 1992-12-04 01:04:58]nullnullnullnullnullnullnull["FP1-ESPRIT 1"]["European programme (EEC) for research and development in information technologies (ESPRIT), 1984-1988"][null]nullnull["software", "sensors"]["/natural sciences/computer and information sciences/software", "/engineering and technology/electrical engineering, electronic engineering, information engineering/electronic engineering/sensors"][null, null]0.0198519881095null
"395""INCA"null"An Integrated Network Architec…1984-09-011989-09-01nullnull"FP1-ESPRIT 1"nullnull"FP1"nullnullnullnull"The principal purpose of the I…1992-12-09 00:00:028633null"H1984"nullnullnullnullnullnullnullnullnullnullnullnullnull[null, null, … null]["IT", "IT", … "UK"]["Ingegneria C. Olivetti and C. SpA", "System Wizards Srl", … "Birkbeck College, University of London"][null, null, … null]["Pozzuoli Napoli", "Torino", … "London"]["40.8349492,14.1067963", "45.0993613,7.6747093", … "51.5199928,-0.1299654"][null, null, … null]["participant", "participant", … "participant"][null, null, … null][null, null, … null][null, null, … null][null, null, … null][null, null, … null][1992-12-09 00:00:02, 1992-12-09 00:00:02, … 1992-12-09 00:00:02]nullnullnullnullnullnullnull["FP1-ESPRIT 1"]["European programme (EEC) for research and development in information technologies (ESPRIT), 1984-1988"][null]nullnull["software", "telecommunications"]["/natural sciences/computer and information sciences/software", "/engineering and technology/electrical engineering, electronic engineering, information engineering/information engineering/telecommunications"][null, null]0.0198419891826null
"EN3M0096"nullnull"IMPROVEMENT AND APPLICATION OF…1988-07-011989-02-28nullnull"FP1-ENNONUC 3C"nullnull"FP1"nullnull"CSC"null"THERE WILL BE NUMEROUS SCIENTI…1994-01-23 00:00:0212659null"H1984"nullnullnullnullnullnullnullnullnullnullnullnullnull[null]["FR"]["Chambre de Commerce et d'Industrie de Paris (CCIP)"][null]["Paris"]["46.6769224,-1.4244831"][null]["coordinator"][null][null][null][null][null][1994-01-23 00:00:02]nullnullnullnullnullnullnull["FP1-ENNONUC 3C"]["Research and development programme (EEC) in the field of Non-Nuclear Energy, 1985-1988"][null]nullnull["software"]["/natural sciences/computer and information sciences/software"][null]0.019881989242null
"874""CONCORDIA"null"Integrated Environment for Rel…1985-12-011986-12-01nullnull"FP1-ESPRIT 1"nullnull"FP1"nullnullnullnull"The CONCORDIA project aimed to…1992-12-02 00:02:558413null"H1984"nullnullnullnullnullnullnullnullnullnullnullnullnull[null, null, … null]["IT", "FR", … "UK"]["Telettra SpA", "JEAN LEFEBVRE TELECOM", … "MARI Applied Technologies Ltd"][null, null, … null]["Bologna", "PUTEAUX", … "Boldon"]["44.5009260,11.3481129", "48.8811551,2.2457420", … null][null, null, … null]["participant", "participant", … "coordinator"][null, null, … null][null, null, … null][null, null, … null][null, null, … null][null, null, … null][1992-12-02 00:02:55, 1992-12-02 00:02:55, … 1992-12-02 00:02:55]nullnullnullnullnullnullnull["FP1-ESPRIT 1"]["European programme (EEC) for research and development in information technologies (ESPRIT), 1984-1988"][null]nullnull["software"]["/natural sciences/computer and information sciences/software"][null]0.019851986365null
"EV4T0018"nullnull"ANALYSIS OF OPTICAL AND THERMA…1987-12-011990-11-30nullnull"FP1-TECHHAZ C"nullnull"FP1"nullnull"CSC"null"DEVELOPMENT OF APPROPRIATE DIG…1994-01-23 00:00:0211996null"H1984"nullnullnullnullnullnullnullnullnullnullnullnullnull[null]["BE"]["VON KARMAN INSTITUTE FOR FLUID DYNAMICS"][null]["RHODE-ST-GENESE"]["50.7562383,4.3873549"][null]["coordinator"][null][null][null][null][null][1994-01-23 00:00:02]nullnullnullnullnullnullnull["FP1-TECHHAZ C"]["Multiannual R&D programmes (EEC) in the field of the environment - Pilot projects on major technological hazards -, 1986-1990"][null]nullnull["graphic design", "software", … "laser physics"]["/social sciences/media and communications/graphic design", "/natural sciences/computer and information sciences/software", … "/natural sciences/physical sciences/optics/laser physics"][null, null, … null]0.0198719901095null
" ], "text/plain": [ "shape: (5, 68)\n", "┌──────────┬───────────┬────────┬───────────────┬───┬───────────┬─────────┬──────────────┬─────────┐\n", "│ id ┆ acronym ┆ status ┆ title ┆ … ┆ startYear ┆ endYear ┆ durationDays ┆ ecRatio │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ str ┆ str ┆ str ┆ str ┆ ┆ i32 ┆ i32 ┆ i64 ┆ f64 │\n", "╞══════════╪═══════════╪════════╪═══════════════╪═══╪═══════════╪═════════╪══════════════╪═════════╡\n", "│ 1476 ┆ null ┆ null ┆ Integrated ┆ … ┆ 1985 ┆ 1988 ┆ 1095 ┆ null │\n", "│ ┆ ┆ ┆ Sensor-Based ┆ ┆ ┆ ┆ ┆ │\n", "│ ┆ ┆ ┆ Robot … ┆ ┆ ┆ ┆ ┆ │\n", "│ 395 ┆ INCA ┆ null ┆ An Integrated ┆ … ┆ 1984 ┆ 1989 ┆ 1826 ┆ null │\n", "│ ┆ ┆ ┆ Network ┆ ┆ ┆ ┆ ┆ │\n", "│ ┆ ┆ ┆ Architec… ┆ ┆ ┆ ┆ ┆ │\n", "│ EN3M0096 ┆ null ┆ null ┆ IMPROVEMENT ┆ … ┆ 1988 ┆ 1989 ┆ 242 ┆ null │\n", "│ ┆ ┆ ┆ AND ┆ ┆ ┆ ┆ ┆ │\n", "│ ┆ ┆ ┆ APPLICATION ┆ ┆ ┆ ┆ ┆ │\n", "│ ┆ ┆ ┆ OF… ┆ ┆ ┆ ┆ ┆ │\n", "│ 874 ┆ CONCORDIA ┆ null ┆ Integrated ┆ … ┆ 1985 ┆ 1986 ┆ 365 ┆ null │\n", "│ ┆ ┆ ┆ Environment ┆ ┆ ┆ ┆ ┆ │\n", "│ ┆ ┆ ┆ for Rel… ┆ ┆ ┆ ┆ ┆ │\n", "│ EV4T0018 ┆ null ┆ null ┆ ANALYSIS OF ┆ … ┆ 1987 ┆ 1990 ┆ 1095 ┆ null │\n", "│ ┆ ┆ ┆ OPTICAL AND ┆ ┆ ┆ ┆ ┆ │\n", "│ ┆ ┆ ┆ THERMA… ┆ ┆ ┆ ┆ ┆ │\n", "└──────────┴───────────┴────────┴───────────────┴───┴───────────┴─────────┴──────────────┴─────────┘" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "consolidated.head()" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['en' 'de' 'it' 'sw' 'ro' 'pl' 'pt' 'ca' 'af' 'es' 'nl' 'no' 'da' 'vi'\n", " 'et' 'fr' 'cy' 'tl' 'so' 'sv' 'tr' 'id' 'lt' 'hu' 'fi' 'hr' 'sl'\n", " 'unknown' 'sk' 'cs']\n", "title\n", "en 56676\n", "de 1012\n", "it 343\n", "ro 238\n", "ca 224\n", "fr 144\n", "da 131\n", "es 81\n", "tl 69\n", "vi 69\n", "nl 61\n", "pt 60\n", "af 46\n", "no 43\n", "id 36\n", "so 29\n", "sv 24\n", "pl 15\n", "cy 14\n", "et 11\n", "fi 10\n", "sw 9\n", "hr 6\n", "sl 5\n", "lt 3\n", "tr 2\n", "unknown 2\n", "hu 1\n", "sk 1\n", "cs 1\n", "Name: count, dtype: int64\n" ] } ], "source": [ "from langdetect import detect\n", "\n", "def is_english(text):\n", " try:\n", " return detect(text) == 'en'\n", " except:\n", " return False\n", "\n", "def lang_text(text):\n", " try:\n", " return detect(text)\n", " except:\n", " return \"unknown\"\n", "\n", "languages=consolidated_clean.filter(pl.col('status').is_not_null()).to_pandas()['title'].apply(lang_text)\n", "unique_languages = languages.unique()\n", "print(unique_languages)\n", "language_counts = languages.value_counts()\n", "print(language_counts)\n", "\n", "#print(\"English coverage:\", consolidated.to_pandas()['title'].apply(is_english).mean())\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🧹 Preparing data...\n", "💡 Embedding text...\n", "Loading saved embeddings for column 'title'...\n", "Fitting SVD for column 'title'...\n", "Loading saved embeddings for column 'objective'...\n", "Fitting SVD for column 'objective'...\n", "Loading saved embeddings for column 'topic_title'...\n", "Fitting SVD for column 'topic_title'...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "[I 2025-05-12 21:30:14,899] A new study created in memory with name: no-name-7695811c-115a-4d9f-a17b-3fc16faf602a\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "🧱 Building pipeline...\n", "🎯 Training model with Optuna...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['AW', 'GM', 'GN', 'GY', 'JE', 'MV'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['CARRETERA AL AJUSCO NUM. 377'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['FI', 'GA', 'NO', 'RO'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['COMPUTATIONAL TOPOLOGY', 'ELECTRICAL ENGINEERING, ELECTRONIC ENGINEERING, INFORMATION ENGINEERING', 'FLORICULTURE', 'FRUGAL ARTIFICIAL INTELLIGENCE', 'GENERAL MEDICINE', 'HISTORY OF PHILOSOPHY', 'INFORMATION ENGINEERING', 'ISLAMIC SCHOOLS', 'OTHER SOCIAL SCIENCES', 'SILICENE', 'ULTRAVIOLET LASERS'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['BI', 'FJ', 'GD', 'GW', 'HT', 'LS', 'PG', 'SV', 'ZZ'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['3D4DDC224DA059CAA718E6F471585874', 'ET', 'HR', 'LT', 'MT', 'PT', 'SR'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['APPLIED MECHANICS', 'BASIC MEDICINE', 'EDGE ARTIFICIAL INTELLIGENCE', 'FIXED WIRELESS NETWORK', 'ICE GIANTS', 'ORTHODONTICS', 'PERIODONTICS', 'PLANT CLONING', 'REGIONAL HUMAN RIGHTS', 'STRABISMUS'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['BB', 'BH', 'BN', 'CF', 'GF', 'GT', 'HN', 'KW', 'LR', 'MR', 'OM', 'QA', 'SL', 'SM', 'ST', 'VG'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['BUILDING B'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['66C27239DA0384FFDD662CB8A543DBAB', 'AD460A03C5F2CBDC967586AF7495D308'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['ADMIRALTY LAW', 'BIOLOGICAL BEHAVIOURAL SCIENCES', 'BREAST IMPLANTS', 'ETHICAL THEORIES', 'INERTIAL NAVIGATION SYSTEM', 'NUCLEAR CHEMISTRY', 'OTHER AGRICULTURAL SCIENCES', 'OTHER MEDICAL SCIENCES'] will be ignored\n", " warnings.warn(\n", "[I 2025-05-12 21:35:06,892] Trial 0 finished with value: 0.42635007849963164 and parameters: {'n_estimators': 151, 'max_depth': 5, 'learning_rate': 0.27984807723222593, 'scale_pos_weight': 6.072340577651307}. Best is trial 0 with value: 0.42635007849963164.\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['AW', 'GM', 'GN', 'GY', 'JE', 'MV'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['CARRETERA AL AJUSCO NUM. 377'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['FI', 'GA', 'NO', 'RO'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['COMPUTATIONAL TOPOLOGY', 'ELECTRICAL ENGINEERING, ELECTRONIC ENGINEERING, INFORMATION ENGINEERING', 'FLORICULTURE', 'FRUGAL ARTIFICIAL INTELLIGENCE', 'GENERAL MEDICINE', 'HISTORY OF PHILOSOPHY', 'INFORMATION ENGINEERING', 'ISLAMIC SCHOOLS', 'OTHER SOCIAL SCIENCES', 'SILICENE', 'ULTRAVIOLET LASERS'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['BI', 'FJ', 'GD', 'GW', 'HT', 'LS', 'PG', 'SV', 'ZZ'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['3D4DDC224DA059CAA718E6F471585874', 'ET', 'HR', 'LT', 'MT', 'PT', 'SR'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['APPLIED MECHANICS', 'BASIC MEDICINE', 'EDGE ARTIFICIAL INTELLIGENCE', 'FIXED WIRELESS NETWORK', 'ICE GIANTS', 'ORTHODONTICS', 'PERIODONTICS', 'PLANT CLONING', 'REGIONAL HUMAN RIGHTS', 'STRABISMUS'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['BB', 'BH', 'BN', 'CF', 'GF', 'GT', 'HN', 'KW', 'LR', 'MR', 'OM', 'QA', 'SL', 'SM', 'ST', 'VG'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['BUILDING B'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['66C27239DA0384FFDD662CB8A543DBAB', 'AD460A03C5F2CBDC967586AF7495D308'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['ADMIRALTY LAW', 'BIOLOGICAL BEHAVIOURAL SCIENCES', 'BREAST IMPLANTS', 'ETHICAL THEORIES', 'INERTIAL NAVIGATION SYSTEM', 'NUCLEAR CHEMISTRY', 'OTHER AGRICULTURAL SCIENCES', 'OTHER MEDICAL SCIENCES'] will be ignored\n", " warnings.warn(\n", "[I 2025-05-12 21:42:41,795] Trial 1 finished with value: 0.4292899461188686 and parameters: {'n_estimators': 175, 'max_depth': 5, 'learning_rate': 0.18982366215962182, 'scale_pos_weight': 2.954471437724056}. Best is trial 1 with value: 0.4292899461188686.\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['AW', 'GM', 'GN', 'GY', 'JE', 'MV'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['CARRETERA AL AJUSCO NUM. 377'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['FI', 'GA', 'NO', 'RO'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['COMPUTATIONAL TOPOLOGY', 'ELECTRICAL ENGINEERING, ELECTRONIC ENGINEERING, INFORMATION ENGINEERING', 'FLORICULTURE', 'FRUGAL ARTIFICIAL INTELLIGENCE', 'GENERAL MEDICINE', 'HISTORY OF PHILOSOPHY', 'INFORMATION ENGINEERING', 'ISLAMIC SCHOOLS', 'OTHER SOCIAL SCIENCES', 'SILICENE', 'ULTRAVIOLET LASERS'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['BI', 'FJ', 'GD', 'GW', 'HT', 'LS', 'PG', 'SV', 'ZZ'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['3D4DDC224DA059CAA718E6F471585874', 'ET', 'HR', 'LT', 'MT', 'PT', 'SR'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['APPLIED MECHANICS', 'BASIC MEDICINE', 'EDGE ARTIFICIAL INTELLIGENCE', 'FIXED WIRELESS NETWORK', 'ICE GIANTS', 'ORTHODONTICS', 'PERIODONTICS', 'PLANT CLONING', 'REGIONAL HUMAN RIGHTS', 'STRABISMUS'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['BB', 'BH', 'BN', 'CF', 'GF', 'GT', 'HN', 'KW', 'LR', 'MR', 'OM', 'QA', 'SL', 'SM', 'ST', 'VG'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['BUILDING B'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['66C27239DA0384FFDD662CB8A543DBAB', 'AD460A03C5F2CBDC967586AF7495D308'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['ADMIRALTY LAW', 'BIOLOGICAL BEHAVIOURAL SCIENCES', 'BREAST IMPLANTS', 'ETHICAL THEORIES', 'INERTIAL NAVIGATION SYSTEM', 'NUCLEAR CHEMISTRY', 'OTHER AGRICULTURAL SCIENCES', 'OTHER MEDICAL SCIENCES'] will be ignored\n", " warnings.warn(\n", "[I 2025-05-12 21:52:48,155] Trial 2 finished with value: 0.4289493329967354 and parameters: {'n_estimators': 156, 'max_depth': 10, 'learning_rate': 0.13243428465407345, 'scale_pos_weight': 3.250588524606016}. Best is trial 1 with value: 0.4292899461188686.\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['AW', 'GM', 'GN', 'GY', 'JE', 'MV'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['CARRETERA AL AJUSCO NUM. 377'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['FI', 'GA', 'NO', 'RO'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['COMPUTATIONAL TOPOLOGY', 'ELECTRICAL ENGINEERING, ELECTRONIC ENGINEERING, INFORMATION ENGINEERING', 'FLORICULTURE', 'FRUGAL ARTIFICIAL INTELLIGENCE', 'GENERAL MEDICINE', 'HISTORY OF PHILOSOPHY', 'INFORMATION ENGINEERING', 'ISLAMIC SCHOOLS', 'OTHER SOCIAL SCIENCES', 'SILICENE', 'ULTRAVIOLET LASERS'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['BI', 'FJ', 'GD', 'GW', 'HT', 'LS', 'PG', 'SV', 'ZZ'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['3D4DDC224DA059CAA718E6F471585874', 'ET', 'HR', 'LT', 'MT', 'PT', 'SR'] will be ignored\n", " warnings.warn(\n", "c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\preprocessing\\_label.py:900: UserWarning: unknown class(es) ['APPLIED MECHANICS', 'BASIC MEDICINE', 'EDGE ARTIFICIAL INTELLIGENCE', 'FIXED WIRELESS NETWORK', 'ICE GIANTS', 'ORTHODONTICS', 'PERIODONTICS', 'PLANT CLONING', 'REGIONAL HUMAN RIGHTS', 'STRABISMUS'] will be ignored\n", " warnings.warn(\n", "[W 2025-05-12 22:00:45,953] Trial 3 failed with parameters: {'n_estimators': 117, 'max_depth': 9, 'learning_rate': 0.09612739086701036, 'scale_pos_weight': 9.26268599189327} because of the following error: KeyboardInterrupt().\n", "Traceback (most recent call last):\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\optuna\\study\\_optimize.py\", line 197, in _run_trial\n", " value_or_values = func(trial)\n", " ^^^^^^^^^^^\n", " File \"C:\\Users\\Romain\\AppData\\Local\\Temp\\ipykernel_43912\\262172098.py\", line 256, in objective\n", " scores = cross_val_score(pipeline, X, y, cv=StratifiedKFold(3, shuffle=True, random_state=42),\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\utils\\_param_validation.py\", line 213, in wrapper\n", " return func(*args, **kwargs)\n", " ^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\model_selection\\_validation.py\", line 712, in cross_val_score\n", " cv_results = cross_validate(\n", " ^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\utils\\_param_validation.py\", line 213, in wrapper\n", " return func(*args, **kwargs)\n", " ^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\model_selection\\_validation.py\", line 423, in cross_validate\n", " results = parallel(\n", " ^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\utils\\parallel.py\", line 74, in __call__\n", " return super().__call__(iterable_with_config)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\joblib\\parallel.py\", line 1918, in __call__\n", " return output if self.return_generator else list(output)\n", " ^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\joblib\\parallel.py\", line 1847, in _get_sequential_output\n", " res = func(*args, **kwargs)\n", " ^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\utils\\parallel.py\", line 136, in __call__\n", " return self.function(*args, **kwargs)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\model_selection\\_validation.py\", line 888, in _fit_and_score\n", " estimator.fit(X_train, y_train, **fit_params)\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\base.py\", line 1473, in wrapper\n", " return fit_method(estimator, *args, **kwargs)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\pipeline.py\", line 329, in fit\n", " Xt, yt = self._fit(X, y, routed_params)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\pipeline.py\", line 265, in _fit\n", " X, y, fitted_transformer = fit_resample_one_cached(\n", " ^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\joblib\\memory.py\", line 312, in __call__\n", " return self.func(*args, **kwargs)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\pipeline.py\", line 1057, in _fit_resample_one\n", " X_res, y_res = sampler.fit_resample(X, y, **params.get(\"fit_resample\", {}))\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\base.py\", line 208, in fit_resample\n", " return super().fit_resample(X, y)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\base.py\", line 112, in fit_resample\n", " output = self._fit_resample(X, y)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\combine\\_smote_enn.py\", line 161, in _fit_resample\n", " return self.enn_.fit_resample(X_res, y_res)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\base.py\", line 208, in fit_resample\n", " return super().fit_resample(X, y)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\base.py\", line 112, in fit_resample\n", " output = self._fit_resample(X, y)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\under_sampling\\_prototype_selection\\_edited_nearest_neighbours.py\", line 168, in _fit_resample\n", " nnhood_idx = self.nn_.kneighbors(X_class, return_distance=False)[:, 1:]\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\neighbors\\_base.py\", line 849, in kneighbors\n", " results = ArgKmin.compute(\n", " ^^^^^^^^^^^^^^^^\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\metrics\\_pairwise_distances_reduction\\_dispatcher.py\", line 278, in compute\n", " return ArgKmin64.compute(\n", " ^^^^^^^^^^^^^^^^^^\n", " File \"sklearn\\\\metrics\\\\_pairwise_distances_reduction\\\\_argkmin.pyx\", line 59, in sklearn.metrics._pairwise_distances_reduction._argkmin.ArgKmin64.compute\n", " File \"c:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\threadpoolctl.py\", line 592, in __exit__\n", " def __exit__(self, type, value, traceback):\n", " \n", "KeyboardInterrupt\n", "[W 2025-05-12 22:00:46,241] Trial 3 failed with value None.\n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[3], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m status_prediction_model(consolidated_clean\u001b[38;5;241m.\u001b[39mto_pandas())\n", "Cell \u001b[1;32mIn[2], line 261\u001b[0m, in \u001b[0;36mstatus_prediction_model\u001b[1;34m(df)\u001b[0m\n\u001b[0;32m 258\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m scores\u001b[38;5;241m.\u001b[39mmean()\n\u001b[0;32m 260\u001b[0m study \u001b[38;5;241m=\u001b[39m optuna\u001b[38;5;241m.\u001b[39mcreate_study(direction\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmaximize\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m--> 261\u001b[0m study\u001b[38;5;241m.\u001b[39moptimize(objective, n_trials\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m10\u001b[39m)\n\u001b[0;32m 262\u001b[0m best_params \u001b[38;5;241m=\u001b[39m study\u001b[38;5;241m.\u001b[39mbest_trial\u001b[38;5;241m.\u001b[39mparams\n\u001b[0;32m 263\u001b[0m base_model\u001b[38;5;241m.\u001b[39mset_params(\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mbest_params)\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\optuna\\study\\study.py:475\u001b[0m, in \u001b[0;36mStudy.optimize\u001b[1;34m(self, func, n_trials, timeout, n_jobs, catch, callbacks, gc_after_trial, show_progress_bar)\u001b[0m\n\u001b[0;32m 373\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21moptimize\u001b[39m(\n\u001b[0;32m 374\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[0;32m 375\u001b[0m func: ObjectiveFuncType,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 382\u001b[0m show_progress_bar: \u001b[38;5;28mbool\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 383\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 384\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Optimize an objective function.\u001b[39;00m\n\u001b[0;32m 385\u001b[0m \n\u001b[0;32m 386\u001b[0m \u001b[38;5;124;03m Optimization is done by choosing a suitable set of hyperparameter values from a given\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 473\u001b[0m \u001b[38;5;124;03m If nested invocation of this method occurs.\u001b[39;00m\n\u001b[0;32m 474\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 475\u001b[0m _optimize(\n\u001b[0;32m 476\u001b[0m study\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m,\n\u001b[0;32m 477\u001b[0m func\u001b[38;5;241m=\u001b[39mfunc,\n\u001b[0;32m 478\u001b[0m n_trials\u001b[38;5;241m=\u001b[39mn_trials,\n\u001b[0;32m 479\u001b[0m timeout\u001b[38;5;241m=\u001b[39mtimeout,\n\u001b[0;32m 480\u001b[0m n_jobs\u001b[38;5;241m=\u001b[39mn_jobs,\n\u001b[0;32m 481\u001b[0m catch\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mtuple\u001b[39m(catch) \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(catch, Iterable) \u001b[38;5;28;01melse\u001b[39;00m (catch,),\n\u001b[0;32m 482\u001b[0m callbacks\u001b[38;5;241m=\u001b[39mcallbacks,\n\u001b[0;32m 483\u001b[0m gc_after_trial\u001b[38;5;241m=\u001b[39mgc_after_trial,\n\u001b[0;32m 484\u001b[0m show_progress_bar\u001b[38;5;241m=\u001b[39mshow_progress_bar,\n\u001b[0;32m 485\u001b[0m )\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\optuna\\study\\_optimize.py:63\u001b[0m, in \u001b[0;36m_optimize\u001b[1;34m(study, func, n_trials, timeout, n_jobs, catch, callbacks, gc_after_trial, show_progress_bar)\u001b[0m\n\u001b[0;32m 61\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 62\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m n_jobs \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m---> 63\u001b[0m _optimize_sequential(\n\u001b[0;32m 64\u001b[0m study,\n\u001b[0;32m 65\u001b[0m func,\n\u001b[0;32m 66\u001b[0m n_trials,\n\u001b[0;32m 67\u001b[0m timeout,\n\u001b[0;32m 68\u001b[0m catch,\n\u001b[0;32m 69\u001b[0m callbacks,\n\u001b[0;32m 70\u001b[0m gc_after_trial,\n\u001b[0;32m 71\u001b[0m reseed_sampler_rng\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 72\u001b[0m time_start\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m 73\u001b[0m progress_bar\u001b[38;5;241m=\u001b[39mprogress_bar,\n\u001b[0;32m 74\u001b[0m )\n\u001b[0;32m 75\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 76\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m n_jobs \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m:\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\optuna\\study\\_optimize.py:160\u001b[0m, in \u001b[0;36m_optimize_sequential\u001b[1;34m(study, func, n_trials, timeout, catch, callbacks, gc_after_trial, reseed_sampler_rng, time_start, progress_bar)\u001b[0m\n\u001b[0;32m 157\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[0;32m 159\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 160\u001b[0m frozen_trial \u001b[38;5;241m=\u001b[39m _run_trial(study, func, catch)\n\u001b[0;32m 161\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 162\u001b[0m \u001b[38;5;66;03m# The following line mitigates memory problems that can be occurred in some\u001b[39;00m\n\u001b[0;32m 163\u001b[0m \u001b[38;5;66;03m# environments (e.g., services that use computing containers such as GitHub Actions).\u001b[39;00m\n\u001b[0;32m 164\u001b[0m \u001b[38;5;66;03m# Please refer to the following PR for further details:\u001b[39;00m\n\u001b[0;32m 165\u001b[0m \u001b[38;5;66;03m# https://github.com/optuna/optuna/pull/325.\u001b[39;00m\n\u001b[0;32m 166\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m gc_after_trial:\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\optuna\\study\\_optimize.py:248\u001b[0m, in \u001b[0;36m_run_trial\u001b[1;34m(study, func, catch)\u001b[0m\n\u001b[0;32m 241\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mShould not reach.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 243\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[0;32m 244\u001b[0m frozen_trial\u001b[38;5;241m.\u001b[39mstate \u001b[38;5;241m==\u001b[39m TrialState\u001b[38;5;241m.\u001b[39mFAIL\n\u001b[0;32m 245\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m func_err \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 246\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(func_err, catch)\n\u001b[0;32m 247\u001b[0m ):\n\u001b[1;32m--> 248\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m func_err\n\u001b[0;32m 249\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m frozen_trial\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\optuna\\study\\_optimize.py:197\u001b[0m, in \u001b[0;36m_run_trial\u001b[1;34m(study, func, catch)\u001b[0m\n\u001b[0;32m 195\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m get_heartbeat_thread(trial\u001b[38;5;241m.\u001b[39m_trial_id, study\u001b[38;5;241m.\u001b[39m_storage):\n\u001b[0;32m 196\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 197\u001b[0m value_or_values \u001b[38;5;241m=\u001b[39m func(trial)\n\u001b[0;32m 198\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m exceptions\u001b[38;5;241m.\u001b[39mTrialPruned \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m 199\u001b[0m \u001b[38;5;66;03m# TODO(mamu): Handle multi-objective cases.\u001b[39;00m\n\u001b[0;32m 200\u001b[0m state \u001b[38;5;241m=\u001b[39m TrialState\u001b[38;5;241m.\u001b[39mPRUNED\n", "Cell \u001b[1;32mIn[2], line 256\u001b[0m, in \u001b[0;36mstatus_prediction_model..objective\u001b[1;34m(trial)\u001b[0m\n\u001b[0;32m 254\u001b[0m base_model\u001b[38;5;241m.\u001b[39mset_params(\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams)\n\u001b[0;32m 255\u001b[0m pipeline \u001b[38;5;241m=\u001b[39m build_pipeline(preprocessor, base_model)\n\u001b[1;32m--> 256\u001b[0m scores \u001b[38;5;241m=\u001b[39m cross_val_score(pipeline, X, y, cv\u001b[38;5;241m=\u001b[39mStratifiedKFold(\u001b[38;5;241m3\u001b[39m, shuffle\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m, random_state\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m42\u001b[39m),\n\u001b[0;32m 257\u001b[0m scoring\u001b[38;5;241m=\u001b[39mmake_scorer(f1_score, pos_label\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m))\n\u001b[0;32m 258\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m scores\u001b[38;5;241m.\u001b[39mmean()\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\utils\\_param_validation.py:213\u001b[0m, in \u001b[0;36mvalidate_params..decorator..wrapper\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 207\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 208\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m config_context(\n\u001b[0;32m 209\u001b[0m skip_parameter_validation\u001b[38;5;241m=\u001b[39m(\n\u001b[0;32m 210\u001b[0m prefer_skip_nested_validation \u001b[38;5;129;01mor\u001b[39;00m global_skip_validation\n\u001b[0;32m 211\u001b[0m )\n\u001b[0;32m 212\u001b[0m ):\n\u001b[1;32m--> 213\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m func(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 214\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m InvalidParameterError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m 215\u001b[0m \u001b[38;5;66;03m# When the function is just a wrapper around an estimator, we allow\u001b[39;00m\n\u001b[0;32m 216\u001b[0m \u001b[38;5;66;03m# the function to delegate validation to the estimator, but we replace\u001b[39;00m\n\u001b[0;32m 217\u001b[0m \u001b[38;5;66;03m# the name of the estimator by the name of the function in the error\u001b[39;00m\n\u001b[0;32m 218\u001b[0m \u001b[38;5;66;03m# message to avoid confusion.\u001b[39;00m\n\u001b[0;32m 219\u001b[0m msg \u001b[38;5;241m=\u001b[39m re\u001b[38;5;241m.\u001b[39msub(\n\u001b[0;32m 220\u001b[0m \u001b[38;5;124mr\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mparameter of \u001b[39m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124mw+ must be\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m 221\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mparameter of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfunc\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__qualname__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m must be\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m 222\u001b[0m \u001b[38;5;28mstr\u001b[39m(e),\n\u001b[0;32m 223\u001b[0m )\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\model_selection\\_validation.py:712\u001b[0m, in \u001b[0;36mcross_val_score\u001b[1;34m(estimator, X, y, groups, scoring, cv, n_jobs, verbose, fit_params, params, pre_dispatch, error_score)\u001b[0m\n\u001b[0;32m 709\u001b[0m \u001b[38;5;66;03m# To ensure multimetric format is not supported\u001b[39;00m\n\u001b[0;32m 710\u001b[0m scorer \u001b[38;5;241m=\u001b[39m check_scoring(estimator, scoring\u001b[38;5;241m=\u001b[39mscoring)\n\u001b[1;32m--> 712\u001b[0m cv_results \u001b[38;5;241m=\u001b[39m cross_validate(\n\u001b[0;32m 713\u001b[0m estimator\u001b[38;5;241m=\u001b[39mestimator,\n\u001b[0;32m 714\u001b[0m X\u001b[38;5;241m=\u001b[39mX,\n\u001b[0;32m 715\u001b[0m y\u001b[38;5;241m=\u001b[39my,\n\u001b[0;32m 716\u001b[0m groups\u001b[38;5;241m=\u001b[39mgroups,\n\u001b[0;32m 717\u001b[0m scoring\u001b[38;5;241m=\u001b[39m{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mscore\u001b[39m\u001b[38;5;124m\"\u001b[39m: scorer},\n\u001b[0;32m 718\u001b[0m cv\u001b[38;5;241m=\u001b[39mcv,\n\u001b[0;32m 719\u001b[0m n_jobs\u001b[38;5;241m=\u001b[39mn_jobs,\n\u001b[0;32m 720\u001b[0m verbose\u001b[38;5;241m=\u001b[39mverbose,\n\u001b[0;32m 721\u001b[0m fit_params\u001b[38;5;241m=\u001b[39mfit_params,\n\u001b[0;32m 722\u001b[0m params\u001b[38;5;241m=\u001b[39mparams,\n\u001b[0;32m 723\u001b[0m pre_dispatch\u001b[38;5;241m=\u001b[39mpre_dispatch,\n\u001b[0;32m 724\u001b[0m error_score\u001b[38;5;241m=\u001b[39merror_score,\n\u001b[0;32m 725\u001b[0m )\n\u001b[0;32m 726\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m cv_results[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtest_score\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\utils\\_param_validation.py:213\u001b[0m, in \u001b[0;36mvalidate_params..decorator..wrapper\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 207\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 208\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m config_context(\n\u001b[0;32m 209\u001b[0m skip_parameter_validation\u001b[38;5;241m=\u001b[39m(\n\u001b[0;32m 210\u001b[0m prefer_skip_nested_validation \u001b[38;5;129;01mor\u001b[39;00m global_skip_validation\n\u001b[0;32m 211\u001b[0m )\n\u001b[0;32m 212\u001b[0m ):\n\u001b[1;32m--> 213\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m func(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 214\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m InvalidParameterError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m 215\u001b[0m \u001b[38;5;66;03m# When the function is just a wrapper around an estimator, we allow\u001b[39;00m\n\u001b[0;32m 216\u001b[0m \u001b[38;5;66;03m# the function to delegate validation to the estimator, but we replace\u001b[39;00m\n\u001b[0;32m 217\u001b[0m \u001b[38;5;66;03m# the name of the estimator by the name of the function in the error\u001b[39;00m\n\u001b[0;32m 218\u001b[0m \u001b[38;5;66;03m# message to avoid confusion.\u001b[39;00m\n\u001b[0;32m 219\u001b[0m msg \u001b[38;5;241m=\u001b[39m re\u001b[38;5;241m.\u001b[39msub(\n\u001b[0;32m 220\u001b[0m \u001b[38;5;124mr\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mparameter of \u001b[39m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124mw+ must be\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m 221\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mparameter of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfunc\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__qualname__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m must be\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m 222\u001b[0m \u001b[38;5;28mstr\u001b[39m(e),\n\u001b[0;32m 223\u001b[0m )\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\model_selection\\_validation.py:423\u001b[0m, in \u001b[0;36mcross_validate\u001b[1;34m(estimator, X, y, groups, scoring, cv, n_jobs, verbose, fit_params, params, pre_dispatch, return_train_score, return_estimator, return_indices, error_score)\u001b[0m\n\u001b[0;32m 420\u001b[0m \u001b[38;5;66;03m# We clone the estimator to make sure that all the folds are\u001b[39;00m\n\u001b[0;32m 421\u001b[0m \u001b[38;5;66;03m# independent, and that it is pickle-able.\u001b[39;00m\n\u001b[0;32m 422\u001b[0m parallel \u001b[38;5;241m=\u001b[39m Parallel(n_jobs\u001b[38;5;241m=\u001b[39mn_jobs, verbose\u001b[38;5;241m=\u001b[39mverbose, pre_dispatch\u001b[38;5;241m=\u001b[39mpre_dispatch)\n\u001b[1;32m--> 423\u001b[0m results \u001b[38;5;241m=\u001b[39m parallel(\n\u001b[0;32m 424\u001b[0m delayed(_fit_and_score)(\n\u001b[0;32m 425\u001b[0m clone(estimator),\n\u001b[0;32m 426\u001b[0m X,\n\u001b[0;32m 427\u001b[0m y,\n\u001b[0;32m 428\u001b[0m scorer\u001b[38;5;241m=\u001b[39mscorers,\n\u001b[0;32m 429\u001b[0m train\u001b[38;5;241m=\u001b[39mtrain,\n\u001b[0;32m 430\u001b[0m test\u001b[38;5;241m=\u001b[39mtest,\n\u001b[0;32m 431\u001b[0m verbose\u001b[38;5;241m=\u001b[39mverbose,\n\u001b[0;32m 432\u001b[0m parameters\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m 433\u001b[0m fit_params\u001b[38;5;241m=\u001b[39mrouted_params\u001b[38;5;241m.\u001b[39mestimator\u001b[38;5;241m.\u001b[39mfit,\n\u001b[0;32m 434\u001b[0m score_params\u001b[38;5;241m=\u001b[39mrouted_params\u001b[38;5;241m.\u001b[39mscorer\u001b[38;5;241m.\u001b[39mscore,\n\u001b[0;32m 435\u001b[0m return_train_score\u001b[38;5;241m=\u001b[39mreturn_train_score,\n\u001b[0;32m 436\u001b[0m return_times\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[0;32m 437\u001b[0m return_estimator\u001b[38;5;241m=\u001b[39mreturn_estimator,\n\u001b[0;32m 438\u001b[0m error_score\u001b[38;5;241m=\u001b[39merror_score,\n\u001b[0;32m 439\u001b[0m )\n\u001b[0;32m 440\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m train, test \u001b[38;5;129;01min\u001b[39;00m indices\n\u001b[0;32m 441\u001b[0m )\n\u001b[0;32m 443\u001b[0m _warn_or_raise_about_fit_failures(results, error_score)\n\u001b[0;32m 445\u001b[0m \u001b[38;5;66;03m# For callable scoring, the return type is only know after calling. If the\u001b[39;00m\n\u001b[0;32m 446\u001b[0m \u001b[38;5;66;03m# return type is a dictionary, the error scores can now be inserted with\u001b[39;00m\n\u001b[0;32m 447\u001b[0m \u001b[38;5;66;03m# the correct key.\u001b[39;00m\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\utils\\parallel.py:74\u001b[0m, in \u001b[0;36mParallel.__call__\u001b[1;34m(self, iterable)\u001b[0m\n\u001b[0;32m 69\u001b[0m config \u001b[38;5;241m=\u001b[39m get_config()\n\u001b[0;32m 70\u001b[0m iterable_with_config \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m 71\u001b[0m (_with_config(delayed_func, config), args, kwargs)\n\u001b[0;32m 72\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m delayed_func, args, kwargs \u001b[38;5;129;01min\u001b[39;00m iterable\n\u001b[0;32m 73\u001b[0m )\n\u001b[1;32m---> 74\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__call__\u001b[39m(iterable_with_config)\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\joblib\\parallel.py:1918\u001b[0m, in \u001b[0;36mParallel.__call__\u001b[1;34m(self, iterable)\u001b[0m\n\u001b[0;32m 1916\u001b[0m output \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_sequential_output(iterable)\n\u001b[0;32m 1917\u001b[0m \u001b[38;5;28mnext\u001b[39m(output)\n\u001b[1;32m-> 1918\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m output \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mreturn_generator \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28mlist\u001b[39m(output)\n\u001b[0;32m 1920\u001b[0m \u001b[38;5;66;03m# Let's create an ID that uniquely identifies the current call. If the\u001b[39;00m\n\u001b[0;32m 1921\u001b[0m \u001b[38;5;66;03m# call is interrupted early and that the same instance is immediately\u001b[39;00m\n\u001b[0;32m 1922\u001b[0m \u001b[38;5;66;03m# re-used, this id will be used to prevent workers that were\u001b[39;00m\n\u001b[0;32m 1923\u001b[0m \u001b[38;5;66;03m# concurrently finalizing a task from the previous call to run the\u001b[39;00m\n\u001b[0;32m 1924\u001b[0m \u001b[38;5;66;03m# callback.\u001b[39;00m\n\u001b[0;32m 1925\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_lock:\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\joblib\\parallel.py:1847\u001b[0m, in \u001b[0;36mParallel._get_sequential_output\u001b[1;34m(self, iterable)\u001b[0m\n\u001b[0;32m 1845\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_dispatched_batches \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[0;32m 1846\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_dispatched_tasks \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[1;32m-> 1847\u001b[0m res \u001b[38;5;241m=\u001b[39m func(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 1848\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_completed_tasks \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[0;32m 1849\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprint_progress()\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\utils\\parallel.py:136\u001b[0m, in \u001b[0;36m_FuncWrapper.__call__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 134\u001b[0m config \u001b[38;5;241m=\u001b[39m {}\n\u001b[0;32m 135\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m config_context(\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mconfig):\n\u001b[1;32m--> 136\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfunction(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\model_selection\\_validation.py:888\u001b[0m, in \u001b[0;36m_fit_and_score\u001b[1;34m(estimator, X, y, scorer, train, test, verbose, parameters, fit_params, score_params, return_train_score, return_parameters, return_n_test_samples, return_times, return_estimator, split_progress, candidate_progress, error_score)\u001b[0m\n\u001b[0;32m 886\u001b[0m estimator\u001b[38;5;241m.\u001b[39mfit(X_train, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mfit_params)\n\u001b[0;32m 887\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 888\u001b[0m estimator\u001b[38;5;241m.\u001b[39mfit(X_train, y_train, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mfit_params)\n\u001b[0;32m 890\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[0;32m 891\u001b[0m \u001b[38;5;66;03m# Note fit time as time until error\u001b[39;00m\n\u001b[0;32m 892\u001b[0m fit_time \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime() \u001b[38;5;241m-\u001b[39m start_time\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\base.py:1473\u001b[0m, in \u001b[0;36m_fit_context..decorator..wrapper\u001b[1;34m(estimator, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1466\u001b[0m estimator\u001b[38;5;241m.\u001b[39m_validate_params()\n\u001b[0;32m 1468\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m config_context(\n\u001b[0;32m 1469\u001b[0m skip_parameter_validation\u001b[38;5;241m=\u001b[39m(\n\u001b[0;32m 1470\u001b[0m prefer_skip_nested_validation \u001b[38;5;129;01mor\u001b[39;00m global_skip_validation\n\u001b[0;32m 1471\u001b[0m )\n\u001b[0;32m 1472\u001b[0m ):\n\u001b[1;32m-> 1473\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m fit_method(estimator, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\pipeline.py:329\u001b[0m, in \u001b[0;36mPipeline.fit\u001b[1;34m(self, X, y, **params)\u001b[0m\n\u001b[0;32m 285\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Fit the model.\u001b[39;00m\n\u001b[0;32m 286\u001b[0m \n\u001b[0;32m 287\u001b[0m \u001b[38;5;124;03mFit all the transforms/samplers one after the other and\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 326\u001b[0m \u001b[38;5;124;03m This estimator.\u001b[39;00m\n\u001b[0;32m 327\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 328\u001b[0m routed_params \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_check_method_params(method\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfit\u001b[39m\u001b[38;5;124m\"\u001b[39m, props\u001b[38;5;241m=\u001b[39mparams)\n\u001b[1;32m--> 329\u001b[0m Xt, yt \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_fit(X, y, routed_params)\n\u001b[0;32m 330\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m _print_elapsed_time(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPipeline\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_log_message(\u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msteps) \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m)):\n\u001b[0;32m 331\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_final_estimator \u001b[38;5;241m!=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpassthrough\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\pipeline.py:265\u001b[0m, in \u001b[0;36mPipeline._fit\u001b[1;34m(self, X, y, routed_params)\u001b[0m\n\u001b[0;32m 255\u001b[0m X, fitted_transformer \u001b[38;5;241m=\u001b[39m fit_transform_one_cached(\n\u001b[0;32m 256\u001b[0m cloned_transformer,\n\u001b[0;32m 257\u001b[0m X,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 262\u001b[0m params\u001b[38;5;241m=\u001b[39mrouted_params[name],\n\u001b[0;32m 263\u001b[0m )\n\u001b[0;32m 264\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(cloned_transformer, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfit_resample\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m--> 265\u001b[0m X, y, fitted_transformer \u001b[38;5;241m=\u001b[39m fit_resample_one_cached(\n\u001b[0;32m 266\u001b[0m cloned_transformer,\n\u001b[0;32m 267\u001b[0m X,\n\u001b[0;32m 268\u001b[0m y,\n\u001b[0;32m 269\u001b[0m message_clsname\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPipeline\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m 270\u001b[0m message\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_log_message(step_idx),\n\u001b[0;32m 271\u001b[0m params\u001b[38;5;241m=\u001b[39mrouted_params[name],\n\u001b[0;32m 272\u001b[0m )\n\u001b[0;32m 273\u001b[0m \u001b[38;5;66;03m# Replace the transformer of the step with the fitted\u001b[39;00m\n\u001b[0;32m 274\u001b[0m \u001b[38;5;66;03m# transformer. This is necessary when loading the transformer\u001b[39;00m\n\u001b[0;32m 275\u001b[0m \u001b[38;5;66;03m# from the cache.\u001b[39;00m\n\u001b[0;32m 276\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msteps[step_idx] \u001b[38;5;241m=\u001b[39m (name, fitted_transformer)\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\joblib\\memory.py:312\u001b[0m, in \u001b[0;36mNotMemorizedFunc.__call__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 311\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m--> 312\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfunc(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\pipeline.py:1057\u001b[0m, in \u001b[0;36m_fit_resample_one\u001b[1;34m(sampler, X, y, message_clsname, message, params)\u001b[0m\n\u001b[0;32m 1055\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_fit_resample_one\u001b[39m(sampler, X, y, message_clsname\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m, message\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, params\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[0;32m 1056\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m _print_elapsed_time(message_clsname, message):\n\u001b[1;32m-> 1057\u001b[0m X_res, y_res \u001b[38;5;241m=\u001b[39m sampler\u001b[38;5;241m.\u001b[39mfit_resample(X, y, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfit_resample\u001b[39m\u001b[38;5;124m\"\u001b[39m, {}))\n\u001b[0;32m 1059\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m X_res, y_res, sampler\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\base.py:208\u001b[0m, in \u001b[0;36mBaseSampler.fit_resample\u001b[1;34m(self, X, y)\u001b[0m\n\u001b[0;32m 187\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Resample the dataset.\u001b[39;00m\n\u001b[0;32m 188\u001b[0m \n\u001b[0;32m 189\u001b[0m \u001b[38;5;124;03mParameters\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 205\u001b[0m \u001b[38;5;124;03m The corresponding label of `X_resampled`.\u001b[39;00m\n\u001b[0;32m 206\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 207\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_validate_params()\n\u001b[1;32m--> 208\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39mfit_resample(X, y)\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\base.py:112\u001b[0m, in \u001b[0;36mSamplerMixin.fit_resample\u001b[1;34m(self, X, y)\u001b[0m\n\u001b[0;32m 106\u001b[0m X, y, binarize_y \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_check_X_y(X, y)\n\u001b[0;32m 108\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msampling_strategy_ \u001b[38;5;241m=\u001b[39m check_sampling_strategy(\n\u001b[0;32m 109\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msampling_strategy, y, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_sampling_type\n\u001b[0;32m 110\u001b[0m )\n\u001b[1;32m--> 112\u001b[0m output \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_fit_resample(X, y)\n\u001b[0;32m 114\u001b[0m y_ \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m 115\u001b[0m label_binarize(output[\u001b[38;5;241m1\u001b[39m], classes\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39munique(y)) \u001b[38;5;28;01mif\u001b[39;00m binarize_y \u001b[38;5;28;01melse\u001b[39;00m output[\u001b[38;5;241m1\u001b[39m]\n\u001b[0;32m 116\u001b[0m )\n\u001b[0;32m 118\u001b[0m X_, y_ \u001b[38;5;241m=\u001b[39m arrays_transformer\u001b[38;5;241m.\u001b[39mtransform(output[\u001b[38;5;241m0\u001b[39m], y_)\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\combine\\_smote_enn.py:161\u001b[0m, in \u001b[0;36mSMOTEENN._fit_resample\u001b[1;34m(self, X, y)\u001b[0m\n\u001b[0;32m 158\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msampling_strategy_ \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msampling_strategy\n\u001b[0;32m 160\u001b[0m X_res, y_res \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msmote_\u001b[38;5;241m.\u001b[39mfit_resample(X, y)\n\u001b[1;32m--> 161\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39menn_\u001b[38;5;241m.\u001b[39mfit_resample(X_res, y_res)\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\base.py:208\u001b[0m, in \u001b[0;36mBaseSampler.fit_resample\u001b[1;34m(self, X, y)\u001b[0m\n\u001b[0;32m 187\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Resample the dataset.\u001b[39;00m\n\u001b[0;32m 188\u001b[0m \n\u001b[0;32m 189\u001b[0m \u001b[38;5;124;03mParameters\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 205\u001b[0m \u001b[38;5;124;03m The corresponding label of `X_resampled`.\u001b[39;00m\n\u001b[0;32m 206\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 207\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_validate_params()\n\u001b[1;32m--> 208\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39mfit_resample(X, y)\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\base.py:112\u001b[0m, in \u001b[0;36mSamplerMixin.fit_resample\u001b[1;34m(self, X, y)\u001b[0m\n\u001b[0;32m 106\u001b[0m X, y, binarize_y \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_check_X_y(X, y)\n\u001b[0;32m 108\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msampling_strategy_ \u001b[38;5;241m=\u001b[39m check_sampling_strategy(\n\u001b[0;32m 109\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msampling_strategy, y, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_sampling_type\n\u001b[0;32m 110\u001b[0m )\n\u001b[1;32m--> 112\u001b[0m output \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_fit_resample(X, y)\n\u001b[0;32m 114\u001b[0m y_ \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m 115\u001b[0m label_binarize(output[\u001b[38;5;241m1\u001b[39m], classes\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39munique(y)) \u001b[38;5;28;01mif\u001b[39;00m binarize_y \u001b[38;5;28;01melse\u001b[39;00m output[\u001b[38;5;241m1\u001b[39m]\n\u001b[0;32m 116\u001b[0m )\n\u001b[0;32m 118\u001b[0m X_, y_ \u001b[38;5;241m=\u001b[39m arrays_transformer\u001b[38;5;241m.\u001b[39mtransform(output[\u001b[38;5;241m0\u001b[39m], y_)\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\imblearn\\under_sampling\\_prototype_selection\\_edited_nearest_neighbours.py:168\u001b[0m, in \u001b[0;36mEditedNearestNeighbours._fit_resample\u001b[1;34m(self, X, y)\u001b[0m\n\u001b[0;32m 166\u001b[0m X_class \u001b[38;5;241m=\u001b[39m _safe_indexing(X, target_class_indices)\n\u001b[0;32m 167\u001b[0m y_class \u001b[38;5;241m=\u001b[39m _safe_indexing(y, target_class_indices)\n\u001b[1;32m--> 168\u001b[0m nnhood_idx \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnn_\u001b[38;5;241m.\u001b[39mkneighbors(X_class, return_distance\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)[:, \u001b[38;5;241m1\u001b[39m:]\n\u001b[0;32m 169\u001b[0m nnhood_label \u001b[38;5;241m=\u001b[39m y[nnhood_idx]\n\u001b[0;32m 170\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkind_sel \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmode\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\neighbors\\_base.py:849\u001b[0m, in \u001b[0;36mKNeighborsMixin.kneighbors\u001b[1;34m(self, X, n_neighbors, return_distance)\u001b[0m\n\u001b[0;32m 842\u001b[0m use_pairwise_distances_reductions \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m 843\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_fit_method \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbrute\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 844\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m ArgKmin\u001b[38;5;241m.\u001b[39mis_usable_for(\n\u001b[0;32m 845\u001b[0m X \u001b[38;5;28;01mif\u001b[39;00m X \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_fit_X, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_fit_X, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39meffective_metric_\n\u001b[0;32m 846\u001b[0m )\n\u001b[0;32m 847\u001b[0m )\n\u001b[0;32m 848\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m use_pairwise_distances_reductions:\n\u001b[1;32m--> 849\u001b[0m results \u001b[38;5;241m=\u001b[39m ArgKmin\u001b[38;5;241m.\u001b[39mcompute(\n\u001b[0;32m 850\u001b[0m X\u001b[38;5;241m=\u001b[39mX,\n\u001b[0;32m 851\u001b[0m Y\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_fit_X,\n\u001b[0;32m 852\u001b[0m k\u001b[38;5;241m=\u001b[39mn_neighbors,\n\u001b[0;32m 853\u001b[0m metric\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39meffective_metric_,\n\u001b[0;32m 854\u001b[0m metric_kwargs\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39meffective_metric_params_,\n\u001b[0;32m 855\u001b[0m strategy\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mauto\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m 856\u001b[0m return_distance\u001b[38;5;241m=\u001b[39mreturn_distance,\n\u001b[0;32m 857\u001b[0m )\n\u001b[0;32m 859\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m (\n\u001b[0;32m 860\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_fit_method \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbrute\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmetric \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mprecomputed\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m issparse(X)\n\u001b[0;32m 861\u001b[0m ):\n\u001b[0;32m 862\u001b[0m results \u001b[38;5;241m=\u001b[39m _kneighbors_from_graph(\n\u001b[0;32m 863\u001b[0m X, n_neighbors\u001b[38;5;241m=\u001b[39mn_neighbors, return_distance\u001b[38;5;241m=\u001b[39mreturn_distance\n\u001b[0;32m 864\u001b[0m )\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\sklearn\\metrics\\_pairwise_distances_reduction\\_dispatcher.py:278\u001b[0m, in \u001b[0;36mArgKmin.compute\u001b[1;34m(cls, X, Y, k, metric, chunk_size, metric_kwargs, strategy, return_distance)\u001b[0m\n\u001b[0;32m 197\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Compute the argkmin reduction.\u001b[39;00m\n\u001b[0;32m 198\u001b[0m \n\u001b[0;32m 199\u001b[0m \u001b[38;5;124;03mParameters\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 275\u001b[0m \u001b[38;5;124;03mreturns.\u001b[39;00m\n\u001b[0;32m 276\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 277\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m X\u001b[38;5;241m.\u001b[39mdtype \u001b[38;5;241m==\u001b[39m Y\u001b[38;5;241m.\u001b[39mdtype \u001b[38;5;241m==\u001b[39m np\u001b[38;5;241m.\u001b[39mfloat64:\n\u001b[1;32m--> 278\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ArgKmin64\u001b[38;5;241m.\u001b[39mcompute(\n\u001b[0;32m 279\u001b[0m X\u001b[38;5;241m=\u001b[39mX,\n\u001b[0;32m 280\u001b[0m Y\u001b[38;5;241m=\u001b[39mY,\n\u001b[0;32m 281\u001b[0m k\u001b[38;5;241m=\u001b[39mk,\n\u001b[0;32m 282\u001b[0m metric\u001b[38;5;241m=\u001b[39mmetric,\n\u001b[0;32m 283\u001b[0m chunk_size\u001b[38;5;241m=\u001b[39mchunk_size,\n\u001b[0;32m 284\u001b[0m metric_kwargs\u001b[38;5;241m=\u001b[39mmetric_kwargs,\n\u001b[0;32m 285\u001b[0m strategy\u001b[38;5;241m=\u001b[39mstrategy,\n\u001b[0;32m 286\u001b[0m return_distance\u001b[38;5;241m=\u001b[39mreturn_distance,\n\u001b[0;32m 287\u001b[0m )\n\u001b[0;32m 289\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m X\u001b[38;5;241m.\u001b[39mdtype \u001b[38;5;241m==\u001b[39m Y\u001b[38;5;241m.\u001b[39mdtype \u001b[38;5;241m==\u001b[39m np\u001b[38;5;241m.\u001b[39mfloat32:\n\u001b[0;32m 290\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ArgKmin32\u001b[38;5;241m.\u001b[39mcompute(\n\u001b[0;32m 291\u001b[0m X\u001b[38;5;241m=\u001b[39mX,\n\u001b[0;32m 292\u001b[0m Y\u001b[38;5;241m=\u001b[39mY,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 298\u001b[0m return_distance\u001b[38;5;241m=\u001b[39mreturn_distance,\n\u001b[0;32m 299\u001b[0m )\n", "File \u001b[1;32msklearn\\\\metrics\\\\_pairwise_distances_reduction\\\\_argkmin.pyx:59\u001b[0m, in \u001b[0;36msklearn.metrics._pairwise_distances_reduction._argkmin.ArgKmin64.compute\u001b[1;34m()\u001b[0m\n", "File \u001b[1;32mc:\\Users\\Romain\\anaconda3\\Lib\\site-packages\\threadpoolctl.py:592\u001b[0m, in \u001b[0;36m_ThreadpoolLimiter.__exit__\u001b[1;34m(self, type, value, traceback)\u001b[0m\n\u001b[0;32m 589\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__enter__\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m 590\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\n\u001b[1;32m--> 592\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__exit__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;28mtype\u001b[39m, value, traceback):\n\u001b[0;32m 593\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrestore_original_limits()\n\u001b[0;32m 595\u001b[0m \u001b[38;5;129m@classmethod\u001b[39m\n\u001b[0;32m 596\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrap\u001b[39m(\u001b[38;5;28mcls\u001b[39m, controller, \u001b[38;5;241m*\u001b[39m, limits\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, user_api\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n", "\u001b[1;31mKeyboardInterrupt\u001b[0m: " ] }, { "ename": "", "evalue": "", "output_type": "error", "traceback": [ "\u001b[1;31mFailed to interrupt the Kernel. \n", "\u001b[1;31mUnable to start Kernel 'base (Python 3.12.7)' due to a timeout waiting for the ports to get used. \n", "\u001b[1;31mView Jupyter log for further details." ] } ], "source": [ "status_prediction_model(consolidated_clean.to_pandas())" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import os\n", "import json\n", "import joblib\n", "import numpy as np\n", "import pandas as pd\n", "import shap\n", "import matplotlib.pyplot as plt\n", "import scipy.sparse\n", "\n", "from sklearn.base import BaseEstimator, TransformerMixin\n", "from sklearn.pipeline import Pipeline as SKPipeline\n", "from sklearn.compose import ColumnTransformer\n", "from sklearn.preprocessing import OneHotEncoder, StandardScaler, MultiLabelBinarizer\n", "from sklearn.impute import SimpleImputer\n", "from sklearn.model_selection import train_test_split, cross_val_score, StratifiedKFold\n", "from sklearn.feature_selection import SelectKBest, f_classif, VarianceThreshold\n", "from sklearn.metrics import classification_report, ConfusionMatrixDisplay, f1_score, make_scorer\n", "from sklearn.decomposition import TruncatedSVD\n", "from sklearn.calibration import CalibratedClassifierCV\n", "from sklearn.ensemble import IsolationForest\n", "\n", "from imblearn.pipeline import Pipeline as ImbPipeline\n", "from imblearn.combine import SMOTEENN\n", "\n", "from sentence_transformers import SentenceTransformer\n", "from xgboost import XGBClassifier\n", "\n", "from evidently import Report\n", "from evidently.presets import DataDriftPreset\n", "\n", "import optuna\n", "\n", "\n", "# --- Custom Transformers ---\n", "class MultiLabelBinarizerTransformer(BaseEstimator, TransformerMixin):\n", " def fit(self, X,y=None):\n", " self.col = X.name\n", " self.mlb = MultiLabelBinarizer()\n", " self.mlb.fit(X)\n", " return self\n", " def transform(self, X):\n", " return self.mlb.transform(X)\n", " def get_feature_names_out(self, input_features=None):\n", " return [f\"{self.col}_{cls}\" for cls in self.mlb.classes_]\n", " def get_params(self, deep=True):\n", " return {}\n", " def set_params(self, **params):\n", " return self\n", "\n", "class AnomalyScoreTransformer(BaseEstimator, TransformerMixin):\n", " def __init__(self):\n", " self.model = IsolationForest(n_estimators=200, contamination=0.1, random_state=42)\n", "\n", " def fit(self, X, y=None):\n", " self.model.fit(X)\n", " return self\n", "\n", " def transform(self, X):\n", " scores = -self.model.decision_function(X)\n", " return np.hstack([X, scores.reshape(-1, 1)])\n", "\n", "# --- Step 1: Data Preparation ---\n", "def prepare_data(df, is_train=True, model_dir=\"model_artifacts\"):\n", " df = df.copy()\n", " \n", " if is_train:\n", " df['status'] = df['status'].astype(str).str.upper()\n", " df = df[df['status'].isin(['CLOSED', 'TERMINATED'])]\n", " df['label'] = df['status'].map({'CLOSED': 0, 'TERMINATED': 1})\n", " assert df['label'].notna().all(), \"Label column still has NaNs!\"\n", "\n", " multilabel_fields = [\n", " 'list_country', 'list_activityType', 'list_deliverableType',\n", " 'list_availableLanguages', 'list_euroSciVocTitle'\n", " ]\n", "\n", " def extract_intermediate_levels(paths):\n", " tokens = []\n", " if isinstance(paths, list):\n", " for p in paths:\n", " parts = p.strip('/').split('/')\n", " tokens.extend(parts[:-1])\n", " return list(set(tokens))\n", " df['euroSciVoc_intermediate'] = df['list_euroSciVocPath'].apply(extract_intermediate_levels)\n", " multilabel_fields.append('euroSciVoc_intermediate')\n", " \n", " for col in multilabel_fields:\n", " df[col] = df[col].apply(lambda x: [] if x is None else (x.tolist() if hasattr(x, 'tolist') else x))\n", " df[col] = df[col].apply(lambda x: list(x) if not isinstance(x, list) else x)\n", " df[col] = df[col].apply(lambda x: [item for item in x if item is not None])\n", " df[col] = df[col].apply(lambda x: [str(item).upper() for item in x])\n", "\n", " \n", " def split_languages(lang_list):\n", " if not isinstance(lang_list, list):\n", " return []\n", " result = []\n", " for entry in lang_list:\n", " if isinstance(entry, str):\n", " result.extend(entry.split(\",\"))\n", " return result\n", "\n", " df[\"list_availableLanguages\"] = df[\"list_availableLanguages\"].apply(split_languages)\n", " \n", " df['topic_title'] = df['list_title_topic'].apply(\n", " lambda x: (x.tolist() if hasattr(x, 'tolist') else x)[0] if x is not None and len(x) > 0 else \"unknown_topic\"\n", " )\n", "\n", " for col in ['title', 'objective', 'topic_title']:\n", " df[col] = df[col].fillna(\"\").astype(str)\n", "\n", " df['n_partners'] = df['list_name'].apply(\n", " lambda x: len(x.tolist()) if x is not None and hasattr(x, 'tolist') else (len(x) if isinstance(x, list) else 0)\n", " )\n", "\n", " df['n_country'] = df['list_country'].apply(\n", " lambda x: len(x.tolist()) if x is not None and hasattr(x, 'tolist') else (len(x) if isinstance(x, list) else 0)\n", " )\n", "\n", " df['n_sme'] = df['list_SME'].apply(\n", " lambda x: sum(1 for i in (x.tolist() if hasattr(x, 'tolist') else x) if i is True)\n", " if x is not None and (hasattr(x, 'tolist') or isinstance(x, list)) else 0\n", " )\n", "\n", " return df\n", "\n", "# --- Step 2: Text Embedding ---\n", "def compute_embeddings(df, text_columns, model_name='paraphrase-multilingual-MiniLM-L12-v2', svd_dim=50):\n", " model = SentenceTransformer(model_name)\n", " os.makedirs(\"model_artifacts\", exist_ok=True)\n", " os.makedirs(\"embeddings\", exist_ok=True)\n", " for col in text_columns:\n", " embedding_file = f\"embeddings/{col}_embeddings.npy\"\n", " svd_file = f\"model_artifacts/{col}_svd.pkl\"\n", " if os.path.exists(embedding_file):\n", " print(f\"Loading saved embeddings for column '{col}'...\")\n", " embeddings = np.load(embedding_file)\n", " else:\n", " print(f\"Computing embeddings for column '{col}'...\")\n", " embeddings = model.encode(df[col].tolist(), show_progress_bar=True)\n", " np.save(embedding_file, embeddings)\n", "\n", " print(f\"Fitting SVD for column '{col}'...\")\n", " svd = TruncatedSVD(n_components=svd_dim, random_state=42)\n", " svd.fit(embeddings)\n", " joblib.dump(svd, svd_file)\n", "\n", " reduced = svd.transform(embeddings)\n", " embed_df = pd.DataFrame(reduced, columns=[f'{col}_embed_{i}' for i in range(reduced.shape[1])])\n", " embed_df.index = df.index # Force matching index\n", " df = pd.concat([df, embed_df], axis=1)\n", " return df\n", "\n", "\n", "# --- Step 3: Build Preprocessor ---\n", "def build_preprocessor(numeric_features, categorical_features, multilabel_fields):\n", " numeric_pipeline = SKPipeline([\n", " ('imputer', SimpleImputer(strategy='median')),\n", " ('anomaly', AnomalyScoreTransformer()),\n", " ('scaler', StandardScaler())\n", " ])\n", "\n", " categorical_pipeline = SKPipeline([\n", " ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),\n", " ('onehot', OneHotEncoder(handle_unknown='ignore', sparse_output=False))\n", " ])\n", "\n", " transformers = [\n", " ('num', numeric_pipeline, numeric_features),\n", " ('cat', categorical_pipeline, categorical_features),\n", " *[(f'mlb_{col}', MultiLabelBinarizerTransformer(), col) for col in multilabel_fields]]\n", " \n", "\n", " return ColumnTransformer(transformers, sparse_threshold=0.0)\n", "\n", "# --- Step 4: Build Pipeline ---\n", "def build_pipeline(preprocessor, base_model, k=250):\n", " return ImbPipeline(steps=[\n", " ('preprocessor', preprocessor),\n", " ('anomaly', AnomalyScoreTransformer()),\n", " ('resample', SMOTEENN()),\n", " (\"variance_filter\", VarianceThreshold(threshold=0.0)),\n", " ('feature_select', SelectKBest(score_func=f_classif, k=k)),\n", " ('classifier', CalibratedClassifierCV(estimator=base_model, method='isotonic', cv=3))\n", " ])\n", "\n", "# --- Step 5: Drift Monitoring ---\n", "def monitor_drift(reference, current, feature_names, output_html='drift_report.html'):\n", " ref_df = pd.DataFrame(reference, columns=feature_names)\n", " cur_df = pd.DataFrame(current, columns=feature_names)\n", " \n", " report = Report(metrics=[DataDriftPreset()])\n", " report.run(reference_data=ref_df, current_data=cur_df)\n", " report.save_html(output_html)\n", " print(f\"✅ Drift report saved to {output_html}\")\n", "\n", "\n", "# --- Step 6: Evaluation + SHAP ---\n", "def evaluate_model(model, X_train, X_test, y_train, y_test, feature_names):\n", " model.fit(X_train, y_train)\n", " y_pred = model.predict(X_test)\n", " print(classification_report(y_test, y_pred))\n", " ConfusionMatrixDisplay.from_predictions(y_test, y_pred)\n", " plt.title(\"Evaluation\")\n", " plt.tight_layout()\n", " plt.show()\n", "\n", " X_proc = model.named_steps['preprocessor'].transform(X_test)\n", " if scipy.sparse.issparse(X_proc):\n", " X_proc = X_proc.toarray()\n", "\n", " selector = model.named_steps['feature_select']\n", " X_selected = selector.transform(X_proc)\n", "\n", " explainer = shap.Explainer(model.named_steps['classifier'].base_estimator, feature_names=feature_names)\n", " shap_values = explainer(X_selected)\n", " shap.summary_plot(shap_values, X_selected)\n", "\n", "# --- Final Orchestration ---\n", "def status_prediction_model(df):\n", " os.makedirs(\"model_artifacts\", exist_ok=True)\n", " print(\"🧹 Preparing data...\")\n", " df = prepare_data(df, is_train=True)\n", " print(\"💡 Embedding text...\")\n", " df = compute_embeddings(df, ['title', 'objective', 'topic_title'])\n", "\n", " text_embed_cols = [col for col in df.columns if '_embed_' in col]\n", " numeric_features = ['durationDays', 'startYear', 'ecMaxContribution', 'totalCost',\n", " 'n_partners', 'n_country', 'n_sme'] + text_embed_cols\n", " categorical_features = ['frameworkProgramme', 'fundingScheme', 'legalBasis', 'nature']\n", " multilabel_fields = ['list_country', 'list_activityType', 'list_deliverableType',\n", " 'list_availableLanguages', 'list_euroSciVocTitle','euroSciVoc_intermediate']\n", " \n", " \n", " df = df[numeric_features + categorical_features + multilabel_fields + ['label']]\n", " X = df.drop(columns='label')\n", " y = df['label']\n", "\n", "\n", " X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, test_size=0.2, random_state=42)\n", "\n", " print(\"🧱 Building pipeline...\")\n", " preprocessor = build_preprocessor(numeric_features, categorical_features, multilabel_fields)\n", " base_model = XGBClassifier(eval_metric='logloss', n_jobs=-1)\n", "\n", " print(\"🎯 Training model with Optuna...\")\n", " def objective(trial):\n", " params = {\n", " 'n_estimators': trial.suggest_int('n_estimators', 100, 300),\n", " 'max_depth': trial.suggest_int('max_depth', 3, 10),\n", " 'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3),\n", " 'scale_pos_weight': trial.suggest_float('scale_pos_weight', 2.0, 10.0)\n", " }\n", " base_model.set_params(**params)\n", " pipeline = build_pipeline(preprocessor, base_model)\n", " scores = cross_val_score(pipeline, X, y, cv=StratifiedKFold(3, shuffle=True, random_state=42),\n", " scoring=make_scorer(f1_score, pos_label=1))\n", " return scores.mean()\n", "\n", " study = optuna.create_study(direction='maximize')\n", " study.optimize(objective, n_trials=10)\n", " best_params = study.best_trial.params\n", " base_model.set_params(**best_params)\n", "\n", " print(\"✅ Training final model and evaluating...\")\n", " final_pipeline = build_pipeline(preprocessor, base_model)\n", " selector = final_pipeline.named_steps['feature_select']\n", " if hasattr(selector, 'get_support'):\n", " feature_names = np.array(final_pipeline.named_steps['preprocessor'].get_feature_names_out())[selector.get_support()]\n", " else:\n", " feature_names = np.array(final_pipeline.named_steps['preprocessor'].get_feature_names_out())\n", " evaluate_model(final_pipeline, X_train, X_test, y_train, y_test, feature_names)\n", "\n", " print(\"📊 Monitoring drift...\")\n", " ref_data = preprocessor.transform(X_train)\n", " cur_data = preprocessor.transform(X_test)\n", " if scipy.sparse.issparse(ref_data): ref_data = ref_data.toarray()\n", " if scipy.sparse.issparse(cur_data): cur_data = cur_data.toarray()\n", " monitor_drift(pd.DataFrame(ref_data), pd.DataFrame(cur_data), feature_names)\n", " print(\"💾 Saving model and artifacts...\")\n", " joblib.dump(final_pipeline, \"model_artifacts/model.pkl\")\n", " joblib.dump(preprocessor, \"model_artifacts/preprocessor.pkl\")\n", " X_train.to_csv(\"model_artifacts/X_train_processed.csv\", index=False)\n", " y_train.to_csv(\"model_artifacts/y_train.csv\", index=False)\n", " feature_config = {\n", " \"numeric_features\": numeric_features,\n", " \"categorical_features\": categorical_features,\n", " \"multilabel_fields\": multilabel_fields\n", " }\n", " json.dump(feature_config, open(\"model_artifacts/feature_config.json\", \"w\"))\n", " print(\"✅ Training complete. Model artifacts saved.\")\n", "\n", "def score(new_data_df, model_dir=\"model_artifacts\"):\n", " # Load saved artifacts\n", " model = joblib.load(os.path.join(model_dir, \"model.pkl\"))\n", " config = json.load(open(os.path.join(model_dir, \"feature_config.json\")))\n", " text_cols = ['title', 'objective', 'topic_title']\n", " numeric_features = config[\"numeric_features\"]\n", " categorical_features = config[\"categorical_features\"]\n", " multilabel_fields = config[\"multilabel_fields\"]\n", " new_data_df = prepare_data(new_data_df, is_train=False)\n", " # Text embedding using saved SVDs\n", " sbert = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')\n", " for col in text_cols:\n", " svd = joblib.load(os.path.join(model_dir, f\"{col}_svd.pkl\"))\n", " emb = sbert.encode(new_data_df[col].tolist(), show_progress_bar=False)\n", " reduced = svd.transform(emb)\n", " embed_df = pd.DataFrame(reduced, columns=[f'{col}_embed_{i}' for i in range(reduced.shape[1])])\n", " df = pd.concat([df, embed_df], axis=1)\n", "\n", " # Final input set\n", " final_X = new_data_df[numeric_features + categorical_features + multilabel_fields]\n", " pred = model.predict(final_X)\n", " prob = model.predict_proba(final_X)\n", "\n", " return pred, prob\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "from sklearn.cluster import KMeans\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import classification_report\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.compose import ColumnTransformer\n", "from sklearn.impute import SimpleImputer\n", "from sklearn.feature_extraction.text import TfidfVectorizer\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.compose import ColumnTransformer\n", "from sklearn.impute import SimpleImputer\n", "from sklearn.feature_extraction.text import TfidfVectorizer\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import classification_report\n", "import pandas as pd\n", "\n", "def plot_project_duration_distribution(df):\n", " if 'durationDays' in df.columns:\n", " data = pd.to_numeric(df['durationDays'], errors='coerce').dropna()\n", " plt.figure(figsize=(10,6))\n", " sns.histplot(data, bins=50)\n", " plt.title('Distribution of Project Durations (days)')\n", " plt.xlabel('Duration (days)')\n", " plt.ylabel('Number of Projects')\n", " plt.show()\n", " else:\n", " print(\"Column 'durationDays' not found in DataFrame.\")\n", "\n", "def plot_ec_contribution_by_year(df):\n", " if 'startYear' in df.columns and 'ecMaxContribution' in df.columns:\n", " df['startYear'] = pd.to_numeric(df['startYear'], errors='coerce')\n", " df['ecMaxContribution'] = pd.to_numeric(df['ecMaxContribution'], errors='coerce')\n", " yearly_funding = df.groupby('startYear')['ecMaxContribution'].sum().dropna()\n", " plt.figure(figsize=(10,6))\n", " yearly_funding.plot(kind='bar')\n", " plt.title('Total EC Max Contribution by Start Year')\n", " plt.ylabel('Total Contribution (€)')\n", " plt.xlabel('Start Year')\n", " plt.xticks(rotation=45)\n", " plt.tight_layout()\n", " plt.show()\n", " else:\n", " print(\"Required columns not found in DataFrame.\")\n", "\n", "def plot_participation_by_country(df):\n", " if 'list_country' in df.columns:\n", " countries = df['list_country'].explode()\n", " countries = countries.dropna()\n", " top_countries = countries.value_counts().head(15)\n", " plt.figure(figsize=(10,6))\n", " top_countries.plot(kind='bar')\n", " plt.title('Top 15 Countries by Project Participation')\n", " plt.ylabel('Number of Participations')\n", " plt.xticks(rotation=45)\n", " plt.tight_layout()\n", " plt.show()\n", " else:\n", " print(\"Column 'list_country' not found in DataFrame.\")\n", "\n", "def success_prediction_model(df):\n", " df = df.copy()\n", "\n", " # Define binary target variable\n", " df['target'] = df['status'].apply(lambda x: 1 if str(x).upper() == 'CLOSED' else 0)\n", "\n", " # Feature selection\n", " features = ['durationDays', 'ecMaxContribution', 'netEcContribution', 'startYear', 'endYear', 'title', 'objective']\n", " df = df[features + ['target']].dropna(subset=['target'])\n", "\n", " # Ensure selected features exist\n", " for col in features:\n", " if col not in df.columns:\n", " print(f\"Missing expected column: {col}\")\n", " return\n", "\n", " # Fill missing text with empty string\n", " df['title'] = df['title'].fillna('').astype(str)\n", " df['objective'] = df['objective'].fillna('').astype(str)\n", "\n", " numeric_features = ['durationDays', 'ecMaxContribution', 'netEcContribution', 'startYear', 'endYear']\n", " text_features_title = 'title'\n", " text_features_objective = 'objective'\n", "\n", " preprocessor = ColumnTransformer(transformers=[\n", " ('num', Pipeline([\n", " ('imputer', SimpleImputer(strategy='median')),\n", " ('scaler', StandardScaler())\n", " ]), numeric_features),\n", " ('title_tfidf', TfidfVectorizer(max_features=100), text_features_title),\n", " ('objective_tfidf', TfidfVectorizer(max_features=100), text_features_objective),\n", " ])\n", "\n", " clf = Pipeline(steps=[\n", " ('preprocessor', preprocessor),\n", " ('classifier', LogisticRegression(max_iter=1000))\n", " ])\n", "\n", " X = df[features]\n", " y = df['target']\n", " X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)\n", "\n", " clf.fit(X_train, y_train)\n", " y_pred = clf.predict(X_test)\n", "\n", " print(\"✅ Classification Report:\")\n", " print(classification_report(y_test, y_pred))\n", " \n", "\n", "def cluster_projects(df, n_clusters=5):\n", " df = df.copy()\n", " features = ['durationDays', 'ecMaxContribution', 'netEcContribution']\n", " df = df[features].dropna()\n", " \n", " df[features] = df[features].apply(pd.to_numeric, errors='coerce')\n", " df = df.dropna()\n", "\n", " scaler = StandardScaler()\n", " scaled_features = scaler.fit_transform(df)\n", "\n", " kmeans = KMeans(n_clusters=n_clusters, random_state=42)\n", " clusters = kmeans.fit_predict(scaled_features)\n", "\n", " plt.figure(figsize=(10,6))\n", " plt.scatter(scaled_features[:, 0], scaled_features[:, 1], c=clusters, cmap='viridis')\n", " plt.title('Project Clusters')\n", " plt.xlabel('Scaled Duration')\n", " plt.ylabel('Scaled EC Contribution')\n", " plt.show()\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\Romain\\AppData\\Local\\Temp\\ipykernel_17684\\589813601.py:6: DeprecationWarning: `GroupBy.count` is deprecated. It has been renamed to `len`.\n", " .count()\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABnk0lEQVR4nO3deVhUdf//8deAAoqCO0iSkOaC+4q0mCaKipWl5ZaamaWhpZRbmUvLbVmZmtuvTWw3K620JMKtklIx3DEXTLtxUJNFUUHh/P7oy9xOoIJxHAaej+ua6/Z8Pu858z5TN/ninPM5FsMwDAEAAAAAgGLn4ugGAAAAAAAorQjdAAAAAACYhNANAAAAAIBJCN0AAAAAAJiE0A0AAAAAgEkI3QAAAAAAmITQDQAAAACASQjdAAAAAACYhNANAAAAAIBJCN0AgFItICBADz30kKPbKLTp06fLYrHo5MmTjm6lzOvZs6dGjBjh6DZMd+HCBfn7+2vhwoWObgUASiVCNwDguouKipLFYrG9PDw81KBBA40ePVopKSmObq9I/vOf/2jlypWObuOarVixQj169FCNGjXk5uYmPz8/PfDAA1q7dq2jW5MkJScna/r06UpISLiun/vzzz/r+++/18SJEyX9/cubS/+dvdwrKirK9N7GjRun1q1bq1q1aqpYsaIaN26s6dOn68yZM/lqs7KyNHHiRPn5+alChQoKDg5WTEyMXU358uUVGRmpl156SefPnze9fwAoayyGYRiObgIAULZERUVp2LBhev755xUYGKjz58/rp59+0gcffKC6detq165dqlixYrF8VlZWllxcXFS+fPli2d8/VapUSX379i22sDV9+nTNmDFDJ06cUI0aNYplnwUxDEMPP/ywoqKi1KpVK/Xt21e+vr46duyYVqxYofj4eP3888+65ZZbTOuhMLZu3ap27dppyZIl1/WKhd69e+vcuXOKjo6WJK1cudIu1H777bf65JNP9MYbb9j9c7rlllt00003mdrbbbfdpjZt2qh+/fry8PDQb7/9pvfee09t27bVxo0b5eLyv3MqAwYM0Oeff66xY8fq5ptvVlRUlLZs2aJ169bptttus9WlpaXJx8dHixYt0sMPP2xq/wBQ1pRzdAMAgLKrR48eatu2rSTpkUceUfXq1TV79mx99dVXGjBgQIHvyczMlKenZ6E/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tc1fKu+Y865gAAAUD0I3AMDp9OzZUzk5OZo/f77d+BtvvCGLxaIePXpc9r0PPPCA4uLi8q1sLf0dFi9evChJtlXSZ8yYka/u0rDk6emZL2Tm5OTYhR9JqlWrlvz8/Aq83LcgCxYssNt+8803JSnfsQ0ePFipqal67LHHdObMmauuzC1JFStW1MSJE7V3715NnDixwDPLH374oTZv3izp7+978+bNiouLs81nZmbqrbfeUkBAgIKCgiT9/YsKSbb74qW/v4u33nqrMIdcoLx70//5HRfGgAEDZLFY9OSTT+rQoUOF+m4kKSQkRKmpqUW6HaBnz56SpDlz5tiNz549W5IUHh5uN56cnGy38ntGRobef/99tWzZUr6+vpf9nLS0tAIfhfbOO+9Iku2595LUt2/ffN9/VlaWlixZouDgYPn7+9vtIz4+XhaLRSEhIVc6VABAEZVzdAMAABTVXXfdpc6dO+vZZ5/V4cOH1aJFC33//ff66quvNHbsWFv4K8j48eP19ddfq1evXnrooYfUpk0bZWZmaufOnfr88891+PBh1ahRw/boqXnz5mn//v3q3r27cnNz9eOPP6pz584aPXq0pL8fs/TDDz9o9uzZ8vPzU2BgoBo2bKg6deqob9++atGihSpVqqQffvhBW7Zs0euvv16oY0xKStLdd9+t7t27Ky4uTh9++KEGDhyY79ncrVq1UtOmTbV8+XI1btxYrVu3LtT+x48fr927d+v111/XunXr1LdvX/n6+spqtWrlypXavHmz7dFRkyZN0ieffKIePXroiSeeULVq1bR06VIlJSXpiy++sF3+36RJE3Xo0EGTJ0/WqVOnVK1aNX366ae2X2Rci3r16qlKlSpavHixKleuLE9PTwUHB191MTRJtueqL1++XFWqVMkXfC8nPDxc5cqV0w8//GD3mLYradGihYYOHaq33npLaWlpuuOOO7R582YtXbpUvXv3VufOne3qGzRooOHDh2vLli3y8fHRe++9p5SUFC1ZsuSKn7N+/Xo98cQT6tu3r26++WZlZ2frxx9/1Jdffqm2bdva/WIhODhY999/vyZPnqzjx4+rfv36Wrp0qQ4fPqx33303375jYmJ066232j2yDwBQDBy2bjoAoMzKe7TUli1brlg3dOhQw9PTs8C506dPG+PGjTP8/PyM8uXLGzfffLPx6quv2j3O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nvfZvr6+tv/9Zz8pKSny8vJShQoV5OrqKldX1wJr8vbxT+7u7raz/wAAAAAAFKTIq5dnZmbq4Ycflp+fnzp27KiOHTvKz89Pw4cPt7vX2tvb+6r7MgxDo0eP1ooVK7R27VoFBgZe9T0JCQmSpNq1a0uSQkJCtHPnTrtVxmNiYuTl5aWgoCBbTWxsrN1+YmJiFBISIklyc3NTmzZt7Gpyc3MVGxtrqwEAAAAAoKiKHLojIyO1YcMGff3110pLS1NaWpq++uorbdiwQU899VSR9hUREaEPP/xQH3/8sSpXriyr1Sqr1apz585J+vsy9RdeeEHx8fE6fPiwvv76aw0ZMkQdO3ZU8+bNJUndunVTUFCQBg8erO3btys6OlpTpkxRRESE7Uz0yJEjdejQIU2YMEGJiYlauHChPvvsM40bN87uuN5++20tXbpUe/fu1ahRo5SZmalhw4YV9SsCAAAAAEDSNTwyrEaNGvr888/VqVMnu/F169bpgQce0IkTJwr/4RZLgeNLlizRQw89pKNHj+rBBx/Url27lJmZKX9/f917772aMmWK3ZLsf/zxh0aNGqX169fL09NTQ4cO1csvv6xy5f539fz69es1btw47dmzR3Xq1NFzzz2nhx56yO5z58+fr1dffVVWq1UtW7bUvHnzbJezXw2PDANQHHhkGAAAgHMobAYscuiuWLGi4uPj1bhxY7vx3bt3q3379srMzLy2jp0coRtAcSB0AwAAOIdifU73pUJCQjRt2jSdP3/eNnbu3DnNmDGD+58BAAAAALhEkVcvnzNnjrp37646deqoRYsWkqTt27fLw8ND0dHRxd4gAAAAAADOqsihu1mzZtq/f78++ugjJSYmSpIGDBigQYMGqUKFCsXeIAAAAAAAzqpIofvChQtq1KiRVq1apREjRpjVEwAAAAAApUKR7ukuX7683b3cAAAAAADg8oq8kFpERIReeeUVXbx40Yx+AAAAAAAoNYp8T/eWLVsUGxur77//Xs2aNZOnp6fd/JdffllszQEAAAAA4MyKHLqrVKmiPn36mNELAAAAAAClSpFD95IlS8zoAwAAAACAUqfQ93Tn5ubqlVde0a233qp27dpp0qRJOnfunJm9AQAAAADg1Aodul966SU988wzqlSpkm644QbNnTtXERERZvYGAAAAAIBTK3Tofv/997Vw4UJFR0dr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vn27oqOjNWXKFEVERMjd3V2SNHLkSB06dEgTJkxQYmKiFi5cqM8++0zjxo2z9RIZGam3335bS5cu1d69ezVq1ChlZmZq2LBhRf2KAAAAAACQdA33dH///feKjo62uwxckm6++Wb98ccfRdrXokWLJEmdOnWyG1+yZIkeeughSdIbb7whFxcX9enTR1lZWQoLC9PChQttta6urlq1apVGjRqlkJAQeXp6aujQoXr++edtNYGBgVq9erXGjRunuXPnqk6dOnrnnXcUFhZmq+nXr59OnDihqVOnymq1qmXLllqzZk2+xdUAAAAAACisIj+nu3Llytq2bZtuvvlmVa5cWdu3b9dNN92krVu3KiwsTH/99ZdZvZZoPKcbQHHgOd0AAADOobAZsMiXl99+++16//33bdsWi0W5ubmaNWuWOnfufG3dAgAAAABQChX58vJZs2apS5cu2rp1q7KzszVhwgTt3r1bp06d0s8//2xGjwAAAAAAOKUin+lu2rSpfv/9d91222265557lJmZqfvuu0+//fab6tWrZ0aPAAAAAAA4pSKf6Zb+XlX82WefLe5eAAAAAAAoVa4pdKempurdd9/V3r17JUlBQUEaNmyYqlWrVqzNAQAAAADgzIp8efnGjRsVEBCgefPmKTU1VampqZo3b54CAwO1ceNGM3oEAAAAAMApFflMd0REhPr166dFixbJ1dVVkpSTk6PHH39cERER2rlzZ7E3CQAAAACAMyryme4DBw7oqaeesgVuSXJ1dVVkZKQOHDhQrM0BAAAAAODMihy6W7dubbuX+1J79+5VixYtiqUpAAAAAABKg0JdXr5jxw7bn5944gk9+eSTOnDggDp06CBJ+uWXX7RgwQK9/PLL5nQJAAAAAIATshiGYVytyMXFRRaLRVcrtVgsysnJKbbmnElGRoa8vb2Vnp4uLy8vR7dzWQGTVju6BQBXcPjlcEe3AAAAgEIobAYs1JnupKSkYmsMAAAAAICyolChu27dumb3AQAAAABAqVPkR4ZJUnJysn766ScdP35cubm5dnNPPPFEsTQGAAAAAICzK3LojoqK0mOPPSY3NzdVr15dFovFNmexWAjdAAAAAAD8nyKH7ueee05Tp07V5MmT5eJS5CeOAQAAAABQZhQ5NZ89e1b9+/cncAMAAAAAcBVFTs7Dhw/X8uXLzegFAAAAAIBSpciXl8+cOVO9evXSmjVr1KxZM5UvX95ufvbs2cXWHAAAAAAAzuyaQnd0dLQaNmwoSfkWUgMAAAAAAH8rcuh+/fXX9d577+mhhx4yoR0AAAAAAEqPIt/T7e7urltvvdWMXgAAAAAAKFWKHLqffPJJvfnmm2b0AgAAAABAqVLky8s3b96stWvXatWqVWrSpEm+hdS+/PLLYmsOAFA6BUxa7egWAFzB4ZfDHd0CAJQaRQ7dVapU0X333WdGLwAAAAAAlCpFDt1Lliwxow8AAAAAAEqdIt/TDQAAAAAACqfIZ7oDAwOv+DzuQ4cO/auGAAAAAAAoLYocuseOHWu3feHCBf32229as2aNxo8fX1x9AQAAAADg9Iocup988skCxxcsWKCtW7f+64YAAAAAACgtiu2e7h49euiLL74ort0BAAAAAOD0ii10f/7556pWrVpx7Q4AAAAAAKdX5MvLW7VqZbeQmmEYslqtOnHihBYuXFiszQEAAAAA4MyKHLp79+5tt+3i4qKaNWuqU6dOatSoUXH1BQAAAACA0yty6J42bZoZfQAAAAAAUOoU2z3dAAAAAADAXqHPdLu4uNjdy10Qi8Wiixcv/uumAAAAAAAoDQodulesWHHZubi4OM2bN0+5ubnF0hQAAAAAAKVBoS8vv+eee/K9GjVqpKioKL322mu6//77tW/fviJ9+MaNG3XXXXfJz89PFotFK1eutJt/6KGHZLFY7F7du3e3qzl16pQGDRokLy8vValSRcOHD9eZM2fsanbs2KHbb79dHh4e8vf316xZs/L1snz5cjVq1EgeHh5q1qyZvv322yIdCwAAAAAA/3RN93QnJydrxIgRatasmS5evKiEhAQtXbpUdevWLdJ+MjMz1aJFCy1YsOCyNd27d9exY8dsr08++cRuftCgQdq9e7diYmK0atUqbdy4UY8++qhtPiMjQ926dVPdunUVHx+vV199VdOnT9dbb71lq9m0aZMGDBig4cOH67ffflPv3r3Vu3dv7dq1q0jHAwAAAADApYq0enl6err+85//6M0331TLli0VGxur22+//Zo/vEePHurRo8cVa9zd3eXr61vg3N69e7VmzRpt2bJFbdu2lSS9+eab6tmzp1577TX5+fnpo48+UnZ2tt577z25ubmpSZMmSkhI0OzZs23hfO7cuerevbvGjx8vSXrhhRcUExOj+fPna/Hixdd8fAAAAACAsq3QZ7pnzZqlm266SatWrdInn3yiTZs2/avAXVjr169XrVq11LBhQ40aNUp//fWXbS4uLk5VqlSxBW5JCg0NlYuLi3799VdbTceOHeXm5marCQsL0759+5SammqrCQ0NtfvcsLAwxcXFmXloAAAAAIBSrtBnuidNmqQKFSqofv36Wrp0qZYuXVpg3ZdffllszXXv3l333XefAgMDdfDgQT3zzDPq0aOH4uLi5OrqKqvVqlq1atm9p1y5cqpWrZqsVqskyWq1KjAw0K7Gx8fHNle1alVZrVbb2KU1efsoSFZWlrKysmzbGRkZ/+pYAQAAAAClT6FD95AhQ676yLDi1r9/f9ufmzVrpubNm6tevXpav369unTpcl17+aeZM2dqxowZDu0BAAAAAFCyFTp0R0VFmdhG4dx0002qUaOGDhw4oC5dusjX11fHjx+3q7l48aJOnTpluw/c19dXKSkpdjV521erudy95JI0efJkRUZG2rYzMjLk7+9/7QcHAAAAACh1rmn1ckf5888/9ddff6l27dqSpJCQEKWlpSk+Pt5Ws3btWuXm5io4ONhWs3HjRl24cMFWExMTo4YNG6pq1aq2mtjYWLvPiomJUUhIyGV7cXd3l5eXl90LAAAAAIBLOTR0nzlzRgkJCUpISJAkJSUlKSEhQUeOHNGZM2c0fvx4/fLLLzp8+LBiY2N1zz33qH79+goLC5MkNW7cWN27d9eIESO0efNm/fzzzxo9erT69+8vPz8/SdLAgQPl5uam4cOHa/fu3Vq2bJnmzp1rd5b6ySef1Jo1a/T6668rMTFR06dP19atWzV69Ojr/p0AAAAAAEoPh4burVu3qlWrVmrVqpUkKTIyUq1atdLUqVPl6uqqHTt26O6771aDBg00fPhwtWnTRj/++KPc3d1t+/joo4/UqFEjdenSRT179tRtt91m9wxub29vff/990pKSlKbNm301FNPaerUqXbP8r7lllv08ccf66233lKLFi30+eefa+XKlWratOn1+zIAAAAAAKWOxTAMw9FNlAYZGRny9vZWenp6ib7UPGDSake3AOAKDr8c7ugWrgt+FgElW1n5WQQA/0ZhM6BT3dMNAAAAAIAzIXQDAAAAAGASQjcAAAAAACYhdAMAAAAAYBJCNwAAAAAAJiF0AwAAAABgEkI3AAAAAAAmIXQDAAAAAGASQjcAAAAAACYhdAMAAAAAYBJCNwAAAAAAJiF0AwAAAABgEkI3AAAAAAAmIXQDAAAAAGASQjcAAAAAACYhdAMAAAAAYBJCNwAAAAAAJiF0AwAAAABgEkI3AAAAAAAmIXQDAAAAAGASQjcAAAAAACYhdAMAAAAAYBJCNwAAAAAAJiF0AwAAAABgEkI3AAAAAAAmIXQDAAAAAGASQjcAAAAAACYhdAMAAAAAYBJCNwAAAAAAJiF0AwAAAABgEkI3AAAAAAAmIXQDAAAAAGASQjcAAAAAACYhdAMAAAAAYBJCNwAAAAAAJiF0AwAAAABgEkI3AAAAAAAmIXQDAAAAAGASQjcAAAAAACZxaOjeuHGj7rrrLvn5+clisWjlypV284ZhaOrUqapdu7YqVKig0NBQ7d+/367m1KlTGjRokLy8vFSlShUNHz5cZ86csavZsWOHbr/9dnl4eMjf31+zZs3K18vy5cvVqFEjeXh4qFmzZvr222+L/XgBAAAAAGWLQ0N3ZmamWrRooQULFhQ4P2vWLM2bN0+LFy/Wr7/+Kk9PT4WFhen8+fO2mkGDBmn37t2KiYnRqlWrtHHjRj366KO2+YyMDHXr1k1169ZVfHy8Xn31VU2fPl1vvfWWrWbTpk0aMGCAhg8frt9++029e/dW7969tWvXLvMOHgAAAABQ6lkMwzAc3YQkWSwWrVixQr1795b091luPz8/PfXUU3r66aclSenp6fLx8VFUVJT69++vvXv3KigoSFu2bFHbtm0lSWvWrFHPnj31559/ys/PT4sWLdKzzz4rq9UqNzc3SdKkSZO0cuVKJSYmSpL69eunzMxMrVq1ytZPhw4d1LJlSy1evLhQ/WdkZMjb21vp6eny8vIqrq+l2AVMWu3oFgBcweGXwx3dwnXBzyKgZCsrP4sA4N8obAYssfd0JyUlyWq1KjQ01Dbm7e2t4OBgxcXFSZLi4uJUpUoVW+CWpNDQULm4uOjXX3+11XTs2NEWuCUpLCxM+/btU2pqqq3m0s/Jq8n7HAAAAAAArkU5RzdwOVarVZLk4+NjN+7j42Obs1qtqlWrlt18uXLlVK1aNbuawMDAfPvIm6tataqsVusVP6cgWVlZysrKsm1nZGQU5fAAAAAAAGVAiT3TXdLNnDlT3t7etpe/v7+jWwIAAAAAlDAlNnT7+vpKklJSUuzGU1JSbHO+vr46fvy43fzFixd16tQpu5qC9nHpZ1yuJm++IJMnT1Z6errtdfTo0aIeIgAAAACglCuxoTswMFC+vr6KjY21jWVkZOjXX39VSEiIJCkkJERpaWmKj4+31axdu1a5ubkKDg621WzcuFEXLlyw1cTExKhhw4aqWrWqrebSz8mryfucgri7u8vLy8vuBQAAAADApRwaus+cOaOEhAQlJCRI+nvxtISEBB05ckQWi0Vjx47Viy++qK+//lo7d+7UkCFD5OfnZ1vhvHHjxurevbtGjBihzZs36+eff9bo0aPVv39/+fn5SZIGDhwoNzc3DR8+XLt379ayZcs0d+5cRUZG2vp48skntWbNGr3++utKTEzU9OnTtXXrVo0ePfp6fyUAAAAAgFLEoQupbd26VZ07d7Zt5wXhoUOHKioqShMmTFBmZqYeffRRpaWl6bbbbtOaNWvk4eFhe89HH32k0aNHq0uXLnJxcVGfPn00b94827y3t7e+//57RUREqE2bNqpRo4amTp1q9yzvW265RR9//LGmTJmiZ555RjfffLNWrlyppk2bXodvAQAAAABQWpWY53Q7O57TDaA4lJVn4/KzCCjZysrPIgD4N5z+Od0AAAAAADg7QjcAAAAAACYhdAMAAAAAYBJCNwAAAAAAJiF0AwAAAABgEkI3AAAAAAAmIXQDAAAAAGASQjcAAAAAACYhdAMAAAAAYBJCNwAAAAAAJiF0AwAAAABgEkI3AAAAAAAmIXQDAAAAAGASQjcAAAAAACYhdAMAAAAAYBJCNwAAAAAAJiF0AwAAAABgEkI3AAAAAAAmIXQDAAAAAGASQjcAAAAAACYhdAMAAAAAYBJCNwAAAAAAJiF0AwAAAABgEkI3AAAAAAAmIXQDAAAAAGASQjcAAAAAACYhdAMAAAAAYBJCNwAAAAAAJiF0AwAAAABgEkI3AAAAAAAmIXQDAAAAAGASQjcAAAAAACYhdAMAAAAAYBJCNwAAAAAAJiF0AwAAAABgEkI3AAAAAAAmIXQDAAAAAGASQjcAAAAAACYhdAMAAAAAYJISHbqnT58ui8Vi92rUqJFt/vz584qIiFD16tVVqVIl9enTRykpKXb7OHLkiMLDw1WxYkXVqlVL48eP18WLF+1q1q9fr9atW8vd3V3169dXVFTU9Tg8AAAAAEApV6JDtyQ1adJEx44ds71++ukn29y4ceP0zTffaPny5dqwYYOSk5N133332eZzcnIUHh6u7Oxsbdq0SUuXLlVUVJSmTp1qq0lKSlJ4eLg6d+6shIQEjR07Vo888oiio6Ov63ECAAAAAEqfco5u4GrKlSsnX1/ffOPp6el699139fHHH+vOO++UJC1ZskSNGzfWL7/8og4dOuj777/Xnj179MMPP8jHx0ctW7bUCy+8oIkTJ2r69Olyc3PT4sWLFRgYqNdff12S1LhxY/3000964403FBYWdl2PFQAAAABQupT4M9379++Xn5+fbrrpJg0aNEhHjhyRJMXHx+vChQsKDQ211TZq1Eg33nij4uLiJElxcXFq1qyZfHx8bDVhYWHKyMjQ7t27bTWX7iOvJm8fl5OVlaWMjAy7FwAAAAAAlyrRoTs4OFhRUVFas2aNFi1apKSkJN1+++06ffq0rFar3NzcVKVKFbv3+Pj4yGq1SpKsVqtd4M6bz5u7Uk1GRobOnTt32d5mzpwpb29v28vf3//fHi4AAAAAoJQp0ZeX9+jRw/bn5s2bKzg4WHXr1tVnn32mChUqOLAzafLkyYqMjLRtZ2RkELwBAAAAAHZK9Jnuf6pSpYoaNGigAwcOyNfXV9nZ2UpLS7OrSUlJsd0D7uvrm28187ztq9V4eXldMdi7u7vLy8vL7gUAAAAAwKWcKnSfOXNGBw8eVO3atdWmTRuVL19esbGxtvl9+/bpyJEjCgkJkSSFhIRo586dOn78uK0mJiZGXl5eCgoKstVcuo+8mrx9AAAAAABwrUp06H766ae1YcMGHT58WJs2bdK9994rV1dXDRgwQN7e3ho+fLgiIyO1bt06xcfHa9iwYQoJCVGHDh0kSd26dVNQUJAGDx6s7du3Kzo6WlOmTFFERITc3d0lSSNHjtShQ4c0YcIEJSYmauHChfrss880btw4Rx46AAAAAKAUKNH3dP/5558aMGCA/vrrL9WsWVO33XabfvnlF9WsWVOS9MYbb8jFxUV9+vRRVlaWwsLCtHDhQtv7XV1dtWrVKo0aNUohISHy9PTU0KFD9fzzz9tqAgMDtXr1ao0bN05z585VnTp19M477/C4MAAAAADAv2YxDMNwdBOlQUZGhry9vZWenl6i7+8OmLTa0S0AuILDL4c7uoXrgp9FQMlWVn4WAcC/UdgMWKIvLwcAAAAAwJkRugEAAAAAMAmhGwAAAAAAkxC6AQAAAAAwCaEbAAAAAACTELoBAAAAADAJoRsAAAAAAJMQugEAAAAAMAmhGwAAAAAAkxC6AQAAAAAwCaEbAAAAAACTELoBAAAAADAJoRsAAAAAAJMQugEAAAAAMAmhGwAAAAAAkxC6AQAAAAAwCaEbAAAAAACTELoBAAAAADAJoRsAAAAAAJMQugEAAAAAMAmhGwAAAAAAkxC6AQAAAAAwCaEbAAAAAACTELoBAAAAADAJoRsAAAAAAJMQugEAAAAAMAmhGwAAAAAAkxC6AQAAAAAwSTlHNwAAAAA4QsCk1Y5uAcAVHH453NEtFAvOdAMAAAAAYBJCNwAAAAAAJiF0AwAAAABgEkI3AAAAAAAmIXQDAAAAAGASQjcAAAAAACYhdAMAAAAAYBJCNwAAAAAAJiF0AwAAAABgEkI3AAAAAAAmIXT/w4IFCxQQECAPDw8FBwdr8+bNjm4JAAAAAOCkCN2XWLZsmSIjIzVt2jRt27ZNLVq0UFhYmI4fP+7o1gAAAAAATojQfYnZs2drxIgRGjZsmIKCgrR48WJVrFhR7733nqNbAwAAAAA4oXKObqCkyM7OVnx8vCZPnmwbc3FxUWhoqOLi4vLVZ2VlKSsry7adnp4uScrIyDC/2X8hN+uso1sAcAUl/WdIceFnEVCy8bMIQElQ0n8W5fVnGMYV6wjd/+fkyZPKycmRj4+P3biPj48SExPz1c+cOVMzZszIN+7v729ajwBKP+85ju4AAPhZBKBkcJafRadPn5a3t/dl5wnd12jy5MmKjIy0befm5urUqVOqXr26LBaLAztDWZGRkSF/f38dPXpUXl5ejm4HQBnGzyMAJQE/i3C9GYah06dPy8/P74p1hO7/U6NGDbm6uiolJcVuPCUlRb6+vvnq3d3d5e7ubjdWpUoVM1sECuTl5cV/WACUCPw8AlAS8LMI19OVznDnYSG1/+Pm5qY2bdooNjbWNpabm6vY2FiFhIQ4sDMAAAAAgLPiTPclIiMjNXToULVt21bt27fXnDlzlJmZqWHDhjm6NQAAAACAEyJ0X6Jfv346ceKEpk6dKqvVqpYtW2rNmjX5FlcDSgJ3d3dNmzYt320OAHC98fMIQEnAzyKUVBbjauubAwAAAACAa8I93QAAAAAAmITQDQAAAACASQjdAAAAAACYhNANAAAAAIBJWL0cAAAAgNNZu3atvvzySx0+fFgWi0WBgYHq27evOnbs6OjWADusXg44mZMnT9r+4xIQEKDq1as7uiUAZUx6erpiYmLs/qIbGhoqLy8vR7cGoIwYOXKk3nrrLVWtWlUNGjSQYRjav3+/0tLS9Pjjj+vNN990dIuADWe6ASexe/dujRo1Sj///LPd+B133KFFixapYcOGDuoMQFny4YcfavTo0crIyLAb9/b21uLFi9WvXz8HdQagrFixYoWWLFmi9957T0OHDpXFYpEk5ebmKioqSqNGjVLXrl119913O7hT4G+c6QacgNVqVdOmTVWzZk2NHDlSjRo1kmEY2rNnj95++2399ddf2rVrl2rVquXoVgGUYtu2bVNwcLAGDRqkcePG2f0smjNnjj799FNt2bJFLVq0cHSrAEqxu+++W02aNNHMmTMLnJ84caISExP11VdfXefOgIIRugEnMHHiRP3www/6+eef5eHhYTd37tw53XbbberWrdtl/+MDAMVh2LBhOnPmjJYvX17gfN++feXl5aX33nvvOncGoCypU6eOvvzyS7Vv377A+V9//VV9+vTRn3/+eZ07AwrG6uWAE4iJidHEiRPzBW5JqlChgsaPH6/o6GgHdAagLPn555/12GOPXXZ+5MiR+umnn65jRwDKopMnT6pOnTqXna9Tp47++uuv69gRcGWEbsAJHDp0SK1bt77sfNu2bXXo0KHr2BGAsig5OVkNGjS47HyDBg303//+9zp2BKAsys7OVvny5S87X65cOWVnZ1/HjoArYyE1wAmcPn36iqsCV65cWWfOnLmOHQEoi86ePVvgFTd53N3ddf78+evYEYCy6rnnnlPFihULnDt79ux17ga4MkI34CROnz592b/sZmRkiOUZAFwP0dHR8vb2LnAuLS3t+jYDoEzq2LGj9u3bd9UaoKRgITXACbi4uNgeh1EQwzBksViUk5NzHbsCUNa4uFz9rjR+FgEAYI8z3YATWLdunaNbAADl5uY6ugUAAJwOZ7oBAAAAOI2goCD99NNPqlatmiTp8ccf1/PPP68aNWpIko4fP66AgADu7UaJwerlgBP47LPP7Fbh/PPPP+3OOJ09e1azZs1yRGsAypDHH3/cbtHGTz75RJmZmbbttLQ09ezZ0xGtAShDEhMTdfHiRdv2hx9+qIyMDNu2YRgs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VatWatGihd5//31169ZNu3fv1urVq4vYOQAAjseZbgAASqlq1aopLCxMCxYsUGZmZr75tLQ0NW7cWEePHtXRo0dt43v27FFaWpqCgoIkSTVr1tSxY8fs3puQkFDkfsqXL6+cnJxC1z/yyCOKiorSkiVLFBoaanc2HgAAZ0HoBgCgFFuwYIFycnLUvn17ffHFF9q/f7/27t2refPmKSQkRKGhoWrWrJkGDRqkbdu2afPmzRoyZIjuuOMOtW3bVpJ05513auvWrXr//fe1f/9+TZs2Tbt27SpyLwEBAYqNjZXValVqaupV6wcOHKg///xTb7/9NguoAQCcFqEbAIBS7KabbtK2bdvUuXNnPfXUU2ratKm6du2q2NhYLVq0SBaLRV999ZWqVq2qjh07KjQ0VDfddJOWLVtm20dYWJiee+45TZgwQe3atdPp06c1ZMiQIvfy+uuvKyYmRv7+/mrVqtVV6729vdWnTx9VqlQp3yPLAABwFhajMKusAAAAOECXLl3UpEkTzZs3z9GtAABwTQjdAACgxElNTdX69evVt29f7dmzRw0bNnR0SwAAXBNWLwcAACVOq1atlJqaqldeeYXADQBwapzpBgAAAADAJCykBgAAAACASQjdAAAAAACYhNANAAAAAIBJCN0AAAAAAJiE0A0AAAAAgEkI3QAAAAAAmITQDQAAAACASQjdAAAAAACYhNANAAAAAIBJ/j/vFaI/nBMwEQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "countries = (\n", " consolidated\n", " .filter(pl.col(\"status\").is_not_null())\n", " .group_by(\"status\")\n", " .count()\n", " .rename({\"count\": \"project_count\"})\n", " .sort(\"project_count\", descending=True)\n", ")\n", "\n", "country_names = countries[\"status\"].to_list()[:30]\n", "project_counts = countries[\"project_count\"].to_list()[:30]\n", "\n", "plt.figure(figsize=(10, 6))\n", "plt.bar(country_names, project_counts)\n", "plt.title(\"Projects by Country (Top 30)\")\n", "plt.xlabel(\"Country\")\n", "plt.ylabel(\"Number of Projects\")\n", "plt.xticks(rotation=90)\n", "plt.tight_layout()\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAHHCAYAAABeLEexAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA4/0lEQVR4nO3df3yPdf////vGfmC2Mba1zDbktwjFzsrPtdEi0dnJKVSUH0Po9Ku8kTpPIaTTUCrrrJzkLEpkYX4baZn8XBIRtoW2+bmxPT9/+O719Wp+jLa9th236+XyutTrOB6v5/E4drTcPY/jeB1OxhgjAAAAC3N2dAMAAACORiACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACkEdwcLCeeeYZR7eRbxMnTpSTk5NOnTrl6FYAlFAEIqCEiImJkZOTk+3l7u6u2rVra/DgwUpJSXF0e7flX//6l5YtW+boNm5bTk6O/vOf/6hFixaqXLmyKlasqNq1a6t3797atm2brW7fvn2aOHGijhw5Uih9zJkzRzExMbesW7RokZycnPTOO+9cd/3AgQPl4uKiXbt2FXCHQMlT1tENALg9kyZNUkhIiC5duqTNmzdr7ty5Wrlypfbs2aPy5csXyDaSkpLk7Fx4f1/617/+pSeffFJdunQptG0UhqFDhyo6OlqPP/64evbsqbJlyyopKUlff/21atSooZYtW0q6GoheffVVtWnTRsHBwQXex5w5c1SlSpVbzuJ1795dH374ocaMGaMuXbrIz8/Ptu7bb7/Vu+++q5deekmNGzcu8B6BkoZABJQwHTt2VPPmzSVJ/fr1k4+Pj2bMmKEvvvhCPXr0uO5nzp8/rwoVKuR7G25ubgXSa2mSkpKiOXPm6Pnnn9e7775rt+6tt97Sb7/9Vug9XLhw4bZD79y5c9WgQQMNHz5cCxculCRlZ2erf//+ql69uiZOnFgIndozxujSpUsqV65coW8LuFOcMgNKuHbt2kmSDh8+LEl65pln5OHhoUOHDunRRx9VxYoV1bNnT0lXg9FLL72kwMBAubm5qU6dOnrzzTdljLEb83rXEKWlpWnYsGG2z9aqVUtTpkxRTk6OXV1OTo5mzZqlRo0ayd3dXVWrVlWHDh303XffSZKcnJx0/vx5ffjhh7bTf7nbOnv2rIYNG6bg4GC5ubnJ19dXjzzyiL7//vt8/SxOnTqlp556Sp6envLx8dGLL76oS5cu2da3bt36hrMhderUUURExA3HPnz4sIwxevDBB/Osc3Jykq+vr6Srpzb/+te/SpLatm1r28f169dLkr744gtFRkYqICBAbm5uqlmzpl577TVlZ2fbjdmmTRs1bNhQCQkJatWqlcqXL6+XX35ZwcHB2rt3rzZs2GAbu02bNjfsOzg4WBMnTtR///tfrV69WpL09ttvKzExUXPnzlX58uWVmZmpCRMmqFatWnJzc1NgYKBGjRqlzMxMu7EWLFigdu3aydfXV25ubqpfv77mzp173W0+9thjio2NVfPmzVWuXLkbnrYDigtmiIAS7tChQ5IkHx8f27IrV64oIiJCDz30kN58802VL19exhh17txZ69atU9++fdWkSRPFxsZq5MiROn78uGbOnHnDbVy4cEGtW7fW8ePHbTMLW7du1dixY3Xy5Em99dZbttq+ffsqJiZGHTt2VL9+/XTlyhVt2rRJ27ZtU/PmzfXRRx+pX79+euCBB/TCCy9IkmrWrClJGjBggP73v/9p8ODBql+/vk6fPq3Nmzdr//79atq06S1/Fk899ZSCg4M1efJkbdu2TW+//bZ+//13/ec//5Ek9erVS88//7z27Nmjhg0b2j63Y8cO/fjjjxo3btwNxw4KCpIkLVmyRH/9619vOFPTqlUrDR06VG+//bZefvll1atXT5Js/4yJiZGHh4dGjBghDw8PxcXFafz48crIyNC0adPsxjp9+rQ6duyo7t276+mnn5afn5/atGmjIUOGyMPDQ6+88ook2Z0Ku57hw4frk08+0cCBA7Vq1SqNHz9e3bt3V4cOHZSTk6POnTtr8+bNeuGFF1SvXj3t3r1bM2fO1I8//mh3rVfubFPnzp1VtmxZLV++XIMGDVJOTo6ioqLstpmUlKQePXqof//+ev7551WnTp2b9gg4nAFQIixYsMBIMmvWrDG//fabOXbsmFm0aJHx8fEx5cqVM7/++qsxxpg+ffoYSWbMmDF2n1+2bJmRZF5//XW75U8++aRxcnIyP/30k21ZUFCQ6dOnj+39a6+9ZipUqGB+/PFHu8+OGTPGlClTxhw9etQYY0xcXJyRZIYOHZqn/5ycHNu/V6hQwW78XF5eXiYqKip/P5BrTJgwwUgynTt3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o0mTJtlqQkJCtGLFCg0fPlyzZs1StWrV9N5773HLPQAAsClWgWj9+vV2793d3RUdHa3o6OgbfiYoKEgrV6686bht2rTRzp07C6JFAABQChWrQAQAQElxO8/+QvHn8C9mBAAAcDQCEQAAsDxOmQEASqzS+H04cAxmiAAAgOUxQwQAwP+HC6WtixkiAABgeQQiAABgeQQiAABgeQQiAABgeVxUDQAo9bhYGrfCDBEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALC8so5uAABgDcFjVuSr7sgbkYXcCZAXM0QAAMDymCECUGzld0ZBYlYBwJ9DIAIAoJjgtKLjcMoMAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHneZAQBQit3O11dYGTNEAADA8ghEAADA8ghEAADA8riGCACAEobrggoeM0QAAMDymCECANwxZipQWjBDBAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALK+soxsAABQ/wWNWOLoFoEgxQwQAACyPQAQAACzPoYFo7ty5uvfee+Xp6SlPT0+Fhobq66+/tq2/dOmSoqKi5OPjIw8PD3Xr1k0pKSl2Yxw9elSRkZEqX768fH19NXLkSF25csWuZv369WratKnc3NxUq1YtxcTEFMXuAQCAEsKhgahatWp64403lJCQoO+++07t2rXT448/rr1790qShg8fruXLl2vJkiXasGGDTpw4oa5du9o+n52drcjISGVlZWnr1q368MMPFRMTo/Hjx9tqDh8+rMjISLVt21aJiYkaNmyY+vXrp9jY2CLfXwAAUDw5GWOMo5u4VuXKlTVt2jQ9+eSTqlq1qhYuXKgnn3xSknTgwAHVq1dP8fHxatmypb7++ms99thjOnHihPz8/CRJ8+bN0+jRo/Xbb7/J1dVVo0eP1ooVK7Rnzx7bNrp37660tDStWrUqXz1lZGTIy8tL6enp8vT0LPidBkoBR1+Ee+SNSIduv7Rx5PG8nWPp6P/ucHOO/r28nT+/i801RNnZ2Vq0aJHOnz+v0NBQJSQk6PLlywoLC7PV1K1bV9WrV1d8fLwkKT4+Xo0aNbKFIUmKiIhQRkaGbZYpPj7ebozcmtwxAAAAHH7b/e7duxUaGqpLly7Jw8NDS5cuVf369ZWYmChXV1d5e3vb1fv5+Sk5OVmSlJycbBeGctfnrrtZTUZGhi5evKhy5crl6SkzM1OZmZm29xkZGX96PwEAQPHl8BmiOnXqKDExUdu3b9fAgQPVp08f7du3z6E9TZ48WV5eXrZXYGCgQ/sBAACFy+GByNXVVbVq1VKzZs00efJkNW7cWLNmzZK/v7+ysrKUlpZmV5+SkiJ/f39Jkr+/f567znLf36rG09PzurNDkjR27Filp6fbXseOHSuIXQUAAMWUwwPRH+Xk5CgzM1PNmjWTi4uL1q5da1uXlJSko0ePKjQ0VJIUGhqq3bt3KzU11VazevVqeXp6qn79+raaa8fIrckd43rc3NxsXwWQ+wIAAKWXQ68hGjt2rDp27Kjq1avr7NmzWrhwodavX6/Y2Fh5eXmpb9++GjFihCpXrixPT08NGTJEoaGhatmypSQpPDxc9evXV69evTR16lQlJydr3LhxioqKkpubmyRpwIABmj17tkaNGqXnnntOcXFx+vTTT7ViBXcmAACAqxwaiFJTU9W7d2+dPHlSXl5euvfeexUbG6tHHnlEkjRz5kw5OzurW7duyszMVEREhObMmWP7fJkyZfTVV19p4MCBCg0NVYUKFdSnTx9NmjTJVhMSEqIVK1Zo+PDhmjVrlqpVq6b33ntPERERRb6/AACgeHJoIHr//fdvut7d3V3R0dGKjo6+YU1QUJBWrlx503HatGmjnTt33lGPAACg9Ct21xABAAAUNQIRAACwPAIRAACwPAIRAACwPAIRAACwPAIRAACwPAIRAACwPAIRAACwPAIRAACwPAIRAACwPIc+ugMAUHSCx/BQa+BGmCECAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWV9bRDQAAcK3gMSsc3QIsiBkiAABgeQQiAABgeQQiAABgeXd0DVGNGjW0Y8cO+fj42C1PS0tT06ZN9fPPPxdIcwBu73qKI29EFmInAFB63dEM0ZEjR5SdnZ1neWZmpo4fP/6nmwIAAChKtzVD9OWXX9r+PTY2Vl5eXrb32dnZWrt2rYKDgwusOQAAgKJwW4GoS5cukiQnJyf16dPHbp2Li4uCg4M1ffr0AmsOAACgKNxWIMrJyZEkhYSEaMeOHapSpUqhNAWgcHFdEgDYu6OLqg8fPlzQfQAAADjMHX9T9dq1a7V27VqlpqbaZo5yffDBB3+6MQAAgKJyR4Ho1Vdf1aRJk9S8eXPdddddcnJyKui+AAAAiswdBaJ58+YpJiZGvXr1Kuh+AAAAitwdBaKsrCz95S9/KeheAPxJPBQTAO7MHX0xY79+/bRw4cKC7gUAAMAh7miG6NKlS3r33Xe1Zs0a3XvvvXJxcbFbP2PGjAJpDgAAoCjcUSD64Ycf1KRJE0nSnj177NZxgTUAAChp7igQrVu3rqD7AAAAcJg7uoYIAACgNLmjGaK2bdve9NRYXFzcHTcEAABQ1O4oEOVeP5Tr8uXLSkxM1J49e/I89BUAAKC4u6NANHPmzOsunzhxos6dO/enGgIAAChqBXoN0dNPP81zzAAAQIlToIEoPj5e7u7uBTkkAABAobujU2Zdu3a1e2+M0cmTJ/Xdd9/p//7v/wqkMQAAgKJyR4HIy8vL7r2zs7Pq1KmjSZMmKTw8vEAaAwAAKCp3FIgWLFhQ0H0AAAA4zB0FolwJCQnav3+/JKlBgwa67777CqQpAACAonRHgSg1NVXdu3fX+vXr5e3tLUlKS0tT27ZttWjRIlWtWrUgewQAAChUd3SX2ZAhQ3T27Fnt3btXZ86c0ZkzZ7Rnzx5lZGRo6NChBd0jAABAobqjGaJVq1ZpzZo1qlevnm1Z/fr1FR0dzUXVAACgxLmjQJSTkyMXF5c8y11cXJSTk/OnmwIAqwsesyLftUfeiCzETgBruKNTZu3atdOLL76oEydO2JYdP35cw4cPV/v27QusOQAAgKJwRzNEs2fPVufOnRUcHKzAwEBJ0rFjx9SwYUN9/PHHBdogABR3zOYAJd8dBaLAwEB9//33WrNmjQ4cOCBJqlevnsLCwgq0OQDArd1OIANwfbd1yiwuLk7169dXRkaGnJyc9Mgjj2jIkCEaMmSI7r//fjVo0ECbNm0qrF4BAAAKxW0ForfeekvPP/+8PD0986zz8vJS//79NWPGjAJrDgAAoCjcViDatWuXOnTocMP14eHhSkhI+NNNAQAAFKXbCkQpKSnXvd0+V9myZfXbb7/96aYAAACK0m0Forvvvlt79uy54foffvhBd911159uCgAAoCjdViB69NFH9X//93+6dOlSnnUXL17UhAkT9NhjjxVYcwAAAEXhtm67HzdunD7//HPVrl1bgwcPVp06dSRJBw4cUHR0tLKzs/XKK68USqMAAACF5bZmiPz8/LR161Y1bNhQY8eO1RNPPKEnnnhCL7/8sho2bKjNmzfLz88v3+NNnjxZ999/vypWrChfX1916dJFSUlJdjWXLl1SVFSUfHx85OHhoW7duiklJcWu5ujRo4qMjFT58uXl6+urkSNH6sqVK3Y169evV9OmTeXm5qZatWopJibmdnYdAACUYrf96I6goCCtXLlSp06d0vbt27Vt2zadOnVKK1euVEhIyG2NtWHDBkVFRWnbtm1avXq1Ll++rPDwcJ0/f95WM3z4cC1fvlxLlizRhg0bdOLECXXt2tW2Pjs7W5GRkcrKytLWrVv14YcfKiYmRuPHj7fVHD58WJGRkWrbtq0SExM1bNgw9evXT7Gxsbe7+wAAoBS6o2+qlqRKlSrp/vvv/1MbX7Vqld37mJgY+fr6KiEhQa1atVJ6erref/99LVy4UO3atZMkLViwQPXq1dO2bdvUsmVLffPNN9q3b5/WrFkjPz8/NWnSRK+99ppGjx6tiRMnytXVVfPmzVNISIimT58u6eq3am/evFkzZ85URETEn9oHAABQ8t1xICoM6enpkqTKlStLkhISEnT58mW7R4LUrVtX1atXV3x8vFq2bKn4+Hg1atTI7lRdRESEBg4cqL179+q+++5TfHx8nseKREREaNiwYdftIzMzU5mZmbb3GRkZBbWLAEoQHokBWMcdPe2+MOTk5GjYsGF68MEH1bBhQ0lScnKyXF1d5e3tbVfr5+en5ORkW80fr1vKfX+rmoyMDF28eDFPL5MnT5aXl5ftlfsAWwAAUDoVm0AUFRWlPXv2aNGiRY5uRWPHjlV6errtdezYMUe3BAAAClGxOGU2ePBgffXVV9q4caOqVatmW+7v76+srCylpaXZzRKlpKTI39/fVvPtt9/ajZd7F9q1NX+8My0lJUWe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MhRvbm5umjBhQp7TmCg+OEbFH8eo+OMYOZZlvpgRAADgRizxxYwAAAA3QyACAACWRyACAACWRyACAACWRyBCkdi4caM6deqkgIAAOTk5admyZXbrU1JS9MwzzyggIEDly5dXhw4ddPDgQbuaQ4cO6YknnlDVqlXl6empp556Ks+3j585c0Y9e/aUp6envL291bdvX507d66wd69UmDx5su6//35VrFhRvr6+6tKli5KSkuxqLl26pKioKPn4+MjDw0PdunXLcwyOHj2qyMhIlS9fXr6+vho5cqSuXLliV7N+/Xo1bdpUbm5uqlWrlmJiYgp790qFgjpGQ4cOVbNmzeTm5qYmTZpcd1s//PCDHn74Ybm7uyswMFBTp04trN0qNQri+OzatUs9evRQYGCgypUrp3r16mnWrFl5tsXvUMEjEKFInD9/Xo0bN1Z0dHSedcYYdenSRT///LO++OIL7dy5U0FBQQoLC9P58+dtnw8PD5eTk5Pi4uK0ZcsWZWVlqVOnTsrJybGN1bNnT+3du1erV6/WV199pY0bN+qFF14osv0syTZs2KCoqCht27ZNq1ev1uXLlxUeHm47BpI0fPhwLV++XEuWLNGGDRt04sQJde3a1bY+OztbkZGRysrK0tatW/Xhhx8qJiZG48ePt9UcPnxYkZGRatu2rRITEzVs2DD169dPsbE85PhWCuIY5Xruuef0t7/97brbycjIUHh4uIKCgpSQkKBp06Zp4sSJevfddwtt30qDgjg+CQkJ8vX11ccff6y9e/fqlVde0dixYzV79mxbDb9DhcQARUySWbp0qe19UlKSkWT27NljW5adnW2qVq1q5s+fb4wxJjY21jg7O5v09HRbTVpamnFycjKrV682xhizb98+I8ns2LHDVvP1118bJycnc/z48ULeq9InNTXVSDIbNmwwxlz9ebu4uJglS5bYavbv328kmfj4eGOMMStXrjTOzs4mOTnZVjN37lzj6elpMjMzjTHGjBo1yjRo0MBuW3/7299MREREYe9SqXMnx+haEyZMMI0bN86zfM6cOaZSpUq2Y2aMMaNHjzZ16tQp+J0oxf7s8ck1aNAg07ZtW9t7focKBzNEcLjMzExJkru7u22Zs7Oz3NzctHnzZluNk5OT3ReWubu7y9nZ2VYTHx8vb29vNW/e3FYTFhYmZ2dnbd++vSh2pVRJ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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAHHCAYAAABeLEexAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABFAklEQVR4nO3de1hVVeL/8c8B4YjoOSgKyIi3LBWveRml0jJJVLKc7NdkplaaaVCjNmp8x0nTGTW7mJXWNDU6M2leKp2+ahKCtxLNKFQ0mXR0sBIoFY6agsL+/eHD/noCDQg5B/b79Tz7Gc/a6+y9FmuUT2uvvbfNMAxDAAAAFubj6QYAAAB4GoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIwM9q2bKlHnroIU83o9xmzpwpm82mH374wdNNqTI2m00zZ870dDOAWotABNRQS5culc1mM7e6devqhhtuUHx8vHJycjzdvAqZM2eO1q5d6+lmVNhtt93mNgaXb+3atavWtsybN082m02JiYll7h88eLCcTqe+++67am0XUFPU8XQDAPwys2bNUqtWrXT+/Hl98sknev3117VhwwZlZGSoXr16VXKOzMxM+fhcu/9+mjNnju69914NHTr0mp3jWmnWrJnmzp1bqtzpdFZrO5566iktX75cjz/+uDIyMhQQEGDuW716tT766CMtWrRI4eHh1douoKYgEAE13KBBg9SjRw9J0tixYxUcHKyXXnpJ//rXvzR8+PAyv3P27FkFBgaW+xx2u71K2lobOZ1OPfjgg55uhvz8/PTmm2/q5ptv1uzZszVnzhxJ0unTpzVx4kT17t1b48ePv+btKC4uVmFhoerWrXvNzwVUJS6ZAbXM7bffLkk6cuSIJOmhhx5S/fr1dfjwYQ0ePFgNGjTQiBEjJF0KRk899ZQiIiJkt9vVtm1bvfDCCzIMw+2YZa0hysvL08SJE83vtmnTRs8995yKi4vd6hUXF2vhwoXq1KmT6tatqyZNmmjgwIH6/PPPJV1aG3P27Fn9/e9/Ny83lZyr5Jd5y5YtZbfbFRISojvuuENffPFFuX4WP/zwg+677z45HA4FBwfrd7/7nc6fP2/uv/XWW9WlS5cyv9u2bVvFxMSU6zw/p2RN06FDh/TQQw8pKChITqdTDz/8sH788Ue3ugUFBZo0aZKaNGmiBg0a6K677tI333xTrvOUhJ4XXnhBBw4ckCRNnz5dubm5evPNN+Xj41PucXvhhRd00003KTg4WAEBAerevbvee++9Uue02WyKj4/XsmXL1KFDB9ntdm3cuLGSPynAc5ghAmqZw4cPS5KCg4PNsosXLyomJka33HKLXnjhBdWrV0+GYeiuu+7S5s2bNWbMGHXt2lWJiYmaMmWKvv32Wy1YsOCK5/jxxx9166236ttvv9Vjjz2m5s2ba8eOHUpISNDx48f18ssvm3XHjBmjpUuXatCgQRo7dqwuXryo7du3a+fOnerRo4f++c9/auzYsfr1r3+tcePGSZKuu+46SdL48eP13nvvKT4+XpGRkTpx4oQ++eQTffXVV+rWrdvP/izuu+8+tWzZUnPnztXOnTv1yiuv6NSpU/rHP/4hSRo5cqQeffRRZWRkqGPHjub3du/erX//+9+aPn36z56jqKiozMXbAQEBpWbh7rvvPrVq1Upz587VF198obfeekshISF67rnnzDpjx47VO++8owceeEA33XSTUlJSFBsb+7PtKDF37lytXbtWjz32mF5++WUtWrRIU6ZMUadOnSo0bgsXLtRdd92lESNGqLCwUCtWrND/+3//T+vWrSvVnpSUFK1atUrx8fFq3LixWrZsWe72Al7DAFAjLVmyxJBkbNq0yfj++++NY8eOGStWrDCCg4ONgIAA45tvvjEMwzBGjx5tSDKefvppt++vXbvWkGT86U9/ciu/9957DZvNZhw6dMgsa9GihTF69Gjz8+zZs43AwEDj3//+t9t3n376acPX19fIysoyDMMwUlJSDEnGk08+War9xcXF5p8DAwPdjl/C6XQacXFx5fuBXGbGjBmGJOOuu+5yK3/88ccNScaePXsMwzCMvLw8o27dusa0adPc6j355JNGYGCgcebMmaue59ZbbzUklbk99thjpdrzyCOPuH3/N7/5jREcHGx+Tk9PNyQZjz/+uFu9Bx54wJBkzJgxo1z9f++99wxJRqNGjYzWrVsbP/74o2EY5R83wzDM75QoLCw0OnbsaNx+++1u5ZIMHx8fY//+/eVqG+CtuGQG1HDR0dFq0qSJIiIidP/996t+/fpas2aNfvWrX7nVmzBhgtvnDRs2yNfXV08++aRb+VNPPSXDMPTRRx9d8ZyrV69Wnz591LBhQ/3www/mFh0draKiIm3btk2S9P7778tms2nGjBmljmGz2X62b0FBQdq1a1el74yKi4tz+/zEE09IutR36dL6n7vvvlvvvvuueZmwqKhIK1eu1NChQ8u1zqply5ZKSkoqtU2cOLFU3Z+u4enTp49OnDghl8vl1q6fjklZx7qaYcOGafDgwTp58qQWLVpkLrAu77hJcluUferUKeXn56tPnz5lXq689dZbFRkZWaE2At6GS2ZADbdo0SLdcMMNqlOnjkJDQ9W2bdtSd4TVqVNHzZo1cyv773//q/DwcDVo0MCtvH379ub+K/n666+1d+9eNWnSpMz9ubm5ki5dvgsPD1ejRo0q3C9Jmj9/vkaPHq2IiAh1795dgwcP1qhRo9S6detyff/66693+3zdddfJx8dHR48eNctGjRqllStXavv27erbt682bdqknJwcjRw5slznCAwMVHR0dLnqNm/e3O1zw4YNJV0KHA6HQ//973/l4+NjXjIs0bZt23Id/3I9e/bUhg0bzAX3UvnHTZLWrVunP/3pT0pPT1dBQYFZXlaQbdWqVYXbB3gbAhFQw/361792+6VXFrvdXqW3zRcXF+uOO+7Q1KlTy9x/ww03VMl57rvvPvXp00dr1qzRxx9/rOeff17PPfecPvjgAw0aNKjCxyvrl3lMTIxCQ0P1zjvvqG/fvnrnnXcUFhZW7pBTEb6+vmWWGz9ZxH6tlHfctm/frrvuukt9+/bV4sWL1bRpU/n5+WnJkiVavnx5qe9dPpsE1FQEIsCiWrRooU2bNun06dNus0QHDx4091/JddddpzNnzvxsaLjuuuuUmJiokydPXnWW6GqXz5o2barHH39cjz/+uHJzc9WtWzf9+c9/Llcg+vrrr91mLw4dOqTi4mK3Rb++vr564IEHtHTpUj333HNau3atHn300SuGl2upRYsWKi4u1uHDh91mhTIzM6vk+OUdt/fff19169ZVYmKi2yMXlixZUiXtALwRa4gAixo8eLCKior02muvuZUvWLBANpvtqoHjvvvuU2pqaplPRc7Ly9PFixclXVrLYhiGnn322VL1Lp8VCQwMVF5entv+oqIi5efnu5WFhIQoPDzc7RLO1SxatMjt86uvvipJpfo2cuRInTp1So899pjOnDnjsecKlbTrlVdecSu//O6vX6K84+br6yubzaaioiJz/9GjR2vk08SB8mKGCLCoIUOGqF+/fvrDH/6go0ePqkuXLvr444/1r3/9SxMnTiy1juVyU6ZM0Ycffqg777xTDz30kLp3766zZ89q3759eu+993T06FE1btxY/fr108iRI/XKK6/o66+/1sCBA1VcXKzt27erX79+io+PlyR1795dmzZt0ksvvaTw8HC1atVKbdu2VbNmzXTvvfeqS5cuql+/vjZt2qTdu3frxRdfLFcfjxw5orvuuksDBw5UamqqeTv7T589dOONN6pjx45avXq12rdvX65b+kvk5+frnXfeKXNfRYNV165dNXz4cC1evFj5+fm66aablJycrEOHDlXoOFdS3nGLjY3VSy+9pIEDB+qBBx5Qbm6uFi1apDZt2mjv3r1V0hbA63j0HjcAlVZy2/3u3buvWm/06NFGYGBgmftOnz5tTJo0yQgPDzf8/PyM66+/3nj++efdbok3jNK33Zd8NyEhwWjTpo3h7+9vNG7c2LjpppuMF154wSgsLDTrXbx40Xj++eeNdu3aGf7+/kaTJk2MQYMGGWlpaWadgwcPGn379jUCAgIMScbo0aONgoICY8qUKUaXLl2MBg0aGIGBgUaXLl2MxYsX/+zPpuQ29wMHDhj33nuv0aBBA6Nhw4ZGfHy8ce7cuTK/M3/+fEOSMWfOnJ89fomr3XZ/+T+vJe35/vvv3b5fMoZHjhwxy86dO2c8+eSTRnBwsBEYGGgMGTLEOHbsWIVuu7/aOcs7bm+//bZx/fXXG3a73WjXrp2xZMkS85iXk1SpRyMA3sZmGNW0mg9AjRUREaGYmBi99dZbnm7KNbNw4UJNmjRJR48eLXU3GIDajzVEAK7qwoULOnHihBo3buzpplwzhmHo7bff1q233koYAiyKNUQArigxMVErVqzQuXPn1L9/f083p8qdPXtWH374oTZv3qx9+/bpX//6l6ebBMBDuGQG4Ir69eunQ4cOacKECfqf//kfTzenyh09elStWrVSUFCQHn/8cf35z3/2dJMAeAiBCAAAWB5riAAAgOURiAAAgOWxqLociouL9d1336lBgwblekM3AADwPMMwdPr0aYWHh//s+xwJROXw3XffKSIiwtPNAAAAlXDs2DE1a9bsqnUIROVQ8uLLY8eOyeFweLg1AACgPFwulyIiItxeYH0lBKJyKLlM5nA4CEQAANQw5VnuwqJqAABgeQQiAABgeQQiAABgeQQiAABgeQQiAABgeQQiAABgeQQiAABgeQQiAABgeQQiAABgeQQiAABgeQQiAABgeQQiAABgeQQiAABgeQQiAABgeQQiAABgeXU83QAA8JSWT68vVXZ0XqwHWgLA05ghAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAluc1gWjevHmy2WyaOHGiWXb+/HnFxcUpODhY9evX17Bhw5STk+P2vaysLMXGxqpevXoKCQnRlClTdPHiRbc6W7ZsUbdu3WS329WmTRstXbq0GnoEAABqCq+47X737t36y1/+os6dO7uVT5o0SevXr9fq1avldDoVHx+ve+65R59++qkkqaioSLGxsQoLC9OOHTt0/PhxjRo1Sn5+fpozZ44k6ciRI4qNjdX48eO1bNkyJScna+zYsWratKliYmKqva8AvBu34gPW5PEZojNnzmjEiBH661//qoYNG5rl+fn5evvtt/XSSy/p9ttvV/fu3bVkyRLt2LFDO3fulCR9/PHHOnDggN555x117dpVgwYN0uzZs7Vo0SIVFhZKkt544w21atVKL774otq3b6/4+Hjde++9WrBggUf6CwAAvI/HA1FcXJxiY2MVHR3tVp6WlqYLFy64lbdr107NmzdXamqqJCk1NVWdOnVSaGioWScmJkYul0v79+836/z02DExMeYxAAAAPHrJbMWKFfriiy+0e/fuUvuys7Pl7++voKAgt/LQ0FBlZ2ebdS4PQyX7S/ZdrY7L5dK5c+cUEBBQ6twFBQUqKCgwP7tcrop3DgAA1BgemyE6duyYfve732nZsmWqW7eup5pRprlz58rpdJpbRESEp5sEAACuIY/NEKWlpSk3N1fdunUzy4qKirRt2za99tprSkxMVGFhofLy8txmiXJychQWFiZJCgsL02effeZ23JK70C6v89M703JycuRwOMqcHZKkhIQETZ482fzscrkIRUAVYMEyAG/lsRmi/v37a9++fUpPTze3Hj16aMSIEeaf/fz8lJycbH4nMzNTWVlZioqKkiRFRUVp3759ys3NNeskJSXJ4XAoMjLSrHP5MUrqlByjLHa7XQ6Hw20DAAC1l8dmiBo0aKCOHTu6lQUGBio4ONgsHzNmjCZPnqxGjRrJ4XDoiSeeUFRUlHr37i1JGjBggCIjIzVy5EjNnz9f2dnZmj59uuLi4mS32yVJ48eP12uvvaapU6fqkUceUUpKilatWqX160v/lyoAALAmr3gO0ZUsWLBAPj4+GjZsmAoKChQTE6PFixeb+319fbVu3TpNmDBBUVFRCgwM1OjRozVr1iyzTqtWrbR+/XpNmjRJCxcuVLNmzfTWW2/xDCIAAGCyGYZheLoR3s7lcsnpdCo/P5/LZ8Av4G1riMpqT1lY5wTUTBX5/e3x5xABAAB4GoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYnlc/qRpAzeBtD1wEgIpihggAAFgegQgAAFgegQgAAFgea4gAXBPlfXHqleqxBglAdWKGCAAAWB6BCAAAWB6BCAAAWB6BCAAAWB6BCAAAWB6BCAAAWB6BCAAAWB6BCAAAWB6BCAAAWB6BCAAAWB6BCAAAWB7vMgNQIeV9RxkA1CTMEAEAAMsjEAEAAMsjEAEAAMtjDRGAWqesdU5H58V6oCUAagpmiAAAgOURiAAAgOURiAAAgOV5NBC9/vrr6ty5sxwOhxwOh6KiovTRRx+Z+2+77TbZbDa3bfz48W7HyMrKUmxsrOrVq6eQkBBNmTJFFy9edKuzZcsWdevWTXa7XW3atNHSpUuro3sAAKCG8Oii6mbNmmnevHm6/vrrZRiG/v73v+vuu+/Wl19+qQ4dOkiSHn30Uc2aNcv8Tr169cw/FxUVKTY2VmFhYdqxY4eOHz+uUaNGyc/PT3PmzJEkHTlyRLGxsRo/fryWLVum5ORkjR07Vk2bNlVMTEz1dhgAAHgljwaiIUOGuH3+85//rNdff107d+40A1G9evUUFhZW5vc//vhjHThwQJs2bVJoaKi6du2q2bNna9q0aZo5c6b8/f31xhtvqFWrVnrxxRclSe3bt9cnn3yiBQsWEIgAAIAkL1pDVFRUpBUrVujs2bOKiooyy5ctW6bGjRurY8eOSkhI0I8//mjuS01NVadOnRQaGmqWxcTEyOVyaf/+/Wad6Ohot3PFxMQoNTX1im0pKCiQy+Vy2wAAQO3l8ecQ7du3T1FRUTp//rzq16+vNWvWKDIyUpL0wAMPqEWLFgoPD9fevXs1bdo0ZWZm6oMPPpAkZWdnu4UhSebn7Ozsq9ZxuVw6d+6cAgICSrVp7ty5evbZZ6u8rwAAwDt5PBC1bdtW6enpys/P13vvvafRo0dr69atioyM1Lhx48x6nTp1UtOmTdW/f38dPnxY11133TVrU0JCgiZPnmx+drlcioiIuGbnAwAAnuXxS2b+/v5q06aNunfvrrlz56pLly5auHBhmXV79eolSTp06JAkKSwsTDk5OW51Sj6XrDu6Uh2Hw1Hm7JAk2e128863kg0AANReHg9EP1VcXKyCgoIy96Wnp0uSmjZtKkmKiorSvn37lJuba9ZJSkqSw+EwL7tFRUUpOTnZ7ThJSUlu65QAAIC1efSSWUJCggYNGqTmzZvr9OnTWr58ubZs2aLExEQdPnxYy5cv1+DBgxUcHKy9e/dq0qRJ6tu3rzp37ixJGjBggCIjIzVy5EjNnz9f2dnZmj59uuLi4mS32yVJ48eP12uvvaapU6fqkUceUUpKilatWqX160u/6wgAAFiTRwNRbm6uRo0apePHj8vpdKpz585KTEzUHXfcoWPHjmnTpk16+eWXdfbsWUVERGjYsGGaPn26+X1fX1+tW7dOEyZMUFRUlAIDAzV69Gi35xa1atVK69ev16RJk7Rw4UI1a9ZMb731FrfcAwAAk0cD0dtvv33FfREREdq6devPHqNFixbasGHDVevcdttt+vLLLyvcPgDer6w32wNARXndGiIAAIDqRiACAACWRyACAACWRyACAACW5/EnVQNAdWDxNYCrYYYIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYXh1PNwCobVo+vb7M8qPzYqu5JQCA8mKGCAAAWB4zRABqjCvNvgHAL8UMEQAAsDwCEQAAsDwCEQAAsDyPBqLXX39dnTt3lsPhkMPhUFRUlD766CNz//nz5xUXF6fg4GDVr19fw4YNU05OjtsxsrKyFBsbq3r16ikkJERTpkzRxYsX3eps2bJF3bp1k91uV5s2bbR06dLq6B4AAKghPBqImjVrpnnz5iktLU2ff/65br/9dt19993av3+/JGnSpEn63//9X61evVpbt27Vd999p3vuucf8flFRkWJjY1VYWKgdO3bo73//u5YuXapnnnnGrHPkyBHFxsaqX79+Sk9P18SJEzV27FglJiZWe38BAIB3shmGYXi6EZdr1KiRnn/+ed17771q0qSJli9frnvvvVeSdPDgQbVv316pqanq3bu3PvroI91555367rvvFBoaKkl64403NG3aNH3//ffy9/fXtGnTtH79emVkZJjnuP/++5WXl6eNGzeWq00ul0tOp1P5+flyOBxV32nUKrX9OUTVdadXWT8vT91lVlvGDrCaivz+9po1REVFRVqxYoXOnj2rqKgopaWl6cKFC4qOjjbrtGvXTs2bN1dqaqokKTU1VZ06dTLDkCTFxMTI5XKZs0ypqaluxyipU3KMshQUFMjlcrltAACg9vJ4INq3b5/q168vu92u8ePHa82aNYqMjFR2drb8/f0VFBTkVj80NFTZ2dmSpOzsbLcwVLK/ZN/V6rhcLp07d67MNs2dO1dOp9PcIiIiqqKrAADAS3k8ELVt21bp6enatWuXJkyYoNGjR+vAgQMebVNCQoLy8/PN7dixYx5tDwAAuLY8/qRqf39/tWnTRpLUvXt37d69WwsXLtRvf/tbFRYWKi8vz22WKCcnR2FhYZKksLAwffbZZ27HK7kL7fI6P70zLScnRw6HQwEBAWW2yW63y263V0n/AACA9/P4DNFPFRcXq6CgQN27d5efn5+Sk5PNfZmZmcrKylJUVJQkKSoqSvv27VNubq5ZJykpSQ6HQ5GRkWady49RUqfkGAAAAB6dIUpISNCgQYPUvHlznT59WsuXL9eWLVuUmJgop9OpMWPGaPLkyWrUqJEcDoeeeOIJRUVFqXfv3pKkAQMGKDIyUiNHjtT8+fOVnZ2t6dOnKy4uzpzhGT9+vF577TVNnTpVjzzyiFJSUrRq1SqtX887kQAAwCUeDUS5ubkaNWqUjh8/LqfTqc6dOysxMVF33HGHJGnBggXy8fHRsGHDVFBQoJiYGC1evNj8vq+vr9atW6cJEyYoKipKgYGBGj16tGbNmmXWadWqldavX69JkyZp4cKFatasmd566y3FxMRUe38BAIB38mggevvtt6+6v27dulq0aJEWLVp0xTotWrTQhg0brnqc2267TV9++WWl2ggAAGo/r1tDBAAAUN0IRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPI8/qRqACiLp95sD8CamCECAACWRyACAACWRyACAACWRyACAACWx6JqoJzKWuR7dF6sB1pSfVjYDMAqmCECAACWRyACAACWRyACAACWxxoi4BdgjQ0A1A7MEAEAAMtjhggAfoYV7zAErIYZIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHk8hwgoA0+gBgBrYYYIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYnkcD0dy5c9WzZ081aNBAISEhGjp0qDIzM93q3HbbbbLZbG7b+PHj3epkZWUpNjZW9erVU0hIiKZMmaKLFy+61dmyZYu6desmu92uNm3aaOnSpde6ewAAoIbwaCDaunWr4uLitHPnTiUlJenChQsaMGCAzp4961bv0Ucf1fHjx81t/vz55r6ioiLFxsaqsLBQO3bs0N///nctXbpUzzzzjFnnyJEjio2NVb9+/ZSenq6JEydq7NixSkxMrLa+AgAA7+XRBzNu3LjR7fPSpUsVEhKitLQ09e3b1yyvV6+ewsLCyjzGxx9/rAMHDmjTpk0KDQ1V165dNXv2bE2bNk0zZ86Uv7+/3njjDbVq1UovvviiJKl9+/b65JNPtGDBAsXExFy7DgIAgBrBq9YQ5efnS5IaNWrkVr5s2TI1btxYHTt2VEJCgn788UdzX2pqqjp16qTQ0FCzLCYmRi6XS/v37zfrREdHux0zJiZGqamp16orAACgBvGaV3cUFxdr4sSJuvnmm9WxY0ez/IEHHlCLFi0UHh6uvXv3atq0acrMzNQHH3wgScrOznYLQ5LMz9nZ2Vet43K5dO7cOQUEBLjtKygoUEFBgfnZ5XJVXUcBAIDX8ZpAFBcXp4yMDH3yySdu5ePGjTP/3KlTJzVt2lT9+/fX4cOHdd11112TtsydO1fPPvvsNTk2AADwPl5xySw+Pl7r1q3T5s2b1axZs6vW7dWrlyTp0KFDkqSwsDDl5OS41Sn5XLLu6Ep1HA5HqdkhSUpISFB+fr65HTt2rHIdAwAANYJHA5FhGIqPj9eaNWuUkpKiVq1a/ex30tPTJUlNmzaVJEVFRWnfvn3Kzc016yQlJcnhcCgyMtKsk5yc7HacpKQkRUVFlXkOu90uh8PhtgEAgNrLo4EoLi5O77zzjpYvX64GDRooOztb2dnZOnfunCTp8OHDmj17ttLS0nT06FF9+OGHGjVqlPr27avOnTtLkgYMGKDIyEiNHDlSe/bsUWJioqZPn664uDjZ7XZJ0vjx4/Wf//xHU6dO1cGDB7V48WKtWrVKkyZN8ljfAQCA9/BoIHr99deVn5+v2267TU2bNjW3lStXSpL8/f21adMmDRgwQO3atdNTTz2lYcOG6X//93/NY/j6+mrdunXy9fVVVFSUHnzwQY0aNUqzZs0y67Rq1Urr169XUlKSunTpohdffFFvvfUWt9wDAABJHl5UbRjGVfdHRERo69atP3ucFi1aaMOGDVetc9ttt+nLL7+sUPsAAIA1eM1dZoCntHx6vaebAADwMK+4ywwAAMCTmCECIImZMgDWxgwRAACwvEoFotatW+vEiROlyvPy8tS6detf3CgAAIDqVKlAdPToURUVFZUqLygo0LfffvuLGwUAAFCdKrSG6MMPPzT/nJiYKKfTaX4uKipScnKyWrZsWWWNAwAAqA4VCkRDhw6VJNlsNo0ePdptn5+fn1q2bKkXX3yxyhoHAABQHSoUiIqLiyVdevLz7t271bhx42vSKAAAgOpUqdvujxw5UtXtAAAA8JhKP4coOTlZycnJys3NNWeOSvztb3/7xQ0DAACoLpUKRM8++6xmzZqlHj16qGnTprLZbFXdLgAAgGpTqUD0xhtvaOnSpRo5cmRVtwcAAKDaVeo5RIWFhbrpppuqui0AAAAeUalANHbsWC1fvryq2wIAAOARlbpkdv78eb355pvatGmTOnfuLD8/P7f9L730UpU0DgAAoDpUKhDt3btXXbt2lSRlZGS47WOBNQAAqGkqFYg2b95c1e0AAADwmEqtIQIAAKhNKjVD1K9fv6teGktJSal0gwAAAKpbpQJRyfqhEhcuXFB6eroyMjJKvfQVAADA21UqEC1YsKDM8pkzZ+rMmTO/qEEAAADVrdLvMivLgw8+qF//+td64YUXqvKwQK3Q8un1pcqOzov1QEsAAD9VpYuqU1NTVbdu3ao8JAAAwDVXqRmie+65x+2zYRg6fvy4Pv/8c/3xj3+skoYBAABUl0oFIqfT6fbZx8dHbdu21axZszRgwIAqaRgAAEB1qVQgWrJkSVW3AwAAwGN+0aLqtLQ0ffXVV5KkDh066MYbb6ySRgEAAFSnSgWi3Nxc3X///dqyZYuCgoIkSXl5eerXr59WrFihJk2aVGUbAQAArqlK3WX2xBNP6PTp09q/f79OnjypkydPKiMjQy6XS08++WRVtxEAAOCaqtQM0caNG7Vp0ya1b9/eLIuMjNSiRYtYVA2vVtazgAAAqNQMUXFxsfz8/EqV+/n5qbi4+Bc3CgAAoDpVKhDdfvvt+t3vfqfvvvvOLPv22281adIk9e/fv9zHmTt3rnr27KkGDRooJCREQ4cOVWZmplud8+fPKy4uTsHBwapfv76GDRumnJwctzpZWVmKjY1VvXr1FBISoilTpujixYtudbZs2aJu3brJbrerTZs2Wrp0acU7DgAAaqVKXTJ77bXXdNddd6lly5aKiIiQJB07dkwdO3bUO++8U+7jbN26VXFxcerZs6cuXryo//mf/9GAAQN04MABBQYGSpImTZqk9evXa/Xq1XI6nYqPj9c999yjTz/9VJJUVFSk2NhYhYWFaceOHTp+/LhGjRolPz8/zZkzR5J05MgRxcbGavz48Vq2bJmSk5M1duxYNW3aVDExMZX5EQA1GpcOAcCdzTAMozJfNAxDmzZt0sGDByVJ7du3V3R09C9qzPfff6+QkBBt3bpVffv2VX5+vpo0aaLly5fr3nvvlSQdPHhQ7du3V2pqqnr37q2PPvpId955p7777juFhoZKkt544w1NmzZN33//vfz9/TVt2jStX79eGRkZ5rnuv/9+5eXlaePGjT/bLpfLJafTqfz8fDkcjl/UR3iWtwUBT73LzNt+DjUR76EDvF9Ffn9X6JJZSkqKIiMj5XK5ZLPZdMcdd+iJJ57QE088oZ49e6pDhw7avn17pRuen58vSWrUqJGkS885unDhglvQateunZo3b67U1FRJl96f1qlTJzMMSVJMTIxcLpf2799v1vlpWIuJiTGP8VMFBQVyuVxuGwAAqL0qFIhefvllPfroo2WmLKfTqccee0wvvfRSpRpSXFysiRMn6uabb1bHjh0lSdnZ2fL39zefdVQiNDRU2dnZZp3Lw1DJ/pJ9V6vjcrl07ty5Um2ZO3eunE6nuZVcFgQAALVThQLRnj17NHDgwCvuHzBggNLS0irVkLi4OGVkZGjFihWV+n5VSkhIUH5+vrkdO3bM000CAADXUIUWVefk5JR5u715sDp19P3331e4EfHx8Vq3bp22bdumZs2ameVhYWEqLCxUXl6e2yxRTk6OwsLCzDqfffZZqXaW7Cv535/emZaTkyOHw6GAgIBS7bHb7bLb7RXuBwAAqJkqNEP0q1/9ym1h8k/t3btXTZs2LffxDMNQfHy81qxZo5SUFLVq1cptf/fu3eXn56fk5GSzLDMzU1lZWYqKipIkRUVFad++fcrNzTXrJCUlyeFwKDIy0qxz+TFK6pQcAwAAWFuFAtHgwYP1xz/+UefPny+179y5c5oxY4buvPPOch8vLi5O77zzjpYvX64GDRooOztb2dnZ5roep9OpMWPGaPLkydq8ebPS0tL08MMPKyoqSr1795Z06TJdZGSkRo4cqT179igxMVHTp09XXFycOcszfvx4/ec//9HUqVN18OBBLV68WKtWrdKkSZMq0n0AAFBLVei2+5ycHHXr1k2+vr6Kj49X27ZtJV26FX7RokUqKirSF198UWoB8xVPbrOVWb5kyRI99NBDki49mPGpp57Su+++q4KCAsXExGjx4sXm5TBJ+u9//6sJEyZoy5YtCgwM1OjRozVv3jzVqfN/VwS3bNmiSZMm6cCBA2rWrJn++Mc/muf4Odx2X3t42+3m3HZfc3HbPeD9KvL7u8LPISoJH4mJiSr5qs1mU0xMjBYtWlTqsldtQCCqPbwtCBCIai4CEeD9KvL7u8JPqm7RooU2bNigU6dO6dChQzIMQ9dff70aNmxY6QYDAAB4UqVe3SFJDRs2VM+ePauyLQAAAB5RqZe7AgAA1CYEIgAAYHmVvmQGoPqUtQiaRb0AUHWYIQIAAJZHIAIAAJZHIAIAAJbHGiLAg1gbBADegRkiAABgecwQAUAlMLsH1C7MEAEAAMtjhgi1Fi8wBQCUFzNEAADA8ghEAADA8ghEAADA8ghEAADA8ghEAADA8ghEAADA8ghEAADA8ngOEVDL8TwmAPh5zBABAADLY4YI8DLM6ABA9SMQoVYgRAAAfgkumQEAAMsjEAEAAMsjEAEAAMsjEAEAAMsjEAEAAMsjEAEAAMvjtnughirrUQNH58V6oCUAUPMRiIBahOcxAUDlePSS2bZt2zRkyBCFh4fLZrNp7dq1bvsfeugh2Ww2t23gwIFudU6ePKkRI0bI4XAoKChIY8aM0ZkzZ9zq7N27V3369FHdunUVERGh+fPnX+uuAQCAGsSjgejs2bPq0qWLFi1adMU6AwcO1PHjx83t3Xffdds/YsQI7d+/X0lJSVq3bp22bdumcePGmftdLpcGDBigFi1aKC0tTc8//7xmzpypN99885r1CwAA1CwevWQ2aNAgDRo06Kp17Ha7wsLCytz31VdfaePGjdq9e7d69OghSXr11Vc1ePBgvfDCCwoPD9eyZctUWFiov/3tb/L391eHDh2Unp6ul156yS04AQAA6/L6u8y2bNmikJAQtW3bVhMmTNCJEyfMfampqQoKCjLDkCRFR0fLx8dHu3btMuv07dtX/v7+Zp2YmBhlZmbq1KlTZZ6zoKBALpfLbQMAALWXVweigQMH6h//+IeSk5P13HPPaevWrRo0aJCKiookSdnZ2QoJCXH7Tp06ddSoUSNlZ2ebdUJDQ93qlHwuqfNTc+fOldPpNLeIiIiq7hoAAPAiXn2X2f3332/+uVOnTurcubOuu+46bdmyRf37979m501ISNDkyZPNzy6Xi1AEAEAt5tUzRD/VunVrNW7cWIcOHZIkhYWFKTc3163OxYsXdfLkSXPdUVhYmHJyctzqlHy+0toku90uh8PhtgEAgNqrRgWib775RidOnFDTpk0lSVFRUcrLy1NaWppZJyUlRcXFxerVq5dZZ9u2bbpw4YJZJykpSW3btlXDhg2rtwMAAMAreTQQnTlzRunp6UpPT5ckHTlyROnp6crKytKZM2c0ZcoU7dy5U0ePHlVycrLuvvtutWnTRjExMZKk9u3ba+DAgXr00Uf12Wef6dNPP1V8fLzuv/9+hYeHS5IeeOAB+fv7a8yYMdq/f79WrlyphQsXul0SAwAA1ubRQPT555/rxhtv1I033ihJmjx5sm688UY988wz8vX11d69e3XXXXfphhtu0JgxY9S9e3dt375ddrvdPMayZcvUrl079e/fX4MHD9Ytt9zi9owhp9Opjz/+WEeOHFH37t311FNP6ZlnnuGWewAAYLIZhmF4uhHezuVyyel0Kj8/n/VEXoDXU8Bb8S45wLtU5Pd3jVpDBAAAcC0QiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOV59dvuAR7CCACoDswQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAy6vj6QYAQG3R8un1pcqOzov1QEsAVBQzRAAAwPIIRAAAwPI8Goi2bdumIUOGKDw8XDabTWvXrnXbbxiGnnnmGTVt2lQBAQGKjo7W119/7Vbn5MmTGjFihBwOh4KCgjRmzBidOXPGrc7evXvVp08f1a1bVxEREZo/f/617hoAAKhBPBqIzp49qy5dumjRokVl7p8/f75eeeUVvfHGG9q1a5cCAwMVExOj8+fPm3VGjBih/fv3KykpSevWrdO2bds0btw4c7/L5dKAAQPUokULpaWl6fnnn9fMmTP15ptvXvP+AQCAmsFmGIbh6UZIks1m05o1azR06FBJl2aHwsPD9dRTT+n3v/+9JCk/P1+hoaFaunSp7r//fn311VeKjIzU7t271aNHD0nSxo0bNXjwYH3zzTcKDw/X66+/rj/84Q/Kzs6Wv7+/JOnpp5/W2rVrdfDgwXK1zeVyyel0Kj8/Xw6Ho+o7jysqa5EqUJOwqBrwnIr8/vbaNURHjhxRdna2oqOjzTKn06levXopNTVVkpSamqqgoCAzDElSdHS0fHx8tGvXLrNO3759zTAkSTExMcrMzNSpU6fKPHdBQYFcLpfbBgAAai+vDUTZ2dmSpNDQULfy0NBQc192drZCQkLc9tepU0eNGjVyq1PWMS4/x0/NnTtXTqfT3CIiIn55hwAAgNfy2kDkSQkJCcrPzze3Y8eOebpJAADgGvLaQBQWFiZJysnJcSvPyckx94WFhSk3N9dt/8WLF3Xy5Em3OmUd4/Jz/JTdbpfD4XDbAABA7eW1gahVq1YKCwtTcnKyWeZyubRr1y5FRUVJkqKiopSXl6e0tDSzTkpKioqLi9WrVy+zzrZt23ThwgWzTlJSktq2bauGDRtWU28AAIA382ggOnPmjNLT05Weni7p0kLq9PR0ZWVlyWazaeLEifrTn/6kDz/8UPv27dOoUaMUHh5u3onWvn17DRw4UI8++qg+++wzffrpp4qPj9f999+v8PBwSdIDDzwgf39/jRkzRvv379fKlSu1cOFCTZ482UO9BgAA3saj7zL7/PPP1a9fP/NzSUgZPXq0li5dqqlTp+rs2bMaN26c8vLydMstt2jjxo2qW7eu+Z1ly5YpPj5e/fv3l4+Pj4YNG6ZXXnnF3O90OvXxxx8rLi5O3bt3V+PGjfXMM8+4PasIAABYm9c8h8ib8Rwiz+E5RKjpeA4R4Dm14jlEAAAA1YVABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALM+jr+4ALsdTqQEAnsIMEQAAsDwCEQAAsDwCEQAAsDzWEOFnXWltD2/xBgDUFswQAQAAy2OGCJVW1swRs0YAgJqIGSIAAGB5BCIAAGB5BCIAAGB5BCIAAGB5BCIAAGB5BCIAAGB5BCIAAGB5BCIAAGB5BCIAAGB5PKka1xxPtAYAeDsCETziSi+MBQDAE7hkBgAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALM+rA9HMmTNls9nctnbt2pn7z58/r7i4OAUHB6t+/foaNmyYcnJy3I6RlZWl2NhY1atXTyEhIZoyZYouXrxY3V0BAABezOtvu+/QoYM2bdpkfq5T5/+aPGnSJK1fv16rV6+W0+lUfHy87rnnHn366aeSpKKiIsXGxiosLEw7duzQ8ePHNWrUKPn5+WnOnDnV3hcAAOCdvD4Q1alTR2FhYaXK8/Pz9fbbb2v58uW6/fbbJUlLlixR+/bttXPnTvXu3Vsff/yxDhw4oE2bNik0NFRdu3bV7NmzNW3aNM2cOVP+/v7V3Z1aj+cLAQBqIq++ZCZJX3/9tcLDw9W6dWuNGDFCWVlZkqS0tDRduHBB0dHRZt127dqpefPmSk1NlSSlpqaqU6dOCg0NNevExMTI5XJp//79VzxnQUGBXC6X2wYAAGovrw5EvXr10tKlS7Vx40a9/vrrOnLkiPr06aPTp08rOztb/v7+CgoKcvtOaGiosrOzJUnZ2dluYahkf8m+K5k7d66cTqe5RUREVG3HAACAV/HqS2aDBg0y/9y5c2f16tVLLVq00KpVqxQQEHDNzpuQkKDJkyebn10uF6EIAIBazKtniH4qKChIN9xwgw4dOqSwsDAVFhYqLy/PrU5OTo655igsLKzUXWcln8tal1TCbrfL4XC4bQAAoPaqUYHozJkzOnz4sJo2baru3bvLz89PycnJ5v7MzExlZWUpKipKkhQVFaV9+/YpNzfXrJOUlCSHw6HIyMhqbz8AAPBOXn3J7Pe//72GDBmiFi1a6LvvvtOMGTPk6+ur4cOHy+l0asyYMZo8ebIaNWokh8OhJ554QlFRUerdu7ckacCAAYqMjNTIkSM1f/58ZWdna/r06YqLi5Pdbvdw7wAAgLfw6kD0zTffaPjw4Tpx4oSaNGmiW265RTt37lSTJk0kSQsWLJCPj4+GDRumgoICxcTEaPHixeb3fX19tW7dOk2YMEFRUVEKDAzU6NGjNWvWLE91CQAAeCGbYRiGpxvh7Vwul5xOp/Lz8y25nohnCwGVd3RerKebAFhWRX5/16g1RAAAANcCgQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFieV7/cFQBqurLeBcj7zQDvQyCCG17kCgCwIi6ZAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAy+Nt9xbGm+0BALiEGSIAAGB5BCIAAGB5BCIAAGB5BCIAAGB5lgpEixYtUsuWLVW3bl316tVLn332maebBAAAvIBl7jJbuXKlJk+erDfeeEO9evXSyy+/rJiYGGVmZiokJMTTzbvmuKMMAIArsxmGYXi6EdWhV69e6tmzp1577TVJUnFxsSIiIvTEE0/o6aefvup3XS6XnE6n8vPz5XA4qqO5VY5ABHi3o/NiPd0EoNapyO9vS8wQFRYWKi0tTQkJCWaZj4+PoqOjlZqa6sGWAQBw7ZX1H8WEcHeWCEQ//PCDioqKFBoa6lYeGhqqgwcPlqpfUFCggoIC83N+fr6kS0mzJug4I9HTTQBQQc0nrS5XvYxnY8osL+vvfVl1y1vvl5zDiqrjZ/NLzlFc8GOpsrJ+p13p90dNHeeSPpbnYpglAlFFzZ07V88++2yp8oiICA+0BgD+j/Plqq9bkWNW5Xdru+r42VTX2NX0cT59+rScTudV61giEDVu3Fi+vr7KyclxK8/JyVFYWFip+gkJCZo8ebL5ubi4WCdPnlRwcLBsNlul2+FyuRQREaFjx47V2LVItQ1j4p0YF+/DmHgfxuTnGYah06dPKzw8/GfrWiIQ+fv7q3v37kpOTtbQoUMlXQo5ycnJio+PL1XfbrfLbre7lQUFBVVZexwOB//n9TKMiXdiXLwPY+J9GJOr+7mZoRKWCESSNHnyZI0ePVo9evTQr3/9a7388ss6e/asHn74YU83DQAAeJhlAtFvf/tbff/993rmmWeUnZ2trl27auPGjaUWWgMAAOuxTCCSpPj4+DIvkVUXu92uGTNmlLocB89hTLwT4+J9GBPvw5hULcs8mBEAAOBKLPUuMwAAgLIQiAAAgOURiAAAgOURiAAAgOURiCpo27ZtGjJkiMLDw2Wz2bR27Vq3/Tk5OXrooYcUHh6uevXqaeDAgfr666/d6mRnZ2vkyJEKCwtTYGCgunXrpvfff9+tzsmTJzVixAg5HA4FBQVpzJgxOnPmzLXuXo00d+5c9ezZUw0aNFBISIiGDh2qzMxMtzrnz59XXFycgoODVb9+fQ0bNqzUk8uzsrIUGxurevXqKSQkRFOmTNHFixfd6mzZskXdunWT3W5XmzZttHTp0mvdvRqpKsZkz549Gj58uCIiIhQQEKD27dtr4cKFpc7FmJRPVf09KXHixAk1a9ZMNptNeXl5bvsYk/KrynFZunSpOnfurLp16yokJERxcXFu+/fu3as+ffqobt26ioiI0Pz5869p32ocAxWyYcMG4w9/+IPxwQcfGJKMNWvWmPuKi4uN3r17G3369DE+++wz4+DBg8a4ceOM5s2bG2fOnDHr3XHHHUbPnj2NXbt2GYcPHzZmz55t+Pj4GF988YVZZ+DAgUaXLl2MnTt3Gtu3bzfatGljDB8+vDq7WmPExMQYS5YsMTIyMoz09HRj8ODBpX7m48ePNyIiIozk5GTj888/N3r37m3cdNNN5v6LFy8aHTt2NKKjo40vv/zS2LBhg9G4cWMjISHBrPOf//zHqFevnjF58mTjwIEDxquvvmr4+voaGzdurNb+1gRVMSZvv/228eSTTxpbtmwxDh8+bPzzn/80AgICjFdffdWsw5iUX1WMyeXuvvtuY9CgQYYk49SpU2Y5Y1IxVTUuL774ohEeHm4sW7bMOHTokLFnzx7jX//6l7k/Pz/fCA0NNUaMGGFkZGQY7777rhEQEGD85S9/qba+ejsC0S/w00CUmZlpSDIyMjLMsqKiIqNJkybGX//6V7MsMDDQ+Mc//uF2rEaNGpl1Dhw4YEgydu/ebe7/6KOPDJvNZnz77bfXqDe1R25uriHJ2Lp1q2EYhpGXl2f4+fkZq1evNut89dVXhiQjNTXVMIxLQdfHx8fIzs4267z++uuGw+EwCgoKDMMwjKlTpxodOnRwO9dvf/tbIyYm5lp3qcarzJiU5fHHHzf69etnfmZMKu+XjMnixYuNW2+91UhOTi4ViBiTX6Yy43Ly5EkjICDA2LRp0xWPu3jxYqNhw4bmv2eGYRjTpk0z2rZte416UvNwyawKFRQUSJLq1q1rlvn4+Mhut+uTTz4xy2666SatXLlSJ0+eVHFxsVasWKHz58/rtttukySlpqYqKChIPXr0ML8THR0tHx8f7dq1q3o6U4Pl5+dLkho1aiRJSktL04ULFxQdHW3WadeunZo3b67U1FRJl37mnTp1cntyeUxMjFwul/bv32/WufwYJXVKjoErq8yYXOk4JceQGJNforJjcuDAAc2aNUv/+Mc/5ONT+lcIY/LLVGZckpKSVFxcrG+//Vbt27dXs2bNdN999+nYsWPmd1JTU9W3b1/5+/ubZTExMcrMzNSpU6eqo2tej0BUhUr+T5qQkKBTp06psLBQzz33nL755hsdP37crLdq1SpduHBBwcHBstvteuyxx7RmzRq1adNG0qU1RiEhIW7HrlOnjho1aqTs7Oxq7VNNU1xcrIkTJ+rmm29Wx44dJV36efr7+5d6QW9oaKj588zOzi71GpeSzz9Xx+Vy6dy5c9eiO7VCZcfkp3bs2KGVK1dq3LhxZhljUjmVHZOCggINHz5czz//vJo3b17msRmTyqvsuPznP/9RcXGx5syZo5dfflnvvfeeTp48qTvuuEOFhYXmcX7u3zirs9SrO641Pz8/ffDBBxozZowaNWokX19fRUdHa9CgQTIueyD4H//4R+Xl5WnTpk1q3Lix1q5dq/vuu0/bt29Xp06dPNiDmi8uLk4ZGRluM3LwrKoYk4yMDN19992aMWOGBgwYUIWts6bKjklCQoLat2+vBx988Bq1zNoqOy7FxcW6cOGCXnnlFfPvx7vvvquwsDBt3rxZMTEx16K5tQ4zRFWse/fuSk9PV15eno4fP66NGzfqxIkTat26tSTp8OHDeu211/S3v/1N/fv3V5cuXTRjxgz16NFDixYtkiSFhYUpNzfX7bgXL17UyZMnFRYWVu19qini4+O1bt06bd68Wc2aNTPLw8LCVFhYWOpOmJycHPPnGRYWVuqujZLPP1fH4XAoICCgqrtTK/ySMSlx4MAB9e/fX+PGjdP06dPd9jEmFfdLxiQlJUWrV69WnTp1VKdOHfXv31+S1LhxY82YMcM8DmNScb9kXJo2bSpJioyMNPc3adJEjRs3VlZWlnmcn/s3zuoIRNeI0+lUkyZN9PXXX+vzzz/X3XffLUn68ccfJanUtXdfX18VFxdLkqKiopSXl6e0tDRzf0pKioqLi9WrV69q6kHNYRiG4uPjtWbNGqWkpKhVq1Zu+7t37y4/Pz8lJyebZZmZmcrKylJUVJSkSz/zffv2uQXRpKQkORwO8x+ZqKgot2OU1Ck5Bv5PVYyJJO3fv1/9+vXT6NGj9ec//7nUeRiT8quKMXn//fe1Z88epaenKz09XW+99ZYkafv27eYt3oxJxVTFuNx8881meYmTJ0/qhx9+UIsWLSRdGpdt27bpwoULZp2kpCS1bdtWDRs2vGb9q1E8uqS7Bjp9+rTx5ZdfGl9++aUhyXjppZeML7/80vjvf/9rGIZhrFq1yti8ebNx+PBhY+3atUaLFi2Me+65x/x+YWGh0aZNG6NPnz7Grl27jEOHDhkvvPCCYbPZjPXr15v1Bg4caNx4443Grl27jE8++cS4/vrrue3+CiZMmGA4nU5jy5YtxvHjx83txx9/NOuMHz/eaN68uZGSkmJ8/vnnRlRUlBEVFWXuL7ntfsCAAUZ6erqxceNGo0mTJmXedj9lyhTjq6++MhYtWsTtxFdQFWOyb98+o0mTJsaDDz7odozc3FyzDmNSflUxJj+1efPmK952z5iUT1WNy91332106NDB+PTTT419+/YZd955pxEZGWkUFhYahnHpbrXQ0FBj5MiRRkZGhrFixQqjXr163HZ/GQJRBZX8A/DTbfTo0YZhGMbChQuNZs2aGX5+fkbz5s2N6dOnu93maBiG8e9//9u45557jJCQEKNevXpG586dS92Gf+LECWP48OFG/fr1DYfDYTz88MPG6dOnq6ubNUpZ4yHJWLJkiVnn3LlzxuOPP240bNjQqFevnvGb3/zGOH78uNtxjh49agwaNMgICAgwGjdubDz11FPGhQsX3Ops3rzZ6Nq1q+Hv72+0bt3a7Rz4P1UxJjNmzCjzGC1atHA7F2NSPlX19+RyZQWiknLGpHyqalzy8/ONRx55xAgKCjIaNWpk/OY3vzGysrLc6uzZs8e45ZZbDLvdbvzqV78y5s2bVx1drDFshnHZal8AAAALYg0RAACwPAIRAACwPAIRAACwPAIRAACwPAIRAACwPAIRAACwPAIRAACwPAIRAACwPAIRgFrDMAxFR0eX+XbvxYsXKygoSN98840HWgbA2xGIANQaNptNS5Ys0a5du/SXv/zFLD9y5IimTp2qV1991e1N4lXh8pdlAqi5CEQAapWIiAgtXLhQv//973XkyBEZhqExY8ZowIABuvHGGzVo0CDVr19foaGhGjlypH744Qfzuxs3btQtt9yioKAgBQcH684779Thw4fN/UePHpXNZtPKlSt16623qm7dulq2bJknugmgivEuMwC10tChQ5Wfn6977rlHs2fP1v79+9WhQweNHTtWo0aN0rlz5zRt2jRdvHhRKSkpkqT3339fNptNnTt31pkzZ/TMM8/o6NGjSk9Pl4+Pj44ePapWrVqpZcuWevHFF3XjjTeqbt26atq0qYd7C+CXIhABqJVyc3PVoUMHnTx5Uu+//74yMjK0fft2JSYmmnW++eYbRUREKDMzUzfccEOpY/zwww9q0qSJ9u3bp44dO5qB6OWXX9bvfve76uwOgGuMS2YAaqWQkBA99thjat++vYYOHao9e/Zo8+bNql+/vrm1a9dOkszLYl9//bWGDx+u1q1by+FwqGXLlpKkrKwst2P36NGjWvsC4Nqr4+kGAMC1UqdOHdWpc+mfuTNnzmjIkCF67rnnStUrueQ1ZMgQtWjRQn/9618VHh6u4uJidezYUYWFhW71AwMDr33jAVQrAhEAS+jWrZvef/99tWzZ0gxJlztx4oQyMzP117/+VX369JEkffLJJ9XdTAAewiUzAJYQFxenkydPavjw4dq9e7cOHz6sxMREPfzwwyoqKlLDhg0VHBysN998U4cOHVJKSoomT57s6WYDqCYEIgCWEB4erk8//VRFRUUaMGCAOnXqpIkTJyooKEg+Pj7y8fHRihUrlJaWpo4dO2rSpEl6/vnnPd1sANWEu8wAAIDlMUMEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAs7/8DTixw0J5cuFYAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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4OAqlwkPD8fevXu1pu3evRvh4eHmqiYRERHVcRY9wvPCCy9g3bp12Lp1K5ydnTX9cFxdXeHg4AAAGDduHBo1aoSYmBgAwOzZs9GnTx988MEHGDp0KNavX4/jx4/js88+s9h+EBERUe1m0SM8q1atQnZ2Nvr27Qs/Pz/NY8OGDZoyqampSEtL0zzv2bMn1q1bh88++wwdOnTA999/jx9//LHSjs5ERERUv9WqcXhqAsfhISIiqntkNQ4PERERkTkw8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkexZNPAcPHgQUVFR8Pf3h0KhwI8//lhp+fj4eCgUigqP9PT0mqkwERER1UkWDTz3799Hhw4dsHLlSoOWu3DhAtLS0jQPb29vM9WQiIiI5MDGkhsfPHgwBg8ebPBy3t7ecHNzM32FiIiISJbqZB+esLAw+Pn5YcCAATh8+HClZQsLC5GTk6P1ICIiovqlTgUePz8/rF69Gj/88AN++OEHBAQEoG/fvjh58qTeZWJiYuDq6qp5BAQE1GCNiYiIqDZQCCGEpSsBAAqFAlu2bMHIkSMNWq5Pnz5o0qQJvv76a53zCwsLUVhYqHmek5ODgIAAZGdnw8XFxZgqExERUQ3JycmBq6trtX+/LdqHxxS6deuGX3/9Ve98pVIJpVJZgzUiIiKi2qZOndLSJTExEX5+fpauBhEREdViFj3Ck5eXh0uXLmmep6SkIDExER4eHmjSpAmio6Nx48YNfPXVVwCA5cuXIzg4GG3atEFBQQG++OIL7Nu3D7/88ouldoGIiIjqAIsGnuPHj6Nfv36a53PmzAEAjB8/HrGxsUhLS0NqaqpmflFREebOnYsbN27A0dER7du3x549e7TWQURERFRerem0XFOM7fRERERENc/Y3+8634eHiIiIqCoMPERERCR7DDxEREQkeww8REREJHsMPERERCR7DDxEREQkeww8REREJHsMPERERCR7DDxEREQkeww8REREJHsMPERERCR7DDxEREQkeww8REREJHsMPERERCR7DDxEREQkeww8REREJHsMPERERCR7DDxEREQkeww8REREJHsMPERERCR7DDxEREQkeww8REREJHsMPERERCR7DDxEREQkeww8REREJHsMPERERCR7DDxEREQkewYHnkWLFuHBgwcVpufn52PRokUmqRQRERGRKSmEEMKQBaytrZGWlgZvb2+t6Xfv3oW3tzdKSkpMWkFTy8nJgaurK7Kzs+Hi4mLp6hAREZEExv5+G3yERwgBhUJRYfoff/wBDw8PgytAREREZG42Ugu6u7tDoVBAoVCgRYsWWqGnpKQEeXl5eO6558xSSSIiIiJjSA48y5cvhxACkyZNwsKFC+Hq6qqZZ2dnh6CgIISHh5ulkkRERETGkBx4xo8fDwAIDg5Gr169YGMjeVEiIiIiizK4D4+zszPOnTuneb5161aMHDkSr732GoqKikxaOSIiIiJTMDjwTJ8+HX/++ScA4MqVKxg1ahQcHR2xadMmvPzyyyavIBEREZGxDA48f/75J8LCwgAAmzZtQp8+fbBu3TrExsbihx9+MHX9iIiIiIxWrcvSVSoVAGDPnj0YMmQIACAgIAB37twxbe2IiIiITMDgwNOlSxe88847+Prrr3HgwAEMHToUAJCSkgIfHx+TV5CIiIjIWAYHnuXLl+PkyZOYOXMm/v3vf6NZs2YAgO+//x49e/Y0eQWJiIiIjGXwrSX0KSgogLW1NWxtbU2xOrPhrSWIiIjqHmN/v6s9mM6JEyc0l6eHhoaiU6dO1V0VERERkVkZHHhu3bqF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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\Romain\\AppData\\Local\\Temp\\ipykernel_2396\\478720037.py:82: DeprecationWarning: `GroupBy.count` is deprecated. It has been renamed to `len`.\n", " .count()\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxBklEQVR4nO3deXgN5///8dfJTiKJNZEK0dqX2pd0pUKQLlrUVjttNShpbW0/qC6W1tpqfVpLUEW1pSWtLYraVe1bKUo/JLRENCUhmd8ffpmvI0HCmROJ5+O6znU5M/e57/ccycm8zszcYzMMwxAAAAAAAHA4l5wuAAAAAACAvIrQDQAAAACARQjdAAAAAABYhNANAAAAAIBFCN0AAAAAAFiE0A0AAAAAgEUI3QAAAAAAWITQDQAAAACARQjdAAAAAABYhNANAMjTQkJC1KVLl5wuI8uGDx8um82mv/76K6dLuec1b95cPXv2zOkyLHf58mUFBwfrk08+yelSACBPInQDAJwuOjpaNpvNfHh5ealcuXLq3bu34uPjc7q8bHn//fe1aNGinC7jti1cuFDNmjVTkSJF5OHhoaCgID3//PNatWpVTpcmSTp58qSGDx+uHTt2OHXc9evXa/ny5Ro0aJCkq1/eXPsze6NHdHS05bX1799fNWvWVKFChZQ/f35VrFhRw4cP1z///JOhbXJysgYNGqSgoCDly5dP9erV04oVK+zauLu7KyoqSu+9954uXbpkef0AcK+xGYZh5HQRAIB7S3R0tLp27aoRI0aodOnSunTpktatW6fZs2erVKlS2rNnj/Lnz++QsZKTk+Xi4iJ3d3eH9Hc9Hx8ftWrVymFha/jw4Xr77bd15swZFSlSxCF9ZsYwDHXr1k3R0dGqUaOGWrVqpcDAQJ06dUoLFy7Utm3btH79ej300EOW1ZAVv/zyi+rUqaMZM2Y49YyFFi1a6OLFi1q2bJkkadGiRXah9ocfftDcuXM1fvx4u/+nhx56SPfff7+ltT3yyCOqVauWypQpIy8vL23fvl3Tp09X7dq1tXbtWrm4/N8xlXbt2unrr79Wv379VLZsWUVHR2vr1q366aef9Mgjj5jtEhISFBAQoE8//VTdunWztH4AuNe45XQBAIB7V7NmzVS7dm1JUo8ePVS4cGGNGzdO3333ndq1a5fpa5KSkuTt7Z3lMTw9PR1Sa14zduxYRUdHq1+/fho3bpxsNpu57s0339Ts2bPl5pb7dhP+/fffO/7C5vTp04qJidGUKVPMZS1atLBrExcXp7lz56pFixYKCQm5o/Gya926dRmWPfDAA3r99de1ZcsW1a9fX5K0ZcsWzZs3Tx988IFef/11SVKnTp1UpUoVDRw4UBs2bDBf7+/vryZNmig6OprQDQAOxunlAIC7xhNPPCFJOnr0qCSpS5cu8vHx0e+//67mzZurQIEC6tChg6Sr4fu1115TcHCwPD09Vb58eX344Ye6/gSuzK7pTkhIUL9+/czXlilTRqNHj1ZaWppdu7S0NE2cOFFVq1aVl5eXihYtqqZNm+qXX36RJNlsNiUlJWnmzJnm6cXpY124cEH9+vVTSEiIPD09VaxYMTVu3Fi//vprlt6Lv/76S88//7x8fX1VuHBhvfrqq3an/j7++OOqVq1apq8tX768wsPDb9j3xYsXNXLkSFWoUEEffvihXeBO17FjR9WtW9d8fuTIEbVu3do8pbl+/fqKiYmxe036ZQPHjh2zW7569WrZbDatXr3aXNagQQNVqVJF+/btU8OGDZU/f37dd999GjNmjN3r6tSpI0nq2rVrhlO40/vYtm2bHnvsMeXPn19vvPGGOnfurCJFiujy5csZtqtJkyYqX778Dd8bSYqJidGVK1cUFhZ203bXu3Llit555x098MAD8vT0VEhIiN544w0lJyfbtQsJCdGTTz6p5cuXq3r16vLy8lKlSpX07bffZmu86/uUrv5sp/v666/l6uqqF1980Vzm5eWl7t27a+PGjTpx4oRdH40bN9a6det09uzZ264DAJARoRsAcNf4/fffJUmFCxc2l125ckXh4eEqVqyYPvzwQ7Vs2VKGYejpp5/W+PHj1bRpU40bN07ly5fXgAEDFBUVddMx/v33Xz3++OP64osv1KlTJ02aNEkPP/ywhgwZkuG13bt3N8P56NGjNXjwYHl5eWnTpk2SpNmzZ8vT01OPPvqoZs+erdmzZ+ull16SJL388sv69NNP1bJlS33yySd6/fXXlS9fPu3fvz9L78Xzzz+vS5cuaeTIkWrevLkmTZpkF546duyoXbt2ac+ePXav27p1q3777Te98MILN+w7PVi1b99erq6ut6wlPj5eDz30kJYtW6ZXXnnFvPb36aef1sKFC7O0PZk5d+6cmjZtqmrVqmns2LGqUKGCBg0apB9//FGSVLFiRY0YMUKS9OKLL5rv8WOPPWb28ffff6tZs2aqXr26JkyYoIYNG6pjx476+++/zVPD08XFxWnVqlU3fW8kacOGDSpcuLBKlSqVre3p0aOHhg4dqpo1a2r8+PF6/PHHNXLkSLVt2zZD20OHDqlNmzZq1qyZRo4cKTc3N7Vu3TrD9dY3cuXKFf311186efKkli9frrfeeksFChSw+6Jk+/btKleunHx9fe1em97m+uvka9WqJcMw7I6AAwAcwAAAwMlmzJhhSDJWrlxpnDlzxjhx4oQxb948o3Dhwka+fPmMP//80zAMw+jcubMhyRg8eLDd6xctWmRIMt5991275a1atTJsNptx+PBhc1mpUqWMzp07m8/feecdw9vb2/jtt9/sXjt48GDD1dXVOH78uGEYhrFq1SpDktG3b98M9aelpZn/9vb2tus/nZ+fnxEZGZm1N+Qaw4YNMyQZTz/9tN3yV155xZBk7Ny50zAMw0hISDC8vLyMQYMG2bXr27ev4e3tbfzzzz83HGPixImGJGPhwoVZqqlfv36GJOPnn382l124cMEoXbq0ERISYqSmphqG8X//r0ePHrV7/U8//WRIMn766Sdz2eOPP25IMmbNmmUuS05ONgIDA42WLVuay7Zu3WpIMmbMmJGhrvQ+pkyZYrc8NTXVKFGihNGmTRu75ePGjTNsNptx5MiRm27vI488YtSqVeumbT744AO7bd2xY4chyejRo4ddu9dff92QZKxatcpcVqpUKUOS8c0335jLzp8/bxQvXtyoUaPGTcdNt3HjRkOS+Shfvrzd+2sYhlG5cmXjiSeeyPDavXv3Zvq+nTx50pBkjB49Oks1AACyhiPdAIAcExYWpqJFiyo4OFht27aVj4+PFi5cqPvuu8+uXa9eveye//DDD3J1dVXfvn3tlr/22msyDMM8UpqZBQsW6NFHH1XBggX1119/mY+wsDClpqZq7dq1kqRvvvlGNptNw4YNy9BHZqdjX8/f31+bN2/WyZMnb9k2M5GRkXbP+/TpI+nqtkuSn5+fnnnmGc2dO9c8pT41NVXz589XixYtbnrde2JioiSpQIECWarlhx9+UN26de0m3vLx8dGLL76oY8eOad++fVnfsGv4+PjYHXX28PBQ3bp1deTIkSz34enpqa5du9otc3Fx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6AYAAAAAwCKEbgAAAAAALOKW0wUAgDOEDI6xpN9joyIs6RcAAAB5A0e6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIswkRoAWICJ2wAAACBxpBsAAAAAAMsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsIhbThcAALgzIYNjLOn32KgIS/oFAAC4lxC6AQDZYkXIJ+ADAIC8itPLAQAAAACwCEe6AQB3LU6dBwAAuR1HugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsIhbTg6+du1affDBB9q2bZtOnTqlhQsXqkWLFuZ6wzA0bNgwff7550pISNDDDz+sTz/9VGXLljXbnD17Vn369NHixYvl4uKili1bauLEifLx8THb7Nq1S5GRkdq6dauKFi2qPn36aODAgXa1LFiwQP/5z3907NgxlS1bVqNHj1bz5s0tfw8AAHeHkMExlvR7bFSEJf0CAIDcIUePdCclJalatWqaPHlypuvHjBmjSZMmacqUKdq8ebO8vb0VHh6uS5cumW06dOigvXv3asWKFVqyZInWrl2rF1980VyfmJioJk2aqFSpUtq2bZs++OADDR8+XJ999pnZZsOGDWrXrp26d++u7du3q0WLFmrRooX27Nlj3cYDAAAAAPK8HD3S3axZMzVr1izTdYZhaMKECXrrrbf0zDPPSJJmzZqlgIAALVq0SG3bttX+/fu1dOlSbd26VbVr15YkffTRR2revLk+/PBDBQUFac6cOUpJSdH06dPl4eGhypUra8eOHRo3bpwZzidOnKimTZtqwIABkqR33nlHK1as0Mcff6wpU6Y44Z0AANxrrDiyzlF1AADuPnftNd1Hjx5VXFycwsLCzGV+fn6qV6+eNm7cKEnauHGj/P39zcAtSWFhYXJxcdHmzZvNNo899pg8PDzMNuHh4Tp48KDOnTtntrl2nPQ26eMAAAAAAHA7cvRI983ExcVJkgICAuyWBwQEmOvi4uJUrFgxu/Vubm4qVKiQXZvSpUtn6CN9XcGCBRUXF3fTcTKTnJys5ORk83liYmJ2Ng8AAAAAcA+4a4903+1GjhwpPz8/8xEcHJzTJQEAAAAA7jJ3begODAyUJMXHx9stj4+PN9cFBgbq9OnTduuvXLmis2fP2rXJrI9rx7hRm/T1mRkyZIjOnz9vPk6cOJHdTQQAAAAA5HF3beguXbq0AgMDFRsbay5LTEzU5s2bFRoaKkkKDQ1VQkKCtm3bZrZZtWqV0tLSVK9ePbPN2rVrdfnyZbPNihUrVL58eRUsWNBsc+046W3Sx8mMp6enfH197R4AAAAAAFwrR0P3P//8ox07dmjHjh2Srk6etmPHDh0/flw2m039+vXTu+++q++//167d+9Wp06dFBQUZN7Lu2LFimratKl69uypLVu2aP369erdu7fatm2roKAgSVL79u3l4eGh7t27a+/evZo/f74mTpyoqKgos45XX31VS5cu1dixY3XgwAENHz5cv/zyi3r37u3stwQAAAAAkIfk6ERqv/zyixo2bGg+Tw/CnTt3VnR0tAYOHKikpCS9+OKLSkhI0COPPKKlS5fKy8vLfM2cOXPUu3dvNWrUSC4uLmrZsqUmTZpkrvfz89Py5csVGRmpWrVqqUiRIho6dKjdvbwfeughffnll3rrrbf0xhtvqGzZslq0aJGqVKnihHcBAAAAAJBX5WjobtCggQzDuOF6m82mESNGaMSIETdsU6hQIX355Zc3HefBBx/Uzz//fNM2rVu3VuvWrW9eMAAAAAAA2XDXXtMNAAAAAEBud9fepxsAADhGyOAYS/o9NirCkn4BAMhLONINAAAAAIBFCN0AAAAAAFiE0A0AAAAAgEUI3QAAAAAAWISJ1AAAgMMwaRsAAPY40g0AAAAAgEUI3QAAAAAAWITQDQAAAACARQjdAAAAAABYhInUAABArsXEbQCAux1HugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLuOV0AQAAALlByOAYS/o9NirCkn4BAHcHQjcAAMBdhoAPAHkHp5cDAAAAAGARQjcAAAAAABbh9HIAAIB7HKezA4B1ONINAAAAAIBFCN0AAAAAAFiE0A0AAAAAgEUI3QAAAAAAWITQDQAAAACARZi9HAAAAE7DTOkA7jWEbgAAAORJBHwAdwNOLwcAAAAAwCIc6QYAAAAcgCPrADLDkW4AAAAAACxC6AYAAAAAwCKcXg4AAADkMpzKDuQeHOkGAAAAAMAihG4AAAAAACxC6AYAAAAAwCJc0w0AAADgpqy4hpzrx3Gv4Eg3AAAAAAAW4Ug3AAAAgLuGM2dmZxZ4OAOhGwAAAACcgJB/b+L0cgAAAAAALMKRbgAAAADIYzhN/+7BkW4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQui+zuTJkxUSEiIvLy/Vq1dPW7ZsyemSAAAAAAC5FKH7GvPnz1dUVJSGDRumX3/9VdWqVVN4eLhOnz6d06UBAAAAAHIhQvc1xo0bp549e6pr166qVKmSpkyZovz582v69Ok5XRoAAAAAIBdyy+kC7hYpKSnatm2bhgwZYi5zcXFRWFiYNm7cmKF9cnKykpOTzefnz5+XJCUmJlpf7B1IS/7Xkn4z225njuXs8fLqWM4eL6+O5ezx8sK28T7mvrFuNF5eeB9vNF5eHcvZ4+XVsZw9Xl7YNt5Ha8fLq2PdTdLrMwzjpu1sxq1a3CNOnjyp++67Txs2bFBoaKi5fODAgVqzZo02b95s13748OF6++23nV0mAAAAAOAucuLECZUoUeKG6znSfZuGDBmiqKgo83laWprOnj2rwoULy2az5WBljpGYmKjg4GCdOHFCvr6+eWYsZ4+XV8dy9nh5dSxnj5dXx3L2eGxb7hvL2ePl1bGcPV5eHcvZ4+XVsZw9HtuW+8ZyBsMwdOHCBQUFBd20HaH7/ytSpIhcXV0VHx9vtzw+Pl6BgYEZ2nt6esrT09Numb+/v5Ul5ghfX1+n/UI4cyxnj5dXx3L2eHl1LGePl1fHcvZ4bFvuG8vZ4+XVsZw9Xl4dy9nj5dWxnD0e25b7xrKan5/fLdswkdr/5+HhoVq1aik2NtZclpaWptjYWLvTzQEAAAAAyCqOdF8jKipKnTt3Vu3atVW3bl1NmDBBSUlJ6tq1a06XBgAAAADIhQjd12jTpo3OnDmjoUOHKi4uTtWrV9fSpUsVEBCQ06U5naenp4YNG5bhFPrcPpazx8urYzl7vLw6lrPHy6tjOXs8ti33jeXs8fLqWM4eL6+O5ezx8upYzh6Pbct9Y91NmL0cAAAAAACLcE03AAAAAAAWIXQDAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAJDHXbp0SR9++GFOlwHckwjduOucOnUqp0sAkA3333+//v7775wuA8gR77zzjn7//fcbrk9MTFS3bt2cWBHuZWfOnNGSJUu0fPlypaamSpIuX76siRMnKiQkRKNGjcrhCnOHgQMHKiUlxSljrV279pZt+vTp44RKYCVuGQanioqK0rhx4264/tSpU2rQoIEOHjzotJouXryofPny3XE/I0aM0Ouvv678+fM7oKrcZdeuXapdu7bT/kA5U0JCgn744Qe1b9/+jvsaM2aM+vTpY/68rV+/XrVr1zbvVXnhwgUNGjRIn3zyyR2PVaNGDdlstlu2+/XXX+94LBcXF8XFxalYsWJ33FdWrF27Vo899thN2/Tp00cfffSRQ8a7//77tXXrVhUuXNgh/d1tLl68qBUrVui3336TJJUrV06NGzd2yOfi3cqRn1kuLi4qWLCg5s+fr7CwsAzr4+PjFRQUZAYgq/35558aMWKEPvvsM6eMlxtNmjQpS+369u1raR1XrlzRpUuX5OPj45D+1q1bpyeffFKJiYmy2WyqXbu2ZsyYoRYtWsjNzU19+/ZV586d8/TvtqM88MADyp8/v2bPnq3q1atbOpa/v79Wr159w3H69OmjmTNnKjEx0SHjzZo1S23atLmr7pP99ddfq1WrVjldhrUM3PNGjx5t/Pvvv+bzdevWGZcuXTKfJyYmGr169XLIWP7+/sa7776b6bqTJ08a5cqVMx5++GGHjHUrly5dMj788EMjICDAIf25uLgY8fHxDukrK86cOWMcO3bMbtmePXuMLl26GK1btzbmzJnjtFp27NhhuLi4OKSv+fPnG8nJyebzEydOGKmpqebzpKQkY/To0Q4ZKyscuW3X/4wUKFDA+P33383ncXFxDhtr+PDh5mPYsGGGh4eH0bdvX7vlw4cPd8hYNpvNqT/7fn5+xvbt22+4vnfv3kaBAgUcNp4zt+/ZZ5/N0sNRvvvuO6No0aKGzWazexQtWtT4/vvvHTaOYRhGs2bNjISEBPP5yJEjjXPnzpnP//rrL6NixYoOHfNGHPl7bbPZjK5duxru7u7GuHHjMqx35O91Vjhy27777rtMH6tXrzZOnjzpkDGut2XLFqN///5GRESEERERYfTv39/YunWrQ8cICQm55aN06dIOG+/77783ZsyYYbfs3XffNTw9PQ1XV1ejcePGxtmzZ+94nMcff9xo166dsXv3buP11183bDabUa5cOWPBggV33PeNHD582Ojatav5PDg42ChYsKD5KFKkiHHgwAGHjOXM/dWkpCTjlVdeMby8vIx33nnHbj/E0V577TUjICDAOHToUIZ1ffv2Nby9vY3Vq1c7bDxn768ahmFcvnzZ2L17t3Hw4EG75YsWLTIefPBBw8PDw6n15ARCN5waBNauXWvkz5/f+OSTT+yWnzp1yihfvrxRv35948KFCw4ZyzCuBuvBgwcbtWrVMkJDQ42FCxcahmEY06dPN4oXL26UKFHCGDVqlEPGcnbwaNu2rREVFWU+j4+PNwoWLGhUrlzZePrppw13d3dj1qxZTqkltwbTrHD0zvm12+bj4+O0bbt+LEey2WzGrFmzbriDnv5wFGfvoDjzd7tLly5ZejjC+vXrDXd3d6Nly5bGhg0bjHPnzhnnzp0z1q9fbzz33HOGh4eHsXHjRoeMZRh31++2FZ9ZX3zxhZE/f36jc+fOdl8c5vbPrBs9XFxcjPbt2xtJSUkOGcswDGPAgAGGzWYzChQoYFSrVs2oVq2a4ePjY7i4uBgDBw502DjO1qBBA+Pjjz82n69fv95wcXEx3n33XeObb74xKlSoYPTv3/+OxylUqJCxd+9ewzAM499//zVcXFyMRYsW3XG/N/Pqq68agwcPNp/7+PgYY8aMMaKjo43o6GijWbNmxksvveSQsXLiM2TVqlVG6dKljbp16xrffvutZX/XunbtapQqVcr43//+Zy579dVXjfz58xurVq1y2DiG4fz91d27dxulSpUyXFxcDBcXF+PZZ5814uLijMcee8woVKiQMWjQIOPEiRNOqyenELrh9CCwZMkSw9PT05g7d65hGFcDd4UKFYy6desaiYmJDhvHMAxj4MCBhp+fn9GyZUujePHihpubm9GzZ0+jatWqxty5c40rV644bCybzWacPn3aYf3dSkhIiF2w+OCDD4wHHnjAuHz5svm8Xr16TqklrwTTzOSVbbM6dN/q4ejtcvYOirO+VPj9998tPaJyrWbNmhkvvvjiDde/+OKLRrNmzRw23t30u23V7/Uvv/xilCxZ0qhXr555JDg3f2bdSEJCghEbG2tUqFDBGDJkiEP6jI6ONry8vIyPPvrISElJMZenpKQYEydONLy8vIyZM2c6ZKwNGzYYixcvtls2c+ZMIyQkxChatKjRs2dPuyOod6po0aLGr7/+aj7v37+/ER4ebj6PiYkxypQpc8fjZPY7dvjw4Tvu92aqVKlibN682W7Ma3+vV69e7ZBtM4yc+wz57rvvDFdXV0v/rqWmphrPPvusUbFiReOvv/4y+vfvb+TLl89YuXKlw8ZI5+z91ebNmxuNGjUyFi9ebLRv396w2WxGhQoVjA8++MDuzIW8jtCNHPkQmzNnjuHl5WXMmDHDqFixolG7dm270w4dpXTp0ubO8O7du83TANPS0hw+ls1mM/z9/e1Oq8rs4SheXl52p5c3a9bMGDBggPn84MGDRqFChRwy1vnz52/6+Pnnn/NEMM0MofvWnP2tuWE4fwfFWV8qXH8k5/nnnzfi4uIc0vf1ChYsaOzateuG63fu3Gn4+/s7bDxn/vzn5GdWfHy88eijjxpBQUHGpk2bcvVn1q38+OOPRvny5R3SV506dTI9PT/d2LFjjTp16jhkrPDwcLuz3Hbt2mW4ubkZPXr0MMaOHWsEBgYaw4YNc8hYhnH17/Uff/xhPq9Tp44xZswY8/mxY8eM/Pnz3/E4NpvN+Omnn4ydO3caO3fuNLy9vY2YmBjzefrDkXx8fOyOUvbr18/466+/zOfHjh0zvLy8HDKWs/+G/vvvv0afPn0MT09PY/jw4Q49UJOZ5ORkIywszChatKiRP39+Y8WKFZaMY7PZjKpVqxo1atS46cNRihYtal4SlpCQYH6Rfa9xy+lrynFvat++vRISEtS9e3fVrFlTK1eulJ+fn8PH+fPPP1WrVi1JUpUqVeTp6an+/ftnaYKp2/H2229bsh2Z8fX1VUJCgkqVKiVJ2rJli7p3726ut9lsSk5OdshY/v7+N33PDMOw7D212q0m1Pnf//7n0PGmTp1qTppz5coVRUdHq0iRIpKuTqSWG2Xl/37Pnj2qUqWKw8Z0cXHRvHnzFBERoYoVKyopKUnff/+9GjVq5LAxruWsieKM6+Y2/eGHHzRy5EhLxrp48aJ8fX1vuN7Pz0+XLl1y2Hg2my3Dz4pVnxvO/My6vp9ixYpp1apV6tOnjxo0aKChQ4c6ZJx0zz333E3XJyQkOHS8m6lQoYL+/PNPh/S1d+9ePfPMMzdc36JFC/3nP/9xyFg7d+7Uu+++az6fN2+e6tWrp88//1ySFBwcrGHDhmn48OEOGe++++7T/v37VbJkSf3zzz/auXOnxo8fb67/+++/HTYJa6NGjew+R5588klJV39O03/uHTmpn4uLi06ePKkSJUpIkt12SVcnEnR3d3fYeM6yYcMGde7cWZ6enlq/fr25L2mFa/dDGjRooJ9//lnh4eHat2+f9u3bZ65z5MR+4eHhDpvA71b++usvBQUFSbr6d8Xb21v169d3yth3E0I3JDkvCFw/o7K7u7sSEhLUsGFDu3aOmFFZklJTU+Xh4WE+d3Nzs/RDpm3btk6bwbl+/fqaNGmSPv/8c3377be6cOGCnnjiCXP9b7/9puDgYIeMtWrVKqeG6mXLlplfXqSlpSk2NlZ79uyR5Pgdyut3EDJTsmRJh4xVsmRJc6dOkgIDAzV79mxLxrr+y4Trf6/TOeKP+PVBMd2FCxc0d+5cTZ06Vdu2bXPYjl5O7KDkRWXLltWqVavUtWvXTNfHxsaqbNmyDhvPMAx16dLFnDH30qVLevnll+Xt7S1JDvuSUJJ++uknh/V1K5n9/Lu5uenTTz9VjRo1HP5z6Ovre9PPYz8/P3Xq1MmhY97IkSNHzJ3pO+Xq6nrT2eQvX74sV1dXh4x17tw5BQQEmM/XrFmjZs2amc/r1KmjEydOOGQsSWrdurX69eunN954Qz/88IMCAwPtQscvv/yi8uXL3/E4R48eveM+sqty5cpauXKl6tatm+n6ZcuWOfQLV2ftrzZo0EB9+/bVe++9Z/ks39fvhxQvXly7du3Srl27zGU2m82hnyUDBgy44f5q+h0QHMVms+nChQvy8vIyv/i5ePFihtnYb/YlcF7ALcOgkJCQLAUqR3yYDx8+PEtjDRs27I7Hkq5+A9usWTPzA3Px4sV64oknzJ28dN9++61DxnLmbZN27typsLAwJSYm6sqVKxoyZIjdN/cdO3ZU/vz59d///tcp9TiKi4vLLds4+pv6vKh06dK3bGOz2XTkyJE7Hqtr166aNGmSChQoIOnqLb2mTZumb775RkFBQXruuefUsmVL1alT547Hkpy7bZJzf7ddXV0VFxenokWLSpIKFCigXbt2ZWmbs2v8+PF69913NXv2bDVv3txuXUxMjDp37qw33nhDUVFRDhmvS5cuWfr8nzFjxh2PlZaWpg8++EDff/+9UlJS1KhRIw0bNsySWyW9/fbbGjBgwA2PVG7YsEFTp07V9OnTHT52TtqxY4e6deumxx9/PEtfXt5KgwYN9Oijj+qdd97JdP1bb72ldevWafXq1Xc8VqlSpTR79mw99thjSklJkb+/vxYvXmyeKbN79249/vjjOnv27B2PJV09q+Sll17S4sWLFRgYqM8++0yPPvqoub5hw4Zq2rSpBg0adEfj5MStSz///HP169dPX331lSIiIuzWLV68WG3bttWECRPUs2fPOx7LmfurI0aM0Lx587Rp06YMYfD8+fN66KGHNGXKFLv/x9zC1dVVp06duuHftJ07d6pmzZoO289ycXGx+3+7/kwjK87AuBsRupGnOXMnz8XFRfHx8ebOsjP89ddfWr9+vQIDA1WvXj27dTExMapcubJCQkLueJzrPzAzY7PZdOXKlTsey9maN2+uuXPnmkfWR40apZdffln+/v6Srp729+ijj9odQb1dGzdu1N9//22e7iddvV/msGHDlJSUpBYtWuijjz66q+6dmVVxcXGKjo7WtGnTlJiYqOeff15TpkzRzp07ValSpZwu74507NhR5cqV09KlSy0PcM78ojAtLU1t2rTRN998o/Lly6tixYoyDEP79+/XoUOH1KJFCy1YsCBLX4Tdbd555x0NHz5cYWFhypcvn5YtW6Z27dpZEnxXrVql3r1733Tn/NNPP73lveWz6lanl0tXP4+/+eabOx6rYMGCmX72JyUl6cqVK2rcuLG++uorhxyhWrJkiVq0aKGoqCi99tpr5pHouLg4jR07VhMmTNDChQvtPj9vV69evbRz506NHj1aixYt0syZM3Xy5EnzzLg5c+ZowoQJ2rp16x2P5Uy3ClNWadeunebPn68KFSqYR+wPHjyoAwcOqFWrVvrqq6+cWo8jPPPMM2rYsKH69euX6fpJkybpp59+0sKFC+94LGfvG9zqi2RHh+41a9Zkqd3jjz/ukPHuVoRuSLq68xUdHa1vv/1Wx44dk81m0/3336+WLVuq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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import polars as pl\n", "import matplotlib.pyplot as plt\n", "import pathlib\n", "from itertools import combinations\n", "import networkx as nx\n", "from sklearn.feature_extraction.text import TfidfVectorizer\n", "from sklearn.cluster import KMeans\n", "from sklearn.manifold import TSNE\n", "import folium\n", "\n", "# Paths\n", "ROOT = pathlib.Path(r\"C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\")\n", "OUTDIR = ROOT / \"combined\"\n", "PARQUET = OUTDIR / \"consolidated.parquet\"\n", "PROJECT_PUB = OUTDIR / \"projectPublications_all.parquet\"\n", "\n", "# Load consolidated dataset\n", "df = pl.read_parquet(PARQUET)\n", "\n", "for col in [\"startDate\", \"endDate\"]:\n", " if df[col].dtype == pl.Utf8:\n", " df = df.with_column(\n", " pl.col(col).str.strptime(pl.Date, \"%Y-%m-%d\").alias(col)\n", " )\n", "\n", "df = df.with_columns(\n", " pl.col(\"list_netEcContribution\").list.eval(pl.element().cast(pl.Float64),parallel=True)\n", " .list.sum().alias(\"netEcContribution\")\n", ")\n", "\n", "df = df.with_columns(\n", " pl.col(\"totalCost\").cast(pl.Float64),\n", " pl.col(\"netEcContribution\").cast(pl.Float64)\n", ")\n", "\n", "df = df.with_columns([\n", " pl.col(\"startDate\").dt.year().alias(\"startYear\"),\n", " pl.col(\"endDate\"). dt.year().alias(\"endYear\"),\n", " (pl.col(\"endDate\") - pl.col(\"startDate\")).dt.total_days().alias(\"durationDays\"),\n", " (pl.col(\"netEcContribution\") / pl.col(\"totalCost\")).alias(\"ecRatio\"),\n", "])\n", "\n", "# 1. Histogram of project start years\n", "years = [y for y in df[\"startYear\"].to_list() if y is not None]\n", "plt.figure()\n", "plt.hist(years, bins=range(min(years), max(years) + 1))\n", "plt.title(\"Projects by Start Year\")\n", "plt.xlabel(\"Year\")\n", "plt.ylabel(\"Count\")\n", "plt.show()\n", "\n", "# 2. Histogram of project end years\n", "end_years = [y for y in df[\"endYear\"].to_list() if y is not None]\n", "plt.figure()\n", "plt.hist(end_years, bins=range(min(end_years), max(end_years) + 1))\n", "plt.title(\"Projects by End Year\")\n", "plt.xlabel(\"Year\")\n", "plt.ylabel(\"Count\")\n", "plt.show()\n", "\n", "# 3. Duration vs. Total Cost scatter plot\n", "valid = df.filter(\n", " pl.col(\"durationDays\").is_not_null() &\n", " pl.col(\"totalCost\"). is_not_null()\n", ")\n", "durations = valid[\"durationDays\"].to_list()\n", "costs = valid[\"totalCost\"]. to_list()\n", "plt.figure()\n", "plt.scatter(durations, costs)\n", "plt.title(\"Project Duration vs. Total Cost\")\n", "plt.xlabel(\"Duration (days)\")\n", "plt.ylabel(\"Total Cost\")\n", "plt.show()\n", "\n", "\n", "# 4. Country breakdown (first country in list_country)\n", "countries = (\n", " df\n", " .explode(\"list_country\")\n", " .filter(pl.col(\"list_country\").is_not_null())\n", " .group_by(\"list_country\")\n", " .count()\n", " .rename({\"count\": \"project_count\"})\n", " .sort(\"project_count\", descending=True)\n", ")\n", "\n", "country_names = countries[\"list_country\"].to_list()[:30]\n", "project_counts = countries[\"project_count\"].to_list()[:30]\n", "\n", "plt.figure(figsize=(10, 6))\n", "plt.bar(country_names, project_counts)\n", "plt.title(\"Projects by Country (Top 30)\")\n", "plt.xlabel(\"Country\")\n", "plt.ylabel(\"Number of Projects\")\n", "plt.xticks(rotation=90)\n", "plt.tight_layout()\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 5. Geo scatter (parse \"lat, lon\" from list_geolocation)\n", "locs = (\n", " df\n", " .explode(\"list_geolocation\")\n", " .filter(pl.col(\"list_geolocation\").is_not_null())\n", ")\n", "\n", "locs = locs.with_columns(\n", " pl.col(\"list_geolocation\")\n", " .str.split(\",\")\n", " .alias(\"geo_split\")\n", ")\n", "\n", "locs = locs.with_columns([\n", " pl.col(\"geo_split\")\n", " .list.get(0) \n", " .str.strip_chars().str.replace(r\"[^\\d\\.\\-]\", \"\", literal=False)\n", " .cast(pl.Float64) \n", " .alias(\"lat\"),\n", " pl.col(\"geo_split\")\n", " .list.get(1)\n", " .str.strip_chars().str.replace(r\"[^\\d\\.\\-]\", \"\", literal=False)\n", " .cast(pl.Float64)\n", " .alias(\"lon\"),\n", "])\n", "\n", "locs = locs.filter(pl.col(\"lat\").is_not_null() & pl.col(\"lon\").is_not_null())\n", "\n", "lats = locs[\"lat\"].to_list()\n", "lons = locs[\"lon\"].to_list()\n", "\n", "center_lat = sum(lats) / len(lats)\n", "center_lon = sum(lons) / len(lons)\n", "\n", "m = folium.Map(location=[center_lat, center_lon], zoom_start=4, tiles=\"CartoDB positron\")\n", "\n", "for lat, lon in zip(lats, lons):\n", " folium.CircleMarker(\n", " location=[lat, lon],\n", " radius=3,\n", " fill=True,\n", " fill_opacity=0.6\n", " ).add_to(m)\n", "\n", "m" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "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AGABoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNAEAABgAaEJAADAgr8cmvLz85WWlqZTp06VRD8AAADlksOhacyYMfrvf/8r6ffA1LFjR7Vs2VL+/v5KSUkp6f4AAADKBYdD04cffqhmzZpJkpYtW6aDBw9qz549io6O1jPPPFPiDQIAAJQHDoemEydOyM/PT5L0+eefq1evXrrllls0aNAg7dixo8QbBAAAKA8cDk2+vr76/vvvlZ+fr8TERN15552SpLNnz8rZ2fmqG5kyZYpsNpvGjBljjp0/f14jR45U9erV5enpqR49eigjI8PueYcPH1ZERIQqVqwoHx8fjR07VhcvXrSrSUlJUcuWLeXm5qb69esrPj6+yPpnzpypgIAAubu7KyQkRJs2bbrqbQEAANcfh0NTVFSUevfurSZNmshmsyksLEyStHHjRgUFBV1VE5s3b9bbb7+tW2+91W48Ojpay5YtU0JCgtasWaOjR4/qwQcfNJfn5+crIiJCeXl5Wr9+vRYsWKD4+HjFxsaaNQcPHlRERIQ6d+6stLQ0jRkzRkOGDFFSUpJZs3jxYsXExCguLk7ffvutmjVrpvDwcB07duyqtgcAAFx/bIZhGI4+6cMPP9SRI0fUq1cv1a5dW5K0YMECValSRd26dXNorjNnzqhly5aaNWuWXnzxRTVv3lzTpk1TVlaWatasqUWLFqlnz56SpD179qhhw4ZKTU1VmzZttHLlSt177706evSofH19JUlz5szR+PHjdfz4cbm6umr8+PFasWKFdu7caa6zT58+yszMVGJioiQpJCRErVu31owZMyRJBQUF8vf31+jRozVhwgRL25GdnS1vb29lZWXJy8vLoX0AAJIUMGFFWbcAlGuHpkSU+JyO/P52+EjTu+++q/vuu0/R0dFmYJKkvn37Kisry+FmR44cqYiICPOIVaGtW7fqwoULduNBQUGqU6eOUlNTJUmpqalq2rSpGZgkKTw8XNnZ2dq1a5dZ88e5w8PDzTny8vK0detWuxonJyeFhYWZNcXJzc1Vdna23QMAAFy/rurjueLC0enTpxUVFeXQXB988IG+/fZbTZ48uciy9PR0ubq6qkqVKnbjvr6+Sk9PN2suDUyFywuXXakmOztb586d04kTJ5Sfn19sTeEcxZk8ebK8vb3N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Nzc3xcXFFfl4FsD1g9c5imMzrFxjBwAA8A/HOU0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNCEf4yUlBTZbDZlZmZesS4gIEDTpk37W3oC8Od47aK8IDThmjNnzhxVrlxZFy9eNMfOnDkjFxcXderUya628M32wIEDuv322/Xrr7+ad36Nj48vsbu4Hz9+XCNGjFCdOnXk5uYmPz8/hYeHa926dWZNQECAbDabPvjggyLPb9y4sWw2m+Lj44vU//ExZcqUEukZ+LuVx9fu1bAazrZv3677779fPj4+cnd3V0BAgCIjI3Xs2DFJ0qFDh2Sz2eTs7KxffvnF7rm//vqrKlSoIJvNpkOHDtnVF/fYsGFDSW8mikFowjWnc+fOOnPmjLZs2WKOff311/Lz89PGjRt1/vx5c3z16tWqU6eO6tWrJ1dXV/n5+ZXKdwP26NFD27Zt04IFC/TDDz/os88+U6dOnfTbb7/Z1fn7+2v+/Pl2Yxs2bFB6eroqVapUZN4XXnhBv/76q91j9OjRJd4/8Hcoj6/d0nL8+HF16dJF1apVU1JSknbv3q358+erVq1aysnJsau98cYb9e6779qNLViwQDfeeGOxc3/55ZdF3heCg4NLbVvwP4QmXHMaNGigG264QSkpKeZYSkqKunXrpsDAQLu/uFJSUtS5c2fz34WH+FNSUhQVFaWsrCzzL7VJkyaZzzt79qwGDRqkypUrq06dOnrnnXcu209mZqa+/vprvfzyy+rcubPq1q2r2267TRMnTtT9999vV9uvXz+tWbNGR44cMcfmzZunfv36qUKFovearVy5svz8/OwexYUr4FpQHl67O3bs0B133CEPDw9Vr15dw4YN05kzZ8zlnTp10pgxY+ye0717dw0cONBc/tNPPyk6Otpcf3HWrVunrKwszZ07Vy1atFBgYKA6d+6sN954Q4GBgXa1AwYMKPLH1Pz58zVgwIBi565evXqR9wUXF5dia1GyCE24JnXu3FmrV682f169erU6deqkjh07muPnzp3Txo0bzTfeS91+++2aNm2avLy8zL/UnnrqKXP5a6+9platWmnbtm167LHHNGLECO3du7fYXjw9PeXp6alPPvlEubm5V+zb19dX4eHhWrBggaTf3+AXL16sQYMGObwPgGtRWb52c3JyFB4erqpVq2rz5s1KSEjQl19+qVGjRlnuf+nSpapdu7bdUeDi+Pn56eLFi/r444/1Z/eQvv/++3Xq1Cl98803kqRvvvlGp06d0n333We5L/w9CE24JnXu3Fnr1q3TxYsXdfr0aW3btk0dO3ZUhw4dzL9iU1NTlZubW+wbr6urq7y9vWWz2cy/1Dw9Pc3l99xzjx577DHVr19f48ePV40aNeze6C9VoUIFxcfHa8GCBapSpYratm2rp59+Wt99912x9YMGDVJ8fLwMw9CHH36oevXqqXnz5sXWjh8/3gxlhY+vv/7asZ0FlCNl+dpdtGiRzp8/r3fffVdNmjTRHXfcoRkzZui9995TRkaGpf6rVasmZ2dnu6PAxWnTpo2efvppPfTQQ6pRo4buvvtuvfLKK8Wux8XFRf3799e8efMk/X70uX///pc9enT77bcXeV/A34PQhGtSp06dlJOTo82bN+vrr7/WLbfcopo1a6pjx47muREpKSm66aabVKdOHYfnv/XWW81/F745F568WZwePXro6NGj+uyzz3TXXXcpJSVFLVu2tDuxu1BERITOnDmjtWvXat68eVc8yjR27FilpaXZPVq1auXw9gDlRVm+dnfv3q1mzZrZfcTdtm1bFRQUXPZI8l/x0ksvKT09XXPmzFHjxo01Z84cBQUFaceOHUVqBw0apISEBKWnpyshIeGK7wuLFy8u8r6Avwdf2ItrUv369VW7dm2tXr1ap06dUseOHSVJtWrVkr+/v9avX6/Vq1frjjvuuKr5//gXns1mU0FBwRWf4+7urjvvvFN33nmnnnvuOQ0ZMkRxcXHmuRCFKlSooIcfflhxcXHauHGjPv7448vOWaNGDdWvX/+qtgEoj8rja/dSTk5ORT5Ou3DhwlX1Iv1+/lGvXr3Uq1cv/fvf/1aLFi306quvmh/RF2ratKmCgoLUt29fNWzYUE2aNLlsGPL39+d9oYxwpAnXrM6dOyslJUUpKSl2lyt36NBBK1eu1KZNm4o9vF/I1dVV+fn5pdZfo0aNilwlU2jQoEFas2aNunXrpqpVq5ZaD0B5VFav3YYNG2r79u12r8t169bJyclJDRo0kCTVrFnT7jyl/Px87dy5s0TW7+rqqnr16l3xfSElJYVzHMsxQhOuWZ07d9Y333yjtLQ0869VSerYsaPefvtt5eXlXfGNNyAgQGfOnFFycrJOnDihs2fPXlUfv/32m+644w793//9n7777jsdPHhQCQkJmjp1qrp161bscxo2bKgTJ04UuWLmj06fPq309HS7R3Z29lX1CZQXZfXa7devn9zd3TVgwADt3LlTq1ev1ujRo/Xwww/L19dXknTHHXdoxYoVWrFihfbs2aMRI0YUualmQECA1q5dq19++UUnTpwodl3Lly9X//79tXz5cv3www/au3evXn31VX3++eeXfV8YOnSojh8/riFDhlxxO3777bci7wuX3q4BpYfQhGtW586dde7cOdWvX998w5N+f+M9ffq0eXnz5dx+++0aPny4IiMjVbNmTU2dOvWq+vD09FRISIjeeOMNdejQQU2aNNFzzz2noUOHasaMGZd9XvXq1eXh4XHFuWNjY3XDDTfYPcaNG3dVfQLlRVm9ditWrKikpCSdPHlSrVu3Vs+ePdWlSxe71+mgQYM0YMAAPfLII+rYsaNuuummIgHuhRde0KFDh1SvXj3VrFmz2HU1atRIFStW1JNPPqnmzZurTZs2WrJkiebOnauHH3642OdUqFBBNWrUKPb2I5cKCwsr8r7wySefWNoH+Gtsxp9dCwkAAACONAEAAFhBaAIAALCA0AQAAGABoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNAEAABgwf8DTotXR9ZgrVsAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAHHCAYAAACiOWx7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABLmElEQVR4nO3dfVwVdd7/8Teg5+DdwVtAksSbvMHbRCUqU5MVFSs327QbF82bNHQTypTN9a42TcubEnW7xb1WM+2XbYlKhKmllIqy3qS2pWalB62Eo6agML8/upjLI6gDKQf09Xw85rGemc98z2e+nuC9c2ZGL8MwDAEAAOCyvD3dAAAAQEVAaAIAALCA0AQAAGABoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDQBAABYQGgCYFm3bt3UrVs38/X69evl5eWl9957r0zef/DgwQoJCSmT96roDh06JC8vLyUlJXm6lQqp8LO9fv16T7eCcoTQBPyvpKQkeXl5XXL54osv3OrPnj2rOXPmKDw8XH5+fvL19VWzZs00evRoff3115beMysrS08//bRatGihqlWrqlq1agoLC9Pzzz+v7Ozsa3CUvzly5IimTJmizMzMa/YepVWee5Ok/v37q0+fPsVuCwkJuexnqHCxEmQWLFhQpoHHE5/FF154QR988IGl2sIQWLh4e3urdu3a6t27t9LT00vdQ1nPMyq2Sp5uAChvpk2bpkaNGhVZ37RpU/PPP/30k3r16qWMjAz17dtXDz/8sKpXr679+/dr2bJleu2115SXl3fZ99m6dav69OmjU6dO6dFHH1VYWJgkadu2bZoxY4Y2btyojz/++Ooe3P86cuSIpk6dqpCQELVv397yfteqnwtdrrfXX39dBQUF17yHSzl37pxSU1M1ffr0YrfPnTtXp06dMl+vXr1a77zzjubMmaO6deua62+//fYrvteCBQtUt25dDR48+Hf3fSWe+iy+8MILeuCBB9SvXz/L+zz00EPq06eP8vPz9fXXX2vBggXq3r27tm7dqjZt2pS4h0vN81133aUzZ87IZrOVeExcvwhNwEV69+6tjh07XrZm8ODB2rFjh9577z3179/fbdtzzz2nZ5999rL7Z2dn649//KN8fHy0Y8cOtWjRwm373//+d73++uulO4Br4Ndff1XVqlU9/gukcuXKHn3/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aunEiRNXfK/k5GT17NlTlSqV/sfmd999J29vb7c7MSUpMDBQNWvWLNJvcQoKCjRv3jwtWLBABw8eVH5+vrnNyleMF7sWn8VGjRopPj5es2fP1pIlS9SlSxfde++9evTRR81AVVojRozQn/70J509e1br1q3TK6+84jYHhTZt2qTJkycrPT29SHDLyckpcR+XOnZJatGihT7//PMSjYeKiTNNQAkV3l20a9eu3zXG119/fcXHEpSGj49PsesNw7A8RkmuQ7Lq4iBXqLhfeNdKaefm119/1fr16y/5fKaSutRcWPHCCy8oPj5ed911l/71r38pJSVFqampatWqVakex3CtPosvv/yydu7cqb/+9a86c+aM/vKXv6hVq1b64Ycffte4t9xyiyIjI9W3b1/Nnj1bcXFxmjBhgrZt22bWfPvtt+rRo4d++uknzZ49W8nJyUpNTVVcXJwkefSxFajYCE1ACd1zzz2SpH/961+/a4wzZ87o//2//3fF2oYNG0qS9u/f77Y+Ly9PBw8eNLeXxO/5pV2c//73v26vDcPQN99843abfa1atYp9SOLFZ1dK0lvDhg115MiRImdK9u3bZ26/GtatW6fc3Fz17t37d43TsGFDFRQUFJmvrKwsZWdnu/V7qXl477331L17d7355psaOHCgevbsqcjIyFI/gPJafhbbtGmjiRMnauPGjfrss8/0448/atGiReb2q/E5fPbZZ1WjRg1NnDjRXPfRRx8pNzdXH374oR5//HH16dNHkZGRxf6fAas9XOrYC9ddrc8ayjdCE1BCERER6tWrl954441in2acl5enp59++rJjjBw5UvXr19dTTz1V7NPDjx07pueff17Sb9fh2Gw2vfLKK25nRN58803l5ORc8plBl1OtWjVJumpPev7nP//pFlzee+89HT161C1kNGnSRF988YXbGY1Vq1bp+++/L3VvhQ85nD9/vtv6OXPmyMvL63eHnEKrV69Wx44dr3gX4ZUUnqmaO3eu2/rZs2dLktvfZbVq1YqdAx8fnyJnxlasWKEff/yxVD1di8+iy+XS+fPn3cZp06aNvL29lZube8VjLImaNWvq8ccfV0pKivkU+cIzihf2mJOTo7fffrvI/lZ76Nixo/z9/bVo0SK3Y1izZo327t1bqv8OUfFwTRNwkTVr1phnKi50++23q3HjxpJ+Cwk9e/bU/fffr3vuuUc9evRQtWrV9N///lfLli3T0aNH9dJLL13yPWrVqqWVK1eqT58+at++vdtTmLdv36533nlHERERkqR69eopISFBU6dOVa9evXTvvfdq//79WrBggTp16uR20bdVTZo0Uc2aNbVo0SLVqFFD1apVU3h4eLFPQreidu3auvPOOzVkyBBlZWVp7ty5atq0qYYPH27WDBs2TO+995569eqlBx98UN9++63+9a9/FbnNvCS93XPPPerevbueffZZHTp0SO3atdPHH3+sf//73xo7dmypbmEvzurVq0t0YfyltGvXTjExMXrttdeUnZ2trl27asuWLVq8eLH69eun7t27m7VhYWFauHChnn/+eTVt2lT+/v66++671bdvX02bNk1DhgzR7bffrl27dmnJkiXmZ7OkrsVncd26dRo9erT+9Kc/qVmzZjp//rz+53/+Rz4+Pm4Pgw0LC9Mnn3yi2bNnKygoSI0aNVJ4eHiJj+HJJ5/U3LlzNWPGDC1btkw9e/aUzWbTPffco8cff1ynTp3S66+/Ln9/fx09etRt30vN88UqV66sF198UUOGDFHXrl310EMPmY8cCAkJMb/6w3XOczfuAeXL5R45oGJu3f7111+Nl156yejUqZNRvXp1w2azGbfccosxZswYt9vaL+fIkSNGXFyc0axZM8PX19eoWrWqERYWZvz97383cnJy3Grnz59vtGjRwqhcubIREBBgjBo16pIPt7xYcQ+F/Pe//22EhoYalSpVKvbhlsW51CMH3nnnHSMhIcHw9/c3qlSpYkRHRxvfffddkf1ffvll46abbjLsdrtxxx13GNu2bSsy5uV6K+44Tp48acTFxRlBQUFG5cqVjVtuueWyD7e82KUehVBo9+7dhiRjy5Ytl6y5lEs93HLq1KlGo0aNjMqVKxvBwcFFHm5pGIbhdDqN6Ohoo0aNGm4PXTx79qzx1FNPGfXr1zeqVKli3HHHHUZ6enqRebT6yIFCV/OzeODAAeOxxx4zmjRpYvj6+hq1a9c2unfvbnzyySdu4+zbt8+46667jCpVqpT64ZaFBg8ebPj4+Jj/7X344YdG27ZtDV9fXyMkJMR48cUXjbfeeqvI38el5vlSD7d89913jVtvvdWw2+1G7dq1ebjlDcbLMEpwdSgA3GBmzpyp2bNn6+jRo1f9WjAAFQvXNAHA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sEDLly9XXFyc2Ut8fLxef/11LV68WHv37tWoUaN0+vRpDRkypCRTBAAArlMluqYpKytLlStXvvRglSrp+PHjlsdbuHChJKlbt25u699++20NHjxYkjRnzhx5e3urf//+ys3NVVRUlBYsWGDW+vj4aNWqVRo1apQiIiJUrVo1xcTEaNq0aWZNo0aNlJycrLi4OM2bN08NGjTQG2+8oaioKLNmwIABOn78uCZNmiSn06n27dtr7dq1RS4OBwAAN6YShaabbrpJu3fvVtOmTYvdvnPnTtWvX9/yeFYeEeXr66vExEQlJiZesqZhw4ZavXr1Zcfp1q2bduzYcdma0aNHa/To0VfsCQAA3HhK9PVcnz599Le//U1nz54tsu3MmTOaPHmy+vbte9WaAwAAKC9KdKZp4sSJev/999WsWTONHj1azZs3l/TbU7oTExOVn5+vZ5999po0CgAA4EklCk0BAQHavHmzRo0apYSEBPPrNS8vL0VFRSkxMZFrgAAAwHWpxA+3LLx+6MSJE/rmm29kGIZuueUW1apV61r0BwAAUC6U6ongklSrVi116tTpavYCAABQbpXq354DAAC40RCaAAAALCA0AQAAWEBoAgAAsIDQBAAAYAGhCQAAwAJCEwAAgAWEJgAAAAsITQAAABYQmgAAACwgNAEAAFhAaAIAALCA0AQAAGABoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNAEAABgAaEJAADAAkITAACABYQmAAAACwhNAAAAFhCaAAAALCA0AQAAWODR0LRx40bdc889CgoKkpeXlz744AO37YMHD5aXl5fb0qtXL7eaX375RY888ogcDodq1qypoUOH6tSpU241O3fuVJcuXeTr66vg4GDNnDmzSC8rVqxQixYt5OvrqzZt2mj16tVX/XgBAEDF5dHQdPr0abVr106JiYmXrOnVq5eOHj1qLu+8847b9kceeUR79uxRamqqVq1apY0bN2rEiBHmdpfLpZ49e6phw4bKyMjQrFmzNGXKFL322mtmzebNm/XQQw9p6NCh2rFjh/r166d+/fpp9+7dV/+gAQBAhVTJk2/eu3dv9e7d+7I1drtdgYGBxW7bu3ev1q5dq61bt6pjx46SpFdffVV9+vTRSy+9pKCgIC1ZskR5eXl66623ZLPZ1KpVK2VmZmr27NlmuJo3b5569eqlcePGSZKee+45paamav78+Vq0aNFVPGIAAFBRlftrmtavXy9/f381b95co0aN0s8//2xuS09PV82aNc3AJEmRkZHy9vbWl19+adbcddddstlsZk1UVJT279+vEydOmDWRkZFu7xsVFaX09PRL9pWbmyuXy+W2AACA61e5Dk29evXSP//5T6WlpenFF1/Uhg0b1Lt3b+Xn50uSnE6n/P393fapVKmSateuLafTadYEBAS41RS+vlJN4fbiTJ8+XX5+fuYSHBz8+w4WAACUax79eu5KBg4caP65TZs2atu2rZo0aaL169erR48eHuxMSkhIUHx8vPna5XIRnAAAuI6V6zNNF2vcuLHq1q2rb775RpIUGBioY8eOudWcP39ev/zyi3kdVGBgoLKystxqCl9fqeZS11JJv11r5XA43BYAAHD9qlCh6YcfftDPP/+s+vXrS5IiIiKUnZ2tjIwMs2bdunUqKChQeHi4WbNx40adO3fOrElNTVXz5s1Vq1YtsyYtLc3tvVJTUxUREXGtDwkAAFQQHg1Np06dUmZmpjIzMyVJBw8eVGZmpg4fPqxTp05p3Lhx+uKLL3To0CGlpaXpvvvuU9OmTRUVFSVJatmypXr16qXhw4dry5Yt2rRpk0aPHq2BAwcqKChIkvTwww/LZrNp6NCh2rNnj959913NmzfP7au1J598UmvXrtXLL7+sffv2acqUKdq2bZtGjx5d5nMCAADKJ4+Gpm3btunWW2/VrbfeKkmKj4/XrbfeqkmTJsnHx0c7d+7Uvffeq2bNmmno0KEKCwvTZ599Jrvdbo6xZMkStWjRQj169FCfPn105513uj2Dyc/PTx9//LEOHjyosLAwPfXUU5o0aZLbs5xuv/12LV26VK+99pratWun9957Tx988IFat25ddpMBAADKNS/DMAxPN3E9cLlc8vPzU05OzjW5vilkQnKp9z00I/oqdgIAuBA/nyu2kvz+rlDXNAEAAHgKoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNAEAABgAaEJAADAAkITAACABYQmAAAACwhNAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBAAAYAGhCQAAwAJCEwAAgAWEJgAAAAsITQAAABYQmgAAACwgNAEAAFhAaAIAALCA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f/DBB43o6Gi3deHh4cbjjz9+Tfv0pJLO0cXOnz9v1KhRw1i8ePG1arFcKM08nT9/3rj99tuNN954w4iJibnuQ1NJ52jhwoVG48aNjby8vLJq0eNKOkexsbHG3Xff7bYuPj7euOOOO65pn+WFlTDwzDPPGK1atXJbN2DAACMqKuoadla+WJmn4oSGhhpTp069+g2VAl/PeVheXp4yMjIUGRlprvP29lZkZKTS09OL3Sc9Pd2tXpKioqIuWV/RlWaOLvbrr7/q3Llzql279rVq0+NKO0/Tpk2Tv7+/hg4dWhZtelRp5ujDDz9URESEYmNjFRAQoNatW+uFF15Qfn5+WbVdpkozR7fffrsyMjLMr/AOHDig1atXq0+fPmXSc0Vwo/3cvloKCgp08uTJcvOzmyeCe9hPP/2k/Pz8Iv9US0BAgPbt21fsPk6ns9h6p9N5zfr0pNLM0cXGjx+voKCgIj+0rielmafPP/9cb775pjIzM8ugQ88rzRwdOHBA69at0yOPPKLVq1frm2++0RNPPKFz585p8uTJZdF2mSrNHD388MP66aefdOedd8owDJ0/f14jR47UX//617JouUK41M9tl8ulM2fOqEqVKh7qrHx76aWXdOrUKT344IOebkUSF4LjBjBjxgwtW7ZMK1eulK+vr6fbKTdOnjypQYMG6fXXX1fdunU93U65VVBQIH9/f7322msKCwvTgAED9Oyzz2rRokWebq3cWL9+vV544QUtWLBA27dv1/vvv6/k5GQ999xznm4NFdjSpUs1depULV++XP7+/p5uRxJnmjyubt268vHxUVZWltv6rKwsBQYGFrtPYGBgieorutLMUaGXXnpJM2bM0CeffKK2bdteyzY9rqTz9O233+rQoUO65557zHUFBQWSpEqVKmn//v1q0qTJtW26jJXms1S/fn1VrlxZPj4+5rqWLVvK6XQqLy9PNpvtmvZc1kozR3/72980aNAgDRs2TJLUpk0bnT59WiNGjNCzzz4rb2/+//mlfm47HA7OMhVj2bJlGjZsmFasWFGuviHgk+xhNptNYWFhSktLM9cVFBQoLS1NERERxe4TERHhVi9Jqampl6yv6EozR5I0c+ZMPffcc1q7dq06duxYFq16VEnnqUWLFtq1a5cyMzPN5d5771X37t2VmZmp4ODgsmy/TJTms3THHXfom2++MQOlJH399deqX7/+dReYpNLN0a+//lokGBWGTIN/3lTSjfdz+/d45513NGTIEL3zzjuKjo72dDvuPH0lOn67vddutxtJSUnGV199ZYwYMcKoWbOm4XQ6DcMwjEGDBhkTJkww6zdt2mRUqlTJeOmll4y9e/cakydPviEeOVCSOZoxY4Zhs9mM9957zzh69Ki5nDx50lOHUCZKOk8XuxHunivpHB0+fNioUaOGMXr0aGP//v3GqlWrDH9/f+P555/31CFccyWdo8mTJxs1atQw3nnnHePAgQPGxx9/bDRp0sR48MEHPXUI19zJkyeNHTt2GDt27DAkGbNnzzZ27NhhfPfdd4ZhGMaECROMQYMGmfWFjxwYN26csXfvXiMxMfGGeORASedpyZIlRqVKlYzExES3n93Z2dmeOgQ3hKZy4tVXXzVuvvlmw2azGZ07dza++OILc1vXrl2NmJgYt/rly5cbzZo1M2w2m9GqVSsjOTm5jDsueyWZo4YNGxqSiiyTJ08u+8bLWEk/Sxe6EUKTYZR8jjZv3myEh4cbdrvdaNy4sfH3v//dOH/+fBl3XbZKMkfnzp0zpkyZYjRp0sTw9fU1goODjSeeeMI4ceJE2TdeRj799NNif8YUzktMTIzRtWvXIvu0b9/esNlsRuPGjY233367zPsuayWdp65du1623tO8DINzpwAAAFfCNU0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNAEAABgAaEJAADAAkITAACABYQmAPgd1q9fLy8vL2VnZ3u6FQDXGKEJwA1h8ODB8vLykpeXlypXrqxGjRrpmWee0dmzZy2P0a1bN40dO9Zt3e23366jR4/Kz8/vKncMoLyp5OkGAKCs9OrVS2+//bbOnTunjIwMxcTEyMvLSy+++GKpx7TZbAoMDLyKXQIorzjTBOCGYbfbFRgYqODgYPXr10+RkZFKTU2VJP3888966KGHdNNNN6lq1apq06aN3nnnHXPfwYMHa8OGDZo3b555xurQoUPFfj33//7f/1OrVq1kt9sVEhKil19+uawPFcA1QGgCcEPavXu3Nm/eLJvNJkk6e/aswsLClJycrN27d2vEiBEaNGiQtmzZIkmaN2+eIiIiNHz4cB09elRHjx5VcHBwkXEzMjL04IMPauDAgdq1a5emTJmiv/3tb0pKSirLwwNwDfD1HIAbxqpVq1S9enWdP39eubm58vb21vz58yVJN910k55++mmzdsyYMUpJSdHy5cvVuXNn+fn5yWazqWrVqpf9Om727Nnq0aOH/va3v0mSmjVrpq+++kqzZs3S4MGDr+nxAbi2CE0Abhjdu3fXwoULdfr0ac2ZM0eVKlVS//79JUn5+fl64YUXtHz5cv3444/Ky8tTbm6uqlatWqL32Lt3r+677z63dXfccYfmzp2r/Px8+fj4XLXjAVC2+HoOwA2jWrVqatq0qdq1a6e33npLX375pd58801J0qxZszRv3jyNHz9en376qTIzMxUVFaW8vDwPdw2gvCA0AbgheXt7669//asmTpyoM2fOaNOmTbrvvvv06KOPql27dmrcuLG+/vprt31sNpvy8/MvO27Lli21adMmt3WbNm1Ss2bNOMsEVHCEJgA3rD/96U/y8fFRYmKibrnlFqWmpmrz5s3au3evHn/8cWVlZbnVh4SE6Msvv9ShQ4f0008/qaCgoMiYTz31lNLS0vTcc8/p66+/1uLFizV//ny366UAVEyEJgA3rEqVKmn06NGaOXOmnnrqKXXo0EFRUVHq1q2bAgMD1a9fP7f6p59+Wj4+PgoNDVW9evV0+PDhImN26NBBy5cv17Jly9S6dWtNmjRJ06ZN4yJw4DrgZRiG4ekmAAAAyjvONAEAAFhAaAIAALCA0AQAAGABoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNAEAABgAaEJAADAgv8PNx3LvEAzSz0AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAncAAAJHCAYAAADysHDPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB1cklEQVR4nO3de1zO9/8/8Mf7Sl2VXBU6iKaTU85Ei49zU87GpjbWAWEWI2Z8NjJmzsbGZmYKY+xgB+OTQy1zPiWHiQnJqExUEqXrev/+6Nf1demgw/vqravH/XZ73+Z6vd/X63pe16X19Hwd3oIoiiKIiIiIyCAo5A6AiIiIiKTD5I6IiIjIgDC5IyIiIjIgTO6IiIiIDAiTOyIiIiIDwuSOiIiIyIAwuSMiIiIyIEzuiIiIiAwIkzsiIiIiA8LkjoiIiMiAMLkjIiIiAvDnn39i0KBBcHBwgCAI+OWXX577nNjYWHTo0AFKpRJubm6IjIwscs2aNWvg5OQEU1NTeHp64sSJE9IH/xQmd0REREQAHj58iLZt22LNmjVluv769esYMGAAevXqhfj4eEyZMgVjx47Fnj17tNds374dYWFhCA8PR1xcHNq2bQsfHx/cuXNHX28DgiiKot56JyIiIqqGBEHAzz//jKFDh5Z4zfvvv49du3bhwoUL2jZ/f39kZGQgKioKAODp6YlOnTph9erVAACNRgNHR0dMmjQJM2fO1EvstfTSKxEREVEZPH78GHl5eXrpWxRFCIKg06ZUKqFUKiXp/+jRo/D29tZp8/HxwZQpUwAAeXl5OH36NGbNmqU9r1Ao4O3tjaNHj0oSQ3GY3BEREZEsHj9+DLM6dYH8R3rp38LCAtnZ2Tpt4eHhmDt3riT9p6amws7OTqfNzs4OWVlZePToEe7fvw+1Wl3sNZcuXZIkhuIwuSMiIiJZ5OXlAfmPUMt9BGBkLG3n6ifIvvg9bt68CZVKpW2Wqmr3ImNyR0RERLISjE0hGJlI2qeoMAIAqFQqneROSvb29khLS9NpS0tLg0qlgpmZGYyMjGBkZFTsNfb29nqJCeBqWSIiIqIK8fLyQnR0tE7bvn374OXlBQAwMTFBx44dda7RaDSIjo7WXqMPrNwRERGRrASFEYT/X2mTjFj+/rKzs5GYmKh9fP36dcTHx6Nu3bp46aWXMGvWLNy6dQubNm0CAEyYMAGrV6/GjBkzMHr0aMTExOD777/Hrl27tH2EhYUhMDAQHh4e6Ny5M1auXImHDx8iODi48u+xBEzuiIiISFYvSnJ36tQp9OrVS/s4LCwMABAYGIjIyEikpKQgOTlZe97Z2Rm7du3C1KlTsWrVKjRq1Ajr16+Hj4+P9ho/Pz/8+++/mDNnDlJTU9GuXTtERUUVWWQhJe5zR0RERLLIysqCpaUllB3HSj/nTp2H3NPrkZmZqbc5dy8qVu6IiIhIVoKgh8qdRuL+qhEuqCAiIiIyIKzcERERkawEIwUEI6nn3NXc+lXNfedEREREBoiVOyIiIpKVQg+rZUWp5/BVI6zcERERERkQVu6IiIhIVnrZ564GV+6Y3BEREZGsmNxJi8OyRERERAaElTsiIiKSlaBQQFBIXG+Sur9qpOa+cyIiIiIDxModERERyYpz7qTFyh0RERGRAWHljoiIiGRVMOdO6spdza1f1dx3TkRERGSAWLkjIiIiWQmCHubcCZxzR0RVIDIyEoIgICkpSbI+k5KSIAgCIiMjJeuzuuvZsyd69uxZ5a+bn5+PGTNmwNHREQqFAkOHDq1wX3PnzoUgCNIFVwWCgoLg5ORUoec6OTkhKChI0njKSh8/l1RORkYQJD5gxOSOqNq6evUqxo8fDxcXF5iamkKlUqFr165YtWoVHj16JHd4ktm6dStWrlwpdxg6goKCIAgCVCpVsZ/1lStXIAgCBEHAsmXLyt3/7du3MXfuXMTHx0sQrf5t2LABS5cuxWuvvYaNGzdi6tSpJV7bs2dP7Wfz7HHp0qUqjLr6efz4MT799FN4enrC0tISpqamaNq0KUJDQ/H333/LHR6R7DgsS9Xarl278Prrr0OpVCIgIACtWrVCXl4eDh06hPfeew9//fUX1q1bJ3eYkti6dSsuXLiAKVOm6LQ3btwYjx49grGxsSxx1apVCzk5Odi5cydGjBihc27Lli0wNTXF48ePK9T37du38dFHH8HJyQnt2rUr8/P27t1boderrJiYGDRs2BCffvppma5v1KgRFi5cWKTdwcEBH374IWbOnCl1iHr19ddfQ6PR6PU17t69C19fX5w+fRoDBw7Em2++CQsLC1y+fBnbtm3DunXrkJeXp9cYSHr62ApF8mHeaoTJHVVb169fh7+/Pxo3boyYmBg0aNBAe+6dd95BYmIidu3aVenXEUURjx8/hpmZWZFzjx8/homJCRQyrsoSBAGmpqayvb5SqUTXrl3x3XffFUnutm7digEDBuCnn36qklhycnJgbm4OExOTKnm9Z925cwdWVlZlvt7S0hKjRo0q8XytWtXrf9FV8Q+MoKAgnDlzBj/++COGDx+uc27+/Pn44IMP9B4D0YuOw7JUbS1ZsgTZ2dn45ptvdBK7Qm5ubnj33Xe1j/Pz8zF//ny4urpCqVTCyckJ//3vf5Gbm6vzPCcnJwwcOBB79uyBh4cHzMzM8NVXXyE2NhaCIGDbtm348MMP0bBhQ5ibmyMrKwsAcPz4cfj6+sLS0hLm5ubo0aMHDh8+/Nz38euvv2LAgAFwcHCAUqmEq6sr5s+fD7Varb2mZ8+e2LVrF27cuKEduiuc21TSnLuYmBh069YNtWvXhpWVFYYMGYKEhASdawrndSUmJiIoKAhWVlawtLREcHAwcnJynht7oTfffBP/+9//kJGRoW07efIkrly5gjfffLPI9ffu3cP06dPRunVrWFhYQKVSoV+/fjh79qz2mtjYWHTq1AkAEBwcrH3fhe+zZ8+eaNWqFU6fPo3u3bvD3Nwc//3vf7Xnnp5zFxgYCFNT0yLv38fHB9bW1rh9+3ap7+/hw4eYNm0aHB0doVQq0axZMyxbtgyiKAL4v+/gjz/+wF9//aWNNTY2tqwfYRHFzbkTBAGhoaH45Zdf0KpVKyiVSrRs2RJRUVE61924cQMTJ05Es2bNYGZmhnr16uH1118vMqescK7Z4cOHERYWBhsbG9SuXRuvvvoq/v333yIx/e9//0OPHj1Qp04dqFQqdOrUCVu3btWeL27O3bJly9ClSxfUq1cPZmZm6NixI3788ccKfSbHjx/Hrl27MGbMmCKJHVDwD41nh//L8nNQHEEQMHfu3CLtz84NLPwMDx06hMmTJ8PGxgZWVlYYP3488vLykJGRgYCAAFhbW8Pa2hozZszQ/r0B/u/vzrJly7Bu3Trt/586deqEkydP6rx2amoqgoOD0ahRIyiVSjRo0ABDhgwxiLmChZU7qY+aqnr9s5DoKTt37oSLiwu6dOlSpuvHjh2LjRs34rXXXsO0adNw/PhxLFy4EAkJCfj55591rr18+TLeeOMNjB8/HiEhIWjWrJn23Pz582FiYoLp06cjNzcXJiYmiImJQb9+/dCxY0eEh4dDoVAgIiICvXv3xsGDB9G5c+cS44qMjISFhQXCwsJgYWGBmJgYzJkzB1lZWVi6dCkA4IMPPkBmZib++ecf7ZCfhYVFiX3u378f/fr1g4uLC+bOnYtHjx7h888/R9euXREXF1fkF/CIESPg7OyMhQsXIi4uDuvXr4etrS0WL15cps922LBhmDBhAnbs2IHRo0cDKKjaNW/eHB06dChy/bVr1/DLL7/g9ddfh7OzM9LS0vDVV1+hR48euHjxIhwcHNCiRQvMmzcPc+bMwbhx49CtWzcA0Pm+09PT0a9fP/j7+2PUqFGws7MrNr5Vq1YhJiYGgYGBOHr0KIyMjPDVV19h79692Lx5MxwcHEp8b6IoYvDgwfjjjz8wZswYtGvXDnv27MF7772HW7du4dNPP4WNjQ02b96MBQsWIDs7WzvU2qJFi1I/N7Vajbt37+q0mZqalvrdHjp0CDt27MDEiRNRp04dfPbZZxg+fDiSk5NRr149AAWJ9ZEjR+Dv749GjRohKSkJX375JXr27ImLFy/C3Nxcp89JkybB2toa4eHhSEpKwsqVKxEaGort27drr4mMjMTo0aPRsmVLzJo1C1ZWVjhz5gyioqKKTeALrVq1CoMHD8bIkSORl5eHbdu24fXXX8fvv/+OAQMGlPr5POu3334DALz11ltlur68PweVMWnSJNjb2+Ojjz7CsWPHsG7dOlhZWeHIkSN46aWX8Mknn2D37t1YunQpWrVqhYCAAJ3nb926FQ8ePMD48eMhCAKWLFmCYcOG4dq1a9qK6PDhw/HXX39h0qRJcHJywp07d7Bv3z4kJydL+l7IAIhE1VBmZqYIQBwyZEiZro+PjxcBiGPHjtVpnz59ughAjImJ0bY1btxYBCBGRUXpXPvHH3+IAEQXFxcxJydH267RaMQmTZqIPj4+okaj0bbn5OSIzs7O4iuvvKJti4iIEAGI169f17nuWePHjxfNzc3Fx48fa9sGDBggNm7cuMi1169fFwGIERER2rZ27dqJtra2Ynp6urbt7NmzokKhEAMCArRt4eHhIgBx9OjROn2++uqrYr169Yq81rMCAwPF2rVri6Ioiq+99prYp08fURRFUa1Wi/b29uJHH32kjW/p0qXa5z1+/FhUq9VF3odSqRTnzZunbTt58mSR91aoR48eIgBx7dq1xZ7r0aOHTtuePXtEAOLHH38sXrt2TbSwsBCHDh363Pf4yy+/aJ/3tNdee00UBEFMTEzUed2WLVs+t8+n43/2CAwMFEXx/76bpwEQTUxMdF7z7NmzIgDx888/17YV93fq6NGjIgBx06ZN2rbCv4/e3t46f3enTp0qGhkZiRkZGaIoimJGRoZYp04d0dPTU3z06JFOv08/LzAwsMjf0WdjycvLE1u1aiX27t1bp71x48ba916SV199VQQg3r9/v9TrCpX156C4n0sAYnh4eJE+n42z8LnP/vx7eXmJgiCIEyZM0Lbl5+eLjRo10vm7WfjzUa9ePfHevXva9l9//VUEIO7cuVMURVG8f/9+kZ8jQ1D4/3KbQYtEu2ErJT1sBi0SAYiZmZlyv80qx2FZqpYKh0Lr1KlTput3794NAAgLC9NpnzZtGgAUmZvn7OwMHx+fYvsKDAzUmX8XHx+vHX5MT0/H3bt3cffuXTx8+BB9+vTBn3/+Weok86f7evDgAe7evYtu3bohJyenQqsmU1JSEB8fj6CgINStW1fb3qZNG7zyyivaz+JpEyZM0HncrVs3pKenaz/nsnjzzTcRGxuL1NRUxMTEIDU1tcSKjlKp1M5TVKvVSE9Ph4WFBZo1a4a4uLgyv6ZSqURwcHCZru3bty/Gjx+PefPmYdiwYTA1NcVXX3313Oft3r0bRkZGmDx5sk77tGnTIIoi/ve//5U53mc5OTlh3759OseMGTNKfY63tzdcXV21j9u0aQOVSoVr165p257+O/XkyROkp6fDzc0NVlZWxX6+48aN0xkC7tatG9RqNW7cuAEA2LdvHx48eICZM2cWmd/5vO1ano7l/v37yMzMRLdu3cr1PRcqz899RX4OKmPMmDE6n4WnpydEUcSYMWO0bUZGRvDw8ND5rgr5+fnB2tpa+7iwUl14rZmZGUxMTBAbG4v79+9LGjsZHg7LUrWkUqkAFCRDZXHjxg0oFAq4ubnptNvb28PKykr7S6yQs7NziX09e+7KlSsACpK+kmRmZur8j/tpf/31Fz788EPExMQUSaYyMzNL7LMkhe/l6aHkQi1atMCePXvw8OFD1K5dW9v+0ksv6VxXGOv9+/e1n/Xz9O/fH3Xq1MH27dsRHx+PTp06wc3Nrdj5QBqNBqtWrcIXX3yB69ev68wvLBxaLIuGDRuWa/HEsmXL8OuvvyI+Ph5bt26Fra3tc59z48YNODg4FEkoCodcn/27Ux61a9eGt7d3uZ7z7HcFFHxfT//Cf/ToERYuXIiIiAjcunVLZ45XcX+nSvv+gYLthgCgVatW5YoVAH7//Xd8/PHHiI+P15nfWpE9/J7+uX/ewpWK/BxUxrOfoaWlJQDA0dGxSHtxydnzvgOlUonFixdj2rRpsLOzw8svv4yBAwciICAA9vb2krwHOenj9mNCDb79GJM7qpZUKhUcHBxw4cKFcj2vrL9QilsZW9K5wqrc0qVLS9yuo6Q5VBkZGejRowdUKhXmzZsHV1dXmJqaIi4uDu+//77et5UoZFTCZp9PJwXPo1QqMWzYMGzcuBHXrl0rdjJ6oU8++QSzZ8/G6NGjMX/+fNStWxcKhQJTpkwp13su7XsqzpkzZ3Dnzh0AwPnz5/HGG2+U6/kvgrJ8V5MmTUJERASmTJkCLy8vWFpaQhAE+Pv7F/v5SvH9F+fgwYMYPHgwunfvji+++AINGjSAsbExIiIidBZilFXz5s0BFHx3hZWtqvb0P0SeVtJnWFx7cZ9rWb6DKVOmYNCgQfjll1+wZ88ezJ49GwsXLkRMTAzat29flvBfWNwKRVpM7qjaGjhwINatW4ejR4/Cy8ur1GsbN24MjUaDK1eu6ExyT0tLQ0ZGBho3blzhOAqHyFQqVbmrMLGxsUhPT8eOHTvQvXt3bfv169eLXFvWxLTwvVy+fLnIuUuXLqF+/fqSVSue9eabb2LDhg1QKBTw9/cv8boff/wRvXr1wjfffKPTnpGRgfr162sfS3mHhocPHyI4OBju7u7o0qULlixZgldffVW7IrckjRs3xv79+/HgwQOd6l3hkHll/u7oy48//ojAwEAsX75c2/b48WOd1czlUfh3/MKFC0Wq36X56aefYGpqij179kCpVGrbIyIiKhTHoEGDsHDhQnz77bfPTe4q+3NgbW1d5PPKy8tDSkpK+QOXkKurK6ZNm4Zp06bhypUraNeuHZYvX45vv/1W1rjoxVJza5ZU7c2YMQO1a9fG2LFjkZaWVuT81atXsWrVKgAFQ4YAitzhYcWKFQBQ7lV7T+vYsSNcXV2xbNkyZGdnFzlf3JYShQr/tf70v87z8vLwxRdfFLm2du3aZRqmbdCgAdq1a4eNGzfq/HK6cOEC9u7dq/0s9KFXr16YP38+Vq9eXepQkZGRUZHqxQ8//IBbt27ptBX+8q1oUvK0999/H8nJydi4cSNWrFgBJycnBAYGFtkK51n9+/eHWq3G6tWrddo//fRTCIKAfv36VTo2qRX3+X7++eclVp2ep2/fvqhTpw4WLlxYZEPq0qp7RkZGEARB53WTkpLwyy+/VCgOLy8v+Pr6Yv369cX2kZeXh+nTpwOo/M+Bq6sr/vzzT522devWVfgzrKycnJwin72rqyvq1Knz3L/D1QG3QpEWK3dUbbm6umLr1q3w8/NDixYtdO5QceTIEfzwww/a/ajatm2LwMBArFu3TjsUeuLECWzcuBFDhw5Fr169KhyHQqHA+vXr0a9fP7Rs2RLBwcFo2LAhbt26hT/++AMqlQo7d+4s9rldunSBtbU1AgMDMXnyZAiCgM2bNxf7C7Njx47Yvn07wsLC0KlTJ1hYWGDQoEHF9rt06VL069cPXl5eGDNmjHYLCEtLy1KHSytLoVDgww8/fO51AwcOxLx58xAcHIwuXbrg/Pnz2LJlC1xcXHSuc3V1hZWVFdauXYs6deqgdu3a8PT0LHVOZHFiYmLwxRdfIDw8XLs1S0REBHr27InZs2djyZIlJT530KBB6NWrFz744AMkJSWhbdu22Lt3L3799VdMmTJFZ3HDi2LgwIHYvHkzLC0t4e7ujqNHj2L//v3lms/4NJVKhU8//RRjx45Fp06d8Oabb8La2hpnz55FTk4ONm7cWOzzBgwYgBUrVsDX1xdvvvkm7ty5gzVr1sDNzQ3nzp2rUCybNm1C3759MWzYMAwaNAh9+vRB7dq1ceXKFWzbtg0pKSnave4q83MwduxYTJgwAcOHD8crr7yCs2fPYs+ePTqV5ar0999/o0+fPhgxYgTc3d1Rq1Yt/Pzzz0hLSyu1Sk41E5M7qtYGDx6Mc+fOYenSpfj111/x5ZdfQqlUok2bNli+fDlCQkK0165fvx4uLi6IjIzEzz//DHt7e8yaNQvh4eGVjqNnz544evSotmqVnZ0Ne3t7eHp6Yvz48SU+r169evj9998xbdo0fPjhh7C2tsaoUaPQp0+fIqt1J06ciPj4eERERODTTz9F48aNS0zuvL29ERUVhfDwcMyZMwfGxsbo0aMHFi9eXO7ESB/++9//4uHDh9i6dSu2b9+ODh06YNeuXUVut2VsbIyNGzdi1qxZmDBhAvLz8xEREVGu9/DgwQOMHj0a7du317l7Qbdu3fDuu+9i+fLlGDZsGF5++eVin69QKPDbb79hzpw52L59OyIiIuDk5ISlS5dqV1u/aFatWgUjIyNs2bIFjx8/RteuXbF///4SV4CXxZgxY2Bra4tFixZh/vz5MDY2RvPmzUu9f27v3r3xzTffYNGiRZgyZQqcnZ2xePFiJCUlVTi5s7GxwZEjR/DFF19g+/bt+OCDD5CXl4fGjRtj8ODBOhuXV+bnICQkBNevX8c333yDqKgodOvWDfv27UOfPn0qFHdlOTo64o033kB0dDQ2b96MWrVqoXnz5vj++++L3dC5uuGcO2kJYmVnzBIRERFVQFZWFiwtLdHg9c+hMC7fAqnn0Tx5hJQfJiEzM7PMq/4NBSt3REREJCtB0EPlTqi5lTsuqCAiIiIyIKzcERERkawEIyMIJez1V5k+ayomd0RERCQr3qFCWjX3nRMREREZIFbuiIiISFbcCkVaTO5ILzQaDW7fvo06depIegspIiKqWqIo4sGDB3BwcICiBg91VidM7kgvbt++DUdHR7nDICIiidy8eRONGjXSS9+s3EmLyR3pReEN1o3cR0AwMpY5GqoKdi1Lv5E7GZ4WnVyefxFVe/mPHyL2g1e1/1+nFx+TO9KLwqFYwcgYgpGJzNFQVVCYSLu7PL34jM1qyx0CVSF9TrFRKAQoFBL3L3V/1QgHz4mIiIgMCCt3REREJCtBIUCQuNImdX/VCZM7IiIikpUgCJIP+9bknRo4LEtERERkQFi5IyIiIlkJelhQIdbgYVlW7oiIiIgMCJM7IiIikpUgCNpFFZIdFZxzt2bNGjg5OcHU1BSenp44ceJEidf27NlTO1/w6WPAgAHaa4KCgoqc9/X1rVBsZcVhWSIiIiIA27dvR1hYGNauXQtPT0+sXLkSPj4+uHz5MmxtbYtcv2PHDuTl5Wkfp6eno23btnj99dd1rvP19UVERIT2sVKp1N+bAJM7IiIiktmLshXKihUrEBISguDgYADA2rVrsWvXLmzYsAEzZ84scn3dunV1Hm/btg3m5uZFkjulUgl7e/tyx1NRHJYlIiIig5WVlaVz5ObmFntdXl4eTp8+DW9vb22bQqGAt7c3jh49WqbX+uabb+Dv74/atXXv3hIbGwtbW1s0a9YMb7/9NtLT0yv+hsqAyR0RERHJSiEIejkAwNHREZaWltpj4cKFxcZw9+5dqNVq2NnZ6bTb2dkhNTX1ue/hxIkTuHDhAsaOHavT7uvri02bNiE6OhqLFy/GgQMH0K9fP6jV6gp+Ws/HYVkiIiKSlT6HZW/evAmVSqVt19d8t2+++QatW7dG586dddr9/f21f27dujXatGkDV1dXxMbGok+fPnqJhZU7IiIiMlgqlUrnKCm5q1+/PoyMjJCWlqbTnpaW9tz5cg8fPsS2bdswZsyY58bj4uKC+vXrIzExsexvopyY3BEREZGsJN8GpQKVQBMTE3Ts2BHR0dHaNo1Gg+joaHh5eZX63B9++AG5ubkYNWrUc1/nn3/+QXp6Oho0aFCu+MqDyR0RERERgLCwMHz99dfYuHEjEhIS8Pbbb+Phw4fa1bMBAQGYNWtWked98803GDp0KOrVq6fTnp2djffeew/Hjh1DUlISoqOjMWTIELi5ucHHx0dv74Nz7oiIiEhWihfk9mN+fn74999/MWfOHKSmpqJdu3aIiorSLrJITk6GQqFbF7t8+TIOHTqEvXv3FunPyMgI586dw8aNG5GRkQEHBwf07dsX8+fP1+ted0zuiIiIiP6/0NBQhIaGFnsuNja2SFuzZs0gimKx15uZmWHPnj1ShlcmTO6IiIhIVoKi4JC6z5qqBr91IiIiIsPDyh0RERHJShAECILE+9xJ3F91wuSOiIiIZKVQQA8LKiTtrlqpwW+diIiIyPCwckdERESy0uftx2oiVu6IiIiIDAgrd0RERCQrQdBD5a4GL6hg5Y6IiIjIgLByR0RERLJSCAIUElfaRFbuiIiIiMgQsHJHRERE8tLDallwtSwRERERGQJW7oiIiEhW3OdOWkzuiIiISFYKhSD57cek7q864bAsERERkQFh5Y6IiIhkJQiC5JsOcxNjIiIiIjIIrNwRERGRrARFwSF1nzVVDX7rRERERIaHlTsiIiKSFVfLSouVOyIiIiIDwsodERERyYqbGEuLyR0RERHJiluhSIvDskREREQGhJU7IiIikhUXVEiLlTsiIiIiA8LKHREREclKEPSwoIJz7oiIiIjIELByR0RERLIyUggwkrhyJ3LOHREREREZAlbuiIiISFYKPVTuNDW4csfkjoiIiGSlj2HZmpzccViWiIiIyICwckdERESyYuVOWqzcERERERkQVu6IiIhIVqzcSYuVO5nMnTsX7dq10z4OCgrC0KFDq+S1iIiIyHBVaXI3d+5cCIIAX1/fIueWLl0KQRDQs2dPyV83NTUVkyZNgouLC5RKJRwdHTFo0CBER0dL+jo9e/bElClTynTt9OnTJX99oOB2K7/88kuVvBYREZEUaimAWgpB4kPudyWfKh+WbdCgAf744w/8888/aNSokbZ9w4YNeOmllyR/vaSkJHTt2hVWVlZYunQpWrdujSdPnmDPnj145513cOnSJclfszSiKEKtVsPCwgIWFhZV8ppV+VpEREQkr3LntRqNBgsXLoSzszPMzMzQtm1b/Pjjj9rzf/31FwYOHAiVSoU6deqgW7duuHr1qva8ra0t+vbti40bN2rbjhw5grt372LAgAE6r3Xy5Em88sorqF+/PiwtLdGjRw/ExcVpz8fGxsLExAQHDx7Uti1ZsgS2trZIS0sDAEycOBGCIODEiRMYPnw4mjZtipYtWyIsLAzHjh3TPi85ORlDhgyBhYUFVCoVRowYoe0D+L+hzc2bN8PJyQmWlpbw9/fHgwcPABQMqx44cACrVq0quAGyICApKQmxsbEQBAH/+9//0LFjRyiVShw6dKjEodKPPvoINjY2UKlUmDBhAvLy8rTnnJycsHLlSp3r27Vrh7lz52rPA8Crr74KQRC0j599LY1Gg3nz5qFRo0ZQKpVo164doqKitOeTkpIgCAJ27NiBXr16wdzcHG3btsXRo0eLxEtERFRZhXPupD5qqnIndwsXLsSmTZuwdu1a/PXXX5g6dSpGjRqFAwcO4NatW+jevTuUSiViYmJw+vRpjB49Gvn5+Tp9jB49GpGRkdrHGzZswMiRI2FiYqJz3YMHDxAYGIhDhw7h2LFjaNKkCfr3769NqAqHQd966y1kZmbizJkzmD17NtavXw87Ozvcu3cPUVFReOedd1C7du0i78XKygpAQbIzZMgQ3Lt3DwcOHMC+fftw7do1+Pn56Vx/9epV/PLLL/j999/x+++/48CBA1i0aBEAYNWqVfDy8kJISAhSUlKQkpICR0dH7XNnzpyJRYsWISEhAW3atCn2s42OjkZCQgJiY2Px3XffYceOHfjoo4/K9sWgIBkGgIiICKSkpGgfP2vVqlVYvnw5li1bhnPnzsHHxweDBw/GlStXdK774IMPMH36dMTHx6Np06Z44403inyXhXJzc5GVlaVzEBERlYVCD4mdogYnd+Uals3NzcUnn3yC/fv3w8vLCwDg4uKCQ4cO4auvvtJWtLZt2wZjY2MAQNOmTYv0M3DgQEyYMAF//vknOnbsiO+//x6HDh3Chg0bdK7r3bu3zuN169bBysoKBw4cwMCBAwEAH3/8Mfbt24dx48bhwoULCAwMxODBgwEAiYmJEEURzZs3L/V9RUdH4/z587h+/bo2Idu0aRNatmyJkydPolOnTgAKksDIyEjUqVMHAPDWW28hOjoaCxYsgKWlJUxMTGBubg57e/sirzFv3jy88sorpcZhYmKCDRs2wNzcHC1btsS8efPw3nvvYf78+VAonp+H29jYAChIWouLodCyZcvw/vvvw9/fHwCwePFi/PHHH1i5ciXWrFmjvW769OnaaupHH32Eli1bIjExsdjPc+HCheVKRImIiEg/ylW5S0xMRE5ODl555RXtPC4LCwts2rQJV69eRXx8PLp166ZN7EpibGyMUaNGISIiAj/88AOaNm1abDUrLS0NISEhaNKkCSwtLaFSqZCdnY3k5GTtNSYmJtiyZQt++uknPH78GJ9++qn2nCiKZXpfCQkJcHR01Km0ubu7w8rKCgkJCdo2JycnbWIHFMwfvHPnTplew8PD47nXtG3bFubm5trHXl5eyM7Oxs2bN8v0GmWRlZWF27dvo2vXrjrtXbt21XmvAHS+kwYNGgBAie931qxZyMzM1B5SxkxERIbNSFDASCHxIdTcFRXlqtxlZ2cDAHbt2oWGDRvqnFMqlWVeKQoUDM16enriwoULGD16dLHXBAYGIj09HatWrULjxo2hVCrh5eWlMw8NKJizBwD37t3DvXv3tEOwTZo0gSAIki2aeDZpFQQBGo2mTM8tbli4vBQKRZGE9cmTJ5XutyRPv19BKChvl/R+lUollEql3mIhIiKisilXWuvu7g6lUonk5GS4ubnpHI6OjmjTpg0OHjxYpoSjZcuWaNmyJS5cuIA333yz2GsOHz6MyZMno3///mjZsiWUSiXu3r2rc83Vq1cxdepUfP311/D09ERgYKA2Aalbty58fHywZs0aPHz4sEj/GRkZAIAWLVrg5s2bOtWmixcvIiMjA+7u7mX9eGBiYgK1Wl3m65919uxZPHr0SPv42LFjsLCw0FYUbWxskJKSoj2flZWF69ev6/RhbGxcagwqlQoODg44fPiwTvvhw4fL9V6JiIikwgUV0ipXclenTh1Mnz4dU6dOxcaNG3H16lXExcXh888/x8aNGxEaGoqsrCz4+/vj1KlTuHLlCjZv3ozLly8X219MTAxSUlK0Cxue1aRJE2zevBkJCQk4fvw4Ro4cCTMzM+15tVqNUaNGwcfHB8HBwYiIiMC5c+ewfPly7TVr1qyBWq1G586d8dNPP+HKlStISEjAZ599pp036O3tjdatW2PkyJGIi4vDiRMnEBAQgB49epRpOLWQk5MTjh8/jqSkJNy9e7fMVb1CeXl5GDNmDC5evIjdu3cjPDwcoaGh2vl2vXv3xubNm3Hw4EGcP38egYGBMDIyKhJDdHQ0UlNTcf/+/WJf57333sPixYuxfft2XL58GTNnzkR8fDzefffdcsVLRERkaNasWQMnJyeYmprC09MTJ06cKPHayMhI7Q4ZhYepqanONaIoYs6cOWjQoAHMzMzg7e1dZAGj1Mo9ID1//nzMnj0bCxcuRIsWLeDr64tdu3bB2dkZ9erVQ0xMDLKzs9GjRw907NgRX3/9dYlz8GrXrl1iYgcA33zzDe7fv48OHTrgrbfewuTJk2Fra6s9v2DBAty4cQNfffUVgIJ5YevWrcOHH36Is2fPAihY8BEXF4devXph2rRpaNWqFV555RVER0fjyy+/BFAw5Pjrr7/C2toa3bt3h7e3N1xcXLB9+/ZyfTbTp0+HkZER3N3dYWNjozM3sCz69OmDJk2aoHv37vDz88PgwYO125wABfPaevTogYEDB2LAgAEYOnQoXF1ddfpYvnw59u3bB0dHR7Rv377Y15k8eTLCwsIwbdo0tG7dGlFRUfjtt9/QpEmTcsVLREQkhRelcrd9+3aEhYUhPDwccXFxaNu2LXx8fEqdX69SqbS7ZKSkpODGjRs655csWYLPPvsMa9euxfHjx1G7dm34+Pjg8ePH5Y6vrASxrKsOiMohKysLlpaWqNV6JAQjk+c/gao9+zY95Q6Bqlirl93kDoGqwJNHD7F/Wl9kZmZCpVJJ2nfh74rAiIMwMZd2s/28nGxsDO5Wrrg9PT3RqVMnrF69GkDBPHNHR0dMmjQJM2fOLHJ9ZGQkpkyZop3m9SxRFOHg4IBp06Zh+vTpAIDMzEzY2dkhMjJSu2uF1GruUhIiIiJ6IeizcvfsHqy5ubnFxpCXl4fTp0/D29tb26ZQKODt7V3qJv7Z2dlo3LgxHB0dMWTIEPz111/ac9evX0dqaqpOn5aWlvD09NTrjQGY3BEREZGsjARBLwcAODo6wtLSUnssXLiw2Bju3r0LtVoNOzs7nXY7OzukpqYW+5xmzZphw4YN+PXXX/Htt99Co9GgS5cu+OeffwBA+7zy9CmFKr+3LBEREVFVuXnzps6wrJTbdnl5eWkXZwJAly5d0KJFC3z11VeYP3++ZK9TXkzuiIiISFaKCi6AeF6fQMGCh7LMuatfvz6MjIx07isPFNxQobS7Pj3N2NgY7du3R2JiIgBon5eWlqa9GUDh4+LuLy8VDssSERFRjWdiYoKOHTsiOjpa26bRaBAdHa1TnSuNWq3G+fPntYmcs7Mz7O3tdfrMysrC8ePHy9xnRbByR0RERLLSx6bDFekvLCwMgYGB8PDwQOfOnbFy5Uo8fPgQwcHBAICAgAA0bNhQO29v3rx5ePnll+Hm5oaMjAwsXboUN27cwNixYwEUbLU2ZcoUfPzxx2jSpAmcnZ0xe/ZsODg4YOjQoZK912cxuSMiIiIC4Ofnh3///Rdz5sxBamoq2rVrh6ioKO2CiOTkZO2NBQDg/v37CAkJQWpqKqytrdGxY0ccOXJE545PM2bMwMOHDzFu3DhkZGTgP//5D6Kioopsdiwl7nNHesF97moe7nNX83Cfu5qhKva5m7ztGJQS73OXm5ONz/xf1kvcLzrOuSMiIiIyIByWJSIiIlm9KHPuDAWTOyIiIpIVkztpcViWiIiIyICwckdERESyMhL0ULkTWLkjIiIiIgPAyh0RERHJSp+3H6uJWLkjIiIiMiCs3BEREZGsuFpWWqzcERERERkQVu6IiIhIVqzcSYvJHREREcnKSCF9MmZUg8cma/BbJyIiIjI8rNwRERGRrDgsKy1W7oiIiIgMCCt3REREJCtW7qTFyh0RERGRAWHljoiIiGTF249Ji5U7IiIiIgPCyh0RERHJykgQYCRIPOdO4v6qEyZ3REREJCuFIEAhcTImdX/VCYdliYiIiAwIK3dEREQkKyMARhIX2oyk7a5aYeWOiIiIyICwckdERESyUigEybcu4VYoRERERGQQWLkjIiIiWXErFGmxckdERERkQFi5IyIiIllxnztpMbkjIiIiWSkE6bdCqcHrKTgsS0RERGRIWLkjIiIiWXErFGmxckdERERkQFi5IyIiIllxQYW0WLkjIiIiMiCs3BEREZGsjPSwWlbq/qoTVu6IiIiIDAgrd0RERCQrzrmTFit3RERERAaElTsiIiKSlZFCgJHE+9JJ3V91wuSOiIiIZMVhWWlxWJaIiIjIgLByR0RERLLiVijSYuWOiIiIyICwckdERESyEvQw507gnDsiIiIiMgSs3JFe2bXsBoWJmdxhUBVIPRcrdwhUxfxe6yB3CFQFcnMU2K/n1+BWKNJi5Y6IiIjo/1uzZg2cnJxgamoKT09PnDhxosRrv/76a3Tr1g3W1tawtraGt7d3keuDgoIgCILO4evrq9f3wOSOiIiIZKUAoBAkPioQx/bt2xEWFobw8HDExcWhbdu28PHxwZ07d4q9PjY2Fm+88Qb++OMPHD16FI6Ojujbty9u3bqlc52vry9SUlK0x3fffVeB6MqOyR0RERHJykgQ9HKU14oVKxASEoLg4GC4u7tj7dq1MDc3x4YNG4q9fsuWLZg4cSLatWuH5s2bY/369dBoNIiOjta5TqlUwt7eXntYW1tX6HMqKyZ3REREZLCysrJ0jtzc3GKvy8vLw+nTp+Ht7a1tUygU8Pb2xtGjR8v0Wjk5OXjy5Anq1q2r0x4bGwtbW1s0a9YMb7/9NtLT0yv+hsqAyR0RERHJqvD2Y1IfAODo6AhLS0vtsXDhwmJjuHv3LtRqNezs7HTa7ezskJqaWqb38f7778PBwUEnQfT19cWmTZsQHR2NxYsX48CBA+jXrx/UanUFP63n42pZIiIiMlg3b96ESqXSPlYqlXp5nUWLFmHbtm2IjY2Fqamptt3f31/759atW6NNmzZwdXVFbGws+vTpo5dYmNwRERGRrIwUBYfUfQKASqXSSe5KUr9+fRgZGSEtLU2nPS0tDfb29qU+d9myZVi0aBH279+PNm3alHqti4sL6tevj8TERL0ldxyWJSIiohrPxMQEHTt21FkMUbg4wsvLq8TnLVmyBPPnz0dUVBQ8PDye+zr//PMP0tPT0aBBA0niLg4rd0RERCSrgu1LpN10uCJ7GIeFhSEwMBAeHh7o3LkzVq5ciYcPHyI4OBgAEBAQgIYNG2rn7S1evBhz5szB1q1b4eTkpJ2bZ2FhAQsLC2RnZ+Ojjz7C8OHDYW9vj6tXr2LGjBlwc3ODj4+PZO/1WUzuiIiIiAD4+fnh33//xZw5c5Camop27dohKipKu8giOTkZCsX/DXp++eWXyMvLw2uvvabTT3h4OObOnQsjIyOcO3cOGzduREZGBhwcHNC3b1/Mnz9fb3P/ACZ3REREJDNFBfele16fFREaGorQ0NBiz8XGxuo8TkpKKrUvMzMz7Nmzp0JxVAaTOyIiIpLV01uXSNlnTcUFFUREREQGhJU7IiIikpU+t0KpiWrwWyciIiIyPKzcERERkaw4505arNwRERERGRBW7oiIiEhWglBwSN1nTcXKHREREZEBYeWOiIiIZKWAAAUknnMncX/VCZM7IiIikhWHZaXFYVkiIiIiA8LKHREREclKIRQcUvdZU7FyR0RERGRAWLkjIiIiWXHOnbRYuSMiIiIyIKzcERERkay4FYq0WLkjIiIiMiCs3BEREZG89DDnrgYX7pjcERERkby4FYq0OCxLREREZEBYuSMiIiJZCZB+FLUGF+5YuSMiIiIyJKzcERERkawUggCFxCsqpO6vOmHljoiIiMiAsHJHREREshKgh9uPSdtdtcLKHREREZEBYeWOiIiIZKWA9NWmmly9YnJHREREshIEAYLE47JS91ed1OTEloiIiMjgsHJHREREsuLtx6TFyh0RERGRAWHljoiIiGQlCHrYCoWVOyIiIiIyBKzcERERkay4FYq0avJ7JyIiIjI4rNwRERGRrLjPnbSY3BEREZGsuBWKtDgsS0RERGRAWLkjIiIi2dXgQpvkWLkjIiIiMiCs3BEREZGsOOdOWqzcERERERkQVu6IiIhIVtwKRVqs3BEREREZEFbuiIiISFaccyctJndEREQkKwHSb4VSg3M7DsvKITIyElZWVtrHc+fORbt27arktYiIiMiwvRDJXUnJjZOTk3aS5dPHokWLytx3VlYWPvjgAzRv3hympqawt7eHt7c3duzYAVEUJXsPQUFBGDp0aJmu9fPzw99//y3ZaxdycnLCypUrq+S1iIiIpKIQBL0cFbFmzRo4OTnB1NQUnp6eOHHiRKnX//DDD9oco3Xr1ti9e7fOeVEUMWfOHDRo0ABmZmbw9vbGlStXKhRbWb0QyV1p5s2bh5SUFJ1j0qRJZXpuRkYGunTpgk2bNmHWrFmIi4vDn3/+CT8/P8yYMQOZmZl6jr6oJ0+ewMzMDLa2tlXyelX5WkRERNXZ9u3bERYWhvDwcMTFxaFt27bw8fHBnTt3ir3+yJEjeOONNzBmzBicOXMGQ4cOxdChQ3HhwgXtNUuWLMFnn32GtWvX4vjx46hduzZ8fHzw+PFjvb0PSZK7nj17YvLkyZgxYwbq1q0Le3t7zJ07V3s+IyMDY8eOhY2NDVQqFXr37o2zZ88CKBg2/Oijj3D27FltZS4yMlL73Dp16sDe3l7nqF27tvb8X3/9hYEDB0KlUqFOnTro1q0brl69CgD473//i6SkJBw/fhyBgYFwd3dH06ZNERISgvj4eFhYWAAA7t+/j4CAAFhbW8Pc3Bz9+vXTyaoLhzb37NmDFi1awMLCAr6+vkhJSQFQUHncuHEjfv31V+17iI2NRVJSEgRBwPbt29GjRw+Ymppiy5YtJQ6VfvXVV3B0dIS5uTlGjBihk3z27NkTU6ZM0bl+6NChCAoK0p6/ceMGpk6dqrOkvLjX+vLLL+Hq6goTExM0a9YMmzdv1jkvCALWr1+PV199Febm5mjSpAl+++23Er59IiKiyhEE/RzltWLFCoSEhCA4OBju7u5Yu3YtzM3NsWHDhmKvX7VqFXx9ffHee++hRYsWmD9/Pjp06IDVq1cDKKjarVy5Eh9++CGGDBmCNm3aYNOmTbh9+zZ++eWXSnxipZOscrdx40bUrl0bx48fx5IlSzBv3jzs27cPAPD666/jzp07+N///ofTp0+jQ4cO6NOnD+7duwc/Pz9MmzYNLVu21Fbm/Pz8yvSat27dQvfu3aFUKhETE4PTp09j9OjRyM/Ph0ajwbZt2zBy5Eg4ODgUea6FhQVq1SpYTxIUFIRTp07ht99+w9GjRyGKIvr3748nT55or8/JycGyZcuwefNm/Pnnn0hOTsb06dMBANOnT8eIESO0CV9KSgq6dOmife7MmTPx7rvvIiEhAT4+PsW+l8TERHz//ffYuXMnoqKicObMGUycOLFsHz6AHTt2oFGjRjqVzuL8/PPPePfddzFt2jRcuHAB48ePR3BwMP744w+d6z766COMGDEC586dQ//+/TFy5Ejcu3evxNfPzc1FVlaWzkFERCS3Z3835ebmFntdXl4eTp8+DW9vb22bQqGAt7c3jh49Wuxzjh49qnM9APj4+Givv379OlJTU3WusbS0hKenZ4l9SkGy5K5NmzYIDw9HkyZNEBAQAA8PD0RHR+PQoUM4ceIEfvjhB3h4eKBJkyZYtmwZrKys8OOPP8LMzEybaBVW5szMzLT9vv/++7CwsNA5Dh48CKBgXNzS0hLbtm2Dh4cHmjZtiuDgYDRr1gx3797F/fv30bx581LjvnLlCn777TesX78e3bp1Q9u2bbFlyxbcunVLJ6t+8uQJ1q5dCw8PD3To0AGhoaGIjo4GUJAompmZQalUat+DiYmJ9rlTpkzBsGHD4OzsjAYNGhQbx+PHj7Fp0ya0a9cO3bt3x+eff45t27YhNTW1TJ9/3bp1YWRkpFPpLM6yZcsQFBSEiRMnomnTpggLC8OwYcOwbNkyneuCgoLwxhtvwM3NDZ988gmys7NLnXewcOFCWFpaag9HR8cyxU1ERCSIol4OAHB0dNT5/bRw4cJiY7h79y7UajXs7Ox02u3s7Er8XZyamlrq9YX/LU+fUpBsK5Q2bdroPG7QoAHu3LmDs2fPIjs7G/Xq1dM5/+jRI+3waWnee+897dBjoYYNGwIA4uPj0a1bNxgbGxd5XlkXSyQkJKBWrVrw9PTUttWrVw/NmjVDQkKCts3c3Byurq5F3l9ZeHh4PPeal156Sfu+AMDLywsajQaXL18uMVGriISEBIwbN06nrWvXrli1apVO29PfZ+3ataFSqUp9v7NmzUJYWJj2cVZWFhM8IiKS3c2bN6FSqbSPlUqljNFUDcmSu2cTLEEQoNFokJ2djQYNGiA2NrbIc8qyRUf9+vXh5uZW7LmnK3zPsrGxgZWVFS5duvTc1yiL4t5fWRPIp+cIVpRCoSjyek8PG0utpO+zJEqlskb8wBARkR6ImoJD6j4BqFQqneSuJPXr14eRkRHS0tJ02tPS0kosstjb25d6feF/09LSdEbu0tLS9LYFGlAFq2U7dOiA1NRU1KpVC25ubjpH/fr1AQAmJiZQq9Xl7rtNmzY4ePBgsUmOQqGAv78/tmzZgtu3bxc5n52djfz8fLRo0QL5+fk4fvy49lx6ejouX74Md3f3MsdS0fdQKDk5WSfOY8eOQaFQoFmzZgAKktWn59Gp1Wqd1ThljaFFixY4fPiwTtvhw4fL9V6JiIgMjYmJCTp27KidcgUAGo0G0dHR8PLyKvY5Xl5eOtcDwL59+7TXOzs7w97eXuearKwsHD9+vMQ+paD35M7b2xteXl4YOnQo9u7di6SkJBw5cgQffPABTp06BaBgf7br168jPj4ed+/e1Zns+ODBA6SmpuochZP1Q0NDkZWVBX9/f5w6dQpXrlzB5s2bcfnyZQDAggUL4OjoCE9PT2zatAkXL17ElStXsGHDBrRv3x7Z2dlo0qQJhgwZgpCQEBw6dAhnz57FqFGj0LBhQwwZMqTM79PJyQnnzp3D5cuXcffu3XJX1UxNTREYGIizZ8/i4MGDmDx5MkaMGKHN+nv37o1du3Zh165duHTpEt5++21kZGQUieHPP//ErVu3cPfu3WJf57333kNkZCS+/PJLXLlyBStWrMCOHTu0i0OIiIiqmiBq9HKUV1hYGL7++mts3LgRCQkJePvtt/Hw4UMEBwcDAAICAjBr1izt9e+++y6ioqKwfPlyXLp0CXPnzsWpU6cQGhpa8L4EAVOmTMHHH3+M3377DefPn0dAQAAcHBzKvDduReg9uRMEAbt370b37t0RHByMpk2bwt/fHzdu3NBOMBw+fDh8fX3Rq1cv2NjY4LvvvtM+v3Djv6ePGTNmACiYGxcTE4Ps7Gz06NEDHTt2xNdff60dUqxbty6OHTuGUaNG4eOPP0b79u3RrVs3fPfdd1i6dCksLS0BABEREejYsSMGDhwILy8viKKI3bt3FzuXryQhISFo1qwZPDw8YGNjU6Q69jxubm4YNmwY+vfvj759+6JNmzb44osvtOdHjx6NwMBABAQEoEePHnBxcUGvXr10+pg3bx6SkpLg6uoKGxubYl9n6NChWLVqFZYtW4aWLVviq6++QkREBHr27FmueImIiCRTOCwr9VFOfn5+WLZsGebMmYN27dohPj4eUVFR2nwlOTlZZxStS5cu2Lp1K9atW4e2bdvixx9/xC+//IJWrVppr5kxYwYmTZqEcePGoVOnTsjOzkZUVBRMTU0r/7mVQBClvE0D0f+XlZUFS0tLNPRfC4VJyXMjyXCknouVOwSqYu/OC3v+RVTt5eZk43N/L2RmZpZp7lp5FP6uuHMrWS992zZ8SS9xv+gkW1BBREREVCGiWHBI3WcN9cLffoyIiIiIyo6VOyIiIpKXHrdCqYlYuSMiIiIyIKzcERERkawKbhcmbaVN4Jw7IiIiIjIErNwRERGRvDjnTlJM7oiIiEheTO4kxWFZIiIiIgPCyh0RERHJi5U7SbFyR0RERGRAWLkjIiIieYkaQMPKnVRYuSMiIiIyIKzcERERkawEUaOHTYxZuSMiIiIiA8DKHREREcmLq2UlxeSOiIiI5CWKBYfUfdZQHJYlIiIiMiCs3BEREZG8OCwrKVbuiIiIiAwIK3dEREQkK0EU9bAVCufcEREREZEBYOWOiIiI5MU5d5Ji5Y6IiIjIgLByR0RERPJi5U5STO6IiIhIXkzuJMVhWSIiIiIDwsodERERyUoQNXrYCoWVOyIiIiIyAKzcERERkbw0moJD6j5rKFbuiIiIiAwIK3dEREQkL1EsOKTus4Zi5Y6IiIjIgLByR0RERPLiPneSYnJHREREsuJWKNLisCwRERGRAWHljoiIiOTFYVlJsXJHREREZEBYuSMiIiJ5iaIeKnfcCoWIiIiIDAArd0RERCQvUQ1o1NL3WUOxckdERERkQFi5IyIiIlmJGg1EjbRz7qTurzphckdERETy0uhhWFbq/qoRDssSERERGRBW7oiIiEherNxJipU7IiIiIgPC5I6IiIhkJarVejn06d69exg5ciRUKhWsrKwwZswYZGdnl3r9pEmT0KxZM5iZmeGll17C5MmTkZmZqXOdIAhFjm3btpUrNg7LEhEREZXTyJEjkZKSgn379uHJkycIDg7GuHHjsHXr1mKvv337Nm7fvo1ly5bB3d0dN27cwIQJE3D79m38+OOPOtdGRETA19dX+9jKyqpcsTG5IyIiInlpNAWH1H3qSUJCAqKionDy5El4eHgAAD7//HP0798fy5Ytg4ODQ5HntGrVCj/99JP2saurKxYsWIBRo0YhPz8ftWr9X0pmZWUFe3v7CsfHYVkiIiIyWFlZWTpHbm5upfs8evQorKystIkdAHh7e0OhUOD48eNl7iczMxMqlUonsQOAd955B/Xr10fnzp2xYcMGiOW8Ty4rd0RERCQvjUYPq2ULKneOjo46zeHh4Zg7d26luk5NTYWtra1OW61atVC3bl2kpqaWqY+7d+9i/vz5GDdunE77vHnz0Lt3b5ibm2Pv3r2YOHEisrOzMXny5DLHx+SOiIiIZCVq1BAlTu4K+7t58yZUKpW2XalUlvicmTNnYvHixaX2m5CQUOnYsrKyMGDAALi7uxdJNGfPnq39c/v27fHw4UMsXbqUyR0RERERAKhUKp3krjTTpk1DUFBQqde4uLjA3t4ed+7c0WnPz8/HvXv3njtX7sGDB/D19UWdOnXw888/w9jYuNTrPT09MX/+fOTm5paamD6NyR3pVYtOLjA2qy13GFQF/F7rIHcIVMVWzVkhdwhUBUR1XhW8iB4WVIjl78/GxgY2NjbPvc7LywsZGRk4ffo0OnbsCACIiYmBRqOBp6dnic/LysqCj48PlEolfvvtN5iamj73teLj42FtbV3mxA5gckdERERULi1atICvry9CQkKwdu1aPHnyBKGhofD399eulL116xb69OmDTZs2oXPnzsjKykLfvn2Rk5ODb7/9VrvAAyhIKo2MjLBz506kpaXh5ZdfhqmpKfbt24dPPvkE06dPL1d8TO6IiIhIVvqcc6cvW7ZsQWhoKPr06QOFQoHhw4fjs88+055/8uQJLl++jJycHABAXFycdiWtm5ubTl/Xr1+Hk5MTjI2NsWbNGkydOhWiKMLNzQ0rVqxASEhIuWJjckdERERUTnXr1i1xw2IAcHJy0tnCpGfPns/d0sTX11dn8+KKYnJHRERE8tKo9bAVin4rdy8ybmJMREREZEBYuSMiIiJ5VbPbj73omNwRERGRrES1GqJa4gUVEvdXnXBYloiIiMiAsHJHRERE8tLjvWVrIlbuiIiIiAwIK3dEREQkL26FIilW7oiIiIgMCCt3REREJCtRo4Eo8Rw5qfurTli5IyIiIjIgrNwRERGRvDjnTlKs3BEREREZEFbuiIiISF6iHip3Ys2t3DG5IyIiIllxQYW0OCxLREREZEBYuSMiIiJ58fZjkmLljoiIiMiAsHJHRERE8uJWKJJi5Y6IiIjIgLByR0RERLIS1WqIamkrbVL3V52wckdERERkQFi5IyIiInlpNNKvbq3Bq2WZ3BEREZG8uKBCUhyWJSIiIjIgrNwRERGRrESNGqLElTap+6tOWLkjIiIiMiCs3BEREZGsRI0GosQLIKTurzph5Y6IiIjIgLByR0RERLISNSJEtdSVO1HS/qoTVu6IiIiIDAgrd0RERCQrUa2RvnIncX/VCZM7IiIikhUXVEiLw7JEREREBoSVOyIiIpIVh2WlxcodERERkQFh5Y6IiIhkxcqdtFi5IyIiIjIgrNwRERGRrES1Ghq1WvI+aypW7oiIiIgMCCt3REREJCtR1MM+d2LNnXPH5I6IiIhkxQUV0uKwLBEREZEBYeWOiIiIZMXKnbRYuSMiIiIyIKzcERERkaxEjSj9ggqNKGl/1Qkrd0RERETldO/ePYwcORIqlQpWVlYYM2YMsrOzS31Oz549IQiCzjFhwgSda5KTkzFgwACYm5vD1tYW7733HvLz88sVGyt3REREJCuNWgONxHPkpO7vWSNHjkRKSgr27duHJ0+eIDg4GOPGjcPWrVtLfV5ISAjmzZunfWxubq79s1qtxoABA2Bvb48jR44gJSUFAQEBMDY2xieffFLm2JjcEREREZVDQkICoqKicPLkSXh4eAAAPv/8c/Tv3x/Lli2Dg4NDic81NzeHvb19sef27t2LixcvYv/+/bCzs0O7du0wf/58vP/++5g7dy5MTEzKFB+HZYmIiEhWhatlpT4AICsrS+fIzc2tdLxHjx6FlZWVNrEDAG9vbygUChw/frzU527ZsgX169dHq1atMGvWLOTk5Oj027p1a9jZ2WnbfHx8kJWVhb/++qvM8bFyR0RERLLS51Yojo6OOu3h4eGYO3dupfpOTU2Fra2tTlutWrVQt25dpKamlvi8N998E40bN4aDgwPOnTuH999/H5cvX8aOHTu0/T6d2AHQPi6t32cxuSMiIiKDdfPmTahUKu1jpVJZ4rUzZ87E4sWLS+0vISGhwrGMGzdO++fWrVujQYMG6NOnD65evQpXV9cK9/ssJndEREQkK33eW1alUukkd6WZNm0agoKCSr3GxcUF9vb2uHPnjk57fn4+7t27V+J8uuJ4enoCABITE+Hq6gp7e3ucOHFC55q0tDQAKFe/TO6IiIiIANjY2MDGxua513l5eSEjIwOnT59Gx44dAQAxMTHQaDTahK0s4uPjAQANGjTQ9rtgwQLcuXNHO+y7b98+qFQquLu7l7lfLqioRoKCgjB06FC5wyAiIpKUPhdU6EOLFi3g6+uLkJAQnDhxAocPH0ZoaCj8/f21K2Vv3bqF5s2baytxV69exfz583H69GkkJSXht99+Q0BAALp37442bdoAAPr27Qt3d3e89dZbOHv2LPbs2YMPP/wQ77zzTqnDyc9icldJPXv2xJQpU/T+nJKkpqZi0qRJcHFxgVKphKOjIwYNGoTo6GhJ+o+MjISVlZUkfRERERmKLVu2oHnz5ujTpw/69++P//znP1i3bp32/JMnT3D58mXtalgTExPs378fffv2RfPmzTFt2jQMHz4cO3fu1D7HyMgIv//+O4yMjODl5YVRo0YhICBAZ1+8suCwbDWWlJSErl27wsrKCkuXLkXr1q3x5MkT7NmzB++88w4uXbokd4hERETPpc/VsvpSt27dUjcsdnJygij+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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAHHCAYAAABeLEexAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABIV0lEQVR4nO3deVxUZf//8feAMq4DboAoCmm5pZZLyF1qKYFGpWnmmrt+7YZKzXKp26Xu0qzutEXLukuzVduT1Mi1hdQszFzITNNU0DRARFHh+v3Rzfk5gooIDHhez8djHg/OOddc53PmjPD2OteZcRhjjAAAAGzMy9MFAAAAeBqBCAAA2B6BCAAA2B6BCAAA2B6BCAAA2B6BCAAA2B6BCAAA2B6BCAAA2B6BCAAA2B6BCChGq1evlsPh0Pvvv+/pUgokJSVFd955p2rUqCGHw6FZs2Z5pI6QkBANHjzYWs59HVevXu2Regpq8ODBqlKlSoHaOhwOTZ06tXgLsrEbb7xRN954o6fLQBlCIEKZN3/+fDkcDlWoUEH79u3Ls/3GG2/U1Vdf7YHKyp4xY8Zo+fLlmjhxohYuXKguXbqcs63D4bAe5cqVU/Xq1dW6dWvdf//92rp1awlWjbIiN9jmPsqXL68rrrhCAwcO1G+//ebp8i7KnDlzNH/+fE+XgSJUztMFAEUlKytLM2bM0PPPP+/pUsqslStXqlu3bho3blyB2t98880aOHCgjDFKS0vTpk2btGDBAs2ZM0dPPvmkxo4dWyR1dejQQcePH5ePj0+R9AfPuu+++9S2bVudOnVKP/zwg+bNm6e4uDht3rxZQUFBRbKPL774okj6OZc5c+aoZs2abiOZKNsYIcJl45prrtErr7yi/fv3e7qUEnfs2LEi6efgwYPy8/MrcPurrrpKAwYM0N13363Y2Fi98sor2rlzp9q2basHHnhAn3/+eZHU5eXlpQoVKsjLq2R/ZRXV62onBXnN2rdvrwEDBmjIkCF6/vnn9fTTT+vIkSNasGDBJfV7Jh8fHwI0LgqBCJeNSZMmKTs7WzNmzDhvu927d8vhcOQ73H32vI6pU6fK4XDol19+0YABA+Tr66tatWrpX//6l4wx2rt3r7p16yaXy6XAwEA988wz+e4zOztbkyZNUmBgoCpXrqzbb79de/fuzdNu3bp16tKli3x9fVWpUiV17NhR33zzjVub3Jq2bt2qfv36qVq1arrhhhvOe8y//fabevXqperVq6tSpUpq166d4uLirO25lx2NMXrxxRetSxqFUaNGDb377rsqV66cHn/8cbdtWVlZmjJliho2bCin06ng4GA99NBDysrKOm+fZ88hio2NVZUqVZSZmZmnbd++fRUYGKjs7Gxr3dKlS9W+fXtVrlxZVatWVXR0tLZs2eL2vNz5Pzt37tQtt9yiqlWrqn///pKkr776Sr169VK9evWsuseMGaPjx4/nW+9vv/2mqKgoVa5cWUFBQXr00UdljLnga7dv3z4NHTpUAQEBcjqdatasmV577bU87Z5//nk1a9ZMlSpVUrVq1dSmTRu9/fbb5+079zV87733PPpezE+nTp0kSbt27bpgv6dPn9Zjjz2mBg0ayOl0KiQkRJMmTcrzHspvDtHFvP/efPNNXXfdddZr3KFDB2vUKSQkRFu2bNGaNWusfyvMVyr7uGSGy0ZoaKgGDhyoV155RRMmTCiyoXdJ6t27t5o0aaIZM2YoLi5O//73v1W9enW9/PLL6tSpk5588km99dZbGjdunNq2basOHTq4Pf/xxx+Xw+HQ+PHjdfDgQc2aNUsRERFKTExUxYoVJf19uapr165q3bq1pkyZIi8vL73++uvq1KmTvvrqK1133XVuffbq1UtXXnmlnnjiifP+sU1JSdE//vEPZWZm6r777lONGjW0YMEC3X777Xr//fd1xx13qEOHDlq4cKHuvvtu6zLYpahXr546duyoVatWKT09XS6XSzk5Obr99tv19ddfa+TIkWrSpIk2b96sZ599Vr/88os+/vjjAvffu3dvvfjii4qLi1OvXr2s9ZmZmfrss880ePBgeXt7S5IWLlyoQYMGKSoqSk8++aQyMzM1d+5c3XDDDfrxxx8VEhJiPf/06dOKiorSDTfcoKefflqVKlWSJC1evFiZmZm65557VKNGDa1fv17PP/+8/vjjDy1evNittuzsbHXp0kXt2rXTzJkztWzZMk2ZMkWnT5/Wo48+es5jSklJUbt27eRwOBQbG6tatWpp6dKlGjZsmNLT0zV69GhJ0iuvvKL77rtPd955p+6//36dOHFCP/30k9atW6d+/fpd8LXz5HvxXHbu3Cnp7zB9oX6HDx+uBQsW6M4779QDDzygdevWafr06dq2bZs++uijc+7jYt5/06ZN09SpU/WPf/xDjz76qHx8fLRu3TqtXLlSkZGRmjVrlu69915VqVJFDz/8sCQpICDgoo8bpYwByrjXX3/dSDIbNmwwO3fuNOXKlTP33Xeftb1jx46mWbNm1vKuXbuMJPP666/n6UuSmTJlirU8ZcoUI8mMHDnSWnf69GlTt25d43A4zIwZM6z1f/31l6lYsaIZNGiQtW7VqlVGkqlTp45JT0+31i9atMhIMrNnzzbGGJOTk2OuvPJKExUVZXJycqx2mZmZJjQ01Nx88815aurbt2+BXp/Ro0cbSearr76y1h09etSEhoaakJAQk52d7Xb8MTExBer3Qm3vv/9+I8ls2rTJGGPMwoULjZeXl1sdxhjz0ksvGUnmm2++sdbVr18/39dx1apVxpi/X686deqYnj17uvWV+7quXbvWOk4/Pz8zYsQIt3bJycnG19fXbf2gQYOMJDNhwoQ8x5KZmZln3fTp043D4TC///57nj7uvfdea11OTo6Jjo42Pj4+5tChQ9b6s99rw4YNM7Vr1zZ//vmn23769OljfH19rRq6devm9n4uqNLwXsyt4bXXXjOHDh0y+/fvN3FxcSYkJMQ4HA6zYcOG8/abmJhoJJnhw4e7rR83bpyRZFauXGmt69ixo+nYsaO1XND3344dO4yXl5e544473P5t5L42uZo1a+bWP8o+LpnhsnLFFVfo7rvv1rx583TgwIEi63f48OHWz97e3mrTpo2MMRo2bJi13s/PT40aNcr3bpmBAweqatWq1vKdd96p2rVrW3NsEhMTtWPHDvXr10+HDx/Wn3/+qT///FPHjh1T586dtXbtWuXk5Lj1OWrUqALV/vnnn+u6665zu5RRpUoVjRw5Urt37y62O8Jybz8/evSopL9HWZo0aaLGjRtbx/fnn39al0tWrVpV4L4dDod69eqlzz//XBkZGdb69957T3Xq1LGONT4+Xqmpqerbt6/bPr29vRUWFpbvPu+5554863JHTqS/57L8+eef+sc//iFjjH788cc87WNjY91qjY2N1cmTJ/Xll1/mezzGGH3wwQe67bbbZIxxqzUqKkppaWn64YcfJP39Pvvjjz+0YcOGAr5a7jz5Xsw1dOhQ1apVS0FBQYqOjtaxY8e0YMECtWnT5rz95tZ49mT9Bx54QJLcLgOfraDvv48//lg5OTmaPHlynjlrhb2M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004Xedt97sPLy8v4+fmZa6+91tx///1my5Yt+T7n5MmT5sknnzTNmjUzTqfTVKtWzbRu3dpMmzbNpKWlWe0udNv9mR5++GEjyTRs2PCcta5atcpERUUZX19fU6FCBdOgQQMzePBg8/3331ttznVOjTFm69atJiIiwlSpUsXUrFnTjBgxwmzatCnPxzfk9rFz504TGRlpKlWqZAICAsyUKVPy3MJ99nvNGGNSUlJMTEyMCQ4ONuXLlzeBgYGmc+fOZt68eVabl19+2XTo0MF6jzRo0MA8+OCDbq/fuV4DT78Xc2tYvHjxedudr99Tp06ZadOmmdDQUFO+fHkTHBxsJk6caE6cOOHW7uzb7o0p+PvPGGNee+01c+2111rtOnbsaOLj463tycnJJjo62lStWtVI4hb8y4DDmELMAAUAlCmrV6/WTTfdpMWLF+vOO+/0dDnFrn379nI6nef8qAPgbMwhAgBcdg4cOJDnYzGA8yEQAQAuG99++63GjRunnTt3nnMSO5AfJlUDAC4br7zyipYuXarRo0dryJAhni4HZQhziAAAgO1xyQwAANgegQgAANgec4gKICcnR/v371fVqlX5uHYAAMoIY4yOHj2qoKCgC34ILYGoAPbv388X/wEAUEbt3btXdevWPW8bAlEB5H4c/t69e+VyuTxcDQAAKIj09HQFBwcX6GttCEQFkHuZzOVyEYgAAChjCjLdhUnVAADA9ghEAADA9ghEAADA9ghEAADA9ghEAADA9ghEAADA9ghEAADA9ghEAADA9ghEAADA9ghEAADA9ghEAADA9ghEAADA9ghEAADA9ghEAADA9ghEAADA9ghEpUjIhDiFTIjzdBkAANgOgQgAANgegQgAANgegQgAANgegQgAANgegQgAANgegQgAANgegQgAANgegQgAANgegQgAANgegQgAANgegQgAANgegQgAANgegQgAANgegQgAANgegQgAANgegQgAANgegQgAANgegQgAANieRwPR3Llz1aJFC7lcLrlcLoWHh2vp0qXW9hMnTigmJkY1atRQlSpV1LNnT6WkpLj1sWfPHkVHR6tSpUry9/fXgw8+qNOnT7u1Wb16tVq1aiWn06mGDRtq/vz5JXF4AACgjPBoIKpbt65mzJihjRs36vvvv1enTp3UrVs3bdmyRZI0ZswYffbZZ1q8eLHWrFmj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VbVqVSUnJys5OVnHjx+XJO3cuVOPPfaYNm7cqN27d+vTTz/VwIED1aFDB7Vo0UKSFBkZqaZNm+ruu+/Wpk2btHz5cj3yyCOKiYmR0+mUJI0aNUq//fabHnroIW3fvl1z5szRokWLNGbMGI8dOwAAKD08Gojmzp2rtLQ03Xjjjapdu7b1eO+99yRJPj4++vLLLxUZGanGjRvrgQceUM+ePfXZZ59ZfXh7e2vJkiXy9vZWeHi4BgwYoIEDB+rRRx+12oSGhiouLk7x8fFq2bKlnnnmGb366qvccg8AACRJDmOM8XQRpV16erp8fX2VlpZWrPOJQibESZJ2z4gutn0AAGAXF/P3u1RMqgYAAPAkAhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9AhEAALA9jwai6dOnq23btqpatar8/f3VvXt3JSUlubU5ceKEYmJiVKNGDVWpUkU9e/ZUSkqKW5s9e/YoOjpalSpVkr+/vx588EGdPn3arc3q1avVqlUrOZ1ONWzYUPPnzy/uwwMAAGWERwPRmjVrFBMTo++++07x8fE6deqUIiMjdezYMavNmDFj9Nlnn2nx4sVas2aN9u/frx49eljbs7OzFR0drZMnT+rbb7/VggULNH/+fE2ePNlqs2vXLkVHR+umm25SYmKiRo8ereHDh2v58uUlerwAAKB0chhjjKeLyHXo0CH5+/trzZo16tChg9LS0lSrVi29/fbbuvPOOyVJ27dvV5MmTZSQkKB27dpp6dKluvXWW7V//34FBARIkl566SWNHz9ehw4dko+Pj8aPH6+4uDj9/PPP1r769Omj1NRULVu27IJ1paeny9fXV2lpaXK5XMVz8JJCJsRJknbPiC62fQAAYBcX8/e7VM0hSktLkyRVr15dkrRx40ad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y5fr448/1meffaa33npLOTk5hdp5RkaGEhMTlZiYKEnatWuXEhMTtWfPHmVkZOjBBx/Ud999p927d2vFihXq1q2bGjZsqKioKElSkyZN1KVLF40YMULr16/XN998o9jYWPXp00dBQUGSpH79+snHx0fDhg3Tli1b9N5772n27Nlul8QAAIDNmYvg4+Nj9uzZ47bO6XSavXv3Xkw3llWrVhlJeR6DBg0ymZmZJjIy0tSqVcuUL1/e1K9f34wYMcIkJye79XH48GHTt29fU6VKFeNyucyQIUPM0aNH3dps2rTJ3HDDDcbpdJo6deqYGTNmXFSdaWlpRpJJS0sr1HEWVP3xS0z98UuKdR8AANjFxfz9vqg5RKdPn1aFChXc1pUvX97tctTFuPHGG2WMOef2gnwNSPXq1a0PYTyXFi1a6Kuvvrro+gAAgD1cVCAyxmjw4MFuE45PnDihUaNGud16X1S33QMAAJSEiwpEgwYNyrNuwIABRVYMAACAJ1xUIDrzO8UAAAAuF4X66g4AAIDLCYEIAADYHoEIAADYHoEIAADYHoEIAADYHoEIAADYHoEIAADYHoEIAADYHoGoFAqZEKeQCXGeLgMAANsgEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANsjEAEAANvzaCBau3atbrvtNgUFBcnhcOjjjz92226M0eTJk1W7dm1VrFhRERER2rFjh1ubI0eOqH///nK5XPLz89OwYcOUkZHh1uann35S+/btVaFCBQUHB2vmzJnFfWgAAKAM8WggOnbsmFq2bKkXX3wx3+0zZ87Uc889p5deeknr1q1T5cqVFRUVpRMnTlht+vfvry1btig+Pl5LlizR2rVrNXLkSGt7enq6IiMjVb9+fW3cuFFPPfWUpk6dqnnz5hX78QEAgLLBYYwxni5CkhwOhz766CN1795d0t+jQ0FBQXrggQc0btw4SVJaWpoCAgI0f/589enTR9u2bVPT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/fpmxIgRef6TyDkrOfmdK0nm9ddft9oU5Hfh7t27TdeuXU3FihVNzZo1zQMPPGBOnTpVwkdzYQ5jjCnpUSkAAIDShDlEAADA9ghEAADA9ghEAADA9ghEAADA9ghEAADA9ghEAADA9ghEAADA9ghEAIrN1KlTdc0111jLgwcPVvfu3T1Wz5kKUsuNN96o0aNHl0g9ADyLQATAzeDBg+VwOORwOFS+fHkFBATo5ptv1muvvaacnJxL6nv27NmaP39+0RRahvz444/q1auXAgICVKFCBV155ZUaMWKEfvnllxKtY/Xq1XI4HHm+jBMAgQhAPrp06aIDBw5o9+7dWrp0qW666Sbdf//9uvXWW3X69OlC9+vr6ys/P7+iKzQfp06dKtb+L9aSJUvUrl07ZWVl6a233tK2bdv05ptvytfXV//61788XR6A/yEQAcjD6XQqMDBQderUUatWrTRp0iR98sknWrp0qdsIT2pqqoYPH65atWrJ5XKpU6dO2rRp0zn7PfMy1bx58xQUFJRn1Klbt24aOnSotfzJJ5+oVatWqlChgq644gpNmzbNLZQ5HA7NnTtXt99+uypXrqzHH39c2dnZGjZsmEJDQ1WxYkU1atRIs2fPzremadOmWfWPGjVKJ0+ePGf9WVlZGjdunOrUqaPKlSsrLCxMq1evPmf7zMxMDRkyRLfccos+/fRTRUREKDQ0VGFhYXr66af18ssvW23XrFmj6667Tk6nU7Vr19aECRPcjjMkJESzZs1y6/+aa67R1KlT3V6LV199VXfccYcqVaqkK6+8Up9++qkkaffu3brpppskSdWqVZPD4dDgwYPPWTtgNwQiAAXSqVMntWzZUh9++KG1rlevXjp48KCWLl2qjRs3qlWrVurcubOOHDlywf569eqlw4cPa9WqVda6I0eOaNmyZerfv78k6auvvtLAgQN1//33a+vWrXr55Zc1f/58Pf744259TZ06VXfccYc2b96soUOHKicnR3Xr1tXixYu1detWTZ48WZMmTdKiRYvcnrdixQpt27ZNq1ev1jvvvKMPP/xQ06ZNO2fNsbGxSkhI0LvvvquffvpJvXr1UpcuXbRjx4582y9fvlx//vmnHnrooXy3546W7du3T7fccovatm2rTZs2ae7cufrvf/+rf//73xd8Hc82bdo03XXXXfrpp590yy23qH///jpy5IiCg4P1wQcfSJKSkpJ04MCBc4ZEwJY8/e2yAEqXQYMGmW7duuW7rXfv3qZJkybGGGO++uor43K5zIkTJ9zaNGjQwLz88svGGGOmTJliWrZsec6+u3XrZoYOHWotv/zyyyYoKMhkZ2cbY4zp3LmzeeKJJ9z6X7hwoaldu7a1LMmMHj36gscVExNjevbs6VZL9erVzbFjx6x1c+fONVWqVLH237FjR3P//fcbY4z5/fffjbe3t9m3b59bv507dzYTJ07Md59PPvmkkWSOHDly3tomTZpkGjVqZHJycqx1L774olst9evXN88++6zb81q2bGmmTJliLUsyjzzyiLWckZFhJJmlS5caY/7/t83/9ddf560HsKNyHk1jAMoUY4wcDockadOmTcrIyFCNGjXc2hw/flw7d+4sUH/9+/fXiBEjNGfOHDmdTr311lvq06ePvLy8rH188803biNC2dnZOnHihDIzM1WpUiVJUps2bfL0/eKLL+q1117Tnj17dPz4cZ08edLtjjdJatmypdWHJIWHhysjI0N79+5V/fr13dpu3rxZ2dnZuuqqq9zWZ2Vl5XkNchljCvQ6bNu2TeHh4dZrK0nXX3+9MjIy9Mcff6hevXoF6keSWrRoYf1cuXJluVwuHTx4sMDPB+yKQASgwLZt26bQ0FBJUkZGhmrXrp3vHJqCTpy+7bbbZIxRXFyc2rZtq6+++krPPvustT0jI0PTpk1Tjx498jy3QoUK1s+VK1d22/buu+9q3LhxeuaZZxQeHq6qVavqqaee0rp16wpUV34yMjLk7e2tjRs3ytvb221blSpV8n1Obnjavn27wsPDC71vSfLy8soTsPKbQF6+fHm3ZYfDccl3BwJ2QCACUCArV67U5s2bNWbMGElSq1atlJycrHLlyikkJKRQfVaoUEE9evTQW2+9pV9//VWNGjVSq1atrO2tWrVSUlKSGjZseFH9fvPNN/rHP/6hf/7zn9a6/EatNm3apOPHj6tixYqSpO+++05VqlRRcHBwnrbXXnutsrOzdfDgQbVv375AdURGRqpmzZqaOXOmPvroozzbU1NT5efnpyZNmuiDDz5wG4H75ptvVLVqVdWtW1eSVKtWLR04cMB6bnp6unbt2lWgOnL5+PhI+nuUDYA7JlUDyCMrK0vJycnat2+ffvjhBz3xxBPq1q2bbr31Vg0cOFCSFBERofDwcHXv3l1ffPGFdu/erW+//VYPP/ywvv/++wLvq3///oqLi9Nrr71mTabONXnyZL3xxhuaNm2atmzZom3btundd9/VI488ct4+r7zySn3//fdavny5fvnlF/3rX//Shg0b8rQ7efKkhg0bpq1bt+rzzz/XlClTFBsba12yO9NVV12l/v37a+DAgfrwww+1a9curV+/XtOnT1dcXFy+dVSuXFmvvvqq4uLidPvtt+vLL7/U7t279f333+uhhx7SqFGjJEn//Oc/tXfvXt17773avn27PvnkE02ZMkVjx461aunUqZMWLlyor776Sps3b9agQYPyjFRdSP369eVwOLRkyRIdOnRIGRkZF/V84HJGIAKQx7Jly1S7dm2FhISoS5cuWrVqlZ577jl98skn1h9hh8Ohzz//XB06dNCQIUN01VVXqU+fPvr9998VEBBQ4H116tRJ1atXV1JSkvr16+e2LSoqSkuWLNEXX3yhtm3bql27dnr22WfzzO852//93/+pR48e6t27t8LCwnT48GG30aJcnTt31pVXXqkOHTqod+/euv32291uYz/b66+/roEDB+qBBx5Qo0aN1L17d23YsOG8c3y6deumb7/9VuXLl1e/fv3UuHFj9e3bV2lpadZdZHXq1NHnn3+u9evXq2XLlho1apSGDRvmFvwmTpyojh076tZbb1V0dLS6d++uBg0anPd1OFudOnU0bdo0TZgwQQEBAYqNjb2o5wOXM4cp6Kw/AACAyxQjRAAAwPYIRAAAwPYIRAAAwPYIRAAAwPYIRAAAwPYIRAAAwPYIRAAAwPYIRAAAwPYIRAAAwPYIRAAAwPYIRAAAwPYIRAAAwPb+H5R7YvbDbt1+AAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\Romain\\AppData\\Local\\Temp\\ipykernel_14980\\3443882100.py:59: DeprecationWarning: `GroupBy.count` is deprecated. It has been renamed to `len`.\n", " .count()\n" ] }, { "data": { "image/png": "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DBmCwMBAzJgxAzk5Ofjuu++QmZmJ5s2bIyQkBLq6uvLP2b59O8aPH482bdrIN8hbvXq1/LixsTGOHz+OcePGoUGDBqhUqRJ8fX3x3Xffyc9p2rQpduzYgR9//BH/+9//4ODggIMHD6J27dryc0qShYiIiIiorBLNPhZlQVZWFoyNjfH8+XNBhkVx8jYnbxMRERF9iA95/yraORZERERERKQ+WFgQEREREVGpsbAgIiIiIqJSY2FBRERERESlxsKCiIiIiIhKjYUFERERERGV2kcVFnZ2dkhPT1dqz8zMhJ2dXalDERERERGRevmowiIpKQmFhYVK7Xl5eXj06FGpQxERERERkXr5oJ23Dx8+LP84NDQUxsbG8ueFhYUICwuDjY3NJwtHRERERETq4YMKi+7duwMAJBIJhgwZonBMS0sLNjY2WLZs2ScLR0RERERE6uGDCgupVAoAsLW1RVRUFCpVqqSSUEREREREpF4+qLB4KzEx8VPnICIiIiIiNfZRhQUAhIWFISwsDGlpafKejLc2b95c6mBERERERKQ+PqqwmDdvHvz8/NCwYUNYWFhAIpF86lxERERERKRGPqqwWLduHQIDAzF48OBPnYeIiIiIiNTQR+1jkZ+fj6ZNm37qLEREREREpKY+qrAYOXIkduzY8amzEBERERGRmvqooVCvXr3C77//jpMnT6JOnTrQ0tJSOL58+fJPEo6IiIiIiNTDRxUWsbGxqFevHgDg2rVrCsc4kZuIiIiIqOz5qMIiIiLiU+cgIiIiIiI19lFzLIiIiIiIiP7to3osPDw83jnkKTw8/KMDERERERGR+vmowuLt/Iq3Xr9+jatXr+LatWsYMmTIp8hFRERERERq5KMKixUrVhTZPnfuXGRnZ5cqEBERERERqZ9POsdi0KBB2Lx586f8kkREREREpAY+aWFx/vx56OrqfsovSUREREREauCjhkL17NlT4blMJsPjx49x6dIlzJ49+5MEIyIiIiIi9fFRhYWxsbHCcw0NDTg5OcHPzw/t27f/JMGIiIiIiEh9fFRhERAQ8KlzEBERERGRGvuowuKty5cv4+bNmwCAWrVqwc3N7ZOEIiIiIiIi9fJRhUVaWhr69euHv/76CyYmJgCAzMxMeHh4YNeuXahcufKnzEhERERERCL3UatCTZgwAS9evMD169eRkZGBjIwMXLt2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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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mWMAAABrc+kRosjISH3wwQdauXKlypUr57jmx9vbWx4eHvL29tbQoUM1duxYVahQQV5eXnriiScUEhKitm3bSpK6du2qRo0aacCAAZo1a5bi4uL0/PPPKzIy0nGUZ8SIEXrttdf0zDPPaMiQIdq0aZM+/vhjRUVFuWzuAACgCDEuJCnbxzvvvOPo8/vvv5t//OMfpnz58qZMmTLmwQcfNKdPn3Ya5/jx46Z79+7Gw8PDVKpUyYwbN86kpqY69dm8ebNp3ry5cXNzM7Vq1XLaxu0kJiYaSSYxMfHPTPemgiasLpBxAQCwstz8/S5Sn0NUVPE5RAAAFD/F9nOIAAAAXIFABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9ABAAALI9AVETUmBjl6hIAALAsAhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8lwaibdu26a9//asCAgJks9m0YsUKp+XGGE2ePFlVqlSRh4eHQkNDdeTIEac+Fy5cUP/+/eXl5SUfHx8NHTpUly5dcuqzb98+tW/fXu7u7goMDNSsWbMKemoAAKAYcWkgunz5spo1a6bXX3892+WzZs3Sq6++qkWLFmnHjh3y9PRUWFiYrl696ujTv39/HTx4UBs2bNDq1au1bds2Pf74447lSUlJ6tq1q4KCgrRnzx7Nnj1bU6dO1Ztvvlng8wMAAMWEKSIkmc8//9zxPCMjw/j7+5vZs2c72hISEozdbjcffvihMcaYQ4cOGUlm165djj5r1641NpvN/Pbb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cuWKY1l0dLSaNGni9EniYWFhSkpK0sGDBwun8Dw6cuSIAgICVKtWLfXv318nTpyQJO3Zs0epqalO+71BgwaqXr26Y78X53nf6Nq1a3r//fc1ZMgQpy9FvlP3+42OHTumuLg4p/3t7e2tNm3aOO1vHx8ftWrVytEnNDRUJUqU0I4dOxx9OnToIDc3N0efsLAwxcbG6uLFi4U0m/yRmJgom82W5bshZ86cqYoVK6pFixaaPXu20ynS4jz/LVu2yNfXV/Xr19fIkSN1/vx5xzIr7fv4+HhFRUVp6NChWZYVpX1vqU+qLirOnTun9PT0LF8b4ufnp8OHD7uoqoKRkZGh0aNH65577lHjxo0d7Y899piCgoIUEBCgffv2acKECYqNjdVnn30mSYqLi8v29clcVlS1adNGS5YsUf369XX69GlNmzZN7du314EDBxQXFyc3N7csfwz8/Pwccyqu887OihUrlJCQoEGDBjna7tT9np3MerObz/X729fX12l5qVKlVKFCBac+NWvWzDJG5rLy5csXSP357erVq5owYYL69evn9IWeTz75pFq2bKkKFSro22+/1aRJk3T69Gm98sorkorv/Lt166aHHnpINWvW1NGjR/Xss8+qe/fuio6OVsmSJS217999912VK1dODz30kFN7Udv3BCIUqMjISB04cEDffPONU/vjjz/u+LlJkyaqUqWKunTpoqNHj6p27dqFXWa+6d69u+Pnpk2bqk2bNgoKCtLHH38sDw8PF1ZW+N566y11795dAQEBjrY7db/j1lJTU/XII4/IGKOFCxc6LRs7dqzj56ZNm8rNzU1///vfNWPGjCL31Q650bdvX8fPTZo0UdOmTVW7dm1t2bJFXbp0cWFlhe/tt99W//795e7u7tRe1PY9p8xcoFKlSipZsmSWu4vi4+Pl7+/voqry36hRo7R69Wpt3rxZ1apVu2XfNm3aSJJ+/vlnSZK/v3+2r0/msuLCx8dH9erV088//yx/f39du3ZNCQkJTn2u3+93yrx/+eUXffXVVxo2bNgt+92p+136X723+nfu7++vM2fOOC1PS0vThQsX7pj3RGYY+uWXX7Rhwwano0PZadOmjdLS0nT8+HFJxX/+mWrVqqVKlSo5vdfv9H0vSV9//bViY2Nv+7tAcv2+JxC5gJubm4KDg7Vx40ZHW0ZGhjZu3KiQkBAXVpY/jDEaNWqUPv/8c23atCnLIc/sxMTESJKqVKkiSQoJCdH+/fudfmFk/jJt1KhRgdRdEC5duqSjR4+qSpUqCg4OVunSpZ32e2xsrE6cOOHY73fKvN955x35+voqPDz8lv3u1P0uSTVr1pS/v7/T/k5KStKOHTuc9ndCQoL27Nnj6LNp0yZlZGQ4wmJISIi2bdum1NRUR58NGzaofv36Rf6USWYYOnLkiL766itVrFjxtuvExMSoRIkSjtNJxXn+1/v11191/vx5p/f6nbzvM7311lsKDg5Ws2bNbtvX5fu+QC7Vxm0tX77c2O12s2TJEnPo0CHz+OOPGx8fH6e7a4qrkSNHGm9vb7Nlyxan2ymvXLlijDHm559/NtOnTze7d+82x44dMytXrjS1atUyHTp0cIyReft1165dTUxMjFm3bp2pXLlykb39OtO4cePMli1bzLFjx8z27dtNaGioqVSpkjlz5owx5o/b7qtXr242bdpkdu/ebUJCQkxISIhj/eI67+ulp6eb6tWrmwkTJji134n7PTk52fzwww/mhx9+MJLMK6+8Yn744QfHXVQzZ840Pj4+ZuXKlWbfvn3mgQceyPa2+xYtWpgdO3aYb775xtStW9fp1uuEhATj5+dnBgwYYA4cOGCWL19uypQpUyRuvb7V/K9du2buv/9+U61aNRMTE+P0uyDzrqFvv/3WzJ0718TExJijR4+a999/31SuXNkMHDjQsY2iOv9bzT05Odk8/fTTJjo62hw7dsx89dVXpmXLlqZu3brm6tWrjjHu1H2fKTEx0ZQpU8YsXLgwy/pFcd8TiFzo3//+t6levbpxc3MzrVu3Nt99952rS8oXkrJ9vPPOO8YYY06cOGE6dOhgKlSoYOx2u6lTp44ZP3680+fRGGPM8ePHTffu3Y2Hh4epVKmSGTdunElNTXXBjHLu0UcfNVWqVDFubm6matWq5tFHHzU///yzY/nvv/9u/vGPf5jy5cubMmXKmAcffNCcPn3aaYziOO/rrV+/3kgysbGxTu134n7fvHlztu/1iIgIY8wft97/3//9n/Hz8zN2u9106dIly+ty/vx5069fP1O2bFnj5eVlBg8ebJKTk5367N2717Rr187Y7XZTtWpVM3PmzMKa4i3dav7Hjh276e+CzM+l2rNnj2nTpo3x9vY27u7upmHDhubFF190Cg3GFM3532ruV65cMV27djWVK1c2pUuXNkFBQWb48OFZ/sN7p+77TG+88Ybx8PAwCQkJWdYvivveZowx+X/cCQAAoPjgGiIAAGB5BCIAAGB5BCIAAGB5BCIAAGB5BCIAAGB5BCIAAGB5BCIAAGB5BCIABaJGjRqaN2/eLfvYbDatWLFCknT8+HHZbDbH13kUlKlTp6p58+YFug0AxQ+BCEAWgwYNks1mk81mk5ubm+rUqaPp06crLS2twLYZGBio06dPq3Hjxvk25vWBK9PTTz/t9P1iBemHH37Qww8/LD8/P7m7u6tu3boaPny4fvrpp0LZfqYtW7bIZrNl+WJhAP9DIAKQrW7duun06dM6cuSIxo0bp6lTp2r27NkFtr2SJUvK399fpUqVKrBtSFLZsmVz9CWjf9bq1avVtm1bpaSkaNmyZfrxxx/1/vvvy9vbW//3f/9X4NsHkDsEIgDZstvt8vf3V1BQkEaOHKnQ0FCtWrVKknTvvfdq9OjRTv179eqlQYMGObUlJyerX79+8vT0VNWqVfX666/fdHvZnTI7ePCgevbsKS8vL5UrV07t27fX0aNHJUm7du3Sfffdp0qVKsnb21sdO3bU999/71i3Ro0akqQHH3xQNpvN8fzGU2YZGRmaPn26qlWrJrvdrubNm2vdunVZ6vrss8/UqVMnlSlTRs2aNVN0dPRN53LlyhUNHjxYPXr00KpVqxQaGqqaNWuqTZs2mjNnjt544w1H361bt6p169ay2+2qUqWKJk6c6HQkLrtTj82bN9fUqVMdz202mxYvXqwHH3xQZcqUUd26dR376vjx4+rUqZMkqXz58rLZbFn2EwACEYAc8vDw0LVr13K1zuzZs9WsWTP98MMPmjhxop566ilt2LAhR+v+9ttv6tChg+x2uzZt2qQ9e/ZoyJAhjrCQnJysiIgIffPNN/ruu+9Ut25d9ejRQ8nJyZL+CEyS9M477+j06dOO5zeaP3++Xn75Zc2ZM0f79u1TWFiY7r//fh05csSp33PPPaenn35aMTExqlevnvr163fTU4jr16/XuXPn9Mwzz2S73MfHxzHHHj166O6779bevXu1cOFCvfXWW3rhhRdy9Bpdb9q0aXrkkUe0b98+9ejRQ/3799eFCxcUGBio//73v5Kk2NhYnT59WvPnz8/1+MCdrmCPTQMo9owx2rhxo9avX68nnngiV+vec889mjhxoiSpXr162r59u+bOnav77rvvtuu+/vrr8vb21vLly1W6dGnHGJk6d+7s1P/NN9+Uj4+Ptm7dqp49e6py5cqS/ggf/v7+N93OnDlzNGHCBPXt21eS9NJLL2nz5s2aN2+e0xGtp59+WuHh4ZL+CB933XWXfv75ZzVo0CDLmJlhKrtl11uwYIECAwP12muvyWazqUGDBjp16pQmTJigyZMnq0SJnP+fddCgQerXr58k6cUXX9Srr76qnTt3qlu3bqpQoYIkydfX1xHGADjjCBGAbK1evVply5aVu7u7unfvrkcffdTpNE1OhISEZHn+448/5mjdmJgYtW/f3hGGbhQfH6/hw4erbt268vb2lpeXly5duqQTJ07kuL6kpCSdOnVK99xzj1P7Pffck6XOpk2bOn6uUqWKJOnMmTPZjmuMydH2f/zxR4WEhMhmszlt+9KlS/r1119zNEZ29Xl6esrLy+um9QHIiiNEALLVqVMnLVy4UG5ubgoICHC62LlEiRJZ/uinpqbm6/Y9PDxuuTwiIkLnz5/X/PnzFRQUJLvdrpCQkFyf1sup64NZZoDJyMjItm/mkazDhw9nCYW5ldPX+sbgaLPZblofgKw4QgQgW56enqpTp46qV6+e5c6vypUr6/Tp047n6enpOnDgQJYxvvvuuyzPGzZsmKPtN23aVF9//fVNg9b27dv15JNPqkePHrrrrrtkt9t17tw5pz6lS5dWenr6Tbfh5eWlgIAAbd++PcvYjRo1ylGd2enatasqVaqkWbNmZbs88/b3hg0bKjo62inwbN++XeXKlVO1atUkZX2tk5KSdOzYsVzV4+bmJkm3fC0AqyMQAci1zp07KyoqSlFRUTp8+LBGjhyZ7WfcbN++XbNmzdJPP/2k119/XZ988omeeuqpHG1j1KhRSkpKUt++fbV7924dOXJES5cuVWxsrCSpbt26Wrp0qX788Uft2LFD/fv3z3JUqUaNGtq4caPi4uJ08eLFbLczfvx4vfTSS/roo48UGxuriRMnKiYmJsd1ZsfT01OLFy9WVFSU7r//fn311Vc6fvy4du/erWeeeUYjRoyQJP3jH//QyZMn9cQTT+jw4cNauXKlpkyZorFjxzquH+rcubOWLl2qr7/+Wvv371dERIRKliyZq3qCgoJks9m0evVqnT17VpcuXcrz3IA7FYEIQK4NGTJEERERGjhwoDp27KhatWo5bu2+3rhx47R79261aNFCL7zwgl555RWFhYXlaBsVK1bUpk2bdOnSJXXs2FHBwcH6z3/+4zg19NZbb+nixYtq2bKlBgwYoCeffFK+vr5OY7z88svasGGDAgMD1aJFi2y38+STT2rs2LEaN26cmjRponXr1mnVqlWqW7duLl8VZw888IC+/fZblS5dWo899pgaNGigfv36KTEx0XEXWdWqVbVmzRrt3LlTzZo104gRIzR06FA9//zzjnEmTZqkjh07qmfPngoPD1evXr1Uu3btXNVStWpVTZs2TRMnTpSfn59GjRr1p+YG3IlsJqdX/wEAANyhOEIEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAs7/8DvaRpGippktEAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "ename": "TypeError", "evalue": "can only concatenate str (not \"int\") to str", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[40], line 90\u001b[0m\n\u001b[0;32m 88\u001b[0m years_pub \u001b[38;5;241m=\u001b[39m pubs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mlist_publishedYear\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39mto_list()\n\u001b[0;32m 89\u001b[0m plt\u001b[38;5;241m.\u001b[39mfigure()\n\u001b[1;32m---> 90\u001b[0m plt\u001b[38;5;241m.\u001b[39mhist(years_pub, bins\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mrange\u001b[39m(\u001b[38;5;28mmin\u001b[39m(years_pub), \u001b[38;5;28;43mmax\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43myears_pub\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;241;43m2\u001b[39;49m))\n\u001b[0;32m 91\u001b[0m plt\u001b[38;5;241m.\u001b[39mtitle(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPublications by Year\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 92\u001b[0m plt\u001b[38;5;241m.\u001b[39mxlabel(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYear\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", "\u001b[1;31mTypeError\u001b[0m: can only concatenate str (not \"int\") to str" ] }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import math\n", "# ── 6. SME involvement rate ────────────────────────────────────────────────\n", "sme_lists = df[\"list_SME\"].drop_nulls().to_list()\n", "sme_flag = [any(lst) for lst in sme_lists]\n", "count_sme = sum(sme_flag)\n", "count_non = len(sme_flag) - count_sme\n", "\n", "plt.figure()\n", "plt.bar([\"With SME\", \"Without SME\"], [count_sme, count_non])\n", "plt.title(\"SME Involvement in Projects\")\n", "plt.ylabel(\"Number of Projects\")\n", "plt.show()\n", "\n", "\n", "# ── 7. EC contribution ratio histogram ────────────────────────────────────\n", "raw_ratios = df[\"ecRatio\"].drop_nulls().to_list()\n", "ec_ratios = [r for r in raw_ratios if math.isfinite(r)]\n", "\n", "plt.figure()\n", "plt.hist(ec_ratios, bins=30)\n", "plt.title(\"EC Contribution / Total Cost Ratio\")\n", "plt.xlabel(\"Ratio\")\n", "plt.ylabel(\"Count\")\n", "plt.show()\n", "\n", "\n", "# ── 8. Correlation matrix of financials ───────────────────────────────────\n", "fin_df = (\n", " df\n", " .select([\"ecMaxContribution\", \"netEcContribution\", \"totalCost\"])\n", " .drop_nulls()\n", " .to_pandas()\n", ")\n", "corr = fin_df.corr()\n", "plt.figure(figsize=(6,6))\n", "plt.imshow(corr.values, cmap=\"RdBu\", vmin=-1, vmax=1)\n", "plt.title(\"Correlation Matrix of Financial Columns\")\n", "plt.xticks(range(len(corr)), corr.columns, rotation=90)\n", "plt.yticks(range(len(corr)), corr.columns)\n", "plt.colorbar()\n", "plt.show()\n", "\n", "\n", "# ── 9. Deliverables per project ────────────────────────────────────────────\n", "deliv_counts = [len(lst) for lst in df[\"list_deliverableType\"].drop_nulls().to_list()]\n", "plt.figure()\n", "plt.hist(deliv_counts, bins=range(max(deliv_counts)+2))\n", "plt.title(\"Number of Deliverables per Project\")\n", "plt.xlabel(\"Deliverable Count\")\n", "plt.ylabel(\"Projects\")\n", "plt.show()\n", "\n", "\n", "# ── 10. Deliverable types frequency ───────────────────────────────────────\n", "types = (\n", " df.explode(\"list_deliverableType\")\n", " .filter(pl.col(\"list_deliverableType\").is_not_null())\n", " .group_by(\"list_deliverableType\")\n", " .count()\n", " .sort(\"count\", descending=True)\n", ")\n", "plt.figure(figsize=(8,4))\n", "plt.bar(types[\"list_deliverableType\"].to_list(),\n", " types[\"count\"].to_list())\n", "plt.title(\"Deliverable Types\")\n", "plt.xlabel(\"Type\")\n", "plt.ylabel(\"Count\")\n", "plt.xticks(rotation=90)\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "\n", "# ── 11. Publications per project ──────────────────────────────────────────\n", "pub_counts = [len(lst) for lst in df[\"list_doi\"].drop_nulls().to_list()]\n", "plt.figure()\n", "plt.hist(pub_counts, bins=range(max(pub_counts)+2))\n", "plt.title(\"Publications per Project\")\n", "plt.xlabel(\"Publication Count\")\n", "plt.ylabel(\"Projects\")\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import polars as pl\n", "import matplotlib.pyplot as plt\n", "import pathlib\n", "from itertools import combinations\n", "import networkx as nx\n", "from sklearn.feature_extraction.text import TfidfVectorizer\n", "from sklearn.cluster import KMeans\n", "from sklearn.manifold import TSNE\n", "import folium\n", "\n", "# Paths\n", "ROOT = pathlib.Path(r\"C:\\Users\\Romain\\OneDrive - KU Leuven\\Masters\\MBIS\\Year 2\\Semester 2\\Modern Data Analytics\\CORDIS\")\n", "OUTDIR = ROOT / \"combined\"\n", "PARQUET = OUTDIR / \"consolidated.parquet\"\n", "PROJECT_PUB = OUTDIR / \"projectPublications_all.parquet\"\n", "\n", "# Load consolidated dataset\n", "df = pl.read_parquet(PARQUET)\n", "\n", "for col in [\"startDate\", \"endDate\"]:\n", " if df[col].dtype == pl.Utf8:\n", " df = df.with_column(\n", " pl.col(col).str.strptime(pl.Date, \"%Y-%m-%d\").alias(col)\n", " )\n", "\n", "df = df.with_columns(\n", " pl.col(\"list_netEcContribution\").list.eval(pl.element().cast(pl.Float64),parallel=True)\n", " .list.sum().alias(\"netEcContribution\")\n", ")\n", "\n", "df = df.with_columns(\n", " pl.col(\"totalCost\").cast(pl.Float64),\n", " pl.col(\"netEcContribution\").cast(pl.Float64)\n", ")\n", "\n", "df = df.with_columns([\n", " pl.col(\"startDate\").dt.year().alias(\"startYear\"),\n", " pl.col(\"endDate\"). dt.year().alias(\"endYear\"),\n", " (pl.col(\"endDate\") - pl.col(\"startDate\")).dt.total_days().alias(\"durationDays\"),\n", " (pl.col(\"netEcContribution\") / pl.col(\"totalCost\")).alias(\"ecRatio\"),\n", "])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ── 12. Yearly publication trends ─────────────────────────────────────────\n", "pubs = (\n", " df\n", " .explode(\"list_publishedYear\")\n", " .filter(pl.col(\"list_publishedYear\").is_not_null())\n", ")\n", "\n", "pubs_by_year = (\n", " pubs\n", " .with_columns(\n", " pl.col(\"list_publishedYear\")\n", " .cast(pl.Int32, strict=False) \n", " .alias(\"year_int\")\n", " )\n", " .filter(pl.col(\"year_int\").is_not_null())\n", " .group_by(\"year_int\")\n", " .len()\n", " .sort(\"year_int\")\n", ")\n", "\n", "# 3) Bar‑plot the small table\n", "years = pubs_by_year[\"year_int\"].to_list()\n", "counts = pubs_by_year[\"count\"].to_list()\n", "\n", "plt.figure(figsize=(8,4))\n", "plt.bar(years, counts)\n", "plt.title(\"Publications by Year\")\n", "plt.xlabel(\"Year\")\n", "plt.ylabel(\"Count\")\n", "plt.xticks(rotation=45)\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "# ── 13. Topic frequency ───────────────────────────────────────────────────\n", "topics = (\n", " df.explode(\"list_topic\")\n", " .filter(pl.col(\"list_topic\").is_not_null())\n", " .group_by(\"list_topic\")\n", " .count()\n", " .sort(\"count\", descending=True)\n", " .head(20)\n", ")\n", "plt.figure(figsize=(8,4))\n", "plt.bar(topics[\"list_topic\"].to_list(), topics[\"count\"].to_list())\n", "plt.title(\"Top 20 Topics\")\n", "plt.xlabel(\"Topic\")\n", "plt.ylabel(\"Count\")\n", "plt.xticks(rotation=90)\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "\n", "# ── 14. Legal basis distribution ──────────────────────────────────────────\n", "legal = (\n", " df.explode(\"list_legalBasis\")\n", " .filter(pl.col(\"list_legalBasis\").is_not_null())\n", " .group_by(\"list_legalBasis\")\n", " .count()\n", " .sort(\"count\", descending=True)\n", ")\n", "plt.figure(figsize=(8,4))\n", "plt.bar(legal[\"list_legalBasis\"].to_list(), legal[\"count\"].to_list())\n", "plt.title(\"Legal Basis Distribution\")\n", "plt.xlabel(\"Legal Basis\")\n", "plt.ylabel(\"Count\")\n", "plt.xticks(rotation=90)\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "\n", "# ── 15. Web link status (archived vs. active) ────────────────────────────\n", "links = df.explode(\"list_archivedDate\").drop_nulls(subset=[\"list_archivedDate\"])\n", "archived_flags = [bool(d) for d in links[\"list_archivedDate\"].to_list()]\n", "count_arch = sum(archived_flags)\n", "count_act = len(archived_flags) - count_arch\n", "plt.figure()\n", "plt.bar([\"Archived\", \"Active\"], [count_arch, count_act])\n", "plt.title(\"Web Link Status\")\n", "plt.ylabel(\"Count\")\n", "plt.show()\n", "\n", "\n", "# ── 16. Language coverage ─────────────────────────────────────────────────\n", "langs = (\n", " df.explode(\"list_availableLanguages\")\n", " .filter(pl.col(\"list_availableLanguages\").is_not_null())\n", " .group_by(\"list_availableLanguages\")\n", " .count()\n", " .sort(\"count\", descending=True)\n", ")\n", "plt.figure(figsize=(8,4))\n", "plt.bar(langs[\"list_availableLanguages\"].to_list(),\n", " langs[\"count\"].to_list())\n", "plt.title(\"Web Link Language Coverage\")\n", "plt.xlabel(\"Language\")\n", "plt.ylabel(\"Count\")\n", "plt.xticks(rotation=90)\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "\n", "# ── 17. Attachment types ──────────────────────────────────────────────────\n", "attach = (\n", " df.explode(\"list_attachment\")\n", " .filter(pl.col(\"list_attachment\").is_not_null())\n", ")\n", "exts = [pathlib.Path(x).suffix.lower() for x in attach[\"list_attachment\"].to_list()]\n", "ext_counts = {e: exts.count(e) for e in set(exts)}\n", "plt.figure()\n", "plt.bar(list(ext_counts.keys()), list(ext_counts.values()))\n", "plt.title(\"Attachment File Types\")\n", "plt.xlabel(\"Extension\")\n", "plt.ylabel(\"Count\")\n", "plt.xticks(rotation=45)\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "\n", "# ── 18. Summary title lengths ─────────────────────────────────────────────\n", "titles = (\n", " df.explode(\"list_title_report\")\n", " .filter(pl.col(\"list_title_report\").is_not_null())\n", ")\n", "title_lens = [len(t) for t in titles[\"list_title_report\"].to_list()]\n", "plt.figure()\n", "plt.hist(title_lens, bins=30)\n", "plt.title(\"Report Title Lengths\")\n", "plt.xlabel(\"Characters\")\n", "plt.ylabel(\"Count\")\n", "plt.show()\n", "\n", "\n", "# ── 19. Topic vs. Funding: average totalCost by topic ─────────────────────\n", "avg_cost = (\n", " df.explode(\"list_topic\")\n", " .filter(pl.col(\"list_topic\").is_not_null() & pl.col(\"totalCost\").is_not_null())\n", " .group_by(\"list_topic\")\n", " .agg(pl.col(\"totalCost\").mean().alias(\"avgCost\"))\n", " .sort(\"avgCost\", descending=True)\n", " .head(20)\n", ")\n", "plt.figure(figsize=(8,4))\n", "plt.bar(avg_cost[\"list_topic\"].to_list(), avg_cost[\"avgCost\"].to_list())\n", "plt.title(\"Average Project Cost by Topic\")\n", "plt.xlabel(\"Topic\")\n", "plt.ylabel(\"Average Cost\")\n", "plt.xticks(rotation=90)\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "\n", "# ── 20. Time to first publication ─────────────────────────────────────────\n", "pub_df = (\n", " pl.read_parquet(PROJECT_PUB)\n", " .with_columns(\n", " pl.col(\"contentUpdateDate\")\n", " .str.strptime(pl.Datetime, \"%Y-%m-%d %H:%M:%S\")\n", " .dt.date()\n", " .alias(\"pubDate\")\n", " )\n", " .drop_nulls(subset=[\"pubDate\", \"projectID\"])\n", ")\n", "first_pub = pub_df.group_by(\"projectID\").agg(pl.col(\"pubDate\").min().alias(\"firstPub\"))\n", "merged = df.join(first_pub, left_on=\"id\", right_on=\"projectID\", how=\"left\")\n", "lags = (\n", " merged\n", " .filter(pl.col(\"firstPub\").is_not_null() & pl.col(\"startDate\").is_not_null())\n", " .with_column((pl.col(\"firstPub\") - pl.col(\"startDate\")).dt.days().alias(\"lagDays\"))\n", " [\"lagDays\"]\n", " .to_list()\n", ")\n", "plt.figure()\n", "plt.hist(lags, bins=30)\n", "plt.title(\"Days from Start to First Publication\")\n", "plt.xlabel(\"Days\")\n", "plt.ylabel(\"Count\")\n", "plt.show()\n", "\n", "\n", "# ── 21. Objective text clustering (TF-IDF + KMeans + t-SNE) ─────────────\n", "objectives = [o for o in df[\"objective\"].drop_nulls().to_list() if o.strip()]\n", "vectorizer = TfidfVectorizer(max_features=500, stop_words=\"english\")\n", "X = vectorizer.fit_transform(objectives)\n", "kmeans = KMeans(n_clusters=5, random_state=42).fit(X)\n", "# only embed the first 500 for speed\n", "coords = TSNE(n_components=2, random_state=42).fit_transform(X[:500].toarray())\n", "\n", "plt.figure(figsize=(6,5))\n", "plt.scatter(coords[:,0], coords[:,1], s=10, alpha=0.6)\n", "plt.title(\"Objective Clusters (t-SNE)\")\n", "plt.xlabel(\"Dim 1\")\n", "plt.ylabel(\"Dim 2\")\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Romain\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", " from .autonotebook import tqdm as notebook_tqdm\n" ] }, { "data": { "text/html": [ "\n", "
\n", " Upgrade to ydata-sdk\n", "

\n", " Improve your data and profiling with ydata-sdk, featuring data quality scoring, redundancy detection, outlier identification, text validation, and synthetic data generation.\n", "

\n", "
\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\Romain\\AppData\\Local\\Temp\\ipykernel_22464\\834880225.py:1: DeprecationWarning: `import pandas_profiling` is going to be deprecated by April 1st. Please use `import ydata_profiling` instead.\n", " from pandas_profiling import ProfileReport\n", "c:\\Users\\Romain\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\ydata_profiling\\profile_report.py:365: UserWarning: Try running command: 'pip install --upgrade Pillow' to avoid ValueError\n", " warnings.warn(\n", "Summarize dataset: 9%|▉ | 6/68 [00:04<00:34, 1.77it/s, Describe variable: list_deliverableType]" ] } ], "source": [ "from ydata_profiling import ProfileReport\n", "report = ProfileReport(\n", " consolidated.to_pandas(),\n", " title=\"Polars EDA Report\",\n", " explorative=True\n", ")\n", "report.to_file(\"polars_report.html\")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "shape: (5, 62)
idacronymstatustitlestartDateendDatetotalCostecMaxContributionlegalBasistopicsecSignatureDateframeworkProgrammemasterCallsubCallfundingSchemenatureobjectivecontentUpdateDatercngrantDoilist_deliverableTypelist_urllist_contentUpdateDatelist_authorslist_titlelist_doilist_journalTitlelist_isPublishedAslist_publishedYearlist_contentUpdateDate_publilist_title_reportlist_attachmentlist_contentUpdateDate_reportlist_organisationIDlist_countrylist_namelist_SMElist_citylist_geolocationlist_organizationURLlist_rolelist_ecContributionlist_netEcContributionlist_totalCostlist_endOfParticipationlist_activityTypelist_contentUpdateDate_orglist_physUrllist_availableLanguageslist_statuslist_archivedDatelist_typelist_sourcelist_representslist_legalBasislist_title_legallist_uniqueProgrammePartlist_topiclist_title_topiclist_euroSciVocTitlelist_euroSciVocPathlist_description
i64strstrstrdatedatef64f64strstrdatestrstrstrstrstrstrdatetime[μs]i64strlist[str]list[str]list[datetime[μs]]list[str]list[str]list[str]list[str]list[str]list[i64]list[datetime[μs]]list[str]list[str]list[datetime[μs]]list[i64]list[str]list[str]list[bool]list[str]list[str]list[str]list[str]list[f64]list[f64]list[f64]list[bool]list[str]list[datetime[μs]]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[str]list[bool]list[str]list[str]list[str]list[str]list[str]
101116741"DOE""SIGNED""Digitizing Other Economies: A …2024-02-012029-01-311.499998e61.499998e6"HORIZON.1.1""ERC-2023-STG"2023-12-15"HORIZON""ERC-2023-STG""ERC-2023-STG""HORIZON-ERC"null"How do longstanding, primarily…2023-12-26 14:40:12259247"10.3030/101116741"nullnullnullnullnullnullnullnullnullnullnullnullnull[999981634]["NL"]["WAGENINGEN UNIVERSITY"][false]["Wageningen"]["51.9863279,5.6679366"]["http://www.wageningenur.nl/nl.htm"]["coordinator"][1.499998e6][1.499998e6][1.499998e6][false]["HES"][2023-12-26 14:40:12]nullnullnullnullnullnullnull["HORIZON.1.1"]["European Research Council (ERC)"][true]["ERC-2023-STG"]["ERC STARTING GRANTS"]["government systems"]["/social sciences/political sciences/government systems"][null]
101163161"IRASTRO""SIGNED""MOLECULAR QUANTUM DYNAMICS IN …2025-08-012031-07-311.2085363e71.2085363e7"HORIZON.1.1""ERC-2024-SyG"2025-02-20"HORIZON""ERC-2024-SyG""ERC-2024-SyG""HORIZON-ERC-SYG"null"The James Webb Space Telescope…2025-02-24 17:23:14268970"10.3030/101163161"nullnullnullnullnullnullnullnullnullnullnullnullnull[999997736, 999854855, 999990267]["DK", "DE", "DE"]["AARHUS UNIVERSITET", "UNIVERSITAET POTSDAM", "MAX-PLANCK-GESELLSCHAFT ZUR FORDERUNG DER WISSENSCHAFTEN EV"][false, false, false]["Aarhus C", "Potsdam", "Munchen"]["56.171028,10.199381", "52.3979172,13.0146272", "48.1411687,11.5822929"]["http://www.au.dk", "http://www.uni-potsdam.de", "http://www.mpg.de"]["participant", "participant", "coordinator"][4.24624e6, 1.982813e6, 5.85631e6][4.24624e6, 1.982813e6, 5.85631e6][4.24624e6, 1.982813e6, 5.85631e6][false, false, false]["HES", "HES", "REC"][2025-02-24 17:23:14, 2025-02-24 17:23:14, 2025-02-24 17:23:14]nullnullnullnullnullnullnull["HORIZON.1.1"]["European Research Council (ERC)"][true]["ERC-2024-SyG"]["ERC SYNERGY GRANTS"]["grains and oilseeds", "microscopy", … "spectroscopy"]["/agricultural sciences/agriculture, forestry, and fisheries/agriculture/grains and oilseeds", "/natural sciences/physical sciences/optics/microscopy", … "/natural sciences/physical sciences/optics/spectroscopy"][null, null, … null]
101160499"In-phase""SIGNED""Multiscale modelling of aberra…2025-06-012030-05-311.489128e61.489128e6"HORIZON.1.1""ERC-2024-STG"2025-02-19"HORIZON""ERC-2024-STG""ERC-2024-STG""HORIZON-ERC"null"The spatiotemporal organizatio…2025-02-24 17:23:11268969"10.3030/101160499"nullnullnullnullnullnullnullnullnullnullnullnullnull[999874546]["ES"]["UNIVERSIDAD COMPLUTENSE DE MADRID"][false]["Madrid"]["40.4343404,-3.7340644"]["http://www.ucm.es"]["coordinator"][1.489128e6][1.489128e6][1.489128e6][false]["HES"][2025-02-24 17:23:11]nullnullnullnullnullnullnull["HORIZON.1.1"]["European Research Council (ERC)"][true]["ERC-2024-STG"]["ERC STARTING GRANTS"]["proteins", "RNA"]["/natural sciences/biological sciences/biochemistry/biomolecules/proteins", "/natural sciences/biological sciences/genetics/RNA"][null, null]
101166905"mw-atlas""SIGNED""The first comprehensive Atlas …2025-05-012031-04-309.95756e69.95756e6"HORIZON.1.1""ERC-2024-SyG"2025-02-20"HORIZON""ERC-2024-SyG""ERC-2024-SyG""HORIZON-ERC-SYG"null"The Milky Way is the cosmic en…2025-02-24 17:23:01268971"10.3030/101166905"nullnullnullnullnullnullnullnullnullnullnullnullnull[999983962, 999995893, 999990267]["DE", "EL", "DE"]["RHEINISCH-WESTFAELISCHE TECHNISCHE HOCHSCHULE AACHEN", "IDRYMA TECHNOLOGIAS KAI EREVNAS", "MAX-PLANCK-GESELLSCHAFT ZUR FORDERUNG DER WISSENSCHAFTEN EV"][false, false, false]["Aachen", "Irakleio", "Munchen"]["50.7777954,6.07779426513182", "35.335976,25.126581", "48.1411687,11.5822929"]["http://www.rwth-aachen.de", "http://www.forth.gr", "http://www.mpg.de"]["participant", "participant", "coordinator"][2.885875e6, 3.251685e6, 3.82e6][2.885875e6, 3.251685e6, 3.82e6][2.885875e6, 3.251685e6, 3.82e6][false, false, false]["HES", "REC", "REC"][2025-02-24 17:23:01, 2025-02-24 17:23:01, 2025-02-24 17:23:01]nullnullnullnullnullnullnull["HORIZON.1.1"]["European Research Council (ERC)"][true]["ERC-2024-SyG"]["ERC SYNERGY GRANTS"]["cartography", "astrophysics", "physical cosmology"]["/natural sciences/earth and related environmental sciences/physical geography/cartography", "/natural sciences/physical sciences/astronomy/astrophysics", "/natural sciences/physical sciences/astronomy/physical cosmology"][null, null, null]
101162875"MAtCHLESS""SIGNED""Untapping multiparametric 2D l…2025-03-012030-02-281.5e61.5e6"HORIZON.1.1""ERC-2024-STG"2025-02-18"HORIZON""ERC-2024-STG""ERC-2024-STG""HORIZON-ERC"null"Cellular organisms are complex…2025-02-24 17:23:12268966"10.3030/101162875"nullnullnullnullnullnullnullnullnullnullnullnullnull[999897341, 999861354]["IT", "ES"]["UNIVERSITA CA' FOSCARI  VENEZIA", "UNIVERSIDAD AUTONOMA DE MADRID"][false, false]["Venezia", "Madrid"]["45.43458557360008,12.325949378563257", "40.4167047,-3.7035824"]["http://www.unive.it", "http://www.uam.es"]["coordinator", "participant"][1.45e6, 50000.0][1.45e6, 50000.0][1.45e6, 50000.0][false, false]["HES", "HES"][2025-02-24 17:23:12, 2025-02-24 17:23:12]nullnullnullnullnullnullnull["HORIZON.1.1"]["European Research Council (ERC)"][true]["ERC-2024-STG"]["ERC STARTING GRANTS"]["planets", "sensors", … "microbiology"]["/natural sciences/physical sciences/astronomy/planetary sciences/planets", "/engineering and technology/electrical engineering, electronic engineering, information engineering/electronic engineering/sensors", … "/natural sciences/biological sciences/microbiology"][null, null, … null]
" ], "text/plain": [ "shape: (5, 62)\n", "┌───────────┬───────────┬────────┬────────────┬───┬────────────┬───────────┬───────────┬───────────┐\n", "│ id ┆ acronym ┆ status ┆ title ┆ … ┆ list_title ┆ list_euro ┆ list_euro ┆ list_desc │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _topic ┆ SciVocTit ┆ SciVocPat ┆ ription │\n", "│ i64 ┆ str ┆ str ┆ str ┆ ┆ --- ┆ le ┆ h ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ list[str] ┆ --- ┆ --- ┆ list[str] │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ list[str] ┆ list[str] ┆ │\n", "╞═══════════╪═══════════╪════════╪════════════╪═══╪════════════╪═══════════╪═══════════╪═══════════╡\n", "│ 101116741 ┆ DOE ┆ SIGNED ┆ Digitizing ┆ … ┆ [\"ERC ┆ [\"governm ┆ [\"/social ┆ [null] │\n", "│ ┆ ┆ ┆ Other ┆ ┆ STARTING ┆ ent ┆ sciences/ ┆ │\n", "│ ┆ ┆ ┆ Economies: ┆ ┆ GRANTS\"] ┆ systems\"] ┆ political ┆ │\n", "│ ┆ ┆ ┆ A … ┆ ┆ ┆ ┆ s… ┆ │\n", "│ 101163161 ┆ IRASTRO ┆ SIGNED ┆ MOLECULAR ┆ … ┆ [\"ERC ┆ [\"grains ┆ [\"/agricu ┆ [null, │\n", "│ ┆ ┆ ┆ QUANTUM ┆ ┆ SYNERGY ┆ and oilse ┆ ltural ┆ null, … │\n", "│ ┆ ┆ ┆ DYNAMICS ┆ ┆ GRANTS\"] ┆ eds\", ┆ sciences/ ┆ null] │\n", "│ ┆ ┆ ┆ IN … ┆ ┆ ┆ \"micro… ┆ agric… ┆ │\n", "│ 101160499 ┆ In-phase ┆ SIGNED ┆ Multiscale ┆ … ┆ [\"ERC ┆ [\"protein ┆ [\"/natura ┆ [null, │\n", "│ ┆ ┆ ┆ modelling ┆ ┆ STARTING ┆ s\", ┆ l science ┆ null] │\n", "│ ┆ ┆ ┆ of aberra… ┆ ┆ GRANTS\"] ┆ \"RNA\"] ┆ s/biologi ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ cal… ┆ │\n", "│ 101166905 ┆ mw-atlas ┆ SIGNED ┆ The first ┆ … ┆ [\"ERC ┆ [\"cartogr ┆ [\"/natura ┆ [null, │\n", "│ ┆ ┆ ┆ comprehens ┆ ┆ SYNERGY ┆ aphy\", ┆ l science ┆ null, │\n", "│ ┆ ┆ ┆ ive Atlas ┆ ┆ GRANTS\"] ┆ \"astrophy ┆ s/earth ┆ null] │\n", "│ ┆ ┆ ┆ … ┆ ┆ ┆ sics\"… ┆ and … ┆ │\n", "│ 101162875 ┆ MAtCHLESS ┆ SIGNED ┆ Untapping ┆ … ┆ [\"ERC ┆ [\"planets ┆ [\"/natura ┆ [null, │\n", "│ ┆ ┆ ┆ multiparam ┆ ┆ STARTING ┆ \", \"senso ┆ l science ┆ null, … │\n", "│ ┆ ┆ ┆ etric 2D ┆ ┆ GRANTS\"] ┆ rs\", … ┆ s/physica ┆ null] │\n", "│ ┆ ┆ ┆ l… ┆ ┆ ┆ \"micr… ┆ l s… ┆ │\n", "└───────────┴───────────┴────────┴────────────┴───┴────────────┴───────────┴───────────┴───────────┘" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "consolidated.head()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting SPARQLWrapper\n", " Downloading SPARQLWrapper-2.0.0-py3-none-any.whl.metadata (2.0 kB)\n", "Collecting rdflib>=6.1.1 (from SPARQLWrapper)\n", " Downloading rdflib-7.1.4-py3-none-any.whl.metadata (11 kB)\n", "Requirement already satisfied: pyparsing<4,>=2.1.0 in c:\\users\\romain\\appdata\\local\\programs\\python\\python311\\lib\\site-packages (from rdflib>=6.1.1->SPARQLWrapper) (3.0.9)\n", "Downloading SPARQLWrapper-2.0.0-py3-none-any.whl (28 kB)\n", "Downloading rdflib-7.1.4-py3-none-any.whl (565 kB)\n", " ---------------------------------------- 0.0/565.1 kB ? eta -:--:--\n", " ---------------------------------------- 565.1/565.1 kB 2.8 MB/s eta 0:00:00\n", "Installing collected packages: rdflib, SPARQLWrapper\n", "Successfully installed SPARQLWrapper-2.0.0 rdflib-7.1.4\n", "Note: you may need to restart the kernel to use updated packages.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "DEPRECATION: Loading egg at c:\\users\\romain\\appdata\\local\\programs\\python\\python311\\lib\\site-packages\\holehe-1.61-py3.11.egg is deprecated. pip 24.3 will enforce this behaviour change. A possible replacement is to use pip for package installation. Discussion can be found at https://github.com/pypa/pip/issues/12330\n", "\n", "[notice] A new release of pip is available: 24.2 -> 25.1\n", "[notice] To update, run: python.exe -m pip install --upgrade pip\n" ] } ], "source": [ "%pip install SPARQLWrapper" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "import os\n", "import json\n", "import argparse\n", "from datetime import datetime\n", "from collections import defaultdict, Counter\n", "from typing import List, Dict, Tuple, Optional, Literal\n", "\n", "import polars as pl # pip install polars\n", "from SPARQLWrapper import SPARQLWrapper, JSON # pip install SPARQLWrapper\n", "#from langchain.docstore.document import Document # pip install langchain\n", "#from langchain.embeddings import OpenAIEmbeddings # pip install langchain openai\n", "#from langchain.vectorstores import FAISS # pip install faiss-cpu\n", "#from langchain.llms import OpenAI # pip install openai\n", "#from langchain.chains import RetrievalQA\n", "\n", "###############################################################################\n", "# Configuration #\n", "###############################################################################\n", "\n", "SPARQL_ENDPOINT = \"https://cordis.europa.eu/datalab/sparql\"\n", "CACHE_PATH = \"cache.json\" # master cache for projects core\n", "INDEX_DIR = \"faiss_horizon\" # FAISS persistence dir\n", "MAX_ROWS = 25_000 # protective cap per query\n", "\n", "PREFIXES = \"\"\"\n", "PREFIX eurio: \n", "PREFIX dct: \n", "PREFIX foaf: \n", "PREFIX schema: \n", "PREFIX skos: \n", "\"\"\"\n", "\n", "QUERIES: Dict[str, str] = {\n", " # ────────────────────────────────────────────────────────── core project\n", " \"projects\": f\"\"\"{PREFIXES}\n", " SELECT ?projectID ?title ?abstract ?start ?end ?status\n", " WHERE {{\n", " ?p a eurio:Project ;\n", " dct:title ?title ;\n", " dct:abstract ?abstract ;\n", " eurio:projectID ?projectID .\n", " OPTIONAL {{ ?p eurio:startDate ?start. }}\n", " OPTIONAL {{ ?p eurio:endDate ?end. }}\n", " OPTIONAL {{ ?p eurio:projectStatus ?status. }}\n", " }}\n", " LIMIT {MAX_ROWS}\n", " \"\"\",\n", "\n", " # ────────────────────────────────────────────────────────── deliverables\n", " \"deliverable\": f\"\"\"{PREFIXES}\n", " SELECT ?projectID ?deliverableType ?url ?contentUpdateDate\n", " WHERE {{\n", " ?p a eurio:Project ; eurio:projectID ?projectID ; eurio:hasDeliverable ?d .\n", " OPTIONAL {{ ?d eurio:deliverableType ?deliverableType. }}\n", " OPTIONAL {{ ?d eurio:url ?url. }}\n", " OPTIONAL {{ ?d eurio:contentUpdateDate ?contentUpdateDate. }}\n", " }}\n", " LIMIT {MAX_ROWS}\n", " \"\"\",\n", "\n", " # ────────────────────────────────────────────────────────── publications\n", " \"publication\": f\"\"\"{PREFIXES}\n", " SELECT ?projectID ?authors ?title ?doi ?journalTitle ?isPublishedAs ?publishedYear ?contentUpdateDate\n", " WHERE {{\n", " ?p a eurio:Project ; eurio:projectID ?projectID ; eurio:producedPublication ?pub .\n", " OPTIONAL {{ ?pub dct:title ?title. }}\n", " OPTIONAL {{ ?pub eurio:authors ?authors. }}\n", " OPTIONAL {{ ?pub eurio:doi ?doi. }}\n", " OPTIONAL {{ ?pub eurio:journalTitle ?journalTitle. }}\n", " OPTIONAL {{ ?pub eurio:isPublishedAs ?isPublishedAs. }}\n", " OPTIONAL {{ ?pub eurio:publishedYear ?publishedYear. }}\n", " OPTIONAL {{ ?pub eurio:contentUpdateDate ?contentUpdateDate. }}\n", " }}\n", " LIMIT {MAX_ROWS}\n", " \"\"\",\n", "\n", " # ────────────────────────────────────────────────────────── organisation\n", " \"organisation\": f\"\"\"{PREFIXES}\n", " SELECT ?projectID ?organisationID ?country ?name ?SME ?city ?geolocation ?organizationURL ?role ?ecContribution ?netEcContribution ?totalCost ?endOfParticipation ?activityType ?contentUpdateDate\n", " WHERE {{\n", " ?p a eurio:Project ; eurio:projectID ?projectID ; eurio:hasParticipant ?org .\n", " OPTIONAL {{ ?org eurio:organisationID ?organisationID. }}\n", " OPTIONAL {{ ?org schema:addressCountry ?country. }}\n", " OPTIONAL {{ ?org foaf:name|schema:name ?name. }}\n", " OPTIONAL {{ ?org eurio:SME ?SME. }}\n", " OPTIONAL {{ ?org schema:addressLocality ?city. }}\n", " OPTIONAL {{ ?org eurio:hasCoordinates ?geolocation. }}\n", " OPTIONAL {{ ?org schema:url ?organizationURL. }}\n", " OPTIONAL {{ ?org eurio:role ?role. }}\n", " OPTIONAL {{ ?org eurio:ecContribution ?ecContribution. }}\n", " OPTIONAL {{ ?org eurio:netEcContribution ?netEcContribution. }}\n", " OPTIONAL {{ ?org eurio:totalCost ?totalCost. }}\n", " OPTIONAL {{ ?org eurio:endOfParticipation ?endOfParticipation. }}\n", " OPTIONAL {{ ?org eurio:activityType ?activityType. }}\n", " OPTIONAL {{ ?org eurio:contentUpdateDate ?contentUpdateDate. }}\n", " }}\n", " LIMIT {MAX_ROWS}\n", " \"\"\",\n", "\n", " # ────────────────────────────────────────────────────────── EuroSciVoc\n", " \"voc\": f\"\"\"{PREFIXES}\n", " SELECT ?projectID ?euroSciVocTitle ?euroSciVocPath ?euroSciVocDescription\n", " WHERE {{\n", " ?p a eurio:Project ; eurio:projectID ?projectID ; eurio:mainSubject ?v .\n", " OPTIONAL {{ ?v skos:prefLabel ?euroSciVocTitle. }}\n", " OPTIONAL {{ ?v skos:broader* ?path . ?path skos:prefLabel ?euroSciVocPath. }}\n", " OPTIONAL {{ ?v skos:definition ?euroSciVocDescription. }}\n", " }}\n", " LIMIT {MAX_ROWS}\n", " \"\"\",\n", "\n", " # ────────────────────────────────────────────────────────── topic call\n", " \"topic\": f\"\"\"{PREFIXES}\n", " SELECT ?projectID ?topic ?title\n", " WHERE {{\n", " ?p a eurio:Project ; eurio:projectID ?projectID ; eurio:relatedTopic ?t .\n", " OPTIONAL {{ ?t skos:notation ?topic. }}\n", " OPTIONAL {{ ?t skos:prefLabel ?title. }}\n", " }}\n", " LIMIT {MAX_ROWS}\n", " \"\"\",\n", "\n", " # ────────────────────────────────────────────────────────── web link\n", " \"weblink\": f\"\"\"{PREFIXES}\n", " SELECT ?projectID ?physUrl ?availableLanguages ?status ?archivedDate ?type ?source ?represents\n", " WHERE {{\n", " ?p a eurio:Project ; eurio:projectID ?projectID ; eurio:hasWebSite ?w .\n", " OPTIONAL {{ ?w eurio:physUrl ?physUrl. }}\n", " OPTIONAL {{ ?w eurio:availableLanguages ?availableLanguages. }}\n", " OPTIONAL {{ ?w eurio:status ?status. }}\n", " OPTIONAL {{ ?w eurio:archivedDate ?archivedDate. }}\n", " OPTIONAL {{ ?w eurio:type ?type. }}\n", " OPTIONAL {{ ?w eurio:source ?source. }}\n", " OPTIONAL {{ ?w eurio:represents ?represents. }}\n", " }}\n", " LIMIT {MAX_ROWS}\n", " \"\"\",\n", "\n", " # ────────────────────────────────────────────────────────── legal basis\n", " \"legal\": f\"\"\"{PREFIXES}\n", " SELECT ?projectID ?legalBasis ?title ?uniqueProgrammePart\n", " WHERE {{\n", " ?p a eurio:Project ; eurio:projectID ?projectID ; eurio:legalBasis ?l .\n", " OPTIONAL {{ ?l dct:title ?title. }}\n", " OPTIONAL {{ ?l eurio:legalBasis ?legalBasis. }}\n", " OPTIONAL {{ ?l eurio:uniqueProgrammePart ?uniqueProgrammePart. }}\n", " }}\n", " LIMIT {MAX_ROWS}\n", " \"\"\",\n", "}\n", "\n", "###############################################################################\n", "# Generic SPARQL runner #\n", "###############################################################################\n", "\n", "def _run(query: str) -> List[Dict[str, str]]:\n", " sparql = SPARQLWrapper(SPARQL_ENDPOINT)\n", " sparql.setQuery(query)\n", " sparql.setReturnFormat(JSON)\n", " print(sparql.query().convert()[\"results\"])\n", " bindings = sparql.query().convert()[\"results\"][\"bindings\"]\n", " rows: List[Dict[str, str]] = []\n", " for b in bindings:\n", " rows.append({k: v[\"value\"] for k, v in b.items()})\n", " return rows\n", "\n", "###############################################################################\n", "# Hydration (replicating your Polars parquet workflow) #\n", "###############################################################################\n", "\n", "def hydrate_entities(out_dir: Optional[str] = None, force: bool = False) -> Dict[str, pl.DataFrame]:\n", " \"\"\"Download every QUERY in QUERIES and return {name: Polars DF}. Optionally\n", " save each to `/.parquet`.\"\"\"\n", " out: Dict[str, pl.DataFrame] = {}\n", " if out_dir:\n", " os.makedirs(out_dir, exist_ok=True)\n", "\n", " for name, query in QUERIES.items():\n", " path = None if not out_dir else os.path.join(out_dir, f\"{name}.parquet\")\n", " if path and os.path.exists(path) and not force:\n", " print(f\"[cache] {name} – reading cached parquet\")\n", " df = pl.read_parquet(path)\n", " #print(df)\n", " else:\n", " print(f\"[SPARQL] Fetching {name} …\")\n", " rows = _run(query)\n", " print(rows)\n", " df = pl.from_dicts(rows)\n", " if path:\n", " df.write_parquet(path)\n", " print(f\"[save] {name} → {path} (rows={df.shape[0]})\")\n", " out[name] = df\n", " return out\n" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[cache] projects – reading cached parquet\n", "[SPARQL] Fetching deliverable …\n", "{'distinct': False, 'ordered': True, 'bindings': []}\n", "[]\n" ] }, { "ename": "NoDataError", "evalue": "no data, cannot infer schema", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNoDataError\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[30], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mhydrate_entities\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mr\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mC:\u001b[39;49m\u001b[38;5;124;43m\\\u001b[39;49m\u001b[38;5;124;43mUsers\u001b[39;49m\u001b[38;5;124;43m\\\u001b[39;49m\u001b[38;5;124;43mRomain\u001b[39;49m\u001b[38;5;124;43m\\\u001b[39;49m\u001b[38;5;124;43mOneDrive - KU Leuven\u001b[39;49m\u001b[38;5;124;43m\\\u001b[39;49m\u001b[38;5;124;43mMDA\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n", "Cell \u001b[1;32mIn[29], line 188\u001b[0m, in \u001b[0;36mhydrate_entities\u001b[1;34m(out_dir, force)\u001b[0m\n\u001b[0;32m 186\u001b[0m rows \u001b[38;5;241m=\u001b[39m _run(query)\n\u001b[0;32m 187\u001b[0m \u001b[38;5;28mprint\u001b[39m(rows)\n\u001b[1;32m--> 188\u001b[0m df \u001b[38;5;241m=\u001b[39m \u001b[43mpl\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfrom_dicts\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrows\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 189\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m path:\n\u001b[0;32m 190\u001b[0m df\u001b[38;5;241m.\u001b[39mwrite_parquet(path)\n", "File \u001b[1;32mc:\\Users\\Romain\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\polars\\convert\\general.py:209\u001b[0m, in \u001b[0;36mfrom_dicts\u001b[1;34m(data, schema, schema_overrides, strict, infer_schema_length)\u001b[0m\n\u001b[0;32m 207\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m data \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (schema \u001b[38;5;129;01mor\u001b[39;00m schema_overrides):\n\u001b[0;32m 208\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mno data, cannot infer schema\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m--> 209\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m NoDataError(msg)\n\u001b[0;32m 211\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m pl\u001b[38;5;241m.\u001b[39mDataFrame(\n\u001b[0;32m 212\u001b[0m data,\n\u001b[0;32m 213\u001b[0m schema\u001b[38;5;241m=\u001b[39mschema,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 216\u001b[0m infer_schema_length\u001b[38;5;241m=\u001b[39minfer_schema_length,\n\u001b[0;32m 217\u001b[0m )\n", "\u001b[1;31mNoDataError\u001b[0m: no data, cannot infer schema" ] } ], "source": [ "hydrate_entities(r\"C:\\Users\\Romain\\OneDrive - KU Leuven\\MDA\")" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'head': {'link': [], 'vars': ['project_title', 'projectID']}, 'results': {'distinct': False, 'ordered': True, 'bindings': []}}\n" ] } ], "source": [ "from SPARQLWrapper import SPARQLWrapper, JSON\n", "\n", "endpoint = \"https://cordis.europa.eu/datalab/sparql\"\n", "query = \"\"\"\n", "PREFIX eurio: \n", "SELECT ?project_title ?projectID\n", "WHERE {\n", " ?project a eurio:Result .\n", " ?project eurio:title ?project_title .\n", " ?project eurio:projectID ?projectID .\n", "}\n", "ORDER BY ?project_title\n", "LIMIT 100\n", "OFFSET 1000\n", "\"\"\"\n", "\n", "sparql = SPARQLWrapper(endpoint)\n", "sparql.setQuery(query)\n", "sparql.setReturnFormat(JSON)\n", "\n", "results = sparql.query().convert()\n", "print(results)\n", "for row in results[\"results\"][\"bindings\"]:\n", " print(row[\"projectID\"][\"value\"], \"→\", row[\"title\"][\"value\"])" ] } ], "metadata": { "kernelspec": { "display_name": "base", "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 }