U
    Éø¦iy  ã                   @   sx  d dl Zd dlZd dlZd dlZd dlm	Z	m
Z
 d dlmZ d dlZd dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlmZ eƒ Zd dlmZ d dlm Z  d dlm!Z! d d	lm"Z" e #d
¡Z$dd„ Z%dd„ Z&dd„ Z'dd„ Z(dd„ Z)dd„ Z*dd„ Z+dd„ Z,dd„ Z-dd„ Z.dd „ Z/d!d"„ Z0d#d$„ Z1d%d&„ Z2d'd(„ Z3d)d*„ Z4d2d+d,„Z5ej6d-d.d/d0œe 7¡ d1�Z8dS )3é    N)Ú	WordCloudÚImageColorGenerator)ÚCounter)ÚTextBlob)ÚSentimentIntensityAnalyzer)Úconfusion_matrix)Úclassification_report)Ú	roc_curve)Úroc_auc_scorez./data/amazon_data.jsonc                 C   s   t ddddddd� | ¡}|S )Ni   é�  Úblackiô  é*   ZRGBA)ÚwidthÚheightZbackground_colorZ	max_wordsÚrandom_stateÚmode)r   Úgenerate)ÚtextÚcloud© r   ú8/var/www/sinfronteras/sentiment-dash/components/plots.pyÚ	wordCloud   s     þýr   c              	   C   sš   |   ¡ }t|jƒ t ¡ }| |d¡ | d¡ t | 	¡ ¡ 
d¡ dd¡}d |¡}tjddd	d	d
œtjdddd	d	dœ||jd |jd d�gd�}|S )NZPNGr   zutf-8Ú
Ú zdata:image/png;base64,{0}Ú350pxÚblockÚauto)r   Údisplayúmargin-leftúmargin-rightú100%)r   r   r   r   r   é   )ÚstyleÚsrcr   r   )r"   Úchildren)Zto_imageÚprintÚsizeÚioÚBytesIOÚsaveÚseekÚbase64Ú	b64encodeÚgetvalueÚdecodeÚreplaceÚformatÚhtmlÚDivÚImg)r   ÚimageZbyte_ioZdata_urir#   Údivr   r   r   Úimg_wordCloud'   s&    


  þÿþÿr6   c                 C   s´   |   ¡ }t|ƒ}t| ¡ ƒ}t t| ¡ ƒt| ¡ ƒdœ¡}|j	dgdd�}t
 t
