Skip to content

Instantly share code, notes, and snippets.

@mariocesar
Last active April 12, 2024 14:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mariocesar/25585f4ffc52c1b8d9be71ee88dc87b9 to your computer and use it in GitHub Desktop.
Save mariocesar/25585f4ffc52c1b8d9be71ee88dc87b9 to your computer and use it in GitHub Desktop.
Prueba de revisión. Code Challenge. Programming Skills

Instrucciones para el candidato

Adjunto encontrarás un script de Python llamado script.py y un archivo CSV llamado data.csv.

  1. El archivo data.csv contiene datos de productos con las siguientes columnas: product_id, name, category_name, price, quantity.
  2. El script script.py carga los datos del archivo CSV, calcula la media, el promedio y la moda de los precios de los productos agrupados por categoría, y muestra los resultados en la consola.
  3. Tu tarea es revisar el código del script script.py y proponer cambios, mejoras o identificar cualquier problema, similar a lo que harías en una revisión a un Merge Request.
  4. Prepara tus comentarios, sugerencias y mejoras propuestas para discutirlas durante la siguiente entrevista.

El objetivo de este ejercicio es evaluar tus habilidades para identificar problemas, proponer mejoras y más que todo comunicar tus ideas de manera efectiva.

Si tienes alguna pregunta o necesitas aclaraciones adicionales, no dudes en preguntar.

¡Buena suerte!

product_id name category_name price quantity
100A3 Juguete para Perros Juguetes para Perros 5.99 100
20123 Bola de Catnip Juguetes para Gatos 3.49 150
33250 Jaula para Loros Accesorios para Aves 120.00 10
4A304 Alimento para Perros - Sabor Carne Alimento para Perros 25.99 50
45032 Filtro para Acuario Suministros para Peces 22.49 20
25036 Rueda para Hámster Accesorios para Mascotas Pequeñas 8.99 75
12042 Palito para Roer Accesorios para Mascotas Pequeñas 4.99 90
25237 Torre de Escalada para Gatos Muebles para Gatos 70.00 25
5A501 Mezcla de Semillas para Pájaros Alimento para Aves 15.99 60
14AA2 Correa para Perros Accesorios para Perros 9.99 80
12342 Decoración para Acuario Suministros para Peces 5.75 50
12042 Palito para Roer para Conejos Accesorios para Mascotas Pequeñas 4.99 90
12F12 Impermeable para Perros Ropa para Perros 14.99 40
5A213 Arena para Gatos Suministros para Gatos 10.99 65
12022 Hábitat para Cobayas Viviendas para Mascotas Pequeñas 60.00 30
15122 Iluminación para Acuario Suministros para Peces 18.49 25
import csv
from collections import defaultdict
from statistics import mean, mode, StatisticsError
import logging
FILE_PATH = 'data.csv'
LOG_FILE = 'app.log'
logging.basicConfig(filename=LOG_FILE, level=logging.INFO)
def load_data_from_csv(file_path: str) -> list:
"""Load data from CSV file."""
try:
with open(file_path, 'r') as file:
csv_reader = csv.DictReader(file)
data = [row for row in csv_reader]
return data
except FileNotFoundError as e:
logging.error(f"File not found: {file_path} - {e}")
return []
except Exception as e:
logging.error(f"Unexpected error reading {file_path} - {e}")
return []
def process_data(data: list) -> dict:
"""Process data to group prices by category."""
category_data = defaultdict(lambda: defaultdict(list))
for item in data:
category = item['category_name']
price = float(item['price'])
category_data[category]['prices'].append(price)
return category_data
def calculate_stats(category_data: dict) -> dict:
"""Calculate statistics for each category."""
stats = {}
for category, data in category_data.items():
prices = data['prices']
try:
mode_price = mode(prices)
except StatisticsError:
mode_price = None
stats[category] = {
'mean': mean(prices),
'average': sum(prices) / len(prices) if prices else 0,
'mode': mode_price
}
return stats
def print_stats(stats: dict):
"""Print statistics for each category."""
for category, stats_data in stats.items():
print(f"Category: {category}")
print(f" Mean: {stats_data['mean']:.2f}")
print(f" Average: {stats_data['average']:.2f}")
print(f" Mode: {stats_data['mode']:.2f}" if stats_data['mode'] is not None else " Mode: No mode")
print()
def main():
"""Main function."""
data = load_data_from_csv(FILE_PATH)
if data:
category_data = process_data(data)
stats = calculate_stats(category_data)
print_stats(stats)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment