Skip to content

Instantly share code, notes, and snippets.

@aborruso
Created February 5, 2026 22:45
Show Gist options
  • Select an option

  • Save aborruso/fe1d8636cd45a7ee995ccfe2b57aa0d7 to your computer and use it in GitHub Desktop.

Select an option

Save aborruso/fe1d8636cd45a7ee995ccfe2b57aa0d7 to your computer and use it in GitHub Desktop.
note rapide

Analisi Dataset Farmacie Lombardia - ConformitĂ  Schema.gov.it

Premessa: Il Vantaggio dell'Integrazione MCP

Questa analisi è stata realizzata utilizzando due server MCP (Model Context Protocol) che integrano direttamente le funzionalità di ricerca dati aperti e validazione semantica:

Il Grande Vantaggio

L'integrazione di questi strumenti tramite MCP permette di:

  1. Ricerca Semantica Immediata: interrogare direttamente dati.gov.it senza dover navigare manualmente il portale, con ricerche avanzate usando sintassi Solr e facet

  2. Validazione Automatica: confrontare automaticamente la struttura dei dataset con gli standard nazionali (ontologie CLV, POI, CPSV) definiti su schema.gov.it

  3. Workflow Integrato: in una singola sessione di lavoro è possibile:

    • Cercare dataset rilevanti tra 74.000+ dataset
    • Scaricare e analizzare i dati
    • Validare la conformitĂ  agli standard
    • Proporre miglioramenti strutturati
  4. Riproducibilità: l'intero processo è tracciabile e automatizzabile, garantendo analisi consistenti e ripetibili

  5. InteroperabilitĂ : i dataset conformi agli standard Schema.gov.it sono immediatamente riutilizzabili da altre PA e integrabili in applicazioni semantic web

In pratica: invece di settimane di lavoro manuale per analizzare un dataset e capire come migliorarlo, si ottiene un'analisi completa in pochi minuti, con proposte concrete di adeguamento agli standard nazionali.


Dataset Analizzato

Descrizione

Elenco completo delle farmacie aperte al pubblico (incluse succursali, dispensari e dispensari stagionali), con dati anagrafici della farmacia (Codice Identificativo Ministeriale, Denominazione, Partita IVA) e dati di localizzazione (Indirizzo comprensivo di Via, CAP, Frazione, Comune, Provincia, Regione).


📊 Statistiche Dataset

Dati Rilevati

  • Totale farmacie: 3.049
  • Province: 17 (incluse 7 fuori regione: VR, FE, TN, RE, MO - probabilmente di confine)
  • Comuni coperti: 1.237
  • Campi: 12

Distribuzione per Provincia

Provincia N. Farmacie %
Milano (MI) 927 30.4%
Brescia (BS) 388 12.7%
Bergamo (BG) 335 11.0%
Varese (VA) 249 8.2%
Monza Brianza (MB) 234 7.7%
Pavia (PV) 206 6.8%
Como (CO) 171 5.6%
Mantova (MN) 147 4.8%
Cremona (CR) 129 4.2%
Lecco (LC) 103 3.4%
Lodi (LO) 79 2.6%
Sondrio (SO) 72 2.4%
Altre (fuori regione) 9 0.3%

🗂️ Struttura Attuale

Schema CSV (12 campi)

CODICE_FARMACIA      VARCHAR  Es. "BG0113"
DESCRIZIONE_FARMACIA VARCHAR  Es. "CASTELLI"
PARTITA_IVA          VARCHAR  Es. "01410520165"
INDIRIZZO            VARCHAR  Es. "VIA GRIGNA, 9" (NON STRUTTURATO)
COMUNE               VARCHAR  Es. "MILANO"
FRAZIONE             VARCHAR  Es. "VERGHERA" (nullable)
CAP                  BIGINT   Es. 20155 (PROBLEMATICO - numero)
PROVINCIA            VARCHAR  Es. "MI"
CODICE_ISTAT         BIGINT   Es. 15146 (5 cifre, mancano zeri iniziali)
LATITUDINE           DOUBLE   Es. 45.493062
LONGITUDINE          DOUBLE   Es. 9.156760
LOCATION             VARCHAR  Es. "POINT (9.156 45.493)" (DUPLICATO)

