3. El rebost del restaurant

Estem gestionant un restaurant i volem controlar les queviures comprades. Els fitxers restaurant-2024.csv i restaurant-2025.csv contenen les dades d’aquestes compres de dos anys diferents. En llegir aquests fitxers mitjançant pandas obtenim dos pandas.DataFrame:

>>> import pandas as pd
>>> df1 = pd.read_csv('restaurant-2024.csv')
>>> df1.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 9 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   mes          200 non-null    object 
 1   categoria    200 non-null    object 
 2   article      200 non-null    object 
 3   quantitat    200 non-null    int64  
 4   unitat       200 non-null    object 
 5   preu_unitat  182 non-null    float64
 6   cost_total   200 non-null    int64  
 7   proveïdor    176 non-null    object 
 8   comentari    155 non-null    object 
dtypes: float64(1), int64(2), object(6)
memory usage: 14.2+ KB
>>> df2 = pd.read_csv('restaurant-2025.csv')
>>> df2.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 500 entries, 0 to 499
Data columns (total 9 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   mes          500 non-null    object 
 1   categoria    500 non-null    object 
 2   article      500 non-null    object 
 3   quantitat    500 non-null    int64  
 4   unitat       500 non-null    object 
 5   preu_unitat  459 non-null    float64
 6   cost_total   500 non-null    int64  
 7   proveïdor    435 non-null    object 
 8   comentari    405 non-null    object 
dtypes: float64(1), int64(2), object(6)
memory usage: 35.3+ KB

Descarregueu-vos els fitxers, llegiu-los en l’intèrpret de Python tal com s’indica en l’exemple de més amunt i examineu les dades que contenen. Fixeu-vos que els valors de les columnes preu_unitat, proveïdor i comentari contenen valors desconeguts.

Les funcions que es demanen a continuació han de treballar amb qualsevol DataFrame que tingui la mateixa estructura (mateixes columnes) que aquests dos exemples, però poden correspondre a les compres de qualsevol any.

3.1. Funció costos_proveidor (2 punts)

El preu de la columna cost_total de cada compra no sempre es correspon amb el resultat de multiplicar les unitats pel preu unitari, perquè de vegades els proveïdors apliquen descomptes o hi sumen un sobrecost, com ara l’embalatge. Volem analitzar aquestes diferències entre els preus reals que ha aplicat cada proveïdor i els preus teòrics. A tal fi, al mòdul restaurant (fitxer restaurant.py), implementeu-hi la funció següent:

restaurant.costos_proveidor(df, prov)
Paràmetres:
  • df (DataFrame) – Dataframe amb les dades de compres del restaurant

  • prov (str) – Nom d’un proveïdor

Retorna:

Tupla amb dos valors enters:

  1. Nombre de compres en què el proveïdor prov ha aplicat un descompte o un sobrecost

  2. Suma de les diferències entre preus reals i preus teòrics d’aquest proveïdor

Aquesta funció no ha de tenir en compte els valors desconeguts del preu unitari, ja que en aquest cas és impossible calcular el preu teòric.

Essent df1 el Dataframe amb les dades del fitxer restaurant-2024.csv, aquesta funció ha de respondre aixi:


>>> costos_proveidor(df, 'LactisNord')
(1, 10)
>>> costos_proveidor(df, 'CervesesArt')
(1, -745)
>>> costos_proveidor(df, 'LlegumPlus')
(0, 0)

Disposeu de més jocs de proves al fitxer tests-costos.txt, el qual fa servir els dos fitxers CSV proporcionats.

3.2. Funció article_per_mesos (2 punts)

Al mateix mòdul restaurant (fitxer restaurant.py), implementeu-hi la funció següent:

restaurant.article_per_mesos(df, art)
Paràmetres:
  • df (DataFrame) – Dataframe amb les dades de compres del restaurant

  • art (str) – Nom d’un article

Retorna:

Diccionari amb la quantitat comprada de l’article art per cada mes. Les claus han de ser els mesos de l’any i el valor associat la quantitat. El diccionari ha d’incloure tots els mesos de l’any, de 'gener' a 'desembre`, fins tot els mesos en què no s’hagi comprat l’article.

Essent df2 el Dataframe amb les dades del fitxer restaurant-2025.csv, aquesta funció ha de respondre aixi:


>>> article_per_mesos(df2, 'Botifarra') == {'agost': 36, 'gener': 20, 'juliol': 53, 'maig': 34, 'març': 11, 'febrer': 0, 'abril': 0, 'juny': 0, 'setembre': 0, 'octubre': 0, 'novembre': 0, 'desembre': 0}
True
>>> article_per_mesos(df2, 'Cava') == {'abril': 1332, 'agost': 653, 'gener': 546, 'juny': 321, 'març': 959, 'setembre': 862, 'febrer': 0, 'maig': 0, 'juliol': 0, 'octubre': 0, 'novembre': 0, 'desembre': 0}
True
>>> article_per_mesos(df2, 'Festucs') == {'gener': 0, 'febrer': 0, 'març': 0, 'abril': 0, 'maig': 0, 'juny': 0, 'juliol': 0, 'agost': 0, 'setembre': 0, 'octubre': 0, 'novembre': 0, 'desembre': 0}
True

Disposeu de més jocs de proves al fitxer tests-article.txt, el qual fa servir els dos fitxers CSV proporcionats.