}L i$ddlmZmZddlZddlmZmZmZmZm Z ddl m Z m Z ddl m Z mZddlmZddlmZmZed eeej*f ZGd d eZGd deZGddeZy))ABCabstractmethodN)ListUnionDictTypeVarTuple)EQUITY_SCREENER_EQ_MAPEQUITY_SCREENER_FIELDS)FUND_SCREENER_EQ_MAPFUND_SCREENER_FIELDSYFNotImplementedError)dynamic_docstring'generate_list_table_from_dict_universalT)boundc eZdZdedeedeeeeeejfdffffdZ e e defdZ e e de fdZdedddfd Zdeeeejfddfd Zdeeeejfddfd Zdeeeejfddfd Zdedddfd Zde fdZddefdZdefdZy) QueryBaseoperatoroperand.c|j}t|ts tdt |dkr t d|dk(r|j |ne|dvr|j|nO|dk(r|j|n8|dk(r|j|n!|dvr|j|n t d ||_ ||_ y) NzInvalid operand typerzInvalid field for EquityQueryIS-IN>ORANDEQBTWN>GTLTGTELTEzInvalid Operator Value) upper isinstancelist TypeErrorlen ValueError_validate_isin_operand_validate_or_and_operand_validate_eq_operand_validate_btwn_operand_validate_gt_ltroperands)selfrrs ]/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/yfinance/screener/query.py__init__zQueryBase.__init__ s>>#'4(23 3 w<1 <= = w   ' ' 0  %  ) )' 2    % %g .    ' ' 0 0 0   )56 6   returnctd)Nz/valid_fields() needs to be implemented by childrr/s r0 valid_fieldszQueryBase.valid_fields%$$UVVr2ctd)Nz/valid_values() needs to be implemented by childrr5s r0 valid_valueszQueryBase.valid_values*r7r2Nct|dkr tdtd|Ddurtdt |dy)Nz$Operand must be length longer than 1c3<K|]}t|tywNr$r).0es r0 z5QueryBase._validate_or_and_operand..2s9Az!Y'9FzOperand must be type z for OR/AND)r'r(allr&typer/rs r0r*z"QueryBase._validate_or_and_operand/sL w<1 CD D 99 9U B3DJ<{KL L Cr2ctdk7r tdtfd|jj Dstdt |dddd|j vro|j d}t|tr3tj|j Dcgc]}|c}}d|vrtd ddyycc}w) NrzOperand must be length 2 for EQc3,K|] }d|v ywrNr?fields_by_typers r0rAz1QueryBase._validate_eq_operand..9b^GAJ.0bInvalid field for  "r"r;Invalid EQ value ") r'r(anyr6valuesrDr9r$dictsetunion)r/rvvr@s ` r0r+zQueryBase._validate_eq_operand5s w<1 >? ?btGXGXG_G_Gabb1$t*R |1MN N 1:** *""71:.B"d#!SU[[biik":1":;qz# #5gaj\!CDD$ + #;s> C&cftdk7r tdtfd|jj Dstdt |t dtjdur tdt dtjdur tdy) Nz!Operand must be length 3 for BTWNc3,K|] }d|v ywrHrIrJs r0rAz3QueryBase._validate_btwn_operand..GrLrMrNr;Fz Invalid comparison type for BTWNr r'r(rRr6rSrDr$numbersRealr&rEs `r0r,z QueryBase._validate_btwn_operandDs w<1 @A AbtGXGXG_G_Gabb1$t*>? ? gaj',, /5 8>? ? gaj',, /5 8>? ? 9r2c tdk7r tdtfd|jj Dstdt |dddt dtjd ur td y) Nrz"Operand must be length 2 for GT/LTc3,K|] }d|v ywrHrIrJs r0rAz,QueryBase._validate_gt_lt..QrLrMrNrOrrPr;Fz!Invalid comparison type for GT/LTr[rEs `r0r-zQueryBase._validate_gt_ltNs w<1 AB BbtGXGXG_G_Gabb1$t*R |1MN N gaj',, /5 8?@ @ 9r2c tdkr tdtfd|jj Dstdt |dddd|j vr|j d}t|tr3tj|j Dcgc]}|c}}tdtD]}||vs td |dyycc}w) Nrz#Operand must be length 2+ for IS-INc3,K|] }d|v ywrHrIrJs r0rAz3QueryBase._validate_isin_operand..ZrLrMrNrOrrPr;rQ) r'r(rRr6rSrDr9r$rTrUrVrange)r/rrWr@is ` r0r)z QueryBase._validate_isin_operandVs w DcD|j}|j}|jdk(r=d}|jddDcgc]#}t|d|jd|g%}}||Dcgc]$}t|tr|j n|&c}dScc}wcc}w)Nrrr;rr)rr.)rr.rDr$rto_dict)r/opopsvos r0rezQueryBase.to_dictfs ]]mm ==G #BDHMMRSRTDUVq:4:dT]]1%5q$9:VCVQTUA 1i(@aGU  WVs (B*)Bcdz|jj}t|jtrt d|jDr=dj fd|jD}|d|jd|ddS|d|jd t|jd S|d|jd t|jd S) N c3<K|]}t|tywr=r>)r?rfs r0rAz%QueryBase.__repr__..xsE:b),ErBz, c3K|]8}dt|tr|jdzn t|:yw)rkr;N)r$r__repr__repr)r?rfindent indent_strs r0rAz%QueryBase.__repr__..zsD*"l" 2y@YR[[!%<_cdf_g$hi*s>A(z, [  z])z, )) __class____name__r$r.r%rRjoinrro)r/rp class_name operands_strrqs ` @r0rnzQueryBase.__repr__rsF] ^^,, dmmT *Et}}EE$zz*"mm*  %Qt}}oU<.:,VXYY%Qt}}oRT]]8K7LANN!\4==/D4G3HJ Jr2c"|jSr=)rnr5s r0__str__zQueryBase.__str__s}}r2)r)rv __module__ __qualname__strrrr r\r]r1propertyrr6rr9r*r+r,r-r)rernr{rIr2r0rr sq  ud;6GsTYZ_`celeqeq`qZruxZxTyOyIz6z/| 0WdWWWdWWM[0AMdM EDsGLL7H1I,J Et E@d5gll9J3K.L@QU@AtE#w||2C,D'EA$AId;.?IDI    KCK(r2rceZdZdZedeeiedefdZ edee ddgiedefd Z y ) EquityQuerya The `EquityQuery` class constructs filters for stocks based on specific criteria such as region, sector, exchange, and peer group. Start with value operations: `EQ` (equals), `IS-IN` (is in), `BTWN` (between), `GT` (greater than), `LT` (less than), `GTE` (greater or equal), `LTE` (less or equal). Combine them with logical operations: `AND`, `OR`. Example: Predefined Yahoo query `aggressive_small_caps`: .. code-block:: python from yfinance import EquityQuery EquityQuery('and', [ EquityQuery('is-in', ['exchange', 'NMS', 'NYQ']), EquityQuery('lt', ["epsgrowth.lasttwelvemonths", 15]) ]) valid_operand_fields_tabler3ctSz[ Valid operands, grouped by category. {valid_operand_fields_table} )r r5s r0r6zEquityQuery.valid_fields &%r2valid_values_tableexchangeindustry) concat_keysctSz Most operands take number values, but some have a restricted set of valid values. {valid_values_table} )r r5s r0r9zEquityQuery.valid_valuesrr2N) rvr|r}__doc__rrr rrr6r r9rIr2r0rrs(46]^t6uvw &d&x&,.UVl|FHR{S/TUV &d&V&r2rceZdZdZedeeiedefdZ edee iedefdZ y) FundQuerya The `FundQuery` class constructs filters for mutual funds based on specific criteria such as region, sector, exchange, and peer group. Start with value operations: `EQ` (equals), `IS-IN` (is in), `BTWN` (between), `GT` (greater than), `LT` (less than), `GTE` (greater or equal), `LTE` (less or equal). Combine them with logical operations: `AND`, `OR`. Example: Predefined Yahoo query `solid_large_growth_funds`: .. code-block:: python from yfinance import FundQuery FundQuery('and', [ FundQuery('eq', ['categoryname', 'Large Growth']), FundQuery('is-in', ['performanceratingoverall', 4, 5]), FundQuery('lt', ['initialinvestment', 100001]), FundQuery('lt', ['annualreturnnavy1categoryrank', 50]), FundQuery('eq', ['exchange', 'NAS']) ]) rr3ctSr)r r5s r0r6zFundQuery.valid_fields $#r2rctSr)r r5s r0r9zFundQuery.valid_valuesrr2N) rvr|r}rrrr rrr6r r9rIr2r0rrss,46]^r6stu $d$v$,.UVj.klm $d$n$r2r)abcrrr\typingrrrrr yfinance.constr r r r yfinance.exceptionsrutilsrrr~r]rrrrrIr2r0rs_#44IE5N CuS',,./0{{|%&)%&P'$ '$r2