File size: 5,476 Bytes
4f038ca
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# audience_reaction.py

import pandas as pd
import matplotlib.pyplot as plt
import streamlit as st
import json
from utils import client

import plotly.graph_objs as go
import plotly.express as px
from plotly.subplots import make_subplots

def analyze_audience_reaction(thread_id, additional_context=None):
    run = client.beta.threads.runs.create(
        thread_id=thread_id,
        assistant_id="asst_kr92jSrWpbdEI9wSHl2OIOA2"
    )
    
    while run.status in ['queued', 'in_progress', 'cancelling']:
        run = client.beta.threads.runs.retrieve(
            thread_id=thread_id,
            run_id=run.id
        )
    
    if run.status == 'completed':
        messages = client.beta.threads.messages.list(thread_id=thread_id)
        analysis = next((msg.content[0].text.value for msg in reversed(list(messages)) if msg.role == "assistant"), "")
        return analysis
    else:
        return f"Error: Run status is {run.status}"

def process_audience_reaction(analysis):
    try:
        # Parse JSON data
        data = json.loads(analysis)
        
        # Display raw data for debugging
        st.write("Raw data:")
        st.json(data)

        # Convert the JSON data to a DataFrame
        df = pd.DataFrame.from_dict(data, orient='index')
        df = df.reset_index()
        df.columns = ['Sequence', 'sequence_name', 'emotional_impact', 'excitement']
        
        # Sort the DataFrame by the order of sequences in the original JSON
        df['Sequence'] = pd.Categorical(df['Sequence'], categories=data.keys(), ordered=True)
        df = df.sort_values('Sequence')

        # 1. Emotional Impact and Excitement Line Chart
        st.write("### Emotional Impact and Excitement Throughout the Script")
        fig = go.Figure()
        fig.add_trace(go.Scatter(x=df['Sequence'], y=df['emotional_impact'], mode='lines+markers', name='Emotional Impact'))
        fig.add_trace(go.Scatter(x=df['Sequence'], y=df['excitement'], mode='lines+markers', name='Excitement'))
        fig.update_layout(title='Emotional Impact and Excitement Throughout the Script',
                          xaxis_title='Sequence', yaxis_title='Level',
                          legend_title='Metric')
        st.plotly_chart(fig, use_container_width=True)

        # 2. Emotional Impact vs Excitement Scatter Plot
        st.write("### Emotional Impact vs Excitement")
        fig = px.scatter(df, x='emotional_impact', y='excitement', text='Sequence',
                         title='Emotional Impact vs Excitement for Each Sequence',
                         labels={'emotional_impact': 'Emotional Impact', 'excitement': 'Excitement'})
        fig.update_traces(textposition='top center')
        st.plotly_chart(fig, use_container_width=True)

        # 3. Stacked Bar Chart of Emotional Impact and Excitement
        st.write("### Comparison of Emotional Impact and Excitement")
        fig = go.Figure(data=[
            go.Bar(name='Emotional Impact', x=df['Sequence'], y=df['emotional_impact']),
            go.Bar(name='Excitement', x=df['Sequence'], y=df['excitement'])
        ])
        fig.update_layout(barmode='group', title='Comparison of Emotional Impact and Excitement Across Sequences')
        st.plotly_chart(fig, use_container_width=True)

        # 4. Radar Chart of Emotional Impact and Excitement
        st.write("### Radar Chart of Emotional Impact and Excitement")
        fig = go.Figure(data=go.Scatterpolar(
          r=df['emotional_impact'].tolist() + [df['emotional_impact'].iloc[0]],
          theta=df['Sequence'].tolist() + [df['Sequence'].iloc[0]],
          fill='toself',
          name='Emotional Impact'
        ))
        fig.add_trace(go.Scatterpolar(
          r=df['excitement'].tolist() + [df['excitement'].iloc[0]],
          theta=df['Sequence'].tolist() + [df['Sequence'].iloc[0]],
          fill='toself',
          name='Excitement'
        ))
        fig.update_layout(
          polar=dict(radialaxis=dict(visible=True, range=[0, 1])),
          showlegend=True,
          title='Radar Chart of Emotional Impact and Excitement'
        )
        st.plotly_chart(fig, use_container_width=True)

        # Key Insights
        st.write("### Key Insights")
        peak_emotion = df.loc[df['emotional_impact'].idxmax()]
        peak_excitement = df.loc[df['excitement'].idxmax()]
        avg_emotion = df['emotional_impact'].mean()
        avg_excitement = df['excitement'].mean()
        
        st.write(f"1. The sequence with the highest emotional impact is '{peak_emotion['Sequence']}' with a score of {peak_emotion['emotional_impact']:.2f}.")
        st.write(f"2. The most exciting sequence is '{peak_excitement['Sequence']}' with an excitement level of {peak_excitement['excitement']:.2f}.")
        st.write(f"3. The average emotional impact across all sequences is {avg_emotion:.2f}.")
        st.write(f"4. The average excitement level across all sequences is {avg_excitement:.2f}.")
        if peak_emotion['Sequence'] == peak_excitement['Sequence']:
            st.write(f"5. '{peak_emotion['Sequence']}' is the most impactful sequence, peaking in both emotional impact and excitement.")
        
    except Exception as e:
        st.error(f"Error processing data for Audience Reaction Analysis: {e}")
        st.write("Please check the structure of the JSON data:")
        st.json(analysis)