File size: 4,227 Bytes
caf57e7
086edea
 
 
610814b
ac896ff
16969fc
caf57e7
5f012a8
40f7988
0a4ef0e
 
7ceed73
5664abb
7ceed73
ed945e3
 
 
37e8b9d
0a4ef0e
37e8b9d
0af20e7
7ceed73
0f2bd46
37e8b9d
5a1ffea
455a7e5
37e8b9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5a1ffea
37e8b9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5a1ffea
37e8b9d
 
 
 
16969fc
 
37e8b9d
16969fc
37e8b9d
 
 
 
 
16969fc
37e8b9d
 
 
 
 
 
5a1ffea
37e8b9d
 
 
 
5a1ffea
37e8b9d
 
b3059bf
37e8b9d
5a1ffea
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
116
117
118
119
120
121
122
123
124
125
126
127
import streamlit as st
import pandas as pd
import plotly_express as px
import plotly.graph_objects as go
from functions import *
import validators
import textwrap

#st.set_page_config(page_title="Earnings Sentiment Analysis", page_icon="πŸ“ˆ")
st.sidebar.header("Sentiment Analysis")
st.markdown("## Earnings Sentiment Analysis with FinBert-Tone")

#load whisper model
asr_model = load_asr_model(st.session_state.sbox)

if "url" not in st.session_state:
    st.session_state.url = ''

try:

    if st.session_state['url'] is not None or st.session_state['upload'] is not None:
        
        results, title = inference(st.session_state.url,st.session_state.upload,asr_model)
    
        st.subheader(title)
        
        earnings_passages = clean_text(results)
        
        st.session_state['earnings_passages'] = earnings_passages
            
        earnings_sentiment, earnings_sentences = sentiment_pipe(earnings_passages)
        
        with st.expander("See Transcribed Earnings Text"):
            st.write(f"Number of Sentences: {len(earnings_sentences)}")
            
            st.write(earnings_passages)
        
        
        ## Save to a dataframe for ease of visualization
        sen_df = pd.DataFrame(earnings_sentiment)
        sen_df['text'] = earnings_sentences
        grouped = pd.DataFrame(sen_df['label'].value_counts()).reset_index()
        grouped.columns = ['sentiment','count']
        
        st.session_state['sen_df'] = sen_df
        
        # Display number of positive, negative and neutral sentiments
        fig = px.bar(grouped, x='sentiment', y='count', color='sentiment', color_discrete_map={"Negative":"firebrick","Neutral":\
                                                                                               "navajowhite","Positive":"darkgreen"},\
                                                                                               title='Earnings Sentiment')
        
        fig.update_layout(
        	showlegend=False,
            autosize=True,
            margin=dict(
                l=25,
                r=25,
                b=25,
                t=50,
                pad=2
            )
        )
        
        
        st.plotly_chart(fig)
        
        ## Display sentiment score
        pos_perc = grouped[grouped['sentiment']=='Positive']['count'].iloc[0]*100/sen_df.shape[0]
        neg_perc = grouped[grouped['sentiment']=='Negative']['count'].iloc[0]*100/sen_df.shape[0]
        neu_perc = grouped[grouped['sentiment']=='Neutral']['count'].iloc[0]*100/sen_df.shape[0]
        
        sentiment_score = neu_perc+pos_perc-neg_perc
        
        fig_1 = go.Figure()
        
        fig_1.add_trace(go.Indicator(
            mode = "delta",
            value = sentiment_score,
            domain = {'row': 1, 'column': 1}))
        
        fig_1.update_layout(
        	template = {'data' : {'indicator': [{
                'title': {'text': "Sentiment Score"},
                'mode' : "number+delta+gauge",
                'delta' : {'reference': 50}}]
                                 }},
            autosize=False,
            width=250,
            height=250,
            margin=dict(
                l=5,
                r=5,
                b=5,
                pad=2
            )
        )
        
        with st.sidebar:
        
            st.plotly_chart(fig_1)

        hd = sen_df.text.apply(lambda txt: '<br>'.join(textwrap.wrap(txt, width=70)))
        ## Display negative sentence locations
        fig = px.scatter(sen_df, y='label', color='label', size='score', hover_data=[hd], color_discrete_map={"Negative":"firebrick","Neutral":"navajowhite","Positive":"darkgreen"}, title='Sentiment Score Distribution')
        
        
        fig.update_layout(
        	showlegend=False,
            autosize=True,
            width=800,
            height=500,
            margin=dict(
                b=5,
                t=50,
                pad=4
            )
        )
        
        st.plotly_chart(fig)
        
    else:
    
        st.write("No YouTube URL or file upload detected")
        
except (AttributeError, TypeError):

    st.write("No YouTube URL or file upload detected")