File size: 2,660 Bytes
6f17317
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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))