Ë
    7ëik'  ã                   óÚ  — d Z ddlZddlZddlmZ ddlZ ej                  d«       ddlmZ	 ddl
mZ ddlZdge	j                  d<   g d¢e	j                  d<   d	e	j                  d
<   de	j                  d<   	  ej                   d	¬«       ddddddddddddddddœZdefd„Zd edefd!„Zd"edefd#„Zd$edefd%„Zd&edefd'„Zd(edefd)„Zd1d*ed+edefd,„Zd-edefd.„Zd/edefd0„Zy#  Y Œ`xY w)2u<   
æœˆæ¬¡ãƒ¬ãƒ�ãƒ¼ãƒˆ - PDFç”¨ã‚°ãƒ©ãƒ•ç”Ÿæˆ�ï¼ˆmatplotlibï¼‰
é    N)ÚBytesIOÚAggz
sans-serifzfont.family)zNoto Sans CJK JPzNoto Sans CJKzDejaVu SansÚArialzfont.sans-serifFzaxes.unicode_minusé
   z	font.size)Útry_read_cachez#2196F3)g¤p=
×£À?gáz®Gáâ?gffffffî?ç333333ã?z#4CAF50)ç333333Ó?g®Gázæ?g×£p=
×Ó?r   z#F44336)g¸…ëQ¸î?g¤p=
×£Ð?çáz®GáÊ?r   z#FF9800)ç      ð?r   g        r   z#9E9E9E)ç×£p=
×ã?r   r   r   )ç�Âõ(\�Ò?ç      è?r   r   )r   r   r   r   )r   çö(\�ÂõØ?ç¤p=
×£à?r   )r   r   r   r   )r
   g{®Gázä?gq=
×£pí?r   )ÚprimaryÚprimary_lightÚsuccessÚsuccess_lightÚdangerÚdanger_lightÚwarningÚwarning_lightÚgrayÚ
gray_lightÚtealÚteal_borderÚredÚ
red_borderÚblueÚreturnc                 ó  — t        «       }| j                  |ddddd¬«       |j                  d«       t        j                  |j                  «       «      j                  d«      }|j                  «        t        j                  | «       d	|› �S )
uC   matplotlibã�®figureã‚’base64ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã�•ã‚Œã�Ÿç”»åƒ�ã�«å¤‰æ�›Úpngé–   ÚtightÚwhiteÚnone)ÚformatÚdpiÚbbox_inchesÚ	facecolorÚ	edgecolorr   zutf-8zdata:image/png;base64,)	r   ÚsavefigÚseekÚbase64Ú	b64encodeÚreadÚdecodeÚcloseÚplt)ÚfigÚbufÚ
img_base64s      ú-/var/www/html/chat/reports/core/pdf_charts.pyÚ_fig_to_base64r8   0   st   € ä
‹)€CØ‡K�K�˜E s¸Ø!¨Vð ô 5à‡H�HˆQ„KÜ×!Ñ! #§(¡(£*Ó-×4Ñ4°WÓ=€JØ‡I�I„KÜ‡I�Iˆc„NØ# J <Ð0Ð0ó    Údaily_statsc           	      ó  — | sy| D �cg c]  }|j                  dd«      dd ‘Œ }}| D �cg c]  }t        |j                  dd«      «      ‘Œ }}| D �cg c]  }t        |j                  dd«      «      ‘Œ }}| D �cg c]  }t        |j                  dd«      «      ‘Œ }}t        j                  d	¬
«      \  }}t	        j
                  t        |«      «      }d}	|j                  ||	dz  z
  ||	dt        d   ¬«       |j                  ||	dz  z   ||	dt        d   ¬«       t        |«      dk\  r�ddl	m
}
 t	        j                  |j                  «       |j                  «       t        |«      dz  «      } |
||«      }|j                  | ||«      ddt        d   d¬«       |j                  ||dt        d   d¬«       n|j                  ||ddt        d   d¬«       |j                  d«       |j!                  d«       |j#                  d«       |j%                  |«       |j'                  |d d!¬"«       |j)                  d#¬$«       |j+                  d%d&¬'«       t        j,                  «        t/        |«      S c c}w c c}w c c}w c c}w )(uC   
    æ—¥åˆ¥å›žç­”çµ±è¨ˆã‚°ãƒ©ãƒ•ï¼ˆæ£’ã‚°ãƒ©ãƒ• + æŠ˜ã‚Œç·šï¼‰
    NÚdateÚ éûÿÿÿÚtotal_conversationsr   Úanswered_countÚunanswered_count©r   é   ©ÚfigsizeçffffffÖ?é   õ   å›žç­”ã�§ã��ã�Ÿr   ©ÚlabelÚcolorõ   å›žç­”ã�§ã��ã�ªã�‹ã�£ã�Ÿr   é   )ÚPchipInterpolatorr   ú-õ   ç·�ä¼šè©±æ•°r   )rJ   rK   Ú	linewidthÚorC   )rK   Ú
