Ë
    ÐM¦j§p  ã                  ó6  — 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	 d dl
Z
d dlZd dlZd dlZddlmZ d	Zd
dddddœZ ed¬«       G d„ d«      «       Zd#d„Zd$d„Zd%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 d0d „Z!d1d!„Z"d2d"„Z#y)3é    )Úannotations)ÚCounter)Ú	dataclass)Údate)ÚPathNé   )ÚSettingsz0.3.0Úoperating_revenue_ttm_calcÚparent_net_profit_ttm_calcÚdeducted_net_profit_ttm_calcÚoperating_cash_flow_ttm_calcÚcapital_expenditure_ttm_calc)Úoperating_revenue_ytdÚparent_net_profit_ytdÚdeducted_net_profit_ytdÚoperating_cash_flow_ytdÚcapital_expenditure_cash_ytdT)Úfrozenc                  ó6   — e Zd ZU ded<   ded<   ded<   ded<   y)ÚFundamentalBuildResultÚintÚrowsÚscoredÚhard_failedr   Úoutput_pathN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú;C:\FundamentalWorkbench\src\fundamental_mvp\fundamentals.pyr   r      s   … à
ƒIØƒKØÓØÔr!   r   c                ó  — t        j                  |d¬«      j                  dt        j                  «      }t        j                  | d¬«      |z  }|j                  t        j
                  t        j
                   gt        j                  «      S )NÚcoerce©Úerrorsr   )ÚpdÚ
to_numericÚreplaceÚnpÚnanÚinf)Ú	numeratorÚdenominatorÚresults      r"   Ú	_safe_divr0   $   s\   € Ü—-‘- °HÔ=×EÑEÀaÌÏÉÓP€KÜ�]‰]˜9¨XÔ6¸ÑD€FØ�>‰>œ2Ÿ6™6¤B§F¡F 7Ð+¬R¯V©VÓ4Ð4r!   c                ó˜  — t        j                  | d¬«      } t        j                  |d¬«      }| j                  d«      |j                  d«      z  }t        j                  t        j
                  | j                  t        ¬«      }| j                  |   |j                  |   z  j                  d|z  «      dz
  |j                  |<   |dz  S )Nr$   r%   r   )ÚindexÚdtypeg      ð?g      Y@)
r'   r(   ÚgtÚSeriesr*   r+   r2   ÚfloatÚlocÚpow)ÚcurrentÚpreviousÚyearsÚvalidr/   s        r"   Ú_cagrr=   *   sš   € Ü�m‰m˜G¨HÔ5€GÜ�}‰}˜X¨hÔ7€HØ�J‰J�q‹M˜HŸK™K¨›NÑ*€EÜ�Y‰Y”r—v‘v W§]¡]¼%Ô@€FØ Ÿ™ UÑ+¨h¯l©l¸5Ñ.AÑA×FÑFÀsÈUÁ{ÓSÐVYÑY€F‡J�JˆuÑØ�E‰>Ðr!   c                óþ   — t        j                  | |   d¬«      j                  t        j                  t        j                   gt        j
                  «      }|j                  | d   «      j                  d|¬«      }|S )Nr$   r%   Úindustry_l2_codeT)ÚpctÚ	ascending)r'   r(   r)   r*   r,   r+   ÚgroupbyÚrank)ÚframeÚcolumnÚhigher_is_betterÚvaluesÚrankeds        r"   Ú_industry_percentilerI   3   sc   € Ü�]‰]˜5 ™=°Ô:×BÑBÄBÇFÁFÌRÏVÉVÈGÐCTÔVX×V\ÑV\Ó]€FØ�^‰^˜EÐ"4Ñ5Ó6×;Ñ;ÀÐP`Ð;Óa€FØ€Mr!   c                óN  — g }|D ]0  \  }}|j                  t        | ||«      j                  |«      «       Œ2 t        j                  |d¬«      }|j                  «       j                  d¬«      }|j                  dd¬«      |z  }|j                  |j                  d«      «      |fS )Nr   ©ÚaxisT)rL   Úskipnar   )	ÚappendrI   Úrenamer'   ÚconcatÚnotnaÚmeanÚwherer4   )	rD   ÚspecsÚweightÚpiecesrE   rF   ÚmatrixÚcoverageÚscores	            r"   Ú
_componentrZ   9   s–   € Ø€FÛ$)Ñ ˆÐ Ø�‰Ô*¨5°&Ð:JÓK×RÑRÐSYÓZÕ[ð %*ä�Y‰Y�v AÔ&€FØ�|‰|‹~×"Ñ"¨Ð"Ó*€HØ�K‰K˜Q tˆKÓ,¨vÑ5€EØ�;‰;�x—{‘{ 1“~Ó&¨Ð0Ð0r!   c                óp   — | j                   dz  dz  }t        j                  |j                  d¬«      «      S )NÚconfigzfundamental_rules.tomlúutf-8©Úencoding)Úproject_rootÚtomllibÚloadsÚ	read_text)ÚsettingsÚpaths     r"   Ú_load_rulesrf   C   s2   € Ø× Ñ  8Ñ+Ð.FÑF€DÜ�=‰=˜Ÿ™°˜Ó9Ó:Ð:r!   c                óT  — | j                  g d¢«      j                  «       }|j                  ddgd¬«      }|d   j                  j                  |d<   |d   j                  j
                  |d<   |j                  ddgd¬	«      }|d   j                  d
«      }t        j                  «       D ]ç  \  }}t        j                  ||   d¬«      }||   j                  d
«      }|d   j                  d
«      }|j                  |d   d
z
  «      }	|j                  |||z
  «      }
|
j                  ||	z  «      }
|j                  dd«      }|
||<   |j                  dd¬	«      |   j                  dd¬«      j!                  «       j#                  dd¬«      ||<   Œé |j%                  ddg¬«      S )a/  Build rolling-four-quarter values from cumulative statement fields.

    Some TDX convenience TTM fields use mixed units.  The cumulative income and
    cash-flow statement fields have a consistent currency unit, so we first
    recover single-quarter values and then sum four consecutive quarters.
    )Úsource_codeÚreport_periodÚavailable_trade_daterh   ri   Úlast©ÚkeepÚfiscal_yearÚfiscal_quarterF)Úsortr   r$   r%   Ú	_ttm_calcÚ_single_quarter_calcé   )Úmin_periodsr   T)ÚlevelÚdrop©Úcolumns)Úsort_valuesÚcopyÚdrop_duplicatesÚdtÚyearÚquarterrB   ÚshiftÚTTM_SOURCE_FIELDSÚitemsr'   r(   ÚeqrS   r)   ÚrollingÚsumÚreset_indexrv   )Úfinancer/   ÚgroupedÚprevious_quarterÚ