j|d  |¡|d  |¡ddd�g¡}|jt
jjddddd	�d
dtddd�d� |jdd� |S )N)ÚwordÚcountr8   T©ÚbyÚ	ascendingr7   Úh©ÚxÚyÚorientationr   é   ©ÚlÚrÚtÚbé   Úhideé   r   ©r&   Úcolor©ÚmarginÚuniformtext_minsizeÚuniformtext_modeÚfont©Z
automargin)Úsplitr   ÚdictÚitemsÚpdÚ	DataFrameÚlistÚkeysÚvaluesÚsort_valuesÚgoÚFigureÚBarÚtailÚupdate_layoutÚlayoutÚMarginÚupdate_yaxes)r   ÚnumberÚlistaÚcountsÚdicÚdfÚfigr   r   r   ÚwordCountBarChartA   s0        ÿÿ ýü
ri   c                 C   s´   g }|   d¡ ¡ d }| ¡ }|ddg }|d  d¡|d< |jdgdd�}tj|ddddddd	œd
d�}|jtj	j
ddddd�ddddtdddd�td ddd�tddd�d� |S )NÚbrandÚaverage_customer_reviewsÚmeané   Fr9   zAve. customer reviewsÚBrand)rl   rj   r   )r>   r?   rK   r   Úlabelsr   rA   r   rB   éìÿÿÿrG   rH   é   é   ©ÚtitleÚtitlefont_sizeÚtickfont_sizer   rJ   )rM   Úxaxis_tickanglerN   rO   Úcoloraxis_showscaleÚyaxisÚxaxisrP   )ÚgroupbyÚdescribeÚreset_indexÚroundrZ   ÚpxÚbarr_   r[   r`   ra   rS   )ZthedataZaverh   r   r   r   ÚaveReviewsBarChart^   s@     ÿ   ýýýór�   c                 C   s²  |   d¡dddg }g }|  d¡ ¡ d }| ¡ }|ddg }|d  d¡|d< |jdgdd�}t|ƒd	krüt|ƒd	krüg }| d¡ ¡ d }| ¡ }|ddg }|d  d¡|d< |jdgdd�}tj||dd
d�}t	|d ƒ}t	|d ƒ}t	|d ƒ}	n&t	|d ƒ}d gt|ƒ }t	|d ƒ}	t
jt
jd|	||d�t
jd|	||d�gd�}
|
jddd� |
jt
jjdddd	d�ddddtdddd�td ddd�tdd d!�d"td#d$d%�d&�
 |
S )'Nú6brand in @brands_selected & series in @series_selectedrj   Úseriesrk   rl   rm   Fr9   r   Úouter©ÚonÚhowÚmean_xÚmean_yú	All items©Únamer>   r?   r   úSelected items©Údataz%{text:.3s}Úinside©ZtexttemplateZtextpositionrA   rr   rB   rp   rG   rH   úAvg. customer reviews (1-5)rq   r!   rs   é   r   rJ   r<   gR¸…ëQÈ?çffffffò?©r>   r?   ©
rM   rw   rN   rO   rx   ry   rz   rP   Zlegend_orientationÚlegend©Úqueryr{   r|   r}   r~   rZ   ÚlenrU   ÚmergerW   r[   r\   r]   Úupdate_tracesr_   r`   ra   rS   )r�   Úbrands_selectedÚseries_selectedZbrand_series_review_selectedZreview_totalZreview_selectedZreview_total_selectedZreview_total_listZreview_selected_listÚbrandsrh   r   r   r   ÚavgReviewsBarChartƒ   sd    þ   üýý
ìr    c                 C   s²  |   d¡dddg }g }|  d¡ ¡ d }| ¡ }|ddg }|d  d¡|d< |jdgdd�}t|ƒd	krüt|ƒd	krüg }| d¡ ¡ d }| ¡ }|ddg }|d  d¡|d< |jdgdd�}tj||dd
d�}t	|d ƒ}t	|d ƒ}t	|d ƒ}	n&t	|d ƒ}d gt|ƒ }t	|d ƒ}	t
jt
jd|	||d�t
jd|	||d�gd�}
|
jddd� |
jt
jjdddd	d�ddddtdddd�td ddd�tdd d!�d"td#d$d%�d&�
 |
S )'Nr‚   rj   rƒ   Úpricerl   rm   Fr9   r   r„   r…   rˆ   r‰   rŠ   r‹   r�   rŽ   z%{text:.3s} $r�   r‘   rA   rr   rB   rp   rG   rH   zAvg. price ($)rq   é   rs   r“   r   rJ   r<   g¤p=
×£À?r”   r•   r–   r˜   )r�   r�   rž   Zbrand_series_price_selectedZprice_totalZprice_selectedZprice_total_selectedZprice_total_listZprice_selected_listrŸ   rh   r   r   r   ÚavgPricesBarChartÃ   sd    þ   ýýþ
îr£   c                  C   sf   t jtdddddddd�} | jtjjdddd	d
�d	dddtdddd�tdddd�tddd�dd�	 | S )Nr¡   rk   rj   Fé   )r>   r?   r&   rK   Z
hover_nameZlog_xZsize_maxrA   é
   r   rB   rG   rH   r’   rq   r¢   rs   z
