How pashazanoosi/uk-job-market-intelligence-platform works
Purpose and entry points
This repository is a UK job-market intelligence pipeline: it acquires Adzuna job listings, normalizes and stores them in PostgreSQL, enriches descriptions with LLM-derived skills, produces analytics/snapshots, and exposes results through Streamlit and Power BI.
Primary execution surfaces:
• Full pipeline orchestration: run_pipeline.py
• Collection-oriented scheduled run: run_collection_pipeline.py, .github/workflows/collection_pipeline.yml
• Streamlit application: app/app.py
• Power BI artifact: powerbi/uk_job_market_intelligence_dashboard.pbix
Collection and raw-job boundary
The ingestion boundary is the external Adzuna Job Search API. Collection code retrieves listings, while raw-to-structured transformation separates API-shaped records from the internal job model.
• src/data/get_jobs.py
• src/data/clean_jobs.py
• src/data/transform_jobs.py
The resulting master job dataset can also be persisted as a parquet artifact, providing a file-level handoff/recovery point:
• src/data/master_jobs.py
• src/data/save_master.py
• src/utils/uk_jobs_master.parquet
Database persistence and schema
PostgreSQL, hosted through Neon per the README, is the system of record for structured job and skill intelligence. SQLAlchemy/database connection code mediates application access; schema and migration paths define the durable data contract.
• src/database/connection.py
• src/database/schema.sql
• src/data/load_to_database.py
Historical or legacy movement is handled separately:
• src/database/migrate_data.py
AI enrichment stage
LLM operations use the Groq API to turn unstructured descriptions into skills and usable market narrative. This stage depends on stored/cleaned job text and should be treated as an external-service, non-deterministic enrichment boundary.
• src/ai/extract_skills.py
• src/ai/classify_skills.py
• src/ai/suggest_taxonomy.py
Generated market reporting is a related output path:
• src/ai/generate_market_report.py
Analytics and historical snapshots
Analytics modules aggregate database/enriched data into demand, salary, market, and skills-oriented datasets. Snapshot creation establishes the historical-trend layer rather than relying only on current listings.
• src/analytics/market_analysis.py
• src/analytics/skill_demand_analysis.py
• src/analytics/create_snapshots.py
Database-side views and snapshot tables are part of the analytics-serving contract:
• sql/analytics_views.sql
• sql/create_snapshot_tables.sql
Presentation layer
Streamlit is the interactive operational analytics surface, organized into page-level views for overview, skills, market, trends, and pipeline health. It likely reads prepared analytics datasets rather than participating in ingestion.
• app/app.py
• app/pages/1_Overview.py
• app/pages/5_Pipeline.py
Power BI is the separate executive BI consumer of the analytics database/model:
• powerbi/uk_job_market_intelligence_dashboard.pbix
Operations and notifications
GitHub Actions schedules or automates collection. Environment configuration supplies API/database/LLM credentials, while utility integrations support operational alerts and optional file exchange.
• .github/workflows/collection_pipeline.yml
• .env.example
• src/utils/telegram_alert.py
• src/utils/google_drive.py
Main entry points: extract_skills.py Skill extraction & classification · get_jobs.py Job collector · run_pipeline.py Full pipeline runner · master_jobs.py Master job dataset
Components 20
Collection & preparation
- Adzuna Job Search API · Source boundary for UK job listings.
- Job collector
src/data/get_jobs.py - Clean & transform jobs · Converts API-shaped records into the internal job model.
src/data/transform_jobs.py - Master job dataset
src/data/master_jobs.py - Master jobs parquet · File-level handoff for the master dataset.
src/utils/uk_jobs_master.parquet
Data platform
- Neon PostgreSQL · Stores structured jobs, skills, and analytics-serving data.
- Database access & load
src/data/load_to_database.py - Database schema
src/database/schema.sql
AI enrichment
- Groq API · Non-deterministic skill and narrative enrichment boundary.
- Skill extraction & classification
src/ai/extract_skills.py - Market report generator
src/ai/generate_market_report.py
Analytics & history
- Market & skill analytics · Builds demand, salary, market, and skill datasets.
src/analytics/market_analysis.py - Historical snapshots
src/analytics/create_snapshots.py - Analytics views & snapshot tables
sql/analytics_views.sql
Consumers
- Streamlit analytics app · Operational views including overview, skills, trends, and pipeline health.
app/app.py - Power BI dashboard
powerbi/uk_job_market_intelligence_dashboard.pbix
Automation & operations
- Full pipeline runner
run_pipeline.py - Collection runner
run_collection_pipeline.py - GitHub Actions schedule
.github/workflows/collection_pipeline.yml - Telegram alerts
src/utils/telegram_alert.py
Connections 24
- GitHub Actions schedule → Collection runner: schedules
- Collection runner → Job collector: runs
- Full pipeline runner → Job collector: orchestrates
- Full pipeline runner → Skill extraction & classification: orchestrates
- Adzuna Job Search API → Job collector: job listings
- Job collector → Clean & transform jobs: raw records
- Clean & transform jobs → Master job dataset: structured jobs
- Master job dataset → Master jobs parquet: persists
- Master job dataset → Database access & load: loads
- Database schema → Neon PostgreSQL: defines
- Database access & load → Neon PostgreSQL: writes jobs
- Neon PostgreSQL → Skill extraction & classification: job descriptions
- Skill extraction & classification → Groq API: enrichment requests
- Groq API → Skill extraction & classification: skills & narrative
- Skill extraction & classification → Neon PostgreSQL: enriched skills
- Neon PostgreSQL → Market & skill analytics: job & skill data
- Market & skill analytics → Historical snapshots: current metrics
- Historical snapshots → Neon PostgreSQL: historical metrics
- Analytics views & snapshot tables → Neon PostgreSQL: defines views & tables
- Neon PostgreSQL → Streamlit analytics app: analytics datasets
- Neon PostgreSQL → Power BI dashboard: analytics model
- Neon PostgreSQL → Market report generator: market data
- Market report generator → Groq API: generation request
- Full pipeline runner → Telegram alerts: pipeline alerts