MyPractice/main.py
2026-04-17 19:02:40 +03:00

122 lines
3.9 KiB
Python
Raw 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 csv
from collections import defaultdict
def load_data(filepath: str) -> list[dict]:
records = []
with open(filepath, mode='r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
if not row: continue
name, category, price, quantity, date = row
records.append({
"name": name.strip(),
"category": category.strip(),
"price": float(price),
"quantity": int(quantity),
"date": date.strip()
})
return records
def clean_data(records: list[dict]) -> list[dict]:
cleaned = []
for r in records:
if r['price'] >= 0 and r['quantity'] >= 0:
r['category'] = r['category'].lower()
cleaned.append(r)
return cleaned
def filter_by_category(records: list[dict], category: str) -> list[dict]:
return [r for r in records if r['category'] == category.lower()]
def filter_by_price_range(records: list[dict], min_price: float, max_price: float) -> list[dict]:
return [r for r in records if min_price <= r['price'] <= max_price]
def total_revenue(records: list[dict]) -> float:
return sum(r['price'] * r['quantity'] for r in records)
def category_revenue(records: list[dict]) -> dict[str, float]:
rev_map = defaultdict(float)
for r in records:
rev_map[r['category']] += r['price'] * r['quantity']
return dict(rev_map)
def top_n_items(records: list[dict], n: int) -> list[tuple[str, int]]:
counts = defaultdict(int)
for r in records:
counts[r['name']] += r['quantity']
sorted_items = sorted(counts.items(), key=lambda x: x[1], reverse=True)
return sorted_items[:n]
def monthly_sales(records: list[dict]) -> dict[str, float]:
monthly_rev = defaultdict(float)
for r in records:
month = r['date'][:7] # Извлекает YYYY-MM
monthly_rev[month] += r['price'] * r['quantity']
return dict(sorted(monthly_rev.items()))
def best_selling_category(records: list[dict]) -> str:
cat_rev = category_revenue(records)
if not cat_rev: return ""
return max(cat_rev, key=cat_rev.get)
def export_summary(records: list[dict], output_path: str) -> None:
rev = total_revenue(records)
best_cat = best_selling_category(records)
top3 = top_n_items(records, 3)
monthly = monthly_sales(records)
with open(output_path, 'w', encoding='utf-8') as f:
f.write("СВОДНЫЙ ОТЧЕТ ПО ПРОДАЖАМ\n")
f.write("=" * 30 + "\n")
f.write(f"Общая выручка: {rev:.2f}\n")
f.write(f"Лучшая категория: {best_cat}\n\n")
f.write("Топ-3 товара (по количеству):\n")
for name, qty in top3:
f.write(f"- {name}: {qty} шт.\n")
f.write("\nВыручка по месяцам:\n")
for month, m_rev in monthly.items():
f.write(f"- {month}: {m_rev:.2f}\n")
def main() -> None:
# 1. Загрузка
data = load_data("data/sales.csv")
# 2. Очистка
data = clean_data(data)
# 3. Фильтрация
filtered = filter_by_price_range(data, 10, 500)
# 4. Анализ
rev = total_revenue(filtered)
category_revenue(filtered)
best_cat = best_selling_category(filtered)
top3 = top_n_items(filtered, 3)
monthly = monthly_sales(filtered)
# 5. Вывод в консоль
print(f"--- Результаты анализа (фильтр: 10-500 руб) ---")
print(f"Общая выручка: {rev:.2f}")
print(f"Лучшая категория: {best_cat.capitalize()}")
print(f"Топ-3 товара: {top3}")
print(f"Выручка по месяцам: {monthly}")
# 6. Экспорт
export_summary(filtered, "report.txt")
print(f"\nОтчет успешно сохранен в report.txt")
if __name__ == "__main__":
main()