Ë
    Gû§j²R  ã                  óô   — d dl mZ d dlmZ d dlmZ d dl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dlmZ ddlmZmZmZm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„Z$y)!é    )Úannotations)ÚCounter)ÚdateN)ÚPathé   )ÚSettings)Úcanonical_idÚload_tdx_research_industryÚload_tdx_security_namesÚscan_stock_day_filesc                óä   — | j                  «       si S t        j                  | j                  d¬«      «      }|j	                  «       D ��ci c]  \  }}|j                  dd«      |“Œ c}}S c c}}w )Núutf-8©ÚencodingÚ.Ú )ÚexistsÚjsonÚloadsÚ	read_textÚitemsÚreplace)ÚpathÚrawÚkeyÚvalues       ú8C:\FundamentalWorkbench\src\fundamental_mvp\inventory.pyÚ_load_legacy_namesr      s[   € Ø�;‰;Œ=Øˆ	Ü
�*‰*�T—^‘^¨W�^Ó5Ó
6€CØ:=¿)¹)¼+ÔF¹+©J¨C°ˆC�K‰K˜˜RÓ  %Ñ'¸+ÒFÐFùÓFs   ÁA,c                ó¾  — d}d}d}d}	 | j                  ddd¬«      5 }|j                  «       j                  «       }|D ]   }|j                  «       }|sŒ|dz  }|s|}|}Œ" 	 d d d «       | j                  ||r|j                  dd«      d   nd |r|j                  dd«      d   nd || j                  «       j                  d	œS # 1 sw Y   ŒbxY w# t        $ r Y Œpw xY w)
Nr   r   Úrr   r   )r   Úerrorsr   Ú,©Úsource_codeÚlegacy_csv_rowsÚlegacy_csv_first_dateÚlegacy_csv_last_dateÚlegacy_csv_headerÚlegacy_csv_size)ÚopenÚreadlineÚstripÚOSErrorÚstemÚsplitÚstatÚst_size)r   ÚheaderÚfirstÚlastÚrowsÚhandleÚlineÚtexts           r   Ú	_csv_edger9      sî   € Ø€FØ€EØ€DØ€DðØ�Y‰Y�s W°YˆYÔ?À6Ø—_‘_Ó&×,Ñ,Ó.ˆFÛ�Ø—z‘z“|�ÙØØ˜‘	�ÙØ �EØ‘ñ ÷ @ð —y‘yØÙ;@ §¡¨S°!Ó!4°QÒ!7ÀdÙ9= §
¡
¨3°Ó 2°1Ò 5À4Ø#ØŸ9™9›;×.Ñ.ñð ÷ @Ð?ûô ò Ùðús)   ŠC žACÁ#C ÃCÃ	C Ã	CÃCc           
     óú  — t        | j                  d«      «      D �cg c])  }|j                  j                  d«      rŒt	        |«      ‘Œ+ }}|s”t        j                  t        j                  d¬«      t        j                  d¬«      t        j                  d¬«      t        j                  d¬«      t        j                  d¬«      t        j                  d¬«      dœ«      S t        j                  |«      S c c}w )Nz*.csvÚidx_Úobject©ÚdtypeÚint64r#   )ÚsortedÚglobÚnameÚ
startswithr9   ÚpdÚ	DataFrameÚSeries)Údata_dirr   Úrecordss      r   Úaudit_legacy_csvrI   5   s¹   € Ü+1°(·-±-ÀÓ2HÔ+IÓnÑ+I 4ÐQU×QZÑQZ×QeÑQeÐflÕQmŒy˜�Ð+I€GÐnÙô
 �|‰|ÜŸ9™9¨8Ô4Ü!Ÿy™y¨wÔ7Ü%'§Y¡Y°XÔ%>Ü$&§I¡I°HÔ$=Ü!#§¡°Ô!:Ü!Ÿy™y¨wÔ7ñ
ó ð 	ô �<‰<˜Ó Ð ùò os
   � C8¾C8c                óÒ  — g }t        j                  |j                  «       d«      }| D ]¦  }t        j                  |«      r|j                  d «       Œ*t        j                  t        j                  |«      j                  «       j                  «       d«      }|j                  t        t        t        j                  ||«      «      d«      «       Œ¨ t        j                  |d¬«      S )NÚDr   ÚInt64r=   )ÚnpÚ
datetime64Ú	isoformatrD   ÚisnaÚappendÚ	Timestampr   ÚmaxÚintÚbusday_countrF   )Ú	last_dateÚtodayÚvaluesÚendr   Ústarts         r   Ú_business_days_later[   G   s£   € Ø€FÜ
�-‰-˜Ÿ™Ó)¨3Ó
/€CÛˆÜ�7‰7�5Œ>Ø�M‰M˜$ÔØÜ—‘œbŸl™l¨5Ó1×6Ñ6Ó8×BÑBÓDÀcÓJˆØ�‰”cœ#œbŸo™o¨e°SÓ9Ó:¸AÓ>Õ?ð ô �9‰9�V 7Ô+Ð+ó    c                óì  — | j                  «       st        j                  dg¬«      ddifS t        j                  | «      j
                  j                  }d|v rd\  }}d\  }}n
