kikikita's picture
Add application file
6f17317
import streamlit as st
import pandas as pd
import random
pd.options.mode.chained_assignment = None
@st.cache_data
def get_data():
df = pd.read_csv('movies_prepared.csv')
return df
df = get_data()
df.dialog = df.dialog.apply(lambda x: eval(x) if isinstance(x, str) else x)
df.order = df.order.apply(lambda x: eval(x) if isinstance(x, str) else x)
df.characters = df.characters.apply(
lambda x: eval(x) if isinstance(x, str) else x)
df.genres = df.genres.apply(lambda x: eval(x) if isinstance(x, str) else x)
df.names = df.names.apply(lambda x: eval(x) if isinstance(x, str) else x)
labels = [
'Positive',
'Negative',
'Neutral'
]
mapping = {i: k for i, k in enumerate(labels)}
st.sidebar.header('Выбор фильма и персонажа')
movie_title = st.sidebar.selectbox('Название фильма',
df.movie_title.unique().tolist())
character = st.sidebar.selectbox('Персонаж',
[' '] + df[
df.movie_title == movie_title].names.explode().unique().tolist(),
disabled=False)
movie_id_ = df.query('movie_title == @movie_title').movie_id.unique().item()
def genres_stat(movie_id, character=None):
df_final = df.query('movie_id == @movie_id')
df_final['emotion'] = df_final.dialog.apply(
lambda x: [random.randint(0, 2) for _ in x])
df_final['emotion'] = df_final.emotion.apply(
lambda x: [mapping[i] for i in x])
df_final.reset_index(inplace=True, drop=True)
df_final = df_final[['names', 'emotion']]
df_final = df_final.explode(['names', 'emotion'])
df_final = df_final.groupby('names')['emotion'].value_counts(
normalize=True).to_frame('frequency')
if character is not None:
df_to_return = df_final.loc[character]
df_to_return.index.names = ['Эмоция']
return df_to_return.rename(columns={
'frequency': f'Соотношение для персонажа {character}'})
else:
df_final.index.names = ['Персонаж', 'Эмоция']
return df_final.rename(
columns={'frequency': f'Соотношение'}) # т.к. персонажей в фильме может быть много, возвращаем в текстовом формате
st.header(f'Выбранный фильм: {movie_title}')
if character == ' ':
st.subheader('Персонаж не выбран')
st.write(genres_stat(movie_id_))
else:
st.subheader(f'Выбранный персонаж: {character}')
st.write(genres_stat(movie_id_, character))