Esempio Record

CODICE_FARMACIA,DESCRIZIONE_FARMACIA,PARTITA_IVA,INDIRIZZO,COMUNE,FRAZIONE,CAP,PROVINCIA,CODICE_ISTAT,LATITUDINE,LONGITUDINE,LOCATION
BG0113,CASTELLI,01410520165,CORSO MONTE ROSA,SELVINO,,24020,BG,16197,45.782058514087,9.755378845034,POINT (9.755378845034 45.782058514087)
CO0365,FARMACIA DELL'OCA,02638190138,"VIA GIUSEPPE GARIBALDI, 95",FINO MORNASCO,,22073,CO,13102,45.745327191309,9.050002214056,POINT (9.050002214056 45.745327191309)
MI0903,A.F.M. N. 14,13195220150,"VIA GRIGNA, 9",MILANO,,20155,MI,15146,45.493062415855,9.15676092224,POINT (9.15676092224 45.493062415855)

❌ Problemi di Conformità a Schema.gov.it

1. Indirizzo Non Conforme a CLV (Core Location Vocabulary)

Problema: Campo INDIRIZZO non strutturato

Attuale:  INDIRIZZO = "VIA GRIGNA, 9"
          (campo unico testuale)

Standard CLV richiede:

- toponymQualifier = "Via"          (DUG - Denominazione Urbanistica Generica)
- officialStreetName = "Grigna"     (nome strada)
- streetNumber = "9"                (numero civico)
- exponent = null                   (esponente: "bis", "ter", ecc.)

Riferimento: Ontologia CLV

2. CAP come Numero Intero

Problema: Perde zeri iniziali

Attuale:  CAP = 20155 (tipo BIGINT)
Corretto: CAP = "20155" (tipo VARCHAR/TEXT)

Rischio: I CAP che iniziano con 0 (es. 09123) diventano 9123

Standard CLV: campo postCode di tipo stringa

3. Codice ISTAT Incompleto

Problema: Mancano zeri iniziali

Attuale:  CODICE_ISTAT = 15146 (5 cifre)
Corretto: CODICE_ISTAT = "015146" (6 cifre con zero iniziale)

Il codice ISTAT ufficiale è sempre di 6 cifre

Standard: vocabolario controllato cities

4. Mancanza di Classificazione ATECO

Problema: Nessuna classificazione economica

Dovrebbe includere:

codice_ateco = "47.73"
descrizione_ateco = "Commercio al dettaglio di medicinali in esercizi specializzati"

Riferimento: ATECO-2007

5. Coordinate senza Sistema di Riferimento

Problema: Non specificato il CRS

Attuale:  LATITUDINE, LONGITUDINE (senza metadati)
Corretto: + coordinateSystem = "EPSG:4326" o "WGS84"

Standard CLV: campo coordinateSystem obbligatorio

6. Campo LOCATION Ridondante

Problema: Duplicazione dati

LOCATION = "POINT (9.156 45.493)"
Duplica le informazioni giĂ  presenti in LATITUDINE + LONGITUDINE

7. Mancanza di Campi POI Standard

Problema: Non conforme a ontologia POI (Points of Interest)

Campi mancanti POI:

- poi:POIID              (identificativo univoco)
- poi:POIofficialName    (denominazione ufficiale)
- poi:POIcategoryName    (categoria POI)
- poi:POIstate           (stato: attivo/inattivo)
- poi:POIdescription     (descrizione)

Riferimento: Ontologia POI

8. Mancanza di Informazioni Essenziali

Campi critici assenti:

Contatti:

  • Telefono
  • Email
  • PEC (Posta Elettronica Certificata)

Servizi:

  • Convenzionato SSN (boolean)
  • Turno notturno (boolean)
  • Turno festivo (boolean)
  • Calendario turni (URL)
  • Servizi offerti (array)
  • Orari apertura (strutturato)

