
    JEf	Q                    z   d Z ddlmZ ddlZddlmZmZ ddlmZ ddl	m
Z
mZmZ ddlZddlmZmZ ddlmZ dd	lmZ ddlmc mZ dd
lmZmZmZ ddlm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z*m+Z+ e
rddl,m-Z-m.Z.  G d dej^                        Z0 G d dejb                        Z1 G d de1      Z2 G d dejf                        Z3 G d de3      Z4 G d de4      Z5 G d de3      Z6 G d  d!e6      Z7 G d" d#ejp                        Z8 G d$ d%e"      Z9d& Z: G d' d(ejv                        Z< G d) d*      Z=d,d+Z>y)-z1 manage PyTables query interface via Expressions     )annotationsN)DecimalInvalidOperation)partial)TYPE_CHECKINGAnyClassVar)	Timedelta	Timestamp)UndefinedVariableError)is_list_like)expropsscope)ensure_decoded)BaseExprVisitor)is_term)extract_array)Index)pprint_thingpprint_thing_encoded)Selfnptc                  B     e Zd ZU dZded<   	 	 	 d	 	 	 	 	 d fdZ xZS )PyTablesScope)
queryablesdict[str, Any]r   c                F    t         |   |dz   ||       |xs i | _        y )N   )global_dict
local_dict)super__init__r   )selflevelr    r!   r   	__class__s        Y/var/www/VTS_Report/venv/lib/python3.12/site-packages/pandas/core/computation/pytables.pyr#   zPyTablesScope.__init__7   s)     	
S$*    )NNN)r%   intr   dict[str, Any] | NonereturnNone)__name__
__module____qualname__	__slots____annotations__r#   __classcell__r&   s   @r'   r   r   2   s?    I
 ,0++
 *+ 
