3. Pandas: Més sobre vendes de samarretes¶
El fitxer samarretes.csv conté les dades de les vendes de samarretes realitzades per una empresa al llarg d’un període de diversos anys. Si llegim aquest fitxer mitjançant la següent comanda de pandas, obtenim un pandas.DataFrame com aquest:
>>> import pandas as pd
>>> df = pd.read_csv('samarretes.csv', parse_dates=['Data'])
>>> df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 943 entries, 0 to 942
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Data 943 non-null datetime64[ns]
1 Comarca 943 non-null object
2 Genere 943 non-null object
3 Talla 943 non-null object
4 Unitats 943 non-null int64
5 Preu unit. 943 non-null float64
dtypes: datetime64[ns](1), float64(1), int64(1), object(3)
memory usage: 44.3+ KB
Descarregueu-vos el fitxer samarretes.csv, proveu de llegir-lo en l’intèrpret de Python tal com s’indica en l’exemple de més amunt i examineu les columnes que conté. Fixeu-vos que els valors de la columna Data són del tipus datetime.datetime.
Les funcions que es demanen a continuació han de treballar amb qualsevol DataFrame que tingui la mateixa estructura (mateixes columnes), però no necessàriament el mateix de l’exemple, poden correspondre a les vendes de qualsevol empresa de samarretes.
3.1. Funció vendes_per_talla (2 punts)¶
Volem saber si hi ha alguna diferència entre les talles venudes als homes respecte a les de les dones. A tal fi, al mòdul talles (fitxer talles.py), implementeu-hi la funció següent:
- talles.vendes_per_talla(df, gnr)¶
- Paràmetres:
- Retorna:
Diccionari amb el nombre de samarretes venudes per cada talla, és a dir, les claus seran les talles i els valors el nombre de samarretes venudes. Si gnr val
'home', els valors seran els de les samarretes dels homes, si gnr val'dona', els valors seran els de les samarretes de les dones i si gnr val'*', els valors seran els del total de samarretes venudes.- Tipus de retorn:
dict. Les claus d’aquest diccionari són el conjunt dels valors que hi ha a la columna Talla.
Essent df el Dataframe amb les dades del fitxer d’exemple obtenim:
>>> from talles import vendes_per_talla
>>> d = vendes_per_talla(df, '*')
>>> if d != {'L': 2829, 'M': 2655, 'S': 931, 'XL': 2521, 'XS': 360, 'XXL': 911}:
... print(f"El valor retornat no és l'esperat: {d}")
>>> d = vendes_per_talla(df, 'home')
>>> if d!= {'L': 1785, 'M': 1500, 'S': 326, 'XL': 1836, 'XS': 128, 'XXL': 664}:
... print(f"El valor retornat no és l'esperat: {d}")
>>> d = vendes_per_talla(df, 'dona')
>>> if d!= {'L': 1044, 'M': 1155, 'S': 605, 'XL': 685, 'XS': 232, 'XXL': 247}:
... print(f"El valor retornat no és l'esperat: {d}")
Disposeu de més jocs de proves al fitxer tests-talles.txt.
3.2. Funció vendes_anuals (2 punts)¶
Al mòdul anual (fitxer anual.py), implementeu-hi la funció següent:
- anual.vendes_anuals(df, a)¶
- Paràmetres:
- Retorna:
Nombre de samarretes venudes l’any a i l’import total de les vendes de l’any a. L’import de cada venda es calcula com el nombre d’unitats multiplicat pel preu unitari.
Suggeriment
Per a accedir als atributs o mètodes d’una columna que conté valors de tipus datetime.datetime es recomana utilitzar pandas.Series.dt
Essent df el Dataframe amb les dades del fitxer d’exemple obtenim:
>>> from anual import vendes_anuals
>>> nv, imp = vendes_anuals(df, 2000)
>>> f"Samarretes venudes:{nv}. Import vendes:{imp:.2f}"
'Samarretes venudes:90. Import vendes:2051.80'
>>> nv, imp = vendes_anuals(df, 2007)
>>> f"Samarretes venudes:{nv}. Import vendes:{imp:.2f}"
'Samarretes venudes:139. Import vendes:2783.60'
Disposeu de més jocs de proves al fitxer tests-anual.txt.