Stato amministrativo:

  • Tipo esercizio (Farmacia/Parafarmacia/Dispensario)
  • Stato (Attiva/Sospesa/Cessata)
  • Data apertura
  • Data cessazione
  • Numero autorizzazione
  • Ente autorizzante

âś… Schema Migliorato (Conforme Schema.gov.it)

Struttura Proposta (30 campi)

Identificativi (5 campi)

id_farmacia                VARCHAR   "BG0113" (primary key)
codice_ministeriale        VARCHAR   "BG0113"
codice_istat_farmacia      VARCHAR   (se esiste registro nazionale)
partita_iva                VARCHAR   "01410520165"
codice_fiscale             VARCHAR   (se disponibile)

Anagrafica (4 campi)

denominazione_ufficiale    VARCHAR   "FARMACIA CASTELLI"
denominazione_commerciale  VARCHAR   "CASTELLI"
tipo_esercizio             VARCHAR   "Farmacia" | "Parafarmacia" | "Dispensario" | "Succursale"
codice_ateco               VARCHAR   "47.73"

Indirizzo CLV-compliant (9 campi)

indirizzo_completo         VARCHAR   "Corso Monte Rosa, 24020 Selvino (BG)"
dug                        VARCHAR   "Corso" (toponymQualifier)
via                        VARCHAR   "Monte Rosa" (officialStreetName)
numero_civico              VARCHAR   "1" (streetNumber)
esponente                  VARCHAR   "bis" | "ter" | null (exponent)
interno                    VARCHAR   "A" (flatNumber - se appartamento)
frazione                   VARCHAR   "VERGHERA"
cap                        VARCHAR   "24020" (postCode)
localita                   VARCHAR   (hasAddressArea)

UnitĂ  Amministrative (4 campi)

comune                     VARCHAR   "Selvino"
codice_istat_comune        VARCHAR   "016197" (6 cifre con zero iniziale)
provincia                  VARCHAR   "BG" (acronym)
regione                    VARCHAR   "Lombardia"

Coordinate (3 campi)

latitudine                 DOUBLE    45.782058
longitudine                DOUBLE    9.755378
sistema_coordinate         VARCHAR   "EPSG:4326"

Contatti (3 campi)

telefono                   VARCHAR   "+39 035 123456"
email                      VARCHAR   "info@farmacia.it"
pec                        VARCHAR   "farmacia@pec.it"

Servizi e Caratteristiche (7 campi)

convenzionato_ssn          BOOLEAN   true
turno_notturno             BOOLEAN   true
turno_festivo              BOOLEAN   false
calendario_turni_url       VARCHAR   "https://..."
orari_apertura             JSON      {"lun":"8:30-12:30,15:00-19:30",...}
servizi_offerti            JSON      ["Autoanalisi","ECG","Telemedicina"]
note                       TEXT      (informazioni aggiuntive)

Stato Amministrativo (5 campi)

stato                      VARCHAR   "Attiva" | "Sospesa" | "Cessata"
data_apertura              DATE      "2010-01-15"
data_cessazione            DATE      null
data_aggiornamento         DATE      "2026-02-05"
url_info                   VARCHAR   "https://..."

Esempio Record Migliorato

id_farmacia,denominazione_ufficiale,partita_iva,codice_ateco,tipo_esercizio,dug,via,numero_civico,cap,comune,codice_istat_comune,provincia,regione,latitudine,longitudine,sistema_coordinate,telefono,email,convenzionato_ssn,stato,data_aggiornamento
"BG0113","FARMACIA CASTELLI","01410520165","47.73","Farmacia","Corso","Monte Rosa","1","24020","Selvino","016197","BG","Lombardia",45.782058,9.755378,"EPSG:4326","+39 035 123456","info@farmaciacastelli.it",true,"Attiva","2026-02-05"

🔄 Mappatura JSON-LD (Linked Data)

Conforme a CLV + POI + CPSV