+ +r(   r   c                  L     e Zd ZU ded<   ddZdd fdZd Zed        Z xZ	S )	Termr   envc                ^    t        |t              r| }nt        }t        j	                  |      S N)
isinstancestrConstantobject__new__)clsnamer6   sideencodingklasss         r'   r=   zTerm.__new__E   s%    dC EE~~e$$r(   c                ,    t         |   ||||       y N)r@   rA   )r"   r#   r$   r?   r6   r@   rA   r&   s        r'   r#   zTerm.__init__L   s    sAr(   c                F   | j                   dk(  rP| j                  | j                  j                  vr"t	        dt        | j                         d      | j                  S 	 | j                  j                  | j                  d      S # t        $ r | j                  cY S w xY w)Nleftzname z is not definedF)is_local)r@   r?   r6   r   	NameErrorreprresolver   r$   s    r'   _resolve_namezTerm._resolve_nameO   s    99yy 3 33%TYY'8 HII99	88##DII#>>% 	99	s   !&B B B c                    | j                   S r8   )_valuerL   s    r'   valuez
Term.value^   s    {{r(   NNr6   r   r+   r,   )
r-   r.   r/   r1   r=   r#   rM   propertyrP   r2   r3   s   @r'   r5   r5   B   s-    	%B  r(   r5   c                  (     e Zd Zdd fdZd Z xZS )r;   c                l    t        |t              sJ t        |             t        |   ||||       y rD   )r9   r   typer"   r#   rE   s        r'   r#   zConstant.__init__d   s2    #}-8tCy8-sAr(   c                    | j                   S r8   )_namerL   s    r'   rM   zConstant._resolve_nameh   s    zzr(   rQ   rR   )r-   r.   r/   r#   rM   r2   r3   s   @r'   r;   r;   c   s    Br(   r;   c                       e Zd ZU dZded<   ded<   ded<   d fdZdd	Zd
 Zd Ze	dd       Z
e	dd       Ze	d        Ze	d        Ze	d        ZddZddZddZ xZS )BinOp   r:   opr   r   z
str | None	conditionc                R    t         |   |||       || _        || _        d | _        y r8   )r"   r#   r   rA   r]   )r$   r\   lhsrhsr   rA   r&   s         r'   r#   zBinOp.__init__s   s)    S#&$ r(   c                     y r8    rL   s    r'   _disallow_scalar_only_bool_opsz$BinOp._disallow_scalar_only_bool_opsy       r(   c                     fd} j                    j                  }}t        |      r*t        |      r ||j                  |j                        }|S t        |      s/t        |      r$ ||j	                        |j                        }|S t        |      r/t        |      s$ ||j                  |j	                              }|S t        |      s2t        |      s' ||j	                        |j	                              }S )Nc                   | |S || S }t        | t              r3t        |t              rt        }n_t        | |      r| S t        ||      rE|S t        | t              r3t        |t              rt        }nt        | |      r| S t        ||      r|S  |j
                  | |j                  j                        j                         S )z5create and return a new specialized BinOp from myself)r   rA   )	r9   ConditionBinOpJointConditionBinOpFilterBinOpJointFilterBinOpr\   r   rA   evaluate)rG   rightkrB   r$   s      r'   przBinOp.prune.<locals>.pr}   s    |A$/e^4+Aa(Kq) LD+.e[1(Aa(Kq) Lu4==hjr(   )r_   r`   r   rP   prune)r$   rB   rn   rG   rl   ress   ``    r'   ro   zBinOp.prune|   s    	8 hhe4=WU^TZZ-C 
 75>TZZ&4C 
 T]75>TZZU!34C 
 $-75>TZZ&E(:;C
r(   c                v    t        |      s|g}t        |t        j                        r|j	                         }|S )zinplace conform rhs)r   r9   npndarrayravel)r$   r`   s     r'   conformzBinOp.conform   s/    C %Cc2::&))+C
r(   c                2    | j                   | j                  v S )z$return True if this is a valid field)r_   r   rL   s    r'   is_validzBinOp.is_valid   s     xx4??**r(   c                P    | j                   j                  | j                        duS )zx
        return True if this is a valid column name for generation (e.g. an
        actual column in the table)
        N)r   getr_   rL   s    r'   is_in_tablezBinOp.is_in_table   s"     ""488,D88r(   c                b    t        | j                  j                  | j                        dd      S )zthe kind of my fieldkindNgetattrr   ry   r_   rL   s    r'   r|   z
BinOp.kind   &     t**4884fdCCr(   c                b    t        | j                  j                  | j                        dd      S )zthe meta of my fieldmetaNr}   rL   s    r'   r   z
BinOp.meta   r   r(   c                b    t        | j                  j                  | j                        dd      S )zthe metadata of my fieldmetadataNr}   rL   s    r'   r   zBinOp.metadata   s&     t**4884j$GGr(   c                x    |j                  | j                        }d| j                   d| j                   d| dS )z2create and return the op string for this TermValue( ))tostringrA   r_   r\   )r$   vvals      r'   generatezBinOp.generate   s7    jj'488*AdggYauA..r(   c           	          fd}t         j                        }t         j                        }|dk(  s|r|j                  d      rwt	        |t
        t        f      r ||      }t        |      }t        |      j                  d      }|j                  |j                  d      }t        ||j                  |      S |dv rZt	        |t              rt        |      }nt        |d      }|j                  d      j                  }t        t        |      ||      S |d	k(  r>t         j                   d
      }||vrd}n|j#                  |d      }t        ||d      S |dk(  r4	 t%        |      }t        |j'                  d            }t        |||      S |dk(  rt        |      }t        |||      S |dk(  rIt	        |t              r!|j+                         j-                         dv}nt/        |      }t        |||      S t	        |t              rt        | ||      d      S t1        d| dt3        |       d| d      # t(        $ r t        |       Y w xY w)zn
        convert the expression that is in the term to something that is
        accepted by pytables
        c                `    j                   t        | j                         S t        |       S )N)rA   )rA   r   r   )rP   r$   s    r'   	stringifyz&BinOp.convert_value.<locals>.stringify   s)    }}(+EDMMJJ&&r(   datetime