d\  }}d\  }}t        j                  | ||||g¬«      }t        j                  ||   d	¬
«      ||<   t        j                  ||   d	¬
«      ||<   t        j                  ||   d	¬
«      ||<   |j                  |d¬«      j                  |df|df|df|df|df¬«      j                  |di¬«      }dt        t        |«      «      t        ||   j                  «       «      ||   j                  «       j!                  «       j#                  «       ||   j%                  «       j!                  «       j#                  «       ||   j%                  «       j!                  «       j#                  «       t        t        |«      «      dœ}||fS )Nr$   ©Úcolumnsr   F)r$   Úreport_period)Úannouncement_dateÚavailable_trade_date)ÚcodeÚperiod)Ú	announcedÚ	availableÚcoerce©r!   )Úas_indexÚsizeÚminrS   )Úfinance_recordsÚfirst_finance_periodÚlatest_finance_periodÚlatest_finance_announcementÚlatest_finance_availableT)r   r5   ÚstocksÚfirst_periodÚlatest_periodÚlatest_announcementÚcolumns_in_cached_dataset)r   rD   rE   ÚpqÚParquetFileÚschemaÚnamesÚread_parquetÚto_datetimeÚgroupbyÚaggÚrenamerT   ÚlenÚnuniquerk   r   rO   rS   )	r   Úavailable_columnsÚcode_colÚ
period_colÚannounced_colÚavailable_colÚfinanceÚgroupedÚsummarys	            r   Ú_finance_summaryr‰   S   sì  € Ø�;‰;Œ=Ü�|‰| ] OÔ4°xÀÐ6GÐGÐGÜŸ™ tÓ,×3Ñ3×9Ñ9ÐØÐ)Ñ)Ø=Ñˆ�*Ø'RÑ$ˆ‘}à/Ñˆ�*Ø'?Ñ$ˆ�}Ü�o‰o˜d¨X°zÀ=ÐR_Ð,`Ôa€GÜŸ.™.¨°Ñ)<ÀXÔN€GˆJÑÜŸ^™^¨G°MÑ,BÈ8ÔT€GˆMÑÜŸ^™^¨G°MÑ,BÈ8ÔT€GˆMÑØ�o‰o˜h°ˆoÓ7×;Ñ;Ø# VÐ,Ø(¨%Ð0Ø)¨5Ð1Ø%2°EÐ$:Ø"/°Ð!7ð <ó ÷ �f�h Ð.€fÓ/ð ð Ü”C˜“LÓ!Ü�g˜hÑ'×/Ñ/Ó1Ó2Ø 
Ñ+×/Ñ/Ó1×6Ñ6Ó8×BÑBÓDØ  Ñ,×0Ñ0Ó2×7Ñ7Ó9×CÑCÓEØ& }Ñ5×9Ñ9Ó;×@Ñ@ÓB×LÑLÓNÜ%(¬Ð->Ó)?Ó%@ñ€Gð �GÐÐr\   c                ó   — t        | dz  dz  j                  d«      «      }|D �cg c]"  }|j                  «       j                  dkD  sŒ!|‘Œ$ }}t	        d„ |D «       d ¬«      }t	        d„ |D «       d¬«      }|j                  «       r|j                  «       j                  nd}t        |«      t        |«      |t        |xr ||kD  «      d	œS c c}w )
NÚvipdocÚcwz	gpcw*.daté   c              3  ó:   K  — | ]  }|j                   d d –— Œ y­w)é   N)r.   ©Ú.0r   s     r   Ú	<genexpr>z%_raw_finance_audit.<locals>.<genexpr>w   s   è ø€ Ð:±6¨4˜Ÿ™ 1 2œ±6ùs   ‚©Údefaultc              3  óP   K  — | ]  }|j                  «       j                  –— Œ  y ­w©N)r0   Úst_mtimer�   s     r   r’   z%_raw_finance_audit.<locals>.<genexpr>x   s   è ø€ Ð@¹°˜Ÿ	™	›×,Õ,¹ùs   ‚$&r   )Úraw_file_countÚusable_raw_file_countÚlatest_usable_report_periodÚcache_older_than_raw_source)	r@   rA   r0   r1   rS   r   r—   r   Úbool)Útdx_rootÚ
cache_pathÚfilesr   ÚusableÚlatest_usableÚnewest_mtimeÚcache_mtimes           r   Ú_raw_finance_auditr¤   t   s¾   € Ü�H˜xÑ'¨$Ñ.×4Ñ4°[ÓAÓB€EÙ$ÓA™u�t¨¯	©	«×(;Ñ(;¸bÓ(@Šd˜u€FÐAÜÑ:±6Ó:ÀDÔI€MÜÑ@¹Ó@È!ÔL€LØ0:×0AÑ0AÔ0C�*—/‘/Ó#×,Ò,È€Kä˜e›*Ü!$ V£Ø'4Ü'+¨KÒ,V¸LÈ;Ñ<VÓ'Wñ	ð ùò	 Bs   ¥"CÁCc                óF  — t        | j                  «      }|st        d| j                  › �«      ‚t        j                  |D �cg c]  }|j
                  ‘Œ c}«      j                  d¬«      }t        j                  |d   d¬«      |d<   t        j                  |d   d¬«      |d<   t        | j                  dz  «      }t        | j                  «      }t        | j                  «      }t        | j                  «      }| j                  j                  «       r| j                  n| j                  }t!        |«      \  }	}
|d	   j#                  t$        «      |d
<   |d	   j&                  d d j&                  j)                  «       |d<   |d	   j&                  dd  |d<   |d	   j#                  |«      |d<   |d	   j#                  |«      |d<   |d   j+                  |d   «      |d<   t-        j.                  |d   j1                  «       |d   j1                  «       gddgd¬«      |d<   t        j                  j3                  |d¬«      j5                  d	«      j7                  «       }|j9                  |d	d¬«      }|j9                  |d	d¬«      }|j9                  |	d	d¬«      }|d   j;                  «       }t=        |d   t?        j@                  «       «      |d<   |d   jC                  «       |d   jE                  d«      z  |d<   |d   jG                  d«      j&                  jI                  ddd¬ «      |d!<   |d"   j1                  «       |d#<   |d$   jG                  d%«      jK                  d%«      |d&<   |d'   jG                  d%«      jK                  d%«      |d(<   |d)   jM                  | jN                  «      |d*<   |d+   jG                  d%«      jM                  | jP                  «      |d,<   |d   jE                  |«      |d-<   |d   jG                  d.«      jS                  | jT                  «      |d/<   |d    |d!    z  |d0   z  |d1   z  |d-   z  |d*   z  |d,   z  |d#   z  |d&   z  |d2<   d3|d4<   d5|d6<   |jW                  ddg«      j7                  d¬7«      }g }|d   |d!   |d0    |d1    |d-    |d*    |d,    |d#    |d&    d8œ	}d9d:d9d9d:d;d;d9d:d8œ	}|jY                  «       D ]Z  \  }}|jZ                  |d
d	gf   j]                  d¬<«      D ]/  }|j_                  |j`                  |jb                  |||   d=œ«       Œ1 Œ\ t        j                  |g d=¢¬«      }te        | j                  |«      }| jf                  j                  «       }g d>¢}|r|ji                  d%d?«       n|ji                  d%d@«       i dAt?        j@                  «       jk                  «       “dB|j?                  «       jk                  «       “dCtm        t-        jn                  t-        jp                  |j?                  «       «      t-        jp                  t?        j@                  «       «      «      «      “dDtm        ts        |«      «      “dEtm        |d   jE                  dF«      ju                  «       «      “dGtm        |d   jE                  dH«      ju                  «       «      “dItm        |d    ju                  «       «      “dJtm        |d!   ju                  «       «      “dKtm        |d#   ju                  «       «      “dLtm        |dM   jw                  «       «      “dNtm        |d"   jw                  «       «      “dOtm        |dP   jw                  «       «      “dQtm        |d&   ju                  «       «      “dRtm        |d(   ju                  «       «      “d2tm        |d2   ju                  «       «      “dS|jY                  «       D ��ci c]  \  }}|tm        |ju                  «       «      “Œ! c}}“dT|
“|||dUœ¥}|||fS c c}w c c}}w )VNu$   æ²¡æœ‰æ‰¾åˆ°é€šè¾¾ä¿¡è‚¡ç¥¨æ—¥çº¿ï¼šr   r^   Ú
first_daterg   rh   rV   z
names.jsonr$   Úsecurity_idé   Úexchangerc   Útdx_nameÚlegacy_namerB   Útdx_security_table_currentÚlegacy_tencent_names_snapshotÚmissingr“   Úname_sourceÚindex)ÚorientÚleft)ÚonÚhowÚbusiness_days_staler   Úis_name_missingu   (?:\*?ST|é€€)FT)ÚcaseÚregexÚis_st_currentÚindustry_l2_codeÚhas_industryrl   r   Úhas_financer%   Úhas_legacy_csvÚrecord_countÚlisted_250_daysÚavg_amount_20Úliquidity_passÚis_current_to_market_cutoffiç  Úprice_fresh_enoughÚrecord_size_validÚlatest_ohlc_validÚbasic_pool_eligibleÚtdx_unadjusted_dayÚprice_sourceÚtdx_research_industry_currentÚindustry_source)Údrop)	Úmissing_nameÚcurrent_st_or_delisting_labelÚinvalid_day_record_sizeÚinvalid_latest_ohlcÚprice_behind_market_cutoffÚless_than_min_trading_daysÚbelow_liquidity_floorÚmissing_industryÚmissing_financeÚerrorÚwarningÚinfo©r°   )r§   r$   Ú
issue_codeÚseverity)u#   å��ç§°å’ŒSTæ ‡ç­¾å�ªæœ‰å½“å‰�å¿«ç…§uE   è¡Œä¸šæ˜ å°„å�ªæœ‰å½“å‰�ç‰ˆæœ¬ï¼ŒåŽ†å�²å›žæµ‹å­˜åœ¨æˆ�åˆ†ç©¿è¶Šé£Žé™©uH   è´¢åŠ¡ç¼“å­˜ä¸�æ˜¯çœŸæ­£çš„åŽ†å�²ç‰ˆæœ¬å¿«ç…§ï¼Œå�Žç»­é‡�è¿°å°šæœªè§£å†³u]   å®¡è®¡ä¸Žç›‘ç®¡é£Žé™©ç›®å‰�ä¾�æ�®è¿‘ä¸¤å¹´é£Žé™©å…¬å‘Šæ ‡é¢˜è¯†åˆ«ï¼Œå°šé�žå®Œæ•´ç›‘ç®¡æ¡£æ¡ˆuB   è‚¡æ�ƒè´¨æŠ¼ä¸ºå½“å‰�å¿«ç…§ï¼Œè§£ç¦�å’Œå¤§è‚¡ä¸œå‡�æŒ�å°šæœªæŽ¥å…¥uO   å‰�å¤�æ�ƒæ�¥è‡ªæœ¬åœ°gbbqä»¿å°„æ¨¡åž‹ï¼Œæž�æ—©æœŸé�žæ­£ä»·æ ¼åŒºé—´å¿…é¡»ç¦�ç”¨u!   é€šè¾¾ä¿¡æ—¥çº¿ä¸ºæœªå¤�æ�ƒä»·æ ¼Úrun_dateÚmarket_data_cutoffÚmarket_data_business_days_staleÚstock_day_filesÚ	sh_stocksÚSHÚ	sz_stocksÚSZÚnamed_stocksÚcurrent_st_or_delisting_labelsÚindustry_mapped_stocksÚindustry_l1_countÚindustry_l1_codeÚindustry_l2_countÚindustry_l3_countÚindustry_l3_codeÚfinance_covered_stocksÚlegacy_csv_covered_stocksÚissue_countsÚfinance_cache)Úfinance_rawÚstandardized_price_availableÚlimitations)<r   r�   ÚRuntimeErrorrD   rE   Ú__dict__rË   r{   r   Úlegacy_data_dirr   r
   rI   Úfinancial_pit_pathr   Úlegacy_finance_parquetr‰   Úmapr	   ÚstrÚupperÚcombine_firstrM   ÚselectÚnotnaÚ	from_dictÚrename_axisÚreset_indexÚmergerS   r[   r   rW   rP   ÚeqÚfillnaÚcontainsÚgtÚgeÚmin_trading_daysÚmin_avg_amount_20ÚleÚmax_business_day_stalenessÚsort_valuesr   ÚlocÚ
itertuplesrQ   r§   r$   r¤   Údaily_price_pathÚinsertrO   rT   rU   rN   r   Úsumr€   )ÚsettingsÚdayÚitemÚday_dfÚlegacy_namesÚ	tdx_namesÚ
industriesÚlegacyÚfinance_pathÚfinance_by_stockÚfinance_statsÚindustry_dfÚmasterÚcurrent_cutoffÚ
issue_rowsÚchecksrÚ   rÙ   ÚmaskÚrowÚissuesÚraw_financeÚprice_builtrñ   r   rˆ   s                             r   Úbuild_security_masterr%  ‚   s¯  € Ü
˜x×0Ñ0Ó
1€CÙÜÐAÀ(×BSÑBSÐATÐUÓVÐVÜ�\‰\±SÓ9±S¨T˜4Ÿ=›=°SÑ9Ó:×?Ñ?ÈÐ?ÓO€FÜŸ>™>¨&°Ñ*>ÀxÔP€Fˆ<ÑÜŸ.™.¨°Ñ)<ÀXÔN€Fˆ;Ñä% h×&>Ñ&>ÀÑ&MÓN€LÜ'¨×(9Ñ(9Ó:€IÜ+¨H×,=Ñ,=Ó>€JÜ˜h×6Ñ6Ó7€FØ2:×2MÑ2M×2TÑ2TÔ2V�8×.Ò.Ð\d×\{Ñ\{€LÜ&6°|Ó&DÑ#Ð�mà" =Ñ1×5Ñ5´lÓC€Fˆ=ÑØ Ñ.×2Ñ2°2°AÐ6×:Ñ:×@Ñ@ÓB€Fˆ:ÑØ˜MÑ*×.Ñ.¨q¨rÐ2€Fˆ6�NØ Ñ.×2Ñ2°9Ó=€Fˆ:ÑØ" =Ñ1×5Ñ5°lÓC€Fˆ=ÑØ˜JÑ'×5Ñ5°f¸]Ñ6KÓL€Fˆ6�NÜŸI™IØ	�
Ñ	×	!Ñ	!Ó	# V¨MÑ%:×%@Ñ%@Ó%BÐCØ	%Ð'FÐGØô€Fˆ=Ñô
 —,‘,×(Ñ(¨¸GÐ(ÓD×PÑPÐQ^Ó_×kÑkÓm€KØ�\‰\˜+¨-¸Vˆ\ÓD€FØ�\‰\˜& ]¸ˆ\Ó?€FØ�\‰\Ð*¨}À&ˆ\ÓI€Fà˜KÑ(×,Ñ,Ó.€NÜ$7¸¸{Ñ8KÌTÏZÉZË\Ó$Z€FÐ Ñ!Ø & v¡× 3Ñ 3Ó 5¸¸v¹×8IÑ8IÈ"Ó8MÑ M€FÐÑØ$ V™n×3Ñ3°BÓ7×;Ñ;×DÑDÐEUÐ\aÐimÐDÓn€Fˆ?ÑØ#Ð$6Ñ7×=Ñ=Ó?€Fˆ>ÑØ"Ð#4Ñ5×<Ñ<¸QÓ?×BÑBÀ1ÓE€Fˆ=ÑØ%Ð&7Ñ8×?Ñ?ÀÓB×EÑEÀaÓH€FÐÑØ & ~Ñ 6× 9Ñ 9¸(×:SÑ:SÓ T€FÐÑØ% oÑ6×=Ñ=¸aÓ@×CÑCÀH×D^ÑD^Ó_€FÐÑØ,2°;Ñ,?×,BÑ,BÀ>Ó,R€FÐ(Ñ)Ø#)Ð*?Ñ#@×#GÑ#GÈÓ#L×#OÑ#OÐPX×PsÑPsÓ#t€FÐÑ à	Ð!Ñ	"Ð"Ø�/Ñ"Ð
"ñ	#à
Ð$Ñ
%ñ	&ð Ð$Ñ
%ñ	&ð Ð.Ñ
/ñ		0ð
 Ð"Ñ
#ñ	$ð Ð!Ñ
"ñ	#ð �Ñ
 ñ	!ð �Ñ
ñ	 ð Ð Ñ!ð 2€Fˆ>ÑØ ?€FÐÑØ×Ñ ¨VÐ 4Ó5×AÑAÀtÐAÓL€Fà*,€JàÐ0Ñ1Ø)/°Ñ)@Ø$*Ð+>Ñ$?Ð#?Ø &Ð':Ñ ;Ð;Ø'-Ð.KÑ'LÐ&LØ'-Ð.?Ñ'@Ð&@Ø"(Ð)9Ñ":Ð!:Ø# NÑ3Ð3Ø" =Ñ1Ð1ñ
€Fð  Ø)2Ø#*Ø&Ø&/Ø&,Ø!'Ø#Ø$ñ
€Hð #ŸL™LžNÑˆ
�DØ—:‘:˜d ]°MÐ$BÐBÑC×NÑNÐUZÐNÖ[ˆCØ×Ñ¨c¯o©oÈcÏoÉoØ-7ÀXÈjÑEYñ[õ \ñ \ð +ô �\‰\˜*Ò.fÔg€Fä$ X×%6Ñ%6¸ÓE€KØ×+Ñ+×2Ñ2Ó4€Kò€Kñ Ø×Ñ˜1ÐoÕpà×Ñ˜1ÐAÔBðØ”D—J‘J“L×*Ñ*Ó,ðà˜n×1Ñ1Ó3×=Ñ=Ó?ðð 	*¬3¬r¯©¼r¿}¹}È^×M`ÑM`ÓMbÓ?cÔeg×erÑerÔsw×s}Ñs}Ósó  fAó  0Bó  ,Cðð 	œ3œs 6›{Ó+ð	ð
 	”S˜ 
Ñ+×.Ñ.¨tÓ4×8Ñ8Ó:Ó;ðð 	”S˜ 
Ñ+×.Ñ.¨tÓ4×8Ñ8Ó:Ó;ðð 	œ˜fÐ%6Ñ7Ð7×<Ñ<Ó>Ó?ðð 	)¬#¨f°_Ñ.E×.IÑ.IÓ.KÓ*Lðð 	!¤# f¨^Ñ&<×&@Ñ&@Ó&BÓ"Cðð 	œS Ð(:Ñ!;×!CÑ!CÓ!EÓFðð 	œS Ð(:Ñ!;×!CÑ!CÓ!EÓFðð 	œS Ð(:Ñ!;×!CÑ!CÓ!EÓFðð 	!¤# f¨]Ñ&;×&?Ñ&?Ó&AÓ"Bðð 	$¤S¨Ð0@Ñ)A×)EÑ)EÓ)GÓ%Hðð 	œs 6Ð*?Ñ#@×#DÑ#DÓ#FÓGðð  	¸v¿|¹|¼~ÔN¹~±)°#°t˜œc $§(¡(£*›oÑ-¸~ÒNð!ð" 	˜ð#ð$ #Ø(3Ø"ò)€Gð, �6˜7Ð"Ð"ùòk :ùó^ Os   Á`ß!$`
c           
     óÀ  — | g d¢   j                  «       }g }dD ]Š  }d|› d�}d|› d�}|||g   j                  «       j                  |g¬«      j                  d¬«      D ]C  \  }}d }|d	k(  r|d d
 }n|d
