3. El rebost del restaurant

Estem gestionant un restaurant i volem controlar els 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ó mesos_sense_compra (1.5 punts)

Implementeu al mòdul restaurant (fitxer restaurant.py) la funció següent:

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

  • art (str) – Nom d’un article

Retorna:

Llista ordenada dels mesos de l’any en què no consta en df que s’hagi comprat l’article art.

Els mesos de l’any en df sempre estaran en català i en minúscules, tal com mostren els exemples.

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


>>> mesos_sense_compra(df, 'Botifarra')
['gener', 'febrer', 'març', 'abril', 'maig', 'juliol', 'octubre', 'desembre']
>>> mesos_sense_compra(df, 'Mongeta verda')
['gener', 'març', 'abril', 'maig', 'juny', 'juliol', 'agost', 'setembre', 'octubre', 'novembre', 'desembre']
>>> mesos_sense_compra(df, 'Aranyes')
['gener', 'febrer', 'març', 'abril', 'maig', 'juny', 'juliol', 'agost', 'setembre', 'octubre', 'novembre', 'desembre']

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

3.2. Funció millors_preus (1.5 punts)

Implementeu al mateix mòdul restaurant (fitxer restaurant.py) la funció següent:

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

  • prov (str) – Nom d’una categoria

Retorna:

Diccionari amb claus els noms d’articles i valors associats el preu per unitat més baix en què s’ha comprat el producte. Els valors del diccionari han de ser enters (int, sense incloure la part fraccionària) i el diccionari no ha d’incloure productes de preu mínim desconegut.

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


>>> millors_preus(df, 'Condiments') ==  {'Herbes provençals': 5, 'Mostassa': 6, "Oli d'oliva": 2, 'Pebre negre': 6, 'Sal': 17, 'Salsa de soja': 10, 'Sucre de canya': 7, 'Vinagre de Xerès': 5}
True
>>> millors_preus(df, 'Carns') == {'Botifarra': 3, 'Conill': 3, 'Costella de porc': 5, 'Cuixa de pollastre': 9, "Gall d'indi": 4, 'Menuts': 3, 'Pit de pollastre': 3, 'Vedella tallada': 6}
True

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