datetime64nsUTC)timedelta64	timedeltas)unitcategoryT)extract_numpyrG   )r@   integerROUND_HALF_EVEN)roundingfloatbool)	falsefnonnone0z[]z{} stringzCannot compare z	 of type z to z column)r   r|   r   
startswithr9   r)   r   r   as_unittz
tz_convert	TermValuerO   r:   r
   r   r   searchsortedr   to_integral_exactr   striplowerr   	TypeErrorrV   )r$   r   r   r|   r   r   resultv_decs   `       r'   convert_valuezBinOp.convert_value   s4   	'
 dii(dii(:$4??<+H!c5\*aLq!A!$$T*AttLL'Q$//11!S!aLac*		$&&ASVQ--Z$T]]$GH !..qv.>VVY77YM
 //9J/KLQ4((W_aAQ4((V^!S!GGIOO% 
. 
 GQ4((3Q	!h77oaS	$q'$tfGTUU= $  as   'I IIc                     y r8   rb   rL   s    r'   convert_valueszBinOp.convert_values  rd   r(   )r\   r:   r   r   r+   r,   r+   r,   r+   r   r+   r:   )r+   r   )r-   r.   r/   _max_selectorsr1   r#   rc   ro   ru   rS   rw   rz   r|   r   r   r   r   r   r2   r3   s   @r'   rZ   rZ   l   s    NG(T + + 9 9 D D D D H H/
EVNr(   rZ   c                  D    e Zd ZU dZded<   d	dZd
dZd ZddZdddZ	y)ri   Nztuple[Any, Any, Index] | Nonefilterc                t    | j                   yt        d| j                   d    d| j                   d    d      S )NzFilter: Not Initializedz[Filter : [r   z] -> [r   ])r   r   rL   s    r'   __repr__zFilterBinOp.__repr__  s;    ;;,k$++a.)9A?OqQRRr(   c                    | j                   4| j                   d   | j                  d      | j                   d   f| _         | S )zinvert the filterr   T)invert   )r   generate_filter_oprL   s    r'   r   zFilterBinOp.invert"  sC    ;;"A''t'4ADK
 r(   c                    | j                   gS )zreturn the actual filter format)r   rL   s    r'   formatzFilterBinOp.format,  s    }r(   c                   | j                   st        d|  d      | j                  | j                        }t	        |      }| j
                  rV| j                  dv rGt        |      | j                  kD  r/| j                         }| j                  |t        |      f| _        | S y | j                  dv r/| j                         }| j                  |t        |      f| _        | S t        d|  d      )Nquery term is not valid [r   ==!=z7passing a filterable condition to a non-table indexer [)rw   
ValueErrorru   r`   listrz   r\   lenr   r   r_   r   r   r   )r$   r`   values	filter_ops       r'   rk   zFilterBinOp.evaluate1  s    }}8a@AAll488$cww,&3v;9L9L+L 335	#xxE&MB 77l"//1I88Yf>DK 	 I$qQ r(   c                R    | j                   dk(  r|r| j                   dk(  r|rd S d S )Nr   r   c                &    | j                  |       S r8   isinaxisvalss     r'   <lambda>z0FilterBinOp.generate_filter_op.<locals>.<lambda>O  s    tyy&6 r(   c                $    | j                  |      S r8   r   r   s     r'   r   z0FilterBinOp.generate_filter_op.<locals>.<lambda>Q  s    diio r(   )r\   )r$   r   s     r'   r   zFilterBinOp.generate_filter_opM  s'    GGtOF4F6655r(   r   r+   r   r+   zSelf | None)F)r   r   )
r-   r.   r/   r   r1   r   r   r   rk   r   rb   r(   r'   ri   ri     s'    ,0F)0S

86r(   ri   c                      e Zd Zd ZddZy)rj   c                    t        d      )Nz unable to collapse Joint FiltersNotImplementedErrorrL   s    r'   r   zJointFilterBinOp.formatU  s    !"DEEr(   c                    | S r8   rb   rL   s    r'   rk   zJointFilterBinOp.evaluateY  s    r(   Nr   )r-   r.   r/   r   rk   rb   r(   r'   rj   rj   T  s    Fr(   rj   c                  (    e Zd ZddZd Zd ZddZy)rg   c                4    t        d| j                   d      S )Nz[Condition : [z]])r   r]   rL   s    r'   r   zConditionBinOp.__repr__^  s    nT^^,<B?@@r(   c                    t        d      )zinvert the conditionz6cannot use an invert condition when passing to numexprr   rL   s    r'   r   zConditionBinOp.inverta  s    
 "D
 	
r(   c                    | j                   S )zreturn the actual ne format)r]   rL   s    r'   r   zConditionBinOp.formatj  s    ~~r(   c                   | j                   st        d|  d      | j                  sy | j                  | j                        }|D cg c]  }| j                  |       }}| j                  dv rSt        |      | j                  k  r:|D cg c]  }| j                  |       }}ddj                  |       d| _        | S y | j                  |d         | _        | S c c}w c c}w )Nr   r   r   r   z | r   r   )rw   r   rz   ru   r`   r   r\   r   r   r   joinr]   )r$   r`   r   r   vss        r'   rk   zConditionBinOp.evaluateo  s    }}8a@AA ll488$145A$$$Q'55 77l"6{d1110671dmmA&77#$UZZ^$4A!6 	 !]]6!95DN 6 8s   CC#Nr   r   )r-   r.   r/   r   r   r   rk   rb   r(   r'   rg   rg   ]  s    A

r(   rg   c                      e Zd ZddZy)rh   c                    d| j                   j                   d| j                   d| j                  j                   d| _        | S )Nr   r   r   )r_   r]   r\   r`   rL   s    r'   rk   zJointConditionBinOp.evaluate  s=    TXX//0$''!DHH<N<N;OqQr(   Nr   )r-   r.   r/   rk   rb   r(   r'   rh   rh     s    r(   rh   c                      e Zd Zd Zy)UnaryOpc                &   | j                   dk7  rt        d      | j                  }|j                  |      }|Xt	        |t
              r|j                  ,t	        |t
              s,t	        |t              r|j                  |j                         S y )N~z$UnaryOp only support invert type ops)