k(  rt	        |«      dk\  r|d d n|}|j                  ||||ddœ«       ŒE ŒŒ t        j                  |«      j                  d«      j                  ddg«      }	||	fS )N)	r§   r$   rç   Úindustry_l1_namerº   Úindustry_l2_namerê   Úindustry_l3_namerÊ   )r   r¨   é   Ú
industry_lÚ_codeÚ_name)ÚsubsetFrØ   r¨   r*  é   rÉ   )Úindustry_codeÚindustry_nameÚlevelÚparent_coderÊ   r0  r2  )	ÚcopyÚdrop_duplicatesÚdropnar  r   rQ   rD   rE   r
  )
r  Úcurrentr5   r2  r‚   Úname_colrc   rB   ÚparentÚ	dimensions
             r   Úbuild_industry_tablesr;  þ   s  € Øò ñ ÷ �tƒvð	 ð
 %'€DÛˆØ ˜w eÐ,ˆØ ˜w eÐ,ˆØ! 8¨XÐ"6Ñ7×GÑGÓI×PÑPÐYaÐXbÐPÓc×nÑnÐuzÐnÖ{‰JˆD�$ØˆFØ˜ŠzØ˜b˜q˜‘Ø˜!’Ü%(¨£Y°!¢^˜˜b˜q™¸�Ø�K‰K¨$ÀÐPUØ(.ÐCbñdõ eñ |ð ô —‘˜TÓ"×2Ñ2°?ÓC×OÑOÐQXÐZiÐPjÓk€IØ�IÐÐr\   c                ó`  — |j                  dd¬«      j                  «       j                  d¬«      j                  d«      }dj	                  d„ |j                  «       D «       «      }dj	                  d„ t        |d	   «      j                  «       D «       «      }| d
   dkD  rdnd}| d   d   rdnd}| d   j                  dd«      }|dkD  rd|› d�nd}	| d   d   rdnd}
