
    `Vg$2                    
   d Z ddlmZ ddlmZ ddlZddlmZ ddl	m
Z
 ddlmZ ddlmZ d	Z G d
 d      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Zy)zLIndexer objects for computing start/end window bounds for rolling operations    )annotations)	timedeltaN) calculate_variable_window_bounds)Appender)ensure_platform_int)Nanoa  
Computes the bounds of a window.

Parameters
----------
num_values : int, default 0
    number of values that will be aggregated over
window_size : int, default 0
    the number of rows in a window
min_periods : int, default None
    min_periods passed from the top level rolling API
center : bool, default None
    center passed from the top level rolling API
closed : str, default None
    closed passed from the top level rolling API
step : int, default None
    step passed from the top level rolling API
    .. versionadded:: 1.5
win_type : str, default None
    win_type passed from the top level rolling API

Returns
-------
A tuple of ndarray[int64]s, indicating the boundaries of each
window
c                  f    e Zd ZdZ	 d	 	 	 	 	 ddZ ee      	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd       Zy)	BaseIndexerz*Base class for window bounds calculations.Nc                j    || _         || _        |j                         D ]  \  }}t        | ||        y)z
        Parameters
        ----------
        **kwargs :
            keyword arguments that will be available when get_window_bounds is called
        N)index_arraywindow_sizeitemssetattr)selfr   r   kwargskeyvalues         ]/var/www/html/hubwallet-dev/venv/lib/python3.12/site-packages/pandas/core/indexers/objects.py__init__zBaseIndexer.__init__.   s9     '& ,,. 	&JCD#u%	&    c                    t         N)NotImplementedErrorr   
num_valuesmin_periodscenterclosedsteps         r   get_window_boundszBaseIndexer.get_window_bounds=   s
     "!r   )Nr   r   np.ndarray | Noner   intreturnNoner   NNNNr   r#   r   
int | Noner   zbool | Noner   z
str | Noner   r(   r$   ztuple[np.ndarray, np.ndarray])__name__
__module____qualname____doc__r   r   get_window_bounds_docr     r   r   r
   r
   +   s    4 IJ&,&BE&	& #$ "&"!	"	"  	" 		"
 	" 	" 
'	" %	"r   r
   c                  P    e Zd ZdZ ee      	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd       Zy)FixedWindowIndexerz3Creates window boundaries that are of fixed length.Nc                   |r| j                   dz
  dz  }nd}t        j                  d|z   |dz   |z   |d      }|| j                   z
  }|dv r|dz  }|dv r|dz  }t        j                  |d|      }t        j                  |d|      }||fS )N      r   int64dtypeleftboth)r8   neither)r   nparangeclip)	r   r   r   r   r   r   offsetendstarts	            r   r    z$FixedWindowIndexer.get_window_boundsM   s     &&*q0FFiiF
JNV$;TQd&&&%%QJE((1HCggc1j)q*-czr   r&   r'   r)   r*   r+   r,   r   r-   r    r.   r   r   r0   r0   J   sh    =#$ "&"!   	
   
' %r   r0   c                  P    e Zd ZdZ ee      	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd       Zy)VariableWindowIndexerzNCreates window boundaries that are of variable length, namely for time series.Nc                J    t        || j                  |||| j                        S r   )r   r   r   r   s         r   r    z'VariableWindowIndexer.get_window_boundsl   s/     0
 	
r   r&   r'   rA   r.   r   r   rC   rC   i   sh    X#$ "&"!

  
 	

 
 
 
'
 %
r   rC   c                  x     e Zd ZdZ	 	 	 	 d	 	 	 	 	 d fdZ ee      	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd       Z xZS )VariableOffsetWindowIndexerzNCalculate window boundaries based on a non-fixed offset such as a BusinessDay.c                D    t        |   ||fi | || _        || _        y r   )superr   indexr>   )r   r   r   rI   r>   r   	__class__s         r   r   z$VariableOffsetWindowIndexer.__init__   s'     	k<V<
r   c                   |t        d      |dk  r.t        j                  dd      t        j                  dd      fS || j                  dnd}|dv }|dv }| j                  |d	z
     | j                  d   k  rd
}nd	}t        j                  |d      }	|	j	                  d
       t        j                  |d      }
|
j	                  d
       d|	d<   |rd	|
d<   nd|
d<   t        d	|      D ]  }| j                  |   }| j                  |   || j                  z  z
  }|r|t        d	      z  }||	|<   t        |	|d	z
     |      D ]*  }| j                  |   |z
  |z  t        d      kD  s%||	|<    n | j                  |
|d	z
        |z
  |z  t        d      k  r	|d	z   |
|<   n|
|d	z
     |
|<   |r|
|xx   d	z  cc<    |	|
fS )Nz/step not implemented for variable offset windowr   r4   r5   rightr9   )rL   r9   r7   r2   )	r   r;   emptyrI   fillranger>   r   r   )r   r   r   r   r   r   right_closedleft_closedindex_growth_signr@   r?   i	end_boundstart_boundjs                  r   r    z-VariableOffsetWindowIndexer.get_window_bounds   s    %&WXX?88AW-rxx/III > $

 6WFF!22 00::j1n%

15 " !73

2hhz1a CF CF q*% 	A

1I**Q-*;dkk*IIK tAw& E!H5Q<+ JJqMK/3DDyQR|S E!H 

3q1u:&26GG9UV<WQAQUA  A!3	6 czr   )Nr   NNr!   r&   r'   )	r)   r*   r+   r,   r   r   r-   r    __classcell__rJ   s   @r   rF   rF      s    X *.
&
 
 

 #$ "&"!EE  E 	E
 E E 
'E %Er   rF   c                  P    e Zd ZdZ ee      	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd       Zy)ExpandingIndexerz;Calculate expanding window bounds, mimicking df.expanding()Nc                    t        j                  |t         j                        t        j                  d|dz   t         j                        fS )Nr5   r2   )r;   zerosr4   r<   r   s         r   r    z"ExpandingIndexer.get_window_bounds   s8     HHZrxx0IIaarxx8
 	
r   r&   r'   rA   r.   r   r   r[   r[      sh    E#$ "&"!

  
 	

 
 
 
'
 %
r   r[   c                  P    e Zd ZdZ ee      	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd       Zy)FixedForwardWindowIndexera  
    Creates window boundaries for fixed-length windows that include the current row.

    Examples
    --------
    >>> df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})
    >>> df
         B
    0  0.0
    1  1.0
    2  2.0
    3  NaN
    4  4.0

    >>> indexer = pd.api.indexers.FixedForwardWindowIndexer(window_size=2)
    >>> df.rolling(window=indexer, min_periods=1).sum()
         B
    0  1.0
    1  3.0
    2  2.0
    3  4.0
    4  4.0
    Nc                    |rt        d      |t        d      |d}t        j                  d||d      }|| j                  z   }| j                  rt        j                  |d|      }||fS )Nz.Forward-looking windows can't have center=TruezAForward-looking windows don't support setting the closed argumentr2   r   r4   r5   )
ValueErrorr;   r<   r   r=   )r   r   r   r   r   r   r@   r?   s           r   r    z+FixedForwardWindowIndexer.get_window_bounds  s~     MNNS  <D		!ZW=d&&&''#q*-Cczr   r&   r'   rA   r.   r   r   r_   r_      sl    0 #$ "&"!   	
   
' %r   r_   c                       e Zd ZdZdddedf	 	 	 	 	 	 	 	 	 	 	 d fdZ ee      	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd       Z xZ	S )	GroupbyIndexerzMCalculate bounds to compute groupby rolling, mimicking df.groupby().rolling()Nr   c                    |xs i | _         || _        |r|j                         ni | _        t	        |   d|| j                  j                  d|      d| y)a4  
        Parameters
        ----------
        index_array : np.ndarray or None
            np.ndarray of the index of the original object that we are performing
            a chained groupby operation over. This index has been pre-sorted relative to
            the groups
        window_size : int or BaseIndexer
            window size during the windowing operation
        groupby_indices : dict or None
            dict of {group label: [positional index of rows belonging to the group]}
        window_indexer : BaseIndexer
            BaseIndexer class determining the start and end bounds of each group
        indexer_kwargs : dict or None
            Custom kwargs to be passed to window_indexer
        **kwargs :
            keyword arguments that will be available when get_window_bounds is called
        r   r   r   Nr.   )groupby_indiceswindow_indexercopyindexer_kwargsrH   r   pop)r   r   r   rf   rg   ri   r   rJ   s          r   r   zGroupbyIndexer.__init__&  sd    6  /4",7En1132 	
#++//{K	
 	
r   c                   g }g }d}| j                   j                         D ]  \  }	}
| j                  %| j                  j                  t	        |
            }n| j                  } | j
                  d	|| j                  d| j                  }|j                  t        |
      ||||      \  }}|j                  t        j                        }|j                  t        j                        }t        |      t        |      k(  sJ d       t        j                  ||t        |
      z         }|t        |
      z  }t        j                  ||d   dz   g      j                  t        j                  d      }|j                  |j                  t	        |                   |j                  |j                  t	        |                    t        |      dk(  rJt        j                  g t        j                        t        j                  g t        j                        fS t        j                   |      }t        j                   |      }||fS )
Nr   re   z6these should be equal in length from get_window_boundsrM   r2   F)rh   r5   r.   )rf   r   r   taker   rg   r   ri   r    lenastyper;   r4   r<   appendarrayconcatenate)r   r   r   r   r   r   start_arrays
end_arrayswindow_indices_startr   indicesr   indexerr@   r?   window_indicess                   r   r    z GroupbyIndexer.get_window_boundsJ  s    
  00668 	MLC +"..334G4PQ"..)d)) ' ,, %%G
 !22Gk664JE3 LL*E**RXX&Cu:"  HGH 
  YY$&:S\&IN !CL0 YY~r8JQ8N7OPWWu X N  3 34G4N OPn112Ec2JKL?	M@ |!88Bbhh/"BHH1MMM|,nnZ(czr   )r   r"   r   zint | BaseIndexerrf   dict | Nonerg   ztype[BaseIndexer]ri   rx   r$   r%   r&   r'   )
r)   r*   r+   r,   r
   r   r   r-   r    rX   rY   s   @r   rc   rc   #  s    W *.)*'+,7&*"
&"
 '"
 %	"

 *"
 $"
 
"
H #$ "&"!33  3 	3
 3 3 
'3 %3r   rc   c                  P    e Zd ZdZ ee      	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd       Zy)ExponentialMovingWindowIndexerz/Calculate ewm window bounds (the entire window)Nc                    t        j                  dgt         j                        t        j                  |gt         j                        fS )Nr   r5   )r;   rp   r4   r   s         r   r    z0ExponentialMovingWindowIndexer.get_window_bounds  s1     xx288,bhh
|288.TTTr   r&   r'   rA   r.   r   r   rz   rz     sp    9#$ "&"!	U	U  	U 		U
 	U 	U 
'	U %	Ur   rz   )r,   
__future__r   datetimer   numpyr;   pandas._libs.window.indexersr   pandas.util._decoratorsr   pandas.core.dtypes.commonr   pandas.tseries.offsetsr   r-   r
   r0   rC   rF   r[   r_   rc   rz   r.   r   r   <module>r      s    R "   I , 9 ' 8" "> >
K 
6U+ Up
{ 
&1 1h[[ [|U[ Ur   