{
  "@context": {
    "clv": "https://w3id.org/italia/onto/CLV/",
    "poi": "https://w3id.org/italia/onto/POI/",
    "cpsv": "https://w3id.org/italia/onto/CPSV/",
    "cov": "https://w3id.org/italia/onto/COV/"
  },
  "@type": "poi:PointOfInterest",
  "@id": "https://dati.lombardia.it/farmacia/BG0113",

  "poi:POIID": "BG0113",
  "poi:POIofficialName": "FARMACIA CASTELLI",
  "poi:POIalternativeName": "CASTELLI",
  "poi:POIdescription": "Farmacia convenzionata SSN con servizi di autoanalisi",
  "poi:POIstate": "Attiva",

  "poi:hasPOICategory": {
    "@type": "poi:PointOfInterestCategory",
    "poi:POIcategoryName": "Farmacia",
    "poi:POIcategoryIdentifier": "47.73"
  },

  "clv:hasAddress": {
    "@type": "clv:Address",
    "clv:fullAddress": "Corso Monte Rosa 1, 24020 Selvino (BG)",

    "clv:hasStreetToponym": {
      "@type": "clv:StreetToponym",
      "clv:toponymQualifier": "Corso",
      "clv:officialStreetName": "Monte Rosa"
    },

    "clv:hasNumber": {
      "@type": "clv:CivicNumbering",
      "clv:streetNumber": "1"
    },

    "clv:postCode": "24020",

    "clv:hasCity": {
      "@type": "clv:City",
      "rdfs:label": "Selvino",
      "clv:hasIdentifier": {
        "@type": "clv:Identifier",
        "clv:identifierType": "ISTAT",
        "rdfs:label": "016197"
      }
    },

    "clv:hasProvince": {
      "@type": "clv:Province",
      "rdfs:label": "Bergamo",
      "clv:acronym": "BG"
    },

    "clv:hasRegion": {
      "@type": "clv:Region",
      "rdfs:label": "Lombardia"
    },

    "clv:hasGeometry": {
      "@type": "clv:Geometry",
      "clv:lat": "45.782058",
      "clv:long": "9.755378",
      "clv:coordinateSystem": "EPSG:4326"
    }
  },

  "cov:taxID": "01410520165",

  "schema:telephone": "+39 035 123456",
  "schema:email": "info@farmaciacastelli.it",

  "cpsv:hasPublicService": {
    "@type": "cpsv:PublicService",
    "rdfs:label": "Servizio farmaceutico territoriale",
    "cpsv:serviceStatus": "Attivo",
    "schema:serviceType": "Farmacia convenzionata SSN"
  }
}

đź“‹ Piano di Adeguamento

PrioritĂ  1 - CRITICHE (ConformitĂ  Base)

  1. Strutturare campo INDIRIZZO

    • Separare in: DUG, via, numero_civico, esponente
    • Script di parsing necessario (regex o NLP)
  2. Correggere tipo CAP

    • Da BIGINT a VARCHAR
    • Preservare zeri iniziali
  3. Normalizzare CODICE_ISTAT

    • Aggiungere zero iniziale (6 cifre)
    • Formato: "015146" non 15146
  4. Aggiungere CODICE_ATECO

    • Valore fisso: "47.73"
    • Descrizione: "Commercio al dettaglio di medicinali in esercizi specializzati"
  5. Aggiungere SISTEMA_COORDINATE

    • Valore: "EPSG:4326" o "WGS84"
  6. Rimuovere campo LOCATION

    • Ridondante rispetto a lat/long

PrioritĂ  2 - IMPORTANTI (UsabilitĂ )

  1. Aggiungere TIPO_ESERCIZIO

    • Valori: "Farmacia" | "Parafarmacia" | "Dispensario" | "Succursale"
  2. Aggiungere CONTATTI BASE

    • Telefono (obbligatorio)
    • Email (raccomandato)
    • PEC (raccomandato per PA)
  3. Aggiungere STATO

    • Valori: "Attiva" | "Sospesa" | "Cessata"
    • Data apertura
    • Data cessazione (se applicabile)