| j                  d«      rdnd}dj	                  g d‘| d    › ‘d!‘| d"   › ‘d#‘| d
   › ‘d$‘|› ‘d%‘| d&   › ‘d'‘| d(   › ‘d)‘| d*   › ‘d+‘| d,   › ‘d-‘| d.   › ‘d/‘| d0   › ‘d1‘| d2   › ‘d3‘| d4   › ‘d5‘| d6   › ‘d7‘| d8   › ‘d9‘| d:   › ‘d;‘|› ‘d<‘| d   j                  d=d«      › ‘d>‘| d   j                  d?d«      › ‘d@‘| d   j                  dA«      › ‘dB‘| d   j                  dC«      › ‘dD‘| d   j                  dE«      › ‘dF‘| d   dG   › ‘dH‘| d   dI   › ‘dJ‘| d   dK   › ‘dL‘|› ‘dM‘|	› ‘dN‘|› ‘dO‘|› ‘d‘|
› ‘dP‘«      S )QNr(  F)r6  )Ú	ascendingé   Ú
c              3  óX   K  — | ]"  \  }}d t        |«      › dt        |«      › d�–— Œ$ y­w©z| z | z |N)rø   rT   )r‘   rB   Úcounts      r   r’   z#_markdown_report.<locals>.<genexpr>  s.   è ø€ ÐfÑOeÁÀÀe˜Bœs 4›y˜k¨¬S°«Z¨L¸Ô;ÑOeùs   ‚(*c              3  óF   K  — | ]  \  }}d |› dt        |«      › d�–— Œ y­wrA  )rT   )r‘   rc   rB  s      r   r’   z#_markdown_report.<locals>.<genexpr>  s,   è ø€ ð Ù8c©¨¨uˆ"ˆTˆF�#”c˜%“j�\ Ô$Ñ8cùs   ‚!rÙ   rÝ   r¨   u	   ä¸�é€šè¿‡u   é€šè¿‡rï   r›   u   æ˜¯u   å�¦rî   ru   r   é2   u+   å½“å‰�å·²é‡�å»ºæ‰©å±•è´¢åŠ¡å­—æ®µé›†ï¼Œå…± u=    åˆ—ï¼›ä¸‹ä¸€æ­¥è¿›å…¥æ´¾ç”ŸæŒ‡æ ‡å’Œåˆ†è¡Œä¸šå�£å¾„å¤„ç�†ã€‚uf   å½“å‰�ä»�æ˜¯ç®€åŒ–è´¢åŠ¡å­—æ®µé›†ï¼Œä¸‹ä¸€æ­¥å¿…é¡»é‡�æ–°æ‰§è¡Œå…¨å­—æ®µæŠ½å�–å’Œå­—æ®µè´¨é‡�å®¡è®¡ã€‚uE   3. è´¢åŠ¡ç¼“å­˜æ—©äºŽéƒ¨åˆ†åŽŸå§‹ä¸“ä¸šè´¢åŠ¡æ–‡ä»¶ï¼Œéœ€è¦�é‡�å»ºã€‚uT   3. è´¢åŠ¡å­—æ®µå·²é‡�å»ºï¼Œä½†åŽŸå§‹é›¶å€¼ä¸Žç¼ºå¤±å€¼ä»�éœ€æŒ‰å­—æ®µè¯­ä¹‰å¤„ç�†ã€‚rð   u]   2. å‰�å¤�æ�ƒè¡Œæƒ…å·²ç»�ç”Ÿæˆ�ï¼›æ—©æœŸé�žæ­£ä»·æ ¼åŒºé—´å¿…é¡»ç”±å› å­�å¼•æ“Žè‡ªåŠ¨å±�è”½ã€‚uZ   2. æ—¥çº¿æ²¡æœ‰å¤�æ�ƒå› å­�ï¼Œä¸�èƒ½ç›´æŽ¥ç”¨äºŽè·¨é™¤æ�ƒæ—¥æ”¶ç›Šå’Œé•¿æœŸè¶‹åŠ¿è®¡ç®—ã€‚r   u(   # M1 æ•°æ�®è´¨é‡�æŠ¥å‘Š

