|
import pandas as pd
|
|
|
|
def load_movie_data(path="imdb_top_1000/imdb_top_1000.csv"):
|
|
df = pd.read_csv(path)
|
|
df.rename(columns={"Series_Title": "title", "Released_Year": "year", "Genre": "genre",
|
|
"IMDB_Rating": "rating", "Poster_Link": "poster"}, inplace=True)
|
|
|
|
|
|
df["mood"] = df["genre"].apply(lambda g: infer_mood_from_genre(g))
|
|
return df
|
|
|
|
def infer_mood_from_genre(genre_str):
|
|
genre_str = genre_str.lower() if isinstance(genre_str, str) else ""
|
|
if any(g in genre_str for g in ["romance", "comedy"]):
|
|
return "Feel-good"
|
|
elif any(g in genre_str for g in ["action", "thriller"]):
|
|
return "Intense"
|
|
elif "drama" in genre_str:
|
|
return "Thought-provoking"
|
|
elif "animation" in genre_str:
|
|
return "Funny"
|
|
else:
|
|
return "General"
|
|
|
|
def recommend_movies(df, mood=None, genre=None, min_rating=0.0):
|
|
filtered = df.copy()
|
|
|
|
if mood:
|
|
filtered = filtered[filtered["mood"].str.contains(mood, case=False, na=False)]
|
|
|
|
if genre and genre.lower() != "any":
|
|
filtered = filtered[filtered["genre"].str.contains(genre, case=False, na=False)]
|
|
|
|
filtered = filtered[filtered["rating"] >= min_rating]
|
|
|
|
filtered = filtered.sort_values(by="rating", ascending=False)
|
|
|
|
return filtered.head(10)
|
|
|
|
|