Ë
    G¨j–R  ã            
      ó’   — d dl mZ d dlZd dlmZ d dlmZ d dlZd dlZ	ddl
mZ ddd	d
ddddddœ	Zddd„Zddd„Zdd„Zdd„Zddd„Zy)é    )ÚannotationsN)ÚPath)ÚAnyé   )ÚSettingsu   ç›ˆåˆ©è´¨é‡�õ   æˆ�é•¿u   èµ„äº§è´Ÿå€ºè¡¨õ	   çŽ°é‡‘æµ�u   ä»·å€¼u   è�¥è¿�æ•ˆçŽ‡u	   æ¯›åˆ©çŽ‡u	   æµ�åŠ¨æ€§u   ç ”å�‘å¼ºåº¦©	ÚprofitabilityÚgrowthÚbalance_sheetÚcash_qualityÚbook_to_priceÚ
efficiencyÚgross_marginÚ	liquidityÚrd_intensityc                óˆ   — t        j                  | d¬«      }t        j                  |«      rd S t        t	        |«      |«      S )NÚcoerce©Úerrors)ÚpdÚ
to_numericÚisnaÚroundÚfloat)ÚvalueÚdigitsÚparseds      ú8C:\FundamentalWorkbench\src\fundamental_mvp\dashboard.pyÚ_numberr!      s2   € Ü�]‰]˜5¨Ô2€FÜ—7‘7˜6”?ˆ4ÐD¬¬e°F«m¸VÓ(DÐDó    c                ó~   — t        j                  | «      st        | «      j                  «       dk(  r|S t        | «      S )NÚ )r   r   ÚstrÚstrip)r   Úfallbacks     r    Ú_textr(      s/   € Ü—w‘w˜u”~¬¨U«×)9Ñ)9Ó);¸rÒ)Aˆ8ÐQÄsÈ5ÃzÐQr"   c                óx   — | j                  «       st        j                  «       S t        j                  | d¬«      S )NF)Ú
low_memory)Úexistsr   Ú	DataFrameÚread_csv)Úpaths    r    Ú	_read_csvr/   #   s(   € Ø�;‰;Œ=Ü�|‰|‹~ÐÜ�;‰;�t¨Ô.Ð.r"   c                óˆ0  ‡F‡G‡H— | j                   }| j                  }t        j                  |dz  j	                  d¬«      «      }t        j                  |dz  j	                  d¬«      «      }t        |dz  «      }t        |dz  «      }t        |dz  «      }t        |dz  «      }t        |d	z  «      }	t        |d
z  «      }
t        |dz  «      }t        |dz  «      }|j                  sQ||d   j                  d«      j                  t        «         j                  «       }|j                  g d¢g d¢d¬«      }n|}g d¢}|D �cg c]  }||j                  v sŒ|‘Œ }}|j                  s|r|j                  ||   ddd¬«      }g }g d¢}|j                  «       D �]†  \  }}|j                  d«      }t!        j"                  |«      r|j                  d«      }t!        j"                  |«      r|j                  d«      }t%        |j                  d«      d«      }|D ���cg c]$  \  }}}|t%        |j                  |«      «      |dœ‘Œ& }}}}|j'                  i dt)        |j                  d«      «      “d t)        |j                  d!«      «      “d"t)        |j                  d"«      «      “d#t)        |j                  d$«      «      “d%t)        |j                  d&«      «      “d't)        |j                  d(«      «      “d)t%        t!        j*                  |j                  d*«      «      r|j                  d*«      n|j                  d+«      «      “d,t%        |j                  d-«      «      “d.t%        |«      “d/t%        |j                  d0«      «      “d1t-        t%        |j                  d2«      d3«      xs d3«      “d4t-        t%        |j                  d5«      d3«      xs d3«      “d6t)        |j                  d7«      «      “d8t)        |j                  d9«      «      “d:t)        |j                  d;«      d<«      “d=t)        |j                  d>«      d?«      “d@t%        |j                  dA«      «      “t%        |j                  dB«      «      t%        |j                  dC«      «      t%        |j                  dD«      «      t%        |j                  dE«      «      t%        |j                  dF«      «      t%        |j                  dG«      «      t%        |j                  d«      «      t%        |j                  dH«      «      t%        |j                  dI«      d«      t%        |j                  dJ«      d«      t%        |j                  dK«      d«      t%        |j                  dL«      d«      |r|d3kD  rt/        dM|z  d«      nd t%        |j                  dN«      d«      t%        |j                  dC«      d«      t%        |j                  dO«      d«      t%        |j                  dP«      d«      dQœ	|dRœ
¥«       �Œ‰ g }|j                  �sX|t!        j0                  |d   dS¬T«      j+                  «          j                  dd¬U«      }|j3                  dV«      j                  «       D ]ú  \  }}|j'                  t)        |j                  d$«      «      t)        |j                  d&«      «      t%        |j                  d«      «      t%        |j                  dW«      «      t%        |j                  dX«      «      t%        t5        |j                  dYd3«      «      dZz  «      t%        |j                  d[«      «      t-        t%        |j                  d\«      d3«      xs d3«      d]œ«       Œü g }|j                  �s_dX|j                  v �rP|t!        j0                  |dX   dS¬T«      j+                  «       |d^   j                  d«      j                  t        «      z     j                  dXd¬U«      }t7        |j3                  d_«      j                  «       dM¬`«      D ]¿  \  }\  }}|j'                  |t)        |j                  d$«      «      t)        |j                  d&«      «      t%        |j                  dX«      «      t%        |j                  da«      «      t%        |j                  dW«      «      t-        t%        |j                  d\«      d3«      xs d3«      dbœ«       ŒÁ g } |j                  �s_dW|j                  v �rP|t!        j0                  |dW   dS¬T«      j+                  «       |d^   j                  d«      j                  t        «      z     j                  dWd¬U«      }t7        |j3                  d_«      j                  «       dM¬`«      D ]¿  \  }\  }}| j'                  |t)        |j                  d$«      «      t)        |j                  d&«      «      t%        |j                  dW«      «      t%        |j                  dX«      «      t%        |j                  da«      «      t-        t%        |j                  d\«      d3«      xs d3«      dcœ«       ŒÁ g }!|j                  �s]|ŠG|j                  sO|j                  sCddD �cg c]  }||j                  v r|‘Œ }"}|j                  ||"   j9                  d«      dd¬e«      ŠGdÙˆGfdf„}#|j                  «       D �]æ  \  }}t)        |j                  d$«      «      }$|!j'                  i d"|$“dgt)        |j                  d&«      «      “dht-        t%        |j                  d\«      d3«      xs d3«      “dit%        |j                  d«      «      “djt-        t%        |j                  dk«      d3«      xs d3«      “dlt-        t%        |j                  dm«      d3«      xs d3«      “dnt-        t%        |j                  do«      d3«      xs d3«      “dpt%        |j                  da«      «      “dqt%        |j                  dX«      «      “drt%        |j                  dW«      «      “dst%        |j                  dt«      «      “dut%        t5        |j                  dvd3«      «      dZz  «      “dwt%        t5        |j                  dYd3«      «      dZz  «      “dxt%        t5        |j                  dyd3«      «      dZz  «      “dzt%        t5        |j                  d{d3«      «      dZz  «      “d|t%        |j                  d[«      «      “d}t%        t5        |j                  d~d3«      «      dZz  «      “dt%        |j                  d€«      «      d�dœd‚t%        |j                  dƒ«      «      d„dœd…t%        |j                  d†«      «      d‡dœdˆt%        |j                  d‰«      «      d‡dœg |#|$d_«       |#|$d‡«      dŠd‹œ¥«       �Œé g }%|	j                  sÑ|	j                  dŒd¬U«      j                  «       D ]­  \  }}t)        |j                  d�«      «      }&|%j'                  |&t:        j                  |&|&«      t%        |j                  dŒ«      d«      t%        t5        |j                  dŽd3«      «      dZz  «      t%        t5        |j                  d�d3«      «      dZz  «      d�œ«       Œ¯ i }'|
j                  sÆt!        j<                  |
d‘   dS¬T«      |
d‘<   |
d‘   j?                  «       t!        j@                  d�¬’«      z
  }(|
|
d‘   |(k\     })d“D ]o  }&|)|)d�   |&k(     j                  d‘«      }*|*jC                  d¬”«      D �cg c]4  }|jD                  jG                  d•«      t%        |jH                  d«      d–œ‘Œ6 c}|'|&<   Œq g }+|j                  �s&t!        j<                  |d—   dS¬T«      |d—<   |j                  d—d˜gdd™g¬U«      j3                  dš«      },|,j                  «       D ]Ð  \  }}|+j'                  t!        j*                  |d—   «      r|d—   jG                  d›«      ndœt)        |j                  d«      «      jK                  «       t)        |j                  d˜«      «      t)        |j                  d�«      «      t)        |j                  dž«      «      t)        |j                  dŸ«      d «      d¡œ«       ŒÒ i }-|j                  sF|d(   jM                  «       jO                  «       D �.�/ci c]  \  }.}/tQ        |.«      t-        |/«      “Œ }-}.}/t-        |j                  d˜t!        jR                  tP        ¬¢«      «      d£k(  jU                  «       «      }0t-        |j                  d˜t!        jR                  tP        ¬¢«      «      d¤k(  jU                  «       «      }1i }2g }3|j                  �sŠd¥|j                  v �r{|ŠFtW        ‰F«      ŠHt-        ‰H«      t-        ‰Fj                  d¦t!        jR                  t        ¬¢«      «      j                  d«      j                  t        «      jU                  «       «      t-        ‰Fj                  d§t!        jR                  t        ¬¢«      «      j                  d«      j                  t        «      jU                  «       «      ‰Fd¥   jM                  «       jO                  «       D �4�5ci c]  \  }4}5tQ        |4«      t-        |5«      “Œ c}5}4d¨œ}2‰Fj                  d©t!        jR                  d ‰FjX                  ¬”«      «      j                  d «      j                  tP        «      }6dÚˆFˆHfdª„}7‰Fj                  dt!        jR                  d ‰FjX                  ¬”«      «      j                  d «      j                  tP        «      j[                  «       }8‰Fj                  d"t!        jR                  d ‰FjX                  ¬”«      «      j                  d «      j                  tP        «      j[                  «       }9‰Fd¥   j                  d «      j                  tP        «      j[                  «       }:‰Fj                  d&t!        jR                  d ‰FjX                  ¬”«      «      j                  d «      j                  tP        «      j[                  «       };‰Fj                  d$t!        jR                  d ‰FjX                  ¬”«      «      j                  d «      j                  tP        «      j[                  «       }< |7d¦«      }= |7d««      }> |7d§«      }? |7d¬«      }@ |7d­«      }Ai }Bd®D ]Z  \  }.}C|.‰Fj                  v r‰F|.   n$t!        jR                  d g‰Hz  ‰FjX                  ¬”«      }D|DD �/cg c]  }/t%        |/C«      ‘Œ c}/B|.<   Œ\ t]        ‰H«      D ]­  }E|3j'                  i d|8|E   jK                  «       “d"|9|E   “d'|:|E   “d¯|;|E   “d°|<|E   “d)Bd-   |E   “d±|Bd   |E   “d²|Bd³   |E   “d´|BdG   |E   “d|Bd   |E   “d/|Bd0   |E   “dµ|Bd¶   |E   “d·|=|E   “d¸|>|E   “d¹|?|E   “dº@|E   “d»A|E   “d¼|6j^                  |E   i¥«       Œ¯ i d½ta        jb                  «       jd                  “d¾t         jf                  ji                  «       jG                  d¿«      “dÀt)        |j                  dÁ«      «      “dÂt)        |j                  dÃ«      «      “dÄt-        |j                  dÅd3«      «      t-        tW        |«      «      t-        |j                  dÆi «      j                  dÇd3«      «      |0|1t/        t5        |j                  dÅd3«      «      t?        t5        |j                  dÈdM«      «      dM«      z  dZz  dM«      t-        |j                  dÉd3«      «      |-dÊœ“dË|j                  dÌi «      jO                  «       D �.�/cg c]5  \  }.}/|.t:        j                  |.|.«      t/        t5        |/«      dZz  dM«      dÍœ‘Œ7 c}/}.“dÎ|“dÏ|“dÐ| “dÑ|!“dÒ|“dÓ|%“dÔ|'“dÕ|+“dÖtk        |j                  dÖg «      «      “d×|3“dØ|2“S c c}w c c}}}w c c}w c c}w c c}/}.w c c}5}4w c c}/w c c}/}.w )ÛNzm1_run_summary.jsonúutf-8©Úencodingzm2_run_summary.jsonzindustry_hotspot_scores.csvzm2_stock_candidates.csvzstock_health_cards.csvz"external_governance_risk_flags.csvzfactor_backtest_summary.csvzfactor_ic.csvzstock_momentum_snapshot.csvzfull_market_catalog.csvÚcandidate_eligibleF)Úcandidate_tier_orderÚm2_composite_scoreÚcombined_score)TFFÚlast)Ú	ascendingÚna_position)Úsource_codeÚquant_highlightsÚ
risk_codesÚ
risk_notesÚpledge_ratio_pctÚweighted_roe_reportedÚgross_margin_reportedÚoperating_revenue_yoy_reportedÚnet_profit_yoy_reportedÚcfo_to_parent_profitÚpe_ttmÚpbr;   Úleft)r$   Ú_card)ÚonÚhowÚsuffixes))Úprofitability_scoreu   ç›ˆåˆ©é   )Úgrowth_scorer   rM   )Úcashflow_scorer	   rM   )Úbalance_sheet_scoreu   èµ„äº§è´Ÿå€ºé   )Úefficiency_scoreu   æ•ˆçŽ‡é
   )Úvaluation_scoreu   ä¼°å€¼é   Úhotspot_scoreÚhotspot_score_xÚhotspot_score_yrF   é   )Úlabelr   ÚmaxÚcodeÚ
securityIdÚsecurity_idÚnameÚindustryÚindustry_l2_nameÚ
industryL1Úindustry_l1_nameÚtierÚcandidate_tierÚscorer6   r7   ÚfundamentalÚtotal_scoreÚhotspotÚcloseÚlatest_closeÚwarningsÚwarning_countr   Ú	hardRisksÚhard_risk_countÚhealthÚfinancial_health_statusÚreportPeriodÚreport_periodÚ
highlightsr<   u   æš‚æ— æ‘˜è¦�Ú	riskNotesr>   u!   æœªå‘½ä¸­å·²å»ºé‡�åŒ–é£Žé™©è§„åˆ™ÚpledgeRatior?   r@   rA   rB   rC   rD   rE   Úm2_research_coveragerL   rN   rP   rO   r   rR   Úcurrent_ratioÚresearch_development_ratior
   )
ÚroeÚgrossMarginÚ
revenueYoyÚ	profitYoyÚ	cfoProfitÚperF   ÚresearchCoverageÚfactorValuesÚ
dimensionsr   r   ©r9   é   Úreturn_20d_medianÚreturn_10d_medianÚpositive_20d_ratioéd   Úamount_ratio_5_20_medianÚmember_count)r_   Úparentrf   Úreturn20Úreturn10ÚbreadthÚactivityÚmembersÚmember_coverage_okrS   )ÚstartÚreturn_5d_median)Úrankr_   r‹   r�   Úreturn5rŒ   r�   )r”   r_   r‹   rŒ   r�   r•   r�   )r;   r6   rh   re   r4   )rI   rJ   c                óô  •— ‰j                   rg S d|› d�}‰‰d   j                  | «      t        j                  ‰j	                  |«      d¬«      j                  «       z  ‰d   j                  d«      j                  t        «       z     j                  |d¬«      j                  d	«      }|j                  «       D ��cg c]­  \  }}t        |j	                  d
«      «      j                  «       t        |j	                  d«      «      t        |j	                  |«      «      t        |j	                  d«      «      t        |j	                  d«      «      t        |j	                  d«      d«      dœ‘Œ¯ c}}S c c}}w )NÚreturn_Údra   r   r   Úis_st_currentFrƒ   é   r;   r_   Úamount_ratio_5_20r6   re   u   æœªå…¥å€™é€‰)r\   r_   ÚreturnÚamountRatiorf   rd   )ÚemptyÚeqr   r   ÚgetÚnotnaÚfillnaÚastypeÚboolÚsort_valuesÚheadÚiterrowsr(   Úupperr!   )Úindustry_nameÚperiodÚreturn_columnÚrowsÚ_ÚrowÚmomentum_with_scoress         €r    Úleaders_forz,build_dashboard_payload.<locals>.leaders_forÃ   sS  ø€ Ø#×)Ò)Ø�	Ø% f X¨QÐ/ˆMØ'Ø$Ð%7Ñ8×;Ñ;¸MÓJÜ—-‘-Ð 4× 8Ñ 8¸Ó GÐPXÔY×_Ñ_Óañbà'¨Ñ8×?Ñ?ÀÓF×MÑMÌdÓSÐSñTñ÷ ‰k˜-°5ˆkÓ9¿$¹$¸q»'ð	 ð !ŸM™MœOô-ñ ,‘&�!�Sô ˜cŸg™g mÓ4Ó5×;Ñ;Ó=Ü˜cŸg™g f›oÓ.Ü! #§'¡'¨-Ó"8Ó9Ü& s§w¡wÐ/BÓ'CÓDÜ  §¡Ð)=Ó!>Ó?Ü˜cŸg™gÐ&6Ó7¸ÓHóð ,ò-ð -ùó -s   Â>B2E4r‹   r�   ÚhotspotScoreÚhotspotRankÚhotspot_rankÚrank10Úmomentum_10d_rankÚrank20Úmomentum_20d_rankr•   r�   rŒ   Úreturn60Úreturn_60d_medianÚ
positive10Úpositive_10d_ratioÚ
positive20Ú	aboveMa20Úabove_ma20_ratioÚ
nearHigh60Únear_high60_ratior�   ÚtrendAlignmentÚtrend_alignmentu   ä»·æ ¼å¼ºåº¦Úmomentum_scoreé#   u   ä¸Šæ¶¨æ‰©æ•£Úbreadth_scoreé   u   æˆ�äº¤æ´»è·ƒÚactivity_scorerM   u   è¶‹åŠ¿æŒ�ç»­Úpersistence_scoreÚQUANTITATIVE_ONLY)Ú
componentsÚ	leaders10Ú	leaders20ÚevidenceStatusÚmean_rank_icÚfactorÚic_positive_rateÚ cumulative_long_short_net_return)ÚkeyrZ   ÚrankIcÚpositiveRateÚ
cumulativeÚrebalance_date)Úmonths)r   r   r   r   )Úindexz%Y-%m)Údater   Ú
event_dateÚseverityTé   z%m-%dõ   â€”Ú	rule_codeÚdescriptionÚ
source_urlr$   )rÙ   r\   rÛ   Útyperß   Úurl)ÚdtypeÚhardÚwarningÚcatalog_tierÚin_basic_poolÚin_candidate_pool)ÚtotalÚ	basicPoolÚcandidatePoolÚtiersÚexclude_reasonsc                ó–   •— | ‰j                   vrdg‰z  S ‰|    j                  d«      j                  t        «      j	                  «       S )NF)Úcolumnsr¢   r£   r¤   Útolist)ÚcolumnÚfmÚtotal_ns    €€r    Ú_flagz&build_dashboard_payload.<locals>._flag1  sE   ø€ Ø˜RŸZ™ZÑ'Ø�w Ñ(Ð(Ø�f‘:×$Ñ$ UÓ+×2Ñ2´4Ó8×?Ñ?ÓAÐAr"   Úin_fundamental_eligibler™   Úis_financial_sector))rh   é   )rV   r÷   )Ú
market_capr   )rE   r÷   )rF   r÷   )rk   r÷   )Úavg_amount_20r   Úind1Úind2ÚhotÚcaprø   r   Úamtrù   ÚbasicÚfundÚcandÚstÚfinÚreasonÚrunIdÚgeneratedAtz%Y-%m-%d %H:%M:%SÚasOfÚmarket_data_cutoffÚ
factorAsOfÚas_ofÚsummaryÚfinance_covered_stocksÚhotspot_buildÚhot_industriesÚnamed_stocksÚmarket_data_business_days_stale)ÚuniverseÚeligibleÚhotIndustriesrn   ÚwarningRisksÚfinanceCoverageÚ	staleDaysÚ
tierCountsÚlatestWeightsÚlatest_weights)rÒ   rZ   r   Ú
industriesÚ
momentum10Ú
momentum20ÚindustryDetailsÚ
candidatesÚfactorsÚicSeriesÚrisksÚlimitationsÚ
fullMarketÚfullMarketCounts)r©   r%   rª   Úintrœ   zlist[dict[str, Any]])rñ   r%   rœ   z
list[bool])6Úprocessed_dirÚ
report_dirÚjsonÚloadsÚ	read_textr/   rž   r¢   r£   r¤   Úcopyr¥   rï   Úmerger§   r    r   r   r!   Úappendr(   r¡   r%  r   r   r¦   r   Ú	enumerateÚdrop_duplicatesÚFACTOR_LABELSÚto_datetimer[   Ú
DateOffsetÚ
itertuplesrÖ   ÚstrftimeÚrank_icr¨   Úvalue_countsÚitemsr%   ÚSeriesÚsumÚlenrØ   rð   ÚrangeÚilocÚuuidÚuuid4ÚhexÚ	TimestampÚnowÚlist)IÚsettingsÚ	processedÚreportsÚm1Úm2r  r  Úcardsr!  Úfactor_summaryÚ	factor_icÚstock_momentumÚfull_marketr  Úcard_columnsrñ   Úavailable_card_columnsÚcandidate_rowsÚscore_fieldsr­   r®   Úhotspot_valueÚpb_valueÚfieldrZ   Úmaximumr‚   r  ÚorderedÚmomentum_10dÚvalid_momentumr”   Úmomentum_20dÚindustry_detailsÚscore_columnsr°   r_   Úfactor_rowsrÏ   Ú	ic_seriesÚcutoffÚ	recent_icr¬   Úrisk_eventsÚlatestÚtier_countsrÒ   r   Ú
hard_countrm   Úfull_market_countsÚfull_market_rowsÚkÚvÚreason_textrô   ÚcodesÚnamesrì   rú   rû   Úin_basicÚin_fundÚin_candÚis_stÚis_finÚnumbersr   ÚseriesÚirò   r¯   ró   sI                                                                         @@@r    Úbuild_dashboard_payloadrr  )   sõ  ú€ Ø×&Ñ&€IØ×!Ñ!€GÜ	�‰�WÐ4Ñ4×?Ñ?ÈÐ?ÓQÓ	R€BÜ	�‰�WÐ4Ñ4×?Ñ?ÈÐ?ÓQÓ	R€BÜ˜9Ð'DÑDÓE€JÜ˜9Ð'@Ñ@ÓA€JÜ�iÐ":Ñ:Ó;€EÜ�iÐ"FÑFÓG€EÜ˜yÐ+HÑHÓI€NÜ˜) oÑ5Ó6€IÜ˜yÐ+HÑHÓI€NÜ˜IÐ(AÑAÓB€Kà×ÒØ˜jÐ)=Ñ>×EÑEÀeÓL×SÑSÔTXÓYÑZ×_Ñ_ÓaˆØ×'Ñ'ÚLÚ*Øð (ó 
‰ð ˆò€Lñ
 4@Ó[±<¨À6ÈUÏ]É]ÒCZšf°<ÐÐ[Ø�>Š>Ñ4Ø—>‘> %Ð(>Ñ"?ÀMÐW]Ðhu�>Óvˆà€Nò€Lð ×#Ñ#×%‰ˆˆ3ØŸ™ Ó0ˆÜ�7‰7�=Ô!ØŸG™GÐ$5Ó6ˆMÜ�7‰7�=Ô!ØŸG™GÐ$5Ó6ˆMÜ˜3Ÿ7™7 4›=¨!Ó,ˆñ *6õ
á)5Ñ%��u˜gð ¤g¨c¯g©g°e«nÓ&=ÀgÓNØ)5ð 	ò 
ð 	×Ñð &
Ø”E˜#Ÿ'™' -Ó0Ó1ð&
àœ% §¡¨Ó 6Ó7ð&
ð ”E˜#Ÿ'™' &›/Ó*ð&
ð œ˜cŸg™gÐ&8Ó9Ó:ð	&
ð
 œ% §¡Ð(:Ó ;Ó<ð&
ð ”E˜#Ÿ'™'Ð"2Ó3Ó4ð&
ð ”W¼b¿h¹hÀsÇwÁwÐOcÓGdÔ>e˜SŸW™WÐ%9Ô:Ðkn×krÑkrð  tDó  lEó  Fð&
ð œ7 3§7¡7¨=Ó#9Ó:ð&
ð ”w˜}Ó-ð&
ð ”W˜SŸW™W ^Ó4Ó5ð&
ð œœG C§G¡G¨OÓ$<¸aÓ@ÒEÀAÓFð&
ð œœW S§W¡WÐ->Ó%?ÀÓCÒHÀqÓIð&
ð ”e˜CŸG™GÐ$=Ó>Ó?ð&
ð œE #§'¡'¨/Ó":Ó;ð&
ð œ% §¡Ð(:Ó ;¸^ÓLð&
ð  œ˜sŸw™w |Ó4Ð6YÓZð!&
ð" œ7 3§7¡7Ð+=Ó#>Ó?ð#&
ô$ ˜3Ÿ7™7Ð#:Ó;Ó<Ü" 3§7¡7Ð+BÓ#CÓDÜ! #§'¡'Ð*JÓ"KÓLÜ  §¡Ð)BÓ!CÓDÜ  §¡Ð)?Ó!@ÓAÜ˜#Ÿ'™' (Ó+Ó,Ü˜#Ÿ'™' $›-Ó(Ü '¨¯©Ð0FÓ(GÓ Hä!(¨¯©Ð1FÓ)GÈÓ!KÜ! #§'¡'¨.Ó"9¸1Ó=Ü!(¨¯©Ð1FÓ)GÈÓ!KÜ '¨¯©Ð0@Ó(AÀ1Ó EÙ;CÈÐSTÊ¤ q¨8¡|°QÔ!7ÐZ^Ü% c§g¡gÐ.@Ó&AÀ1ÓEÜ '¨¯©Ð0GÓ(HÈ!Ó LÜ$ S§W¡W¨_Ó%=¸qÓAÜ '¨¯©Ð0LÓ(MÈqÓ Qñ
ð %òK&
ö &	ð &ðf €NØ×ÓØœRŸ]™]¨:°oÑ+FÈxÔX×^Ñ^Ó`Ña×mÑmÐn}ð  JOÐmó  PˆØ—l‘l 2Ó&×/Ñ/Ö1‰FˆAˆsØ×!Ñ!Ü˜cŸg™gÐ&8Ó9Ó:Ü §¡Ð(:Ó ;Ó<Ü  §¡¨Ó!9Ó:Ü# C§G¡GÐ,?Ó$@ÓAÜ# C§G¡GÐ,?Ó$@ÓAÜ"¤5¨¯©Ð1EÀqÓ)IÓ#JÈSÑ#PÓQÜ# C§G¡GÐ,FÓ$GÓHÜœw s§w¡w¨~Ó'>ÀÓBÒGÀaÓHñ	#õ 	ð 2ð €LØ×ÓÐ 3°z×7IÑ7IÒ IØ#Ü�M‰M˜*Ð%8Ñ9À(ÔK×QÑQÓSØÐ-Ñ.×5Ñ5°eÓ<×CÑCÄDÓIñJñ
÷ ‰+Ð)°Uˆ+Ó
;ð 	ô (¨×(;Ñ(;¸BÓ(?×(HÑ(HÓ(JÐRS×T‰NˆD‘(�1�cØ×ÑØÜ˜cŸg™gÐ&8Ó9Ó:Ü §¡Ð(:Ó ;Ó<Ü# C§G¡GÐ,?Ó$@ÓAÜ" 3§7¡7Ð+=Ó#>Ó?Ü# C§G¡GÐ,?Ó$@ÓAÜœw s§w¡w¨~Ó'>ÀÓBÒGÀaÓHñ!õ ð Uð €LØ×ÓÐ 3°z×7IÑ7IÒ IØ#Ü�M‰M˜*Ð%8Ñ9À(ÔK×QÑQÓSØÐ-Ñ.×5Ñ5°eÓ<×CÑCÄDÓIñJñ
÷ ‰+Ð)°Uˆ+Ó
;ð 	ô (¨×(;Ñ(;¸BÓ(?×(HÑ(HÓ(JÐRS×T‰NˆD‘(�1�cØ×ÑØÜ˜cŸg™gÐ&8Ó9Ó:Ü §¡Ð(:Ó ;Ó<Ü# C§G¡GÐ,?Ó$@ÓAÜ# C§G¡GÐ,?Ó$@ÓAÜ" 3§7¡7Ð+=Ó#>Ó?Üœw s§w¡w¨~Ó'>ÀÓBÒGÀaÓHñ!õ ð Uð ÐØ×ÓØ-ÐØ×#Ò#¨J×,<Ò,<ñ &Bóñ &B˜6Ø˜Z×/Ñ/Ñ/ò ð  &Bð ð ð $2×#7Ñ#7Ø˜=Ñ)×9Ñ9¸-ÓHÈ]Ð`fð $8ó $Ð õ	-ð$ !×)Ñ)×+‰FˆAˆsÜ˜Ÿ™Ð!3Ó4Ó5ˆDØ×#Ñ#ð %Ø˜ð%àœ% §¡Ð(:Ó ;Ó<ð%ð œ3œw s§w¡w¨~Ó'>ÀÓBÒGÀaÓHð%ð ¤¨¯©°Ó(@Ó Að	%ð
 œs¤7¨3¯7©7°>Ó+BÀAÓ#FÒ#KÈ!ÓLð%ð œ#œg c§g¡gÐ.AÓ&BÀAÓFÒKÈ!ÓLð%ð œ#œg c§g¡gÐ.AÓ&BÀAÓFÒKÈ!ÓLð%ð œ7 3§7¡7Ð+=Ó#>Ó?ð%ð œG C§G¡GÐ,?Ó$@ÓAð%ð œG C§G¡GÐ,?Ó$@ÓAð%ð œG C§G¡GÐ,?Ó$@ÓAð%ð œg¤e¨C¯G©GÐ4HÈ!Ó,LÓ&MÐPSÑ&SÓTð%ð œg¤e¨C¯G©GÐ4HÈ!Ó,LÓ&MÐPSÑ&SÓTð%ð œW¤U¨3¯7©7Ð3EÀqÓ+IÓ%JÈSÑ%PÓQð%ð œg¤e¨C¯G©GÐ4GÈÓ,KÓ&LÈsÑ&RÓSð%ð  œw s§w¡wÐ/IÓ'JÓKð!%ð" !¤'¬%°·±Ð8IÈ1Ó0MÓ*NÐQTÑ*TÓ"Uð#%ð& -´w¸s¿w¹wÐGWÓ?XÓ7YÐbdÑeØ,´w¸s¿w¹wÀÓ?WÓ7XÐacÑdØ,´w¸s¿w¹wÐGWÓ?XÓ7YÐbdÑeØ,´w¸s¿w¹wÐGZÓ?[Ó7\ÐegÑhð	ñ )¨¨rÓ2Ù(¨¨rÓ2Ø"5ò5%ö ð ,ð> €KØ×ÒØ$×0Ñ0°È5Ð0ÓQ×ZÑZÖ\‰FˆAˆsÜ˜3Ÿ7™7 8Ó,Ó-ˆFØ×ÑØÜ&×*Ñ*¨6°6Ó:Ü! #§'¡'¨.Ó"9¸1Ó=Ü '¬¨c¯g©gÐ6HÈ!Ó.LÓ(MÐPSÑ(SÓ TÜ%¤e¨C¯G©GÐ4VÐXYÓ,ZÓ&[Ð^aÑ&aÓbñ õ ð ]ð 24€IØ�?Š?Ü&(§n¡n°YÐ?OÑ5PÐYaÔ&bˆ	Ð"Ñ#ØÐ+Ñ,×0Ñ0Ó2´R·]±]È"Ô5MÑMˆØ˜iÐ(8Ñ9¸VÑCÑDˆ	ÛRˆFØ˜Y xÑ0°FÑ:Ñ;×GÑGÐHXÓYˆDð  Ÿ?™?°˜?Ô7ó!á7�Cð ×+Ñ+×4Ñ4°WÓ=ÌÐPS×P[ÑP[Ð]^ÓH_Ó`Ø7ñ!ˆI�fÒð Sð €KØ�;‹;Ü Ÿn™n¨U°<Ñ-@ÈÔRˆˆlÑØ×"Ñ" L°*Ð#=È%ÐQUÈÐ"ÓW×\Ñ\Ð]_Ó`ˆØ—o‘oÖ'‰FˆAˆsØ×ÑÜ?A¿x¹xÈÈLÑHYÔ?Z˜˜LÑ)×2Ñ2°7Ô;Ð`eÜ˜cŸg™g mÓ4Ó5×;Ñ;Ó=Ü! #§'¡'¨*Ó"5Ó6Ü˜cŸg™g kÓ2Ó3Ü$ S§W¡W¨]Ó%;Ó<Ü˜SŸW™W \Ó2°BÓ7ñ õ ð (ð €KØ�>Š>Ø>FÐGWÑ>X×>eÑ>eÓ>g×>mÑ>mÔ>oÔpÑ>o±
°°U”s˜3“x¤ U£Ñ+Ð>oˆÑpä�e—i‘i 
¬B¯I©I¼CÔ,@ÓAÀVÑK×PÑPÓRÓS€JÜ˜Ÿ™ :¬r¯y©y¼sÔ/CÓDÈ	ÑQ×VÑVÓXÓY€Mð
 *,ÐØ-/ÐØ×Ó °;×3FÑ3FÒ!FØˆÜ�b“'ˆä˜“\Ü˜RŸV™V O´R·Y±YÄTÔ5JÓK×RÑRÐSXÓY×`Ñ`ÔaeÓf×jÑjÓlÓmÜ  §¡Ð(;¼R¿Y¹YÌTÔ=RÓ!S×!ZÑ!ZÐ[`Ó!a×!hÑ!hÔimÓ!n×!rÑ!rÓ!tÓuØ13°NÑ1C×1PÑ1PÓ1R×1XÑ1XÔ1ZÔ[Ñ1Z©¨¨A”c˜!“fœc !›f‘nÐ1ZÒ[ñ	
Ðð —f‘fÐ.´·	±	¸"ÀBÇHÁHÔ0MÓN×UÑUÐVXÓY×`Ñ`ÔadÓeˆö	Bð
 —‘�}¤b§i¡i°¸"¿(¹(Ô&CÓD×KÑKÈBÓO×VÑVÔWZÓ[×bÑbÓdˆØ—‘�vœrŸy™y¨°2·8±8Ô<Ó=×DÑDÀRÓH×OÑOÔPSÓT×[Ñ[Ó]ˆØ�>Ñ"×)Ñ)¨"Ó-×4Ñ4´SÓ9×@Ñ@ÓBˆØ�v‰vÐ(¬"¯)©)°B¸b¿h¹hÔ*GÓH×OÑOÐPRÓS×ZÑZÔ[^Ó_×fÑfÓhˆØ�v‰vÐ(¬"¯)©)°B¸b¿h¹hÔ*GÓH×OÑOÐPRÓS×ZÑZÔ[^Ó_×fÑfÓhˆÙ˜Ó)ˆÙÐ1Ó2ˆÙÐ+Ó,ˆÙ�oÓ&ˆÙÐ,Ó-ˆØˆó
‰KˆC�ð !$ r§z¡zÑ 1�R˜’W´r·y±yÀ$ÀÈ'ÑAQÐY[×YaÑYaÔ7bˆFÙ@FÓGÁ°uœG E¨6Õ2ÀÑGˆG�CŠLð
ô �w–ˆAØ×#Ñ#ð %Ø˜˜a™Ÿ™Ó(ð%à˜˜a™ð%ð ˜˜a™ð%ð ˜˜Q™ð	%ð
 ˜˜Q™ð%ð ˜ Ñ/°Ñ2ð%ð �w˜Ñ/°Ñ2ð%ð �w˜|Ñ,¨QÑ/ð%ð �g˜hÑ'¨Ñ*ð%ð �g˜d‘m AÑ&ð%ð ˜ Ñ0°Ñ3ð%ð �w˜Ñ/°Ñ2ð%ð ˜ !™ð%ð ˜ ™
ð%ð ˜ ™
ð%ð  �e˜A‘hð!%ð" �v˜a‘yð#%ð$ ˜+×*Ñ*¨1Ñ-ñ%%õ ð  ð,Ø”—‘“×!Ñ!ðà”r—|‘|×'Ñ'Ó)×2Ñ2Ð3FÓGðð 	”�b—f‘fÐ1Ó2Ó3ðð 	”e˜BŸF™F 7›OÓ,ð	ð
 	Ü˜BŸF™FÐ#;¸QÓ?Ó@ÜœC ›MÓ*Ü  §¡¨¸Ó!<×!@Ñ!@ÐAQÐSTÓ!UÓVØ#Ø)Ü$¤U¨2¯6©6Ð2JÈAÓ+NÓ%OÔRUÔV[Ð\^×\bÑ\bÐcqÐstÓ\uÓVvÐxyÓRzÑ%zð  ~Añ  &Að  CDó   EÜ˜RŸV™VÐ$EÀqÓIÓJØ%ñ	
ðð 	à Ÿf™fÐ%5°rÓ:×@Ñ@ÔBô
áB‘
��Uð ¤-×"3Ñ"3°C¸Ó"=ÌÌeÐTYËlÐ]`ÑN`ÐbcÓHdÓeØBò
ðð& 	�nð'ð( 	�lð)ð* 	�lð+ð, 	Ð+ð-ð. 	�nð/ð0 	�;ð1ð2 	�Ið3ð4 	�ð5ð6 	”t˜BŸF™F =°"Ó5Ó6ð7ð8 	Ð&ð9ð: 	Ð.ð;ð ùòq \ùô(
ùòBùòX!ùó* qùó" \ùò2 HùóN
sC   ÅA`ÅA`È)A`
êA`#ý9A`(ÁC,A`-ÁJ5A`3ÁUA`9Á^:A`>
c           
     ó¬  — t        t        «      j                  d«      dz  }|xs | j                  dz  dz  }|j                  j                  dd¬«       t        | «      }t        j                  |dd¬	«      j                  d
d«      }|j                  d¬«      j                  d|«      }|j                  |j                  › d�«      }|j                  |d¬«       |j                  |«       |j                  d«      }|j                  |j                  › d�«      }|j                  t        j                  |d   |d   |d   |d   |d   dœdd¬«      d¬«       |j                  |«       |j                  d«      }	|	j                  «       r%t        j                  |	j                  d¬«      «      ni }
|
j                  d«      dk7  rŽ|
j!                  d|d   dd|d   |d   dœ«       |
j#                  d|d   «       |	j                  |	j                  › d�«      }|j                  t        j                  |
dd¬«      d¬«       |j                  |	«       |S ) NÚassetszdashboard.htmlÚ	dashboardz
index.htmlT)ÚparentsÚexist_okF)Ú,Ú:)Úensure_asciiÚ
separatorsz</z<\/r1   r2   Ú__DASHBOARD_DATA__z.tmpzversion.jsonr  r  r  r	  )Úversionr  r  r  r	  r÷   )rz  Úindentzupdate_status.jsonÚstateÚrunningÚsuccessu   çœ‹æ�¿ç”Ÿæˆ�u   ç ”ç©¶çœ‹æ�¿å·²ç”Ÿæˆ�)r  ÚcompletedAtÚstageÚmessager  r}  Ú	startedAt)r   Ú__file__Ú	with_namer'  r‹   Úmkdirrr  r(  ÚdumpsÚreplacer*  r_   Ú
write_textr+   r)  r    ÚupdateÚ
setdefault)rC  Úoutput_pathÚtemplate_pathÚpayloadÚpayload_jsonÚhtmlÚtemporary_pathÚversion_pathÚversion_tmpÚstatus_pathÚexisting_statusÚ
status_tmps               r    Úwrite_dashboardr™    s^  € Üœ“N×,Ñ,¨XÓ6Ð9IÑI€MØÒQ ×!4Ñ!4°{Ñ!BÀ\Ñ!Q€KØ×Ñ×Ñ T°DÐÔ9Ü% hÓ/€GÜ—:‘:˜g°EÀjÔQ×YÑYÐZ^Ð`fÓg€LØ×"Ñ"¨GÐ"Ó4×<Ñ<Ð=QÐS_Ó`€DØ ×*Ñ*¨k×.>Ñ.>Ð-?¸tÐ+DÓE€NØ×Ñ˜d¨WÐÔ5Ø×Ñ˜;Ô'Ø×(Ñ(¨Ó8€LØ×(Ñ(¨L×,=Ñ,=Ð+>¸dÐ)CÓD€KØ×ÑÜ�
‰
à" 7Ñ+Ø  Ñ)Ø& }Ñ5Ø ™Ø% lÑ3ñð Øô
	
ð ð ô ð ×Ñ˜Ô%Ø×'Ñ'Ð(<Ó=€KØMX×M_ÑM_ÔMa”d—j‘j ×!6Ñ!6ÀÐ!6Ó!HÔIÐgi€OØ×Ñ˜7Ó# yÒ0Ø×ÑØØ" =Ñ1Ø#Ø.Ø˜WÑ%Ø˜wÑ'ñ 
ô 	ð 	×"Ñ" ;°¸Ñ0FÔGØ ×*Ñ*¨k×.>Ñ.>Ð-?¸tÐ+DÓEˆ
Ø×ÑœdŸj™j¨ÀuÐUVÔWÐbiÐÔjØ×Ñ˜;Ô'ØÐr"   )r÷   )r   r   r   r%  rœ   zfloat | None)rÝ   )r   r   r'   r%   rœ   r%   )r.   r   rœ   zpd.DataFrame)rC  r   rœ   zdict[str, Any])N)rC  r   rŽ  zPath | Nonerœ   r   )Ú
__future__r   r(  Úpathlibr   Útypingr   r=  Úpandasr   Úconfigr   r0  r!   r(   r/   rr  r™  © r"   r    Ú<module>r      s[   ðÝ "ã Ý Ý Û ã å ð $ØØ&ØØØ ØØØ"ñ
€ôEô
Ró/óSõl
*r"   