Ë
    vN¦je  ã                  óŽ   — 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mZ dZ ed¬	«       G d
„ d«      «       Zddd„Zdd„Zy)é    )Úannotations)Ú	dataclass)ÚPathNé   )ÚSettingsz0.1.0T)Úfrozenc                  ó,   — e Zd ZU ded<   ded<   ded<   y)ÚQualitySignalResultÚintÚrowsÚcoveredr   Úoutput_pathN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú>C:\FundamentalWorkbench\src\fundamental_mvp\quality_signals.pyr
   r
      s   … à
ƒIØƒLØÔr   r
   c                óú   — t        j                  | |   d¬«      j                  t        j                  t        j                   gt        j
                  «      }|j                  | d   «      j                  d|¬«      S )NÚcoerce)ÚerrorsÚindustry_l2_codeT)ÚpctÚ	ascending)ÚpdÚ
to_numericÚreplaceÚnpÚinfÚnanÚgroupbyÚrank)ÚframeÚcolumnÚhigherÚvaluess       r   Ú_industry_rankr(      s^   € Ü�]‰]˜5 ™=°Ô:×BÑBÄBÇFÁFÌRÏVÉVÈGÐCTÔVX×V\ÑV\Ó]€FØ�>‰>˜%Ð 2Ñ3Ó4×9Ñ9¸dÈfÐ9ÓUÐUr   c                ó¸  ‡— t        j                  | j                  dz  «      }t        j                  | j                  «      }t        j                  |d   j                  «       «      }|j                  |d   j                  d«      |d   j                  |«      z     j                  ddg«      j                  dd¬«      j                  d	«      }|d
   j                  d«      |d<   |d   j                  d«      |d<   |j                  d«      j                  dddd¬«      j                  «       }|j!                  |dd¬«      Š‰d   ‰d   j#                  dt$        j&                  «      z  ‰d<   ‰d   ‰d   j#                  dt$        j&                  «      z  ‰d<   ‰d    ‰d<   g d¢}g d¢}g d ¢}dEˆfd!„}	 |	|«      \  ‰d"<   }
 |	|«      \  ‰d#<   } |	|«      \  ‰d$<   }t        j(                  |
||gd%¬&«      j+                  d%¬&«      ‰d'<   ‰d   j-                  d(«      }t$        j&                  ‰j                  |d"f<   t$        j&                  ‰j                  ‰d)   g d*¢f<   t        j.                  ‰d"   t$        j0                   d+d,d-t$        j0                  gg d.¢d¬/«      j3                  d0«      ‰d1<   t        j.                  ‰d#   t$        j0                   d+d,d-t$        j0                  gg d.¢d¬/«      j3                  d0«      ‰d2<   t%        j4                  ‰d'   j                  d3«      d4d5«      ‰d6<   t%        j6                  ‰d)   |gd7d8gd4¬9«      ‰d:<   g d;¢}‰|   j9                  «       }t:        |d<<   | j                  d=z  }|j=                  |d¬>«       |j?                  | j                  d?z  dd@¬A«       tA        jB                  tE        | jF                  dBz  «      «      5 }|jI                  dC|«       |jK                  dD«       d d d «       tM        tO        |«      tQ        |d'   j                  d3«      jS                  «       «      |«      S # 1 sw Y   ŒHxY w)FNzfundamental_scores.parquetÚavailable_trade_dateÚperiod_typeÚFYÚsource_codeÚreport_periodF)Ú
group_keysé   Úparent_net_profit_ytdr   Úis_profitableÚweighted_roe_reportedé
   Úroe_above_10)r.   Úsize)r2   Úsum)r5   r7   )Úgross_margin_reportedÚstd)Úannual_observations_5yÚprofitable_years_5yÚroe_above_10_years_5yÚgross_margin_stability_5yÚleft)ÚonÚhowr;   r:   Úprofit_persistencer<   Úroe_persistencer=   Úmargin_stability))r3   T)r8   T©Úcfo_to_parent_profitT)Úasset_turnover_reportedT)rA   T)rB   T)rC   T))Úresearch_development_ratioT)Úoperating_revenue_yoy_reportedT)Únet_profit_yoy_reportedT)Úrevenue_cagr_3yT)Úparent_profit_cagr_3yT)rD   )Úparent_equity_yoyT)Úwarning_countF)Úgoodwill_equity_ratioFc                óæ   •— t        j                  | D ��cg c]  \  }}t        ‰||«      ‘Œ c}}d¬«      }|j                  dd¬«      dz  |j	                  «       j                  d¬«      fS c c}}w )Nr   ©ÚaxisT)rQ   Úskipnaéd   )r   Úconcatr(   ÚmeanÚnotna)Úspecsr%   r&   Úmatrixr$   s       €r   Ú	compositez(build_quality_signals.<locals>.composite?   sk   ø€ Ü—‘ÑX]Ô^ÑX]ÁnÀfÈfœN¨5°&¸&ÕAÐX]Ò^ÐefÔgˆØ�{‰{ ¨$ˆ{Ó/°#Ñ5°v·|±|³~×7JÑ7JÐPQÐ7JÓ7RÐRÐRùó _s   –A-
Úmoat_quant_proxy_scoreÚinnovation_quant_proxy_scoreÚmanagement_quant_proxy_scorer   rP   Úquality_signal_coverageé   Úis_financial_sector)rZ   r[   r\   r]   é(   é<   éK   )u   å¼±u   ä¸€èˆ¬u   è¾ƒå¼ºu   å¼º)ÚlabelsÚrightÚstringÚmoat_proxy_levelÚinnovation_proxy_levelgffffffæ?ÚQUANTITATIVE_PROXY_ONLYÚ"INSUFFICIENT_QUANTITATIVE_EVIDENCEÚevidence_statusÚFINANCIAL_MODEL_NOT_APPLICABLEÚINSUFFICIENT_HISTORY)ÚdefaultÚmoat_evidence_status)Úsecurity_idr-   Únamer   Úindustry_l2_namerZ   rf   r[   rg   r\   r]   r:   r;   r<   r=   rj   rn   Úmodel_versionzquality_signal_proxies.parquet)Úindexzquality_signal_proxies.csvz	utf-8-sig)rs   Úencodingzfundamental_mvp.duckdbÚ
quality_dfzJCREATE OR REPLACE TABLE quality_signal_proxies AS SELECT * FROM quality_df)rW   zlist[tuple[str, bool]]Úreturnztuple[pd.Series, pd.Series])*r   Úread_parquetÚprocessed_dirÚfinancial_pit_pathÚ	TimestampÚmaxÚlocÚeqÚleÚsort_valuesr"   ÚtailÚgtÚgeÚaggÚreset_indexÚmerger   r   r!   rT   rU   ÚltÚcutr    ÚastypeÚwhereÚselectÚcopyÚQUALITY_SIGNAL_VERSIONÚ
to_parquetÚto_csvÚduckdbÚconnectÚstrÚdatabase_dirÚregisterÚexecuter
   Úlenr   r7   )ÚsettingsÚscoresÚfinanceÚas_ofÚannualÚhistoryÚmoat_columnsÚinnovation_columnsÚmanagement_columnsrY   Úmoat_coverageÚinnovation_coverageÚmanagement_coverageÚinsufficient_moat_historyÚoutput_columnsÚoutputÚpathÚ
