<style>
.reveal section img { background:none; border:none; box-shadow:none; }
.reveal {
font-size: 30px;
}
.reveal p {
text-align: left;
}
.reveal ul {
display: block;
}
.reveal ol {
display: block;
}
</style>
# Elements de Python avançats
## Taller Nous Usos de la Informàtica
<h1><img width="150" src="https://i.imgur.com/vvZMy0I.png"></h1>
---
### List Comprehensions
```python=
text = ‘Una gallina xica, tica, mica’
first_chars = []
for word in text.split():
first_chars.append(word[0])
# [’U’, ’g’, ’x’, ’t’, ’m’]
first_chars = [word[0] for word in text.split()]
# [’U’, ’g’, ’x’, ’t’, ’m’]
```
---
```python=
text = ‘Una gallina xica, tica, mica’
first_chars = []
for word in text.split():
if word[0].lower() in ‘aeiou’:
first_chars.append(word[0])
first_chars = [word[0] for word in text.split() \
if word[0].lower() in ‘aeiou’]
```
---
### Dict Comprehensions
```python=
a = {n: n*n for n in range(7)}
# a -> {0:0, 1:1, 2:4, 3:9, 4:16, 5:25, 6:36}
b = {val: key for key,val in a.items()}
# {0: 0, 1: 1, 4: 2, 9: 3, 16: 4, 25: 5, 36: 6}
```
---
### Set Comprehensions
```python=
s = {(x,y) for x in range(1,3) for y in range(1,3)}
# {(1, 2), (1, 1), (2, 1), (2, 2)}
prime = {x for x in range(2, 12) \
if all(x % y != 0 for y in \
range(2, int(math.floor(math.sqrt(x))) + 1))}
# {2,3,5,7,11}
```
---
### Programació OO & Python
A Python, tot són objectes.
Per definir nous objectes, farem servir la paraula `class`.
`class` defineix una classe en el mateix sentit que `def` defineix una funció.
Què és una classe? És una agrupació lògica de dades i funcions (que en aquest context anomenem *mètodes*).
---
### Programació OO & Python
Les classes són els "motlles" per crear *objectes*.
Quan definim la classe `Client` amb la paraula `class` no hem creat un nou client, només hem definit la recepta per crear objectes de tipus `client`.
---
### Programació OO & Python
<h1><img width="650" src="https://i.imgur.com/YiPFMf2.png"></h1>
---
### Programació OO & Python
El mètode `__init__` és el que pròpiament defineix la recepta de creació d'un objecte.
Si volem crear l'objcte podem fer això:
```python=
jeff = Customer('Jeff Knupp', 1000.0)
```
Podem crear tants objectes com vulguem (*instàncies*).
Els mètodes de la classe tenen accés a totes les dades contingudes a una instància d'un objecte.
---
### Programació OO & Python
Els atributs de classe són atributs definits a nivell de classe:
```python=
class Car(object):
wheels = 4
def __init__(self, make, model):
self.make = make
self.model = model
mustang = Car('Ford', 'Mustang')
print mustang.wheels
# 4
print Car.wheels
# 4
```
Aquests atributs no es defineixen dins de ``__init__``, sinó fora.
---
### Numpy
El mòdul `numpy` afegeix a Python una nova estructura de dades: el *numpy array*.
```python=
import numpy as np
a = np.array([0,1,2,3])
a
# array([0,1,2,3])
```
:::info
<i class="fa fa-eye fa-fw"></i> **Tutorial**: [numpy](https://numpy.org/devdocs/user/quickstart.html)
:::
---
### Pandas
El mòdul `pandas` afegeix a Python una nova estructura de dades: el *DataFrame*: estructura matricial amb columnes de tipus homogeni, indexada per noms de files i columnes.
<h1><img width="450" src="https://i.imgur.com/dzpKIYg.png"></h1>
:::info
<i class="fa fa-eye fa-fw"></i> **Tutorial**: [pandas](https://pandas.pydata.org/docs/)
:::
---
### Pandas
```python=
import pandas as pd
df = pd.DataFrame(
{ "Name": [
"Braund, Mr. Owen Harris",
"Allen, Mr. William Henry",
"Bonnell, Miss. Elizabeth",
],
"Age": [22, 35, 58],
"Sex": ["male", "male", "female"],
}
)
# Name Age Sex
# 0 Braund, Mr. Owen Harris 22 male
# 1 Allen, Mr. William Henry 35 male
# 2 Bonnell, Miss. Elizabeth 58 female
```
---
### Pandas
Cada columna d'un DataFrame s'anomena `Series`, i és comporta bàsicament com un `numpy array` d'un cert `type`.
```python=
df["Age"]
# 0 22
# 1 35
# 2 58
# Name: Age, dtype: int64
```
---
### Pandas
```python=
ages = pd.Series([22, 35, 58], name="Age")
ages
# 0 22
# 1 35
# 2 58
# Name: Age, dtype: int64
df["Age"].max()
# 58
```
---
### Pandas
Podem llegir dades tabulars de qualsevol format:
<h1><img width="650" src="https://i.imgur.com/8Y2ICUb.png"></h1>
---
### Pandas: Com seleccionem un subconjunt de columnes?
```python=
titanic = pd.read_csv("titanic.csv")
titanic.head()
# PassengerId Survived Pclass Name
#0 1 0 3 Braund, Mr. Owen Harris ...
#1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... ...
#2 3 1 3 Heikkinen, Miss. Laina ...
#3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) ... 113803 53.1000 C123 S
#4 5 0 3 Allen, Mr. William Henry ...
#[5 rows x 12 columns]
age_sex = titanic[["Age", "Sex"]]
age_sex.head()
# Age Sex
#0 22.0 male
#1 38.0 female
#2 26.0 female
#3 35.0 female
#4 35.0 male
```
---
### Pandas: Com seleccionem un subconjunt de files (filtrem)?
```python=
above_35 = titanic[titanic["Age"] > 35]
above_35.head()
# PassengerId Survived Pclass Name
#1 2 1 1 Cumings, Mrs. John Bradley
#6 7 0 1 McCarthy, Mr. Timothy J
#11 12 1 1 Bonnell, Miss. Elizabeth
#13 14 0 3 Andersson, Mr. Anders Johan
#15 16 1 2 Hewlett, Mrs. (Mary D Kingcome)
#[5 rows x 12 columns]
```
---
### Pandas: Com seleccionem un subconjunt de files (filtrem)?
```python=
class_23 = titanic[titanic["Pclass"].isin([2, 3])]
class_23.head()
# PassengerId Survived Pclass Name Sex
#0 1 0 3 Braund, Mr. Owen Harris male
#2 3 1 3 Heikkinen, Miss. Laina female
#4 5 0 3 Allen, Mr. William Henry male
#5 6 0 3 Moran, Mr. James male
#7 8 0 3 Palsson, Master. Gosta Leonard male
#[5 rows x 12 columns]
```
---
### Pandas: Com selecciono una subtaula (files i columnes)?
```python=
adult_names = titanic.loc[titanic["Age"] > 35, "Name"]
adult_names.head()
#1 Cumings, Mrs. John Bradley
#6 McCarthy, Mr. Timothy J
#11 Bonnell, Miss. Elizabeth
#13 Andersson, Mr. Anders Johan
#15 Hewlett, Mrs. (Mary D Kingcome)
#Name: Name, dtype: object
```
---
### Pandas: Com selecciono files i columnes?
```python=
a = titanic.iloc[9:25, 2:5]
a
# Pclass Name Sex
#9 2 Nasser, Mrs. Nicholas (Adele Achem) female
#10 3 Sandstrom, Miss. Marguerite Rut female
#11 1 Bonnell, Miss. Elizabeth female
#12 3 Saundercock, Mr. William Henry male
#13 3 Andersson, Mr. Anders Johan male
#.. ... ... ...
#20 2 Fynney, Mr. Joseph J male
#21 2 Beesley, Mr. Lawrence male
#22 3 McGowan, Miss. Anna "Annie" female
#23 1 Sloper, Mr. William Thompson male
#24 3 Palsson, Miss. Torborg Danira female
#[16 rows x 3 columns]
```
---
### Pandas: Com assigno valors?
Quan selecciono cel·les amb `loc` i `iloc` puc assignar nous valors:
```python=
titanic.iloc[0:3, 3] = "anonymous"
titanic.head()
# PassengerId Survived Pclass Name
#0 1 0 3 anonymous
#1 2 1 1 anonymous
#2 3 1 3 anonymous
#3 4 1 1 Futrelle, Mrs. Jacques Heath
#4 5 0 3 Allen, Mr. William Henry
#[5 rows x 12 columns]
```
{"metaMigratedAt":"2023-06-16T09:54:33.983Z","metaMigratedFrom":"YAML","breaks":true,"slideOptions":"{\"theme\":\"white\",\"transition\":\"fade\"}","description":"A Python, tot són objectes.","title":"Elements de Python avançats","contributors":"[{\"id\":\"27c1cf26-ef2c-44cb-8ae1-2edc488d3f8e\",\"add\":9930,\"del\":1554}]"}