Skip to content

Commit d060027

Browse files
authored
Update 08-data-frames.md
finito anche questo
1 parent e01974d commit d060027

1 file changed

Lines changed: 30 additions & 52 deletions

File tree

episodes/08-data-frames.md

Lines changed: 30 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -23,30 +23,24 @@ exercises: 15
2323

2424
## Nota sui DataFrames/Series di Pandas
2525

26-
Un [DataFrame][pandas-dataframe] è un insieme di [Series][pandas-series]; il DataFrame è
27-
il modo in cui Pandas rappresenta una tabella e Series è la struttura dati che Pandas
26+
Un [DataFrame][pandas-dataframe] è un insieme di [Series][pandas-series]; il DataFrame è il modo in cui Pandas rappresenta una tabella e Series è la struttura dati che Pandas
2827
usa per rappresentare una colonna.
2928

30-
Pandas è costruito sulla base della libreria [Numpy][numpy], il che in pratica significa
31-
che la maggior parte dei metodi definiti per gli array Numpy si applicano alle
32-
serie/dataframe di Pandas.
29+
Pandas è costruito sulla base della libreria [Numpy][numpy], il che in pratica significa che la maggior parte dei metodi definiti per gli array Numpy si applicano alle serie/dataframe di Pandas.
3330

3431
Ciò che rende Pandas così interessante è la potente interfaccia per accedere ai singoli
3532
record della tabella, la corretta gestione dei valori mancanti e le operazioni di
3633
database relazionale tra DataFrames.
3734

3835
## Selezione di valori
3936

40-
Per accedere a un valore nella posizione `[i,j]` di un DataFrame, abbiamo due opzioni, a
41-
seconda del significato di `i` in uso. Ricordiamo che un DataFrame fornisce un *indice*
42-
per identificare le righe della tabella; una riga, quindi, ha una *posizione*
37+
Per accedere a un valore nella posizione `[i,j]` di un DataFrame, abbiamo due opzioni, a seconda del significato di `i` in uso. Ricordiamo che un DataFrame fornisce un *indice* per identificare le righe della tabella; una riga, quindi, ha una *posizione*
4338
all'interno della tabella e una *etichetta*, che identifica in modo univoco la sua
4439
*entrata* nel DataFrame.
4540

4641
## Usare `DataFrame.iloc[..., ...]` per selezionare i valori in base alla loro posizione (di ingresso)
4742

48-
- Può specificare la posizione tramite un indice numerico, analogamente alla versione 2D
49-
della selezione dei caratteri nelle stringhe.
43+
- Può specificare la posizione tramite un indice numerico, analogamente alla versione 2D della selezione dei caratteri nelle stringhe.
5044

5145
```python
5246
import pandas as pd
@@ -94,7 +88,7 @@ gdpPercap_2007 5937.029526
9488
Name: Albania, dtype: float64
9589
```
9690

