Ë
    xWj{  ã                  ó|   — d Z ddlmZ ddlmZmZ ddlmZmZ ddl	Z
ddlZddlZd
d„Ze G d„ d«      «       Zddd	„Zy)a  Data access layer built on yfinance (free Yahoo Finance data).

Everything the strategies need is normalised into a single `StockData`
object so the scoring code never touches yfinance directly. yfinance is
flaky about which fields exist per ticker, so every getter is defensive.
é    )Úannotations)Ú	dataclassÚfield)ÚAnyÚOptionalNc                ó¤   — | €y	 t        | «      }t        j                  |«      st        j
                  |«      ry|S # t        t        f$ r Y yw xY w)z=Coerce a yfinance value to float, or None if missing/garbage.N)ÚfloatÚ	TypeErrorÚ
ValueErrorÚnpÚisnanÚisinf)ÚvalueÚfs     ú+/var/www/html/finance-tool/screener/data.pyÚ_numr      sP   € à€}ØðÜ�%‹Lˆô 
‡x�x�„{”b—h‘h˜q”kØØ€Høô	 ”zÐ"ò Ùðús   …= ½AÁAc                  óØ   — e Zd ZU ded<    ee¬«      Zded<    eej                  ¬«      Z	ded<   dZ
d	ed
<   dZded<   dd„Zedd„«       Zedd„«       Zedd„«       Zedd„«       Zdd„Zy)Ú	StockDataÚstrÚticker)Údefault_factoryÚdictÚinfozpd.DataFrameÚhistoryFÚboolÚokÚ Úerrorc                óJ   — t        | j                  j                  |«      «      S )N)r   r   Úget)ÚselfÚkeys     r   r    zStockData.get'   s   € Ü�D—I‘I—M‘M #Ó&Ó'Ð'ó    c                óŽ   — | j                   j                  d«      xs) | j                   j                  d«      xs | j                  S )NÚ	shortNameÚlongName)r   r    r   ©r!   s    r   ÚnamezStockData.name*   s0   € à�y‰y�}‰}˜[Ó)ÒU¨T¯Y©Y¯]©]¸:Ó-FÒUÈ$Ï+É+ÐUr#   c                ó@   — | j                   j                  d«      xs dS )NÚsectorÚUnknown)r   r    r'   s    r   r*   zStockData.sector.   s   € à�y‰y�}‰}˜XÓ&Ò3¨)Ð3r#   c                óÈ   — | j                  d«      xs | j                  d«      }|€;| j                  j                  s%t        | j                  d   j                  d   «      }|S )NÚcurrentPriceÚregularMarketPriceÚCloseéÿÿÿÿ)r    r   Úemptyr   Úiloc)r!   Úps     r   ÚpricezStockData.price2   sS   € à�H‰H�^Ó$ÒF¨¯©Ð1EÓ(FˆØˆ9˜TŸ\™\×/Ò/Ü�T—\‘\ 'Ñ*×/Ñ/°Ñ3Ó4ˆAØˆr#   c                ó$   — | j                  d«      S )NÚ	marketCap)r    r'   s    r   Ú
market_capzStockData.market_cap9   s   € à�x‰x˜Ó$Ð$r#   c                ó
  — | j                   j                  st        | j                   «      |k  ry| j                   d   }t        |j                  | dz
     «      }t        |j                  d   «      }|r|dk(  s|€y||z  dz
  S )zBTotal return over the trailing `days` trading days, as a fraction.Nr/   é   r0   r   g      ð?)r   r1   Úlenr   r2   )r!   ÚdaysÚcloseÚpastÚnows        r   ÚreturnszStockData.returns=   sz   € à�<‰<×Ò¤ T§\¡\Ó!2°dÒ!:ØØ—‘˜WÑ%ˆÜ�E—J‘J ˜u q™yÑ)Ó*ˆÜ�5—:‘:˜b‘>Ó"ˆÙ�t˜q’y C KØØ�T‰z˜CÑÐr#   N)r"   r   ÚreturnúOptional[float])r@   r   )r@   rA   )r;   Úintr@   rA   )Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   r   r   ÚpdÚ	DataFramer   r   r   r    Úpropertyr(   r*   r4   r7   r?   © r#   r   r   r      s˜   … àƒKÙ tÔ,€Dˆ$Ó,Ù!°"·,±,Ô?€Gˆ\Ó?Ø€BˆÓØ€Eˆ3ƒOó(ð òVó ðVð ò4ó ð4ð òó ðð ò%ó ð%ô	 r#   r   c                ór  — t        | ¬«      }	 t        j                  | «      }	 t        |j                  xs i «      |_        	 |j                  |d¬«      |_        t        |j                  «      xs |j                  j                   |_        |S # t
        $ r}i |_        d|› �|_        Y d}~Œmd}~ww xY w# t
        $ rH}t        j                  «       |_        |j                  d|› �z   j                  «       |_        Y d}~Œ¨d}~ww xY w# t
        $ r"}t        |«      |_        d|_        Y d}~|S d}~ww xY w)z=Fetch info + price history for a single ticker. Never raises.)r   zinfo: NT)ÚperiodÚauto_adjustz hist: F)r   ÚyfÚTickerr   r   Ú	Exceptionr   r   rG   rH   Ústripr   r1   r   r   )r   rL   ÚsdÚtkÚexcs        r   ÚfetchrU   I   s  € ä	˜&Ô	!€BðÜ�Y‰Y�vÓˆð	&Ü˜2Ÿ7™7š= bÓ)ˆBŒGð	<ØŸ™¨6¸t˜ÓDˆBŒJô �R—W‘W“Ò5 R§Z¡Z×%5Ñ%5Ð!5ˆŒð €Iøô ò 	&ØˆBŒGØ ˜u�~ˆB�H‰Hûð	&ûô
 ò 	<ÜŸ™›ˆBŒJØŸ™ W¨S¨E ?Ñ2×9Ñ9Ó;ˆB�H‰Hûð	<ûô ò Ü�s“8ˆŒØˆ�ˆØ€Iûðúsd   ŽD ¤B ÁB7 Á3D Â	B4ÂB/Â*D Â/B4Â4D Â7	DÃ >DÃ>D ÄDÄD Ä	D6ÄD1Ä1D6)r   r   r@   rA   )Ú1y)r   r   rL   r   r@   r   )Ú__doc__Ú
__future__r   Údataclassesr   r   Útypingr   r   Únumpyr   ÚpandasrG   ÚyfinancerN   r   r   rU   rJ   r#   r   ú<module>r^      sB   ðñõ #ç (ß  ã Û Û ó
ð ÷' ð ' ó ð' õTr#   