Tutorial Carburanti¶

Caricamento librerie¶

In [1]:
import time
import os
import pyogrio
import folium
import h3pandas
import numpy as np
import pandas as pd
import geopandas as gpd
import plotly
import plotly.graph_objects as go

from glob import glob
from datetime import datetime
from tqdm import tqdm

plotly.offline.init_notebook_mode()

Definizione path di lavoro¶

In [2]:
geo_path = os.path.join(os.path.expanduser('~'),'ILAB_DATA','CARBURANTI', 'GEOP')
istat_path = os.path.join(os.path.expanduser('~'),'ILAB_DATA','ISTAT', 'DATA')

Parametri¶

In [34]:
comune_sel = 'Roma'
carburanti_sel = ['Benzina','Gasolio']
tipo_impianto_sel = ['Autostradale']
resolution = 7
selection_type = 'comune'
h3_index = f'h3_{resolution:02}'
year_f = '2023'

Associazone nome comune - codice procom¶

In [4]:
comuni = gpd.read_parquet(os.path.join(istat_path,'comuni_pop.parquet'))

procom2name = dict()
name2procom = dict()
for com in comuni.to_dict('records'):
    procom2name[com['pro_com']] = com['comune']
    name2procom[com['comune']] = com['pro_com']

procom_sel = name2procom[comune_sel]
print(f'{comune_sel} --> {procom_sel}')
Roma --> 58091

Caricamento zone ASC¶

In [5]:
asc1 = pyogrio.read_dataframe(os.path.join(istat_path,'ASC_21','ASC_Liv_1_WGS84.shp'), encoding='utf8').to_crs(4326)
asc1 = asc1.loc[asc1['PRO_COM']==procom_sel,['COD_ASC1_T','DEN_ASC1','POP21','geometry']].copy()
asc2 = pyogrio.read_dataframe(os.path.join(istat_path,'ASC_21','ASC_Liv_2_WGS84.shp'), encoding='utf8').to_crs(4326)
asc2 = asc2.loc[asc2['PRO_COM']==procom_sel,['COD_ASC2_T','DEN_ASC2','POP21','geometry']].copy()
asc3 = pyogrio.read_dataframe(os.path.join(istat_path,'ASC_21','ASC_Liv_3_WGS84.shp'), encoding='utf8').to_crs(4326)
asc3 = asc3.loc[asc3['PRO_COM']==procom_sel,['COD_ASC3_T','DEN_ASC3','POP21','geometry']].copy()

Creazione di una griglia esagonale sul poligono del comune selezionato con risoluzione specifica¶

In [6]:
h3_index = f'h3_{resolution:02}'

start = datetime.now()

selection_df = comuni[comuni[selection_type]==comune_sel].copy()
selection_df['geometry'] = selection_df['geometry'].to_crs(3857).buffer(500).to_crs(4326)
grid = selection_df.to_crs(4326).h3.polyfill_resample(resolution)[['geometry']]
grid.index.name = f'{h3_index}_i'
grid[h3_index] = grid.index
grid['cell_a_m2'] = grid.to_crs(32632).area
print(f'Esecuzione: {str(datetime.now()-start).split(".")[0]}')
Esecuzione: 0:00:00
In [ ]:
 

Analisi singolo file¶

Identificazione ultimo file 'prezzo_alle_8' disponibile¶

In [6]:
file_list = glob(os.path.join(geo_path,'prezzo_alle_8_*.parquet'))
file_list.sort()
last_file = file_list[-1]

Parametri di selezione utilizzati¶

In [7]:
print(f'Parametri selezione: ')
print(f'Comune: {comune_sel}')
print(f'Tipo carburante: {", ".join(carburanti_sel)}')
print(f'Tipo impianto: {", ".join(tipo_impianto_sel)}')
Parametri selezione: 
Comune: Roma
Tipo carburante: Benzina, Gasolio
Tipo impianto: Stradale

Legge il file identificato¶

In [19]:
data = last_file.split('prezzo_alle_8_')[1].replace('.parquet','')
print(f'File: {os.path.basename(last_file)} estratto il {data}')
temp = gpd.read_parquet(last_file)
print(f'Numero impianti totali: {len(list(temp["idImpianto"].unique()))}')
temp['data'] = data
File: prezzo_alle_8_20240930.parquet estratto il 20240930
Numero impianti totali: 21511

Imposta a stringa l'attributo isSelf¶

In [20]:
temp['isSelf'] = temp['isSelf'].astype(str)

Estrae la data di comunicazione del prezzo¶

In [25]:
temp['dayComu'] = pd.to_datetime(temp['dtComu'].str.split(' ').str[0],format='%d/%m/%Y').dt.strftime('%Y%m%d')

Ricalcola i giorni dall'ultima comunicazione (utilizzando come base la data di estrazione)¶

In [28]:
print('Ri - Calcola i giorni dall\'aggiornamento')
temp['days'] = (datetime.strptime(data,'%Y%m%d') - pd.to_datetime(temp['dayComu'], format='%Y%m%d')).dt.days
Ri - Calcola i giorni dall'aggiornamento

Filtra il dataset usando i parametri immessi¶

In [30]:
temp = temp[
    (temp['comune']==comune_sel)
    &(temp['descCarburante'].isin(carburanti_sel))
    &(temp['Tipo Impianto'].isin(tipo_impianto_sel))
    ].copy()
del temp['index_right']
print(f'Numero impianti selezionati: {len(list(temp["idImpianto"].unique()))}')
Numero impianti selezionati: 834

Associa le informazioni delle zone ASC¶

In [31]:
temp = temp.sjoin(asc1,predicate='intersects')
del temp['index_right']
temp = temp.sjoin(asc2,predicate='intersects')
del temp['index_right']
temp = temp.sjoin(asc3,predicate='intersects')
del temp['index_right']

Prende tutti gli impianti con self e quelli che hanno solo il servito¶