ytd_columnÚ
ttm_columnrG   Úprevious_ytdÚis_q1Úis_consecutiveÚsingle_quarterÚsingle_columns               r"   Ú_add_calculated_ttmr�   H   s²  € ð × Ñ Ò!YÓZ×_Ñ_Óa€FØ×#Ñ# ]°OÐ$DÈ6Ð#ÓR€FØ" ?Ñ3×6Ñ6×;Ñ;€Fˆ=ÑØ% oÑ6×9Ñ9×AÑA€FÐÑØ�n‰n˜m¨]Ð;À%ˆnÓH€GØÐ/Ñ0×6Ñ6°qÓ9Ðä"3×"9Ñ"9Ö";Ñˆ
�JÜ—‘˜v jÑ1¸(ÔCˆØ˜zÑ*×0Ñ0°Ó3ˆØÐ'Ñ(×+Ñ+¨AÓ.ˆØ)×,Ñ,¨VÐ4DÑ-EÈÑ-IÓJˆØŸ™ e¨V°lÑ-BÓCˆØ'×-Ñ-¨e°nÑ.DÓEˆØ"×*Ñ*¨;Ð8NÓOˆØ .ˆˆ}Ñà�N‰N˜=¨uˆNÓ5°mÑDß‰W�Q AˆWÓ&ß‰S‹Uß‰[˜q tˆ[Ó,ð	 	ˆzÒð #<ð  �;‰; Ð/?Ð@ˆ;ÓAÐAr!   c                ó’  — | j                   | d   j                  |«         j                  «       }|j                  g d¢«      }|j	                  dd¬«      j                  «       }|ddg   j                  «       }|d   t        j                  d¬«      z
  |d<   |ddg   j                  «       }|d   t        j                  d	¬«      z
  |d<   g d
¢}||   j	                  ddgd¬«      }|j                  |ddgd¬«      }|j                  |ddgd¬«      }	|j                  d¬«      |j                  d¬«      |	j                  d¬«      fS )Nrj   )rh   rj   ri   rh   rk   rl   ri   r   )r;   é   )rh   ri   Úaccounts_receivableÚ	inventoryÚtotal_assetsÚparent_equityr   r   r
   r   r   r   r   Úleft©ÚonÚhowT©rv   )	r7   Úlerz   ry   r{   r'   Ú
DateOffsetÚmerger…   )
r†   Ú	asof_dateÚusabler9   Úone_yearÚ
three_yearÚlookup_columnsÚhistoryÚprevious_1yÚprevious_3ys
             r"   Ú_select_asof_financer§   i   s]  € Ø�[‰[˜Ð!7Ñ8×;Ñ;¸IÓFÑG×LÑLÓN€FØ×ÑÒ XÓY€FØ×$Ñ$ ]¸Ð$Ó@×EÑEÓG€Gà˜ Ð7Ñ8×=Ñ=Ó?€HØ (¨Ñ 9¼B¿M¹MÐPQÔ<RÑ R€Hˆ_ÑØ˜-¨Ð9Ñ:×?Ñ?ÓA€JØ",¨_Ñ"=ÄÇÁÐTUÔ@VÑ"V€JˆÑò€Nð �^Ñ$×4Ñ4°mÀ_Ð5UÐ\bÐ4Óc€GØ—.‘. ¨m¸_Ð-MÐSY�.ÓZ€KØ×"Ñ" 7°¸Ð/OÐU[Ð"Ó\€KØ×Ñ DÐÓ)¨;×+BÑ+BÈÐ+BÓ+MÈ{×OfÑOfÐlpÐOfÓOqÐqÐqr!   c                ó¬  — | j                  «       j                  d¬«      }|j                  d¬«      }|j                  d¬«      }|d   |d   z   }t        |d   |d   «      dz  |d<   t        |d	   |d
   «      |d<   t        |d	   |d   z
  |d
   «      |d<   t        |d   |«      |d<   t        |d   |d   «      |d<   t        |d   |d   «      |d<   t        |d   |d   «      dz  |d<   t        |d   |d   «      dz  |d<   t        |d   |d   «      dz  |d<   t        |d   |d   «      dz  |d<   t        |d   |d   «      dz
  dz  |d<   t        |d   |d   «      dz
  dz  |d <   t        |d   |d   «      dz
  dz  |d!<   t        |d   |d   «      dz  |d"<   t        |d#   |d   «      |d$<   t        |d%   |d   «      j                  «       |d&<   |d   |d'<   t        |d   |d   «      dz
  dz  |d(<   t	        |d   |d   d)«      |d*<   t	        |d   |d   d)«      |d+<   |d,   |d-   z  |d.<   t        |d.   |d   «      j                  |d   j                  d/«      «      |d0<   t        |d.   |d   «      j                  |d   j                  d/«      «      |d1<   t        |d.   |d   «      j                  |d   j                  d/«      «      |d2<   |S )3NTr›   Úshort_term_borrowingsÚnoncurrent_liabilities_due_1yÚtotal_liabilitiesr•   éd   Ú
debt_ratioÚcurrent_assetsÚcurrent_liabilitiesÚcurrent_ratior”   Úquick_ratioÚmoney_fundsÚcash_short_debt_ratioÚgoodwillr–   Úgoodwill_equity_ratior   r   Úcfo_to_parent_profitr
   Ú
cfo_marginÚ
net_marginÚ	roa_proxyÚ research_development_expense_ytdr   Úresearch_development_ratior“   r   Úreceivables_yoyÚinventory_yoyÚparent_equity_yoyÚequity_assets_ratior   Údeducted_profit_ratioÚimpairment_loss_ytdÚimpairment_revenue_ratioÚ!parent_net_profit_ttm_previous_1yÚcfo_ttm_yoyr’   Úrevenue_cagr_3yÚparent_profit_cagr_3yÚlatest_closeÚtotal_sharesÚ
market_capr   Úpe_ttmÚpbÚps_ttm)rz   r…   r0   Úabsr=   rS   r4   )rD   r¥   r¦   r/   Úp1Úp3Ú
short_debts          r"   Ú_add_metricsrÑ   ~   s  € Ø�Z‰Z‹\×%Ñ%¨4Ð%Ó0€FØ	×	 Ñ	  dÐ	 Ó	+€BØ	×	 Ñ	  dÐ	 Ó	+€BØÐ/Ñ0°6Ð:YÑ3ZÑZ€JÜ$ VÐ,?Ñ%@À&ÈÑBXÓYÐ\_Ñ_€Fˆ<ÑÜ'¨Ð/?Ñ(@À&ÐI^ÑB_Ó`€Fˆ?ÑÜ% fÐ-=Ñ&>ÀÈÑATÑ&TÐV\Ð]rÑVsÓt€Fˆ=ÑÜ&/°°}Ñ0EÀzÓ&R€FÐ"Ñ#Ü&/°°zÑ0BÀFÈ?ÑD[Ó&\€FÐ"Ñ#Ü%.¨vÐ6TÑ/UÐW]Ð^zÑW{Ó%|€FÐ!Ñ"Ü$ VÐ,JÑ%KÈVÐTpÑMqÓrÐuxÑx€Fˆ<ÑÜ$ VÐ,HÑ%IÈ6ÐRnÑKoÓpÐsvÑv€Fˆ<ÑÜ# FÐ+GÑ$HÈ&ÐQ_ÑJ`ÓaÐdgÑg€Fˆ;ÑÜ+4ØÐ1Ñ2°FÐ;RÑ4Só,àñ,€FÐ'Ñ(ô "+¨6Ð2GÑ+HÈ"ÐMbÑJcÓ!dÐghÑ!hÐloÑ o€FÐÑÜ(¨°Ñ)<¸bÀ¹oÓNÐQRÑRÐVYÑY€Fˆ?ÑÜ#,¨V°OÑ-DÀbÈÑFYÓ#ZÐ]^Ñ#^ÐbeÑ"e€FÐÑÜ$-¨f°_Ñ.EÀvÈnÑG]Ó$^ÐadÑ$d€FÐ Ñ!Ü&/°Ð7UÑ0VÐX^Ð_{ÑX|Ó&}€FÐ"Ñ#Ü)2°6Ð:OÑ3PÐRXÐYpÑRqÓ)r×)vÑ)vÓ)x€FÐ%Ñ&Ø24Ð5QÑ2R€FÐ.Ñ/Ü& vÐ.LÑ'MÈrÐRpÑOqÓrÐuvÑvÐz}Ñ}€Fˆ=ÑÜ % fÐ-IÑ&JÈBÐOkÑLlÐnoÓ p€FÐÑÜ&+¨FÐ3OÑ,PÐRTÐUqÑRrÐtuÓ&v€FÐ"Ñ#Ø! .Ñ1°F¸>Ñ4JÑJ€Fˆ<ÑÜ  ¨Ñ!5°vÐ>ZÑ7[Ó\×bÑbÐcið  kGñ  dH÷  dKñ  dKð  LMó  dNó  O€Fˆ8ÑÜ˜V LÑ1°6¸/Ñ3JÓK×QÑQÐRXÐYhÑRi×RlÑRlÐmnÓRoÓp€Fˆ4�LÜ  ¨Ñ!5°vÐ>ZÑ7[Ó\×bÑbÐcið  kGñ  dH÷  dKñ  dKð  LMó  dNó  O€Fˆ8ÑØ€Mr!   c                óL  ‡ ‡— g Šd4ˆ ˆfd„}‰ d    } |‰ d   j                  d«      dddd«        |‰ d   j                  d«      d	dd
d«        ||‰ d   j                  |d   «      z  dddd«        ||‰ d   j                  |d   «      z  dddd«        ||‰ d   j                  |d   «      z  ‰ d   j                  d«      z  dddd«        ||‰ d   j                  |d   «      z  ‰ d   j                  d«      z  dddd«        ||‰ d   j                  d«      z  ‰ d   j                  |d   «      z  d dd!d«        ||‰ d"   j	                  ‰ d#   «      j                  |d$   «      z  d%dd&d"«        ||‰ d'   j	                  ‰ d#   «      j                  |d(   «      z  d)dd*d'«        ||‰ d   j                  |d+   |d   d,¬-«      z  d.dd/d«        ||‰ d   j                  d«      z  ‰ d#   j                  d«      z  d0dd1d«       t        j                  ‰g d2¢¬3«      S )5Nc                óä   •— ‰j                   | j                  d«      dd|gf   j                  d¬«      D ]9  }‰j                  |j                  |j
                  |||t        ||«      |dœ«       Œ; y )NFÚsecurity_idrh   ©r2   ©rÔ   rh   Ú	rule_codeÚseverityÚdescriptionÚmetric_valueÚmetric_name©r7   ÚfillnaÚ