Prices ($)r“   rr   r   rJ   rn   )	rM   rw   rN   rO   rx   ry   rz   rP   Zlegend_title)r   Úscatterr�   r_   r[   r`   ra   rS   )rh   r   r   r   ÚavgVsPriceBubbleChart  s<    
   þ   ýýþïr§   c                 C   s¬   t  dd„ | d D ƒ¡}| ¡ }t  d ¡ |dœ¡}|jdgdd�}t tj|d |d	 d
dd�g¡}|j	tj
jddddd�ddtddd�d� |jdd� |jdd� |S )Nc                 S   s   g | ]}t  |¡‘qS r   )ÚnpÚarray)Ú.0rd   r   r   r   Ú
<listcomp>5  s     z$emotionsBarChart.<locals>.<listcomp>ÚemotionszLanger anticipation disgust fear joy negative positive sadness surprise trust)Úemotionr8   r8   Tr9   r­   r<   r=   rA   rB   rG   rH   rI   r   rJ   rL   rQ   ú#007bff)Zmarker_color)rU   ÚSeriesÚsumrV   rR   rZ   r[   r\   r]   r_   r`   ra   rS   rb   rœ   )Zsentiment_dfZemoZemoSumZcounterEmo_dfrh   r   r   r   ÚemotionsBarChart4  s4    
ÿ   ÿÿ ýü
r±   c                 C   s   dd„ |   ¡ D ƒS )Nc                 S   s   g | ]}|D ]}|‘qqS r   r   )rª   rd   Úvaluer   r   r   r«   ”  s       zconcaLists.<locals>.<listcomp>©Útolist)Zserie_entryr   r   r   Ú
concaLists“  s    rµ   c                 C   s0  g g g   }}}t t| ƒƒD ]j}|| d j| g| d j|  7 }|| d j| g| d j|  7 }|| d j| g| d j|  7 }qt t| d ƒt| d ƒt| d ƒt| d ƒt| d	 ƒt| d
 ƒt| d ƒt| d ƒt| d ƒt| d ƒt| d ƒt| d ƒt| d ƒt| d ƒt| d ƒ|||dœ¡S )Nrj   Znumber_of_reviewsrƒ   r¡   Zreview_titleZreview_textZreview_title_textZreview_ratingÚpolarity_title_textblobÚsubjectivity_title_textblobÚpolarity_title_vaderÚpolarity_text_textblobÚsubjectivity_text_textblobÚpolarity_text_vaderÚpolarity_title_text_textblobÚ subjectivity_title_text_textblobÚpolarity_title_text_vaderr¬   Úlength_title_text)rt   r   Ú
title_textÚratingr¶   r·   r¸   r¹   rº   r»   r¼   r½   r¾   r¬   r¿   rj   rƒ   r¡   )Úrangerš   ÚilocrU   rV   rµ   )r�   rj   rƒ   r¡   Únr   r   r   ÚcreateSentimentDf—  s0    ""$













ïrÅ   c           	   
   C   sº   |d dkr.t | | dk ƒ}t | | dk ƒ}n t | | dk ƒ}t | | dk ƒ}||g}tjtj||dd�gd	�}|jtjjddd
d
d�dt|dd|dd�gd� |jddt|d�d� |S )Nr   zPos.ÚpositiveÚnegativeÚ	objectiveÚ
subjectiveç      à?)ro   rY   ZholerŽ   r¥   rB   F)r   r>   r?   Ú	font_sizeZ	showarrow)rM   Ú
showlegendÚannotationsúlabel+percentrq   ©Úcolors©ZtextinfoZtextfont_sizeÚmarker)	rš   r[   r\   ÚPier_   r`   ra   rS   rœ   )	r?   ro   Ztitle1Ztitle1_sizerÐ   Ún_posÚn_negrY   rh   r   r   r   ÚsentimetsDonutChart´  s     ýÿrÖ   c                 C   s  |dkr\d}| | d dk dd|g }dd„ |d   ¡ D ƒ|d< dd„ ||   ¡ D ƒ||< n®|d	kr¸d
}| | d dk dd|g }dd„ |d   ¡ D ƒ|d< dd„ ||   ¡ D ƒ||< nRd}| | d dk dd|g }dd„ |d   ¡ D ƒ|d< dd„ ||   ¡ D ƒ||< |S )NÚtextblobr¼   rÁ   é   rÀ   c                 S   s   g | ]}|d krdnd‘qS ©rØ   rÆ   rÇ   r   ©rª   Zpolarityr   r   r   r«   Û  s     z(getSentimentAnalysis.<locals>.<listcomp>c                 S   s   g | ]}|d krdnd‘qS ©r   rÆ   rÇ   r   rÚ   r   r   r   r«   Ü  s     Zvaderr¾   c                 S   s   g | ]}|d krdnd‘qS rÙ   r   rÚ   r   r   r   r«   ã  s     c                 S   s   g | ]}|d krdnd‘qS rÛ   r   rÚ   r   r   r   r«   ä  s     r½   c                 S   s   g | ]}|d krdnd‘qS rÙ   r   rÚ   r   r   r   r«   ë  s     c                 S   s   g | ]}|d krdnd‘qS )rÊ   rÈ   rÉ   r   )rª   Zsubjectivityr   r   r   r«   ì  s     r³   )Zreviews_sent_polaritiesZsentiment_libraryZpolarity_columnsZsent_analysis_dfr   r   r   ÚgetSentimentAnalysisÓ  s    rÜ   c           
      C   s  t jt| |ddgd�ddgddgd�}|d d }|d d }|d d }|d d }d	 |¡d
 |¡gd |¡d |¡gg}ddgddgg}tj|ddgddg|ddgddggd�}	d|	d d d< |	jtddddd�tddddd�tdd�d� |	jtddddd �d!d"� |	S )#NrÆ   rÇ   ©ro   úActual:positiveúActual:negativeúPredicted:positiveúPredicted:negative©ÚindexÚcolumnsz
TP<br />{}z
FN<br />{}z
FP<br />{}z
TN<br />{}r   r!   ZPositiveZNegativeú#6495EDú#b35050©r>   r?   Zannotation_textZ
colorscaleÚreversedr`   ry   Ú	autorangezCurrent  valuerr   r   )rt   ru   rv   rK   zPredicted  valueé   ©r&   )ry   rz   rP   ©rE   rF   rD   rC   i¦ÿÿÿ)rM   Zyaxis_tickangle)rU   rV   r   r0   ÚffÚcreate_annotated_heatmapr_   rS   )
Úy_trueÚy_predÚcmÚTPÚFNÚFPÚTNZcm_anotationsZ	cm_colorsrh   r   r   r   ÚConfusionMatrixHeatmapû  sP    ýÿûüüÿórö   c           
      C   sÊ   t jt| |ddgd�ddgddgd�}|d d }|d d }|d d }|d d }||||g}d	d
