diff --git a/data/data.txt b/data/data.txt new file mode 100644 index 0000000..27fc5ae --- /dev/null +++ b/data/data.txt @@ -0,0 +1,20 @@ +user_137|Побег из Шоушенка|9|Шедевр на все времена! Обязательно к просмотру.|2024-01-15|124|156 +user_042|Криминальное чтиво|8|Отличный фильм, диалоги выше всяких похвал|2024-01-20|89|112 +user_073|Начало|9|Сложный и глубокий фильм, заставляет думать|2024-02-05|156|189 +user_191|Тёмный рыцарь|10|Лучший фильм о супергероях|2024-02-10|203|245 +user_225|Побег из Шоушенка|10|Абсолютный шедевр, пересматривал много раз|2024-02-15|178|201 +user_308|Матрица|7|Интересная концепция, но местами затянуто|2024-02-20|45|89 +user_456|Криминальное чтиво|9|Гениально! Тарантино в лучшем виде|2024-03-01|134|167 +user_512|Начало|8|Хороший фильм, но слишком запутанный конец|2024-03-05|67|98 +user_678|Зелёная книга|9|Трогательная история, рекомендую всем|2024-03-10|112|134 +user_789|Паразиты|9|Неожиданный сюжет, отличная режиссура|2024-03-15|98|123 +user_890|Тёмный рыцарь|10|Легендарный фильм, Хит Леджер великолепен|2024-03-20|245|267 +user_901|Побег из Шоушенка|8|Хороший фильм, но немного затянут|2024-03-25|34|78 +user_234|Интерстеллар|9|Визуально потрясающе, эмоционально сильно|2024-04-01|167|189 +user_345|Бойцовский клуб|8|Культовый фильм, но на любителя|2024-04-05|78|112 +user_567|Форрест Гамп|9|Душевный фильм, пересматриваю каждый год|2024-04-10|145|167 +user_654|Зелёная книга|8|Хороший фильм, отличная игра актёров|2024-04-12|56|89 +user_765|Паразиты|10|Реально крутой фильм, неожиданная развязка|2024-04-15|189|201 +user_876|Интерстеллар|10|Шедевр научной фантастики|2024-04-20|234|256 +user_987|Бойцовский клуб|9|Отличный фильм, меняет мировоззрение|2024-04-25|98|123 +user_111|Форрест Гамп|10|Легендарный фильм, жизненная история|2024-04-28|201|223 \ No newline at end of file diff --git a/skelet.py b/skelet.py index 0fd3103..c10eb2f 100644 --- a/skelet.py +++ b/skelet.py @@ -1,36 +1,216 @@ import os def parse_review_line(line): - return None + parts = line.strip().split("|") + return { + "user_id": parts[0], + "movie_title": parts[1], + "rating": float(parts[2]), + "review_text": parts[3], + "watch_date": parts[4], + "useful_votes": int(parts[5]), + "total_votes": int(parts[6]) + } def load_reviews(file_path): - return None + if not os.path.exists(file_path): + print("Файл не найден") + return [] + f = open(file_path, "r", encoding="utf-8") + reviews = [] + for line in f: + line = line.strip() + if line != "": + reviews.append(parse_review_line(line)) + f.close() + return reviews def filter_by_min_rating(reviews, min_rating): - return None + result = [] + for r in reviews: + if r["rating"] >= min_rating: + result.append(r) + return result def calculate_average_rating(reviews): - return None + if len(reviews) == 0: + return 0 + total = sum(r["rating"] for r in reviews) + return round(total / len(reviews), 2) def get_movie_statistics(reviews): - return None + stats = {} + for r in reviews: + title = r["movie_title"] + if title not in stats: + stats[title] = {} + stats[title]["reviews_count"] = 0 + stats[title]["total_rating"] = 0 + stats[title]["total_useful_votes"] = 0 + stats[title]["reviews_count"] = stats[title]["reviews_count"] + 1 + stats[title]["total_rating"] = stats[title]["total_rating"] + r["rating"] + stats[title]["total_useful_votes"] = stats[title]["total_useful_votes"] + r["useful_votes"] + + for title in stats: + stats[title]["average_rating"] = round(stats[title]["total_rating"] / stats[title]["reviews_count"], 2) + del stats[title]["total_rating"] + + items = list(stats.items()) + items.sort(key=lambda x: x[1]["reviews_count"], reverse=True) + + result = {} + for title, data in items: + result[title] = data + return result def find_most_useful_review(reviews): - return None + if len(reviews) == 0: + return {} + + best = min(reviews, key=lambda x: - (x["useful_votes"] / x["total_votes"]) if x["total_votes"] > 0 else -1) + percent = (best["useful_votes"] / best["total_votes"]) * 100 if best["total_votes"] > 0 else 0 + + return { + "movie_title": best["movie_title"], + "review_text": best["review_text"], + "useful_percentage": round(percent, 2) + } def group_reviews_by_month(reviews): - return None + months = {} + for r in reviews: + month = r["watch_date"][:7] + if month in months: + months[month] = months[month] + 1 + else: + months[month] = 1 + + result = dict(sorted(months.items())) + return result def filter_by_keywords(reviews, keywords): - return None + result = [] + for r in reviews: + text = r["review_text"].lower() + if any(k.lower() in text for k in keywords): + result.append(r) + return result def get_top_movies_by_rating(reviews, n): - return None + data = {} + for r in reviews: + title = r["movie_title"] + if title not in data: + data[title] = {} + data[title]["total"] = 0 + data[title]["count"] = 0 + data[title]["total"] = data[title]["total"] + r["rating"] + data[title]["count"] = data[title]["count"] + 1 + + ratings = [] + for title in data: + if data[title]["count"] >= 2: + avg = data[title]["total"] / data[title]["count"] + ratings.append((title, round(avg, 2))) + + ratings.sort(key=lambda x: x[1], reverse=True) + return ratings[:n] def generate_review_report(reviews, file_path): - return None + if len(reviews) == 0: + return + + total = len(reviews) + avg_rating = calculate_average_rating(reviews) + movie_stats = get_movie_statistics(reviews) + top_movies = get_top_movies_by_rating(reviews, 3) + monthly = group_reviews_by_month(reviews) + + useful_list = [] + for r in reviews: + if r["total_votes"] > 0: + percent = (r["useful_votes"] / r["total_votes"]) * 100 + useful_list.append((r, percent)) + + useful_list.sort(key=lambda x: x[1], reverse=True) + + f = open(file_path, "w", encoding="utf-8") + f.write("ОТЧЕТ ПО РЕЦЕНЗИЯМ\n") + f.write("\n") + f.write("Всего рецензий: " + str(total) + "\n") + f.write("Средний рейтинг: " + str(avg_rating) + "\n") + f.write("\n") + f.write("ТОП 5 ФИЛЬМОВ ПО КОЛИЧЕСТВУ РЕЦЕНЗИЙ\n") + + items = list(movie_stats.items()) + for i in range(min(5, len(items))): + title, s = items[i] + f.write(str(i + 1) + ". " + title + " - рецензий: " + str(s["reviews_count"]) + ", средний рейтинг: " + str(s["average_rating"]) + "\n") + + f.write("\n") + f.write("ТОП 3 САМЫХ ПОЛЕЗНЫХ РЕЦЕНЗИЙ ()\n") + + for i in range(min(3, len(useful_list))): + r, p = useful_list[i] + f.write(str(i + 1) + ". " + r["movie_title"] + " - " + str(p) + "%\n") + f.write(" " + r["review_text"][:100] + "\n") + + f.write("\n") + f.write("ДИНАМИКА ПО МЕСЯЦАМ\n") + + for m in monthly: + f.write(m + ": " + str(monthly[m]) + " рецензий\n") + + f.write("\n") + f.write("ТОП 3 ФИЛЬМА ПО СРЕДНЕМУ РЕЙТИНГУ (мин 2 рецензии)\n") + + for i in range(len(top_movies)): + title, rating = top_movies[i] + f.write(str(i + 1) + ". " + title + " - " + str(rating) + "\n") + + f.close() + + if not os.path.exists("data"): + os.makedirs("data") def main(): + reviews = load_reviews("data/data.txt") + + if len(reviews) == 0: + return + + print("Общее количество рецензий:", len(reviews)) + print() + + print("Средний рейтинг:", calculate_average_rating(reviews)) + print() + + print("Топ 5 фильмов по количеству рецензий:") + stats = get_movie_statistics(reviews) + count = 0 + for title in stats: + if count >= 5: + break + s = stats[title] + print(str(count + 1) + ".", title, "-", s["reviews_count"], "рецензий, средний рейтинг:", s["average_rating"]) + count = count + 1 + print() + + print("Самая полезная рецензия:") + useful = find_most_useful_review(reviews) + print("Фильм:", useful["movie_title"]) + print("Полезность:", useful["useful_percentage"], "%") + print("Текст:", useful["review_text"][:100], "...") + print() + + print("Топ 3 фильма по среднему рейтингу (мин 2 рецензии):") + top = get_top_movies_by_rating(reviews, 3) + for i in range(len(top)): + title, rating = top[i] + print(str(i + 1) + ".", title, "-", rating) + print() + + generate_review_report(reviews, "data/report.txt") print("Отчет сохранен в файл data/report.txt") if __name__ == "__main__":