itertuplesrN   rÔ   rh   Úgetattr)ÚmaskÚcoderØ   rÙ   Úvalue_columnÚrowrD   r   s         €€r"   Úaddz_risk_flags.<locals>.add£   sq   ø€ Ø—9‘9˜TŸ[™[¨Ó/°-ÀÐP\Ð1]Ð]Ñ^×iÑiÐpuÐiÖvˆCØ�K‰KØ"Ÿ™Ø"Ÿ™Ø!Ø$Ø*Ü '¨¨\Ó :Ø+ñõ ñ wr!   Úis_financial_sectorr–   r   ÚNEGATIVE_EQUITYÚhardu   å½’æ¯�å‡€èµ„äº§ä¸�ä¸ºæ­£r•   ÚINVALID_TOTAL_ASSETSu   æ€»èµ„äº§ä¸�ä¸ºæ­£r­   Údebt_ratio_hardÚDEBT_RATIO_GE_100u"   èµ„äº§è´Ÿå€ºçŽ‡è¾¾åˆ°æˆ–è¶…è¿‡100%rµ   Úgoodwill_equity_hardÚGOODWILL_EQUITY_EXTREMEu   å•†èª‰è¶…è¿‡å½’æ¯�å‡€èµ„äº§80%r°   Úcurrent_ratio_warningr   ÚLIQUIDITY_AND_CFO_WEAKÚwarningu3   æµ�åŠ¨æ¯”çŽ‡å��ä½Žä¸”è¿‘ä¸€å¹´ç»�è�¥çŽ°é‡‘æµ�ä¸ºè´Ÿr³   Úcash_short_debt_warningÚCASH_SHORT_DEBT_WEAKu6   è´§å¸�èµ„é‡‘è¦†ç›–çŸ­å€ºä¸�è¶³ä¸”ç»�è�¥çŽ°é‡‘æµ�ä¸ºè´Ÿr   r¶   Úcash_profit_warningÚCASH_PROFIT_MISMATCHu*   ç»�è�¥çŽ°é‡‘æµ�ä¸Žå½’æ¯�åˆ©æ¶¦åŒ¹é…�å��å¼±r¼   Úoperating_revenue_yoy_reportedÚ!receivable_growth_gap_warning_pctÚRECEIVABLES_GROWTH_GAPu*   åº”æ”¶è´¦æ¬¾å¢žé€Ÿæ˜Žæ˜¾é«˜äºŽè�¥æ”¶å¢žé€Ÿr½   Ú inventory_growth_gap_warning_pctÚINVENTORY_GROWTH_GAPu$   å­˜è´§å¢žé€Ÿæ˜Žæ˜¾é«˜äºŽè�¥æ”¶å¢žé€ŸÚgoodwill_equity_warningr—   )Ú	inclusiveÚGOODWILL_EQUITY_HIGHu$   å•†èª‰å� å½’æ¯�å‡€èµ„äº§æ¯”ä¾‹è¾ƒé«˜ÚLOSS_AND_REVENUE_DECLINEu$   è¿‘ä¸€å¹´äº�æ�Ÿä¸”è�¥æ”¶å�Œæ¯”ä¸‹é™�rÖ   rw   )rà   ú	pd.Seriesrá   ÚstrrØ   rþ   rÙ   rþ   râ   rþ   ÚreturnÚNone)rœ   ÚgeÚltr4   ÚsubÚbetweenr'   Ú	DataFrame)rD   Úrulesrä   Únon_financialr   s   `   @r"   Ú_risk_flagsr      s*  ù€ Ø$&€Dö
ð Ð0Ñ1Ð1€MÙˆˆoÑ×!Ñ! !Ó$Ð&7¸ÐA[Ð]lÔmÙˆˆnÑ× Ñ  Ó#Ð%;¸VÐEYÐ[iÔjÙˆ˜˜lÑ+×.Ñ.¨uÐ5FÑ/GÓHÑHÐJ]Ð_eð  hLð  NZô  [Ùˆ˜Ð5Ñ6×9Ñ9¸%Ð@VÑ:WÓXÑXÐZsÐu{ð  ~^ð  `wô  xÙˆ˜˜oÑ.×1Ñ1°%Ð8OÑ2PÓQÑQÐTYÐZxÑTy×T|ÑT|Ð}~ÓTÑØ  )Ð-bÐdsôuáˆ˜Ð5Ñ6×9Ñ9¸%Ð@YÑ:ZÓ[Ñ[Ð^cð  eCñ  _D÷  _Gñ  _Gð  HIó  _Jñ  	JØ 	Ð+cÐe|ô~áˆ˜Ð:Ñ;×>Ñ>¸qÓAÑAÀEÐJ`ÑDa×DdÑDdÐejð  lAñ  fBó  ECñ  	CØ 	Ð+WÐYoôqáˆ˜Ð/Ñ0×4Ñ4°UÐ;[Ñ5\Ó]×`Ñ`Ðafð  hKñ  bLó  Mñ  	MØ  )Ð-YÐ[lônáˆ˜˜oÑ.×2Ñ2°5Ð9YÑ3ZÓ[×^Ñ^Ð_dð  fHñ  `Ió  Jñ  	JØ 	Ð+QÐSbôdáˆ˜Ð5Ñ6×>Ñ>¸uÐE^Ñ?_ÐafÐg}Ña~ð  KQÐ>ó  Rñ  	RØ 	Ð+QÐSjôláˆ˜Ð:Ñ;×>Ñ>¸qÓAÑAÀEÐJjÑDk×DnÑDnÐopÓDqÑqØ" IÐ/UÐWsôuä�<‰<˜ò  'Lô  Mð  Mr!   c                óÎ  ‡ ‡— g Š‰ d   }dˆ ˆfd„} ||‰ d   j                  d«      z  ddd«        ||‰ d   j                  |d   «      z  d	d
d«        ||‰ d   j                  |d   «      z  ddd«        ||‰ d   j                  d«      z  ‰ d   j                  |d   «      z  ddd«       t        j                  |t        j                  ‰|j
                  ¬«      gd¬«      S )Nrå   c                óä   •— ‰j                   | j                  d«      dd|gf   j                  d¬«      D ]9  }‰j                  |j                  |j
                  |d|t        ||«      |dœ«       Œ; y )NFrÔ   rh   rÕ   rï   rÖ   rÜ   )rà   rá   rÙ   râ   rã   rD   r   s        €€r"   rä   z&_add_financial_risk_flags.<locals>.addÊ   sm   ø€ Ø—9‘9˜TŸ[™[¨Ó/°-ÀÐP\Ð1]Ð]Ñ^×iÑiÐpuÐiÖvˆCØ�K‰KØ"Ÿ™¸s¿¹Ø!¨yÈÜ '¨¨\Ó :È<ñõ ñ wr!   r   r   ÚFINANCIAL_TTM_LOSSu-   é‡‘èž�ä¼�ä¸šè¿‘å››å­£åº¦å½’æ¯�å‡€åˆ©æ¶¦äº�æ�Ÿr¾   Úequity_decline_warning_pctÚFINANCIAL_EQUITY_DECLINEu$   å½’æ¯�å‡€èµ„äº§å�Œæ¯”ä¸‹é™�è¶…è¿‡20%rÂ   Úimpairment_revenue_warningÚFINANCIAL_IMPAIRMENT_HIGHu!   å‡�å€¼æ�Ÿå¤±å� è�¥æ”¶æ¯”ä¾‹è¾ƒé«˜rÀ   Údeducted_profit_ratio_warningÚFINANCIAL_DEDUCTED_PROFIT_WEAKu0   æ‰£é�žå‡€åˆ©æ¶¦å¯¹å½’æ¯�å‡€åˆ©æ¶¦çš„è¦†ç›–å��ä½Žrw   T)Úignore_index)