r\   r   operandro   
issubclassrg   r]   ri   r   r   )r$   rB   r   s      r'   ro   zUnaryOp.prune  sz    77c>%&LMM,,--&un-!!-e^45+.*>>##r(   N)r-   r.   r/   ro   rb   r(   r'   r   r     s    r(   r   c                  l     e Zd ZU eZded<   eZded<   d fdZddZ	d Z
d Zdd	Zd
 Zd Zd Z xZS )PyTablesExprVisitorzClassVar[type[ops.Term]]
const_typezClassVar[type[Term]]	term_typec                    t         |   |||       | j                  D ]&  }| j                  |   }t	        | d| |ffd	       ( y )Nvisit_c                &    t        t        |fi S r8   )r   rZ   )nodebin_opkwargss     r'   r   z.PyTablesExprVisitor.__init__.<locals>.<lambda>  s    GE6,LV,L r(   )r"   r#   
binary_opsbinary_op_nodes_mapsetattr)r$   r6   engineparserr   r   bin_noder&   s       `  r'   r#   zPyTablesExprVisitor.__init__  sR    ff-oo 	F//7H
#$*L	r(   c                   t        |j                  t        j                  t        j                  f      r%t        d| j                  |j                              S t        |j                  t        j                        r@| j                  | j                  |j                        j                   | j                        S t        |j                  t        j                        rt        d      y )Nr   zUnary addition not supported)r9   r\   astNotInvertr   visitr   USubr   rP   r6   UAddr   r$   r   r   s      r'   visit_UnaryOpz!PyTablesExprVisitor.visit_UnaryOp  s    dgg453

4<< 899*??DJJt||$<$B$B#BDHHMM*%&DEEr(   c                L    | j                  |j                        j                  S r8   )r  rP   r  s      r'   visit_IndexzPyTablesExprVisitor.visit_Index  s    zz$**%+++r(   c                    t        j                  t        j                         g|j                  d   |j                  g      }| j                  |      S )Nr   )r   rG   comparators)r   CompareEqtargetsrP   r  )r$   r   r   cmprs       r'   visit_Assignz PyTablesExprVisitor.visit_Assign  s>    {{
atzzl
 zz$r(   c           	        | j                  |j                        }| j                  |j                        }	 |j                  }t	        |t
              r|j                  }	 | j                  ||   | j                        S # t        $ r Y Gw xY w# t        $ r)}t        dt        |       dt        |             |d }~ww xY w)Nzcannot subscript z with )r  rP   sliceAttributeErrorr9   r5   r   r6   r   r   rJ   )r$   r   r   rP   slobjerrs         r'   visit_Subscriptz#PyTablesExprVisitor.visit_Subscript  s     

4::&

4::&	KKE eT"KKE	??5<::  		  	#DK=tE{mD	s)   B  !B  	BB	C$B<<Cc                   |j                   }|j                  }t        |j                        }|t        j
                  k(  rE| j                  |      }	 |j                  }	 | j                  t        ||      | j                        S t        d|j                         # t        $ r Y Jw xY w# t        $ r0 t        |t        j                        r|j                  |k(  r|cY S Y _w xY w)NzInvalid Attribute context )attrrP   rV   ctxr   Loadr  r  r   r~   r6   r9   Nameidr   r-   )r$   r   r   r  rP   r  resolveds          r'   visit_Attributez#PyTablesExprVisitor.visit_Attribute  s    yy

488n#((?zz%(H#>>$~~gh&=txxHH 5cll^DEE " 
 " $eSXX.588t3C#O$s$   B  %B- 	B*)B*-4C&%C&c                b    t        |t        j                        rt        j                         S |S r8   )r9   r   Inr  )r$   r\   s     r'   translate_Inz PyTablesExprVisitor.translate_In  s     %b#&&1svvx9r9r(   c                T    | j                  |j                        |j                  ||fS r8   )r  r\   )r$   r   rG   rl   s       r'   _rewrite_membership_opz*PyTablesExprVisitor._rewrite_membership_op  s"    zz$''"DGGT588r(   r   )r+   zops.Term | UnaryOp | None)r+   zops.Term)r-   r.   r/   r;   r   r1   r5   r   r#   r  r  r  r  r  r   r"  r2   r3   s   @r'   r   r     sB    +3J(3&*I#*, *F0:9r(   r   c                ^    t        | t        t        f      st        |       st	        d      | S )a  
    Validate that the where statement is of the right type.

    The type may either be String, Expr, or list-like of Exprs.

    Parameters
    ----------
    w : String term expression, Expr, or list-like of Exprs.

    Returns
    -------
    where : The original where clause if the check was successful.

    Raises
    ------
    TypeError : An invalid data type was passed in for w (e.g. dict).
    zLwhere must be passed as a string, PyTablesExpr, or list-like of PyTablesExpr)r9   PyTablesExprr:   r   r   )ws    r'   _validate_wherer&    s2    $ q<-.,q/+
 	

 Hr(   c                  X    e Zd ZU dZded<   ded<   ded<   	 	 	 d	 	 	 	 	 dd	Zdd
Zd Zy)r$  a  
    Hold a pytables-like expression, comprised of possibly multiple 'terms'.

    Parameters
    ----------
    where : string term expression, PyTablesExpr, or list-like of PyTablesExprs
    queryables : a "kinds" map (dict of column name -> kind), or None if column
        is non-indexable
    encoding : an encoding that will encode the query terms

    Returns
    -------
    a PyTablesExpr object

    Examples
    --------
    'index>=date'
    "columns=['A', 'D']"
    'columns=A'
    'columns==A'
    "~(columns=['A','B'])"
    'index>df.index[3] & string="bar"'
    '(index>df.index[3] & index<=df.index[6]) | string="bar"'
    "ts>=Timestamp('2012-02-01')"
    "major_axis>=20130101"
    zPyTablesExprVisitor | None_visitorr   r6   r:   r   Nc                (   t        |      }|| _        d | _        d | _        d | _        d | _        d }t        |t              r#|j                  j                  }|j                  }nt        |      rt        |      }t        |      D ]:  \  }}t        |t              r|j                  j                  }-t        |      ||<   < dj                  t        j                   |      D cg c]  }d| d
 c}      }n|}|| _
        t#        |dz   |      | _        |ut        | j                  t$              rZ| j                  j&                  j)                  |       t+        | j                  |dd|      | _        | j-                         | _        y y y c c}w )Nz & r   r   r   )r!   pytables)r   r   r   rA   )r&  rA   r]   r   termsr(  r9   r$  r6   r   r   r   r   	enumerater   comflattenr   r:   r   updater   parse)	r$   wherer   rA   scope_levelr!   _whereidxr%  s	            r'   r#   zPyTablesExpr.__init__4  s[     & 
 <@
e\*JZZF% KE#E* 4Qa.!"J!0!3E#J	4
 ZZ3;;u3E Fa1QCq FGF F	 qZH!jC&@HH&&z2/%!!!DM DJ 'A! !Gs   $Fc                n    | j                   t        | j                         S t        | j                        S r8   )r+  r   r   rL   s    r'   r   zPyTablesExpr.__repr__d  s*    ::!

++DII&&r(   c                ~   	 | j                   j                  t              | _        	 | j                   j                  t              | _        | j                  | j                  fS # t        $ r"}t        d| j                   d|  d      |d}~ww xY w# t        $ r"}t        d| j                   d|  d      |d}~ww xY w)z2create and return the numexpr condition and filterzcannot process expression [z], [z] is not a valid conditionNz] is not a valid filter)	r+  ro   rg   r]   r  r   r   ri   r   )r$   r  s     r'   rk   zPyTablesExpr.evaluatei  s    	!ZZ--n=DN	****;7DK ~~t{{**  	-dii[TF C+ + 	  	-dii[TF C( ( 	s.   $A# $B #	B,B		B	B<B77B<)NNr   )r   r*   r2  r)   r+   r,   r   )r-   r.   r/   __doc__r1   r#   r   rk   rb   r(   r'   r$  r$    sS    6 )(	
I
 -1.& *.&
 .& 
.&`'
+r(   r$  c                       e Zd ZdZddZddZy)r   z<hold a term value the we use to construct a condition/filterc                \    t        |t              sJ |       || _        || _        || _        y r8   )r9   r:   rP   	convertedr|   )r$   rP   r:  r|   s       r'   r#   zTermValue.__init__  s,    $$*d*$
"	r(   c                    | j                   dk(  r'|t        | j                        S d| j                   dS | j                   dk(  rt        | j                        S t        | j                        S )z6quote the string if not encoded else encode and returnr   "r   )r|   r:   r:  rJ   )r$   rA   s     r'   r   zTermValue.tostring  sc    99 #4>>**t~~&a((YY'! ''4>>""r(   N)r|   r:   r+   r,   r   )r-   r.   r/   r7  r#   r   rb   r(   r'   r   r   }  s    F
#r(   r   c                     t         t              syt        j                  t        j                  z   dz   }t         fd|D              S )z7loose checking if s is a pytables-acceptable expressionF)=c              3  &   K   | ]  }|v  
 y wr8   rb   ).0r\   r   s     r'   	<genexpr>z#maybe_expression.<locals>.<genexpr>  s     ,2rQw,s   )r9   r:   r   r   	unary_opsany)r   
operationss   ` r'   maybe_expressionrE    s@    a$//2E2O2OORXXJ ,,,,r(   r   )?r7  
__future__r   r   decimalr   r   	functoolsr   typingr   r   r	   numpyrr   pandas._libs.tslibsr
   r   pandas.errorsr   pandas.core.dtypes.commonr   pandas.core.commoncorecommonr-  pandas.core.computationr   r   r   _scopepandas.core.computation.commonr   pandas.core.computation.exprr   pandas.core.computation.opsr   pandas.core.constructionr   pandas.core.indexes.baser   pandas.io.formats.printingr   r   pandas._typingr   r   Scoper   r5   r;   rZ   ri   rj   rg   rh   r   r   r&  Exprr$  r   rE  rb   r(   r'   <module>r\     s   7 " 
    1 2     
 : 8 / 2 *
 +FLL + 388 Bt kCII k\76% 76t{ *U *Z. ckk &R9/ R9j6f+499 f+R# #,-r(   