From e2b4e5734093561e5e10a61dc348dc60d44fcc0e Mon Sep 17 00:00:00 2001 From: carlotagomezr Date: Tue, 5 Mar 2024 18:05:15 +0100 Subject: [PATCH 1/7] setting app structure --- __pycache__/eda_view.cpython-311.pyc | Bin 0 -> 2882 bytes __pycache__/prediction_view.cpython-311.pyc | Bin 0 -> 1452 bytes eda_view.py | 38 +++++++++++++++++ prediction_view.py | 23 +++++++++++ streamlit_app.py | 43 ++++---------------- 5 files changed, 70 insertions(+), 34 deletions(-) create mode 100644 __pycache__/eda_view.cpython-311.pyc create mode 100644 __pycache__/prediction_view.cpython-311.pyc create mode 100644 eda_view.py create mode 100644 prediction_view.py diff --git a/__pycache__/eda_view.cpython-311.pyc b/__pycache__/eda_view.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..113625bdcc88bc4b6579d30d1db1bcf2d1784477 GIT binary patch literal 2882 zcmb_e&u<&Y6`m!BKO~AP$(9^CsoO;m$dD77hMW{_n!2@Q$8sV|c4QYV4<&}25w-Gi zcRRallL8emhJh4?feJ-|7-$L*MWH5;4k>ymdJ5owU@0sjVgLgHawvLJ;pUQ4->kH> zNaa$Xqv4x3GvB`V=6i2;^_OgR7(r{^{3rWe3Zbv$Bx%f8m{txjL&f26EmIr`$81e4j>2B-Au5hhWf@J!|0PW?Rt_D6!w|?g{GL4k z`4MuJ=bLLiohn+mHWBoVqdQ~$kwXRG_UKVeq|@=86NA{k%#TILCO(Gy*2w8e zI?)8?cP6)>&bE8CwvlKi+T)S6qa!^vXc>?vjv^wRzVI!`lhN+ck>&=GeW#j;u+79E zjv~0Drx({hF5Gb#cM2844a+4q=$1*0!h&Argf|LvhUL*^*W#qg3QH!t!u5MBf9LI= z73S`|x4cw(qj2->YlS(BvVzU62CKMMenmI)l;x|OP%A%kVdnMxO#aY*)vB>|UZBJ! zc>;bKj_wo~CE<$0+>&iMZt3ck%jfHcQ}@om0j@E})t~&$)F{(*v!YW5f;d`U1DHs; z#JOA2srOxgEm~lSf!#{CesX} z-6LElWrJxp;Y1@4Vww&MqiKv$FVK0)tKX*I&zMFh`tH$#Ob6^>OyIVM8z^JE)uTp z8cZY&Qf7uDlB-OwuDT-OfZx0Fm}SCikR9(OuzQ0!T0J?^)nB#JJMMcW=O#N3L6N&qf z3I=gnC5VH`aK(@;Al;;_E>%dXTej*V6(*(J5NXaFQnP`r3}`)Q%&v<#uq3jcElrgS z(y%;Nj2uquq|O{MV#D&9i#QguHsCdpf&+-foCE z_e}me_>~_M=L;yd7J53Ad30tUq1?ULzY!X~ANx-zTeDv$Q6lwl-p{_)!TA8^eVqR? z_u}Ipew^LQ<#%)WPOcE-3O=5Eijxv{*+2giDYKV5cs9VZK9(j<<$nLm_H29o&x@VO zi^1f@)@*D2gT*dRez@>pVe`fI?bbpEp9}CgAD??VI{v8Xe`gk=xvJcZ^$!r-*ew|x z$kzOR5{-`kcI`K7k8>UMSJy?V+oEOF(AP= z$ktpJr}psVE}nc`h0}NNRDh>^JQXfa?BWSu`>~HFI`~q6FZuYAq-SY!u7h&{&iOd^ zbsCMRkG{Woqh0*0{(0HYT<>JA2bt@wD_xxaaPh&SfAU%f&j)zk$MbS&>A}+GyB(|r zSo5)VxZ+Ptb@15$pY`!s>EZgX=?6;>ms;W9Ge|F*9v4YsxJ2h74x>nzUJYs>X4)bN z?=DIlF28$Xyhhxx^z|~-h}8INay@RtLqolS;_~$(QVt_!i<=_un2t~nuFQE>x8c4y zB6X?o`I#q4g|6a)`F z^x#p@zrb(rp8X3pkV6>gNkqIws!%-nc9TtAYw_*my*KlI^WNLv3;Rlzvj}AI+E;o} zMCfy{i9{GW+vmV}j#Q*#9o2DYg}NBpL_HZ=$w<}Hc!0^&v#PLx>IYQ3gi7MKAkFpG zFj;6M&`=F+Z{i@c3p$dABVWZY!GAZ}vkx&`)E!cV_hKA5jc`0?P%9KQ5l8-oON?;I z_fj1BIG%AAnc9QIu|9W^={-mxhD?sCXZ9e)eURBb$OOy-o|nMSyAemhWR}nbDkCSc zDy)fj(JIF1F7Pyn1kuug>+2_Lj1pG#Oj0yGxj z{u6p(Jyj!yZ57LaP3ojc_2{G$IaMxQHdi#lc)CW+7S#zWNnCJTE;T*ZwM?D}it*$s z(_G54E?sjQnrVA39}5Bv$7>pz+ZcdLNiMa5lI5YT3~iOmF(8*)VYT5sC*Zso$S*@# zb|`a{7Gb*O5*vKWB)W1&sb;-3Dc|esLCY@*63Y}bDxUJNdZ!O(uOe;4R zt|-K|6~_e<4PA35=^FH;Q^jUf)mpA*nT-{Vu1?u)E;7$#d8nR-pHqZ?`4jXdmDy7=`1@7+u*C@P*8mlW86bW{b=>jm>;bkI^svGhfe$P)kDYpX!WH- NIC#;2Yjy@I{RS$rWVrwU literal 0 HcmV?d00001 diff --git a/eda_view.py b/eda_view.py new file mode 100644 index 000000000000..88b7f3c32ebf --- /dev/null +++ b/eda_view.py @@ -0,0 +1,38 @@ +import altair as alt +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +import streamlit as st +import seaborn as sns +import plotly.express as px + +def run(): + df = pd.read_excel('/Users/carlotapersonal/Library/CloudStorage/OneDrive-UFV/CURSO_5/PFG/Code/proyecto-fin-de-grado-2024-2-carlotagomezr/data-analysis/eda/dataset_post_EDA.xlsx') + + # TITULO ----------------------------------------------------------------------------------- + st.title('Gestión de incidencias - EDA') + # Mostrar el número total de incidencias + total_incidencias = df['task_id'].nunique() + st.write(f'Número total de incidencias: {total_incidencias}') + + # GRAFICO DE BARRAS, ANALISIS TEMPORAL --------------------------------------------------------------------------------- + df['end_time'] = pd.to_datetime(df['end_time']) + df.set_index('end_time', inplace=True) + variable = st.selectbox('Seleccione la variable para agrupar:', ['priority', 'has_breached', 'assignment_group', 'company', 'contact_type']) + + # Agrupar por la variable seleccionada y resample por mes + grouped = df.groupby(variable).resample('M')['task_id'].nunique().reset_index() + + # Crear un gráfico de barras apilado con colores basados en la variable seleccionada + fig = px.bar(grouped, x='end_time', y='task_id', color=variable, title='Número de incidencias por mes', labels={'task_id':'Número de incidencias'}, height=400) + fig.update_layout(barmode='stack') + fig.update_xaxes(title_text='Mes y año de finalización') + st.plotly_chart(fig) + + + # GRAFICO DE BARRAS CON PRIORITY VS TIME_WORKED --------------------------------------------------------------------------- + fig2 = px.bar(x='time_worked', y='priority', color=variable) + fig2.set_title('Relación entre la prioridad y el tiempo trabajado') + fig2.set_ylabel('Prioridad') + fig2.set_xlabel('Tiempo trabajado') + st.pyplot(fig2) \ No newline at end of file diff --git a/prediction_view.py b/prediction_view.py new file mode 100644 index 000000000000..cd97ff68d1e1 --- /dev/null +++ b/prediction_view.py @@ -0,0 +1,23 @@ +import altair as alt +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +import streamlit as st + + +def run(): + # boton en el centro para crear una nueva incidencia que abra un formulario con campos basicos + if st.button('Crear una nueva incidencia'): + with st.form(key='my_form'): + st.write('Cree una nueva incidencia:') + + # Aquí puedes agregar los campos que necesites para tu formulario + campo1 = st.text_input(label='Campo 1') + campo2 = st.text_input(label='Campo 2') + campo3 = st.text_input(label='Campo 3') + + # Botón de envío del formulario + submit_button = st.form_submit_button(label='Enviar') + + # botón para cancelr el formulario + cancel_button = st.form_submit_button(label='Cancelar') diff --git a/streamlit_app.py b/streamlit_app.py index 7a0ed1272052..69b4e41718d7 100644 --- a/streamlit_app.py +++ b/streamlit_app.py @@ -2,39 +2,14 @@ import numpy as np import pandas as pd import streamlit as st +import eda_view as view1 +import prediction_view as view2 -""" -# Welcome to Streamlit! +st.sidebar.title('Selecciona una vista') +options = ['Gestión de incidencias - Análisis exploratorio de datos', 'Nueva incidencia - predicciones y LLM'] +menu = st.sidebar.selectbox('Select a view', options) -Edit `/streamlit_app.py` to customize this app to your heart's desire :heart:. -If you have any questions, checkout our [documentation](https://docs.streamlit.io) and [community -forums](https://discuss.streamlit.io). - -In the meantime, below is an example of what you can do with just a few lines of code: -""" - -num_points = st.slider("Number of points in spiral", 1, 10000, 1100) -num_turns = st.slider("Number of turns in spiral", 1, 300, 31) - -indices = np.linspace(0, 1, num_points) -theta = 2 * np.pi * num_turns * indices -radius = indices - -x = radius * np.cos(theta) -y = radius * np.sin(theta) - -df = pd.DataFrame({ - "x": x, - "y": y, - "idx": indices, - "rand": np.random.randn(num_points), -}) - -st.altair_chart(alt.Chart(df, height=700, width=700) - .mark_point(filled=True) - .encode( - x=alt.X("x", axis=None), - y=alt.Y("y", axis=None), - color=alt.Color("idx", legend=None, scale=alt.Scale()), - size=alt.Size("rand", legend=None, scale=alt.Scale(range=[1, 150])), - )) +if menu == options[0]: + view1.run() +elif menu == options[1]: + view2.run() From 06c74fa2591b3adb842ad9b956f0a2ba66078893 Mon Sep 17 00:00:00 2001 From: carlotagomezr Date: Wed, 6 Mar 2024 08:58:51 +0100 Subject: [PATCH 2/7] view 1 update --- __pycache__/eda_view.cpython-311.pyc | Bin 2882 -> 6889 bytes eda_view.py | 70 +++++++++++++++++++++++++-- streamlit_app.py | 6 +-- 3 files changed, 68 insertions(+), 8 deletions(-) diff --git a/__pycache__/eda_view.cpython-311.pyc b/__pycache__/eda_view.cpython-311.pyc index 113625bdcc88bc4b6579d30d1db1bcf2d1784477..8edf1b43f5fbbf4ab12700fef57178fe788d0a95 100644 GIT binary patch literal 6889 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 TGONS}I72zfrd47yFiHL^QmJEh delta 724 zcmZuu&ubGw6rS0g-DaC6G07%rnzSY$rfEyDXz^eX#E1#~k)obNC>v%A2^+I)w$RG7 z)KE}wP3I;EDM+R0q0oOo^dHzj6j|}qgLo_U)|0cl#)J9|@A1w1-kW(d@5k(ic<@ai zFbEjP@^^J_pdB2B3+>#30Pll5-`+~277sxC^*9}eq4w7lB=iP1liq};;1qeN{oxo9 zNDFX+BY^5~WQYJP%&{Z_Is>%JMd=|d@Q!#26Of}m?!`skO!m(Kpcd$J!easRgri4X zN`vpY!I}Zc)P08bz(j*s0hSR(ebX!F;5 za^H}+Q+ke{mUqhA?mA=lfqa % de incidencias que han incumplido el SLA + grouped_table['task_id'] = grouped_table['task_id'].round(2) + grouped_table['task_id'] = grouped_table['task_id'].astype(str) + '%' + grouped_table['business_duration'] = grouped_table['business_duration'].round(0).astype(int) + grouped_table['has_breached'] = grouped_table['has_breached'].round(2) + grouped_table['has_breached'] = grouped_table['has_breached'].astype(str) + '%' # ponerlo en modo de barra si se puede + + + + + grouped_table = grouped_table.reset_index() + grouped_table.columns = column_names + + grouped_table.set_index(variable_select, inplace=True) + grouped_table['% de incumplimiento SLA'] = grouped_table['% de incumplimiento SLA'].apply(add_warning_icon) + + + grouped_table = grouped_table.style.set_properties(**{'text-align': 'center'}).set_table_styles([dict(selector='th', + props=[('background', '#54B4CE'), + ('color', 'white')])]) + st.table(grouped_table) + + + + + + + +def add_warning_icon(val): + if isinstance(val, str) and val.endswith('%'): + percentage = float(val.rstrip('%')) + if percentage > 10: + return f'{val} ⚠️' + return val + diff --git a/streamlit_app.py b/streamlit_app.py index 69b4e41718d7..765a33a6d6b5 100644 --- a/streamlit_app.py +++ b/streamlit_app.py @@ -5,9 +5,9 @@ import eda_view as view1 import prediction_view as view2 -st.sidebar.title('Selecciona una vista') -options = ['Gestión de incidencias - Análisis exploratorio de datos', 'Nueva incidencia - predicciones y LLM'] -menu = st.sidebar.selectbox('Select a view', options) +# st.sidebar.title('Selecciona una vista') +options = ['Gestión de incidencias EDA', 'Nueva incidencia'] +menu = st.sidebar.selectbox('Selecciona una vista', options) if menu == options[0]: view1.run() From bce8b966a4634322912cc775dc8d6bf4244278af Mon Sep 17 00:00:00 2001 From: carlotagomezr Date: Thu, 7 Mar 2024 09:00:17 +0100 Subject: [PATCH 3/7] eda view --- __pycache__/eda_view.cpython-311.pyc | Bin 6889 -> 6817 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/__pycache__/eda_view.cpython-311.pyc b/__pycache__/eda_view.cpython-311.pyc index 8edf1b43f5fbbf4ab12700fef57178fe788d0a95..9d4d88fe0245745487078e32d417e110a17b7f81 100644 GIT binary patch delta 863 zcmY*VT}V?=96#rNpS!!2^XlBxT-uy#%`J63*d8oH3z34LUJ{XxjtxJ?-L6z3s6VqlbEkNHLWAuGB*y^k`7$cD+M?od4nX|Nis)nS7n}ym7l_KoRc# zF+0$_=6Nog5&%WH=qf5}n-M6leWf2sF$vNK$0^Ifc9)F#6zwU?6_IQ+&Ezc{gL3@{ z<{>S>>?>9&%j5{QGG&Eya5FS`;sm(??wQNrNlt3zO0JSZ4!I8@1*#4E;yrX8L zAQ(c{=XjO2|BI%Wb6i2x2gw%S=~M6}9KyXgjQel|U&hfiDoFNXZ&|5AI*po*O2F!W z2ukuC#8*}&9K-#q0LNdlXX^?`Z}b3=ZFl+&WC&#iCu&!#9Gy$eMgbWJv&17_BvJl6 zqTCY3Kx9i8J>@Cl9a5A6E`$f{JRWj-Xl$qv8{==#t`mP<3N<4`GSGBG1_RlO`vE;h zsEJjE9z)Frv=(EjhaCohRN7h-^tN7WHbWEH3r<2H+&VmVuk_1*`-ujaZrJ0ST9i^#(3j>jdEMl5T4qr< z*_m|OC=yw=9d>1^JK#t3%luvU;`r~Bbs%G z$!g1s+5%;WTK*4L|Ku6Y1$^%wCPW3(;v6i#*49}C{@8y!Gm6G2~HAI><^nQqHeH< zKoSwL45$Z%2(=>ZEe8?t;LVHDNJLl=@nF?k5cHr2oo%|sQ1G$u@y(m>z3|5_zWdT^DUa^#*t2PF}5LO|*rCu=zatiLoe%yoi;a(iTeYig^rNoM~GpAJ3^KMJ> zEXYbRhzHUL590l4fYtkKH7|wq9SHztJhq&H41o#`tshwB=or*1mO=)?ED4JpCnjj)~P#4LFdsKvbtX>SAY{qNzXWDFpk0byN;zJ3z0&l^5yQRPa zeT=xJgV&MH+dR6F4jUV&`VA0N@j7iDKD-|KFSE;L?(T@e8NdWa3sp$~$%f;V*W?$p#GG!jk$BwXXQNs?YO*w;^-~Uc(Qu;8tWQSu>4iu< zI(=b&E|!R!5{~GRm=>9h25N}tJWXQGfu0)5_t_Q>hc)XRCaW#ZY4a3G)RPXr@XYy+ z;eQB#mkW=YLa;>uO`Y#ugKu4fMVDG~sY?@O1iS(Av-x@7XHF<_&G%v(oWIEVOPrsA z51f!bb=zCy+DlyfhW(MJEx+M8Qg8?5DJrB{;XL{7&cb8lnn#7>WX;pBOj=jgFxnLP e<(Htt^Es7^xkU# From 53ff26e6bd820525ab84db73e838aa903ae1c4c6 Mon Sep 17 00:00:00 2001 From: carlotagomezr Date: Thu, 7 Mar 2024 09:05:03 +0100 Subject: [PATCH 4/7] saving --- __pycache__/eda_view.cpython-311.pyc | Bin 6817 -> 6892 bytes eda_view.py | 3 +++ 2 files changed, 3 insertions(+) diff --git a/__pycache__/eda_view.cpython-311.pyc b/__pycache__/eda_view.cpython-311.pyc index 9d4d88fe0245745487078e32d417e110a17b7f81..da00b4dff009660d7793f2b170da89e9a0ee95b8 100644 GIT binary patch delta 273 zcmZ2z`o@%ZIWI340}y;Hd6~L;B5yAf3+Ki;b{s4l|18i*mF zmXnF0hBHeZ#?MlKu~KX@8B)wr%rhC6F!nJnPz320XDD%n$ulsdSfp5{Sfw+qv7W5M zsmrK5If_%B(ROhaCp$Bff$HQ+fiOmu#TNt^+1b)Eb8_+$C!ZI*&z%R<&k4lEf~=c& z3e~d+DqR=RxFn*nLgb=|-W3tO2H(vl;(Hkx<0pTTc*&SI`HrL#WAo(ylEwOdjEpiL U7?8*uCRRrN4-A+@kqXcP038oO(EtDd delta 215 zcmaE3y3mw&IWI340}!Yyy+}2h$lJ?wi(}&)I}Qydh8oT+IgktpWXVHl28I;tOokNG z6thgmC5(NH3lt_F 0% + grouped_table = grouped_table.fillna('0%') grouped_table = grouped_table.style.set_properties(**{'text-align': 'center'}).set_table_styles([dict(selector='th', From 554923b230f1b4f18a83e25ef62793e275e0fd90 Mon Sep 17 00:00:00 2001 From: carlotagomezr Date: Thu, 7 Mar 2024 10:54:29 +0100 Subject: [PATCH 5/7] changed menu format --- __pycache__/eda_view.cpython-311.pyc | Bin 6892 -> 8760 bytes __pycache__/prediction_view.cpython-311.pyc | Bin 1452 -> 1448 bytes eda_view.py | 109 +++++++++++++++----- sentiment-analysis-view.py | 18 ++++ streamlit_app.py | 32 ++++-- 5 files changed, 130 insertions(+), 29 deletions(-) create mode 100644 sentiment-analysis-view.py diff --git a/__pycache__/eda_view.cpython-311.pyc b/__pycache__/eda_view.cpython-311.pyc index da00b4dff009660d7793f2b170da89e9a0ee95b8..85635a188868812e55feaa45039ea01e11102541 100644 GIT binary patch literal 8760 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 L1}or)!iM}0JjQ#w diff --git a/__pycache__/prediction_view.cpython-311.pyc b/__pycache__/prediction_view.cpython-311.pyc index a3347da92ac56beb03bf8802774ccfbc80973607..828d1221ec0a336fe9231e8922578dcf552095b9 100644 GIT binary patch delta 94 zcmZ3(y@H#2IWI340}#Ylyj;l5?3$?`TAW%`te>1%l#^dll&|lSTAW>yU!d<=oLrPy sl3$dWuO9$Zke`>Bqw5S-l&Bx-7N#HI=C1D;5TG068sNV1%l#^eQSO8?_=OyOo`(!2+B^Fic zJLlw=rUaMd7bT{r>ig%Vx)f!WrRs*dh3Pwo1_k@ao9YL+x$7qu6l@M)j$i@+C@&y$ diff --git a/eda_view.py b/eda_view.py index 72be69f57d18..2559fd81794f 100644 --- a/eda_view.py +++ b/eda_view.py @@ -6,32 +6,43 @@ import seaborn as sns import plotly.express as px + + def run(): - df = pd.read_excel('/Users/carlotapersonal/Library/CloudStorage/OneDrive-UFV/CURSO_5/PFG/Code/proyecto-fin-de-grado-2024-2-carlotagomezr/data-analysis/eda/dataset_post_EDA.xlsx') - # TITULO ----------------------------------------------------------------------------------- + set_page_layout('80%', 'center') + + + #df = pd.read_excel('/Users/carlotapersonal/Library/CloudStorage/OneDrive-UFV/CURSO_5/PFG/Code/proyecto-fin-de-grado-2024-2-carlotagomezr/data-analysis/eda/dataset_post_EDA.xlsx') + df = pd.read_excel('/Users/carlotro/Desktop/Escritorio/Personal-Carlota/UFV/PFG/APP-REPO/dataset_post_EDA.xlsx') + print(df.columns.tolist()) + + # 1) TITULO ----------------------------------------------------------------------------------- st.title('Gestión de incidencias - EDA') - # Mostrar el número total de incidencias - total_incidencias = df['task_id'].nunique() + + total_incidencias = df['task_id'].nunique() # Mostrar el número total de incidencias st.write(f'Número total de incidencias: {total_incidencias}') - # GRAFICO DE BARRAS, ANALISIS TEMPORAL --------------------------------------------------------------------------------- + # 2) GRAFICO DE BARRAS, ANALISIS TEMPORAL --------------------------------------------------------------------------------- df['end_time'] = pd.to_datetime(df['end_time']) df.set_index('end_time', inplace=True) - variable = st.selectbox('Seleccione la variable para agrupar:', ['priority', 'has_breached', 'assignment_group', 'company', 'contact_type']) + variable = st.selectbox('Seleccione la variable para agrupar:', ['priority', 'has_breached', 'assignment_group', 'company', 'contact_type','impact']) # Agrupar por la variable seleccionada y resample por mes grouped = df.groupby(variable).resample('M')['task_id'].nunique().reset_index() # Crear un gráfico de barras apilado con colores basados en la variable seleccionada - fig = px.bar(grouped, x='end_time', y='task_id', color=variable, title='Número de incidencias por mes', labels={'task_id':'Número de incidencias'}, height=400) + fig = px.bar(grouped, x='end_time', y='task_id', color=variable, title='Número de incidencias por mes', + labels={'task_id':'Número de incidencias'}, height=400) fig.update_layout(barmode='stack') fig.update_xaxes(title_text='Mes y año de finalización') st.plotly_chart(fig) + + - # GRAFICO DE BARRAS CON PRIORITY VS TIME_WORKED --------------------------------------------------------------------------- + # 3) GRAFICO DE BARRAS CON PRIORITY VS TIME_WORKED --------------------------------------------------------------------------- fig2 = px.bar(df, x='time_worked', y='priority', color=variable) fig2.update_layout( title='Relación entre la prioridad y el tiempo trabajado', @@ -39,8 +50,22 @@ def run(): yaxis_title='Prioridad' ) st.plotly_chart(fig2) + + # 4) TABLA FORMAS DE CONTACTO ------------------------------------------------------------------------------------------- + var_select = st.selectbox('Seleccione la variable para agrupar:', ['assignment_group', 'company', 'priority']) + fig3 = px.bar(df, x=var_select, y='task_id', color='contact_type', labels={'task_id':'Número de incidencias'}) + fig3.update_layout( + title= f'{var_select} vs tipo de contacto', + xaxis_title=var_select, + yaxis_title='Número de incidencias' + ) + ax = plt.gca() # get current axes + ax.set_yticklabels([]) + fig3.update_layout(barmode='stack') + st.plotly_chart(fig3) + - # TABLA SUMMARY BY GROUP, COMPANY AND USER TYPE --------------------------------------------------------------------------- + # 5) TABLA SUMMARY BY GROUP, COMPANY AND USER TYPE --------------------------------------------------------------------------- variable_select = st.selectbox('Seleccione la variable para agrupar:', ['assignment_group', 'company', 'contact_type']) priority_counts = df.groupby([variable_select, 'priority']).size().reset_index(name='counts') @@ -49,11 +74,19 @@ def run(): priority_counts['percentage'] = priority_counts['percentage'].round(2) priority_counts['percentage'] = priority_counts['percentage'].astype(str) + '%' pivot_table = priority_counts.pivot(index=variable_select, columns='priority', values='percentage') - pivot_columns = pivot_table.columns.tolist() + #pivot_columns = pivot_table.columns.tolist() print(pivot_table) column_names = [variable_select, '% de incidencias', 'Media business duration', - '% de incumplimiento SLA', 'Critical', 'High', 'Moderate', 'Low','Planning'] #+ pivot_columns + '% incumplimiento SLA', 'Critical', 'High', 'Moderate', 'Low','Planning'] #+ pivot_columns + + # column_names = pd.MultiIndex.from_tuples([(None, variable_select), + # (None,'% de incidencias'), + # (None, 'Media business duration'), + # (None, '% infracción SLA'), + # ('Priority', 'Critical'), ('Priority', 'High'), + # ('Priority', 'Moderate'), ('Priority', 'Low'), ('Priority', 'Planning')]) + # tabla para representar la info grouped_table = df.groupby(variable_select).agg({'task_id': lambda x: x.count() / df['task_id'].count() * 100, @@ -68,29 +101,35 @@ def run(): grouped_table['has_breached'] = grouped_table['has_breached'].round(2) grouped_table['has_breached'] = grouped_table['has_breached'].astype(str) + '%' # ponerlo en modo de barra si se puede - - - grouped_table = grouped_table.reset_index() grouped_table.columns = column_names grouped_table.set_index(variable_select, inplace=True) - grouped_table['% de incumplimiento SLA'] = grouped_table['% de incumplimiento SLA'].apply(add_warning_icon) + grouped_table['% incumplimiento SLA'] = grouped_table['% incumplimiento SLA'].apply(add_warning_icon) + grouped_table = grouped_table.fillna('0%') # if 'Critical', 'High', 'Moderate', 'Low','Planning' == nana -> 0% - # if 'Critical', 'High', 'Moderate', 'Low','Planning' == nana -> 0% - grouped_table = grouped_table.fillna('0%') - - - grouped_table = grouped_table.style.set_properties(**{'text-align': 'center'}).set_table_styles([dict(selector='th', - props=[('background', '#54B4CE'), - ('color', 'white')])]) + # apply styles + grouped_table = grouped_table.style.applymap(color_cell_priority).set_properties(**{'text-align': 'center'}).set_table_styles([dict(selector='th', props=[('background', '#54B4CE'), ('color', 'white')])]) st.table(grouped_table) + + + + + # 6) GRAFICO RELACION --------------------------------------------------------------------------------- + # quiero hacer un grafico --> Reassignment Count, 24_7, and Contact Type' + # plt.figure(figsize=(10, 6)) + # sns.scatterplot(x='reassignment_count', y='u_24_7', hue='contact_type', data=df) + # plt.title('Relationship between Reassignment Count, Resolution Time, and Contact Type') + # plt.show() + + + - +# FUNCIONES --------------------------------------------------------------------------------- def add_warning_icon(val): if isinstance(val, str) and val.endswith('%'): @@ -99,3 +138,27 @@ def add_warning_icon(val): return f'{val} ⚠️' return val +def color_cell_priority(val): + priority = ['Critical', 'High', 'Moderate', 'Low', 'Planning'] + if isinstance(val, str): + if val in priority: + percentage = float(val.rstrip('%')) + if percentage > 50: + return 'background-color: yellow' + return '' + +def set_page_layout(page_width='70%', page_align='center'): + st.markdown( + f""" + + """, + unsafe_allow_html=True, + ) diff --git a/sentiment-analysis-view.py b/sentiment-analysis-view.py new file mode 100644 index 000000000000..967918b72df6 --- /dev/null +++ b/sentiment-analysis-view.py @@ -0,0 +1,18 @@ +import altair as alt +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +import matplotlib as mpl +mpl.use('TkAgg') +import streamlit as st +import seaborn as sns +import plotly.express as px + + +def run(): + + #df = pd.read_excel('/Users/carlotapersonal/Library/CloudStorage/OneDrive-UFV/CURSO_5/PFG/Code/proyecto-fin-de-grado-2024-2-carlotagomezr/data-analysis/eda/dataset_post_EDA.xlsx') + df = pd.read_excel('/Users/carlotro/Desktop/Escritorio/Personal-Carlota/UFV/PFG/APP-REPO/dataset_post_EDA.xlsx') + + + \ No newline at end of file diff --git a/streamlit_app.py b/streamlit_app.py index 765a33a6d6b5..09fffb905c3d 100644 --- a/streamlit_app.py +++ b/streamlit_app.py @@ -4,12 +4,32 @@ import streamlit as st import eda_view as view1 import prediction_view as view2 +import streamlit_option_menu +from streamlit_option_menu import option_menu -# st.sidebar.title('Selecciona una vista') -options = ['Gestión de incidencias EDA', 'Nueva incidencia'] -menu = st.sidebar.selectbox('Selecciona una vista', options) +# # st.sidebar.title('Selecciona una vista') +# options = ['Gestión de incidencias EDA', 'Nueva incidencia'] +# menu = st.sidebar.selectbox('Selecciona una vista', options) -if menu == options[0]: +# if menu == options[0]: +# view1.run() +# elif menu == options[1]: +# view2.run() + + + +with st.sidebar: + selected = option_menu( + menu_title = "Menu", + options = ['Gestión de incidencias EDA', 'Nueva incidencia'], + icons = ["house","gear"], + menu_icon = "cast", + default_index = 0, + #orientation = "horizontal", +) + + +if selected == 'Gestión de incidencias EDA': view1.run() -elif menu == options[1]: - view2.run() +elif selected == 'Nueva incidencia': + view2.run() \ No newline at end of file From 4cc37da380d18e19eb55f1f2382d8e6979791edd Mon Sep 17 00:00:00 2001 From: carlotagomezr Date: Thu, 7 Mar 2024 12:43:17 +0100 Subject: [PATCH 6/7] changing layout dashbaord --- __pycache__/eda_view.cpython-311.pyc | Bin 8760 -> 14902 bytes eda_view.py | 186 ++++++++++++++++++++------- streamlit_app.py | 27 ++-- 3 files changed, 148 insertions(+), 65 deletions(-) diff --git a/__pycache__/eda_view.cpython-311.pyc b/__pycache__/eda_view.cpython-311.pyc index 85635a188868812e55feaa45039ea01e11102541..93ac427f868b88b95e4216bc041071bb377f557f 100644 GIT binary patch literal 14902 zcmc&bZEzE3db`p}@~4b#N&W;25Ev0`2S@@q1n^fd4mQRRFit>OYuEDHvLtq8uoe5F z>(Ggl$=rEvlEHVE^xVu{&M9t7ubmEUr!6ySJKW9P+^%L*X?BJgrk(uYPwO zNR80sX&Nz;Co^IpPwSLzq=?qb6pxgUywZ^}@+_aSk5r_;ZJDYZsUm4puzJcd;()aI z1~ua37=SL$0Fx8t>l+JzRXwLKzfzyk4xClKIb%;N?~}W1cp&ZOeS%is$GbQy-WLdx%zMN>I?7@$0-PTAlxOZvARG z^S>Kw!&=rn_G@lp>w1Q|4Uet6^|4=@9{Y9szHkA! zi5NjoB2H7Hi8F<0LI~yo5sN*5z>kewRk*kduLI2~#|8Vvi{pmYopdUh3zL_$=EQ}WO``NGA-&_#LZ z;=Qx?&dQgs#Hlaf6Q$MY>kta$*1xK-QtFI z)NHV>lRkl)-UdYnKKa`zUJSdV;V2s{DBte(R%#Vw57+?j3$nA}>8NIka9RoU&iVKm zKOfXAY$Ot#)l5=UvqXhxkk@RX>5y=Bn%6AXVY_+Fkv9fkRG8v}LWtM4LOpR74YQ^RV%v2iUM@ZOUSR>Zns#5OK*m46L&$X z9R4L6U{0L6&r~n=EFD%DkIHyt#`BexDk*zst6U=~#Zk358t+VbcFWDrtDd7tPiMl@ zDR*6gTk-f*k1yUS+uRDX{WHdTqgO89r!Xxl(;_o14{Ga|j=W!la(M^b3e%}Foifw;S;fxfPNkw*t!R$--e(+(Lrb*^vqNQe$jpxW%$CI} zg>k5iLuMTJ8T*3x-GLhe@qznH@xqSpp1N@=e(F9`vt&}329;@$nTGp}b8%E*>Qtsq zX6g#RH7s>1Oq0qq$(dWU!-5#75&1TeCXZm1jM8KRDUMu7qdDeg!mrHZ) z=2BeQYPoUbAV1B^h~eul&c0evST>sN1J)QRfn0M1k{{Yc)nm(mR>X%mLj31};o5{y zB*^;tN1k(hkoWtAaENyYS$Bru+!0n}-E2UdhD5v9sue{*XaF;r)yl?!$VY*C{o_E? zTk?cKKnzbuG@Cy>6=6fOB1%NfD!_|Bs?q)87I-(XyaMJJ35)J2Uiu0JM}{jJi#%Ke zob_5oTu+Uj)hzySFf58#L9+(gQ9dYX)^T14i~}o_fRjz)R7Y8HD$McIIG%o9a?iTi zPyQl|taeNQ0Vu>+Kk{l&%Ss6Q^hNoZsMju{9MDRmVIK%W9=WDgjI3A)ar}&kiUhvH z;zdWpGn$P|esoqV5_yTp91%r`Rtm3~O2D~iG&2lGE1!;FqZy7~mVTXKXLv~~L!~e{ ztFvA&Bkq89L=QHmcLJ+!9uoo*(iQMTohgcl^aSjNgjA|CMQ6>sSC%`MV?P~GoCj6s z!FXpp_T7OLV}0}VADmvSUp^l{tuT94X0OcbymkCG1bFbSd_yRr}Mo>s0&mNqbkq4jDbFy(eiuo3Ni% z?B`Vbx%f$7%%$b;>|U%{>Ra*NIV`_4nX20%?|fdaJ$m=tnwc)`qd%t*eo0`w>j7g+ zGR_3!TnYg1RhZo>vs-3%r!d=*0AA{T0obX+98;NNGII=>^O?mig{f7UTA8U$l~%{k z=!`L+fgvj)jPZMrcpPKoOmj3aI9TjkSw=Q*nlo*}4jInESyyczLEE>meR6?%m`|+P zc0fUeeaflnXoCQ;77YN}0lxXJhs8;r6Tt?eyk_wrJP7KG&p>MW0DvJLh?poEpp1!x zf^|COSPt-<54v?3@6O8j*p~A|>gRH_;z2^%Pz5?6v{X9F&Il4P3sfdb0V^{vUW?d) zqv%A?g#hV5>;V9EbBM|SejYFgZLuB;B6t@5rC|Udv;h;ITimf!zETgEP};4OcB`e` z@$M8;lw@29#+9;nrX0Idj;1vmWvTg`Vl37#5v(Ejs)VxGV6VHg5)yeohD#)2P zsW&ZeS~uHrjs_WJDwI)gTi@D5{=H@8%z=V!+}OG@N|fa+62MAiFOFHY7*S%L-n?gH z$tUUcZOa_Jv8-LNELg`(ob?7svehD^ga-LmOmqNv=E+thp>-EmVjR^bb@Rv}*F+R0 zMEWwe!j;A#KiAfBo;{kWK~cCDT=8m|k@!G%=UaURdqrcda?Z|Ga9g-aFxRU&N1%A# z{KTuip=@8E#%Rt7Yw6-@Zctq9`vp>Yo{8obGGBT#b0!#1-D-US!(rwat|3=t6HTaa z?V%3YH)Gx3Z|!q!HGb_lwiWyiWIkP+RR%Qe=YKrulsZjV55JGh+!{ZsmT^m3jDB~t?0*`G^u z9&Q)6J78LEHm*RRK-UKf0nwPbCbCO2#~4SF7Mb1w5eExGs0AKkD+1K_i0lNv2)ZdG z(D0ZLJH;C;B;>=yUvU@`@0oOuMYcQYEwE1BGUeWLsTfc`XNtj2fyf4r#u=#pki$Na zIe}4Y7Q@%IGTo}x2cT7C^lP84IqD)Z9w&CKh)R5{hFIF`y%H#GCDa6d7pLw@_YVKl zynN9wa{+n$y2{O{7iX1|v!JtmhwdUj~pMBq<&i2BeY zdKV1ULX=um-GkFpAyA^PvB7Cxif!3d;E{;c^z)p+x<{uaa3M&No0}HdC|D0M$1e1A zOoO*Ym=d6au>0KU4y~vQYz6`RD;m=aYPnX_51KgC;5GAUSe>H5AR7t^p@3maP;Vkz zG7gFNXxx%zNUgt&1o##>mvY;)yuLW(7;6-6A=0Zj1OS!`Yzx2{uSwUqkn$v4FZYw| z)deh#hzNUiZ~JeXf7Sd;@2|b`g<<*9sCvPlydWel2+D;?^}?jmHz|j%Dt%YeyQMKx zJR910IYywxCtVC!vOM~Mis@^E1)$S7Y#Pw#Zqm%s^pxm_8X{V{x@+zUP!yFqX*U3v zHTzrsSNtynzYfU5my*N2#IR2pX4PR<8DIfvm4QHdzCf|K>RM$6qkI{R68B*~6XeHW z7c^5iq?yOV*GXwH0H25pkrX;F?t%B1>FHgu613e~z^Ds^MC75GDLM|dOGd#KL<=p% z#cVsDeWvr7t{&K0)T6;iHV!^AC{(1=WLVTJ5iuN*bULorRooY_$75KYk%Sm8p1^nH znwo_)t65ozc+JekKTzvt+eaIDG!4{BdgAL7bzU!=r zgy0jv2d7!bgkUhlq7gd_DtHm`@J+E1t(sW8K5+X5eOZg#PCSG#WL^YyU(&YVJF*c7 zF<^a3V>kh9aN@+{y*8q#YZaOLx)WE@O39%0is%YNR^UT^DQV@zy5+%tfUSz>ap*4t zkWj9^hDPX#6FP#R_ftfGYbBirQvTiVfC}!rYTpgYJ5R|k#q?Woy{@`mkDqzqs=Yb! zgNfy~+wJo9V~Xpz>N=iubthciit9zy^`G%A;rb2E;fE9Rqedl{)6_V zuu|QsR<|ar4<@P)D%H=b)z8LHr#uIfo+Am*5nzVTcc2-&8SFKkGRdAJz%6(6p=k>+ zer6F2;_cAJ?bE8KBk4Jr@SMCyE1o{p)3@$pZ^G02n`*_=uX_6B!E=h|T&76X_GDFa zqN;f%d^aYKjLB8aN>xCu3dCOm^Vd?c@RY*1RK_KPh2z*M?>ZzO8A>_!uJqlp-YvP; zBM-d_hOpxb9Y4KROF3(9_Whu5=?%rvraIb^j)MuuLHWeh?43GwCeQlWhCB0`8 z-m~B_SG?y{@A;(nm4x?|Pha&Z-q%#`Yw>=$Y8M#qDbN1ft?QSzf3cOUd*{)Rrj#kytN*2ZWGQHTZI+~M?rxT8+Ki%K0 zIC@mP&&!So-ou>Z&to^RUQ!KQb{S5)KV$mO;gnmE1byoqBn)01`oFzYwU5HW;C$Mrhfesj=-G!x44-3#hGC)>& z&PH=Ik7Nq#bW@l8ufk~OnRyEktYH>&mPs;?oKifOuOMfMFMpy1bF@N4VnagAkHb%7 zy)kpvyx53!&azr;B!A8VcCH0|ImUdNdWYLIPEx{^a%K8y0K!_pTLaM$82zp63<^j) z8$($i4IvKJEjnq7Xsc`1X^3L_4(aA1G6jtxiky`TPq9MC%V-Q3a-c(jMkHzW^q~#i zISPSMDZ=|DAZ(<1@l^za0EA&!dEo}|zL?{D0T)2dfC?;J4~_@M$n_t`A*}HnqYG4tiqNTb^SaFc%W{6_JN)<{%%^iuuqqD4l3= zl@X&ZqwN)=(g|*1Kd+erVa+@!@FE%*x?8sgQW-_DO4p0Q$n#~)SFJohQVeSY?B+R* z7W9}8LrxAL+Ms3#m#!K%V(SQS|E06Qi-GslHN4*_?>;S`8J7iQFG`)H)=5M$axH#G zb?i1u`_D>im)M{AS6YRrW*xP7HXM~LP31yn8}kEm<2VS zfUOdnoIzHIOxakUTgTAAxtqtHa-n9O;erNI^karA{=f|Ew*vlA9yi?dx#l0PuwuN&5G=DW6OG1?ubP8e8qZK z(A!X7LO)-ex_$Ld_b+B|&)(jCd;48Bu6um6BCz?$K@4Kh>pi2;kL@{?cNhgClhb?< z&Z4;a5CmS~I0rg=;6w);Q+Z@=JuoI-f;x{NU}V%{!~>B1F{4?CZAc2V^|6gu z#o`#Gbr%9EGoZo%dvRhO;Vfy5r2;~}#2GaKp->pIR?3a}!1RSPOc3_^Qz%}bzTklw z5y1j}`x^jp>VdOnsp#ETlg{RZvsvDA5^lxWt2%r2U?&(jHFZn%?}n1DJqgzy#kE&; z?OhqVU9x&5+0v0{=}=m_)Rr#A)pggexK4pZT7}0pN+580HR0T&R(XlhMq-u?%L8)z z>oOljn7LDR&}+L~`~2N53}2oi;mcDbe0hqFccH85_{x_s*|Gi1|#U~=woq43HpL$wPs6Rw3 z%@S(QFJiZ2gix<$33Vzg@_2|!{5cdYpw{VT$lIJ?Kl$T4dKFi&KGLiBF#;q}@lOz} z0!SYs0GCgW-mqu!&#}Y?bcP2KMFcnDe`7l9mG|^2&Qq%M)c+Bk#bi#B+hf`L+ovDBIR1LJbUERD=t#FII0vJ#vbV<;Wq%O|cD>SR>;n$hDsFJMs`Qdk%0@ zY;@!35a6Op9|DL|YeiJ!HhJ42wc&8G;b@}asM2suZ8&zfO76a_c3eqzaET61=@?Tx z#*~IJSqLf(LEyTCxy!ZtRp)`*Y{Gd+tvX!5-bMN1q}(oM?{6RN{+F6q`Z(S| zv-h_~YRK`3(Sy@8dV=PtXddbtW6)yf=BHeZQD?Cw-|T=|40N>a;tFEg#x_6_(3~lK zHXeL8;50RVU^)jT4>1^sFn@^gw`rs+_rLvU`9JS`-)qrI1PHyt;l_|3PVmDQayc+g_2aMbIJ7f z@rC0lSKZ=q{FBReq)P4azV%9Oc5B{+Zf{a>*oyv;1`l+e5Pj?xwW3%08YS+{_gTXR z;C8RO;O8>XZti@Y@eMuLAbiQzfvv`zgTu+N^wt45<#rj`60aceA$Sb|ivU%uhp1h} zYI8Bg77~?fch5pt4x-wqZ~Yw>#_bXR9>G5V04LEuV)`irWK(d^S@+01W+V6w{7dHm z#Hmz8r%Y}*O>W#E#&Q5wcyZ4HEc^YsZA;QmVn2$l?EK*y@4uncwW)P&3w^1Ix~0yy z-&lAfRkL5N*`F#cUpPQEl0|lbH6@6~*)=~IT z#$+!0bwf?8J;lzn5KmdVJNAdqulpPU?-oQ;Ti{18?e6^|Kec%g5swRhT_KD@Z&qfC z6$3)3CDz))PDjJWj^?u?JK9#T2It|BLFIHvV#jzNi+JN3k4^<4Dvf5cRs^k1a^dSC zj9y3Z*B@lI=`;y&8)&)`Dv1dG75*g@HbB$hBYJ7gR8m|9M)20=H5;ZV1a_)!=UPSf zmE^gohNiW;a*OqI3c!~L){KB44-D`V>cQy6w$13 z1RRt_J?vdM#YV}YW?>Y5fP*RcPM+eM&&Ispf=Nx(YqRs19Dr6OH2^RqkRB_+Qj(GO48e=Y`jyHOU~RW$|+~=6xARb?-aFNHr^@9D;w{%A_whWqq5*Y zIqiUb&VX$;x_*tyf~pp}agEA?D|9J-&Vu?fe9eN!a=H%NN`r0L6v^9Gh99z^F`FWJ b9t&NuMrDEBM%!^5X;5XS0UI{~WcB|CJ@(?A delta 3166 zcmai0S!^6h8Lpb{o}+sXdpxI)@x(`*ah%JO#LmWXoM@Nb5F8O$Kr$$%<7!XZo+~{) z8^`nzBaC840T${d(z0k+fl-u!mq>sRLPGEe$X+Zhw8Ya2p*$dYwTg&#CB$DnZrkl- zp)~#XKlR^V{Z-Y!(0}#vz)u4K5yAN4x1T6WT?oC;{@8=tW znQFU4aNa)^APC;UsgU(Br#|-Rck0zYPa@jPwBg07ql| z8b;_5Jk5bYl?X{X>pglIRP1Sl=6p6!+y;6Jz3tj>sM{5T;+%yGvjBIVB%&L`F_E!j z))d|F#$WXiZ^O6dg6Qxx2g}Ol!HM7IiI_t~dIvkTYk1XP573+52=#eeagcFs#P7_j zS$2-Y}*tA|;D1Zi!Aogpv+ zVH*?nkhVr-ztB-qgkC+;PD7mk&~A9ZB}!rjZp7Dk2ntVg)Odq$2E9WPBuUyE9czH` zqaB?0!4VkRiN< zNcY<=P!GN!=fk!MtU-+aC>$3&hNm890MgD>8@KJI_#&hoh3ppW{-2;b3r_DZ_+HTN zqu6SY#B%#OyPkl|dYTOc%YUHJ;|x~w+UDWapi|T|b>9mZ-g=VCp=dU+5}b9B-eoW8 zYxFzY+3=EsY@ zGR|hI`Su{NE3liEgSS9Ns1-!M7j zOt;?jFww*}0lAEBhk0qg?ei-pk(XYe?8wPpu^m85@A+(BDFE~to% z5toX8jK72H157P?)s`Ye&XI9)KIdvo(0{gdCnd+mZJsBf43(T1jN*$l%gxc>@>k-f zS1FQdT`efDXRzr}i{-pLqb$;bZ>q!e&yYH$mtKa`THvLz>p~0D-oVtWZNQq+g1n$sAXny6y1n}c4A@Ptv17;b zps`CW!|!#&L=pPCRHwA78lYDqstDf^=m`Pxkp3ZZjDF003ty)3Xx8%~%%Lav@zrPs zf65KKmIeYSL2=cho^e_JO&6K1unRT4r1di;wqlD>ty(-fmM_i7`N}vja^X6W$FI@f z$4=t``cdo~=hL8;ahY7DTF_229$W4z?8_kie?5Jb{yKilJHYHX%}qau$4{~^0F%!v zvyhqTDiuxcM(LJz7G^b;p2p;huH*fSqOL6HN94SkE7H#-QaDWK6Dc>lf--|NDD)mK zYid!~j>3fL)=PP{qMNRYu33xVDOQW>&8lJww=`8(=zTFkABrjZNAUt}>Fx-ad_`RZ zsa!7SZ_}SAI$Jn7motTeqU98m1IKhLQGP9Cw(2Ea&QGhw8I>qN57t9pat1X)^y1WbT&D5XM~l-ZLg9CM-Nn z4i-gQ04Zya%KLDWK700T3H^g_d-IhCqZ@qRCf~Qt_dWF@(SN^dJzm-H>6<=%>Ehpc z-%8K@!S}?Dcg2nkv1?Q8+Tc^0d}^IfJ#}+P@X(rjTmZvZf=)_b5VqVX)JlIMJrth$ zkv~ZP6_^yBx=}bnE8Rb1dhz7r_mYzw^unLANqTwsH+YD8v%UBl9m@7~46^*Jp4#q& z8JN%*S)ub;*|Pd&`*AjTf{|fHvW%Q$WQhLoM dj#_BTnZf9mcNXK$EwqQe!O?%8Imn)j`08h diff --git a/eda_view.py b/eda_view.py index 2559fd81794f..2e0c1386b032 100644 --- a/eda_view.py +++ b/eda_view.py @@ -5,67 +5,83 @@ import streamlit as st import seaborn as sns import plotly.express as px +import plotly.graph_objects as go +from plotly.subplots import make_subplots -def run(): +def run(df): + col = st.columns((4,4), gap='medium') - set_page_layout('80%', 'center') + # Primera fila con una sola columna + row1 = st.container() + # Segunda fila con dos columnas + col1, col2 = st.columns(2) + + # Tercera fila con dos columnas + col3, col4 = st.columns(2) + + # Cuarta fila con una sola columna + row2 = st.container() + + # Ahora puedes usar row1, col1, col2, col3, col4, y row2 para agregar contenido a tu dashboard + # Por ejemplo: + row1.header("Este es el encabezado de la primera fila") + col1.write("Este es el contenido de la segunda fila, primera columna") + col2.write("Este es el contenido de la segunda fila, segunda columna") + col3.write("Este es el contenido de la tercera fila, primera columna") + col4.write("Este es el contenido de la tercera fila, segunda columna") + row2.header("Este es el encabezado de la cuarta fila") - #df = pd.read_excel('/Users/carlotapersonal/Library/CloudStorage/OneDrive-UFV/CURSO_5/PFG/Code/proyecto-fin-de-grado-2024-2-carlotagomezr/data-analysis/eda/dataset_post_EDA.xlsx') - df = pd.read_excel('/Users/carlotro/Desktop/Escritorio/Personal-Carlota/UFV/PFG/APP-REPO/dataset_post_EDA.xlsx') - print(df.columns.tolist()) - - # 1) TITULO ----------------------------------------------------------------------------------- - st.title('Gestión de incidencias - EDA') + + st.title('Gestión de incidencias - Overview') total_incidencias = df['task_id'].nunique() # Mostrar el número total de incidencias st.write(f'Número total de incidencias: {total_incidencias}') + # Insertar graficos + variable = st.selectbox('Seleccione la variable para agrupar:', ['priority', 'has_breached', 'assignment_group', 'company', 'contact_type','impact']) - # 2) GRAFICO DE BARRAS, ANALISIS TEMPORAL --------------------------------------------------------------------------------- + incidencias_timeline(df, variable) # grafico de barras, analisis temporal + tiempo_trabajado(df, variable) # priority vs time worked + + # contact_type(df) + # pie_charts(df) + # tabla(df) # summary table + # pie_chart_menos_24h(df) + # pie_chart_mas_24h(df) + # pie_chart_reasigned(df) + # pie_chart_not_reasigned(df) + + + +# FUNCIONES GRAFICOS --------------------------------------------------------------------------------- +def incidencias_timeline(df, variable): df['end_time'] = pd.to_datetime(df['end_time']) df.set_index('end_time', inplace=True) - variable = st.selectbox('Seleccione la variable para agrupar:', ['priority', 'has_breached', 'assignment_group', 'company', 'contact_type','impact']) - - # Agrupar por la variable seleccionada y resample por mes + grouped = df.groupby(variable).resample('M')['task_id'].nunique().reset_index() # Crear un gráfico de barras apilado con colores basados en la variable seleccionada - fig = px.bar(grouped, x='end_time', y='task_id', color=variable, title='Número de incidencias por mes', + incidencias_timeline_fig = px.bar(grouped, x='end_time', y='task_id', color=variable, title='Número de incidencias por mes', labels={'task_id':'Número de incidencias'}, height=400) - fig.update_layout(barmode='stack') - fig.update_xaxes(title_text='Mes y año de finalización') - st.plotly_chart(fig) - - - - - # 3) GRAFICO DE BARRAS CON PRIORITY VS TIME_WORKED --------------------------------------------------------------------------- - fig2 = px.bar(df, x='time_worked', y='priority', color=variable) - fig2.update_layout( + incidencias_timeline_fig.update_layout(barmode='stack') + incidencias_timeline_fig.update_xaxes(title_text='Mes y año de finalización') + st.plotly_chart(incidencias_timeline_fig) + return incidencias_timeline_fig + +def tiempo_trabajado(df, variable): + tiempo_trabajado_fig = px.bar(df, y='time_worked', x='priority', color=variable) + tiempo_trabajado_fig.update_layout( title='Relación entre la prioridad y el tiempo trabajado', - xaxis_title='Tiempo trabajado', - yaxis_title='Prioridad' + yaxis_title='Tiempo trabajado', + xaxis_title='Prioridad' ) - st.plotly_chart(fig2) - - # 4) TABLA FORMAS DE CONTACTO ------------------------------------------------------------------------------------------- - var_select = st.selectbox('Seleccione la variable para agrupar:', ['assignment_group', 'company', 'priority']) - fig3 = px.bar(df, x=var_select, y='task_id', color='contact_type', labels={'task_id':'Número de incidencias'}) - fig3.update_layout( - title= f'{var_select} vs tipo de contacto', - xaxis_title=var_select, - yaxis_title='Número de incidencias' - ) - ax = plt.gca() # get current axes - ax.set_yticklabels([]) - fig3.update_layout(barmode='stack') - st.plotly_chart(fig3) + #st.plotly_chart(tiempo_trabajado_fig) + return tiempo_trabajado_fig - - # 5) TABLA SUMMARY BY GROUP, COMPANY AND USER TYPE --------------------------------------------------------------------------- +def tabla(df): variable_select = st.selectbox('Seleccione la variable para agrupar:', ['assignment_group', 'company', 'contact_type']) priority_counts = df.groupby([variable_select, 'priority']).size().reset_index(name='counts') @@ -112,24 +128,94 @@ def run(): grouped_table = grouped_table.style.applymap(color_cell_priority).set_properties(**{'text-align': 'center'}).set_table_styles([dict(selector='th', props=[('background', '#54B4CE'), ('color', 'white')])]) st.table(grouped_table) +def contact_type(df): + var_select = st.selectbox('Seleccione la variable para agrupar:', ['assignment_group', 'company', 'priority']) + fig3 = px.bar(df, x=var_select, y='task_id', color='contact_type', labels={'task_id':'Número de incidencias'}) + fig3.update_layout( + title= f'{var_select} vs tipo de contacto', + xaxis_title=var_select, + yaxis_title='Número de incidencias' + ) + ax = plt.gca() # get current axes + ax.set_yticklabels([]) + fig3.update_layout(barmode='stack') + st.plotly_chart(fig3) +def pie_charts(df): + selection_variable = st.selectbox('Seleccione la variable para agrupar:', ['reassingment_count_bool','u_24_7']) + contact_types = df['contact_type'].unique() + fig6 = make_subplots(rows=1, cols=len(contact_types), subplot_titles=contact_types, specs=[[{'type':'domain'}]*len(contact_types)]) + + for i, contact_type in enumerate(contact_types): + data = df[df['contact_type'] == contact_type][selection_variable].value_counts() + fig6.add_trace(go.Pie(labels=data.index, values=data, name=contact_type), 1, i+1) + + fig6.update_layout(height=600, width=900, title_text=f'Tipo de contacto vs {selection_variable}', + legend_title_text=f'{selection_variable}', title_x=0.5, title_y=0.95) + st.plotly_chart(fig6) + +def pie_chart_menos_24h(df): + df['less_24h'] = df['u_24_7'].apply(lambda x: 1 if x == True else 0) # 1 si ha sido resuelta en menos de 24h + + # guardar en una variable el % de incidencias que han sido resueltas en menos de 24h + porcentaje_less = df['less_24h'].sum() / df['less_24h'].count() * 100 - # 6) GRAFICO RELACION --------------------------------------------------------------------------------- - # quiero hacer un grafico --> Reassignment Count, 24_7, and Contact Type' - # plt.figure(figsize=(10, 6)) - # sns.scatterplot(x='reassignment_count', y='u_24_7', hue='contact_type', data=df) - # plt.title('Relationship between Reassignment Count, Resolution Time, and Contact Type') - # plt.show() + df_filtered = df[df['less_24h'] == 1] # solo aquellas incidencias que han sido resueltas en menos de 24h + # un único pie chart coloreado por tipo de contacto, indicando el % de incidencias que han sido resueltas en menos de 24h + pie = px.pie(df_filtered, names='contact_type', title=f'Incidencias resueltas en menos de 24h - {porcentaje_less:.2f}%', + labels={'contact_type':'Tipo de contacto'}, height=400) + st.plotly_chart(pie) - - +def pie_chart_mas_24h(df): + + df['more_24h'] = df['u_24_7'].apply(lambda x: 1 if x == False else 0) # 1 si ha sido resuelta en menos de 24h + # guardar en una variable el % de incidencias que han sido resueltas en menos de 24h + porcentaje_more = df['more_24h'].sum() / df['less_24h'].count() * 100 -# FUNCIONES --------------------------------------------------------------------------------- + df_filtered = df[df['more_24h'] == 1] # solo aquellas incidencias que han sido resueltas en menos de 24h + + # un único pie chart coloreado por tipo de contacto, indicando el % de incidencias que han sido resueltas en menos de 24h + pie = px.pie(df_filtered, names='contact_type', title=f'Incidencias resueltas en más de 24h - {porcentaje_more:.2f}%', + labels={'contact_type':'Tipo de contacto'}, height=400) + + st.plotly_chart(pie) + +def pie_chart_reasigned(df): + + + # guardar en una variable el % de incidencias que han sido resueltas en menos de 24h + porcentaje_reasigned = df['reassingment_count_bool'].sum() / df['reassingment_count_bool'].count() * 100 + + df_filtered = df[df['reassingment_count_bool'] == 1] # solo aquellas incidencias que han sido resueltas en menos de 24h + + # un único pie chart coloreado por tipo de contacto, indicando el % de incidencias que han sido resueltas en menos de 24h + pie = px.pie(df_filtered, names='contact_type', title=f'Incidencias reasignadas - {porcentaje_reasigned:.2f}%', + labels={'contact_type':'Tipo de contacto'}, height=400) + + st.plotly_chart(pie) + +def pie_chart_not_reasigned(df): + # cambiar los 1 por 0 y los 0 por 1 + df['reassingment_count_bool'] = df['reassingment_count_bool'].apply(lambda x: 0 if x == 1 else 1) + # guardar en una variable el % de incidencias que han sido resueltas en menos de 24h + porcentaje_not_reasigned = df['reassingment_count_bool'].sum() / df['reassingment_count_bool'].count() * 100 + + df_filtered = df[df['reassingment_count_bool'] == 1] # solo aquellas incidencias que han sido resueltas en menos de 24h + + # un único pie chart coloreado por tipo de contacto, indicando el % de incidencias que han sido resueltas en menos de 24h + pie = px.pie(df_filtered, names='contact_type', title=f'Incidencias no reasignadas - {porcentaje_not_reasigned:.2f}%', + labels={'contact_type':'Tipo de contacto'}, height=400) + + st.plotly_chart(pie) + + + +# FUNCIONES AUXILIARES --------------------------------------------------------------------------------- def add_warning_icon(val): if isinstance(val, str) and val.endswith('%'): diff --git a/streamlit_app.py b/streamlit_app.py index 09fffb905c3d..928792878d7b 100644 --- a/streamlit_app.py +++ b/streamlit_app.py @@ -7,29 +7,26 @@ import streamlit_option_menu from streamlit_option_menu import option_menu -# # st.sidebar.title('Selecciona una vista') -# options = ['Gestión de incidencias EDA', 'Nueva incidencia'] -# menu = st.sidebar.selectbox('Selecciona una vista', options) - -# if menu == options[0]: -# view1.run() -# elif menu == options[1]: -# view2.run() - - +st.set_page_config(layout="wide", + initial_sidebar_state="expanded") +alt.themes.enable("dark") with st.sidebar: + st.title("Gestión de incidencias") selected = option_menu( menu_title = "Menu", - options = ['Gestión de incidencias EDA', 'Nueva incidencia'], + options = ['Overview', 'Nueva incidencia'], icons = ["house","gear"], menu_icon = "cast", default_index = 0, - #orientation = "horizontal", ) +#df = pd.read_excel('/Users/carlotapersonal/Library/CloudStorage/OneDrive-UFV/CURSO_5/PFG/Code/proyecto-fin-de-grado-2024-2-carlotagomezr/data-analysis/eda/dataset_post_EDA.xlsx') +df = pd.read_excel('/Users/carlotro/Desktop/Escritorio/Personal-Carlota/UFV/PFG/APP-REPO/dataset_post_EDA.xlsx') +df['reassingment_count_bool'] = df['reassignment_count'].apply(lambda x: 1 if x > 0 else 0) # indicar si ha habido reasignacion o no + -if selected == 'Gestión de incidencias EDA': - view1.run() +if selected == 'Overview': + view1.run(df) elif selected == 'Nueva incidencia': - view2.run() \ No newline at end of file + view2.run(df) \ No newline at end of file From f2f6de75d8dace97abcee545f193efa0cb6800ee Mon Sep 17 00:00:00 2001 From: carlotagomezr Date: Thu, 7 Mar 2024 13:26:16 +0100 Subject: [PATCH 7/7] eda view is ok, still improve design --- __pycache__/eda_view.cpython-311.pyc | Bin 14902 -> 13845 bytes eda_view.py | 95 ++++++++++++++------------- sentiment-analysis-view.py | 6 -- 3 files changed, 48 insertions(+), 53 deletions(-) diff --git a/__pycache__/eda_view.cpython-311.pyc b/__pycache__/eda_view.cpython-311.pyc index 93ac427f868b88b95e4216bc041071bb377f557f..5b5dbf3c9ba105d5cfd5fc0c1088caa192054089 100644 GIT binary patch delta 5591 zcmbVQeQX<7a^GF<@|&Va@k^paQj{f`l4Z%3ZP}6I#E$GF_JxUK-{I;wWmej?M2la3 zT-uUAMoenJap2xLd3Q+e>Ri+yaBWykbxG0Y4lR)D^^YsAX-R{C)x{ZbfaVVV;{pZA z;ZheUI$+wWa`j?X}*8 zO)jbVJbNM{vB#L0`z|uXW31{(i_>xX8*7fo zxVsptcQFE0V_KGyg)~ICVN%Qy0SORdOd(1?;ya#v`m9XOCgpRgNfGnYiKJ9G3dFrq z@@yop%%gDJxtT~ln@UQN@sv0*JsQc0l9bF$KD2EpH!~XDM?d33;W^{p zL72Ml_;prw6*778l$;P#sqDGLl#))((X{2nylS7wW)yKkNhq^9Sv4lpIq1X;1jCCo zBRBvW1~9T>E|tqGs%avdDx@=c)uM?>W@Mror(_Y4op%ClZ|=F`xD^<<85pPr z25W)A3h!O!Ef?Z1$5$A}v!AO>&ghK|_)YFlxN`h+h7nG1Uup;p&;~`#p6|Z+>Wh`o z7>qp5KF2jaU`q2zoH7rO@)Nhi!%GJ~G*`p>YvKJBzWsKv|Js2ib2Yf97Ti-JRerF>!wLu24fa*}{uT$ZYQu*L@~d~i+v|6>ds;P$-{dOcK$9I8B#*MC))QgbQg z!?*oi3kR-QtN!7de|)&Yd%)MXc;8LlSMm2&`OP(cbA{i0$Jh2o=Jiaa`$*-fqW-J; zN;O}p{PbvHsRwrcOG*?Y2J)wZYU6%;;LEBNZRhitY%7Pa*+RI zm3@j}aZw0S*4j#cZ|U=>?2O9JssiMQEP*7FR8lhCX+0{~R4ymcOV$AWTkDZMF`jh6 zL^24VnkGrMkdq}c1id`wW!!;e4>GjX;bElRV(1~;Hu{e3k@-mU%Grg@b z*iAlG+4*dRk5&0&HU3zIKX%8~RpGnHC}^I*v!s3*p?_+zxhJ*|iY8=J>Gf7rQILi_D96DZvgYg1$fxTdSgSki}e!u-9E3uQDeq7Uq?k!a9_Ib5h zupwkhoW^dx$bQYrziKRUSdqnEF}}i{;w1jOSrQhFjYl`cs%bA6gioy3B0+Owaj>2N zg1^&XXBb-D?rWATbF1_8`Lyctwc~mv)1vh%`0ob#P`gS7EX(N8fi^!d*d)8;keVc? z)GWCq_oSu7YpZwHS6`n7<%;O^ev3K9N-eNxYI=zej4^tM$Y z?GMt@UT0XZrS4HdS|wAL(}%gn154(MLIOityNbd>6XpkWcgJF=@r^?I5F|${LkFE9 zUJ2=|vg4SpR4>$`Qh1{qIhc4F-jjYUxT)y!8hZ5kZKpkTg4B~_q=?j+WZz}K!!CG{ z%{x%1GK>_Jx};5$++sKVO-tAc-iF=T8z&AL_ayiJDKOrZ0ItKPgX2AWPPOah$wao0 zQSxLr(DdC`E^8_1o_TLdOpi8SwsdLA=ML{~v%`j)?)ou)tc?P5piJ>N^4w0WFr$QRP& z3~*j&wW)d7cFbyO)F-9sPyK^tToEJ@EB)N>f4m7gDxZ>1fkKtbW>mve_MDce$yp!~ z)J%}+IN1j{#|?GQSrvIk84y#+$&6~8kTZ%*=r;l(_8^@OggVB7E#@cBz(eKp$vK%k zi%mhyZ>xd{K03fVMFweEdZJA{!ENV9`5olK7ΝejKMmGJO0 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 u1n|%CGk=K diff --git a/eda_view.py b/eda_view.py index 2e0c1386b032..69ce74af607d 100644 --- a/eda_view.py +++ b/eda_view.py @@ -11,50 +11,51 @@ def run(df): - col = st.columns((4,4), gap='medium') - + # LAYOUT DEL DASHBOARD # Primera fila con una sola columna - row1 = st.container() - + row1,row12 = st.columns((2,1), gap='medium') # Segunda fila con dos columnas col1, col2 = st.columns(2) - # Tercera fila con dos columnas - col3, col4 = st.columns(2) - - # Cuarta fila con una sola columna + col3, col4, col5, col6 = st.columns(4) + # quarta fila con una sola columna + row21 = st.container() + # Quinta fila con una sola columna row2 = st.container() - - # Ahora puedes usar row1, col1, col2, col3, col4, y row2 para agregar contenido a tu dashboard - # Por ejemplo: - row1.header("Este es el encabezado de la primera fila") - col1.write("Este es el contenido de la segunda fila, primera columna") - col2.write("Este es el contenido de la segunda fila, segunda columna") - col3.write("Este es el contenido de la tercera fila, primera columna") - col4.write("Este es el contenido de la tercera fila, segunda columna") - row2.header("Este es el encabezado de la cuarta fila") - - - st.title('Gestión de incidencias - Overview') + + # Añadimos contenido + row1.header('Gestión de incidencias - Overview') total_incidencias = df['task_id'].nunique() # Mostrar el número total de incidencias - st.write(f'Número total de incidencias: {total_incidencias}') + row12.markdown(f'
Número total de incidencias: {total_incidencias}
', unsafe_allow_html=True) # Insertar graficos - variable = st.selectbox('Seleccione la variable para agrupar:', ['priority', 'has_breached', 'assignment_group', 'company', 'contact_type','impact']) - - incidencias_timeline(df, variable) # grafico de barras, analisis temporal - tiempo_trabajado(df, variable) # priority vs time worked - - # contact_type(df) - # pie_charts(df) - # tabla(df) # summary table - # pie_chart_menos_24h(df) - # pie_chart_mas_24h(df) - # pie_chart_reasigned(df) - # pie_chart_not_reasigned(df) - + variable = col1.selectbox('Seleccione la variable para agrupar:', ['priority', 'has_breached', 'assignment_group', 'company', 'contact_type','impact']) + incidencias_timeline_fig = incidencias_timeline(df, variable) # grafico de barras, analisis temporal + tiempo_trabajado_fig = tiempo_trabajado(df, variable) # priority vs time worked + col1.plotly_chart(incidencias_timeline_fig) + col2.plotly_chart(tiempo_trabajado_fig) + + # Pie charts + pie1 = pie_chart_menos_24h(df) + pie2 = pie_chart_mas_24h(df) + pie3 = pie_chart_reasigned(df) + pie4 = pie_chart_not_reasigned(df) + + col3.plotly_chart(pie1) + col4.plotly_chart(pie2) + col5.plotly_chart(pie3) + col6.plotly_chart(pie4) + + + var_select = col4.selectbox('Seleccione la variable para agrupar:', ['assignment_group', 'company', 'priority']) + contact_type_fig = contact_type(df, var_select) + row21.plotly_chart(contact_type_fig) + variable_select = row2.selectbox('Seleccione la variable para agrupar:', ['assignment_group', 'company', 'contact_type']) + table = tabla(df, variable_select) + row2.table(table) + # FUNCIONES GRAFICOS --------------------------------------------------------------------------------- def incidencias_timeline(df, variable): @@ -68,7 +69,7 @@ def incidencias_timeline(df, variable): labels={'task_id':'Número de incidencias'}, height=400) incidencias_timeline_fig.update_layout(barmode='stack') incidencias_timeline_fig.update_xaxes(title_text='Mes y año de finalización') - st.plotly_chart(incidencias_timeline_fig) + #st.plotly_chart(incidencias_timeline_fig) return incidencias_timeline_fig def tiempo_trabajado(df, variable): @@ -81,9 +82,7 @@ def tiempo_trabajado(df, variable): #st.plotly_chart(tiempo_trabajado_fig) return tiempo_trabajado_fig -def tabla(df): - variable_select = st.selectbox('Seleccione la variable para agrupar:', ['assignment_group', 'company', 'contact_type']) - +def tabla(df, variable_select): priority_counts = df.groupby([variable_select, 'priority']).size().reset_index(name='counts') total_counts = df.groupby(variable_select).size() priority_counts['percentage'] = priority_counts.apply(lambda row: (row['counts'] / total_counts[row[variable_select]]) * 100, axis=1) @@ -126,10 +125,10 @@ def tabla(df): # apply styles grouped_table = grouped_table.style.applymap(color_cell_priority).set_properties(**{'text-align': 'center'}).set_table_styles([dict(selector='th', props=[('background', '#54B4CE'), ('color', 'white')])]) - st.table(grouped_table) + #st.table(grouped_table) + return grouped_table -def contact_type(df): - var_select = st.selectbox('Seleccione la variable para agrupar:', ['assignment_group', 'company', 'priority']) +def contact_type(df, var_select): fig3 = px.bar(df, x=var_select, y='task_id', color='contact_type', labels={'task_id':'Número de incidencias'}) fig3.update_layout( title= f'{var_select} vs tipo de contacto', @@ -139,9 +138,10 @@ def contact_type(df): ax = plt.gca() # get current axes ax.set_yticklabels([]) fig3.update_layout(barmode='stack') - st.plotly_chart(fig3) + #st.plotly_chart(fig3) + return fig3 -def pie_charts(df): +#def pie_charts(df): selection_variable = st.selectbox('Seleccione la variable para agrupar:', ['reassingment_count_bool','u_24_7']) contact_types = df['contact_type'].unique() @@ -168,7 +168,8 @@ def pie_chart_menos_24h(df): pie = px.pie(df_filtered, names='contact_type', title=f'Incidencias resueltas en menos de 24h - {porcentaje_less:.2f}%', labels={'contact_type':'Tipo de contacto'}, height=400) - st.plotly_chart(pie) + #st.plotly_chart(pie) + return pie def pie_chart_mas_24h(df): @@ -183,7 +184,7 @@ def pie_chart_mas_24h(df): pie = px.pie(df_filtered, names='contact_type', title=f'Incidencias resueltas en más de 24h - {porcentaje_more:.2f}%', labels={'contact_type':'Tipo de contacto'}, height=400) - st.plotly_chart(pie) + return pie def pie_chart_reasigned(df): @@ -197,7 +198,7 @@ def pie_chart_reasigned(df): pie = px.pie(df_filtered, names='contact_type', title=f'Incidencias reasignadas - {porcentaje_reasigned:.2f}%', labels={'contact_type':'Tipo de contacto'}, height=400) - st.plotly_chart(pie) + return pie def pie_chart_not_reasigned(df): # cambiar los 1 por 0 y los 0 por 1 @@ -211,7 +212,7 @@ def pie_chart_not_reasigned(df): pie = px.pie(df_filtered, names='contact_type', title=f'Incidencias no reasignadas - {porcentaje_not_reasigned:.2f}%', labels={'contact_type':'Tipo de contacto'}, height=400) - st.plotly_chart(pie) + return pie diff --git a/sentiment-analysis-view.py b/sentiment-analysis-view.py index 967918b72df6..1408133611f6 100644 --- a/sentiment-analysis-view.py +++ b/sentiment-analysis-view.py @@ -9,10 +9,4 @@ import plotly.express as px -def run(): - #df = pd.read_excel('/Users/carlotapersonal/Library/CloudStorage/OneDrive-UFV/CURSO_5/PFG/Code/proyecto-fin-de-grado-2024-2-carlotagomezr/data-analysis/eda/dataset_post_EDA.xlsx') - df = pd.read_excel('/Users/carlotro/Desktop/Escritorio/Personal-Carlota/UFV/PFG/APP-REPO/dataset_post_EDA.xlsx') - - - \ No newline at end of file