rà   rý   rá   rþ   rÙ   rþ   râ   rþ   rÿ   r   )r  r4   r'   rP   r  rx   )rD   Úflagsr  Ú	financialrä   r   s   `    @r"   Ú_add_financial_risk_flagsr  Å   s  ù€ à$&€DØÐ+Ñ,€Iöñ ˆ	�EÐ6Ñ7×:Ñ:¸1Ó=Ñ=ØÐMÐOkômáˆ	�EÐ-Ñ.×1Ñ1°%Ð8TÑ2UÓVÑVØ"Ð$JÐL_ôaáˆ	�EÐ4Ñ5×8Ñ8¸Ð?[Ñ9\Ó]Ñ]Ø#Ð%HÐJdôfáˆ	�EÐ6Ñ7×:Ñ:¸1Ó=Ñ=Ø
Ð'Ñ
(×
+Ñ
+¨EÐ2QÑ,RÓ
Sñ	Tà(Ð*\Ð^uôwô �9‰9�eœRŸ\™\¨$¸¿¹ÔFÐGÐVZÔ[Ð[r!   c                óJ  — |j                   dz  }|j                   dz  }g }|j                  «       �rht        j                  |«      }|j                  �sFt        j
                  |d   d¬«      |d<   t        j                  j                  «       j                  «       t        j                  d¬«      z
  }|j                  |d   j                  |«         j                  «       }|j                  d«      j                  dd	gd
¬«      }| j                  d«      d   }	|d	   j!                  d«      }
|j                  |
 |d   j#                  |	«      j%                  d«      z     j                  «       }t&        j(                  |d<   d|d<   |j+                  |«       |j                  «       rÜt        j,                  |«      }| ddg   j/                  |ddg   dd¬«      }g }|j1                  d¬«      D ]l  }|j2                  |d   k\  rd\  }}}n|j2                  |d   k\  rd\  }}}nŒ6|j+                  |j4                  |j6                  ||||j2                  ddœ«       Œn |r$|j+                  t        j8                  |«      «       |s|S t        j:                  |g|¢dd¬«      S )Nz"external_governance_risk_flags.csvzexternal_pledge_latest.parquetÚ