ç”Ÿæˆ�æ—¥æœŸï¼šrÛ   u     
è¡Œæƒ…æ•°æ�®æˆªæ­¢ï¼šrÜ   u$     
ç›¸å¯¹è¿�è¡Œæ—¥æ»žå�Žå·¥ä½œæ—¥ï¼šu     
è¡Œæƒ…æ–°é²œåº¦é—¸é—¨ï¼š**uN   **

## 1. è¯�åˆ¸ä¸»è¡¨

| æŒ‡æ ‡ | æ•°é‡� |
|---|---:|
| æ—¥çº¿è‚¡ç¥¨æ–‡ä»¶ | rÞ   u    |
| ä¸Šæµ·è‚¡ç¥¨ | rß   u    |
| æ·±åœ³è‚¡ç¥¨ | rá   u    |
| æœ‰å��ç§° | rã   u    |
| å½“å‰� ST/é€€å¸‚æ ‡ç­¾ | rä   u    |
| æœ‰äºŒçº§è¡Œä¸šæ˜ å°„ | rå   u    |
| æœ‰åŽ†å�²è´¢åŠ¡ç¼“å­˜ | rë   u#    |
| é€šè¿‡åˆ�å§‹åŸºç¡€æ± è§„åˆ™ | rÆ   uE   |

