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