event_dater$   r%   im  )Údaysrh   r×   rk   rl   Úis_st_currentÚDELISTING_RISKFrÚ   Úannouncement_title_matchrÛ   rÔ   Úpledge_ratio_pctÚinnerr˜   rÕ   Úpledge_ratio_hard_pct)rç   ÚPLEDGE_RATIO_EXTREMEu$   è‚¡æ�ƒè´¨æŠ¼æ¯”ä¾‹è¾¾åˆ°70%æˆ–ä»¥ä¸ŠÚpledge_ratio_warning_pct)rï   ÚPLEDGE_RATIO_HIGHu$   è‚¡æ�ƒè´¨æŠ¼æ¯”ä¾‹è¾¾åˆ°50%æˆ–ä»¥ä¸ŠrÖ   T)r  rp   )Úprocessed_dirÚexistsr'   Úread_csvÚemptyÚto_datetimeÚ	TimestampÚtodayÚ	normalizeÚ	Timedeltar7   r  rz   ry   r{   Ú	set_indexr‚   ÚmaprÝ   r*   r+   rN   Úread_parquetrž   rÞ   r  rÔ   rh   r  rP   )rD   r  rd   r  Úexternal_pathÚpledge_pathÚ	additionsÚexternalÚcutoffÚ
current_stÚ	delistingÚpledger   rã   rØ   rá   rÙ   s                    r"   Ú_add_external_risk_flagsr6  Þ   s‰  € à×*Ñ*Ð-QÑQ€MØ×(Ñ(Ð+KÑK€KØ$&€IØ×ÑÕÜ—;‘;˜}Ó-ˆØ�~‹~Ü%'§^¡^°H¸\Ñ4JÐS[Ô%\ˆH�\Ñ"Ü—\‘\×'Ñ'Ó)×3Ñ3Ó5¼¿¹È#Ô8NÑNˆFØ—|‘| H¨\Ñ$:×$=Ñ$=¸fÓ$EÑF×KÑKÓMˆHØ×+Ñ+¨LÓ9×IÑIØ Ð,°6ð Jó ˆHð Ÿ™¨Ó7¸ÑHˆJØ  Ñ-×0Ñ0Ð1AÓBˆIØ—|‘| Y J°¸-Ñ1H×1LÑ1LÈZÓ1X×1_Ñ1_Ð`eÓ1fÑ$fÑg×lÑlÓnˆHÜ')§v¡vˆH�^Ñ$Ø&@ˆH�]Ñ#Ø×Ñ˜XÔ&Ø×ÑÔÜ—‘ Ó-ˆØ˜ }Ð5Ñ6×<Ñ<Ø�MÐ#5Ð6Ñ7¸MÈwð =ó 
ˆð )+ˆØ×$Ñ$¨5Ð$Ö1ˆCØ×#Ñ# uÐ-DÑ'EÒEØ.tÑ+�˜$¡Ø×%Ñ%¨Ð/IÑ)JÒJØ.tÑ+�˜$¡àØ�K‰KØ"Ÿ™¸s¿¹Ð]aØ$°[ÐRU×RfÑRfØ1ñõ ð 2ñ Ø×ÑœRŸ\™\¨$Ó/Ô0ÙØˆÜ�9‰9�eÐ(˜iÐ(°tÀ%ÔHÐHr!   c           	     ó¢  — | j                  «       }g d¢g d¢g d¢g d¢g d¢g d¢g d¢dœ}g }g }|j                  «       D ]W  \  }}t        ||t        ||   «      «      \  }	}
|› d	�}|› d
�}|	||<   |
||<   |j	                  |«       |j	                  |«       ŒY ||   j                  d¬«      |d<   ||   j                  dt        |«      ¬«      |d<   |j                  |d   j                  d«         j                  d«      j                  «       }|j                  |d   j                  d«         j                  d«      j                  «       }|d   j                  |«      j                  d«      j                  t        «      |d<   |d   j                  |«      j                  d«      j                  t        «      |d<   t!        j"                  |d   dz  d«      |d<   |d   |d   z
  |d<   t         j$                  |j                  |d   j'                  d«      df<   t         j$                  |j                  |d   ddgf<   t!        j(                  |d   j'                  d«      |d   j+                  d«      |d   j                  d«      gg d¢d¬«      |d <   d!|j                  |d   d f<   t-        j.                  |d   t         j0                   d"d#d$d%t         j0                  gg d&¢d'¬(«      j                  d)«      |d*<   |d    |d   j                  d«      z  |d   j+                  d+«      z  |d   j+                  d#«      z  |d,<   t2        |d-<   |S ).N)©Úweighted_roe_reportedT)r¸   T©Úgross_margin_reportedT)r¹   T)©rô   T)Únet_profit_yoy_reportedT)rÅ   T)rÆ   T))r¶   T)r·   T)rÄ   T))r­   F)r°   T)r±   T)r³   T))Úasset_turnover_reportedT)Úreceivables_turnover_reportedT)Úinventory_turnover_reportedT)r8  r<  r:  )©rÊ   F©rË   F)rÌ   F)ÚprofitabilityÚgrowthÚcashflowÚbalance_sheetÚ