ddg}tjtj||ddd�gd�}	|	jtjjddddd�dd� |	j	ddt
ddddgd�d� |	S )NrÆ   rÇ   rÝ   rÞ   rß   rà   rá   râ   rò   rõ   rô   ró   Z	clockwiseF)ro   rY   Ú	directionÚsortrŽ   r   r¥   rB   )rM   rÌ   rÎ   rq   rå   r®   ræ   z#9c2828rÏ   rÑ   )rU   rV   r   r[   r\   rÓ   r_   r`   ra   rœ   rS   )
rï   rð   rñ   rò   ró   rô   rõ   rY   ro   rh   r   r   r   Úconfusion_matrix_pie_chart)  s(    ýþÿrù   c                 C   sF  t dƒ t| |ddgdd�}t| |ddgdd�}t t|d d dƒ|d d	 |d d
 dg|d d |d d	 |d d
 dgddddgdd|d dg|d d |d d	 |d d
 dg|d d |d d	 |d d
 dgg¡}t t |¡d¡}dd„ |D ƒ}dd„ |d D ƒ|d< d|d d< d|d d< |d d |d d< |d d |d d< |d d |d d< |d d |d d< |d d |d d< tj|dd	d
dgddddddg|ddgddgddgddgd d!gd"d#gd$d%gdd&ggd'�}d(|d) d* d+< |jtd,d-d.d/�td,d-d.d/�td0d1�td0d0d0d0d2�d3� d|d4 d d5< |S )6Nz
Classification report:rÆ   rÇ   F)ro   Zoutput_dictTÚ	precisionrm   Zrecallzf1-scoreg        Úaccuracyz	macro avgzweighted avgc                 S   s   g | ]}d d„ |D ƒ‘qS )c                 S   s   g | ]}t |ƒ‘qS r   )Ústr)rª   r²   r   r   r   r«   s  s     z5classif_report_heatmap.<locals>.<listcomp>.<listcomp>r   )rª   Zfilar   r   r   r«   s  s     z*classif_report_heatmap.<locals>.<listcomp>c                 S   s   g | ]}d ‘qS )ú r   )rª   Úar   r   r   r«   u  s     rý   rØ   r   r!   Úsupporté   rA   Úwhiteg{®Gáz„?Úredg333333Ó?z#f75454rÊ   z#eb8d8dçffffffæ?z#a5bdfagš™™™™™é?z#779bf7gÍÌÌÌÌÌì?z#366effz#0048ffrç   rè   r`   ry   ré   rê   rq   r   ©ru   rv   rK   rr   rë   rì   )ry   rz   rP   rM   r�   Z	showscale)	r%   r   r¨   r©   r~   rí   rî   r_   rS   )rï   rð   Zclassif_report_stringZclassif_report_dicZclassif_report_colorsZclassif_report_anotationsrh   r   r   r   Úclassif_report_heatmapF  sž    

ü


üüü


ü


üâ%
ùûýýÿòr  c                 C   s  dd„ | D ƒ}dd„ |D ƒ}t ||ƒ}t||ƒ\}}}d}tj||dtd|d�d| d	�}	tjd
dgd
dgdtd|dd�dd�}
tjdtdd�tdd�d�}tj|	|
g|d�}td
d
ddd�}|jtdddtddd�d�tdddd �tdddd �tdd!�tddd"dd�d#� |S )$Nc                 S   s   g | ]}|d krdnd‘qS ©rÆ   r   r!   r   ©rª   Úvr   r   r   r«   ¥  s     z#roc_curve_chart.<locals>.<listcomp>c                 S   s   g | ]}|d krdnd‘qS r  r   r  r   r   r   r«   ¦  s     rØ   Úlinesræ   )rK   r   zROC curve (area = %0.2f))r>   r?   r   ÚlinerŒ   r   r!   r®   Údash)rK   r   r  F)r>   r?   r   r
  rÌ   r   zFalse Positive Rate)rt   zTrue Positive Rate)rt   rz   ry   )r�   r`   rr   rì   g¸…ëQ¸Þ?g¸…ëQ¸ž?Únormalr   rJ   )r>   r?   Z
traceorderrP   rq   r  rë   r¤   )r—   ry   rz   rP   rM   )r
   r	   r[   ZScatterrS   ZLayoutr\   r_   )rï   rð   Z
y_true_binZ
y_pred_binZaucZfprZtprZ
thresholdsZlwZtrace1Ztrace2r`   rh   rM   r   r   r   Úroc_curve_chart£  s^    