PrioritĂ  3 - RACCOMANDATE (Valore Aggiunto)

  1. Aggiungere SERVIZI

    • Convenzionato SSN (boolean)
    • Turno notturno (boolean)
    • Turno festivo (boolean)
    • Servizi offerti (array JSON)
  2. Aggiungere ORARI

    • Struttura JSON per giorni/orari
    • Calendario turni (URL o file)
  3. Aggiungere METADATI AMMINISTRATIVI

    • Numero autorizzazione
    • Ente autorizzante (ATS/ASL)
    • Codice fiscale (se diverso da P.IVA)

🛠️ Script di Trasformazione (Esempio)

SQL/DuckDB per Ristrutturazione Base

-- Trasformazione da schema attuale a schema migliorato (base)
SELECT
  CODICE_FARMACIA as id_farmacia,
  CODICE_FARMACIA as codice_ministeriale,
  DESCRIZIONE_FARMACIA as denominazione_commerciale,
  'FARMACIA ' || DESCRIZIONE_FARMACIA as denominazione_ufficiale,
  PARTITA_IVA as partita_iva,
  '47.73' as codice_ateco,
  'Farmacia' as tipo_esercizio,

  -- Indirizzo (parsing semplificato - da migliorare)
  INDIRIZZO as indirizzo_completo,
  REGEXP_EXTRACT(INDIRIZZO, '^([A-Z]+)', 1) as dug,
  REGEXP_REPLACE(INDIRIZZO, '^[A-Z]+\s+', '') as via_numero,

  FRAZIONE as frazione,
  LPAD(CAP::VARCHAR, 5, '0') as cap,  -- Corregge CAP
  COMUNE as comune,
  LPAD(CODICE_ISTAT::VARCHAR, 6, '0') as codice_istat_comune,  -- Corregge ISTAT
  PROVINCIA as provincia,
  'Lombardia' as regione,

  LATITUDINE as latitudine,
  LONGITUDINE as longitudine,
  'EPSG:4326' as sistema_coordinate,

  'Attiva' as stato,
  CURRENT_DATE as data_aggiornamento

FROM read_csv('/tmp/farmacie_lombardia.csv')
WHERE PROVINCIA IN ('MI','BG','BS','CO','CR','LC','LO','MB','MN','PV','SO','VA');

Python per Parsing Indirizzi Avanzato

import re
import pandas as pd

def parse_indirizzo(indirizzo):
    """
    Parsing indirizzo italiano con regex
    """
    # Pattern comune: "VIA NOME, NUMERO"
    pattern = r'^(VIA|VIALE|CORSO|PIAZZA|LARGO|VICOLO|STRADA)\s+([^,]+)(?:,\s*(\d+))?'

    match = re.match(pattern, indirizzo.upper())
    if match:
        return {
            'dug': match.group(1).title(),
            'via': match.group(2).strip().title(),
            'numero_civico': match.group(3) or '',
            'esponente': None
        }
    else:
        # Fallback: tutto nel campo via
        return {
            'dug': '',
            'via': indirizzo,
            'numero_civico': '',
            'esponente': None
        }

# Applicazione al dataframe
df = pd.read_csv('/tmp/farmacie_lombardia.csv')

# Parse indirizzi
parsed = df['INDIRIZZO'].apply(parse_indirizzo)
df_parsed = pd.DataFrame(parsed.tolist())

# Merge con dataset originale
df_final = pd.concat([df, df_parsed], axis=1)

# Salva risultato
df_final.to_csv('/tmp/farmacie_lombardia_parsed.csv', index=False)

📊 Metadati DCAT-AP_IT Raccomandati

Per la Pubblicazione del Dataset Migliorato