efficiencyÚindustry_relativeÚ	valuationÚ_scoreÚ	_coverager   rK   Úscore_coverage©rL   Ú	min_countÚraw_total_scorerØ   rç   rh   rï   r   Úhard_risk_countÚwarning_countr’   é   Úrisk_penaltyÚtotal_scorerå   é   ©ÚEXCLUDEDÚ	HIGH_RISKÚ	ATTENTIONÚNORMAL©ÚdefaultÚfinancial_health_statusÚSPECIAL_MODEL_PENDINGé2   éA   éK   éU   ©u   å¼±u   ä¸€èˆ¬u   è¾ƒå¥½u   ä¼˜ç§€u   çª�å‡ºF©ÚlabelsÚrightÚstringÚfundamental_gradeç333333ã?Úfundamental_eligibleÚmodel_version)rz   r�   rZ   r6   rN   rR   r„   Úlenr7   r‚   rB   Úsizer,  rÝ   Úastyper   r*   Úminimumr+   r4   Úselectr  r'   Úcutr,   ÚFUNDAMENTAL_MODEL_VERSION)rD   Úweightsr  r/   rT   Úscore_columnsÚcoverage_columnsÚnameÚmetricsrY   rX   Ú	score_colÚcoverage_colrç   rï   s                  r"   rJ  rJ    sƒ  € Ø�Z‰Z‹\€Fò Gò \Úaò Bò Jò JÚJñ€Eð €MØÐØŸ™ž‰ˆˆgÜ$ V¨W´e¸GÀD¹MÓ6JÓK‰ˆˆxØ�f˜F�Oˆ	Ø˜˜yÐ)ˆØ!ˆˆyÑØ'ˆˆ|ÑØ×Ñ˜YÔ'Ø×Ñ Õ-ð 'ð  &Ð&6Ñ7×<Ñ<À!Ð<ÓD€FÐÑØ & }Ñ 5× 9Ñ 9¸qÌCÐP]ÓL^Ð 9Ó _€FÐÑà�9‰9�U˜:Ñ&×)Ñ)¨&Ó1Ñ2×:Ñ:¸=ÓI×NÑNÓP€DØ�i‰i˜˜jÑ)×,Ñ,¨YÓ7Ñ8×@Ñ@ÀÓO×TÑTÓV€GØ & }Ñ 5× 9Ñ 9¸$Ó ?× FÑ FÀqÓ I× PÑ PÔQTÓ U€FÐÑØ$ ]Ñ3×7Ñ7¸Ó@×GÑGÈÓJ×QÑQÔRUÓV€Fˆ?ÑÜŸZ™Z¨¨Ñ(?À!Ñ(CÀRÓH€Fˆ>ÑØ"Ð#4Ñ5¸¸~Ñ8NÑN€Fˆ=ÑÜACÇÁ€F‡J�JˆvÐ'Ñ(×+Ñ+¨AÓ.°Ð=Ñ>ÜTV×TZÑTZ€F‡J�JˆvÐ+Ñ,Ð/@À-Ð.PÐPÑQÜ(*¯	©	Ø	Ð!Ñ	"×	%Ñ	% aÓ	(¨&°Ñ*A×*DÑ*DÀQÓ*GÈÐP_ÑI`×IcÑIcÐdeÓIfÐgÚ.Øô)€FÐ$Ñ%ð
 Lc€F‡J�JˆvÐ+Ñ,Ð.GÐGÑHÜ"$§&¡&Øˆ}Ñ¤§¡ ¨¨R°°R¼¿¹Ð@Ú>Àeô#÷ �fˆXÓð ÐÑð
 
Ð%Ñ	&Ð&Ø
Ð"Ñ
#×
&Ñ
& qÓ
)ñ	*à
Ð!Ñ
"×
%Ñ
% cÓ
*ñ	+ð �Ñ
×
"Ñ
" 2Ó
&ñ	'ð Ð!Ñ"ô 8€Fˆ?ÑØ€Mr!   c           	     ó~	  — | d   }g d¢dt        |d   «      fg d¢dt        |d   «      fg d¢dt        |d   «      fd	œ}g }g }|j                  «       D ]a  \  }\  }}	}
t        | |D �cg c]  }||	f‘Œ c}|
«      \  }}|| |› d
�<   || |› d�<   |j                  |› d
�«       |j                  |› d�«       Œc t        | ddgt        |d   «      «      \  }}t        | ddgt        |d   «      «      \  }}|| d<   || d<   || d<   || d<   |j	                  ddg«       |j	                  ddg«       |j
                  |d   j                  d«         j                  d«      j                  «       }|j
                  |d   j                  d«         j                  d«      j                  «       }| j
                  |df   j                  |«      j                  d«      j                  t        «      | j
                  |df<   | j
                  |df   j                  |«      j                  d«      j                  t        «      | j
                  |df<   t        j                  | j
                  |df   dz  d«      | j
                  |df<   | |   j                  d ¬!«      }| |   j!                  d t#        |«      ¬"«      }|j
                  |   | j
                  |d#f<   |j
                  |   | j
                  |d$f<   |j
                  |   | j
                  |df   z
  | j
                  |d%f<   t        j$                  | j
                  || d   j'                  d«      z  d%f<   t        j(                  | j
                  |df   j'                  d«      | j
                  |df   j+                  d&«      | j
                  |df   j                  d «      gg d'¢d(¬)«      | j
                  |d*f<   t-        j.                  | j
                  |d%f   t        j0                   d+d,d-d.t        j0                  gg d/¢d0¬1«      j                  d2«      | j
                  |d3f<   | j
                  |df   j                  d«      | j
                  |d#f   j+                  d4«      z  | j
                  |d%f   j+                  d,«      z  | j
                  |d5f<   | S c c}w )6Nrå   )r9  r¹   r¸   Úfinancial_core_marginTrC  )rô   r=  rÅ   rÆ   rD  )r¿   r¾   Úfinancial_solvencyÚfinancial_bufferÚcapital_strength)Úfinancial_profitabilityÚfinancial_growthÚfinancial_capital_strengthrJ  rK  )rÀ   T)rÂ   FÚearnings_qualityrA  rB  rI  Ú financial_earnings_quality_scoreÚ#financial_earnings_quality_coverageÚfinancial_valuation_scoreÚfinancial_valuation_coveragerØ   rç   rh   rï   r   rP  rQ  r’   rR  rS  r   rK   rM  rL  rO  rT  rU  rV  rZ  r[  r]  r_  r`  ra  rb  rc  Frd  rg  rh  ri  rj  )r6   r�   rZ   rN   Úextendr7   r‚   rB   rm  r,  rÝ   rn  r   r*   ro  rR   r„   rl  r+   r4   rp  r  r'   rq  r,   )r/   rs  r  r  rT   Úcoverage_partsÚscore_partsrv  rx   Ú	directionrU   rE   rY   rX   Úquality_scoreÚquality_coverageÚvaluation_scoreÚvaluation_coveragerç   rï   Úfinancial_coverageÚfinancial_raws                         r"   Ú_score_financial_sectorsr‘  ?  sh  € ØÐ,Ñ-€Iâ$qÐswÔy~ð  @Gð  HWñ  @Xó  zYð  $Zò Gð  IMô  OTð  U\ð  ]eñ  Ufó  Ogð  hÚ'}ð  @Dô  FKð  LSð  Tfñ  Lgó  Fhð  'iñ€Eð
 €NØ€KØ.3¯k©k®mÑ*ˆÑ*ˆw˜	 6Ü$ VÑPWÓ-XÑPWÀf¨v°yÒ.AÐPWÑ-XÐZ`Óa‰ˆˆxØ"'ˆ�$��vˆÑØ%-ˆ�$��yÐ!Ñ"Ø×Ñ˜d˜V 6˜?Ô+Ø×Ñ   iÐ0Õ1ð /<ô '1ØÐ0Ð2UÐVÜˆgÐ(Ñ)Ó*ó'Ñ#€MÐ#ô +5ØÐ" MÐ2´E¸'À+Ñ:NÓ4Oó+Ñ'€OÐ'ð 2?€FÐ-Ñ.Ø4D€FÐ0Ñ1Ø*9€FÐ&Ñ'Ø-?€FÐ)Ñ*Ø×ÑÐ:Ð<WÐXÔYØ×ÑÐ@ÐB`ÐaÔbà�9‰9�U˜:Ñ&×)Ñ)¨&Ó1Ñ2×:Ñ:¸=ÓI×NÑNÓP€DØ�i‰i˜˜jÑ)×,Ñ,¨YÓ7Ñ8×@Ñ@ÀÓO×TÑTÓV€GØ/5¯z©z¸)À]Ð:RÑ/S×/WÑ/WÐX\Ó/]×/dÑ/dÐefÓ/g×/nÑ/nÔorÓ/s€F‡J�JˆyÐ+Ð+Ñ,Ø-3¯Z©Z¸	À=Ð8PÑ-Q×-UÑ-UÐV]Ó-^×-eÑ-eÐfgÓ-h×-oÑ-oÔpsÓ-t€F‡J�Jˆy˜/Ð)Ñ*Ü,.¯J©J°v·z±zÀ)È_ÐB\Ñ7]Ð`aÑ7aÐceÓ,f€F‡J�Jˆy˜.Ð(Ñ)Ø Ñ/×4Ñ4¸!Ð4Ó<ÐØ˜;Ñ'×+Ñ+°¼cÀ+Ó>NÐ+ÓO€MØ.@×.DÑ.DÀYÑ.O€F‡J�JˆyÐ*Ð*Ñ+Ø/<×/@Ñ/@ÀÑ/K€F‡J�JˆyÐ+Ð+Ñ,Ø+8×+<Ñ+<¸YÑ+GÈ&Ï*É*ÐU^Ð`nÐUnÑJoÑ+o€F‡J�Jˆy˜-Ð'Ñ(ÜMOÏVÉV€F‡J�Jˆy˜6Ð"3Ñ4×7Ñ7¸Ó:Ñ:¸MÐIÑJÜ79·y±yØ	�‰�IÐ0Ð0Ñ	1×	4Ñ	4°QÓ	7¸¿¹ÀIÈÐD^Ñ9_×9bÑ9bÐcdÓ9eÐgm×gqÑgqÐr{ð  ~Mð  sMñ  hN÷  hQñ  hQð  RSó  hTð  	UÚ.¸ô8€F‡J�JˆyÐ3Ð3Ñ4ô 24·±Ø�
‰
�9˜mÐ+Ñ,´·±¨w¸¸BÀÀBÌÏÉÐ.OÚ>Àeô2÷ �fˆXÓð ‡J�JˆyÐ-Ð-Ñ.ð
 	�
‰
�9Ð/Ð/Ñ0×3Ñ3°AÓ6Ø
�*‰*�YÐ 0Ð0Ñ
1×
4Ñ
4°SÓ
9ñ	:à
�*‰*�Y Ð-Ñ
.×
1Ñ
1°"Ó
5ñ	6ð ‡J�JˆyÐ0Ð0Ñ1ð
 €MùòW .Ys   Á'R:c           	     ó`  — t        | «      }t        j                  | j                  dz  «      }t	        t        j                  | j
                  «      «      }t        j                  |d   j                  «       «      }t        ||«      \  }}}g d¢}||   j                  |dd¬«      }	| j                  dz  }