è¯´æ˜Žï¼šåŸºç¡€æ± å½“å‰�æŒ‰é�ž STã€�è‡³å°‘ 250 æ ¹æ—¥çº¿ã€�æœ€è¿‘ 20 æ—¥å¹³å�‡æˆ�äº¤é¢�ä¸�ä½ŽäºŽ 5000 ä¸‡å…ƒã€�è¡Œæƒ…è·Ÿä¸Šå¸‚åœºæˆªæ­¢æ—¥ã€�è¡Œä¸šå’Œè´¢åŠ¡å�‡æœ‰è¦†ç›–è¿›è¡Œç­›é€‰ã€‚å…¨å±€è¡Œæƒ…æ–°é²œåº¦ä¸�é€šè¿‡æ—¶ï¼ŒåŸºç¡€æ± å�ªèƒ½è§†ä¸ºåŽ†å�²å¿«ç…§ï¼Œä¸�èƒ½è§†ä¸ºå½“æ—¥ç»“æžœã€‚

## 2. è¡Œä¸šè¦†ç›–

- ä¸€çº§è¡Œä¸šï¼šræ   u    ä¸ªã€‚
- äºŒçº§è¡Œä¸šï¼šrè   u    ä¸ªã€‚
- ä¸‰çº§è¡Œä¸šï¼šré   u‚    ä¸ªã€‚
- åˆ†ç±»å�£å¾„ï¼šé€šè¾¾ä¿¡ç ”ç©¶è¡Œä¸šå½“å‰�æ˜ å°„ï¼Œä¸�æ ‡ç§°ä¸ºå®˜æ–¹ç”³ä¸‡ã€‚

| äºŒçº§è¡Œä¸š | è‚¡ç¥¨æ•° |
|---|---:|
u'   

## 3. è´¢åŠ¡æ•°æ�®

- ç¼“å­˜è¡Œæ•°ï¼šr5   u   ã€‚
- ç¼“å­˜è¦†ç›–è‚¡ç¥¨ï¼šrq   u   ã€‚
- æŠ¥å‘ŠæœŸï¼šrr   u    è‡³ rs   u   ã€‚
- æœ€æ–°å…¬å‘Šæ—¥æœŸï¼šrt   u*   ã€‚
- é€šè¾¾ä¿¡ä¸“ä¸šè´¢åŠ¡åŽŸå§‹æ–‡ä»¶ï¼šr˜   u    ä¸ªï¼Œå…¶ä¸­é�žç©ºå�¯ç”¨ r™   u"    ä¸ªã€‚
- æœ€æ–°é�žç©ºæŠ¥å‘ŠæœŸï¼šrš   u)   ã€‚
- è´¢åŠ¡ç¼“å­˜æ—©äºŽåŽŸå§‹æ–‡ä»¶ï¼š**u   **ã€‚

u>   

## 4. æ•°æ�®é—®é¢˜ç»Ÿè®¡

| é—®é¢˜ | è‚¡ç¥¨æ•° |
|---|---:|
u�   

## 5. å½“å‰�é˜»æ–­é¡¹

