From d63ada8bfae1c6d3e676443f5373006e8e49cf83 Mon Sep 17 00:00:00 2001 From: looking for Date: Thu, 2 Apr 2026 21:40:14 +0300 Subject: [PATCH] first commit --- data/orders.txt | 7 +++ orders_analysis.py | 134 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 data/orders.txt create mode 100644 orders_analysis.py diff --git a/data/orders.txt b/data/orders.txt new file mode 100644 index 0000000..cc74c8a --- /dev/null +++ b/data/orders.txt @@ -0,0 +1,7 @@ +1,2500,Москва,card +2,1300,Казань,cash +1,800,Москва,card +3,5000,СПб,card +2,450,Казань,cash +1,1200,Москва,card +4,3000,СПБ,crypto \ No newline at end of file diff --git a/orders_analysis.py b/orders_analysis.py new file mode 100644 index 0000000..b8487e6 --- /dev/null +++ b/orders_analysis.py @@ -0,0 +1,134 @@ +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() \ No newline at end of file