|
j                  «       r<t        j                  |
«      j                  g d¢d	¬
«      }|	j                  |dd¬«      }	dD ]  }||	vsŒt        j                  |	|<   Œ |dg   j                  «       }|j                  |j                  d¬«      dd¬«      }|j                  |j                  d¬«      dd¬«      }|	dg   j                  |dd¬«      }|	dg   j                  |dd¬«      }|	d   j                  ddg«      |	d<   t!        |	||«      }t#        ||d   «      }t%        |||d   «      }t'        ||| |d   «      }t)        ||d   |«      }t+        ||d   |«      }| j                  dz  }| j                  dz  }| j                  dz  }g d¢}||   j-                  |d¬«       |j-                  |d¬«       |j/                  | j                  dz  dd¬ «       |j/                  |dd¬ «       | j0                  d!z  }t3        j4                  t7        |«      «      5 }|j9                  d"|«       |j9                  d#|«       |j;                  d$«       |j;                  d%«       d d d «       t=        | |||«       t?        tA        |«      tC        |d&   jE                  «       jG                  «       «      tC        |d'   jI                  d(«      jG                  «       «      |«      S # 1 sw Y   ŒxY w))Nzsecurity_master.parquetÚ	last_date)
rÔ   rh   rv  rÇ   Úindustry_l1_codeÚindustry_l1_namer?   Úindustry_l2_nameÚbasic_pool_eligibler  rh   r  r˜   z financial_sector_metrics.parquet)Úsecucoder?   r–  ri   Únotice_dateÚignore)rx   r&   r—   )r{  r|  r}  ri   rw   r”  ÚX50ÚX51rå   ÚriskÚfinancial_riskÚgovernance_riskrs  Úfinancial_weightszfundamental_metrics.parquetzfundamental_scores.parquetzfundamental_risk_flags.csv)!rÔ   rh   ri   Úannouncement_daterj   r­   r°   r±   r³   rµ   r¶   r·   r¸   r¹   r»   r¼   r½   rÄ   rÅ   rÆ   r¾   r¿   rÀ   rÂ   r
   r   r   r   r   rÉ   rÊ   rË   rÌ   FrÕ   zfundamental_scores.csvz	utf-8-sig)r2   r_   zfundamental_mvp.duckdbÚ	scores_dfÚflags_dfzECREATE OR REPLACE TABLE fundamental_scores AS SELECT * FROM scores_dfzHCREATE OR REPLACE TABLE fundamental_risk_flags AS SELECT * FROM flags_dfrT  rP  r   )%rf   r'   r-  r"  r�   Úfinancial_pit_pathr'  Úmaxr§   rž   r#  rv   r*   r+   rz   ÚisinrÑ   r  r  r6  rJ  r‘  Ú
to_parquetÚto_csvÚdatabase_dirÚduckdbÚconnectrþ   ÚregisterÚexecuteÚ_write_reportr   rl  r   rQ   r„   r4   )rd   r  Úmasterr†   rŸ   r9   r¥   r¦   rx   rD   Úsector_pathÚsectorrE   Úhistory_keyrÎ   rÏ   rw  r  r   Úmetrics_pathÚscores_pathÚ
flags_pathÚmetric_columnsÚdatabaseÚ
connections                            r"   Úbuild_fundamentalsr¹  w  s§  € Ü˜Ó!€EÜ�_‰_˜X×3Ñ3Ð6OÑOÓP€FÜ!¤"§/¡/°(×2MÑ2MÓ"NÓO€GÜ—‘˜V KÑ0×4Ñ4Ó6Ó7€IÜ(<¸WÀiÓ(PÑ%€Gˆ[˜+ò€Gð �7‰O×!Ñ! '¨mÀÐ!ÓI€EØ×(Ñ(Ð+MÑM€KØ×ÑÔÜ—‘ Ó-×2Ñ2ò <
àð 3ó ˆð —‘˜F }¸&�ÓAˆÛUˆØ˜ÒÜŸF™FˆE�&ŠMð Vð ˜=˜/Ñ*×/Ñ/Ó1€KØ	×	Ñ	˜;×+Ñ+°OÐ+ÓDÈÐ\bÐ	Ó	c€BØ	×	Ñ	˜;×+Ñ+°OÐ+ÓDÈÐ\bÐ	Ó	c€BØ	�ˆÑ	×	%Ñ	% b¨]ÀÐ	%Ó	G€BØ	�ˆÑ	×	%Ñ	% b¨]ÀÐ	%Ó	G€BØ#(Ð);Ñ#<×#AÑ#AÀ5È%À.Ó#Q€EÐ
Ñ Ü˜5 " bÓ)€GÜ˜  v¡Ó/€EÜ% g¨u°eÐ<LÑ6MÓN€EÜ$ W¨e°X¸uÐEVÑ?WÓX€EÜ�G˜U 9Ñ-¨uÓ5€FÜ% f¨eÐ4GÑ.HÈ%ÓP€Fà×)Ñ)Ð,IÑI€LØ×(Ñ(Ð+GÑG€KØ×'Ñ'Ð*FÑF€Jò	€Nð ˆ>Ñ×%Ñ% l¸%Ð%Ô@Ø
×Ñ�k¨ÐÔ/Ø
‡M�M�(×(Ñ(Ð+CÑCÈ5Ð[f€MÔgØ	‡L�L� 5°;€LÔ?à×$Ñ$Ð'?Ñ?€HÜ	�‰œ˜H›Ô	&¨*Ø×Ñ˜K¨Ô0Ø×Ñ˜J¨Ô.Ø×ÑÐbÔcØ×ÑÐeÔf÷	 
'ô �(˜F E¨9Ô5Ü!¤# f£+¬s°6¸-Ñ3H×3NÑ3NÓ3P×3TÑ3TÓ3VÓ/WÜ"% fÐ->Ñ&?×&BÑ&BÀ1Ó&E×&IÑ&IÓ&KÓ"LÈkó[ð [÷ 
'Ð	&ús   ËAN$Î$N-c                ón  — |d   j                  d«      j                  «       }dj                  d„ |j                  «       D «       «      }t	        |d   «      }dj                  d„ |j                  «       D «       «      }|j                  |d      j                  dd	«      }dj                  d
„ |j                  d¬«      D «       «      }	dt        › d|j                  «       j                  «       › dt        |«      › dt        |d	   j                  «       j                  «       «      › dt        |d   j                  «       «      › dt        |d   j!                  d«      j                  «       «      › dt        |d   j                  «       «      › d|› d|› d|	› d�}
| j"                  dz  j%                  |
d¬«       y )Nrh  u	   æœªè¯„åˆ†Ú
c              3  óF   K  — | ]  \  }}d |› dt        |«      › d�–— Œ y­w©ú| ú | ú |N)r   ©Ú.0rv  Úcounts      r"   Ú	<genexpr>z _write_report.<locals>.<genexpr>¹  s(   è ø€ Ð[ÉN¹[¸TÀ5˜b   c¬#¨e«*¨°RÔ8ÉNùs   ‚!r×   c              3  ó4   K  — | ]  \  }}d |› d|› d�–— Œ y­wr½  r    rÁ  s      r"   rÄ  z _write_report.<locals>.<genexpr>»  s&   è ø€ ÐZÑFY±{°t¸U˜R ˜v S¨¨¨rÔ2ÑFYùs   ‚rj  é   rT  c              3  ó¦   K  — | ]I  }d |j                   › d|j                  › d|j                  › d|j                  d›d|j                  › d�–— ŒK y­w)r¾  r¿  z.2frÀ  N)rÔ   rv  r–  rT  rQ  )rÂ  rã   s     r"   rÄ  z _write_report.<locals>.<genexpr>½  s[   è ø€ ð á.ˆCð ˆS�_‰_Ð˜S §¡ 
¨#¨c×.BÑ.BÐ-CÀ3ÀsÇÁÐWZÐF[Ð[^Ð_b×_pÑ_pÐ^qÐqsÔtÙ.ùs   ‚AAFrÕ   u:   # M1 åŸºæœ¬é�¢è¯„åˆ†ä¸Žé£Žé™©è§„åˆ™æŠ¥å‘Š

