
    j                    ~   % S r SSKJr  SSKrSSKJr  SSKJr  SSKr	\R                  " \5      r0 S/ SQ_S/ S	Q_S
/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_SS/_S/ SQ_S / S!Q_S"/ S#Q_S$/ S%Q_S&/ S'Q_/ S(Q/ S)Q/ S*QS+.ErS,\S-'   1 S.krS6S/ jrS7S0 jrS8S1 jrS9S2 jrS:S3 jr " S4 S55      rg);uO   LSEG Workspace data loader — reads bond data from downloaded Excel/CSV files.    )annotationsN)Path)Optionalisin)ISIN
IdentifierzBond IDCUSIPRICname)zInstrument Namez	Bond NameNameDescriptionzSecurity NameBondissuer)zIssuer NameIssuerzCompany NamezIssuer Short Namecoupon)CouponzCoupon Ratez
Coupon (%)zCoupon Rate (%)maturity_date)zMaturity DateMaturityzMaturity (Date)zMat Dateytm)YTMzYield to MaturityYieldzYTM (%)zYield to Maturity (%)ytw)YTWzYield to WorstzYTW (%)oas)OASz
OAS SpreadzOption Adjusted Spreadz	OAS (bps)zOAS Spread (bps)z_spread)zZ-SpreadzZ SpreadZSpreadzZ Spread (bps)zZ-Spread (bps)g_spread)zG-SpreadzG SpreadGSpreadzG Spread (bps)modified_duration)zModified DurationzMod DurationDurationzMod. DurationModDuration	convexity	Convexityrating_moodys)zMoody's RatingzMoody'szMoodys RatingMoodyszMoody's Long-Term	rating_sp)z
S&P RatingzS&Pz	SP RatingzS and P RatingzStandard & Poor'szS&P Long-Termrating_fitch)zFitch RatingFitchzFitch Long-Termprice)Pricez	Bid PricezClean Pricez	Mid Pricez
Last Pricez	Ask Pricecountry)CountryzCountry of RiskzCountry of DomicilezIssuer Country)SectorIndustryzIndustry SectorzGICS SectorzBloomberg Sector)CurrencyCCYCcy)z
Issue SizezAmount OutstandingzFace AmountNotionalzAmt Outstandingsectorcurrency
issue_sizezdict[str, list[str]]_COL_MAP>    -nannonen/a#n/an/a.#value!c                    U R                    Vs0 s H  o"R                  5       U_M     nnU H>  nX@R                   ;   a  Us  $ UR                  5       U;   d  M,  X4R                  5          s  $    g s  snf N)columnslower)dfaliasesc
cols_loweraliass        //root/lseg-credit/backend/app/providers/lseg.py	_find_colrK   '   sb    (*

