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:
- Retorna:
Tupla amb dos valors enters:
Nombre de compres en què el proveïdor prov ha aplicat un descompte o un sobrecost
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:
- 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.