File size: 3,562 Bytes
caf57e7
086edea
 
 
610814b
ac896ff
caf57e7
 
40f7988
0a4ef0e
 
5a1ffea
ab20b35
 
0a4ef0e
5a1ffea
0a4ef0e
5a1ffea
086edea
9efaeb6
 
5a1ffea
 
 
 
 
0af20e7
112a4cf
0f2bd46
5a1ffea
6486a17
5a1ffea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73b4ec0
 
 
 
ad4de8d
5a1ffea
086edea
5a1ffea
 
4946181
5a1ffea
 
 
 
 
 
 
 
4946181
5a1ffea
4946181
5a1ffea
 
 
 
4946181
5a1ffea
37af0d2
5a1ffea
 
 
 
37af0d2
 
5a1ffea
ad4de8d
 
 
 
5a1ffea
086edea
5a1ffea
4946181
 
 
5a1ffea
 
 
 
 
 
 
ad4de8d
5a1ffea
 
 
ad4de8d
73b4ec0
 
5a1ffea
086edea
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
import streamlit as st
import pandas as pd
import plotly_express as px
import plotly.graph_objects as go
from functions import *
import validators

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

if st.session_state.url or st.session_state.upload:
    
    results, title = inference(st.session_state.url,st.session_state.upload)

    st.subheader(title)
    
    earnings_passages = results['text']
    
    st.session_state['earnings_passages'] = earnings_passages
    
    with open('earnings.txt','w') as f:
        f.write(earnings_passages)
        
    with open('earnings.txt','r') as f:
        earnings_passages = f.read()
        
    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']
    
    # 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)
    
    ## Display negative sentence locations
    fig = px.scatter(sen_df, y='label', color='label', size='score', hover_data=['text'], color_discrete_map={"Negative":"firebrick","Neutral":"navajowhite","Positive":"darkgreen"}, title='Sentiment Score Distribution')
    
    
    fig.update_layout(
    	showlegend=False,
        autosize=True,
        width=1000,
        height=500,
        margin=dict(
            b=5,
            t=50,
            pad=4
        )
    )
    
    st.plotly_chart(fig)
    
else:
    st.write("No YouTube URL or file upload detected")