connectionr$   s                     @r   Úbuild_quality_signalsr§      s~  ø€ Ü�_‰_˜X×3Ñ3Ð6RÑRÓS€FÜ�o‰o˜h×9Ñ9Ó:€GÜ�L‰L˜Ð 6Ñ7×;Ñ;Ó=Ó>€EØ�[‰[Ø�Ñ×!Ñ! $Ó'¨'Ð2HÑ*I×*LÑ*LÈUÓ*SÑSñç�k�= /Ð2Ó3·G±G¸MÐV[°GÓ4\×]aÑ]aÐbcÓ]dð ð %Ð%<Ñ=×@Ñ@ÀÓC€Fˆ?ÑØ#Ð$;Ñ<×?Ñ?ÀÓC€Fˆ>ÑØ�n‰n˜]Ó+×/Ñ/Ø8Ø4Ø5Ø"Bð	 0ó ÷
 �kƒmð ð �L‰L˜ ]¸ˆLÓ?€EØ"'Ð(=Ñ">ÀÐG_ÑA`×AhÑAhÐijÔln×lrÑlrÓAsÑ"s€EÐ
ÑØ$Ð%<Ñ=ÀÐF^Ñ@_×@gÑ@gÐhiÔkm×kqÑkqÓ@rÑr€EÐ
ÑØ!&Ð'BÑ!CÐ C€EÐ
Ñò€Lò
Ðò
Ðõ
Sñ 6?¸|Ó5LÑ2€EÐ
"Ñ# ]ÙAJÐK]ÓA^Ñ>€EÐ
(Ñ)Ð+>ÙAJÐK]ÓA^Ñ>€EÐ
(Ñ)Ð+>Ü')§y¡y°-ÐATÐViÐ1jÐqrÔ's×'xÑ'xÐ~Ð'xó  (A€EÐ
#Ñ$Ø %Ð&>Ñ ?× BÑ BÀ1Ó EÐÜEGÇVÁV€E‡I�IÐ'Ð)AÐAÑBô 
�‰ð 
‡I�IˆeÐ)Ñ*ò -ð ñ ô !#§¡ØÐ&Ñ'¬2¯6©6¨'°2°r¸2¼r¿v¹vÐ)FÚ1¸ô!÷ �fˆXÓð 
Ð
Ñô ')§f¡fØÐ,Ñ-´·±°¸¸RÀÄRÇVÁVÐ/LÚ1¸ô'÷ �fˆXÓð 
Ð
"Ñ#ô  "Ÿx™xØÐ'Ñ(×+Ñ+¨CÓ0Ð2KÐMqó €EÐ
Ñô %'§I¡IØÐ#Ñ$Ð&?ð/à(Ð*@ÐAÐKdô%f€EÐ
 Ñ!ò€Nð �>Ñ"×'Ñ'Ó)€FÜ4€Fˆ?ÑØ×!Ñ!Ð$DÑD€DØ
×Ñ�d %ÐÔ(Ø
‡M�M�(×(Ñ(Ð+GÑGÈuÐ_j€MÔkÜ	�‰œ˜H×1Ñ1Ð4LÑLÓMÔ	NÐR\Ø×Ñ˜L¨&Ô1Ø×ÑÐgÔh÷ 
Oô œs 6›{¬C°Ð7PÑ0Q×0TÑ0TÐUXÓ0Y×0]Ñ0]Ó0_Ó,`ÐbfÓgÐg÷ 
OÐ	Nús   Ï%$QÑQ)T)r$   zpd.DataFramer%   r‘   r&   Úboolrv   z	pd.Series)r–   r   rv   r
   )Ú
__future__r   Údataclassesr   Úpathlibr   r�   Únumpyr   Úpandasr   Úconfigr   rŒ   r
   r(   r§   r   r   r   Ú<module>r¯      sM   ðÝ "å !Ý ã Û Û å ð !Ð ñ �$Ô÷ð ó ðôVô
Ohr   