1. è¡Œæƒ…æˆªæ­¢æ—¥ç›¸å¯¹è¿�è¡Œæ—¥è¶…è¿‡å…�è®¸é˜ˆå€¼ï¼Œæ­£å¼�æ¯�æ—¥ä»»åŠ¡å¿…é¡»ä¸­æ­¢å¹¶æ��ç¤ºæ›´æ–°é€šè¾¾ä¿¡æ•°æ�®ã€‚
u7  
4. åŽ†å�² ST å’ŒåŽ†å�²è¡Œä¸šæˆ�åˆ†ç¼ºå¤±ï¼ŒåŽ†å�²å›žæµ‹å¿…é¡»æ˜¾ç¤ºé™�åˆ¶æ ‡ç­¾ã€‚
5. å®¡è®¡ã€�å¤„ç½šå’Œèµ„é‡‘å� ç”¨å·²æŽ¥å…¥è¿‘ä¸¤å¹´é£Žé™©å…¬å‘Šæ ‡é¢˜è¯†åˆ«ï¼Œä½†ä»�ä¸�æ˜¯å®Œæ•´ç›‘ç®¡æ¡£æ¡ˆï¼›æœªå‘½ä¸­ä¸�èƒ½è§£é‡Šä¸ºæ— é£Žé™©ã€‚
6. è‚¡æ�ƒè´¨æŠ¼å·²æŽ¥å…¥å½“å‰�å¿«ç…§ï¼›è§£ç¦�å’Œå¤§è‚¡ä¸œå‡�æŒ�å°šæœªè¦†ç›–ã€‚
)	r|   rj   r
  ÚheadÚjoinr   r   Úmost_commonÚget)rˆ   r  r"  Útop_industriesÚ	top_linesÚissue_linesÚ	freshnessÚfinance_staleÚfinance_columnsÚfinance_statusÚfinance_blockerÚprice_blockers               r   Ú_markdown_reportrR    s  € à�‰Ð)°%ˆÓ8×=Ñ=Ó?×KÑKÐV[ÐKÓ\×aÑaÐbdÓeð ð —	‘	ÑfÈ~×OcÑOcÔOeÓfÓf€IØ—)‘)ñ Ü8?ÀÀ|Ñ@TÓ8U×8aÑ8aÔ8cóó €Kð  'Ð'HÑIÈAÒM‘ÐS[€IØ$ ]Ñ3Ð4QÒR‘EÐX]€MØ˜oÑ.×2Ñ2Ð3NÐPQÓR€Oð ˜RÒð 6°oÐ5Fð  GDñ  	Eàpð ð T[Ð[hÑSið  kHò  TIÑOØ^ð ð �;‰;Ð5Ô6ñ 	hàdð ÷
;ó ;ð ð ;à˜
Ñ#Ð$ð;ð%ð;ð Ð2Ñ3Ð4ð;ð5"ð;ð #*Ð*KÑ"LÐ!Mð	;ðNð	;ð
 %˜+ð;ð