æ¨¡åž‹ç‰ˆæœ¬ï¼šu     
æ•°æ�®æˆªé�¢ï¼šu     
å�‚ä¸Žè´¢åŠ¡å�ˆå¹¶ï¼šu%    å�ª  
æ™®é€šå·¥å•†ä¼�ä¸šå·²è¯„åˆ†ï¼šu+    å�ª  
é‡‘èž�ä¼�ä¸šä¸“ç”¨æ¨¡åž‹å·²è¯„åˆ†ï¼šrå   u    å�ª  
è§¦å�‘è´¢åŠ¡ç¡¬ä¼¤ï¼šrP  r   u4    å�ª  
åŸºæœ¬é�¢è¾¾åˆ°è¾ƒå¥½å�Šä»¥ä¸Šä¸”æ— ç¡¬ä¼¤ï¼šu<    å�ª

## 1. è¯„åˆ†åˆ†å¸ƒ

| ç­‰çº§ | è‚¡ç¥¨æ•° |
|---|---:|
uð  

è¯„åˆ†é‡‡ç”¨è¡Œä¸šå†…åˆ†ä½�æ•°ï¼Œå½“å‰�æ˜¯ç ”ç©¶ç‰ˆåˆ�å§‹æ�ƒé‡�ï¼Œä¸�ä»£è¡¨å·²ç»�é€šè¿‡æ”¶ç›Šå›žæµ‹ã€‚é“¶è¡Œã€�è¯�åˆ¸ã€�ä¿�é™©å’Œå¤šå…ƒé‡‘èž�æŒ‰ç›ˆåˆ©ã€�æˆ�é•¿ã€�èµ„æœ¬å¼ºåº¦ã€�ç›ˆåˆ©è´¨é‡�å’Œä¼°å€¼äº”ä¸ªä¸“ç”¨ç»´åº¦è¯„åˆ†ï¼Œä¸�å¥—ç”¨æ™®é€šå·¥å•†ä¼�ä¸šçš„çŽ°é‡‘æµ�å’Œæµ�åŠ¨æ¯”çŽ‡è§„åˆ™ã€‚
è�¥æ”¶ã€�å½’æ¯�å‡€åˆ©æ¶¦å’Œç»�è�¥çŽ°é‡‘æµ� TTM ç”±ç´¯è®¡æŠ¥è¡¨è¿˜åŽŸå�•å­£å�Žæ»šåŠ¨å››å­£è®¡ç®—ï¼Œä¸�ä½¿ç”¨å�•ä½�å�£å¾„æ··å�ˆçš„ä¾¿åˆ©å­—æ®µã€‚

## 2. é£Žé™©è§„åˆ™å‘½ä¸­

| è§„åˆ™ | å‘½ä¸­æ•° |
|---|---:|
uþ   

å®¡è®¡æ„�è§�ã€�ç›‘ç®¡å¤„ç½šã€�èµ„é‡‘å� ç”¨å’Œè´¨æŠ¼æ•°æ�®å°šæœªæŽ¥å…¥ï¼Œå› æ­¤â€œæ— çŽ°æœ‰è§„åˆ™å‘½ä¸­â€�ä¸�ç­‰äºŽè´¢åŠ¡ç»�å¯¹å®‰å…¨ã€‚

## 3. å½“å‰�é«˜åˆ†æ ·æœ¬

| ä»£ç � | å��ç§° | äºŒçº§è¡Œä¸š | é£Žé™©å�Žå¾—åˆ† | è­¦å‘Šæ•° |
|---|---|---|---:|---:|
u]   

é«˜åˆ†æ ·æœ¬ä»…ç”¨äºŽæ£€æŸ¥è¯„åˆ†é€»è¾‘å’Œè¿›å…¥å�Žç»­å€™é€‰æ± ï¼Œä¸�æž„æˆ�æŠ•èµ„å»ºè®®ã€‚
u   M1_åŸºæœ¬é�¢è¯„åˆ†æŠ¥å‘Š.mdr]   r^   )rÝ   Úvalue_countsÚjoinr�   r   Úmost_commonr7   ÚnlargestrÞ   rr  r   Ú	isoformatrl  r   rQ   r„   r4   Ú
report_dirÚ
write_text)rd   r   r  rŸ   ÚgradesÚgrade_linesÚrisksÚ
risk_linesÚtopÚ	top_linesÚreports              r"   r®  r®  ·  sÈ  € ØÐ'Ñ(×/Ñ/°Ó<×IÑIÓK€FØ—)‘)Ñ[ÈFÏLÉLÌNÓ[Ó[€KÜ�E˜+Ñ&Ó'€EØ—‘ÑZÀe×FWÑFWÔFYÓZÓZ€JØ
�*‰*�VÐ2Ñ3Ñ
4×
=Ñ
=¸bÀ-Ó
P€CØ—	‘	ñ à—>‘>¨�>Ô.óó €Iðä)Ð*ð +Ø—‘Ó ×*Ñ*Ó,Ð-ð .Ü˜&“k�]ð #Ü" 6¨-Ñ#8×#>Ñ#>Ó#@×#DÑ#DÓ#FÓGÐHð I%Ü%(¨Ð0EÑ)F×)JÑ)JÓ)LÓ%MÐ$Nð OÜ˜&Ð!2Ñ3×6Ñ6°qÓ9×=Ñ=Ó?Ó@ÐAð B.Ü.1°&Ð9OÑ2P×2TÑ2TÓ2VÓ.WÐ-Xð Yð €ð 	ð €ð ð €ð ð?"€FðF ×ÑÐ8Ñ8×DÑDÀVÐV]ÐDÕ^r!   )r-   rý   r.   rý   rÿ   rý   )r9   rý   r:   rý   r;   r   rÿ   rý   )T)rD   úpd.DataFramerE   rþ   rF   Úboolrÿ   rý   )rD   rÖ  rT   zlist[tuple[str, bool]]rU   r6   rÿ   ztuple[pd.Series, pd.Series])rd   r	   rÿ   zdict[str, object])r†   rÖ  rÿ   rÖ  )r†   rÖ  rŸ   úpd.Timestamprÿ   z/tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame])rD   rÖ  r¥   rÖ  r¦   rÖ  rÿ   rÖ  )rD   rÖ  r  údict[str, float]rÿ   rÖ  )rD   rÖ  r  rÖ  r  rÙ  rÿ   rÖ  )
rD   rÖ  r  rÖ  rd   r	   r  rÙ  rÿ   rÖ  )rD   rÖ  rs  rÙ  r  rÖ  rÿ   rÖ  )r/   rÖ  rs  rÙ  r  rÖ  rÿ   rÖ  )rd   r	   rÿ   r   )
rd   r	   r   rÖ  r  rÖ  rŸ   rØ  rÿ   r   )$Ú
__future__r   Úcollectionsr   Údataclassesr   Údatetimer   Úpathlibr   ra   rª  Únumpyr*   Úpandasr'   r\   r	   rr  r€   r   r0   r=   rI   rZ   rf   r�   r§   rÑ   r  r  r6  rJ  r‘  r¹  r®  r    r!   r"   Ú<module>rá     sß   ðÝ "å Ý !Ý Ý Û ã Û Û å ð $Ð ð :Ø9Ø=Ø=Ø$BñÐ ñ �$Ô÷ð ó ðó5óôó1ó;ó
BóBró*óD"MðJ\Ø%5ð\Ø:Fó\ð2*IØ$4ð*IØ9Eó*IóZ1óh5óp=[ô@-_r!   