In [32]:
print('Seleziona gli impianti con self')
self_df = temp[temp['isSelf']=='1'].copy()
self_ids = self_df['idImpianto'].unique()
print(f'Gli impianti con self sono {len(self_ids)}')
serv_df = temp[(temp['isSelf']=='0')&(~temp['idImpianto'].isin(self_ids))].copy()
serv_ids = serv_df['idImpianto'].unique()
print(f'Gli impianti serviti che non hanno self sono {len(serv_ids)}')
print('Concatena le due selezioni')
temp = pd.concat([self_df,serv_df], ignore_index=True)
print(f'Gli impianti da processare sono {len(temp["idImpianto"].unique())}')
Seleziona gli impianti con self
Gli impianti con self sono 735
Gli impianti serviti che non hanno self sono 99
Concatena le due selezioni
Gli impianti da processare sono 834

Analisi andamento delle comunicazioni su scala giornaliera¶

In [33]:
g = temp.groupby('dayComu', as_index=False)['idImpianto'].nunique().rename(columns={'idImpianto':'num_impianti'}).sort_values(by='dayComu', ascending=True)
g
Out[33]:
dayComu num_impianti
0 20240801 1
1 20240823 1
2 20240826 1
3 20240905 1
4 20240910 1
5 20240916 2
6 20240917 1
7 20240918 2
8 20240919 2
9 20240920 3
10 20240921 5
11 20240922 2
12 20240923 51
13 20240924 48
14 20240925 66
15 20240926 92
16 20240927 135
17 20240928 96
18 20240929 96
19 20240930 228

Analisi numero di impianti per zone ASC¶

In [34]:
g = temp.groupby('DEN_ASC1', as_index=False)['idImpianto'].nunique().rename(columns={'idImpianto':'numImpianti'})
asc1 = asc1.merge(g)
g = temp.groupby('DEN_ASC2', as_index=False)['idImpianto'].nunique().rename(columns={'idImpianto':'numImpianti'})
asc2 = asc2.merge(g)
g = temp.groupby('DEN_ASC3', as_index=False)['idImpianto'].nunique().rename(columns={'idImpianto':'numImpianti'})
asc3 = asc3.merge(g)

Visualizzazione dell'andamento del numero di impianti per zona ASC¶

In [35]:
m = asc1.explore(name='ASC1',column='numImpianti',color='black',style_kwds={'fill':True})
m = asc2.explore(m=m,name='ASC2',column='numImpianti',color='red',style_kwds={'fill':True})
m = asc3.explore(m=m,name='ASC3',column='numImpianti',color='green',style_kwds={'fill':True})
m = temp.explore(m=m,name='Impianti',)

folium.LayerControl().add_to(m)
m
Out[35]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Analisi andamento dei prezzi¶

Attenzione le date di comunicazione non sono costanti

In [36]:
prezzi_mean = temp.groupby(['DEN_ASC1','descCarburante'], as_index=False).agg({'prezzo':'mean'})
prezzi_mean = prezzi_mean.pivot_table(index='DEN_ASC1', columns='descCarburante', values='prezzo').reset_index().rename_axis(None, axis=1)
asc1 = asc1.merge(prezzi_mean)

prezzi_mean = temp.groupby(['DEN_ASC2','descCarburante'], as_index=False).agg({'prezzo':'mean'})
prezzi_mean = prezzi_mean.pivot_table(index='DEN_ASC2', columns='descCarburante', values='prezzo').reset_index().rename_axis(None, axis=1)
asc2 = asc2.merge(prezzi_mean)

prezzi_mean = temp.groupby(['DEN_ASC3','descCarburante'], as_index=False).agg({'prezzo':'mean'})
prezzi_mean = prezzi_mean.pivot_table(index='DEN_ASC3', columns='descCarburante', values='prezzo').reset_index().rename_axis(None, axis=1)
asc3 = asc3.merge(prezzi_mean)

Visualizzazione dell'andamento dei prezzi per zona ASC1¶

In [37]:
m = asc1.explore(column='Benzina', cmap='YlOrRd', name='Benzina', show=True)
m = asc1.explore(m=m, column='Gasolio', cmap='YlGnBu', name='Gasolio', show=False)
folium.LayerControl().add_to(m)
m
Out[37]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Visualizzazione dell'andamento dei prezzi per zona ASC2¶

In [38]:
m = asc2.explore(column='Benzina', cmap='YlOrRd', name='Benzina', show=True)
m = asc2.explore(m=m, column='Gasolio', cmap='YlGnBu', name='Gasolio', show=False)
folium.LayerControl().add_to(m)
m
Out[38]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Visualizzazione dell'andamento dei prezzi per zona ASC3¶

In [39]:
m = asc3.explore(column='Benzina', cmap='YlOrRd', name='Benzina', show=True)
m = asc3.explore(m=m, column='Gasolio', cmap='YlGnBu', name='Gasolio', show=False)
folium.LayerControl().add_to(m)
m
Out[39]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Analisi dettagliata dell'andamento dei prezzi per zona ASC3¶