&ð;ð  Ð 1Ñ2Ð3ð;ð4ð;ð ˜+Ñ&Ð'ð;ð(ð;ð ˜+Ñ&Ð'ð;ð(ð;ð �~Ñ&Ð'ð;ð(ð;ð $Ð$DÑEÐFð;ðGð;ð  #Ð#;Ñ<Ð=ð!;ð >ð!;ð" #Ð#;Ñ<Ð=ð#;ð">!ð#;ð$ ")Ð)>Ñ!?Ð @ð%;ð$Að%;ð0 Ð-Ñ.Ð/ð1;ð00ð1;ð2 Ð-Ñ.Ð/ð3;ð20ð3;ð4 Ð-Ñ.Ð/ð5;ð40ð5;ð> €ð?;ð>ð?;ðF ˜/Ñ*×.Ñ.¨v°qÓ9Ð:ðG;ðF;ðG;ðH   Ñ0×4Ñ4°X¸qÓAÐBðI;ðHCðI;ðJ �Ñ'×+Ñ+¨NÓ;Ð<ðK;ðJ =BðK;ðJ CJÈ/ÑBZ×B^ÑB^Ð_nÓBoÐApðK;ðJqðK;ðL   Ñ0×4Ñ4Ð5JÓKÐLðM;ðLM'ðM;ðN (/¨}Ñ'=Ð>NÑ'OÐ&PðO;ðN QkðO;ðN lsð  tAñ  lBð  CZñ  l[ð  k\ðO;ðN\ðO;ðP # =Ñ1Ð2OÑPÐQðQ;ðPR&ðQ;ðR '4 _ðS;ðR5ðS;ðV Ð ðW;ðVðW;ðb €ðc;ðbðc;ðl €ðm;ðlðm;ðn Ð ðo;ðnôo;ð ;r\   c           	     ó~  — | j                   dz  }	 dd l}|j                  t        |«      «      5 }|j	                  «       D ]3  \  }}|› d�}|j                  ||«       |j                  d|› d|› �«       Œ5 | j                  j                  «       r:t        | j                  «      j                  dd«      }|j                  d|› d	�«       | j                  j                  «       r:t        | j                  «      j                  dd«      }	|j                  d
|	› d	�«       d d d «       dt        |«      d fS # 1 sw Y   ŒxY w# t        t        f$ rí}
| j                   dz  }t        j                  |«      5 }|j	                  «       D ]n  \  }}|j                  «       }|j                  ddg¬«      j                   D ]#  }||   j"                  j%                  d«      ||<   Œ% |j'                  ||dd¬«       Œp 	 d d d «       n# 1 sw Y   nxY wdt        |«      dt)        |
«      j*                  › d|
› �fcY d }
~
S d }
~
ww xY w)Nzfundamental_mvp.duckdbr   Ú_dfzCREATE OR REPLACE TABLE z AS SELECT * FROM Ú'z''zNCREATE OR REPLACE VIEW financial_statement_pit AS SELECT * FROM read_parquet('z')zBCREATE OR REPLACE VIEW daily_price AS SELECT * FROM read_parquet('Úduckdbzfundamental_mvp.sqlitezdatetime64[ns]Ú
datetimetz)Úincludez%Y-%m-%dr   F)Ú	if_existsr°   Úsqliteu   DuckDB ä¸�å�¯ç”¨ï¼Œå·²é™�çº§ï¼šz: )Údatabase_dirrV  Úconnectrø   r   ÚregisterÚexecuterõ   r   r   r  ÚImportErrorr-   Úsqlite3r4  Úselect_dtypesr_   ÚdtÚstrftimeÚto_sqlÚtypeÚ__name__)r  ÚtablesÚduckdb_pathrV  Ú
connectionÚ
table_nameÚframeÚ	view_namer  Ú
price_pathÚexcÚsqlite_pathÚsafeÚcolumns                 r   Ú_persist_databaserr  k  s,  € Ø×'Ñ'Ð*BÑB€KðiÛØ�^‰^œC Ó,Ô-°Ø%+§\¡\¦^Ñ!�
˜EØ)˜l¨#Ð.�	Ø×#Ñ# I¨uÔ5Ø×"Ñ"Ð%=¸j¸\ÐI[Ð\eÐ[fÐ#gÕhð &4ð ×*Ñ*×1Ñ1Ô3Ü" 8×#>Ñ#>Ó?×GÑGÈÈTÓR�Ø×"Ñ"ð3Ø3?°.ÀðDôð ×(Ñ(×/Ñ/Ô1Ü  ×!:Ñ!:Ó;×CÑCÀCÈÓN�
Ø×"Ñ"ð3Ø3=°,¸bðBô÷ .ð" œ˜[Ó)¨4Ð/Ð/÷# .Ð-ûô$ œÐ!ò iØ×+Ñ+Ð.FÑFˆÜ�_‰_˜[Ô)¨ZØ%+§\¡\¦^Ñ!�
˜EØ—z‘z“|�Ø"×0Ñ0Ð:JÈLÐ9YÐ0ÓZ×bÔb�FØ#'¨¡<§?¡?×#;Ñ#;¸JÓ#G�D˜’Lð cà—‘˜J¨
¸iÈu�ÕUñ	 &4÷ *×)Ñ)úð œ˜[Ó)Ð-LÌTÐRUËY×M_ÑM_ÐL`Ð`bÐcfÐbgÐ+hÐhÕhûðiúsN   ‘E  ¯C/D4ÄE  Ä4D=Ä9E  Å H<Å$H7Å3BG?Ç6	H7Ç?H	È-H7È1H<È7H<c                ó`  — | j                   j                  dd¬«       | j                  j                  dd¬«       | j                  j                  dd¬«       t	        |«      \  }}|j                  | j                   dz  d¬«       |j                  | j                   dz  dd¬«       |j                  | j                   d	z  d¬«       |j                  | j                   d
z  dd¬«       |j                  | j                   dz  dd¬«       |j                  | j                   dz  dd¬«       ||||dœ}t        | |«      \  }}}	|||	dœ|d<   | j                  dz  }
|
j                  t        j                  |dd¬«      d¬«       t        |||«      }| j                  dz  j                  |d¬«       y )NT)ÚparentsÚexist_okzsecurity_master.parquetFrØ   zsecurity_master.csvz	utf-8-sig)r°   r   zindustry_current.parquetzindustry_current.csvzindustry_dimension.csvzdata_quality_issues.csv)Úsecurity_masterÚindustry_currentÚindustry_dimensionÚdata_quality_issue)Úbackendr   Úfallback_reasonÚdatabasezdata_quality_summary.jsonr¨   )Úensure_asciiÚindentr   r   u   M1_æ•°æ�®è´¨é‡�æŠ¥å‘Š.md)Úprocessed_dirÚmkdirr[  Ú
report_dirr;  Ú
to_parquetÚto_csvrr  Ú
write_textr   ÚdumpsrR  )r  r  r"  rˆ   rw  rx  rg  rz  Údatabase_pathr{  Úsummary_pathÚreports               r   Úpersist_outputsr‰  Œ  s¿  € à×Ñ× Ñ ¨¸Ð Ô=Ø×Ñ×Ñ¨°tÐÔ<Ø×Ñ×Ñ d°TÐÔ:Ü+@ÀÓ+HÑ(ÐÐ(à
×Ñ�h×,Ñ,Ð/HÑHÐPUÐÔVØ
‡M�M�(×(Ñ(Ð+@Ñ@ÈÐXc€MÔdØ×Ñ × 6Ñ 6Ð9SÑ SÐ[`ÐÔaØ×Ñ˜H×2Ñ2Ð5KÑKÐSXÐcnÐÔoØ×Ñ˜h×4Ñ4Ð7OÑOÐW\ÐgrÐÔsØ
‡M�M�(×(Ñ(Ð+DÑDÈEÐ\g€MÔhð "Ø,Ø0Ø$ñ	€Fô /@ÀÈ&Ó.QÑ+€Gˆ]˜OØ&-°}ÐYhÑi€GˆJÑà×&Ñ&Ð)DÑD€LØ×ÑœDŸJ™J w¸UÈ1ÔMÐX_ÐÔ`Ü˜g v¨vÓ6€FØ×ÑÐ5Ñ5×AÑAÀ&ÐSZÐAÕ[r\   c                ó@   — t        | «      \  }}}t        | |||«       |S r–   )r%  r‰  )r  r  r"  rˆ   s       r   Úrun_inventoryr‹  ©  s&   € Ü3°HÓ=Ñ€FˆF�GÜ�H˜f f¨gÔ6Ø€Nr\   )r   r   Úreturnzdict[str, str])r   r   rŒ  údict[str, object])rG   r   rŒ  úpd.DataFrame)rV   ú	pd.SeriesrW   r   rŒ  r�  )r   r   rŒ  z&tuple[pd.DataFrame, dict[str, object]])r�   r   rž   r   rŒ  r�  )r  r   rŒ  z4tuple[pd.DataFrame, pd.DataFrame, dict[str, object]])r  rŽ  rŒ  z!tuple[pd.DataFrame, pd.DataFrame])rˆ   r�  r  rŽ  r"  rŽ  rŒ  rø   )r  r   rg  zdict[str, pd.DataFrame]rŒ  ztuple[str, str, str | None])
r  r   r  rŽ  r"  rŽ  rˆ   r�  rŒ  ÚNone)r  r   rŒ  r�  )%Ú
__future__r   Úcollectionsr   Údatetimer   r   Úpathlibr   Úrer`  ÚnumpyrM   ÚpandasrD   Úpyarrow.parquetÚparquetrv   Úconfigr   Útdxr	   r
   r   r   r   r9   rI   r[   r‰   r¤   r%  r;  rR  rr  r‰  r‹  © r\   r   Ú<module>r�     sƒ   ðÝ "å Ý Û Ý Û 	Û ã Û Ý å ß hÓ hóGóó8!ó$	,óóBóy#óxó,TóniðB\Ø.ð\Ø37ó\ô:r\   