openosservaprezzi 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- openosservaprezzi-0.1.0/.gitignore +10 -0
- openosservaprezzi-0.1.0/AGENTS.md +50 -0
- openosservaprezzi-0.1.0/CHANGELOG.md +20 -0
- openosservaprezzi-0.1.0/LICENSE +21 -0
- openosservaprezzi-0.1.0/LOG.md +29 -0
- openosservaprezzi-0.1.0/PKG-INFO +363 -0
- openosservaprezzi-0.1.0/PRD.md +439 -0
- openosservaprezzi-0.1.0/README.md +339 -0
- openosservaprezzi-0.1.0/docs/evaluation.md +342 -0
- openosservaprezzi-0.1.0/docs/evidence/archivio-pane-2025-05-manifest.json +937 -0
- openosservaprezzi-0.1.0/pyproject.toml +45 -0
- openosservaprezzi-0.1.0/scripts/refresh_fixtures.py +99 -0
- openosservaprezzi-0.1.0/src/osservaprezzi/__init__.py +4 -0
- openosservaprezzi-0.1.0/src/osservaprezzi/archive.py +303 -0
- openosservaprezzi-0.1.0/src/osservaprezzi/cache.py +82 -0
- openosservaprezzi-0.1.0/src/osservaprezzi/cli.py +783 -0
- openosservaprezzi-0.1.0/src/osservaprezzi/client.py +242 -0
- openosservaprezzi-0.1.0/src/osservaprezzi/collections.py +185 -0
- openosservaprezzi-0.1.0/src/osservaprezzi/errors.py +89 -0
- openosservaprezzi-0.1.0/src/osservaprezzi/forms.py +85 -0
- openosservaprezzi-0.1.0/src/osservaprezzi/gate.py +129 -0
- openosservaprezzi-0.1.0/src/osservaprezzi/http.py +145 -0
- openosservaprezzi-0.1.0/src/osservaprezzi/parse.py +68 -0
- openosservaprezzi-0.1.0/src/osservaprezzi/query.py +94 -0
- openosservaprezzi-0.1.0/src/osservaprezzi/render.py +74 -0
- openosservaprezzi-0.1.0/tasks/todo.md +212 -0
- openosservaprezzi-0.1.0/tests/__init__.py +0 -0
- openosservaprezzi-0.1.0/tests/conftest.py +64 -0
- openosservaprezzi-0.1.0/tests/fixtures/consumo-base.html +173 -0
- openosservaprezzi-0.1.0/tests/fixtures/consumo-broken.html +179 -0
- openosservaprezzi-0.1.0/tests/fixtures/consumo-invalid.html +137 -0
- openosservaprezzi-0.1.0/tests/fixtures/consumo-ok.html +179 -0
- openosservaprezzi-0.1.0/tests/fixtures/ortofrutta-eu-base.html +91 -0
- openosservaprezzi-0.1.0/tests/fixtures/ortofrutta-eu-ok.html +207 -0
- openosservaprezzi-0.1.0/tests/fixtures/ortofrutta-it-base.html +109 -0
- openosservaprezzi-0.1.0/tests/fixtures/ortofrutta-it-empty.html +115 -0
- openosservaprezzi-0.1.0/tests/fixtures/ortofrutta-it-ok.html +535 -0
- openosservaprezzi-0.1.0/tests/test_archive.py +162 -0
- openosservaprezzi-0.1.0/tests/test_client.py +115 -0
- openosservaprezzi-0.1.0/tests/test_forms_parse.py +71 -0
- openosservaprezzi-0.1.0/tests/test_gate.py +156 -0
- openosservaprezzi-0.1.0/tests/test_parity.py +57 -0
- openosservaprezzi-0.1.0/tests/test_query.py +79 -0
- openosservaprezzi-0.1.0/tests/test_render_cli.py +425 -0
- openosservaprezzi-0.1.0/uv.lock +497 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Guida per agenti
|
|
2
|
+
|
|
3
|
+
`osservaprezzi` è una CLI read-only sui dati pubblici dell'Osservatorio Prezzi (MIMIT). Non scrive nulla sul portale, non richiede credenziali, non usa un browser.
|
|
4
|
+
|
|
5
|
+
## Primo comando
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
osservaprezzi agent-context
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Restituisce in una sola chiamata l'intero contratto: collezioni, dimensioni con le loro dipendenze, comandi con un esempio ciascuno, codici di uscita, forma degli errori e garanzie. Non dedurre queste informazioni dall'help testuale: chiedile qui.
|
|
12
|
+
|
|
13
|
+
## Modalità agente
|
|
14
|
+
|
|
15
|
+
Aggiungi `--agent` a qualsiasi comando: equivale a `--json`, senza colori e senza interazione. Vale per dati ed errori.
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
osservaprezzi catalog --agent
|
|
19
|
+
osservaprezzi get consumo --year 2025 --month 5 --province Roma --category energia --agent
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Regole che evitano gli errori più comuni
|
|
23
|
+
|
|
24
|
+
1. **Non inventare valori.** Ogni valore ammesso si ottiene da `values`. I suggerimenti negli errori vengono dal form del portale, mai da somiglianze.
|
|
25
|
+
2. **I domini dipendenti richiedono i genitori.** I mesi dipendono dall'anno, le settimane da anno e mese: `values ortofrutta-it week --year 2025 --month 5`.
|
|
26
|
+
3. **`get` vuole tutti i filtri.** Non esistono default impliciti; per usare quelli del portale serve `--latest`, che li dichiara nel campo `defaults_used`.
|
|
27
|
+
4. **Distingui le uscite.** `2` significa che il portale ha rifiutato un valore, `3` che i filtri erano validi ma non c'erano dati. Non sono la stessa cosa.
|
|
28
|
+
5. **Leggi gli errori da `stderr`.** `stdout` contiene solo dati: `comando --agent 2>&1 >/dev/null | jq .`
|
|
29
|
+
6. **Prima di un archivio, chiedi il piano.** `archive ... --dry-run --agent` dice quante richieste servono, senza eseguirle.
|
|
30
|
+
|
|
31
|
+
## Nessun parallelismo
|
|
32
|
+
|
|
33
|
+
Le richieste al portale sono serializzate su tutta la macchina da un lock su file: una sola per volta, con un intervallo minimo condiviso fra processi. Lanciare più istanze in parallelo non accelera nulla — si alternano. Non tentare di aggirare il vincolo con task concorrenti: il traffico complessivo resterebbe lo stesso e serviresti solo a rendere imprevedibili le attese. Se un comando sembra fermo, sta aspettando il suo turno e lo dichiara su `stderr` con `--verbose`.
|
|
34
|
+
|
|
35
|
+
`--lock-timeout` limita l'attesa: allo scadere il comando esce con `service_unavailable` (uscita 5, `retryable: true`), mai proseguendo in parallelo.
|
|
36
|
+
|
|
37
|
+
## Interpretazione dei dati
|
|
38
|
+
|
|
39
|
+
I prezzi sono **livelli** in euro, non indici. Il portale sconsiglia i confronti fra province e fra mesi: sotto la stessa descrizione possono esserci varietà, marche e confezioni diverse. Per le serie storiche la fonte corretta sono gli indici ISTAT (NIC, IPCA), disponibili via SDMX.
|
|
40
|
+
|
|
41
|
+
Ogni record conserva `collection`, `source_url` e `retrieved_at`: citali quando riporti un valore.
|
|
42
|
+
|
|
43
|
+
## Sviluppo
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
uv sync
|
|
47
|
+
uv run pytest
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
I test girano su fixture HTML ritagliate, senza rete. `scripts/refresh_fixtures.py` le rigenera.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Diario delle versioni
|
|
2
|
+
|
|
3
|
+
Il formato segue [Keep a Changelog](https://keepachangelog.com/it/1.1.0/); le versioni seguono il [versionamento semantico](https://semver.org/lang/it/).
|
|
4
|
+
|
|
5
|
+
## [0.1.0] — 2026-08-18
|
|
6
|
+
|
|
7
|
+
Prima versione, pubblicata su PyPI come `openosservaprezzi`; il comando installato è `osservaprezzi`.
|
|
8
|
+
|
|
9
|
+
### Aggiunto
|
|
10
|
+
|
|
11
|
+
- Tre collezioni: `consumo` (rilevazioni mensili di beni e servizi di largo consumo), `ortofrutta-it` e `ortofrutta-eu` (quotazioni all'ingrosso).
|
|
12
|
+
- Percorso di scoperta `catalog` → `describe` → `values` → `get`, con i valori ammessi letti dal portale e i domini dipendenti risolti passando i filtri genitori.
|
|
13
|
+
- Output in tabella, JSON e CSV, con provenienza (`collection`, `source_url`, `retrieved_at`) in ogni record e scrittura su file senza sporcare `stdout`.
|
|
14
|
+
- Query salvate in YAML ed eseguibili con `run`.
|
|
15
|
+
- Archivi on-demand con `archive`: piano preventivo `--dry-run`, limite `--max-requests`, esecuzione sequenziale, `manifest.json`, deduplicazione per chiave naturale, ripresa con `--resume` e filtro locale `--product`.
|
|
16
|
+
- Errori distinti per categoria con codici di uscita deterministici (2 input non valido, 3 nessun dato, 4 contratto cambiato, 5 servizio indisponibile, 6 risposta parziale) ed emissione JSON su `stderr`.
|
|
17
|
+
- Riconoscimento dei filtri rifiutati dal portale leggendo il form della risposta: un valore inesistente non viene più confuso con un'assenza di dati.
|
|
18
|
+
- Aiuto autodescrittivo: esempi eseguibili in ogni comando, opzioni che dichiarano collezione di appartenenza e dipendenze, comando `agent-context` e opzione `--agent`.
|
|
19
|
+
- Serializzazione delle richieste su tutta la macchina tramite lock su file, con intervallo minimo condiviso fra processi e `--lock-timeout`.
|
|
20
|
+
- Cache locale dei soli metadati, invalidabile con `--refresh`.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Andrea Borruso
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Log
|
|
2
|
+
|
|
3
|
+
## 2026-08-18
|
|
4
|
+
|
|
5
|
+
- README: aggiunta la sezione sul valore dei dati, con il confronto fra pane (referenze eterogenee) e benzina (prodotto omogeneo) e la tabella delle analisi che reggono.
|
|
6
|
+
- Aggiunti al PRD due principi fondativi: l'aiuto come contratto e l'accesso serializzato al servizio pubblico (RF-27…RF-38).
|
|
7
|
+
- Aiuto autodescrittivo: esempi in ogni comando, opzioni che dichiarano collezione e dipendenze, comando `agent-context`, opzione `--agent`, `AGENTS.md`.
|
|
8
|
+
- Introdotto un lock su file che impedisce esecuzioni parallele sulla stessa macchina, con intervallo minimo condiviso fra processi e `--lock-timeout`.
|
|
9
|
+
- Aggiunta licenza MIT e riscritto il README per chi analizza i dati.
|
|
10
|
+
- Completata la prima versione: verificati sul campo `run` e `archive`, aggiunti i test di parità, contratto e archivio (57 test verdi).
|
|
11
|
+
- Eseguito l'archivio di accettazione su 64 province: 60 righe, nessun duplicato, manifest `complete` conservato in `docs/evidence/`.
|
|
12
|
+
- Corretto un difetto della vista tabella: `catalog` nascondeva la colonna `collection`, cioè l'identificatore da usare nei comandi successivi.
|
|
13
|
+
- Corretto un difetto della cache: i domini venivano memorizzati anche da pagine con filtri rifiutati.
|
|
14
|
+
- Chiusi tre rilievi della revisione: `defaults_used` nella provenienza di ogni record, test dell'uscita 6 per l'archivio parziale, nota sulla vista tabella nel README.
|
|
15
|
+
- Allineati `docs/evaluation.md` e `tasks/todo.md` con le evidenze e la revisione dei dieci criteri di accettazione.
|
|
16
|
+
|
|
17
|
+
## 2026-08-17
|
|
18
|
+
|
|
19
|
+
- Tracciato il traffico del portale con `agent-browser`: unica GET del documento, nessuna XHR di dati, endpoint ausiliario ancora non risolvibile.
|
|
20
|
+
- Verificato che l'echo dei filtri copre tutte le dimensioni e distingue parametro non valido da assenza di dati; `submit=Applica` non è necessario.
|
|
21
|
+
- Realizzata la prima versione della CLI `osservaprezzi`: catalog, describe, values, get, run, archive, version, cache.
|
|
22
|
+
- Aggiunte fixture HTML ritagliate, script di rigenerazione e 17 test offline verdi.
|
|
23
|
+
- Conclusa l'indagine di fattibilità: tre collezioni fattibili via GET HTML, con rischio medio.
|
|
24
|
+
- Documentate evidenze, replay HTTP, parità dei form, archivi e raccomandazione in `docs/evaluation.md`.
|
|
25
|
+
- Aggiornato il PRD con dimensioni reali, filtri espliciti e vincoli degli archivi.
|
|
26
|
+
- Aggiunti al PRD archivi on-demand con espansione delle dimensioni, manifest, deduplicazione e ripresa.
|
|
27
|
+
- Esteso il PRD con la parità completa tra controlli dei form HTML e parametri CLI.
|
|
28
|
+
- Scritto il PRD preliminare della CLI unificata e read-only.
|
|
29
|
+
- Preparato il piano per la verifica di fattibilità della CLI Osservatorio Prezzi.
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: openosservaprezzi
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: CLI read-only per i dati pubblici dell'Osservatorio Prezzi
|
|
5
|
+
Project-URL: Homepage, https://github.com/aborruso/open-osservatorio-prezzi
|
|
6
|
+
Project-URL: Source, https://github.com/aborruso/open-osservatorio-prezzi
|
|
7
|
+
Project-URL: Issues, https://github.com/aborruso/open-osservatorio-prezzi/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/aborruso/open-osservatorio-prezzi/blob/main/CHANGELOG.md
|
|
9
|
+
Author-email: Andrea Borruso <aborruso@gmail.com>
|
|
10
|
+
License: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: cli,mimit,open-data,osservatorio-prezzi,prezzi
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Requires-Python: >=3.10
|
|
18
|
+
Requires-Dist: httpx>=0.27
|
|
19
|
+
Requires-Dist: lxml>=5.2
|
|
20
|
+
Requires-Dist: portalocker>=4.1.0
|
|
21
|
+
Requires-Dist: pyyaml>=6.0
|
|
22
|
+
Requires-Dist: typer>=0.12
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
25
|
+
# osservaprezzi
|
|
26
|
+
|
|
27
|
+
Porta sul tuo computer, in forma analizzabile, i prezzi pubblicati dall'[Osservatorio Prezzi](https://osservaprezzi.mise.gov.it/) del Ministero delle Imprese e del Made in Italy.
|
|
28
|
+
|
|
29
|
+
Sul portale quei dati si consultano una pagina alla volta, scegliendo mese, provincia e categoria da quattro menu a tendina. Se vuoi confrontare il prezzo del pane in tutta Italia, o seguire le quotazioni degli ortaggi in dieci mercati, ti servono decine di consultazioni manuali e altrettanti copia-incolla. Questo strumento fa quel lavoro al posto tuo e ti restituisce un CSV.
|
|
30
|
+
|
|
31
|
+
**Cosa NON fa**: non inventa valori, non stima, non completa i buchi. Se un dato non è pubblicato, te lo dice.
|
|
32
|
+
|
|
33
|
+
Prima di impostare un'analisi leggi [A cosa servono davvero questi dati](#a-cosa-servono-davvero-questi-dati): non tutti i confronti che sembrano possibili lo sono, e la differenza dipende dal prodotto.
|
|
34
|
+
|
|
35
|
+
## I dati disponibili
|
|
36
|
+
|
|
37
|
+
| | Cosa contiene | Aggiornamento | Dettaglio |
|
|
38
|
+
|---|---|---|---|
|
|
39
|
+
| **consumo** | Prezzi al dettaglio di beni e servizi — pane, carne, pesce, benzina, ortofrutta, parrucchiere, lavanderia… — fino a circa 160 voci, con differenze fra province | mensile | 64 province |
|
|
40
|
+
| **ortofrutta-it** | Quotazioni all'ingrosso di frutta e verdura | settimanale | 23 mercati italiani |
|
|
41
|
+
| **ortofrutta-eu** | Le stesse quotazioni sui mercati esteri | settimanale | 11 mercati europei |
|
|
42
|
+
|
|
43
|
+
Si parte dal 2021. Per `consumo` ogni riga riporta prezzo minimo, massimo e medio rilevati nella provincia; per l'ortofrutta specie, varietà, calibro, origine e prezzo.
|
|
44
|
+
|
|
45
|
+
## Installazione
|
|
46
|
+
|
|
47
|
+
Il modo più semplice, se hai [uv](https://docs.astral.sh/uv/):
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
uv tool install openosservaprezzi
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Il pacchetto si chiama `openosservaprezzi`, il comando che installa è `osservaprezzi`.
|
|
54
|
+
|
|
55
|
+
Per provarlo senza installare nulla:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
uvx --from openosservaprezzi osservaprezzi catalog
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Con pip:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
pip install openosservaprezzi
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Verifica che funzioni:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
osservaprezzi version
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## I primi tre comandi
|
|
74
|
+
|
|
75
|
+
### Cosa c'è
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
osservaprezzi catalog
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
collection title status dimensions
|
|
83
|
+
------------- --------------------------------------------------------- --------- --------------------------------
|
|
84
|
+
consumo Rilevazioni mensili di beni e servizi di largo consumo available year, month, province, category
|
|
85
|
+
ortofrutta-it Prodotti ortofrutticoli all'ingrosso nei mercati italiani available year, month, week, market, group
|
|
86
|
+
ortofrutta-eu Prodotti ortofrutticoli all'ingrosso nei mercati europei available year, month, week, market, group
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Le parole nell'ultima colonna sono i filtri che dovrai indicare. Per `consumo` servono anno, mese, provincia e categoria.
|
|
90
|
+
|
|
91
|
+
### Quali valori posso usare
|
|
92
|
+
|
|
93
|
+
Non devi indovinarli: te li elenca lo strumento, chiedendoli al portale.
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
osservaprezzi values consumo category
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
value label
|
|
101
|
+
---------- -------------------------------
|
|
102
|
+
altri_alim Alimentari
|
|
103
|
+
energia Energetici
|
|
104
|
+
groc Cura della persona e della casa
|
|
105
|
+
ittici Ittici
|
|
106
|
+
orto Ortofrutta
|
|
107
|
+
servizi Servizi
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Stessa cosa per province, mercati, gruppi:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
osservaprezzi values ortofrutta-eu market
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
value label
|
|
118
|
+
---------- ----------
|
|
119
|
+
AMBURGO AMBURGO
|
|
120
|
+
BARCELLONA BARCELLONA
|
|
121
|
+
BERLINO BERLINO
|
|
122
|
+
BOLOGNA BOLOGNA
|
|
123
|
+
LIONE LIONE
|
|
124
|
+
MILANO MILANO
|
|
125
|
+
MONACO MONACO
|
|
126
|
+
PARIGI PARIGI
|
|
127
|
+
PERPIGNANO PERPIGNANO
|
|
128
|
+
ROMA ROMA
|
|
129
|
+
STOCCARDA STOCCARDA
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Attenzione a mesi e settimane: dipendono dall'anno, quindi vanno chiesti indicandolo.
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
osservaprezzi values ortofrutta-it week --year 2021 --month 1
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Gennaio 2021 ha cinque settimane, maggio 2025 ne ha quattro: è il portale a dirlo.
|
|
139
|
+
|
|
140
|
+
### I dati
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
osservaprezzi get consumo --year 2025 --month 5 --province Roma --category ittici
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
year month province category product price_min price_max price_avg
|
|
148
|
+
---- ----- -------- -------- ----------------------------------------------- --------- --------- ---------
|
|
149
|
+
2025 5 Roma ittici Alici Fresche Di Pescata (1000 Gr) 5.9 29.9 10.36
|
|
150
|
+
2025 5 Roma ittici Sgombri Freschi Di Pescata (1000 Gr) 5.99 24.0 10.99
|
|
151
|
+
2025 5 Roma ittici Merluzzi O Naselli Freschi Di Pescata (1000 Gr) 18.01 29.9 24.99
|
|
152
|
+
2025 5 Roma ittici Trote Di Allevamento Fresche (1000 Gr) 6.9 16.0 10.5
|
|
153
|
+
2025 5 Roma ittici Salmone Fresco (1000 Gr) 12.9 30.92 20.14
|
|
154
|
+
2025 5 Roma ittici Mitili O Cozze Fresche (1000 Gr) 4.44 7.01 5.57
|
|
155
|
+
2025 5 Roma ittici Vongole Fresche (1000 Gr) 5.99 28.0 21.53
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
I prezzi sono in euro, riferiti alla quantità tra parentesi.
|
|
159
|
+
|
|
160
|
+
## Portare i dati in Excel, R, Python
|
|
161
|
+
|
|
162
|
+
Aggiungi `--csv` e `--output`:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
osservaprezzi get consumo --year 2025 --month 5 --province Bologna --category energia \
|
|
166
|
+
--csv --output benzina-bologna.csv
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Il file contiene anche l'indirizzo esatto della pagina da cui il dato proviene e il momento in cui è stato letto — utile quando dovrai citare la fonte:
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
year,month,province,category,product,price_min,price_max,price_avg,category_label,collection,source_url,retrieved_at
|
|
173
|
+
2025,5,Bologna,energia,Gasolio Per Auto Con Servizio Alla Pompa (1 L),1.512,2.142,1.75,Energetici,consumo,https://…
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Con `--json` ottieni invece una struttura pronta per essere elaborata.
|
|
177
|
+
|
|
178
|
+
## Il pane in tutta Italia: gli archivi
|
|
179
|
+
|
|
180
|
+
Qui lo strumento dà il meglio. Vuoi il prezzo di un prodotto in tutte le province? Non serve ripetere 64 comandi:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
osservaprezzi archive consumo \
|
|
184
|
+
--year 2025 --month 5 --category altri_alim \
|
|
185
|
+
--all province \
|
|
186
|
+
--product "Pane Fresco Con Farina Di Grano (1000 Gr)" \
|
|
187
|
+
--output pane-maggio-2025
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Prima di partire puoi vedere quanto costerà, senza chiedere niente al portale:
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
osservaprezzi archive consumo --year 2025 --month 5 --category altri_alim \
|
|
194
|
+
--all province --dry-run
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
richieste previste: 64
|
|
199
|
+
dimensioni espanse: province (64)
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Al termine trovi due file:
|
|
203
|
+
|
|
204
|
+
- **`data.csv`** — i dati, senza duplicati;
|
|
205
|
+
- **`manifest.json`** — cosa è stato chiesto, a quale indirizzo, quando, quali province hanno risposto e quali no.
|
|
206
|
+
|
|
207
|
+
Nell'esempio reale: 64 province interrogate, 60 con quel pane, 4 dove non è stato rilevato. Il prezzo medio andava da 2,42 a 7,04 euro al chilo.
|
|
208
|
+
|
|
209
|
+
Se l'esecuzione si interrompe, riprende da dove era rimasta:
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
osservaprezzi archive … --output pane-maggio-2025 --resume
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Puoi espandere anche altre dimensioni — tutti i mercati per una settimana, per esempio:
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
osservaprezzi archive ortofrutta-it --year 2025 --month 5 --week 2 \
|
|
219
|
+
--group ORTAGGI --all market --output ortaggi-settimana2
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## Riusare la stessa interrogazione
|
|
223
|
+
|
|
224
|
+
Salva i filtri in un file e rieseguili quando vuoi:
|
|
225
|
+
|
|
226
|
+
```yaml
|
|
227
|
+
# ortaggi-roma.yaml
|
|
228
|
+
version: 1
|
|
229
|
+
collection: ortofrutta-it
|
|
230
|
+
filters:
|
|
231
|
+
year: 2025
|
|
232
|
+
month: 5
|
|
233
|
+
week: 2
|
|
234
|
+
market: ROMA
|
|
235
|
+
group: ORTAGGI
|
|
236
|
+
format: csv
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
osservaprezzi run ortaggi-roma.yaml --output ortaggi.csv
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
È il modo più semplice per rifare la stessa estrazione il mese prossimo, o per condividerla con un collega.
|
|
244
|
+
|
|
245
|
+
## A cosa servono davvero questi dati
|
|
246
|
+
|
|
247
|
+
Vale la pena saperlo prima di impostare un'analisi, perché il valore di questi numeri cambia molto a seconda di cosa si guarda.
|
|
248
|
+
|
|
249
|
+
### Il limite da cui parte tutto
|
|
250
|
+
|
|
251
|
+
Una descrizione come «Pane Fresco Con Farina Di Grano (1000 Gr)» non identifica un prodotto: identifica una **categoria**. Dentro ci finiscono pani diversi per varietà, marca, confezione e negozio in cui sono stati rilevati — quella combinazione, nel linguaggio Istat, si chiama *referenza*. Ogni provincia campiona le proprie, e da un mese all'altro il campione può cambiare.
|
|
252
|
+
|
|
253
|
+
Lo si vede nei dati stessi. Maggio 2025, stessa descrizione, stesso mese:
|
|
254
|
+
|
|
255
|
+
| | minimo | massimo | medio |
|
|
256
|
+
|---|---:|---:|---:|
|
|
257
|
+
| Napoli | 2,00 | 2,99 | **2,42** |
|
|
258
|
+
| Roma | 2,29 | 4,89 | **3,41** |
|
|
259
|
+
| Palermo | 3,50 | 5,00 | **4,42** |
|
|
260
|
+
| Milano | 2,99 | 7,00 | **4,97** |
|
|
261
|
+
| Bologna | 3,99 | 7,80 | **5,23** |
|
|
262
|
+
|
|
263
|
+
A Milano il pane più caro costa 2,3 volte il più economico, nella stessa città e nello stesso mese: quella dispersione interna è la prova che sotto l'etichetta ci sono prodotti differenti. Perciò la distanza fra Napoli e Bologna mescola due cose inseparabili — quanto costa il pane e quali pani sono finiti nel campione.
|
|
264
|
+
|
|
265
|
+
Il portale lo dice esplicitamente: i confronti fra città e fra mesi «possono essere effettuati correttamente solo utilizzando gli indici dei prezzi al consumo».
|
|
266
|
+
|
|
267
|
+
### Cosa regge comunque
|
|
268
|
+
|
|
269
|
+
**La dispersione dentro una singola rilevazione.** Minimo, massimo e medio della stessa cella vengono dalla stessa rilevazione: confrontarli fra loro è legittimo. È anche l'informazione più concreta per chi compra — dice quanto conviene guardarsi intorno — e per chi osserva un mercato, perché misura quanto è differenziato.
|
|
270
|
+
|
|
271
|
+
**I prodotti omogenei.** L'avvertenza morde dove la referenza è variabile; dove il prodotto è sempre lo stesso quasi sparisce. Benzina verde self, maggio 2025:
|
|
272
|
+
|
|
273
|
+
| | medio |
|
|
274
|
+
|---|---:|
|
|
275
|
+
| Milano | 1,688 |
|
|
276
|
+
| Bologna | 1,692 |
|
|
277
|
+
| Napoli | 1,695 |
|
|
278
|
+
| Palermo | 1,715 |
|
|
279
|
+
|
|
280
|
+
Uno scarto dell'1,6% fra la prima e l'ultima, contro il più del doppio che separa le stesse città sul pane. La benzina verde è la benzina verde ovunque: niente varietà, niente marca artigianale, niente pezzatura. Sui carburanti il confronto territoriale regge.
|
|
281
|
+
|
|
282
|
+
**L'ortofrutta all'ingrosso.** Lì specie, varietà, calibro, categoria, presentazione e origine sono colonne esplicite, non nascoste in una descrizione: sai esattamente cosa stai confrontando, quindi puoi confrontarlo.
|
|
283
|
+
|
|
284
|
+
### Cosa non regge
|
|
285
|
+
|
|
286
|
+
Classifiche fra città sugli alimentari e serie storiche di qualsiasi voce. Non è una cautela formale: sono conclusioni che i dati non sostengono. Per l'andamento nel tempo la fonte corretta sono gli indici dei prezzi al consumo dell'Istat, costruiti confrontando ogni prodotto con se stesso e quindi immuni al cambio di composizione. In cambio danno la variazione, non il prezzo in euro. Sono pubblicati via SDMX: il **NIC** arriva fino al dettaglio provinciale (132 aree fra Italia, ripartizioni, regioni e province) ed espone numeri indice e variazioni congiunturali e tendenziali; l'**IPCA**, l'indice armonizzato europeo, è invece solo nazionale.
|
|
287
|
+
|
|
288
|
+
Sono due strumenti con due mestieri: i **livelli** dicono quanto si paga qui e ora, gli **indici** come si muove nel tempo.
|
|
289
|
+
|
|
290
|
+
### Perché allora esistono
|
|
291
|
+
|
|
292
|
+
Questi livelli nascono dalla stessa raccolta che alimenta gli indici dei prezzi al consumo, ma non sono dati grezzi: sono elaborazioni. Per la rilevazione tradizionale e le fonti amministrative il portale pubblica il prezzo minimo e massimo effettivamente rilevati e la media delle quotazioni validate; per i dati degli scanner di cassa il minimo e il massimo fra i prezzi medi mensili di ciascun codice a barre, e una media provinciale ponderata sul peso campionario dei punti vendita. Le singole quotazioni per punto vendita non sono pubbliche. Servono inoltre alla sorveglianza dei prezzi — individuare situazioni anomale, alimentare il lavoro del Garante e delle commissioni di allerta rapida — dove basta un ordine di grandezza pubblico e verificabile.
|
|
293
|
+
|
|
294
|
+
### In breve
|
|
295
|
+
|
|
296
|
+
| Analisi | Regge? |
|
|
297
|
+
|---|---|
|
|
298
|
+
| Dispersione min-max in una provincia e un mese | sì |
|
|
299
|
+
| Confronto fra province sui carburanti | sì |
|
|
300
|
+
| Ortofrutta all'ingrosso fra mercati | sì, i descrittori sono espliciti |
|
|
301
|
+
| Copertura: dove e quando un prodotto è rilevato | sì |
|
|
302
|
+
| Classifica delle città sul costo degli alimentari | no |
|
|
303
|
+
| Serie storica di un prodotto | no, usa gli indici Istat |
|
|
304
|
+
|
|
305
|
+
## Altre due cose da sapere
|
|
306
|
+
|
|
307
|
+
**Le assenze significano «non rilevato».** Se un prodotto non compare per una provincia non vuol dire che lì non si venda: quel mese non è stato rilevato. A Roma i prodotti ittici sono sette, ad Aosta quattro. Negli archivi queste situazioni sono registrate nel manifest, non nascoste.
|
|
308
|
+
|
|
309
|
+
**Il dettaglio è provinciale, non comunale.** Le province coperte sono 64 delle 107 italiane.
|
|
310
|
+
|
|
311
|
+
## Un vincolo voluto: una richiesta alla volta
|
|
312
|
+
|
|
313
|
+
Il portale è un servizio pubblico pensato per la consultazione umana, senza API. Per non sovraccaricarlo, lo strumento lascia passare **una sola richiesta alla volta su tutto il computer**, con almeno un secondo fra l'una e l'altra. Se lanci due comandi in parallelo non raddoppi il traffico: si alternano, e nell'insieme vanno alla velocità di uno solo. Un archivio lungo non ti impedisce quindi di fare nel frattempo una singola interrogazione — aspetterà solo il suo turno.
|
|
314
|
+
|
|
315
|
+
Non è una limitazione da aggirare: è il motivo per cui uno strumento del genere può esistere senza creare problemi a chi lo ospita. Se ti servono volumi molto grandi, la strada giusta è chiedere i dati alla fonte.
|
|
316
|
+
|
|
317
|
+
## Quando qualcosa non va
|
|
318
|
+
|
|
319
|
+
Lo strumento distingue i casi, invece di restituire silenziosamente una tabella vuota come fa il portale:
|
|
320
|
+
|
|
321
|
+
| Messaggio | Cosa significa |
|
|
322
|
+
|---|---|
|
|
323
|
+
| `invalid_parameter` | hai indicato un valore che non esiste; ti vengono elencati quelli ammessi |
|
|
324
|
+
| `no_data` | i filtri erano corretti, ma per quel periodo non ci sono rilevazioni |
|
|
325
|
+
| `contract_changed` | il portale ha cambiato struttura: lo strumento va aggiornato |
|
|
326
|
+
| `service_unavailable` | il portale non risponde, oppure un'altra esecuzione è in corso |
|
|
327
|
+
|
|
328
|
+
Se sbagli il nome di un mercato te lo dice subito, con la lista giusta:
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
osservaprezzi get ortofrutta-it --year 2025 --month 5 --week 2 --market MESSINA --group ORTAGGI
|
|
332
|
+
# errore [invalid_parameter]: valori non ammessi dal portale: market
|
|
333
|
+
# valori ammessi: BERGAMO, BOLOGNA, BOLZANO, CAGLIARI, CATANIA, …
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
## Usarlo con un assistente AI
|
|
337
|
+
|
|
338
|
+
Ogni comando ha `--agent`, che produce output strutturato, e c'è un comando che descrive l'intero strumento in una volta sola:
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
osservaprezzi agent-context
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
Se lavori con Claude, Copilot o simili, il file [`AGENTS.md`](AGENTS.md) contiene le istruzioni da dare all'assistente.
|
|
345
|
+
|
|
346
|
+
## Fonte e licenza
|
|
347
|
+
|
|
348
|
+
I dati provengono dall'Osservatorio Prezzi del MIMIT, che li elabora a partire da rilevazioni Istat, Unioncamere e BMTI. Cita sempre la fonte e l'indirizzo della pagina: li trovi in ogni riga esportata.
|
|
349
|
+
|
|
350
|
+
La licenza dei dati non è dichiarata in modo univoco dal portale: prima di ripubblicare archivi derivati, verifica le condizioni con le fonti.
|
|
351
|
+
|
|
352
|
+
Il codice di questo strumento è rilasciato con licenza MIT (vedi [`LICENSE`](LICENSE)).
|
|
353
|
+
|
|
354
|
+
## Contribuire
|
|
355
|
+
|
|
356
|
+
Segnalazioni e proposte sono benvenute. Per lavorare al codice:
|
|
357
|
+
|
|
358
|
+
```bash
|
|
359
|
+
uv sync
|
|
360
|
+
uv run pytest
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
I test girano su pagine HTML salvate in locale e non richiedono connessione.
|