first commit

This commit is contained in:
looking for 2026-04-02 21:40:14 +03:00
commit d63ada8bfa
2 changed files with 141 additions and 0 deletions

7
data/orders.txt Normal file
View File

@ -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

134
orders_analysis.py Normal file
View File

@ -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()