El rebost del restaurant ======================== .. py:module:: restaurant Estem gestionant un restaurant i volem controlar les queviures comprades. Els fitxers :download:`restaurant-2024.csv` i :download:`restaurant-2025.csv` contenen les dades d'aquestes compres de dos anys diferents. En llegir aquests fitxers mitjançant :py:mod:`pandas` obtenim dos :py:class:`pandas.DataFrame`: .. literalinclude:: lectura-restaurant.txt :language: pycon 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 :py:class:`~pandas.DataFrame` que tingui la mateixa estructura (mateixes columnes) que aquests dos exemples, però poden correspondre a les compres de qualsevol any. 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 :py:mod:`restaurant` (fitxer :file:`restaurant.py`), implementeu-hi la funció següent: .. function:: costos_proveidor(df, prov) :param ~pandas.DataFrame df: Dataframe amb les dades de compres del restaurant :param str prov: Nom d'un proveïdor :return: 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 :file:`restaurant-2024.csv`, aquesta funció ha de respondre aixi: .. literalinclude:: tests-costos.txt :language: pycon :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de més jocs de proves al fitxer :download:`tests-costos.txt`, el qual fa servir els dos fitxers CSV proporcionats. Funció `article_per_mesos` (2 punts) ------------------------------------ Al mateix mòdul :py:mod:`restaurant` (fitxer :file:`restaurant.py`), implementeu-hi la funció següent: .. function:: article_per_mesos(df, art) :param ~pandas.DataFrame df: Dataframe amb les dades de compres del restaurant :param str art: Nom d'un article :return: 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 :py:const:`'gener'` a :py:const:`'desembre``, fins tot els mesos en què no s'hagi comprat l'article. Essent `df2` el Dataframe amb les dades del fitxer :file:`restaurant-2025.csv`, aquesta funció ha de respondre aixi: .. literalinclude:: tests-article.txt :language: pycon :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de més jocs de proves al fitxer :download:`tests-article.txt`, el qual fa servir els dos fitxers CSV proporcionats.