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))