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:
  • df (DataFrame) – Dataframe amb les dades de vendes de samarretes

  • gnr (str) – String que pot valdre 'home', 'dona' o '*'.

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:
  • df (DataFrame) – Dataframe amb les dades de vendes de samarretes

  • a (int) – Any del qual es volen consultar les vendes

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.