3
1'')Q,
J3JJL;;=J&kkm,,	 
  4s   A0c                    0 n[         R                  5        H$  u  p#[        X5      nU(       d  M  XB:w  d  M   X!U'   M&     U R                  US9n [          H  nX R                  ;  d  M  S X'   M     U $ )N)rC   )r8   itemsrK   renamerC   )rE   rN   norm_keyrF   founds        rJ   _normalize_dfrQ   1   sj    F%^^-"&5U&$5M . 
6	"B::%BL  I    c                   U c  g [        U [        5      (       a  [        R                  " U 5      (       a  g  [        [	        U 5      R                  SS5      R                  SS5      R                  5       5      $ ! [        [        4 a     g f = f)N,r9   %)	
isinstancefloatpdisnastrreplacestrip
ValueError	TypeError)vals    rJ   	_to_floatr`   >   st    
{#u"''#,,SX%%c2.66sB?EEGHH	" s   AA9 9BBc                t    U c  g [        U 5      R                  5       nUR                  5       [        ;   a  S $ U$ rB   )rZ   r\   rD   _NULL_STRINGS)r_   ss     rJ   _to_strrd   I   s2    
{CA779-4414rR   c                    U R                   R                  5       nUS;   a  [        R                  " U SS9$ US:X  a  [        R                  " U 5      $ [        SU 35      e)N>   .xls.xlsxopenpyxl)engine.csvzUnsupported file type: )suffixrD   rX   
read_excelread_csvr]   )pathrk   s     rJ   
_read_filero   P   sX    [[ F""}}T*55{{4  
.vh7
88rR   c                  2    \ rS rSrSrSS jrS rS	S jrSrg)
LsegDataLoaderY   zBReads and normalizes bond data from LSEG Workspace exported files.c                $    [        U5      U l        g rB   )r   	data_path)selfrt   s     rJ   __init__LsegDataLoader.__init__\   s    irR   c              #  l  #    U R                   R                  5       (       d!  [        R                  SU R                   5        g [	        U R                   R                  5       5       HI  nUR                  R                  5       S;   d  M#  UR                  R                  S5      (       a  ME  Uv   MK     g 7f)Nz!LSEG data path does not exist: %s>   rj   rf   rg   ~)
rt   existsloggerwarningsortediterdirrk   rD   r   
startswith)ru   ps     rJ   _iter_filesLsegDataLoader._iter_files_   sx     ~~$$&&NN>O..01Axx~~#<<QVVEVEVWZE[E[ 2s   BB4	B4+	B4c           
        / nU R                  5        HU  n [        U5      n[        U5      nUR                  U5        [        R                  S[        U5      UR                  5        MW     U(       d  / $ [        R                  " USS9nXUS   R                  5          nUR                  S/SS9n/ nUR                  5        GH@  u  pxUR                  0 S[        US   5      _S	[        US	   5      _S
[        US
   5      _S[!        US   5      _S[        US   5      _S[!        US   5      _S[!        US   5      _S[!        US   5      _S[!        US   5      _S[!        US   5      _S[!        US   5      _S[!        US   5      _S[        US   5      _S[        US   5      _S[        US   5      _S[!        US   5      _S[        US   5      _[        US   5      [        US   5      [!        US   5      S.E5        GMC     [        R                  S[        U5      5        U$ ! [         a-  n[        R                  SUR                  U5         SnAGMG  SnAff = f)zCReturn a list of normalized bond dicts from all files in data_path.zLSEG: loaded %d rows from %su   LSEG: skipping %s — %sNT)ignore_indexr   last)subsetkeepr   r   r   r   r   r   r   r   r   r    r#   r%   r'   r(   r*   r,   r5   r6   r7   r4   zLSEG: %d unique bonds loaded)r   ro   rQ   appendr{   infolenr   	Exceptionr|   rX   concatnotnadrop_duplicatesiterrowsrd   r`   )	ru   framesrn   rE   exccombinedrecords_rows	            rJ   
load_bondsLsegDataLoader.load_bondsg   s   %'$$&DK%"2&b!:CGTYYO ' I99V$7V,2245++F8&+I'')FANN WS[%9WS[%9 WS]%; Ys8}%=	
  WS-A%B Ys5z%: Ys5z%: Ys5z%: Ys:%? Ys:%? $Ys3F/G%H Ys;/?%@  WS-A%B WS-=%> WS-@%A  Ys7|%<!" WS^%<#$ &-S]%;%,S_%=%.s</@%A)  *0 	2CLAI  K9499cJJKs   AH((
I2!II)rt   N)rt   rZ   )returnz
list[dict])	__name__
__module____qualname____firstlineno____doc__rv   r   r   __static_attributes__ rR   rJ   rq   rq   Y   s    L)-rR   rq   )rE   pd.DataFramerF   z	list[str]r   Optional[str])rE   r   r   r   )r   zOptional[float])r   r   )rn   r   r   r   )r   
__future__r   loggingpathlibr   typingr   pandasrX   	getLoggerr   r{   r8   __annotations__rb   rK   rQ   r`   rd   ro   rq   r   rR   rJ   <module>r      sL   U "    			8	$"
J"
i" W" S	"
 U" 
b" 
=" 
i" `" N" j" +" f" s" E"  f!"" `#"$ f3k)"
 . K
59; ;rR   