ýýþþü	üüþär  c           
      C   s  |d kr.| | | dk } dd„ | | D ƒ| d< | j dgdd�} t| ƒ}t| | d dk ƒ}t| | d dk ƒ}t|d	 | ƒ}t|d	 | ƒ}tj| |dd
dddd�}	|	jtjjddddd�ddddt	dddd�t	dddd�t	ddd�t	ddd 
|||||¡t	dd�d�d�	 |	S ) NrØ   c                 S   s   g | ]}|d krdnd‘qS rÙ   r   )rª   rÁ   r   r   r   r«   à  s     z+review_length_histogram.<locals>.<listcomp>ÚlabelFr9   rÆ   rÇ   éd   Úoverlayé–   g      è?Úbox)r>   rK   ZbarmodeÚnbinsZopacityZmarginalr   é(   rB   rG   rH   ZCountr“   rs   z$Review length (number of characters)r   rJ   r  g¤p=
×£è?zà<span style="font-weight:bold; font-size:18px">{}</span> <span style="font-weight:normal; font-size:16px"> cust. reviews</span><br /><span style="color:blue">   {} ({}%)</span><br /><span style="color:red">   {} ({}%)</span>rë   )r?   r>   rt   rP   )	rM   rw   rN   rO   rx   ry   rz   rP   r—   )rZ   rš   r~   r   Ú	histogramr_   r[   r`   ra   rS   r0   )
rg   Zcolumn_ratingZcolumn_lengthZlabeledZ	n_reviewsrÔ   rÕ   Zn_pos_percentZn_neg_percentrh   r   r   r   Úreview_length_histogramÝ  sT    ÿ   ýýþÿüïr  z
text-fieldéú   r    )r   r   )Úidr"   r²   )N)9Údash_html_componentsr1   Údash_core_componentsÚdccÚnumpyr¨   ÚpandasrU   Z	wordcloudr   r   Úplotly.graph_objsÚ
graph_objsr[   r+   Zloremr'   Úcollectionsr   Zplotly.expressÚexpressr   Zplotly.figure_factoryZfigure_factoryrí   r×   r   ZvaderSentiment.vaderSentimentr   ZanalyserZsklearn.metricsr   r   r	   r
   Ú	read_jsonr�   r   r6   ri   r�   r    r£   r§   r±   rµ   rÅ   rÖ   rÜ   rö   rù   r  r  r  ÚTextareaZ	paragraphÚ	textfieldr   r   r   r   Ú<module>   sJ   
%@>3_(.]:
J