{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "XQZJSSopDet9",
"outputId": "d7fe7f2e-b030-4b8d-e574-0a6e896e824d"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Requirement already satisfied: pandas in /usr/local/lib/python3.12/dist-packages (2.2.2)\n",
"Requirement already satisfied: numpy in /usr/local/lib/python3.12/dist-packages (2.0.2)\n",
"Requirement already satisfied: matplotlib in /usr/local/lib/python3.12/dist-packages (3.10.0)\n",
"Requirement already satisfied: scikit-learn in /usr/local/lib/python3.12/dist-packages (1.6.1)\n",
"Requirement already satisfied: statsmodels in /usr/local/lib/python3.12/dist-packages (0.14.6)\n",
"Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.12/dist-packages (from pandas) (2.9.0.post0)\n",
"Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.12/dist-packages (from pandas) (2025.2)\n",
"Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.12/dist-packages (from pandas) (2026.1)\n",
"Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (1.3.3)\n",
"Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (0.12.1)\n",
"Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (4.62.1)\n",
"Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (1.5.0)\n",
"Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (26.1)\n",
"Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (11.3.0)\n",
"Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (3.3.2)\n",
"Requirement already satisfied: scipy>=1.6.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (1.16.3)\n",
"Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (1.5.3)\n",
"Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (3.6.0)\n",
"Requirement already satisfied: patsy>=0.5.6 in /usr/local/lib/python3.12/dist-packages (from statsmodels) (1.0.2)\n",
"Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n"
]
}
],
"source": [
"!pip install pandas numpy matplotlib scikit-learn statsmodels"
]
},
{
"cell_type": "code",
"source": [
"import random\n",
"import numpy as np\n",
"import pandas as pd\n",
"\n",
"random.seed(42)\n",
"np.random.seed(42)"
],
"metadata": {
"id": "yzXlo3jYDi0f"
},
"execution_count": 25,
"outputs": []
},
{
"cell_type": "code",
"source": [
"print(\"=\" * 50)\n",
"print(\"STEP 1/2: Data Creation (real data + synthetic enrichment)\")\n",
"print(\"=\" * 50)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "EL_CQaWsDkGw",
"outputId": "105e7fb3-54f6-4717-f474-86c61bdaf485"
},
"execution_count": 26,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"==================================================\n",
"STEP 1/2: Data Creation (real data + synthetic enrichment)\n",
"==================================================\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"# ====================================================\n",
"# GENERATE SYNTHETIC EU JOBS DATA\n",
"# ====================================================\n",
"import random\n",
"from datetime import datetime, timedelta\n",
"\n",
"random.seed(42)\n",
"\n",
"DOMAINS = [\n",
" \"Budget and Finances\", \"European Policy\", \"Crisis management and Internal security\",\n",
" \"Law\", \"Defence\", \"Human Resources\", \"Information Technology\",\n",
" \"Justice and human rights\", \"Economics, Finance and Statistics\",\n",
" \"Transport\", \"Agriculture\", \"Environment, Climate change\", \"Public Health\",\n",
" \"Education and Culture\", \"External Relations\", \"Trade\", \"Audit\",\n",
" \"Communication\", \"Research and Innovation\", \"Statistics\", \"Energy\",\n",
" \"Migration\", \"Digital Affairs\", \"Tax and Customs\",\n",
"]\n",
"TITLES = [\n",
" \"Project Assistant\", \"Policy Officer\", \"Legal Officer\", \"Finance Agent\",\n",
" \"Communications Officer\", \"Cybersecurity Expert\", \"IT Officer\",\n",
" \"Senior Advisor\", \"Head of Unit\", \"Junior Analyst\", \"Senior Analyst\",\n",
" \"Programme Manager\", \"Auditor\", \"HR Officer\", \"Translator\",\n",
" \"Data Analyst\", \"Compliance Officer\", \"Procurement Officer\",\n",
" \"Research Officer\", \"Liaison Officer\", \"Statistician\", \"Economist\",\n",
" \"Risk Manager\", \"Operations Officer\", \"Coordinator\",\n",
"]\n",
"GRADES = [\"FG II\", \"FG III\", \"FG IV\", \"FG III, FG IV\", \"AD 5\", \"AD 6\", \"AD 7\", \"AD 8\", \"AD 10\", \"AD 12\", \"AD 14\"]\n",
"GRADE_WEIGHTS = [3, 11, 17, 9, 4, 7, 5, 2, 2, 2, 3]\n",
"CONTRACTS = [\"Contract staff\", \"Temporary staff\", \"Seconded national expert (SNE)\", \"Permanent official\"]\n",
"CONTRACT_WEIGHTS = [46, 28, 24, 5]\n",
"INSTITUTIONS = [\n",
" \"EU institutions\", \"(EDA) European Defence Agency\", \"(EUSPA) European Union Agency for the Space Programme\",\n",
" \"(FRONTEX) European Border and Coast Guard Agency\", \"(FRA) European Union Agency for Fundamental Rights\",\n",
" \"(EASA) European Union Aviation Safety Agency\", \"(Europol) European Union Agency for Law Enforcement Cooperation\",\n",
" \"(EFSA) European Food Safety Authority\", \"(ECB) European Central Bank\", \"(EMA) European Medicines Agency\",\n",
" \"(EUAA) European Union Agency for Asylum\", \"(EIB) European Investment Bank\", \"(EEA) European Environment Agency\",\n",
"]\n",
"LOCATIONS = [\n",
" \"Brussels (Belgium)\", \"Luxembourg (Luxembourg)\", \"The Hague (The Netherlands)\",\n",
" \"Warsaw (Poland)\", \"Frankfurt (Germany)\", \"Cologne (Germany)\", \"Parma (Italy)\",\n",
" \"Lisbon (Portugal)\", \"Paris (France)\", \"Vienna (Austria)\", \"Helsinki (Finland)\",\n",
" \"Madrid (Spain)\", \"Dublin (Ireland)\", \"Stockholm (Sweden)\",\n",
"]\n",
"\n",
"synthetic_rows = []\n",
"for i in range(200):\n",
" base = datetime(2026, 5, 1)\n",
" deadline = base + timedelta(days=random.randint(1, 180))\n",
" deadline_str = f\"{deadline.strftime('%d/%m/%Y')} - {random.choice(['13:00', '17:00', '23:59'])}\"\n",
" title = random.choice(TITLES)\n",
" inst = random.choice(INSTITUTIONS)\n",
" inst_short = inst.split(\")\")[0].replace(\"(\", \"\").lower() if \"(\" in inst else \"eu\"\n",
"\n",
" synthetic_rows.append({\n",
" \"ID\": 19800 + i,\n",
" \"title\": title,\n",
" \"Domain(s)\": random.choice(DOMAINS),\n",
" \"Grade\": random.choices(GRADES, weights=GRADE_WEIGHTS, k=1)[0],\n",
" \"Type of contract\": random.choices(CONTRACTS, weights=CONTRACT_WEIGHTS, k=1)[0],\n",
" \"Institution(s) \": inst,\n",
" \"Location(s)\": random.choice(LOCATIONS),\n",
" \"Deadline \": deadline_str,\n",
" \"Link to Content\": f\"https://eu-careers.europa.eu/en/job-opportunities/{title.lower().replace(' ', '-')}/{inst_short}-{19800+i}\",\n",
" })\n",
"\n",
"synthetic_df = pd.DataFrame(synthetic_rows)\n",
"print(f\"Generated {len(synthetic_df)} synthetic job postings\")\n",
"synthetic_df.head()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 435
},
"id": "BQf2iEmtum_U",
"outputId": "f01811d0-c4f5-435c-f86f-85c4f1c84bab"
},
"execution_count": 27,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Generated 200 synthetic job postings\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
" ID title Domain(s) Grade \\\n",
"0 19800 Project Assistant Economics, Finance and Statistics FG IV \n",
"1 19801 Procurement Officer Research and Innovation FG IV \n",
"2 19802 Liaison Officer Communication FG III \n",
"3 19803 Translator Economics, Finance and Statistics AD 7 \n",
"4 19804 HR Officer Economics, Finance and Statistics FG III \n",
"\n",
" Type of contract Institution(s) \\\n",
"0 Contract staff (EIB) European Investment Bank \n",
"1 Contract staff (EDA) European Defence Agency \n",
"2 Temporary staff EU institutions \n",
"3 Contract staff (EMA) European Medicines Agency \n",
"4 Permanent official (EASA) European Union Aviation Safety Agency \n",
"\n",
" Location(s) Deadline \\\n",
"0 Luxembourg (Luxembourg) 12/10/2026 - 13:00 \n",
"1 Warsaw (Poland) 22/10/2026 - 23:59 \n",
"2 Paris (France) 30/06/2026 - 23:59 \n",
"3 Dublin (Ireland) 17/08/2026 - 13:00 \n",
"4 Cologne (Germany) 11/06/2026 - 23:59 \n",
"\n",
" Link to Content \n",
"0 https://eu-careers.europa.eu/en/job-opportunit... \n",
"1 https://eu-careers.europa.eu/en/job-opportunit... \n",
"2 https://eu-careers.europa.eu/en/job-opportunit... \n",
"3 https://eu-careers.europa.eu/en/job-opportunit... \n",
"4 https://eu-careers.europa.eu/en/job-opportunit... "
],
"text/html": [
"\n",
"
\n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" ID | \n",
" title | \n",
" Domain(s) | \n",
" Grade | \n",
" Type of contract | \n",
" Institution(s) | \n",
" Location(s) | \n",
" Deadline | \n",
" Link to Content | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 19800 | \n",
" Project Assistant | \n",
" Economics, Finance and Statistics | \n",
" FG IV | \n",
" Contract staff | \n",
" (EIB) European Investment Bank | \n",
" Luxembourg (Luxembourg) | \n",
" 12/10/2026 - 13:00 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
"
\n",
" \n",
" | 1 | \n",
" 19801 | \n",
" Procurement Officer | \n",
" Research and Innovation | \n",
" FG IV | \n",
" Contract staff | \n",
" (EDA) European Defence Agency | \n",
" Warsaw (Poland) | \n",
" 22/10/2026 - 23:59 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
"
\n",
" \n",
" | 2 | \n",
" 19802 | \n",
" Liaison Officer | \n",
" Communication | \n",
" FG III | \n",
" Temporary staff | \n",
" EU institutions | \n",
" Paris (France) | \n",
" 30/06/2026 - 23:59 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
"
\n",
" \n",
" | 3 | \n",
" 19803 | \n",
" Translator | \n",
" Economics, Finance and Statistics | \n",
" AD 7 | \n",
" Contract staff | \n",
" (EMA) European Medicines Agency | \n",
" Dublin (Ireland) | \n",
" 17/08/2026 - 13:00 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
"
\n",
" \n",
" | 4 | \n",
" 19804 | \n",
" HR Officer | \n",
" Economics, Finance and Statistics | \n",
" FG III | \n",
" Permanent official | \n",
" (EASA) European Union Aviation Safety Agency | \n",
" Cologne (Germany) | \n",
" 11/06/2026 - 23:59 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "synthetic_df",
"summary": "{\n \"name\": \"synthetic_df\",\n \"rows\": 200,\n \"fields\": [\n {\n \"column\": \"ID\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 57,\n \"min\": 19800,\n \"max\": 19999,\n \"num_unique_values\": 200,\n \"samples\": [\n 19895,\n 19815,\n 19830\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"title\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 25,\n \"samples\": [\n \"Statistician\",\n \"IT Officer\",\n \"Project Assistant\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Domain(s)\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 24,\n \"samples\": [\n \"Public Health\",\n \"Education and Culture\",\n \"Economics, Finance and Statistics\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Grade\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 11,\n \"samples\": [\n \"FG III, FG IV\",\n \"FG IV\",\n \"FG II\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Type of contract\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 4,\n \"samples\": [\n \"Temporary staff\",\n \"Seconded national expert (SNE)\",\n \"Contract staff\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Institution(s) \",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 13,\n \"samples\": [\n \"(FRA) European Union Agency for Fundamental Rights\",\n \"(EFSA) European Food Safety Authority\",\n \"(EIB) European Investment Bank\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Location(s)\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 14,\n \"samples\": [\n \"The Hague (The Netherlands)\",\n \"Brussels (Belgium)\",\n \"Luxembourg (Luxembourg)\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Deadline \",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 169,\n \"samples\": [\n \"31/07/2026 - 13:00\",\n \"25/09/2026 - 23:59\",\n \"15/07/2026 - 23:59\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Link to Content\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 200,\n \"samples\": [\n \"https://eu-careers.europa.eu/en/job-opportunities/policy-officer/easa-19895\",\n \"https://eu-careers.europa.eu/en/job-opportunities/programme-manager/frontex-19815\",\n \"https://eu-careers.europa.eu/en/job-opportunities/data-analyst/frontex-19830\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 27
}
]
},
{
"cell_type": "code",
"source": [
"# Load the real data\n",
"real_df = pd.read_csv(\"CSV-JOBS.csv\")\n",
"print(f\"Real jobs loaded: {len(real_df)}\")\n",
"\n",
"# Combine real + synthetic into one dataset\n",
"jobs_df = pd.concat([real_df, synthetic_df], ignore_index=True)\n",
"\n",
"print(f\"Total combined dataset: {len(jobs_df)} rows\")\n",
"print(\"Columns:\", jobs_df.columns.tolist())\n",
"\n",
"display(jobs_df.head())"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 505
},
"id": "jyIW1KljDlXP",
"outputId": "394d684c-df7c-45d8-bb3b-83d5b83f0c0e"
},
"execution_count": 28,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Real jobs loaded: 103\n",
"Total combined dataset: 303 rows\n",
"Columns: ['ID', 'title', 'Domain(s)', 'Grade', 'Type of contract', 'Institution(s) ', 'Location(s)', 'Deadline ', 'Link to Content']\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
" ID title \\\n",
"0 19702 Project Assistant \n",
"1 19703 Policy Officer \n",
"2 19664 Senior Military Advisor to the Executive Director \n",
"3 19665 Structures Expert \n",
"4 19666 Certification Expert - Hydromechanical and Fli... \n",
"\n",
" Domain(s) Grade Type of contract \\\n",
"0 Justice and human rights FG III Contract staff \n",
"1 Justice and human rights FG IV Contract staff \n",
"2 Transport AD 10 Temporary staff \n",
"3 Transport AD 7 Temporary staff \n",
"4 Transport AD 7 Temporary staff \n",
"\n",
" Institution(s) Location(s) \\\n",
"0 (FRA) European Union Agency for Fundamental Ri... Vienna (Austria) \n",
"1 (FRA) European Union Agency for Fundamental Ri... Vienna (Austria) \n",
"2 (EASA) European Union Aviation Safety Agency Cologne (Germany) \n",
"3 (EASA) European Union Aviation Safety Agency Cologne (Germany) \n",
"4 (EASA) European Union Aviation Safety Agency Cologne (Germany) \n",
"\n",
" Deadline Link to Content \n",
"0 30/04/2026 - 13:00 https://eu-careers.europa.eu/en/job-opportunit... \n",
"1 30/04/2026 - 13:00 https://eu-careers.europa.eu/en/job-opportunit... \n",
"2 30/04/2026 - 23:59 https://eu-careers.europa.eu/en/job-opportunit... \n",
"3 30/04/2026 - 23:59 https://eu-careers.europa.eu/en/job-opportunit... \n",
"4 30/04/2026 - 23:59 https://eu-careers.europa.eu/en/job-opportunit... "
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" ID | \n",
" title | \n",
" Domain(s) | \n",
" Grade | \n",
" Type of contract | \n",
" Institution(s) | \n",
" Location(s) | \n",
" Deadline | \n",
" Link to Content | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 19702 | \n",
" Project Assistant | \n",
" Justice and human rights | \n",
" FG III | \n",
" Contract staff | \n",
" (FRA) European Union Agency for Fundamental Ri... | \n",
" Vienna (Austria) | \n",
" 30/04/2026 - 13:00 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
"
\n",
" \n",
" | 1 | \n",
" 19703 | \n",
" Policy Officer | \n",
" Justice and human rights | \n",
" FG IV | \n",
" Contract staff | \n",
" (FRA) European Union Agency for Fundamental Ri... | \n",
" Vienna (Austria) | \n",
" 30/04/2026 - 13:00 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
"
\n",
" \n",
" | 2 | \n",
" 19664 | \n",
" Senior Military Advisor to the Executive Director | \n",
" Transport | \n",
" AD 10 | \n",
" Temporary staff | \n",
" (EASA) European Union Aviation Safety Agency | \n",
" Cologne (Germany) | \n",
" 30/04/2026 - 23:59 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
"
\n",
" \n",
" | 3 | \n",
" 19665 | \n",
" Structures Expert | \n",
" Transport | \n",
" AD 7 | \n",
" Temporary staff | \n",
" (EASA) European Union Aviation Safety Agency | \n",
" Cologne (Germany) | \n",
" 30/04/2026 - 23:59 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
"
\n",
" \n",
" | 4 | \n",
" 19666 | \n",
" Certification Expert - Hydromechanical and Fli... | \n",
" Transport | \n",
" AD 7 | \n",
" Temporary staff | \n",
" (EASA) European Union Aviation Safety Agency | \n",
" Cologne (Germany) | \n",
" 30/04/2026 - 23:59 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"summary": "{\n \"name\": \"display(jobs_df\",\n \"rows\": 5,\n \"fields\": [\n {\n \"column\": \"ID\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 20,\n \"min\": 19664,\n \"max\": 19703,\n \"num_unique_values\": 5,\n \"samples\": [\n 19703,\n 19666,\n 19664\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"title\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"Policy Officer\",\n \"Certification Expert - Hydromechanical and Flight Control Systems\",\n \"Senior Military Advisor to the Executive Director\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Domain(s)\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"Transport\",\n \"Justice and human rights\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Grade\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 4,\n \"samples\": [\n \"FG IV\",\n \"AD 7\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Type of contract\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"Temporary staff\",\n \"Contract staff\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Institution(s) \",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"(EASA) European Union Aviation Safety Agency\",\n \"(FRA) European Union Agency for Fundamental Rights\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Location(s)\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"Cologne (Germany)\",\n \"Vienna (Austria)\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Deadline \",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"30/04/2026 - 23:59\",\n \"30/04/2026 - 13:00\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Link to Content\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"https://eu-careers.europa.eu/en/job-opportunities/policy-officer/fra-ca-polof-fgiv-2026\",\n \"https://eu-careers.europa.eu/en/job-opportunities/certification-expert-hydromechanical-and-flight-control-systems/easa-ad-2026-997\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"jobs_clean = jobs_df.copy()\n",
"\n",
"jobs_clean.columns = jobs_clean.columns.str.strip()\n",
"jobs_clean[\"Deadline\"] = pd.to_datetime(jobs_clean[\"Deadline\"], errors=\"coerce\")\n",
"\n",
"jobs_clean = jobs_clean.dropna(subset=[\"title\", \"Domain(s)\", \"Type of contract\", \"Deadline\"])\n",
"\n",
"print(\"Cleaned shape:\", jobs_clean.shape)\n",
"display(jobs_clean.head())"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 505
},
"id": "UgMfW50wDm1g",
"outputId": "a288151f-da02-4fdf-d3ae-8ecf1c6be725"
},
"execution_count": 29,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Cleaned shape: (299, 9)\n"
]
},
{
"output_type": "stream",
"name": "stderr",
"text": [
"/tmp/ipykernel_12223/2873856445.py:4: UserWarning: Parsing dates in %d/%m/%Y - %H:%M format when dayfirst=False (the default) was specified. Pass `dayfirst=True` or specify a format to silence this warning.\n",
" jobs_clean[\"Deadline\"] = pd.to_datetime(jobs_clean[\"Deadline\"], errors=\"coerce\")\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
" ID title \\\n",
"0 19702 Project Assistant \n",
"1 19703 Policy Officer \n",
"2 19664 Senior Military Advisor to the Executive Director \n",
"3 19665 Structures Expert \n",
"4 19666 Certification Expert - Hydromechanical and Fli... \n",
"\n",
" Domain(s) Grade Type of contract \\\n",
"0 Justice and human rights FG III Contract staff \n",
"1 Justice and human rights FG IV Contract staff \n",
"2 Transport AD 10 Temporary staff \n",
"3 Transport AD 7 Temporary staff \n",
"4 Transport AD 7 Temporary staff \n",
"\n",
" Institution(s) Location(s) \\\n",
"0 (FRA) European Union Agency for Fundamental Ri... Vienna (Austria) \n",
"1 (FRA) European Union Agency for Fundamental Ri... Vienna (Austria) \n",
"2 (EASA) European Union Aviation Safety Agency Cologne (Germany) \n",
"3 (EASA) European Union Aviation Safety Agency Cologne (Germany) \n",
"4 (EASA) European Union Aviation Safety Agency Cologne (Germany) \n",
"\n",
" Deadline Link to Content \n",
"0 2026-04-30 13:00:00 https://eu-careers.europa.eu/en/job-opportunit... \n",
"1 2026-04-30 13:00:00 https://eu-careers.europa.eu/en/job-opportunit... \n",
"2 2026-04-30 23:59:00 https://eu-careers.europa.eu/en/job-opportunit... \n",
"3 2026-04-30 23:59:00 https://eu-careers.europa.eu/en/job-opportunit... \n",
"4 2026-04-30 23:59:00 https://eu-careers.europa.eu/en/job-opportunit... "
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" ID | \n",
" title | \n",
" Domain(s) | \n",
" Grade | \n",
" Type of contract | \n",
" Institution(s) | \n",
" Location(s) | \n",
" Deadline | \n",
" Link to Content | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 19702 | \n",
" Project Assistant | \n",
" Justice and human rights | \n",
" FG III | \n",
" Contract staff | \n",
" (FRA) European Union Agency for Fundamental Ri... | \n",
" Vienna (Austria) | \n",
" 2026-04-30 13:00:00 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
"
\n",
" \n",
" | 1 | \n",
" 19703 | \n",
" Policy Officer | \n",
" Justice and human rights | \n",
" FG IV | \n",
" Contract staff | \n",
" (FRA) European Union Agency for Fundamental Ri... | \n",
" Vienna (Austria) | \n",
" 2026-04-30 13:00:00 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
"
\n",
" \n",
" | 2 | \n",
" 19664 | \n",
" Senior Military Advisor to the Executive Director | \n",
" Transport | \n",
" AD 10 | \n",
" Temporary staff | \n",
" (EASA) European Union Aviation Safety Agency | \n",
" Cologne (Germany) | \n",
" 2026-04-30 23:59:00 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
"
\n",
" \n",
" | 3 | \n",
" 19665 | \n",
" Structures Expert | \n",
" Transport | \n",
" AD 7 | \n",
" Temporary staff | \n",
" (EASA) European Union Aviation Safety Agency | \n",
" Cologne (Germany) | \n",
" 2026-04-30 23:59:00 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
"
\n",
" \n",
" | 4 | \n",
" 19666 | \n",
" Certification Expert - Hydromechanical and Fli... | \n",
" Transport | \n",
" AD 7 | \n",
" Temporary staff | \n",
" (EASA) European Union Aviation Safety Agency | \n",
" Cologne (Germany) | \n",
" 2026-04-30 23:59:00 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"summary": "{\n \"name\": \"display(jobs_clean\",\n \"rows\": 5,\n \"fields\": [\n {\n \"column\": \"ID\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 20,\n \"min\": 19664,\n \"max\": 19703,\n \"num_unique_values\": 5,\n \"samples\": [\n 19703,\n 19666,\n 19664\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"title\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"Policy Officer\",\n \"Certification Expert - Hydromechanical and Flight Control Systems\",\n \"Senior Military Advisor to the Executive Director\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Domain(s)\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"Transport\",\n \"Justice and human rights\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Grade\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 4,\n \"samples\": [\n \"FG IV\",\n \"AD 7\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Type of contract\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"Temporary staff\",\n \"Contract staff\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Institution(s)\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"(EASA) European Union Aviation Safety Agency\",\n \"(FRA) European Union Agency for Fundamental Rights\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Location(s)\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"Cologne (Germany)\",\n \"Vienna (Austria)\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Deadline\",\n \"properties\": {\n \"dtype\": \"date\",\n \"min\": \"2026-04-30 13:00:00\",\n \"max\": \"2026-04-30 23:59:00\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"2026-04-30 23:59:00\",\n \"2026-04-30 13:00:00\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Link to Content\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"https://eu-careers.europa.eu/en/job-opportunities/policy-officer/fra-ca-polof-fgiv-2026\",\n \"https://eu-careers.europa.eu/en/job-opportunities/certification-expert-hydromechanical-and-flight-control-systems/easa-ad-2026-997\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"print(\"Unique domains:\", jobs_clean[\"Domain(s)\"].nunique())\n",
"print(\"Unique contract types:\", jobs_clean[\"Type of contract\"].nunique())\n",
"print(\"Unique institutions:\", jobs_clean[\"Institution(s)\"].nunique())\n",
"print(\"Unique locations:\", jobs_clean[\"Location(s)\"].nunique())"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "wN8LLnbqDo5H",
"outputId": "157bd26d-0dee-44ed-9b65-bbdf4547d43a"
},
"execution_count": 30,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Unique domains: 44\n",
"Unique contract types: 5\n",
"Unique institutions: 40\n",
"Unique locations: 33\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"comments_by_demand = {\n",
" \"high\": [\n",
" \"This role appears to be in strong demand across institutions.\",\n",
" \"The labor market for this profile looks highly competitive.\",\n",
" \"This posting suggests strong employment opportunities.\",\n",
" \"Demand for this skill set appears to be growing.\",\n",
" \"This category seems to attract significant hiring activity.\"\n",
" ],\n",
" \"stable\": [\n",
" \"This role appears to have steady demand.\",\n",
" \"The market for this profile looks relatively balanced.\",\n",
" \"This posting suggests moderate but stable opportunities.\",\n",
" \"Demand appears consistent across institutions.\",\n",
" \"This category seems to have regular hiring activity.\"\n",
" ],\n",
" \"low\": [\n",
" \"This role appears to have weaker demand.\",\n",
" \"The market for this profile looks more limited.\",\n",
" \"This posting suggests fewer employment opportunities.\",\n",
" \"Demand for this skill set appears relatively low.\",\n",
" \"This category seems to have less hiring activity.\"\n",
" ]\n",
"}"
],
"metadata": {
"id": "HHqueIqZDqVe"
},
"execution_count": 31,
"outputs": []
},
{
"cell_type": "code",
"source": [
"jobs_enriched = jobs_clean.copy()\n",
"\n",
"today = pd.Timestamp.today().normalize()\n",
"jobs_enriched[\"days_to_deadline\"] = (jobs_enriched[\"Deadline\"] - today).dt.days\n",
"\n",
"def urgency_from_days(days):\n",
" if pd.isna(days):\n",
" return random.randint(3, 6)\n",
" if days <= 7:\n",
" return random.randint(8, 10)\n",
" elif days <= 21:\n",
" return random.randint(5, 8)\n",
" else:\n",
" return random.randint(2, 6)\n",
"\n",
"jobs_enriched[\"urgency_score\"] = jobs_enriched[\"days_to_deadline\"].apply(urgency_from_days)\n",
"\n",
"def demand_from_urgency(score):\n",
" if score >= 8:\n",
" return random.randint(7, 10)\n",
" elif score >= 5:\n",
" return random.randint(4, 7)\n",
" else:\n",
" return random.randint(2, 5)\n",
"\n",
"jobs_enriched[\"job_demand_score\"] = jobs_enriched[\"urgency_score\"].apply(demand_from_urgency)\n",
"\n",
"def demand_label(score):\n",
" if score <= 3:\n",
" return \"low\"\n",
" elif score <= 6:\n",
" return \"stable\"\n",
" else:\n",
" return \"high\"\n",
"\n",
"jobs_enriched[\"demand_label\"] = jobs_enriched[\"job_demand_score\"].apply(demand_label)\n",
"\n",
"jobs_enriched[\"estimated_salary\"] = np.random.randint(35000, 95000, len(jobs_enriched))\n",
"\n",
"jobs_enriched[\"automation_risk\"] = np.random.choice(\n",
" [\"low\", \"medium\", \"high\"],\n",
" size=len(jobs_enriched),\n",
" p=[0.35, 0.45, 0.20]\n",
")\n",
"\n",
"jobs_enriched[\"estimated_applications\"] = np.random.randint(20, 250, len(jobs_enriched))\n",
"\n",
"jobs_enriched[\"job_comment\"] = jobs_enriched[\"demand_label\"].apply(\n",
" lambda x: random.choice(comments_by_demand[x])\n",
")\n",
"\n",
"display(jobs_enriched.head())"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 521
},
"id": "l6PBz502Dr3a",
"outputId": "401257dc-e7ea-4481-eb1b-15688fbcc6b2"
},
"execution_count": 32,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
" ID title \\\n",
"0 19702 Project Assistant \n",
"1 19703 Policy Officer \n",
"2 19664 Senior Military Advisor to the Executive Director \n",
"3 19665 Structures Expert \n",
"4 19666 Certification Expert - Hydromechanical and Fli... \n",
"\n",
" Domain(s) Grade Type of contract \\\n",
"0 Justice and human rights FG III Contract staff \n",
"1 Justice and human rights FG IV Contract staff \n",
"2 Transport AD 10 Temporary staff \n",
"3 Transport AD 7 Temporary staff \n",
"4 Transport AD 7 Temporary staff \n",
"\n",
" Institution(s) Location(s) \\\n",
"0 (FRA) European Union Agency for Fundamental Ri... Vienna (Austria) \n",
"1 (FRA) European Union Agency for Fundamental Ri... Vienna (Austria) \n",
"2 (EASA) European Union Aviation Safety Agency Cologne (Germany) \n",
"3 (EASA) European Union Aviation Safety Agency Cologne (Germany) \n",
"4 (EASA) European Union Aviation Safety Agency Cologne (Germany) \n",
"\n",
" Deadline Link to Content \\\n",
"0 2026-04-30 13:00:00 https://eu-careers.europa.eu/en/job-opportunit... \n",
"1 2026-04-30 13:00:00 https://eu-careers.europa.eu/en/job-opportunit... \n",
"2 2026-04-30 23:59:00 https://eu-careers.europa.eu/en/job-opportunit... \n",
"3 2026-04-30 23:59:00 https://eu-careers.europa.eu/en/job-opportunit... \n",
"4 2026-04-30 23:59:00 https://eu-careers.europa.eu/en/job-opportunit... \n",
"\n",
" days_to_deadline urgency_score job_demand_score demand_label \\\n",
"0 0 9 9 high \n",
"1 0 8 8 high \n",
"2 0 8 10 high \n",
"3 0 9 8 high \n",
"4 0 9 7 high \n",
"\n",
" estimated_salary automation_risk estimated_applications \\\n",
"0 91422 low 75 \n",
"1 50795 medium 180 \n",
"2 35860 medium 185 \n",
"3 73158 low 136 \n",
"4 89343 medium 153 \n",
"\n",
" job_comment \n",
"0 The labor market for this profile looks highly... \n",
"1 Demand for this skill set appears to be growing. \n",
"2 This category seems to attract significant hir... \n",
"3 This posting suggests strong employment opport... \n",
"4 This category seems to attract significant hir... "
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" ID | \n",
" title | \n",
" Domain(s) | \n",
" Grade | \n",
" Type of contract | \n",
" Institution(s) | \n",
" Location(s) | \n",
" Deadline | \n",
" Link to Content | \n",
" days_to_deadline | \n",
" urgency_score | \n",
" job_demand_score | \n",
" demand_label | \n",
" estimated_salary | \n",
" automation_risk | \n",
" estimated_applications | \n",
" job_comment | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 19702 | \n",
" Project Assistant | \n",
" Justice and human rights | \n",
" FG III | \n",
" Contract staff | \n",
" (FRA) European Union Agency for Fundamental Ri... | \n",
" Vienna (Austria) | \n",
" 2026-04-30 13:00:00 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
" 0 | \n",
" 9 | \n",
" 9 | \n",
" high | \n",
" 91422 | \n",
" low | \n",
" 75 | \n",
" The labor market for this profile looks highly... | \n",
"
\n",
" \n",
" | 1 | \n",
" 19703 | \n",
" Policy Officer | \n",
" Justice and human rights | \n",
" FG IV | \n",
" Contract staff | \n",
" (FRA) European Union Agency for Fundamental Ri... | \n",
" Vienna (Austria) | \n",
" 2026-04-30 13:00:00 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
" 0 | \n",
" 8 | \n",
" 8 | \n",
" high | \n",
" 50795 | \n",
" medium | \n",
" 180 | \n",
" Demand for this skill set appears to be growing. | \n",
"
\n",
" \n",
" | 2 | \n",
" 19664 | \n",
" Senior Military Advisor to the Executive Director | \n",
" Transport | \n",
" AD 10 | \n",
" Temporary staff | \n",
" (EASA) European Union Aviation Safety Agency | \n",
" Cologne (Germany) | \n",
" 2026-04-30 23:59:00 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
" 0 | \n",
" 8 | \n",
" 10 | \n",
" high | \n",
" 35860 | \n",
" medium | \n",
" 185 | \n",
" This category seems to attract significant hir... | \n",
"
\n",
" \n",
" | 3 | \n",
" 19665 | \n",
" Structures Expert | \n",
" Transport | \n",
" AD 7 | \n",
" Temporary staff | \n",
" (EASA) European Union Aviation Safety Agency | \n",
" Cologne (Germany) | \n",
" 2026-04-30 23:59:00 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
" 0 | \n",
" 9 | \n",
" 8 | \n",
" high | \n",
" 73158 | \n",
" low | \n",
" 136 | \n",
" This posting suggests strong employment opport... | \n",
"
\n",
" \n",
" | 4 | \n",
" 19666 | \n",
" Certification Expert - Hydromechanical and Fli... | \n",
" Transport | \n",
" AD 7 | \n",
" Temporary staff | \n",
" (EASA) European Union Aviation Safety Agency | \n",
" Cologne (Germany) | \n",
" 2026-04-30 23:59:00 | \n",
" https://eu-careers.europa.eu/en/job-opportunit... | \n",
" 0 | \n",
" 9 | \n",
" 7 | \n",
" high | \n",
" 89343 | \n",
" medium | \n",
" 153 | \n",
" This category seems to attract significant hir... | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"summary": "{\n \"name\": \"display(jobs_enriched\",\n \"rows\": 5,\n \"fields\": [\n {\n \"column\": \"ID\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 20,\n \"min\": 19664,\n \"max\": 19703,\n \"num_unique_values\": 5,\n \"samples\": [\n 19703,\n 19666,\n 19664\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"title\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"Policy Officer\",\n \"Certification Expert - Hydromechanical and Flight Control Systems\",\n \"Senior Military Advisor to the Executive Director\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Domain(s)\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"Transport\",\n \"Justice and human rights\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Grade\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 4,\n \"samples\": [\n \"FG IV\",\n \"AD 7\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Type of contract\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"Temporary staff\",\n \"Contract staff\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Institution(s)\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"(EASA) European Union Aviation Safety Agency\",\n \"(FRA) European Union Agency for Fundamental Rights\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Location(s)\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"Cologne (Germany)\",\n \"Vienna (Austria)\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Deadline\",\n \"properties\": {\n \"dtype\": \"date\",\n \"min\": \"2026-04-30 13:00:00\",\n \"max\": \"2026-04-30 23:59:00\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"2026-04-30 23:59:00\",\n \"2026-04-30 13:00:00\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Link to Content\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"https://eu-careers.europa.eu/en/job-opportunities/policy-officer/fra-ca-polof-fgiv-2026\",\n \"https://eu-careers.europa.eu/en/job-opportunities/certification-expert-hydromechanical-and-flight-control-systems/easa-ad-2026-997\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"days_to_deadline\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 0,\n \"max\": 0,\n \"num_unique_values\": 1,\n \"samples\": [\n 0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"urgency_score\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 8,\n \"max\": 9,\n \"num_unique_values\": 2,\n \"samples\": [\n 8\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"job_demand_score\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1,\n \"min\": 7,\n \"max\": 10,\n \"num_unique_values\": 4,\n \"samples\": [\n 8\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"demand_label\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 1,\n \"samples\": [\n \"high\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"estimated_salary\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 24288,\n \"min\": 35860,\n \"max\": 91422,\n \"num_unique_values\": 5,\n \"samples\": [\n 50795\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"automation_risk\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"medium\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"estimated_applications\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 44,\n \"min\": 75,\n \"max\": 185,\n \"num_unique_values\": 5,\n \"samples\": [\n 180\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"job_comment\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 4,\n \"samples\": [\n \"Demand for this skill set appears to be growing.\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"jobs_enriched.to_csv(\"jobs_enriched.csv\", index=False)\n",
"print(\"Saved: jobs_enriched.csv\")"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "s00SIZBsDtd-",
"outputId": "e87d8cc4-4a9c-4263-ddd1-9ddc8d02cbc9"
},
"execution_count": 33,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Saved: jobs_enriched.csv\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"jobs_enriched[\"deadline_month\"] = jobs_enriched[\"Deadline\"].dt.to_period(\"M\").astype(str)\n",
"\n",
"monthly_openings = (\n",
" jobs_enriched\n",
" .groupby([\"deadline_month\", \"Domain(s)\"], as_index=False)\n",
" .agg(\n",
" postings=(\"title\", \"count\"),\n",
" avg_salary=(\"estimated_salary\", \"mean\"),\n",
" avg_demand_score=(\"job_demand_score\", \"mean\"),\n",
" avg_applications=(\"estimated_applications\", \"mean\")\n",
" )\n",
")\n",
"\n",
"display(monthly_openings.head())\n",
"print(\"Shape:\", monthly_openings.shape)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 241
},
"id": "3NtBDh8ODvLW",
"outputId": "aad6702c-076b-47cd-b398-1cf215d10268"
},
"execution_count": 34,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
" deadline_month Domain(s) postings avg_salary \\\n",
"0 2026-04 Data protection 1 79732.000000 \n",
"1 2026-04 Economics, Finance and Statistics 1 46284.000000 \n",
"2 2026-04 Human Resources 1 89886.000000 \n",
"3 2026-04 Justice and human rights 2 71108.500000 \n",
"4 2026-04 Transport 3 66120.333333 \n",
"\n",
" avg_demand_score avg_applications \n",
"0 9.000000 77.0 \n",
"1 7.000000 63.0 \n",
"2 7.000000 192.0 \n",
"3 8.500000 127.5 \n",
"4 8.333333 158.0 "
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" deadline_month | \n",
" Domain(s) | \n",
" postings | \n",
" avg_salary | \n",
" avg_demand_score | \n",
" avg_applications | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 2026-04 | \n",
" Data protection | \n",
" 1 | \n",
" 79732.000000 | \n",
" 9.000000 | \n",
" 77.0 | \n",
"
\n",
" \n",
" | 1 | \n",
" 2026-04 | \n",
" Economics, Finance and Statistics | \n",
" 1 | \n",
" 46284.000000 | \n",
" 7.000000 | \n",
" 63.0 | \n",
"
\n",
" \n",
" | 2 | \n",
" 2026-04 | \n",
" Human Resources | \n",
" 1 | \n",
" 89886.000000 | \n",
" 7.000000 | \n",
" 192.0 | \n",
"
\n",
" \n",
" | 3 | \n",
" 2026-04 | \n",
" Justice and human rights | \n",
" 2 | \n",
" 71108.500000 | \n",
" 8.500000 | \n",
" 127.5 | \n",
"
\n",
" \n",
" | 4 | \n",
" 2026-04 | \n",
" Transport | \n",
" 3 | \n",
" 66120.333333 | \n",
" 8.333333 | \n",
" 158.0 | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"summary": "{\n \"name\": \"print(\\\"Shape:\\\", monthly_openings\",\n \"rows\": 5,\n \"fields\": [\n {\n \"column\": \"deadline_month\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 1,\n \"samples\": [\n \"2026-04\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Domain(s)\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"Economics, Finance and Statistics\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"postings\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1,\n \"max\": 3,\n \"num_unique_values\": 3,\n \"samples\": [\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"avg_salary\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 16331.975065972749,\n \"min\": 46284.0,\n \"max\": 89886.0,\n \"num_unique_values\": 5,\n \"samples\": [\n 46284.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"avg_demand_score\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.9159087776022724,\n \"min\": 7.0,\n \"max\": 9.0,\n \"num_unique_values\": 4,\n \"samples\": [\n 7.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"avg_applications\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 54.13178363955875,\n \"min\": 63.0,\n \"max\": 192.0,\n \"num_unique_values\": 5,\n \"samples\": [\n 63.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"Shape: (138, 6)\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"monthly_openings.to_csv(\"jobs_monthly_openings.csv\", index=False)\n",
"print(\"Saved: jobs_monthly_openings.csv\")"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "_WpGUgWSDxDr",
"outputId": "569af645-b25b-40f8-f70b-522e5c8be3de"
},
"execution_count": 35,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Saved: jobs_monthly_openings.csv\n"
]
}
]
}
]
}