134 lines
4.2 KiB
Python
134 lines
4.2 KiB
Python
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() |