practice/orders_analysis.py
2026-04-02 21:40:14 +03:00

134 lines
4.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
from collections import defaultdict
def load_data(filepath: str) -> list[dict]:
orders = []
try:
with open(filepath, 'r', encoding='utf-8') as file:
for line_num, line in enumerate(file, 1):
line = line.strip()
if not line:
continue
parts = line.split(',')
if len(parts) != 4:
continue
try:
user_id = int(parts[0].strip())
order_total = float(parts[1].strip())
city = parts[2].strip().lower()
payment_method = parts[3].strip().lower()
orders.append({
'user_id': user_id,
'order_total': order_total,
'city': city,
'payment_method': payment_method
})
except ValueError:
continue
except FileNotFoundError:
return []
return orders
def filter_by_city(orders: list[dict], city: str) -> list[dict]:
city_lower = city.lower()
return [order for order in orders if order['city'] == city_lower]
def filter_by_min_total(orders: list[dict], min_total: float) -> list[dict]:
return [order for order in orders if order['order_total'] >= min_total]
def get_unique_users(orders: list[dict]) -> list[int]:
return list(set(order['user_id'] for order in orders))
def total_revenue(orders: list[dict]) -> float:
return sum(order['order_total'] for order in orders)
def average_order_value(orders: list[dict]) -> float:
if not orders:
return 0.0
return total_revenue(orders) / len(orders)
def payment_method_stats(orders: list[dict]) -> dict[str, int]:
stats = defaultdict(int)
for order in orders:
stats[order['payment_method']] += 1
return dict(stats)
def city_revenue(orders: list[dict]) -> dict[str, float]:
revenue = defaultdict(float)
for order in orders:
revenue[order['city']] += order['order_total']
return dict(revenue)
def top_users_by_spent(orders: list[dict], top_n: int) -> list[tuple[int, float]]:
user_spent = defaultdict(float)
for order in orders:
user_spent[order['user_id']] += order['order_total']
sorted_users = sorted(user_spent.items(), key=lambda x: x[1], reverse=True)
return sorted_users[:top_n]
def filter_top_cities_by_orders(orders: list[dict], min_orders: int) -> list[str]:
city_orders = defaultdict(int)
for order in orders:
city_orders[order['city']] += 1
filtered_cities = [(city, count) for city, count in city_orders.items() if count >= min_orders]
filtered_cities.sort(key=lambda x: x[1], reverse=True)
return [city for city, _ in filtered_cities]
def main():
filepath = "data/orders.txt"
orders = load_data(filepath)
if not orders:
return
revenue = total_revenue(orders)
print(f"Общая выручка: {revenue:.2f} руб.")
avg_order = average_order_value(orders)
print(f"Средняя сумма заказа: {avg_order:.2f} руб.")
payment_stats = payment_method_stats(orders)
print("Статистика по методам оплаты:")
for method, count in payment_stats.items():
print(f" {method}: {count}")
top_users = top_users_by_spent(orders, 2)
print("Топ-2 пользователей по сумме трат:")
for user_id, spent in top_users:
print(f" Пользователь {user_id}: {spent:.2f} руб.")
filtered_orders = filter_by_min_total(orders, 1000)
if filtered_orders:
city_rev = city_revenue(filtered_orders)
print("Выручка по городам (заказы >= 1000 руб.):")
for city, rev in sorted(city_rev.items(), key=lambda x: x[1], reverse=True):
print(f" {city.capitalize()}: {rev:.2f} руб.")
top_cities = filter_top_cities_by_orders(orders, 2)
if top_cities:
print("Города с количеством заказов >= 2:")
for city in top_cities:
print(f" {city.capitalize()}")
if __name__ == "__main__":
main()