In [40]:
g = temp.groupby(['DEN_ASC3','descCarburante'], as_index=False).agg(
    maxPrezzo = ('prezzo','max'),
    minPrezzo = ('prezzo','min'),
    avgPrezzo = ('prezzo','mean'),
    numImpianti = ('idImpianto','nunique'),
    avgDays = ('days','mean')
)
In [41]:
asc3_benzina = g[(g['descCarburante']=='Benzina')].copy()
asc3_gasolio = g[(g['descCarburante']=='Gasolio')].copy()
In [42]:
asc3_benzina[asc3_benzina['DEN_ASC3'].isin(['Trastevere','Valco S. Paolo','Nomentano'])]
Out[42]:
DEN_ASC3 descCarburante maxPrezzo minPrezzo avgPrezzo numImpianti avgDays
146 Nomentano Benzina 1.839 1.719 1.743333 9 3.000000
250 Trastevere Benzina 1.749 1.629 1.689000 2 2.000000
272 Valco S. Paolo Benzina 1.709 1.669 1.684714 7 1.714286
In [43]:
asc3_benzina
Out[43]:
DEN_ASC3 descCarburante maxPrezzo minPrezzo avgPrezzo numImpianti avgDays
0 Acilia Sud Benzina 1.744 1.699 1.709833 6 1.666667
2 Acqua Vergine Benzina 1.719 1.709 1.714000 2 7.000000
4 Aeropoprto dell' Urbe Benzina 1.769 1.749 1.759000 4 1.750000
6 Alessandrina Benzina 1.789 1.669 1.721667 18 2.611111
8 Appia Antica Nord Benzina 1.745 1.685 1.708000 6 4.166667
... ... ... ... ... ... ... ...
274 Vallerano Castel di Leva Benzina 1.719 1.699 1.705875 8 1.750000
276 Villa Ada Benzina 1.729 1.709 1.716500 4 3.750000
278 Villaggio Giuliano Benzina 1.699 1.694 1.697333 3 2.000000
280 Villaggio Olimpico Benzina 1.759 1.759 1.759000 1 0.000000
282 XX Settembre Benzina 1.879 1.879 1.879000 1 7.000000

142 rows × 7 columns

In [44]:
asc3_gasolio
Out[44]:
DEN_ASC3 descCarburante maxPrezzo minPrezzo avgPrezzo numImpianti avgDays
1 Acilia Sud Gasolio 1.644 1.589 1.599833 6 1.666667
3 Acqua Vergine Gasolio 1.609 1.599 1.604000 2 7.000000
5 Aeropoprto dell' Urbe Gasolio 1.669 1.649 1.659000 4 1.750000
7 Alessandrina Gasolio 1.649 1.534 1.597278 18 2.611111
9 Appia Antica Nord Gasolio 1.625 1.555 1.581333 6 4.166667
... ... ... ... ... ... ... ...
275 Vallerano Castel di Leva Gasolio 1.604 1.564 1.580875 8 1.750000
277 Villa Ada Gasolio 1.659 1.609 1.624000 4 3.750000
279 Villaggio Giuliano Gasolio 1.559 1.544 1.550667 3 2.000000
281 Villaggio Olimpico Gasolio 1.649 1.649 1.649000 1 0.000000
283 XX Settembre Gasolio 1.799 1.799 1.799000 1 7.000000

142 rows × 7 columns

Spatial join con dataset degli impianti¶

In [67]:
temp = temp.sjoin(grid[[h3_index,'geometry']],predicate='intersects')
del temp['index_right']

Analisi andamento prezzi e numero impianti per cella esagonale¶

In [68]:
g = temp.groupby([h3_index,'descCarburante'], as_index=False).agg(
    maxPrezzo = ('prezzo','max'),
    minPrezzo = ('prezzo','min'),
    avgPrezzo = ('prezzo','mean'),
    numImpianti = ('idImpianto','nunique'),
    avgDays = ('days','mean')
)

Riporto le analisi alla griglia iniziale¶

In [77]:
grid_adv = grid[[h3_index,'geometry']].merge(g, how='left', on=h3_index)

Visualizzazione dell'andamento dei prezzi su griglia esagonale¶

In [81]:
m = grid_adv[grid_adv['descCarburante']=='Benzina'].explore(column='avgPrezzo', cmap='YlOrRd', name='Benzina', show=True)
m = grid_adv[grid_adv['descCarburante']=='Gasolio'].explore(m=m, column='avgPrezzo', cmap='YlGnBu', name='Gasolio', show=False)
m = grid_adv[grid_adv['descCarburante'].isnull()].explore(m=m, color='grey', name='Vuote', show=True)
m = temp.explore(m=m,name='Impianti', show=False)
folium.LayerControl().add_to(m)
m
Out[81]:
Make this Notebook Trusted to load map: File -> Trust Notebook
In [82]:
m.save(f'/var/www/html/notebooks/carburanti_hex.html')

Analisi su scala comunale¶

In [ ]:
g = temp.groupby(['comune','descCarburante'], as_index=False).agg(
    maxPrezzo = ('prezzo','max'),
    minPrezzo = ('prezzo','min'),
    avgPrezzo = ('prezzo','mean'),
    numImpianti = ('idImpianto','nunique'),
    avgDays = ('days','mean')
)
comuni_temp = comuni.merge(g)
comuni_temp['data'] = data

Analisi della serie storica¶

In [35]:
# 25min

start = datetime.now()

print(f'Parametri selezione: ')
print(f'Comune: {comune_sel}')
print(f'Tipo carburante: {", ".join(carburanti_sel)}')
print(f'Tipo impianto esclusi: {", ".join(tipo_impianto_sel)}')

asc1_list = list()
asc2_list = list()
asc3_list = list()
grid_list = list()
comuni_list = list()

problems = list()

# Identifica tutti i file esistenti nello storico
file_list = glob(os.path.join(geo_path,'prezzo_alle_8_*.parquet'))
file_list.sort()

# Filtra i file più recenti dell'anno specificato
file_list = [filepath for filepath in file_list if os.path.basename(filepath).split('prezzo_alle_8_')[1].replace('.parquet','')[:4] > year_f]

tot = len(file_list)
for i,filepath in enumerate(file_list,start=1):
    fname = os.path.basename(filepath)
    # Estrae la data di comunicazione del prezzo
    data = fname.split('prezzo_alle_8_')[1].replace('.parquet','')
    print(f'Processa {fname}  - {data} ({i}/{tot})')    
    # Legge il file
    temp = gpd.read_parquet(filepath)
    # Imposta a stringa l'attributo isSelf
    temp['isSelf'] = temp['isSelf'].astype(str)
    # Filtra il dataset
    temp = temp[
        (temp['comune']==comune_sel)
        &(temp['descCarburante'].isin(carburanti_sel))
        &(~temp['Tipo Impianto'].isin(tipo_impianto_sel))
        ].copy()
    if temp.shape[0] == 0:
        print(f'Problema sui filtri: - {fname}')
        problems.append(fname)
        continue
    # # Assegna la data di estrazione alla colonna
    # temp['data'] = data
    # Estrae la data di comunicazione del prezzo
    temp['dayComu'] = pd.to_datetime(temp['dtComu'].str.split(' ').str[0],format='%d/%m/%Y').dt.strftime('%Y%m%d')
    # Ricalcola i giorni dall'ultima comunicazione (utilizzando come base la data di estrazione)
    temp['days'] = (datetime.strptime(data,'%Y%m%d') - pd.to_datetime(temp['dayComu'], format='%Y%m%d')).dt.days
    if 'index_right' in temp.columns:
        del temp['index_right']
    # Associa le informazioni delle zone ASC
    temp = temp.sjoin(asc1,predicate='intersects')
    del temp['index_right']
    temp = temp.sjoin(asc2,predicate='intersects')
    del temp['index_right']
    temp = temp.sjoin(asc3,predicate='intersects')
    del temp['index_right']
    # Seleziona gli impianti con self
    self_df = temp[temp['isSelf']=='1'].copy()
    self_ids = self_df['idImpianto'].unique()
    # Seleziona gli impianti con servito che non hanno self
    serv_df = temp[(temp['isSelf']=='0')&(~temp['idImpianto'].isin(self_ids))].copy()
    serv_ids = serv_df['idImpianto'].unique()
    # Concatena le due selezioni
    temp = pd.concat([self_df,serv_df], ignore_index=True)
    # Analisi numero di impianti e prezzo medio carburanti per zone ASC1-2-3
    g = temp.groupby(['DEN_ASC1','descCarburante'], as_index=False).agg(
        avgPrezzo = ('prezzo','mean'),
        numImpianti = ('idImpianto','nunique'),
        avgDays = ('days','mean')
    )
    asc1_temp = asc1.merge(g, how='left')
    asc1_temp['data'] = data
    g = temp.groupby(['DEN_ASC2','descCarburante'], as_index=False).agg(
        avgPrezzo = ('prezzo','mean'),
        numImpianti = ('idImpianto','nunique'),
        avgDays = ('days','mean')
    )
    asc2_temp = asc2.merge(g, how='left')
    asc2_temp['data'] = data
    g = temp.groupby(['DEN_ASC3','descCarburante'], as_index=False).agg(
        avgPrezzo = ('prezzo','mean'),
        numImpianti = ('idImpianto','nunique'),
        avgDays = ('days','mean')
    )
    asc3_temp = asc3.merge(g, how='left')
    asc3_temp['data'] = data
    # Analisi numero di impianti e prezzo medio carburanti su griglia esagonale
    temp = temp.sjoin(grid[[h3_index,'geometry']],predicate='intersects')
    del temp['index_right']
    g = temp.groupby([h3_index,'descCarburante'], as_index=False).agg(
        avgPrezzo = ('prezzo','mean'),
        numImpianti = ('idImpianto','nunique'),
        avgDays = ('days','mean')
    )
    grid_temp = grid[[h3_index,'geometry']].merge(g, how='left', on=h3_index)
    grid_temp['data'] = data

    g = temp.groupby(['comune','descCarburante'], as_index=False).agg(
        avgPrezzo = ('prezzo','mean'),
        numImpianti = ('idImpianto','nunique'),
        avgDays = ('days','mean')
    )
    comuni_temp = comuni.merge(g)
    comuni_temp['data'] = data

    asc1_list.append(asc1_temp)
    asc2_list.append(asc2_temp)
    asc3_list.append(asc3_temp)
    grid_list.append(grid_temp)
    comuni_list.append(comuni_temp)

print('Finalizza gli output')
asc1_h = pd.concat(asc1_list, ignore_index=True)
asc2_h = pd.concat(asc2_list, ignore_index=True)
asc3_h = pd.concat(asc3_list, ignore_index=True)
grid_h = pd.concat(grid_list, ignore_index=True)
comuni_h = pd.concat(comuni_list, ignore_index=True)