markersizezo-u   æ—¥ä»˜õ   ä»¶æ•°u   æ—¥åˆ¥å›žç­”çµ±è¨ˆé-   Úright©ÚrotationÚhaz
upper left)ÚlocÚyr	   ©ÚaxisÚalpha)ÚgetÚintr3   ÚsubplotsÚnpÚarangeÚlenÚbarÚCOLORSÚscipy.interpolaterN   ÚlinspaceÚminÚmaxÚplotÚ
set_xlabelÚ
set_ylabelÚ	set_titleÚ
set_xticksÚset_xticklabelsÚlegendÚgridÚtight_layoutr8   )r:   ÚdÚdatesÚtotalÚansweredÚ
unansweredr4   ÚaxÚxÚwidthrN   Úx_smoothÚpchips                r7   Úgenerate_daily_chartr~   <   s/  € ñ Øà-8Ö9¨ˆQ�U‰U�6˜2Ó˜r˜sÒ#Ð9€EÐ9Ø;FÖG°aŒS�—‘Ð,¨aÓ0Õ1ÐG€EÐGØ9DÖE°A”�A—E‘EÐ*¨AÓ.Õ/ÐE€HÐEØ=HÖI¸”#�a—e‘eÐ.°Ó2Õ3ÐI€JÐIä�l‰l 7Ô+�G€Cˆä
�	‰	”#�e“*Ó€AØ€Eà‡F�Fˆ1ˆu�Q‰w‰;˜ %Ð/@ÌÈvÉ€FÔWØ‡F�Fˆ1ˆu�Q‰w‰;˜
 EÐ1KÔSYÐZ_ÑS`€FÔaä
ˆ1ƒv�‚{Ý7Ü—;‘;˜qŸu™u›w¨¯©«´°Q³¸"±Ó=ˆÙ! ! UÓ+ˆØ
�‰�™% ›/¨3°nÌFÐSYÉNÐfgˆÔhØ
�‰��5˜#¤V¨F¡^ÀˆÕBà
�‰��5˜$ n¼FÀ6¹NÐVWˆÔXà‡M�M�(ÔØ‡M�M�(ÔØ‡L�LÐ%Ô&Ø‡M�M�!ÔØ×Ñ�u r¨gÐÔ6Ø‡I�I�,€IÔØ‡G�G�˜C€GÔ ä×ÑÔÜ˜#ÓÐùò? :ùÚGùÚEùÚIs   ˆI5ª"I:Á"I?Á:"JÚ
comparisonc                 ó¾  — | sy| j                  di «      }| j                  di «      }g d¢}|j                  dd«      |j                  dd«      |j                  dd«      |j                  d	d«      |j                  d
d«      g}|j                  dd«      |j                  dd«      |j                  dd«      |j                  d	d«      |j                  d
d«      g}t        j                  d¬«      \  }}t        j                  t        |«      «      }d}	|j                  ||	dz  z
  ||	dt        d   ¬«       |j                  ||	dz  z   ||	dt        d   ¬«       |j                  d«       |j                  d«       |j                  |«       |j                  |«       |j                  «        |j                  dd¬«       t        j                  «        t        |«      S )u   
    å‰�æœˆæ¯”è¼ƒã‚°ãƒ©ãƒ•
    NÚpreviousÚcurrent)rP   rH   rL   u	   ã�„ã�„ã�­u   ã‚ˆã��ã�ªã�„r?   r   r@   rA   Úlikes_countÚdislikes_count©é   rC   rD   rF   rG   u   å‰�æœˆr   rI   u   å½“æœˆr   rT   u   å‰�æœˆæ¯”è¼ƒr[   r	   r\   )r_   r3   ra   rb   rc   rd   re   rf   rm   rn   ro   rp   rq   rr   rs   r8   )
r   ÚprevÚcurrÚlabelsÚ	prev_dataÚ	curr_datar4   ry   rz   r{   s
             r7   Úgenerate_comparison_chartrŒ   e   s¦  € ñ Øà�>‰>˜* bÓ)€DØ�>‰>˜) RÓ(€Dâi€Fà�‰Ð&¨Ó*Ø�‰Ð! 1Ó%Ø�‰Ð# QÓ'Ø�‰� Ó"Ø�‰Ð! 1Ó%ð€Ið 	�‰Ð&¨Ó*Ø�‰Ð! 1Ó%Ø�‰Ð# QÓ'Ø�‰� Ó"Ø�‰Ð! 1Ó%ð€Iô �l‰l 6Ô*�G€Cˆä
�	‰	”#�f“+Ó€AØ€Eà‡F�Fˆ1ˆu�Q‰w‰;˜	 5°ÄÀ|Ñ@T€FÔUØ‡F�Fˆ1ˆu�Q‰w‰;˜	 5°ÄÀÑ@W€FÔXà‡M�M�(ÔØ‡L�L�Ô Ø‡M�M�!ÔØ×Ñ�vÔØ‡I�I„KØ‡G�G�˜C€GÔ ä×ÑÔÜ˜#ÓÐr9   Úhourly_statsc                 ó²  — | syt        d«      D �ci c]  }|d“Œ }}| D ]+  }|j                  dd«      }|j                  dd«      }|||<   Œ- t        t        d«      «      }|D �cg c]  }||   ‘Œ	 }}t        j                  d¬«      \  }}	|	j                  ||t        d   t        d	   ¬
«       |	j                  d«       |	j                  d«       |	j                  d«       |	j                  |«       |	j                  |D �cg c]  }|› d�‘Œ	 c}dd¬«       |	j                  dd¬«       t        j                  «        t        |«      S c c}w c c}w c c}w )u%   
    æ™‚é–“å¸¯åˆ¥åˆ†å¸ƒã‚°ãƒ©ãƒ•
    Né   r   Úhourr?   rB   rD   r   r   ©rK   r+   u	   æ™‚é–“å¸¯õ	   è³ªå•�æ•°u   æ™‚é–“å¸¯åˆ¥è³ªå•�æ•°u   æ™‚rU   rV   rW   r[   r	   r\   )Úranger_   Úlistr3   ra   re   rf   rl   rm   rn   ro   rp   rr   rs   r8   )
r�   ÚhÚ	hour_dataÚitemr�   ÚcountÚhoursÚcountsr4   ry   s
             r7   Úgenerate_hourly_chartr›   ’   sC  € ñ Øô  % R›yÖ)˜!��A‘Ð)€IÐ)Øò  ˆØ�x‰x˜ Ó"ˆØ—‘Ð.°Ó2ˆØˆ	�$Šð ô
 ”�r“‹O€EØ$)Ö*˜qˆi˜‹lÐ*€FÐ*ä�l‰l 7Ô+�G€Cˆà‡F�Fˆ5�&¤ Ñ 7Ä6È)ÑCT€FÔUà‡M�M�+ÔØ‡M�M�+ÔØ‡L�LÐ(Ô)Ø‡M�M�%ÔØ×Ñ¨5Ö1 a˜1˜#˜Sš	Ò1¸BÀ7ÐÔKØ‡G�G�˜C€GÔ ä×ÑÔÜ˜#ÓÐùò+ *ùò +ùò 2s   ‘
E
Á%EÄEÚ	dow_statsc                 ób  — | syg d¢}t        d«      D �ci c]  }|d“Œ }}| D ]+  }|j                  dd«      }|j                  dd«      }|||<   Œ- t        d«      D �cg c]  }||   ‘Œ	 }}t        d«      D �cg c]  }|dk\  r	t        d   nt        d	   ‘Œ }}t        j                  d
¬«      \  }	}
|
j                  |||t        d   ¬«       |
j                  d«       |
j                  d«       |
j                  dd¬«       t        j                  «        t        |	«      S c c}w c c}w c c}w )u   
    æ›œæ—¥åˆ¥ã‚°ãƒ©ãƒ•
    N)u   æœˆu   ç�«u   æ°´u   æœ¨u   é‡‘u   åœŸu   æ—¥é   r   Úday_of_weekr?   é   r   r   )é   rC   rD   r   r‘   r’   u   æ›œæ—¥åˆ¥è³ªå•�æ•°r[   r	   r\   )r“   r_   rf   r3   ra   re   rm   rn   rr   rs   r8   )rœ   Ú	day_namesÚiÚday_datar—   Údowr˜   rš   Úcolorsr4   ry   s              r7   Úgenerate_day_of_week_chartr§   ²   s'  € ñ ØâA€IÜ# A›hÖ'˜��1‘Ð'€HÐ'àò ˆØ�h‰h�} aÓ(ˆØ—‘Ð.°Ó2ˆØˆ�Šðô
 $)¨£8Ö,˜aˆh�q‹kÐ,€FÐ,ÜV[Ð\]ÓV^Ö_ÐQR¨¨aªŒf�_Ò%´V¸OÑ5LÑLÐ_€FÐ_ä�l‰l 6Ô*�G€Cˆà‡F�Fˆ9�f F´f¸YÑ6G€FÔHà‡M�M�+ÔØ‡L�LÐ%Ô&Ø‡G�G�˜C€GÔ ä×ÑÔÜ˜#ÓÐùò' (ùò -ùÚ_s   •
D"ÁD'Á9D,Úsummaryc                 óp  — | sy| j                  dd«      }| j                  dd«      }|dk(  r|dk(  ryt        j                  d¬«      \  }}||g}ddg}t        d	   t        d
   g}|j	                  |||dddt        d¬«      ¬«       |j                  d«       t        j                  «        t        |«      S )u"   
    å›žç­”å�¯å�¦å††ã‚°ãƒ©ãƒ•
    Nr@   r   rA   )r    rC   rD   rH   rL   r   r   z%1.1f%%éZ   r   g      à?)r{   )r‰   r¦   ÚautopctÚ
startangleÚpctdistanceÚ
wedgepropsu   å›žç­”å�¯å�¦)	r_   r3   ra   rf   ÚpieÚdictrn   rs   r8   )r¨   rw   rx   r4   ry   Úsizesr‰   r¦   s           r7   Úgenerate_resolution_pie_chartr²   Ð   s¿   € ñ Øà�{‰{Ð+¨QÓ/€HØ—‘Ð/°Ó3€Jà�1‚}˜ qšØä�l‰l 6Ô*�G€Cˆà�zÐ"€EØÐ!;Ð<€FÜ�YÑ¤¨Ñ!1Ð2€Fà‡F�Fˆ5˜¨¸	Ø d´tÀ#´ð ô Hà‡L�L�Ô ä×ÑÔÜ˜#ÓÐr9   ÚkeywordsÚtitlec                 óò  — | sy| dd }t        |d   t        t        f«      r%|D �cg c]  }|d   ‘Œ	 }}|D �cg c]  }|d   ‘Œ	 }}n>|D �cg c]  }|j                  dd«      ‘Œ }}|D �cg c]  }|j                  dd«      ‘Œ }}t	        j
                  d¬	«      \  }}t        j                  t        |«      «      }|j                  ||t        d
   t        d   ¬«       |j                  |«       |j                  |«       |j                  d«       |j                  |«       |j                  «        |j!                  dd¬«       t	        j"                  «        t%        |«      S c c}w c c}w c c}w c c}w )u(   
    ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰æ¨ªæ£’ã‚°ãƒ©ãƒ•
    Nr   r   é   Úkeywordr=   r˜   r…   rD   r   r   r‘   u   å‡ºç�¾å›žæ•°rz   r	   r\   )Ú
isinstancer”   Útupler_   r3   ra   rb   rc   rd   Úbarhrf   Ú
set_yticksÚset_yticklabelsrl   rn   Úinvert_yaxisrr   rs   r8   )	r³   r´   Útop10Úkr‰   rš   r4   ry   r[   s	            r7   Úgenerate_keywords_chartrÀ   ë   sH  € ñ Øð �S�bˆM€Eô �%˜‘(œT¤5˜MÔ*Ø %Ö&˜1�!�A“$Ð&ˆÐ&Ø %Ö&˜1�!�A“$Ð&ˆÑ&à05Ö6¨1�!—%‘%˜	 2Õ&Ð6ˆÐ6Ø-2Ö3¨�!—%‘%˜ Õ#Ð3ˆÐ3ä�l‰l 6Ô*�G€Cˆä
�	‰	”#�f“+Ó€AØ‡G�GˆAˆvœV OÑ4ÄÀyÑ@Q€GÔRà‡M�M�!ÔØ×Ñ�vÔØ‡M�M�.Ô!Ø‡L�L�ÔØ‡O�OÔØ‡G�G�˜C€GÔ ä×ÑÔÜ˜#ÓÐùò' 'ùÚ&ùâ6ùÚ3s   ¦E%¸E*ÁE/Á*E4Úcategory_rankingc                 ó.  — | sy| dd }|D �cg c]  }|d   ‘Œ	 }}|D �cg c]  }|d   ‘Œ	 }}t        j                  d¬«      \  }}t        j                  t	        |«      «      }|j                  ||t        d   t        d   ¬	«       |j                  |«       |j                  |«       |j                  d
«       |j                  d«       |j                  «        |j                  dd¬«       t        j                  «        t        |«      S c c}w c c}w )u7   
    ã‚«ãƒ†ã‚´ãƒªåˆ¥å•�ã�„å�ˆã‚�ã�›ãƒ©ãƒ³ã‚­ãƒ³ã‚°
    Nr   r¶   rG   r…   rD   r   r   r‘   u   å�‚ç…§å›žæ•°u3   ã‚«ãƒ†ã‚´ãƒªåˆ¥å•�ã�„å�ˆã‚�ã�›ãƒ©ãƒ³ã‚­ãƒ³ã‚° TOP10rz   r	   r\   )r3   ra   rb   rc   rd   rº   rf   r»   r¼   rl   rn   r½   rr   rs   r8   )rÁ   r¾   r—   r‰   rš   r4   ry   r[   s           r7   Úgenerate_category_ranking_chartrÃ     sö   € ñ Øð ˜S˜bÐ!€Eð #(Ö(˜$ˆd�1‹gÐ(€FÐ(Ø"'Ö(˜$ˆd�1‹gÐ(€FÐ(ä�l‰l 6Ô*�G€Cˆä
�	‰	”#�f“+Ó€AØ‡G�GˆAˆvœV OÑ4ÄÀyÑ@Q€GÔRà‡M�M�!ÔØ×Ñ�vÔØ‡M�M�.Ô!Ø‡L�LÐFÔGØ‡O�OÔØ‡G�G�˜C€GÔ ä×ÑÔÜ˜#ÓÐùò! )ùÚ(s
   �DŸDÚdatac                 ó.  — i }| j                  d«      rt        | d   «      |d<   | j                  d«      rt        | d   «      |d<   | j                  d«      rt        | d   «      |d<   | j                  d«      rt	        | d   «      |d<   | j                  d«      rt        | d   «      |d	<   | j                  d
«      rt        | d
   d«      |d
<   | j                  d«      rt        | d   d«      |d<   | j                  d«      rt        | d   «      |d<   |S )uC   
    å…¨ã‚°ãƒ©ãƒ•ã‚’ç”Ÿæˆ�ã�—ã�¦base64ç”»åƒ�ã�®è¾žæ›¸ã‚’è¿”ã�™
    r:   Údailyr   r�   ÚhourlyÚday_of_week_statsrŸ   r¨   Úresolution_pier³   õ   é »å‡ºã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ TOP10Úunresolved_keywordsu   æœªè§£æ±ºã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ TOP10Úcategory_usage_rankingrÁ   )r_   r~   rŒ   r›   r§   r²   rÀ   rÃ   )rÄ   Úchartss     r7   Úgenerate_all_chartsrÎ   +  s7  € ð €Fð ‡x�x�ÔÜ.¨t°MÑ/BÓCˆˆw‰ð ‡x�x�ÔÜ8¸¸lÑ9KÓLˆˆ|Ñð ‡x�x�ÔÜ0°°nÑ1EÓFˆˆxÑð ‡x�xÐ#Ô$Ü :¸4Ð@SÑ;TÓ Uˆˆ}Ñð ‡x�x�	ÔÜ#@ÀÀiÁÓ#QˆÐÑ ð ‡x�x�
ÔÜ4Ø�ÑÐ;ó=ˆˆzÑð ‡x�xÐ%Ô&Ü(?ØÐ&Ñ'Ð)Ió)KˆÐ$Ñ%ð ‡x�xÐ(Ô)Ü%DØÐ)Ñ*ó&,ˆÐ!Ñ"ð €Mr9   )rÊ   )Ú__doc__Úosr.   Úior   Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotr3   Úmatplotlib.font_managerÚfont_managerÚfmÚnumpyrb   ÚrcParamsÚ_load_fontmanagerrf   Ústrr8   r”   r~   r°   rŒ   r›   r§   r²   rÀ   rÃ   rÎ   © r9   r7   ú<module>rÞ      ss  ðñó 
Û Ý ã Ø €
‡�ˆuÔ å Ý $Û ð  ,˜n€‡�ˆ]Ñ Ú"_€‡�ÐÑ Ø%*€‡�Ð!Ñ "Ø€‡�ˆ[Ñ ð	Ø€B×Ñ¨Õ.ð Ø,ØØ,ØØ+ØØ*ØØ)Ø#Ø*Ø!Ø(Ø#ñ
€ð&	1˜3ó 	1ð& dð &¨só &ðR*¨$ð *°3ó *ðZ¨ð °ó ð@¨$ð °3ó ð<¨4ð °Có ñ6 dð °3ð Ð[^ó ðD°dð ¸só ð<)˜dð ) tô )øðe	Ùús   Á7C& Ã&C*