All Laba1
This commit is contained in:
parent
7de9471f59
commit
9a0c2b847f
20
data/data.txt
Normal file
20
data/data.txt
Normal file
@ -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
|
||||||
200
skelet.py
200
skelet.py
@ -1,36 +1,216 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
def parse_review_line(line):
|
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):
|
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):
|
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):
|
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):
|
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):
|
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):
|
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):
|
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):
|
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):
|
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():
|
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")
|
print("Отчет сохранен в файл data/report.txt")
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user