print(f'Problems: {len(problems)}')
print(f'Esecuzione: {str(datetime.now()-start).split(".")[0]}')
Parametri selezione: 
Comune: Roma
Tipo carburante: Benzina, Gasolio
Tipo impianto esclusi: Autostradale
Processa prezzo_alle_8_20240101.parquet  - 20240101 (1/274)
Processa prezzo_alle_8_20240102.parquet  - 20240102 (2/274)
Processa prezzo_alle_8_20240103.parquet  - 20240103 (3/274)
Processa prezzo_alle_8_20240104.parquet  - 20240104 (4/274)
Processa prezzo_alle_8_20240105.parquet  - 20240105 (5/274)
Processa prezzo_alle_8_20240106.parquet  - 20240106 (6/274)
Processa prezzo_alle_8_20240107.parquet  - 20240107 (7/274)
Processa prezzo_alle_8_20240108.parquet  - 20240108 (8/274)
Processa prezzo_alle_8_20240109.parquet  - 20240109 (9/274)
Processa prezzo_alle_8_20240110.parquet  - 20240110 (10/274)
Processa prezzo_alle_8_20240111.parquet  - 20240111 (11/274)
Processa prezzo_alle_8_20240112.parquet  - 20240112 (12/274)
Processa prezzo_alle_8_20240113.parquet  - 20240113 (13/274)
Processa prezzo_alle_8_20240114.parquet  - 20240114 (14/274)
Processa prezzo_alle_8_20240115.parquet  - 20240115 (15/274)
Processa prezzo_alle_8_20240116.parquet  - 20240116 (16/274)
Processa prezzo_alle_8_20240117.parquet  - 20240117 (17/274)
Processa prezzo_alle_8_20240118.parquet  - 20240118 (18/274)
Processa prezzo_alle_8_20240119.parquet  - 20240119 (19/274)
Processa prezzo_alle_8_20240120.parquet  - 20240120 (20/274)
Processa prezzo_alle_8_20240121.parquet  - 20240121 (21/274)
Processa prezzo_alle_8_20240122.parquet  - 20240122 (22/274)
Processa prezzo_alle_8_20240123.parquet  - 20240123 (23/274)
Processa prezzo_alle_8_20240124.parquet  - 20240124 (24/274)
Processa prezzo_alle_8_20240125.parquet  - 20240125 (25/274)
Processa prezzo_alle_8_20240126.parquet  - 20240126 (26/274)
Processa prezzo_alle_8_20240127.parquet  - 20240127 (27/274)
Processa prezzo_alle_8_20240128.parquet  - 20240128 (28/274)
Processa prezzo_alle_8_20240129.parquet  - 20240129 (29/274)
Processa prezzo_alle_8_20240130.parquet  - 20240130 (30/274)
Processa prezzo_alle_8_20240131.parquet  - 20240131 (31/274)
Processa prezzo_alle_8_20240201.parquet  - 20240201 (32/274)
Processa prezzo_alle_8_20240202.parquet  - 20240202 (33/274)
Processa prezzo_alle_8_20240203.parquet  - 20240203 (34/274)
Processa prezzo_alle_8_20240204.parquet  - 20240204 (35/274)
Processa prezzo_alle_8_20240205.parquet  - 20240205 (36/274)
Processa prezzo_alle_8_20240206.parquet  - 20240206 (37/274)
Processa prezzo_alle_8_20240207.parquet  - 20240207 (38/274)
Processa prezzo_alle_8_20240208.parquet  - 20240208 (39/274)
Processa prezzo_alle_8_20240209.parquet  - 20240209 (40/274)
Processa prezzo_alle_8_20240210.parquet  - 20240210 (41/274)
Processa prezzo_alle_8_20240211.parquet  - 20240211 (42/274)
Processa prezzo_alle_8_20240212.parquet  - 20240212 (43/274)
Processa prezzo_alle_8_20240213.parquet  - 20240213 (44/274)
Processa prezzo_alle_8_20240214.parquet  - 20240214 (45/274)
Processa prezzo_alle_8_20240215.parquet  - 20240215 (46/274)
Processa prezzo_alle_8_20240216.parquet  - 20240216 (47/274)
Processa prezzo_alle_8_20240217.parquet  - 20240217 (48/274)
Processa prezzo_alle_8_20240218.parquet  - 20240218 (49/274)
Processa prezzo_alle_8_20240219.parquet  - 20240219 (50/274)
Processa prezzo_alle_8_20240220.parquet  - 20240220 (51/274)
Processa prezzo_alle_8_20240221.parquet  - 20240221 (52/274)
Processa prezzo_alle_8_20240222.parquet  - 20240222 (53/274)
Processa prezzo_alle_8_20240223.parquet  - 20240223 (54/274)
Processa prezzo_alle_8_20240224.parquet  - 20240224 (55/274)
Processa prezzo_alle_8_20240225.parquet  - 20240225 (56/274)
Processa prezzo_alle_8_20240226.parquet  - 20240226 (57/274)
Processa prezzo_alle_8_20240227.parquet  - 20240227 (58/274)
Processa prezzo_alle_8_20240228.parquet  - 20240228 (59/274)
Processa prezzo_alle_8_20240229.parquet  - 20240229 (60/274)
Processa prezzo_alle_8_20240301.parquet  - 20240301 (61/274)
Processa prezzo_alle_8_20240302.parquet  - 20240302 (62/274)
Processa prezzo_alle_8_20240303.parquet  - 20240303 (63/274)
Processa prezzo_alle_8_20240304.parquet  - 20240304 (64/274)
Processa prezzo_alle_8_20240305.parquet  - 20240305 (65/274)
Processa prezzo_alle_8_20240306.parquet  - 20240306 (66/274)
Processa prezzo_alle_8_20240307.parquet  - 20240307 (67/274)
Processa prezzo_alle_8_20240308.parquet  - 20240308 (68/274)
Processa prezzo_alle_8_20240309.parquet  - 20240309 (69/274)
Processa prezzo_alle_8_20240310.parquet  - 20240310 (70/274)
Processa prezzo_alle_8_20240311.parquet  - 20240311 (71/274)
Processa prezzo_alle_8_20240312.parquet  - 20240312 (72/274)
Processa prezzo_alle_8_20240313.parquet  - 20240313 (73/274)
Processa prezzo_alle_8_20240314.parquet  - 20240314 (74/274)
Processa prezzo_alle_8_20240315.parquet  - 20240315 (75/274)
Processa prezzo_alle_8_20240316.parquet  - 20240316 (76/274)
Processa prezzo_alle_8_20240317.parquet  - 20240317 (77/274)
Processa prezzo_alle_8_20240318.parquet  - 20240318 (78/274)
Processa prezzo_alle_8_20240319.parquet  - 20240319 (79/274)
Processa prezzo_alle_8_20240320.parquet  - 20240320 (80/274)
Processa prezzo_alle_8_20240321.parquet  - 20240321 (81/274)
Processa prezzo_alle_8_20240322.parquet  - 20240322 (82/274)
Processa prezzo_alle_8_20240323.parquet  - 20240323 (83/274)
Processa prezzo_alle_8_20240324.parquet  - 20240324 (84/274)
Processa prezzo_alle_8_20240325.parquet  - 20240325 (85/274)
Processa prezzo_alle_8_20240326.parquet  - 20240326 (86/274)
Processa prezzo_alle_8_20240327.parquet  - 20240327 (87/274)
Processa prezzo_alle_8_20240328.parquet  - 20240328 (88/274)
Processa prezzo_alle_8_20240329.parquet  - 20240329 (89/274)
Processa prezzo_alle_8_20240330.parquet  - 20240330 (90/274)
Processa prezzo_alle_8_20240331.parquet  - 20240331 (91/274)
Processa prezzo_alle_8_20240401.parquet  - 20240401 (92/274)
Processa prezzo_alle_8_20240402.parquet  - 20240402 (93/274)
Processa prezzo_alle_8_20240403.parquet  - 20240403 (94/274)
Processa prezzo_alle_8_20240404.parquet  - 20240404 (95/274)
Processa prezzo_alle_8_20240405.parquet  - 20240405 (96/274)
Processa prezzo_alle_8_20240406.parquet  - 20240406 (97/274)
Processa prezzo_alle_8_20240407.parquet  - 20240407 (98/274)
Processa prezzo_alle_8_20240408.parquet  - 20240408 (99/274)
Processa prezzo_alle_8_20240409.parquet  - 20240409 (100/274)
Processa prezzo_alle_8_20240410.parquet  - 20240410 (101/274)
Processa prezzo_alle_8_20240411.parquet  - 20240411 (102/274)
Processa prezzo_alle_8_20240412.parquet  - 20240412 (103/274)
Processa prezzo_alle_8_20240413.parquet  - 20240413 (104/274)
Processa prezzo_alle_8_20240414.parquet  - 20240414 (105/274)
Processa prezzo_alle_8_20240415.parquet  - 20240415 (106/274)
Processa prezzo_alle_8_20240416.parquet  - 20240416 (107/274)
Processa prezzo_alle_8_20240417.parquet  - 20240417 (108/274)
Processa prezzo_alle_8_20240418.parquet  - 20240418 (109/274)
Processa prezzo_alle_8_20240419.parquet  - 20240419 (110/274)
Processa prezzo_alle_8_20240420.parquet  - 20240420 (111/274)
Processa prezzo_alle_8_20240421.parquet  - 20240421 (112/274)
Processa prezzo_alle_8_20240422.parquet  - 20240422 (113/274)
Processa prezzo_alle_8_20240423.parquet  - 20240423 (114/274)
Processa prezzo_alle_8_20240424.parquet  - 20240424 (115/274)
Processa prezzo_alle_8_20240425.parquet  - 20240425 (116/274)
Processa prezzo_alle_8_20240426.parquet  - 20240426 (117/274)
Processa prezzo_alle_8_20240427.parquet  - 20240427 (118/274)
Processa prezzo_alle_8_20240428.parquet  - 20240428 (119/274)
Processa prezzo_alle_8_20240429.parquet  - 20240429 (120/274)
Processa prezzo_alle_8_20240430.parquet  - 20240430 (121/274)
Processa prezzo_alle_8_20240501.parquet  - 20240501 (122/274)
Processa prezzo_alle_8_20240502.parquet  - 20240502 (123/274)
Processa prezzo_alle_8_20240503.parquet  - 20240503 (124/274)
Processa prezzo_alle_8_20240504.parquet  - 20240504 (125/274)
Processa prezzo_alle_8_20240505.parquet  - 20240505 (126/274)
Processa prezzo_alle_8_20240506.parquet  - 20240506 (127/274)
Processa prezzo_alle_8_20240507.parquet  - 20240507 (128/274)
Processa prezzo_alle_8_20240508.parquet  - 20240508 (129/274)
Processa prezzo_alle_8_20240509.parquet  - 20240509 (130/274)
Processa prezzo_alle_8_20240510.parquet  - 20240510 (131/274)
Processa prezzo_alle_8_20240511.parquet  - 20240511 (132/274)
Processa prezzo_alle_8_20240512.parquet  - 20240512 (133/274)
Processa prezzo_alle_8_20240513.parquet  - 20240513 (134/274)
Processa prezzo_alle_8_20240514.parquet  - 20240514 (135/274)
Processa prezzo_alle_8_20240515.parquet  - 20240515 (136/274)
Processa prezzo_alle_8_20240516.parquet  - 20240516 (137/274)
Processa prezzo_alle_8_20240517.parquet  - 20240517 (138/274)
Processa prezzo_alle_8_20240518.parquet  - 20240518 (139/274)
Processa prezzo_alle_8_20240519.parquet  - 20240519 (140/274)
Processa prezzo_alle_8_20240520.parquet  - 20240520 (141/274)
Processa prezzo_alle_8_20240521.parquet  - 20240521 (142/274)
Processa prezzo_alle_8_20240522.parquet  - 20240522 (143/274)
Processa prezzo_alle_8_20240523.parquet  - 20240523 (144/274)
Processa prezzo_alle_8_20240524.parquet  - 20240524 (145/274)
Processa prezzo_alle_8_20240525.parquet  - 20240525 (146/274)
Processa prezzo_alle_8_20240526.parquet  - 20240526 (147/274)
Processa prezzo_alle_8_20240527.parquet  - 20240527 (148/274)
Processa prezzo_alle_8_20240528.parquet  - 20240528 (149/274)
Processa prezzo_alle_8_20240529.parquet  - 20240529 (150/274)
Processa prezzo_alle_8_20240530.parquet  - 20240530 (151/274)
Processa prezzo_alle_8_20240531.parquet  - 20240531 (152/274)
Processa prezzo_alle_8_20240601.parquet  - 20240601 (153/274)
Processa prezzo_alle_8_20240602.parquet  - 20240602 (154/274)
Processa prezzo_alle_8_20240603.parquet  - 20240603 (155/274)
Processa prezzo_alle_8_20240604.parquet  - 20240604 (156/274)
Processa prezzo_alle_8_20240605.parquet  - 20240605 (157/274)
Processa prezzo_alle_8_20240606.parquet  - 20240606 (158/274)
Processa prezzo_alle_8_20240607.parquet  - 20240607 (159/274)
Processa prezzo_alle_8_20240608.parquet  - 20240608 (160/274)
Processa prezzo_alle_8_20240609.parquet  - 20240609 (161/274)
Processa prezzo_alle_8_20240610.parquet  - 20240610 (162/274)
Processa prezzo_alle_8_20240611.parquet  - 20240611 (163/274)
Processa prezzo_alle_8_20240612.parquet  - 20240612 (164/274)
Processa prezzo_alle_8_20240613.parquet  - 20240613 (165/274)
Processa prezzo_alle_8_20240614.parquet  - 20240614 (166/274)
Processa prezzo_alle_8_20240615.parquet  - 20240615 (167/274)
Processa prezzo_alle_8_20240616.parquet  - 20240616 (168/274)
Processa prezzo_alle_8_20240617.parquet  - 20240617 (169/274)
Processa prezzo_alle_8_20240618.parquet  - 20240618 (170/274)
Processa prezzo_alle_8_20240619.parquet  - 20240619 (171/274)
Processa prezzo_alle_8_20240620.parquet  - 20240620 (172/274)
Processa prezzo_alle_8_20240621.parquet  - 20240621 (173/274)
Processa prezzo_alle_8_20240622.parquet  - 20240622 (174/274)
Processa prezzo_alle_8_20240623.parquet  - 20240623 (175/274)
Processa prezzo_alle_8_20240624.parquet  - 20240624 (176/274)
Processa prezzo_alle_8_20240625.parquet  - 20240625 (177/274)
Processa prezzo_alle_8_20240626.parquet  - 20240626 (178/274)
Processa prezzo_alle_8_20240627.parquet  - 20240627 (179/274)
Processa prezzo_alle_8_20240628.parquet  - 20240628 (180/274)
Processa prezzo_alle_8_20240629.parquet  - 20240629 (181/274)
Processa prezzo_alle_8_20240630.parquet  - 20240630 (182/274)
Processa prezzo_alle_8_20240701.parquet  - 20240701 (183/274)
Processa prezzo_alle_8_20240702.parquet  - 20240702 (184/274)
Processa prezzo_alle_8_20240703.parquet  - 20240703 (185/274)
Processa prezzo_alle_8_20240704.parquet  - 20240704 (186/274)
Processa prezzo_alle_8_20240705.parquet  - 20240705 (187/274)
Processa prezzo_alle_8_20240706.parquet  - 20240706 (188/274)
Processa prezzo_alle_8_20240707.parquet  - 20240707 (189/274)
Processa prezzo_alle_8_20240708.parquet  - 20240708 (190/274)
Processa prezzo_alle_8_20240709.parquet  - 20240709 (191/274)
Processa prezzo_alle_8_20240710.parquet  - 20240710 (192/274)
Processa prezzo_alle_8_20240711.parquet  - 20240711 (193/274)
Processa prezzo_alle_8_20240712.parquet  - 20240712 (194/274)
Processa prezzo_alle_8_20240713.parquet  - 20240713 (195/274)
Processa prezzo_alle_8_20240714.parquet  - 20240714 (196/274)
Processa prezzo_alle_8_20240715.parquet  - 20240715 (197/274)
Processa prezzo_alle_8_20240716.parquet  - 20240716 (198/274)
Processa prezzo_alle_8_20240717.parquet  - 20240717 (199/274)
Processa prezzo_alle_8_20240718.parquet  - 20240718 (200/274)
Processa prezzo_alle_8_20240719.parquet  - 20240719 (201/274)
Processa prezzo_alle_8_20240720.parquet  - 20240720 (202/274)
Processa prezzo_alle_8_20240721.parquet  - 20240721 (203/274)
Processa prezzo_alle_8_20240722.parquet  - 20240722 (204/274)
Processa prezzo_alle_8_20240723.parquet  - 20240723 (205/274)
Processa prezzo_alle_8_20240724.parquet  - 20240724 (206/274)
Processa prezzo_alle_8_20240725.parquet  - 20240725 (207/274)
Processa prezzo_alle_8_20240726.parquet  - 20240726 (208/274)
Processa prezzo_alle_8_20240727.parquet  - 20240727 (209/274)
Processa prezzo_alle_8_20240728.parquet  - 20240728 (210/274)
Processa prezzo_alle_8_20240729.parquet  - 20240729 (211/274)
Processa prezzo_alle_8_20240730.parquet  - 20240730 (212/274)
Processa prezzo_alle_8_20240731.parquet  - 20240731 (213/274)
Processa prezzo_alle_8_20240801.parquet  - 20240801 (214/274)
Processa prezzo_alle_8_20240802.parquet  - 20240802 (215/274)
Processa prezzo_alle_8_20240803.parquet  - 20240803 (216/274)
Processa prezzo_alle_8_20240804.parquet  - 20240804 (217/274)
Processa prezzo_alle_8_20240805.parquet  - 20240805 (218/274)
Processa prezzo_alle_8_20240806.parquet  - 20240806 (219/274)
Processa prezzo_alle_8_20240807.parquet  - 20240807 (220/274)
Processa prezzo_alle_8_20240808.parquet  - 20240808 (221/274)
Processa prezzo_alle_8_20240809.parquet  - 20240809 (222/274)
Processa prezzo_alle_8_20240810.parquet  - 20240810 (223/274)
Processa prezzo_alle_8_20240811.parquet  - 20240811 (224/274)
Processa prezzo_alle_8_20240812.parquet  - 20240812 (225/274)
Processa prezzo_alle_8_20240813.parquet  - 20240813 (226/274)
Processa prezzo_alle_8_20240814.parquet  - 20240814 (227/274)
Processa prezzo_alle_8_20240815.parquet  - 20240815 (228/274)
Processa prezzo_alle_8_20240816.parquet  - 20240816 (229/274)
Processa prezzo_alle_8_20240817.parquet  - 20240817 (230/274)
Processa prezzo_alle_8_20240818.parquet  - 20240818 (231/274)
Processa prezzo_alle_8_20240819.parquet  - 20240819 (232/274)
Processa prezzo_alle_8_20240820.parquet  - 20240820 (233/274)
Processa prezzo_alle_8_20240821.parquet  - 20240821 (234/274)
Processa prezzo_alle_8_20240822.parquet  - 20240822 (235/274)
Processa prezzo_alle_8_20240823.parquet  - 20240823 (236/274)
Processa prezzo_alle_8_20240824.parquet  - 20240824 (237/274)
Processa prezzo_alle_8_20240825.parquet  - 20240825 (238/274)
Processa prezzo_alle_8_20240826.parquet  - 20240826 (239/274)
Processa prezzo_alle_8_20240827.parquet  - 20240827 (240/274)
Processa prezzo_alle_8_20240828.parquet  - 20240828 (241/274)
Processa prezzo_alle_8_20240829.parquet  - 20240829 (242/274)
Processa prezzo_alle_8_20240830.parquet  - 20240830 (243/274)
Processa prezzo_alle_8_20240831.parquet  - 20240831 (244/274)
Processa prezzo_alle_8_20240901.parquet  - 20240901 (245/274)
Processa prezzo_alle_8_20240902.parquet  - 20240902 (246/274)
Processa prezzo_alle_8_20240903.parquet  - 20240903 (247/274)
Processa prezzo_alle_8_20240904.parquet  - 20240904 (248/274)
Processa prezzo_alle_8_20240905.parquet  - 20240905 (249/274)
Processa prezzo_alle_8_20240906.parquet  - 20240906 (250/274)
Processa prezzo_alle_8_20240907.parquet  - 20240907 (251/274)
Processa prezzo_alle_8_20240908.parquet  - 20240908 (252/274)
Processa prezzo_alle_8_20240909.parquet  - 20240909 (253/274)
Processa prezzo_alle_8_20240910.parquet  - 20240910 (254/274)
Processa prezzo_alle_8_20240911.parquet  - 20240911 (255/274)
Processa prezzo_alle_8_20240912.parquet  - 20240912 (256/274)
Processa prezzo_alle_8_20240913.parquet  - 20240913 (257/274)
Processa prezzo_alle_8_20240914.parquet  - 20240914 (258/274)
Processa prezzo_alle_8_20240915.parquet  - 20240915 (259/274)
Processa prezzo_alle_8_20240916.parquet  - 20240916 (260/274)
Processa prezzo_alle_8_20240917.parquet  - 20240917 (261/274)
Processa prezzo_alle_8_20240918.parquet  - 20240918 (262/274)
Processa prezzo_alle_8_20240919.parquet  - 20240919 (263/274)
Processa prezzo_alle_8_20240920.parquet  - 20240920 (264/274)
Processa prezzo_alle_8_20240921.parquet  - 20240921 (265/274)
Processa prezzo_alle_8_20240922.parquet  - 20240922 (266/274)
Processa prezzo_alle_8_20240923.parquet  - 20240923 (267/274)
Processa prezzo_alle_8_20240924.parquet  - 20240924 (268/274)
Processa prezzo_alle_8_20240925.parquet  - 20240925 (269/274)
Processa prezzo_alle_8_20240926.parquet  - 20240926 (270/274)
Processa prezzo_alle_8_20240927.parquet  - 20240927 (271/274)
Processa prezzo_alle_8_20240928.parquet  - 20240928 (272/274)
Processa prezzo_alle_8_20240929.parquet  - 20240929 (273/274)
Processa prezzo_alle_8_20240930.parquet  - 20240930 (274/274)
Finalizza gli output
Problems: 0
Esecuzione: 0:05:23

Salvataggio degli andamenti prodotti¶

In [36]:
asc1_h.to_parquet(os.path.join(geo_path,'ANALYSIS','asc1_h_partial.parquet'))
asc2_h.to_parquet(os.path.join(geo_path,'ANALYSIS','asc2_h_partial.parquet'))
asc3_h.to_parquet(os.path.join(geo_path,'ANALYSIS','asc3_h_partial.parquet'))
grid_h.to_parquet(os.path.join(geo_path,'ANALYSIS','grid_h_partial.parquet'))
comuni_h.to_parquet(os.path.join(geo_path,'ANALYSIS','comuni_h_partial.parquet'))

Caricamento degli andamenti prodotti¶

In [ ]:
asc1_h = gpd.read_parquet(os.path.join(geo_path,'ANALYSIS','asc1_h_partial.parquet'))
asc2_h = gpd.read_parquet(os.path.join(geo_path,'ANALYSIS','asc2_h_partial.parquet'))
asc3_h = gpd.read_parquet(os.path.join(geo_path,'ANALYSIS','asc3_h_partial.parquet'))
grid_h = gpd.read_parquet(os.path.join(geo_path,'ANALYSIS','grid_h_partial.parquet'))
comuni_h = gpd.read_parquet(os.path.join(geo_path,'ANALYSIS','comuni_h_partial.parquet'))

Visualizzazione degli andamenti (Benzina)¶

In [41]:
asc3_h['data'] = pd.to_datetime(asc3_h['data'],format='%Y%m%d')
comuni_h['data'] = pd.to_datetime(comuni_h['data'],format='%Y%m%d')

fig = go.Figure()
zone = asc3_h['DEN_ASC3'].unique()
zone.sort()
for zona in zone:
    df = asc3_h.loc[
        (asc3_h['DEN_ASC3']==zona)
        &(asc3_h['descCarburante']=='Benzina')
        ].copy()
    fig.add_trace(go.Scatter(x=df['data'], y=df['avgPrezzo'], name=zona))
comuni = comuni_h['comune'].unique()
comuni.sort()
for comune in comuni:
    df = comuni_h[
        (comuni_h['comune']==comune)
        &(comuni_h['descCarburante']=='Benzina')
        ].copy()
    fig.add_trace(go.Scatter(x=df['data'], y=df['avgPrezzo'], name=comune))
fig.show()
In [ ]: