In [1]:
import os
import pyogrio
import folium
import pandas as pd
import plotly.graph_objects as go
import geopandas as gpd
In [2]:
pd.set_option('display.max_colwidth', 255)
Caratteristiche della popolazione¶
In [3]:
istat_path = os.path.join(os.path.expanduser('~'),'ILAB_DATA','ISTAT','DATA')
vecchiaia = pd.read_parquet(os.path.join(istat_path,'comuni_pop_age_italia.parquet'))
In [4]:
vecchiaia.shape
Out[4]:
(546060, 9)
In [5]:
vecchiaia.TIME_PERIOD.unique()
Out[5]:
array(['2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009',
'2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017',
'2018', '2019', '2020', '2021', '2022', '2023', '2024'],
dtype=object)
In [6]:
vecchiaia[vecchiaia['REF_AREA']=='058091']
Out[6]:
| REF_AREA | TIME_PERIOD | SEX | TOTAL | Y0-14 | Y15-64 | Y65-109 | EM | Y0 | |
|---|---|---|---|---|---|---|---|---|---|
| 326949 | 058091 | 2002 | females | 1347406 | 158482 | 899560 | 289364 | 44.529548 | 10472.0 |
| 326950 | 058091 | 2002 | males | 1198571 | 168118 | 832932 | 197521 | 41.215456 | 11268.0 |
| 326951 | 058091 | 2002 | total | 2545977 | 326600 | 1732492 | 486885 | 42.969371 | 21740.0 |
| 326952 | 058091 | 2003 | females | 1348121 | 160348 | 892191 | 295582 | 44.784015 | 11515.0 |
| 326953 | 058091 | 2003 | males | 1196694 | 170110 | 824796 | 201788 | 41.442162 | 12146.0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 327013 | 058091 | 2023 | males | 1308818 | 175975 | 864091 | 268752 | 44.681555 | 9074.0 |
| 327014 | 058091 | 2023 | total | 2755309 | 342239 | 1766329 | 646741 | 46.550928 | 17488.0 |
| 327015 | 058091 | 2024 | females | 1446173 | 162238 | 901172 | 382763 | 48.499402 | 7879.0 |
| 327016 | 058091 | 2024 | males | 1308546 | 171272 | 863772 | 273502 | 44.984758 | 8285.0 |
| 327017 | 058091 | 2024 | total | 2754719 | 333510 | 1764944 | 656265 | 46.829876 | 16164.0 |
69 rows × 9 columns
Report immigrati¶
In [7]:
ANNI = list(range(2017, 2024))
In [8]:
col_map = {
'perc_immigrati':'Immigrati',
'perc_non_immigrati':'Non immigrati',
'perc_totale_entrate':'Totale entrate',
}
In [9]:
def slider_plot(pivot, col,color=None, titolo=None):
fig = go.Figure()
for anno in ANNI:
# pivot.sort_values(by=anno, ascending=True, inplace=True)
fig.add_trace(go.Bar(name=anno, y=pivot[col], x=pivot[anno], orientation='h', text=pivot[anno],visible=False,marker_color=color))
fig.data[0].visible=True
# Create and add slider
steps = []
for i in range(len(fig.data)):
step = dict(
method="update",
args=[{"visible": [False] * len(fig.data)},
], # layout attribute
label=str(ANNI[i])
)
step["args"][0]["visible"][i] = True # Toggle i'th trace to "visible"
steps.append(step)
sliders = [dict(
active=0,
steps=steps
)]
fig.update_layout(title=titolo,sliders=sliders, autosize=False, width=1200, height=500)
fig.show()
I principali settori di impiego¶
In [10]:
df = pd.read_csv('migration/immigrati/OUT/TORINO_settore.csv', sep=';')
df['perc_numero_immigrati_in_entrata'] = df['perc_numero_immigrati_in_entrata'].round(1)
In [11]:
df.head()
Out[11]:
| settore | totale_entrate | numero_immigrati_in_entrata | loca | anno | cod | macro_settore | perc_numero_immigrati_in_entrata | |
|---|---|---|---|---|---|---|---|---|
| 0 | Industrie alimentari | 3210 | 1430 | Torino | 2017 | 02010101 | Industrie | 44.5 |
| 1 | Ind. tessili e dell'abbigliamento | 900 | 100 | Torino | 2017 | 02010201 | Industrie | 11.1 |
| 2 | Industrie del legno e del mobile | 720 | 20 | Torino | 2017 | 02010301 | Industrie | 2.8 |
| 3 | Industrie della carta e stampa | 700 | 60 | Torino | 2017 | 02010401 | Industrie | 8.6 |
| 4 | Ind. estrattive e lavorazione minerali | 100 | 0 | Torino | 2017 | 02010601 | Industrie | 0.0 |
(Slide 10)
In [12]:
g = df.groupby(by='anno', as_index=False).agg('sum')
In [13]:
g[['anno','totale_entrate','numero_immigrati_in_entrata']]
Out[13]:
| anno | totale_entrate | numero_immigrati_in_entrata | |
|---|---|---|---|
| 0 | 2017 | 148930 | 21870 |
| 1 | 2018 | 168790 | 22460 |
| 2 | 2019 | 166770 | 22390 |
| 3 | 2020 | 120290 | 15730 |
| 4 | 2021 | 167070 | 25490 |
| 5 | 2022 | 183230 | 33060 |
| 6 | 2023 | 189390 | 40120 |
In [14]:
fig = go.Figure(go.Bar(name='Numero immigrati', y=g['numero_immigrati_in_entrata'], x=g['anno'], text=g['numero_immigrati_in_entrata'], marker_color='indianred'))
fig.update_layout(title='ENTRATE PROGRAMMATE DALLE IMPRESE DI PERSONALE IMMIGRATO nella provincia di Torino')
fig.show()
In [ ]:
ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO NEI SETTORI DEI SERVIZI (valori percentuali, anni 2019-2023)¶
In [15]:
df_servizi = df[df['macro_settore']=='Servizi']
pivot = df_servizi.pivot(index='settore', columns='anno', values='perc_numero_immigrati_in_entrata').reset_index().sort_values([2023], ascending=[True])
(Slide 11a)
In [16]:
pivot.sort_values(by='settore')
Out[16]:
| anno | settore | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 |
|---|---|---|---|---|---|---|---|---|
| 0 | Commercio | 8.9 | 6.6 | 8.9 | 9.4 | 11.8 | 10.6 | 11.1 |
| 1 | Informatica e telecomunicazioni | 8.7 | 6.5 | 7.4 | 14.3 | 11.8 | 18.6 | 17.4 |
| 2 | Istruzione e servizi formativi | 8.8 | 9.6 | 9.8 | 9.5 | 15.9 | 10.5 | 21.7 |
| 3 | Media e comunicazione | 5.1 | 6.7 | 6.3 | 7.8 | 6.3 | 1.6 | 0.9 |
| 4 | Sanità e assistenza sociale | 19.8 | 23.7 | 23.9 | 20.5 | 17.0 | 25.9 | 28.0 |
| 5 | Servizi avanzati alle imprese | 15.9 | 7.1 | 4.8 | 3.8 | 8.4 | 5.4 | 11.6 |
| 6 | Servizi finanziari e assicurativi | 3.9 | 3.9 | 6.3 | 2.7 | 3.5 | 11.5 | 5.1 |
| 7 | Servizi operativi | 20.0 | 21.0 | 17.9 | 18.1 | 22.0 | 32.0 | 31.8 |
| 8 | Tempo libero e altri serv. alle persone | 11.1 | 12.3 | 11.1 | 11.8 | 10.5 | 8.6 | 9.6 |
| 9 | Trasporti e logistica | 27.0 | 22.8 | 29.2 | 24.2 | 36.4 | 36.9 | 43.9 |
| 10 | Turismo e ristorazione | 7.7 | 15.7 | 15.5 | 12.3 | 9.1 | 10.3 | 20.7 |
In [17]:
slider_plot(pivot, 'settore',titolo='ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO NEI SETTORI DEI SERVIZI provincia torino (valori percentuali, anni 2017-2023)')
ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO NEI SETTORI DELL’INDUSTRIA (valori percentuali, anni 2019-2023)¶
In [18]:
df_industrie = df[df['macro_settore']=='Industrie']
pivot = df_industrie.pivot(index='settore', columns='anno', values='perc_numero_immigrati_in_entrata').reset_index().sort_values([2023], ascending=[True])
(Slide 11b)
In [19]:
pivot.sort_values(by='settore')
Out[19]:
| anno | settore | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 |
|---|---|---|---|---|---|---|---|---|
| 0 | Altre industrie | 20.0 | 11.4 | 9.1 | 5.7 | 12.7 | 22.9 | 15.2 |
| 1 | Costruzioni | 14.8 | 9.9 | 11.8 | 11.0 | 15.1 | 23.8 | 23.3 |
| 2 | Ind. della gomma e della plastica | 10.6 | 8.4 | 19.3 | 17.4 | 21.1 | 19.8 | 24.1 |
| 3 | Ind. estrattive e lavorazione minerali | 0.0 | 3.5 | 13.4 | 19.0 | 10.9 | 17.2 | 40.6 |
| 4 | Ind. tessili e dell'abbigliamento | 11.1 | 22.2 | 7.7 | 8.8 | 3.8 | 7.2 | 11.1 |
| 5 | Industrie alimentari | 44.5 | 7.3 | 14.5 | 16.3 | 14.3 | 19.2 | 27.7 |
| 6 | Industrie dei metalli | 15.6 | 19.5 | 17.0 | 17.7 | 19.1 | 24.8 | 29.5 |
| 7 | Industrie del legno e del mobile | 2.8 | 10.1 | 17.2 | 10.5 | 4.2 | 13.2 | 13.9 |
| 8 | Industrie della carta e stampa | 8.6 | 5.6 | 10.3 | 3.6 | 5.7 | 17.1 | 14.0 |
| 9 | Industrie elettriche ed elettroniche | 4.2 | 6.9 | 7.7 | 8.4 | 6.4 | 9.4 | 14.4 |
| 10 | Industrie meccaniche | 8.0 | 10.4 | 6.8 | 7.1 | 14.9 | 16.4 | 16.0 |
| 11 | Public utilities | 6.1 | 3.7 | 5.6 | 6.7 | 13.5 | 21.0 | 26.3 |
In [20]:
slider_plot(pivot, 'settore',color='indianred',titolo='ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO NEI SETTORI DELL’INDUSTRIA (valori percentuali, anni 2017-2023)')
Differenze di genere e secondo la classe dimensionale d’impresa nella domanda di lavoratori immigrati¶
ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO NEI SETTORI PER GENERE (valori assoluti e percentuali, 2023)¶
In [21]:
df = pd.read_csv('migration/immigrati/OUT/TORINO_settore_sesso.csv', sep=';')
df['perc_figura_femminile'] = df['perc_figura_femminile'].round(1)
df['perc_figura_maschile'] = df['perc_figura_maschile'].round(1)
df['perc_indifferente'] = df['perc_indifferente'].round(1)
df = df.sort_values(['perc_figura_femminile','perc_figura_maschile'], ascending=[True, True])
In [22]:
fig = go.Figure()
for col in ['perc_figura_femminile', 'perc_figura_maschile', 'perc_indifferente']:
fig.add_trace(go.Bar(name=col, y=df['settore'], x=df[col], orientation='h'))#, text=df[col]))
fig.update_layout(barmode='stack', width=1100, height=700, xaxis={'visible': False},title='ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO NEI SETTORI PER GENERE (valori percentuali, 2023)')
fig.show()
DINAMICA DELLE ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO DI GENERE FEMMINILE (valori assoluti e percentuali, anni 2019-2023)¶
In [23]:
df = pd.read_csv('migration/immigrati/OUT/TORINO_settore_sesso_femminile.csv', sep=';')
Servizi¶
In [24]:
df_servizi = df[df['macro_settore']=='Servizi']
pivot = df_servizi.pivot(index='settore', columns='anno', values='figura_femminile').reset_index().sort_values([2023], ascending=[True])
In [25]:
slider_plot(pivot, 'settore',titolo='DINAMICA DELLE ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO DI GENERE FEMMINILE (valori assoluti, anni 2017-2023)')
Industrie¶
In [26]:
df_industrie = df[df['macro_settore']=='Industrie']
pivot = df_industrie.pivot(index='settore', columns='anno', values='figura_femminile').reset_index().sort_values([2023], ascending=[True])
In [27]:
slider_plot(pivot, 'settore',titolo='DINAMICA DELLE ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO DI GENERE FEMMINILE (valori assoluti, anni 2017-2023)')
I fabbisogni di personale immigrato per tipologia professionale e le difficoltà di reperimento¶
ENTRATE PROGRAMMATE PER NAZIONALITÀ E GRANDI GRUPPI PROFESSIONALI (valori percentuali, anni 2019-2023)¶
In [28]:
df = pd.read_csv('migration/immigrati/OUT/TORINO_macro_professione.csv', sep=';')
df['perc_immigrati'] = df['perc_immigrati'].round(1)
df['perc_non_immigrati'] = df['perc_non_immigrati'].round(1)
(Slide 12)
In [29]:
df
Out[29]:
| professione | totale_entrate | numero_immigrati_in_entrata | loca | anno | cod | numero_non_immigrati_in_entrata | perc_immigrati | perc_non_immigrati | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | Dirigenti | 360 | 10 | Torino | 2017 | 1 | 350 | 0.0 | 0.3 |
| 1 | Professioni intellettuali, scientifiche e di elevata specializzazione | 11350 | 900 | Torino | 2017 | 2 | 10450 | 4.1 | 8.2 |
| 2 | Professioni tecniche | 22810 | 1790 | Torino | 2017 | 3 | 21020 | 8.2 | 16.5 |
| 3 | Professioni esecutive nel lavoro d'ufficio | 17310 | 1960 | Torino | 2017 | 4 | 15350 | 9.0 | 12.1 |
| 4 | Professioni qualificate nelle attività commerciali e nei servizi | 31380 | 2950 | Torino | 2017 | 5 | 28430 | 13.5 | 22.4 |
| 5 | Artigiani, operai specializzati e agricoltori | 21790 | 3840 | Torino | 2017 | 6 | 17950 | 17.6 | 14.1 |
| 6 | Conduttori di impianti e operai di macchinari fissi e mobili | 20780 | 3410 | Torino | 2017 | 7 | 17370 | 15.6 | 13.7 |
| 7 | Professioni non qualificate | 23170 | 7000 | Torino | 2017 | 8 | 16170 | 32.0 | 12.7 |
| 8 | Dirigenti | 630 | 90 | Torino | 2018 | 1 | 540 | 0.4 | 0.4 |
| 9 | Professioni intellettuali, scientifiche e di elevata specializzazione | 14370 | 960 | Torino | 2018 | 2 | 13410 | 4.3 | 9.2 |
| 10 | Professioni tecniche | 26000 | 1980 | Torino | 2018 | 3 | 24020 | 8.8 | 16.4 |
| 11 | Professioni esecutive nel lavoro d'ufficio | 16940 | 850 | Torino | 2018 | 4 | 16090 | 3.8 | 11.0 |
| 12 | Professioni qualificate nelle attività commerciali e nei servizi | 37690 | 5160 | Torino | 2018 | 5 | 32530 | 23.0 | 22.2 |
| 13 | Artigiani, operai specializzati e agricoltori | 24130 | 3570 | Torino | 2018 | 6 | 20560 | 15.9 | 14.1 |
| 14 | Conduttori di impianti e operai di macchinari fissi e mobili | 24860 | 3360 | Torino | 2018 | 7 | 21500 | 15.0 | 14.7 |
| 15 | Professioni non qualificate | 24160 | 6490 | Torino | 2018 | 8 | 17670 | 28.9 | 12.1 |
| 16 | Dirigenti | 620 | 80 | Torino | 2019 | 1 | 540 | 0.4 | 0.4 |
| 17 | Professioni intellettuali, scientifiche e di elevata specializzazione | 15770 | 1200 | Torino | 2019 | 2 | 14570 | 5.4 | 10.1 |
| 18 | Professioni tecniche | 30840 | 2350 | Torino | 2019 | 3 | 28490 | 10.5 | 19.7 |
| 19 | Professioni esecutive nel lavoro d'ufficio | 18050 | 960 | Torino | 2019 | 4 | 17090 | 4.3 | 11.8 |
| 20 | Professioni qualificate nelle attività commerciali e nei servizi | 41110 | 6270 | Torino | 2019 | 5 | 34840 | 28.0 | 24.1 |
| 21 | Artigiani, operai specializzati e agricoltori | 20160 | 3450 | Torino | 2019 | 6 | 16710 | 15.4 | 11.6 |
| 22 | Conduttori di impianti e operai di macchinari fissi e mobili | 21480 | 4320 | Torino | 2019 | 7 | 17160 | 19.3 | 11.9 |
| 23 | Professioni non qualificate | 18730 | 3770 | Torino | 2019 | 8 | 14960 | 16.8 | 10.4 |
| 24 | Dirigenti | 250 | 10 | Torino | 2020 | 1 | 240 | 0.1 | 0.2 |
| 25 | Professioni intellettuali, scientifiche e di elevata specializzazione | 11180 | 810 | Torino | 2020 | 2 | 10370 | 5.2 | 9.9 |
| 26 | Professioni tecniche | 21370 | 1620 | Torino | 2020 | 3 | 19750 | 10.3 | 18.9 |
| 27 | Professioni esecutive nel lavoro d'ufficio | 11750 | 790 | Torino | 2020 | 4 | 10960 | 5.0 | 10.5 |
| 28 | Professioni qualificate nelle attività commerciali e nei servizi | 28890 | 4480 | Torino | 2020 | 5 | 24410 | 28.5 | 23.3 |
| 29 | Artigiani, operai specializzati e agricoltori | 15270 | 1950 | Torino | 2020 | 6 | 13320 | 12.4 | 12.7 |
| 30 | Conduttori di impianti e operai di macchinari fissi e mobili | 16410 | 3400 | Torino | 2020 | 7 | 13010 | 21.7 | 12.4 |
| 31 | Professioni non qualificate | 15180 | 2640 | Torino | 2020 | 8 | 12540 | 16.8 | 12.0 |
| 32 | Dirigenti | 530 | 40 | Torino | 2021 | 1 | 490 | 0.2 | 0.3 |
| 33 | Professioni intellettuali, scientifiche e di elevata specializzazione | 13880 | 1420 | Torino | 2021 | 2 | 12460 | 5.6 | 8.8 |
| 34 | Professioni tecniche | 27230 | 2480 | Torino | 2021 | 3 | 24750 | 9.7 | 17.5 |
| 35 | Professioni esecutive nel lavoro d'ufficio | 15400 | 950 | Torino | 2021 | 4 | 14450 | 3.7 | 10.2 |
| 36 | Professioni qualificate nelle attività commerciali e nei servizi | 41230 | 5160 | Torino | 2021 | 5 | 36070 | 20.3 | 25.5 |
| 37 | Artigiani, operai specializzati e agricoltori | 22790 | 4350 | Torino | 2021 | 6 | 18440 | 17.1 | 13.0 |
| 38 | Conduttori di impianti e operai di macchinari fissi e mobili | 26280 | 6820 | Torino | 2021 | 7 | 19460 | 26.8 | 13.7 |
| 39 | Professioni non qualificate | 19730 | 4240 | Torino | 2021 | 8 | 15490 | 16.7 | 10.9 |
| 40 | Dirigenti | 390 | 20 | Torino | 2022 | 1 | 370 | 0.1 | 0.2 |
| 41 | Professioni intellettuali, scientifiche e di elevata specializzazione | 16490 | 2190 | Torino | 2022 | 2 | 14300 | 6.6 | 9.5 |
| 42 | Professioni tecniche | 34420 | 3850 | Torino | 2022 | 3 | 30570 | 11.6 | 20.4 |
| 43 | Professioni esecutive nel lavoro d'ufficio | 17140 | 1330 | Torino | 2022 | 4 | 15810 | 4.0 | 10.5 |
| 44 | Professioni qualificate nelle attività commerciali e nei servizi | 37640 | 5580 | Torino | 2022 | 5 | 32060 | 16.9 | 21.4 |
| 45 | Artigiani, operai specializzati e agricoltori | 23890 | 5280 | Torino | 2022 | 6 | 18610 | 16.0 | 12.4 |
| 46 | Conduttori di impianti e operai di macchinari fissi e mobili | 24600 | 6640 | Torino | 2022 | 7 | 17960 | 20.1 | 12.0 |
| 47 | Professioni non qualificate | 28650 | 8180 | Torino | 2022 | 8 | 20470 | 24.7 | 13.6 |
| 48 | Dirigenti | 380 | 20 | Torino | 2023 | 1 | 360 | 0.0 | 0.2 |
| 49 | Professioni intellettuali, scientifiche e di elevata specializzazione | 15070 | 1690 | Torino | 2023 | 2 | 13380 | 4.2 | 9.0 |
| 50 | Professioni tecniche | 34180 | 5190 | Torino | 2023 | 3 | 28990 | 12.9 | 19.4 |
| 51 | Professioni esecutive nel lavoro d'ufficio | 20400 | 2860 | Torino | 2023 | 4 | 17540 | 7.1 | 11.7 |
| 52 | Professioni qualificate nelle attività commerciali e nei servizi | 42700 | 8270 | Torino | 2023 | 5 | 34430 | 20.6 | 23.1 |
| 53 | Artigiani, operai specializzati e agricoltori | 26990 | 6070 | Torino | 2023 | 6 | 20920 | 15.1 | 14.0 |
| 54 | Conduttori di impianti e operai di macchinari fissi e mobili | 21520 | 6750 | Torino | 2023 | 7 | 14770 | 16.8 | 9.9 |
| 55 | Professioni non qualificate | 28150 | 9260 | Torino | 2023 | 8 | 18890 | 23.1 | 12.7 |
In [30]:
fig = go.Figure()
for anno in ANNI:
bars = list()
temp = df[df['anno']==anno].copy()
temp.sort_values(by='professione', ascending=True, inplace=True)
fig.add_traces(go.Bar(name='Percentuale Immigrati',
y=temp['professione'],
x=temp['perc_immigrati'],
orientation='h',
text=temp['perc_immigrati'],
visible=False,
hoverinfo='skip',
#hovertemplate = '%{y}'
))
fig.add_traces(go.Bar(name='Percentuale Non Immigrati',
y=temp['professione'],
x=temp['perc_non_immigrati'],
orientation='h',
text=temp['perc_non_immigrati'],
visible=False,
hoverinfo='skip',
#hovertemplate = '%{y}'
))
fig.data[0].visible=True
fig.data[1].visible=True
# Create and add slider
steps = []
for i in range(0,len(fig.data),2):
step = dict(
method="update",
args=[{"visible": [False] * len(fig.data)},
], # layout attribute
label=str(ANNI[int(i/2)])
)
step["args"][0]["visible"][i] = True # Toggle i'th trace to "visible"
step["args"][0]["visible"][i+1] = True # Toggle i'th trace to "visible"
steps.append(step)
sliders = [dict(active=0,steps=steps)]
fig.update_layout(barmode='group',
sliders=sliders,
autosize=False,
width=1100,
height=600,
title='ENTRATE PROGRAMMATE PER NAZIONALITÀ E GRANDI GRUPPI PROFESSIONALI (valori percentuali, anni 2017-2023)',
hoverlabel=dict(
#bgcolor="white",
font_size=16,
#font_family="Rockwell"
)
)
fig.show()
In [ ]:
In [31]:
df23 = df[df['anno']==2023].copy()
df23.sort_values(by='perc_immigrati', inplace=True)
fig = go.Figure([go.Scatterpolar(name=col_map[el], r=df23[el], theta=df23['professione'], fill='toself') for el in ['perc_non_immigrati','perc_immigrati']])
fig.update_layout(title='ENTRATE PROGRAMMATE PER NAZIONALITÀ E GRANDI GRUPPI PROFESSIONALI (valori percentuali) - Anno 2023', polar={'radialaxis':{'visible':True, 'showticklabels':False}})
fig.show()
ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO PER GRANDI GRUPPI PROFESSIONALI (valori assoluti, anni 2019-2023)¶
In [32]:
df = pd.read_csv('migration/immigrati/OUT/TORINO_macro_professione.csv', sep=';')
pivot = df.pivot(index='professione', columns='anno', values='numero_immigrati_in_entrata').reset_index().sort_values([2023], ascending=[True])
In [33]:
professioni = df.professione.unique()
professioni.sort()
In [34]:
fig = go.Figure()
for professione in professioni:
provv = df[df['professione']==professione].copy()
fig.add_trace(go.Scatter(x=provv['anno'],y=provv['numero_immigrati_in_entrata'], name=professione))
fig.update_layout(title='Provincia di Torino - Andamento negli anni dei lavoratori immigrati per grandi gruppi professionali')
fig.show()
In [35]:
fig = go.Figure()
for professione in professioni:
provv = df[df['professione']==professione].copy()
fig.add_trace(go.Scatter(x=provv['anno'],y=provv['perc_immigrati'], name=professione))
fig.update_layout(title='Provincia di Torino - Andamento negli anni dei lavoratori immigrati per grandi gruppi professionali sul totale di lavoratori immigrati')
fig.show()
In [36]:
slider_plot(pivot,'professione',titolo='ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO PER GRANDI GRUPPI PROFESSIONALI (valori assoluti, anni 2017-2023)')
ENTRATE PROGRAMMATE RITENUTE DI DIFFICILE REPERIMENTO SECONDO LA CITTADINANZA (valori percentuali, anni 2019-2023)¶
In [37]:
df = pd.read_csv('migration/immigrati/OUT/TORINO_reperimento.csv', sep=';')
df['perc_immigrati'] = df['perc_immigrati'].round(1)
df['perc_non_immigrati'] = df['perc_non_immigrati'].round(1)
(Slide 6)
In [38]:
df[['perc_non_immigrati','perc_immigrati','anno']]
Out[38]:
| perc_non_immigrati | perc_immigrati | anno | |
|---|---|---|---|
| 0 | 20.8 | 30.6 | 2017 |
| 1 | 27.2 | 27.8 | 2018 |
| 2 | 25.4 | 30.8 | 2019 |
| 3 | 30.3 | 32.0 | 2020 |
| 4 | 31.3 | 38.0 | 2021 |
| 5 | 41.0 | 47.1 | 2022 |
| 6 | 43.4 | 51.5 | 2023 |
In [39]:
fig = go.Figure([go.Bar(name=col_map[el], x=df['anno'], y=df[el], text=df[el]) for el in ['perc_immigrati', 'perc_non_immigrati']])
fig.update_layout(barmode='group',title='ENTRATE PROGRAMMATE RITENUTE DI DIFFICILE REPERIMENTO SECONDO LA CITTADINANZA (valori percentuali, anni 2017-2023)')
fig.show()
ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO RITENUTE DI DIFFICILE REPERIMENTO PER GRANDI GRUPPI PROFESSIONALI (valori percentuali, anni 2019-2023)¶
In [40]:
df = pd.read_csv('migration/immigrati/OUT/TORINO_macro_professione_reperimento.csv', sep=';')
df['perc_difficile_da_reperire'] = df['perc_difficile_da_reperire'].round(1)
In [41]:
pivot = df.pivot(index='professione', columns='anno', values='perc_difficile_da_reperire').reset_index().sort_values([2023], ascending=[True])
In [42]:
slider_plot(pivot,'professione',titolo='ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO RITENUTE DI DIFFICILE REPERIMENTO PER GRANDI GRUPPI PROFESSIONALI (valori percentuali, anni 2017-2023)')
I titoli di studio e la formazione richiesta al personale immigrato in entrata¶
In [43]:
df = pd.read_csv('migration/immigrati/OUT/TORINO_titolo_studio.csv', sep=';')
df['perc_immigrati'] = df['perc_immigrati'].round(1)
df['perc_totale_entrate'] = df['perc_totale_entrate'].round(1)
ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO PER LIVELLI DI ISTRUZIONE (valori percentuali, anni 2019-2023)¶
In [44]:
pivot = df.pivot(index='titolo_studio', columns='anno', values='perc_immigrati').reset_index().sort_values(by=2023, ascending=True)
pivot = pivot[pivot['titolo_studio']!='Istruzione tecnica superiore (ITS)'].copy()
In [45]:
fig = go.Figure([go.Bar(name=anno, x=pivot['titolo_studio'], y=pivot[anno], orientation='v', text=pivot[anno]) for anno in ANNI])
fig.update_layout(barmode='group', title='ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO PER LIVELLI DI ISTRUZIONE (valori percentuali, anni 2017-2023)')#, autosize=False, width=1100, height=800)
fig.update_traces(textposition='outside', textfont_size=10)
fig.show()
ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO PER LIVELLI DI ISTRUZIONE (valori assoluti, 2023)¶
In [46]:
df23 = df[df['anno']==2023]
fig = go.Figure([go.Bar(y=df23['titolo_studio'], x=df23['numero_immigrati_in_entrata'], orientation='h', text=df23['numero_immigrati_in_entrata'])])
fig.update_layout(title='ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO PER LIVELLI DI ISTRUZIONE (valori assoluti, 2023)')#, autosize=False, width=1100, height=800)
fig.show()
ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO E NEL COMPLESSO PER LIVELLI DI ISTRUZIONE (valori percentuali, 2023)¶
In [47]:
fig = go.Figure([go.Bar(name=el, y=df23['titolo_studio'], x=df23[el], orientation='h', text=df23[el]) for el in ['perc_immigrati','perc_totale_entrate']])
fig.update_layout(barmode='group',title='ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO E NEL COMPLESSO PER LIVELLI DI ISTRUZIONE (valori percentuali, 2023)')#, autosize=False, width=1100, height=800)
fig.update_traces(textposition='outside', textfont_size=10)
fig.show()
In [48]:
fig = go.Figure([go.Scatterpolar(name=col_map[el], r=df23[el], theta=df23['titolo_studio'], fill='toself') for el in ['perc_totale_entrate','perc_immigrati']])
fig.update_layout(title='ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO E NEL COMPLESSO PER LE QUALI SONO RICHIESTE COMPETENZE CON LIVELLO DI IMPORTANZA MEDIO-ALTA O ALTA (valori percentuali, 2023)', polar={'radialaxis':{'visible':True, 'showticklabels':False}})
fig.show()
Le competenze ricercate dalle imprese¶
ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO E NEL COMPLESSO PER LE QUALI SONO RICHIESTE COMPETENZE CON LIVELLO DI IMPORTANZA MEDIO-ALTO O ALTO (valori percentuali, 2023)¶
In [49]:
df = pd.read_csv('migration/immigrati/OUT/TORINO_competenza.csv', sep=';')
df['perc_immigrati'] = df['perc_immigrati'].round(1)
df['perc_totale_entrate'] = df['perc_totale_entrate'].round(1)
df.sort_values(by='perc_immigrati', ascending=True, inplace=True)
In [50]:
fig = go.Figure([go.Bar(name=col_map[el], y=df['competenza_medioalta_alta'], x=df[el], orientation='h', text=df[el]) for el in ['perc_immigrati','perc_totale_entrate']])
fig.update_layout(barmode='group', title='ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO E NEL COMPLESSO PER LE QUALI SONO RICHIESTE COMPETENZE CON LIVELLO DI IMPORTANZA MEDIO-ALTO O ALTO (valori percentuali, 2023)')#, autosize=False, width=1100, height=800)
fig.update_traces(textposition='outside', textfont_size=10)
fig.show()
ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO E NEL COMPLESSO PER LE QUALI SONO RICHIESTE COMPETENZE CON LIVELLO DI IMPORTANZA MEDIO-ALTA O ALTA PER GRANDI GRUPPI PROFESSIONALI (valori percentuali, 2023)¶
In [51]:
fig = go.Figure([go.Scatterpolar(name=col_map[el], r=df[el], theta=df['competenza_medioalta_alta'], fill='toself') for el in ['perc_totale_entrate','perc_immigrati']])
fig.update_layout(title='ENTRATE PROGRAMMATE DI PERSONALE IMMIGRATO E NEL COMPLESSO PER LE QUALI SONO RICHIESTE COMPETENZE CON LIVELLO DI IMPORTANZA MEDIO-ALTA O ALTA (valori percentuali, 2023)', polar={'radialaxis':{'visible':True, 'showticklabels':False}})
fig.show()
In [ ]:
Fabbisogni nel periodo 2024-2028¶
In [52]:
data_path = 'migration/fabbisogni'
Fabbisogni nazionali¶
Stock di occupati totali¶
Macro settori¶
(Slide 2)
In [53]:
df = pd.read_csv(os.path.join(data_path,'01_2M_occupati_totali.csv'), sep=';')
df.rename(columns={'Occupati 2023_x': 'Occupati 2023'}, inplace=True)
df = df.groupby(['Macro Settore'], as_index=False).agg('sum').sort_values(by='Macro Settore', ascending=False).copy()
fig = go.Figure()
colors = [None,'green','indianred']
for i,col in enumerate(['Occupati 2023', 'Occupati 2028 POS', 'Occupati 2028 NEG']):
fig.add_trace(go.Bar(name=col, y=df['Macro Settore'], x=df[col], orientation='h', marker_color=colors[i]))#, text=df[col]))
In [54]:
df[['Macro Settore','Occupati 2023','Occupati 2028 POS','Occupati 2028 NEG']]
Out[54]:
| Macro Settore | Occupati 2023 | Occupati 2028 POS | Occupati 2028 NEG | |
|---|---|---|---|---|
| 2 | Servizi | 17459700 | 18133400 | 17753400 |
| 1 | Industria | 6175400 | 6306200 | 6168300 |
| 0 | Agricoltura, silvicoltura e pesca | 870100 | 788100 | 767800 |
In [55]:
fig.update_layout(barmode='group', width=1100, title=f'Stock di occupati per macro settore di attività per gli anni 2023 e 2028')#, xaxis={'visible': False}
fig.show()
In [56]:
df = pd.read_csv(os.path.join(data_path,'01_2M_occupati_totali.csv'), sep=';')
df['Occupati 2028 POS diff'] = df['Occupati 2028 POS'] - df['Occupati 2023_x']
df['Occupati 2028 NEG diff'] = df['Occupati 2028 NEG'] - df['Occupati 2023_x']
df = df.groupby(['Macro Settore'], as_index=False).agg('sum').sort_values(by='Macro Settore', ascending=False).copy()
fig = go.Figure()
colors = ['indianred', 'green']
for i, col in enumerate(['Occupati 2028 NEG diff', 'Occupati 2028 POS diff']):
fig.add_trace(go.Bar(name=col, y=df['Macro Settore'], x=df[col], orientation='h', marker_color=colors[i]))#, text=df[col]))
fig.update_layout(barmode='group', width=1100, title=f'Stock di occupati per macro settore di attività per gli anni 2023 e 2028')#, xaxis={'visible': False}
fig.show()
Micro settori¶
In [57]:
df = pd.read_csv(os.path.join(data_path,'01_2M_occupati_totali.csv'), sep=';')
df.rename(columns={'Occupati 2023_x': 'Occupati 2023'}, inplace=True)
for ms in ['Industria', 'Servizi']:
provv = df[df['Macro Settore']==ms].sort_values(by='Occupati 2028 POS').copy()
fig = go.Figure()
colors = [None, 'indianred', 'green']
for i,col in enumerate(['Occupati 2023', 'Occupati 2028 NEG', 'Occupati 2028 POS']):
fig.add_trace(go.Bar(name=col, y=provv['Settore'], x=provv[col], orientation='h', marker_color=colors[i]))#, text=df[col]))
fig.update_layout(barmode='group', width=1100, height=700, title=f'Stock di occupati per settore di attività per gli anni 2023 e 2028 - {ms}')#, xaxis={'visible': False}
fig.show()
Proporzione rispetto agli occupati al 2023
In [58]:
df = pd.read_csv(os.path.join(data_path,'01_2M_occupati_totali.csv'), sep=';')
df['Occupati 2028 POS diff'] = df['Occupati 2028 POS'] - df['Occupati 2023_x']
df['Occupati 2028 NEG diff'] = df['Occupati 2028 NEG'] - df['Occupati 2023_x']
for ms in ['Industria', 'Servizi']:
provv = df[df['Macro Settore'] == ms].sort_values(by='Occupati 2028 POS diff').copy()
fig = go.Figure()
colors = ['indianred', 'green']
for i, col in enumerate(['Occupati 2028 NEG diff', 'Occupati 2028 POS diff']):
fig.add_trace(go.Bar(name=col, y=provv['Settore'], x=provv[col], orientation='h', marker_color=colors[i]))#, text=df[col]))
fig.update_layout(barmode='group', width=1100, height=700, title=f'Stock di occupati per settore di attività per gli anni 2023 e 2028 - {ms}')#, xaxis={'visible': False}
fig.show()
Fabbisogni TOTALI previsti nel periodo 2024-2028 per settore economico¶
In [59]:
df = pd.read_csv(os.path.join(data_path,'02_2M_settore_economico.csv'), sep=';')
df.rename(columns={'Occupati 2023_x': 'Occupati 2023'}, inplace=True)
df = df.groupby(['Macro Settore'], as_index=False).agg('sum').sort_values(by='Macro Settore', ascending=False).copy()
fig = go.Figure()
# colors = [None,'green','indianred']
for i,col in enumerate(['Replacement POS', 'Expansion POS']):#, 'Fabbisogni POS'
fig.add_trace(go.Bar(name=col, y=df['Macro Settore'], x=df[col], orientation='h'))#, marker_color=colors[i]))#, text=df[col]))
fig.update_layout(barmode='stack', width=1100, title=f'Stock di occupati per macro settore di attività per gli anni 2023 e 2028')#, xaxis={'visible': False}
fig.show()
In [60]:
# df = pd.read_csv(os.path.join(data_path,'02_2M_settore_economico.csv'), sep=';')
# #df = df[df['Macro Settore']=='Servizi'].copy()
# for ms in df['Macro Settore'].unique():
# provv = df[df['Macro Settore'] == ms].copy()
# colors = [None,'green','indianred']
# scenari = ['POS','NEG']
# for scenario in scenari:
# fig = go.Figure()
# provv.sort_values(by=f'Fabbisogni {scenario}', ascending=True, inplace=True)
# for i,col in enumerate([f'Replacement {scenario}',f'Expansion {scenario}']):
# fig.add_trace(go.Bar(name=col, y=provv['Settore'], x=provv[col], orientation='h',marker_color=colors[i]))#, text=df[col]))
# fig.update_layout(barmode='relative', width=1100, height=700, xaxis={'visible': False},title=f'Fabbisogni TOTALI previsti nel periodo 2024-2028 per settore economico - {ms}')
# fig.show()
In [61]:
df = pd.read_csv(os.path.join(data_path,'02_2M_settore_economico.csv'), sep=';')
for ms in df['Macro Settore'].unique():
fig = go.Figure()
provv = df[df['Macro Settore'] == ms].sort_values(by=f'Fabbisogni POS', ascending=True).copy()
colors = {
'NEG': 'indianred',
'POS': 'green',
}
for scenario in colors:
fig.add_trace(go.Bar(name=f'Fabbisogni {scenario}', y=provv['Settore'], x=provv[f'Fabbisogni {scenario}'], orientation='h',marker_color=colors[scenario]))#, text=df[col]))
fig.update_layout(barmode='group', width=1100, height=700, xaxis={'visible': False},title=f'Fabbisogni TOTALI previsti nel periodo 2024-2028 per settore economico - {ms}')
fig.show()
Fabbisogni TOTALI previsti nel periodo 2024-2028 per grande gruppo professionale¶
In [62]:
df = pd.read_csv(os.path.join(data_path,'06_2M_fab_gruppi_prof.csv'), sep=';')
df.sort_values(by='Fabbisogni - 2024-2028 POS', ascending=True, inplace=True)
fig = go.Figure()
colors = {
'NEG': 'indianred',
'POS': 'green',
}
for scenario in colors:
fig.add_trace(go.Bar(name=f'Fabbisogni - 2024-2028 {scenario}', y=df['Gruppo Professionale'], x=df[f'Fabbisogni - 2024-2028 {scenario}'], orientation='h',marker_color=colors[scenario]))#, text=df[col]))
fig.update_layout(barmode='group', width=1100, height=700, xaxis={'visible': False},title=f'Fabbisogni TOTALI previsti nel periodo 2024-2028 per grande gruppo professionale')
fig.show()
Fabbisogni TOTALI previsti nel periodo 2024-2028 per livello di studio¶
In [63]:
df = pd.read_csv(os.path.join(data_path,'07_2M_fab_livello_studio.csv'), sep=';')
df.sort_values(by='Fabbisogni - 2024-2028 POS', ascending=True, inplace=True)
fig = go.Figure()
colors = {
'NEG': 'indianred',
'POS': 'green',
}
for scenario in colors:
fig.add_trace(go.Bar(name=f'Fabbisogni - 2024-2028 {scenario}', y=df['Livello di Istruzione'], x=df[f'Fabbisogni - 2024-2028 {scenario}'], orientation='h',marker_color=colors[scenario]))#, text=df[col]))
fig.update_layout(barmode='group', width=1100, height=700, xaxis={'visible': False},title=f'Fabbisogni TOTALI previsti nel periodo 2024-2028 per livello di studio')
fig.show()
Fabbisogni TOTALI previsti nel periodo 2024-2028 secondo la classificazione ISTAT 2 DIGIT¶
In [64]:
df
Out[64]:
| Livello di Istruzione | Fabbisogni - 2024-2028 POS | Fabbisogni - 2024-2028 NEG | |
|---|---|---|---|
| 1 | Formazione secondaria di secondo grado (licei) | 145100 | 119900 |
| 3 | Formazione inferiore al secondo ciclo di istruzione | 432500 | 342100 |
| 0 | Formazione terziaria (universitaria, ITS professionalizzante e AFAM) | 1354500 | 1248700 |
| 2 | Formazione secondaria di secondo grado (tecnico-professionale) | 1688000 | 1445900 |
In [65]:
df = pd.read_csv(os.path.join(data_path,'08_2M_fab_prof_istat.csv'), sep=';')
lista = df['Classificazione ISTAT (1 digit)'].unique()
lista.sort()
for ms in lista:
fig = go.Figure()
provv = df[df['Classificazione ISTAT (1 digit)'] == ms].sort_values(by=f'Fabbisogni - 2024-2028 POS', ascending=True).copy()
colors = {
'NEG': 'indianred',
'POS': 'green',
}
for scenario in colors:
fig.add_trace(go.Bar(name=f'Fabbisogni - 2024-2028 {scenario}', y=provv['Classificazione ISTAT (2 digit)'], x=provv[f'Fabbisogni - 2024-2028 {scenario}'], orientation='h',marker_color=colors[scenario]))#, text=df[col]))
fig.update_layout(barmode='group', width=1100, height=700, xaxis={'visible': False},title=f'Fabbisogni TOTALI previsti nel periodo 2024-2028 secondo la classificazione ISTAT - {ms}')
fig.show()
Fabbisogni TOTALI previsti nel periodo 2024-2028 per indirizzo di studio¶
In [66]:
df = pd.read_csv(os.path.join(data_path,'09_2M_fab_indirizzo_studio.csv'), sep=';')
df.head(3)
Out[66]:
| Indirizzo di Studio | Tipo Studio | Tipo Indirizzo | Fabbisogni - 2024-2028 POS | Fabbisogni - 2024-2028 NEG | |
|---|---|---|---|---|---|
| 0 | Indirizzo ingegneria civile ed architettura | Università | ISTRUZIONE TERZIARIA | 61000 | 56300 |
| 1 | Indirizzo ingegneria (escl. ingegneria civile) | Università | ISTRUZIONE TERZIARIA | 157300 | 139900 |
| 2 | Indirizzo statistico | Università | ISTRUZIONE TERZIARIA | 8500 | 7600 |
In [67]:
df = pd.read_csv(os.path.join(data_path,'09_2M_fab_indirizzo_studio.csv'), sep=';')
lista = df['Tipo Studio'].unique()
lista.sort()
for ms in lista:
fig = go.Figure()
provv = df[df['Tipo Studio'] == ms].sort_values(by=f'Fabbisogni - 2024-2028 POS', ascending=True).copy()
colors = {
'NEG': 'indianred',
'POS': 'green',
}
for scenario in colors:
fig.add_trace(go.Bar(name=f'Fabbisogni - 2024-2028 {scenario}', y=provv['Indirizzo di Studio'], x=provv[f'Fabbisogni - 2024-2028 {scenario}'], orientation='h',marker_color=colors[scenario]))#, text=df[col]))
fig.update_layout(barmode='group', width=1100, height=700, xaxis={'visible': False}, title=f'Fabbisogni TOTALI previsti nel periodo 2024-2028 per indirizzo di studio - {ms}')
fig.show()
Fabbisogni regionali (scenario positivo)¶
In [68]:
regioni = pyogrio.read_dataframe(os.path.join(data_path,'Reg01012024','Reg01012024_WGS84.shp'))
regioni['DEN_REG'] = regioni['DEN_REG'].str.replace('-',' ')
regioni['geometry'] = regioni['geometry'].simplify(1000)
piemonte_valledaosta = regioni[regioni['DEN_REG'].isin(['Piemonte',"Valle d'Aosta"])].copy()
altro = regioni[~regioni['DEN_REG'].isin(['Piemonte',"Valle d'Aosta"])].copy()
piemonte_valledaosta = piemonte_valledaosta.dissolve()
piemonte_valledaosta['DEN_REG'] = "Piemonte e Valle d'Aosta"
regioni = pd.concat([piemonte_valledaosta,altro])
In [69]:
df = pd.read_csv(os.path.join(data_path,'T1a_macro_settore_economico.csv'), sep=';')
g = df.groupby('Regione', as_index=False)['v.a.'].sum()
g = regioni[['DEN_REG','geometry']].merge(g, left_on='DEN_REG', right_on='Regione')
del g['DEN_REG']
g.rename(columns={'v.a.':'Fabbisogni'}, inplace=True)
(Slide 3)
In [70]:
g[['Regione','Fabbisogni']].sort_values(by='Regione')
Out[70]:
| Regione | Fabbisogni | |
|---|---|---|
| 11 | Abruzzo | 83100.0 |
| 15 | Basilicata | 23400.0 |
| 16 | Calabria | 87600.0 |
| 13 | Campania | 319500.0 |
| 6 | Emilia Romagna | 306200.0 |
| 4 | Friuli Venezia Giulia | 75000.0 |
| 10 | Lazio | 356600.0 |
| 5 | Liguria | 93800.0 |
| 1 | Lombardia | 669000.0 |
| 9 | Marche | 84900.0 |
| 12 | Molise | 17200.0 |
| 0 | Piemonte e Valle d'Aosta | 247500.0 |
| 14 | Puglia | 218600.0 |
| 18 | Sardegna | 96300.0 |
| 17 | Sicilia | 259300.0 |
| 7 | Toscana | 244800.0 |
| 2 | Trentino Alto Adige | 98500.0 |
| 8 | Umbria | 51000.0 |
| 3 | Veneto | 301700.0 |
In [71]:
g.explore(column='Fabbisogni', cmap='YlOrBr')
Out[71]:
Make this Notebook Trusted to load map: File -> Trust Notebook
Fabbisogni regionali per macro settore economico¶
In [72]:
df = pd.read_csv(os.path.join(data_path,'T1a_macro_settore_economico.csv'), sep=';')
df['Macro_settore_economico'] = df['Macro_settore_economico'].str.replace('\n',' ')
df = regioni[['DEN_REG','geometry']].merge(df, left_on='DEN_REG', right_on='Regione')
lista = df['Macro_settore_economico'].unique()
lista.sort()
for i,ms in enumerate(lista):
provv = df[df['Macro_settore_economico']==ms].copy()
if i == 0:
m = provv.explore(column='v.a.', name=ms, show=True)
else:
m = provv.explore(m=m, column='v.a.', name=ms,show=False)
folium.LayerControl().add_to(m)
m
Out[72]:
Make this Notebook Trusted to load map: File -> Trust Notebook
Fabbisogni regionali per grandi gruppi professionali¶
In [73]:
df = pd.read_csv(os.path.join(data_path,'T1b_grandi_gruppi_professionali.csv'), sep=';')
df['Grandi gruppi professionali'] = df['Grandi gruppi professionali'].str.split(' ').str[-1]
df = regioni[['DEN_REG','geometry']].merge(df, left_on='DEN_REG', right_on='Regione')
lista = df['Grandi gruppi professionali'].unique()
lista.sort()
for i,ms in enumerate(lista):
provv = df[df['Grandi gruppi professionali']==ms].copy()
if i == 0:
m = provv.explore(column='v.a.', name=ms, show=True)
else:
m = provv.explore(m=m, column='v.a.', name=ms,show=False)
folium.LayerControl().add_to(m)
m
Out[73]:
Make this Notebook Trusted to load map: File -> Trust Notebook
Fabbisogni regionali per livelli di istruzione¶
In [74]:
df = pd.read_csv(os.path.join(data_path,'T1c_livelli_di_istruzione.csv'), sep=';')
df = regioni[['DEN_REG','geometry']].merge(df, left_on='DEN_REG', right_on='Regione')
lista = df['Livelli di istruzione'].unique()
lista.sort()
for i,ms in enumerate(lista):
provv = df[df['Livelli di istruzione']==ms].copy()
if i == 0:
m = provv.explore(column='v.a.', name=ms, show=True)
else:
m = provv.explore(m=m, column='v.a.', name=ms,show=False)
folium.LayerControl().add_to(m)
m
Out[74]:
Make this Notebook Trusted to load map: File -> Trust Notebook
Fabbisogni regionali per principali professioni¶
In [75]:
df = pd.read_csv(os.path.join(data_path,'T2_principali_professioni.csv'), sep=';')
df = regioni[['DEN_REG','geometry']].merge(df, left_on='DEN_REG', right_on='Regione')
lista = df['Principali professioni'].unique()
lista.sort()
for i,ms in enumerate(lista):
provv = df[df['Principali professioni']==ms].copy()
if i == 0:
m = provv.explore(column='v.a.', name=ms, show=True)
else:
m = provv.explore(m=m, column='v.a.', name=ms,show=False)
folium.LayerControl().add_to(m)
m
Out[75]:
Make this Notebook Trusted to load map: File -> Trust Notebook
Fabbisogni regionali per indirizzo di studio¶
In [76]:
df = pd.read_csv(os.path.join(data_path,'T3_indirizzi_di_studio.csv'), sep=';')
df['Indirizzo_di_studio'] = df['Indirizzo_di_studio'].str.replace('))',')')
df = regioni[['DEN_REG','geometry']].merge(df, left_on='DEN_REG', right_on='Regione')
lista = df['Indirizzo_di_studio'].unique()
lista.sort()
for i,ms in enumerate(lista):
provv = df[df['Indirizzo_di_studio']==ms].copy()
if i == 0:
m = provv.explore(column='v.a.', name=ms, show=True)
else:
m = provv.explore(m=m, column='v.a.', name=ms,show=False)
folium.LayerControl().add_to(m)
m
Out[76]:
Make this Notebook Trusted to load map: File -> Trust Notebook
Piemonte¶
In [77]:
regione = "Piemonte e Valle d'Aosta"
Macro-settore economico¶
In [78]:
df = pd.read_csv(os.path.join(data_path,'T1a_macro_settore_economico.csv'), sep=';')
df['Macro_settore_economico'] = df['Macro_settore_economico'].str.replace('\n',' ')
df = df[df['Regione']==regione].copy()
df['perc.'] = df['perc.'].astype(float)
df.sort_values(by='Macro_settore_economico', ascending=False,inplace=True)
settore_attivita = pd.read_csv(os.path.join(data_path,'settore_attivita_map.csv'),sep=';')
settore_attivita_map = dict()
for row in settore_attivita.to_dict('records'):
settore_attivita_map[row['Settore']] = row['Macro Settore Regione']
df_naz = pd.read_csv(os.path.join(data_path,'02_2M_settore_economico.csv'), sep=';')
df_naz.rename(columns={'Occupati 2023_x': 'Occupati 2023'}, inplace=True)
df_naz['Macro Settore Regione'] = df_naz['Settore'].map(settore_attivita_map)
df_naz = df_naz.groupby(['Macro Settore Regione'], as_index=False).agg('sum').sort_values(by='Macro Settore Regione', ascending=False)
df_naz.sort_values(by='Macro Settore Regione',ascending=False, inplace=True)
tot = df_naz['Fabbisogni POS'].sum()
df_naz['Fabbisogni POS'] = df_naz['Fabbisogni POS'] / tot * 1000
m = df.merge(df_naz[['Macro Settore Regione','Fabbisogni POS']],left_on='Macro_settore_economico', right_on='Macro Settore Regione')
m.sort_values(by='perc.', ascending=True, inplace=True)
(Slide 4)
In [79]:
m[['Macro Settore Regione','v.a.','perc.','Fabbisogni POS']]
Out[79]:
| Macro Settore Regione | v.a. | perc. | Fabbisogni POS | |
|---|---|---|---|---|
| 7 | Agricoltura, silvicoltura e pesca | 1600.0 | 6.3 | 3.742536 |
| 5 | Costruzioni | 14700.0 | 59.2 | 74.905749 |
| 0 | Servizi generali della pubblica amministrazione e assicurazione sociale obbligatoria | 20000.0 | 80.6 | 85.252759 |
| 1 | Servizi di alloggio e ristorazione; servizi turistici | 22800.0 | 92.0 | 73.419742 |
| 6 | Commercio | 25900.0 | 104.4 | 114.395003 |
| 4 | Industria manifatturiera | 39200.0 | 158.0 | 142.161314 |
| 3 | Servizi alle imprese | 55900.0 | 227.9 | 231.239165 |
| 2 | Servizi alle persone | 67400.0 | 271.7 | 274.883734 |
In [80]:
fig = go.Figure([go.Bar(name = 'Fabbisogno Piemonte (p)', y=m['Macro_settore_economico'], x=m['perc.'], orientation='h', marker_color='indianred'),
go.Bar(name = 'Fabbisogno Italia (p)', y=m['Macro Settore Regione'], x=m['Fabbisogni POS'], orientation='h', marker_color='green')])
fig.update_layout(width=1100, title=f'Confronto Fabbisogno Nazionale e Regione Piemonte (quote per mille)')
fig.show()
In [ ]:
In [ ]:
In [ ]:
Grandi gruppi professionali¶
In [81]:
df = pd.read_csv(os.path.join(data_path, 'T1b_grandi_gruppi_professionali.csv'), sep=';')
df = df[df['Regione']==regione].copy()
df['Grandi gruppi professionali'] = df['Grandi gruppi professionali'].str.split(' ').str[-1]
df['perc.'] = df['perc.'].astype(float)
df.sort_values(by='v.a.', inplace=True)
(Slide 5)
In [82]:
df[['Grandi gruppi professionali','v.a.','perc.']].sort_values(by='Grandi gruppi professionali')
Out[82]:
| Grandi gruppi professionali | v.a. | perc. | |
|---|---|---|---|
| 5 | Artigiani, operai specializzati e agricoltori | 26400.0 | 107.4 |
| 6 | Conduttori di impianti e operai di macchinari fissi e mobili | 15200.0 | 62.0 |
| 0 | Dirigenti | 4000.0 | 16.3 |
| 3 | Professioni esecutive nel lavoro d'ufficio | 34800.0 | 141.8 |
| 1 | Professioni intellettuali, scientifiche e di elevata specializzazione | 49200.0 | 200.3 |
| 7 | Professioni non qualificate | 21300.0 | 86.8 |
| 4 | Professioni qualificate nelle attività commerciali e nei servizi | 47800.0 | 194.4 |
| 2 | Professioni tecniche | 46500.0 | 189.3 |
In [83]:
fig = go.Figure(go.Bar(y=df['Grandi gruppi professionali'], x=df['v.a.'], orientation='h', marker_color='indianred'))
fig.update_layout(width=1100, title=f'Fabbisogni TOTALI previsti nel periodo 2024-2028 per grandi gruppi professionali in {regione}')
fig.show()
Livelli di istruzione¶
In [84]:
df = pd.read_csv(os.path.join(data_path, 'T1c_livelli_di_istruzione.csv'), sep=';')
df = df[df['Regione']==regione].copy()
df['perc.'] = df['perc.'].astype(float)
df.sort_values(by='v.a.', inplace=True)
fig = go.Figure(go.Bar(y=df['Livelli di istruzione'], x=df['v.a.'], orientation='h', marker_color='indianred'))
fig.update_layout(width=1100, title=f'Fabbisogni TOTALI previsti nel periodo 2024-2028 per livelli di istruzione in {regione}')
fig.show()
Principali professioni¶
In [85]:
df = pd.read_csv(os.path.join(data_path, 'T2_principali_professioni.csv'), sep=';')
df = df[df['Regione']==regione].copy()
df['perc.'] = df['perc.'].astype(float)
df.sort_values(by='v.a.', inplace=True)
fig = go.Figure(go.Bar(y=df['Principali professioni'], x=df['v.a.'], orientation='h', marker_color='indianred'))
fig.update_layout(width=1100, height=700, title=f'Fabbisogni TOTALI previsti nel periodo 2024-2028 per principali professioni in {regione}')
fig.show()
Indirizzi di studio¶
In [86]:
df = pd.read_csv(os.path.join(data_path, 'T3_indirizzi_di_studio.csv'), sep=';')
df = df[df['Regione']==regione].copy()
df['perc.'] = df['perc.'].astype(float)
df.sort_values(by='v.a.', inplace=True)
fig = go.Figure(go.Bar(y=df['Indirizzo_di_studio'], x=df['v.a.'], orientation='h', marker_color='indianred'))
fig.update_layout(width=1100, height=700, title=f'Fabbisogni TOTALI previsti nel periodo 2024-2028 per indirizzi di studio in {regione}')
fig.show()
In [ ]:
Fabbisogno di personale immigrato¶
In [87]:
'PY/migration/Fabbisogni dei settori privati totali e di personale immigrato previsti nel 2024-2028 per macrosettore - Scenario positivo.csv'
Out[87]:
'PY/migration/Fabbisogni dei settori privati totali e di personale immigrato previsti nel 2024-2028 per macrosettore - Scenario positivo.csv'