97-
- Otterrebbe lo stesso risultato stampando `data.loc["Albania"]` (senza un secondo
91+
- Si otterrebbe lo stesso risultato stampando `data.loc["Albania"]` (senza un secondo
9892
indice).
9993

10094
```python
@@ -114,8 +108,7 @@ Name: gdpPercap_1952, dtype: float64
114108
```
115109

116110
- Si otterrebbe lo stesso risultato stampando `data["gdpPercap_1952"]`
117-
- Si ottiene lo stesso risultato anche stampando `data.gdpPercap_1952` (non consigliato,
118-
perché facilmente confondibile con la notazione `.` per i metodi)
111+
- Lo stesso risultato si otterrebbe anche stampando `data.gdpPercap_1952` (non consigliato,perché facilmente confondibile con la notazione `.` per i metodi)
119112

120113
## Seleziona più colonne o righe usando `DataFrame.loc` e una slice con nome.
121114

@@ -133,16 +126,13 @@ Norway 13450.401510 16361.876470 18965.055510
133126
Poland 5338.752143 6557.152776 8006.506993
134127
```
135128

136-
Nel codice sopra riportato, scopriamo che **l'affettatura con `loc` è inclusiva ad
137-
entrambe le estremità**, a differenza dell'affettatura con `iloc`**, in cui
138-
l'affettatura indica tutto fino all'indice finale escluso.
129+
Nel codice riportato sopra, scopriamo che **l’operazione di slicing con loc è inclusiva a entrambe le estremit**à, a differenza di quella con iloc, in cui vengono selezionati tutti gli elementi fino all’indice finale escluso.
139130

140-
## Il risultato dell'affettatura può essere usato in altre operazioni.
131+
## Il risultato dello slicing può essere usato in altre operazioni.
141132

142-
- Di solito non si stampa solo una fetta.
143-
- Tutti gli operatori statistici che lavorano su interi dataframe funzionano allo stesso
144-
modo sulle fette.
145-
- Ad esempio, calcolare il massimo di una fetta.
133+
- Di solito non si stampa solo una slice.
134+
- Tutti gli operatori statistici che lavorano su interi DataFrame funzionano allo stesso modo anche sulle slice.
135+
- Ad esempio, possiamo calcolare il valore massimo di una slice.
146136

147137
```python
148138
print(data.loc['Italy':'Poland', 'gdpPercap_1962':'gdpPercap_1972'].max())
@@ -172,11 +162,11 @@ dtype: float64
172162
- Restituisce un dataframe di forma simile di `True` e `False`.
173163

174164
```python
175-
# Use a subset of data to keep output readable.
165+
# Usiamo solo una parte dei dati per ottenere un risultato leggibile.
176166
subset = data.loc['Italy':'Poland', 'gdpPercap_1962':'gdpPercap_1972']
177167
print('Subset of data:\n', subset)
178168

179-
# Which values were greater than 10000 ?
169+
# Quali valori sono maggiori di 10000 ?
180170
print('\nWhere are values large?\n', subset > 10000)
181171
```
182172

@@ -200,10 +190,9 @@ Norway True True True
200190
Poland False False False
201191
```
202192

203-
## Seleziona valori o NaN usando una maschera booleana.
193+
## Selezionare valori o celle vuote (NaN) tramite una maschera booleana.
204194

205-
- Un riquadro pieno di booleani viene talvolta chiamato *maschera* per il modo in cui
206-
può essere utilizzato.
195+
- Un insieme di valori booleani disposto in una tabella viene talvolta chiamato *maschera (mask)*, per via del modo in cui può essere utilizzato.
207196

208197
```python
209198
mask = subset > 10000
@@ -220,8 +209,8 @@ Norway 13450.40151 16361.87647 18965.05551
220209
Poland NaN NaN NaN
221210
```
222211

223-
- Ottiene il valore quando la maschera è vera e NaN (Not a Number) quando è falsa.
224-
- Utile perché i NaN vengono ignorati da operazioni come max, min, media, ecc.
212+
- Restituisce il valore quando la maschera è True e NaN (Not a Number) quando è False.
213+
- Questo è utile perché i valori NaN vengono ignorati da operazioni come max, min, media, ecc.
225214

226215
```python
227216
print(subset[subset > 10000].describe())
@@ -239,11 +228,11 @@ min 12790.849560 10022.401310 12269.273780
239228
max 13450.401510 16361.876470 18965.055510
240229
```
241230

242-
## Raggruppa per: dividere-applicare-combinare
231+
## Raggruppa per: split-apply-combine
243232

244233
::::::::::::::::::::::::::::::::::::: instructor
245234

246-
Gli studenti hanno spesso difficoltà in questo caso, molti non lavorano con i dati e i
235+
Gli studenti hanno spesso difficoltà in questo caso, molti non lavorano con i dati e
247236
concetti finanziari e quindi trovano i concetti dell'esempio difficili da comprendere.
248237
Il problema più grande, tuttavia, è la linea che genera il wealth_score: questo
249238
passaggio deve essere spiegato a fondo:
@@ -256,12 +245,10 @@ passaggio deve essere spiegato a fondo:
256245
I metodi di vettorizzazione e le operazioni di raggruppamento di Pandas sono
257246
caratteristiche che offrono agli utenti molta flessibilità nell'analisi dei dati.
258247

259-
Per esempio, supponiamo di voler avere una visione più chiara di come i paesi europei si
260-
dividono in base al loro PIL.
248+
Per esempio, supponiamo di voler avere una visione più chiara di come i paesi europei si dividono in base al loro PIL.
261249

262250
1. Possiamo dare un'occhiata dividendo i paesi in due gruppi durante gli anni presi in
263-
esame, quelli che hanno presentato un PIL *più alto* della media europea e quelli con
264-
un PIL *più basso*.
251+
esame, quelli che hanno presentato un PIL *più alto* della media europea e quelli con un PIL *più basso*.
265252
2. Stimiamo quindi un *punteggio di ricchezza* basato sui valori storici (dal 1962 al
266253
2007), dove teniamo conto di quante volte un paese ha partecipato ai gruppi di PIL
267254
*più bassi* o *più alti*
@@ -307,7 +294,7 @@ United Kingdom 1.000000
307294
dtype: float64
308295
```
309296

310-
Infine, per ogni gruppo nella tabella `wealth_score`, sommiamo il suo contributo
297+
Infine, per ogni gruppo nella tabella `wealth_score`, sommiamo il contributo
311298
(finanziario) per tutti gli anni presi in esame utilizzando metodi concatenati:
312299

313300
```python
@@ -387,7 +374,7 @@ print(data_europe.loc['Albania':'Belgium', 'gdpPercap_1952':'gdpPercap_1962'])
387374

388375
## Soluzione
389376

390-
No, non producono lo stesso output! L'output della prima istruzione è:
377+
No, non producono lo stesso output! L'output della prima è:
391378

392379
```output
393380
gdpPercap_1952 gdpPercap_1957
@@ -406,8 +393,7 @@ Austria 6137.076492 8842.598030 10750.721110
406393
Belgium 8343.105127 9714.960623 10991.206760
407394
```
408395

409-
È evidente che la seconda istruzione produce una colonna e una riga in più rispetto alla
410-
prima.
396+
È evidente che la seconda istruzione produce una colonna e una riga in più rispetto alla prima.
411397
Quale conclusione possiamo trarre? Vediamo che una slice numerica, 0:2, *omette*
412398
l'indice finale (cioè l'indice 2) nell'intervallo fornito, mentre una slice denominata,
413399
'gdpPercap\1952':'gdpPercap\1962', *include* l'elemento finale.
@@ -443,9 +429,7 @@ Esaminiamo questo pezzo di codice riga per riga.
443429
first = pd.read_csv('data/gapminder_all.csv', index_col='country')
444430
```
445431

446-
Questa riga carica il dataset contenente i dati sul PIL di tutti i paesi in un dataframe
447-
chiamato `first`. Il parametro `index_col='country'` seleziona quale colonna utilizzare
448-
come etichetta di riga nel dataframe.
432+
Questa riga carica il dataset contenente i dati sul PIL di tutti i paesi in un dataframe chiamato `first`. Il parametro `index_col='country'` seleziona quale colonna utilizzare come etichetta di riga nel dataframe.
449433

450434
```python
451435
second = first[first['continent'] == 'Americas']
@@ -454,8 +438,7 @@ second = first[first['continent'] == 'Americas']
454438
Questa riga effettua una selezione: vengono estratte solo le righe di `first` per le
455439
quali la colonna 'continente' corrisponde a 'Americhe'. Si noti come l'espressione
456440
booleana all'interno delle parentesi, `first['continent'] == 'Americas'`, venga
457-
utilizzata per selezionare solo le righe in cui l'espressione è vera. Provate a stampare
458-
questa espressione! È possibile stampare anche i singoli elementi Vero/Falso?
441+
utilizzata per selezionare solo le righe in cui l'espressione è vera. Provate a stampare questa espressione! È possibile stampare anche i singoli elementi Vero/Falso?
459442
(suggerimento: prima assegnate l'espressione a una variabile)
460443

461444
```python
@@ -471,8 +454,7 @@ fourth = third.drop('continent', axis = 1)
471454
```
472455

473456
Anche in questo caso applichiamo la funzione drop, ma in questo caso non eliminiamo una
474-
riga ma un'intera colonna. Per farlo, è necessario specificare anche il parametro `axis`
475-
(vogliamo eliminare la seconda colonna che ha indice 1).
457+
riga ma un'intera colonna. Per farlo, è necessario specificare anche il parametro `axis` (vogliamo eliminare la seconda colonna che ha indice 1).
476458

477459
```python
478460
fourth.to_csv('result.csv')
@@ -554,9 +536,7 @@ data.loc['Denmark',:]
554536
data.loc[:,'gdpPercap_1985':]
555537
```
556538

557-
Pandas è abbastanza intelligente da riconoscere il numero alla fine dell'etichetta della
558-
colonna e non dà errore, anche se non esiste alcuna colonna denominata `gdpPercap_1985`.
559-
Questo è utile se in seguito vengono aggiunte nuove colonne al file CSV.
539+
Pandas è abbastanza intelligente da riconoscere il numero alla fine dell'etichetta della colonna e non dà errore, anche se non esiste alcuna colonna denominata `gdpPercap_1985`. Questo è utile se in seguito vengono aggiunte nuove colonne al file CSV.
560540

561541
4:
562542

@@ -756,8 +736,7 @@ Questo comando restituisce:
756736
'zfill']
757737
```
758738

759-
È possibile utilizzare `help()` o <kbd>Shift</kbd>\+<kbd>Tab</kbd> per ottenere maggiori
760-
informazioni sulle funzioni di questi metodi.
739+
È possibile utilizzare `help()` o <kbd>Shift</kbd>\+<kbd>Tab</kbd> per ottenere maggiori informazioni sulle funzioni di questi metodi.
761740

762741
Si supponga che Pandas sia stato importato e che i dati del PIL di Gapminder per
763742
l'Europa siano stati caricati come `data`. Quindi, utilizzare `dir()` per trovare la
@@ -798,8 +777,7 @@ https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html
798777

799778
:::::::::::::::::::::::::::::::::::::::: keypoints
800779

801-
- Usare `DataFrame.iloc[..., ...]` per selezionare i valori in base alla posizione degli
802-
interi.
780+
- Usare `DataFrame.iloc[..., ...]` per selezionare i valori in base alla posizione degli interi.
803781
- Usare `:` da solo per indicare tutte le colonne o tutte le righe.
804782
- Selezionare più colonne o righe utilizzando `DataFrame.loc` e una slice denominata.
805783
- Il risultato dell'affettatura può essere utilizzato in altre operazioni.

0 commit comments

Comments
 (0)