dcat:Dataset:
  dcterms:title: "Elenco Farmacie Regione Lombardia - Conforme Schema.gov.it"
  dcterms:description: |
    Dataset completo delle farmacie aperte al pubblico in Regione Lombardia,
    strutturato secondo gli standard nazionali Schema.gov.it (ontologie CLV, POI).
    Include dati anagrafici, localizzazione strutturata, contatti e servizi offerti.

  dcterms:publisher:
    foaf:name: "Regione Lombardia"
    dcterms:identifier: "https://www.regione.lombardia.it"

  dcterms:issued: "2025-12-03"
  dcterms:modified: "2026-02-05"

  dcat:theme:
    - "http://publications.europa.eu/resource/authority/data-theme/HEAL"

  dcterms:subject:
    - "Farmacie"
    - "SanitĂ "
    - "Servizi sanitari"
    - "Salute pubblica"

  dcterms:spatial:
    dcterms:identifier: "https://www.geonames.org/3174618"
    rdfs:label: "Lombardia"

  dcterms:temporal:
    schema:startDate: "2026-02-05"

  dcterms:accrualPeriodicity:
    - "http://publications.europa.eu/resource/authority/frequency/MONTHLY"

  dcterms:license:
    - "https://creativecommons.org/licenses/by/4.0/"

  dcterms:conformsTo:
    - "https://w3id.org/italia/onto/CLV/"    # Core Location Vocabulary
    - "https://w3id.org/italia/onto/POI/"    # Points of Interest
    - "https://w3id.org/italia/controlled-vocabulary/classifications-for-organizations/ateco-2007"
    - "https://w3id.org/italia/controlled-vocabulary/territorial-classifications/cities"

  dcat:keyword:
    - "farmacie"
    - "sanitĂ "
    - "servizi sanitari"
    - "salute"
    - "turni"
    - "masterdata"
    - "open data"

  dcat:distribution:
    - dcat:Distribution:
        dcterms:title: "Dataset Farmacie - CSV"
        dcterms:format: "text/csv"
        dcat:accessURL: "https://..."
        dcat:downloadURL: "https://.../farmacie.csv"

    - dcat:Distribution:
        dcterms:title: "Dataset Farmacie - JSON-LD"
        dcterms:format: "application/ld+json"
        dcat:accessURL: "https://..."
        dcat:downloadURL: "https://.../farmacie.jsonld"

🎯 Raccomandazioni Finali

Immediate (da fare subito)

  1. Correggere CAP e CODICE_ISTAT → Convertire in stringhe con zeri iniziali
  2. Aggiungere CODICE_ATECO → Valore fisso "47.73"
  3. Specificare SISTEMA_COORDINATE → "EPSG:4326"
  4. Rimuovere LOCATION → Campo ridondante

A Breve Termine (entro 3 mesi)

  1. Strutturare INDIRIZZO → Separare DUG, via, numero civico
  2. Aggiungere CONTATTI → Telefono (minimo), email, PEC
  3. Aggiungere TIPO_ESERCIZIO → Distinguere farmacie, parafarmacie, dispensari
  4. Aggiungere STATO → Attiva/Sospesa/Cessata + date

A Medio Termine (entro 6 mesi)

  1. Integrare SERVIZI → Convenzione SSN, turni, servizi offerti
  2. Pubblicare JSON-LD → Formato linked data conforme
  3. Aggiornare METADATI → DCAT-AP_IT completo con conformsTo
  4. Creare API REST → Accesso programmatico con filtri

Benefici Attesi

  • âś… InteroperabilitĂ : Dataset riutilizzabile da altre PA senza trasformazioni
  • âś… RicercabilitĂ : Indicizzabile da motori semantic web
  • âś… QualitĂ : ConformitĂ  agli standard nazionali verificabile
  • âś… Riuso: Integrabile in applicazioni terze (mappe, servizi, app)
  • âś… ManutenibilitĂ : Struttura chiara e validabile automaticamente

📚 Riferimenti

Standard e Ontologie

Strumenti Utilizzati

Dataset


Documento generato il: 2026-02-05 Versione: 1.0 Analisi eseguita con: CKAN MCP Server + Schema.gov.it MCP Server Licenza: CC0 1.0 Universal (Public Domain Dedication)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment