o
    ;Di                     @   s   d dl mZmZmZ d dlmZ d dlmZmZ dd Z	e	e_	G dd deZ
dd	 ZdddZee_G dd deZdd ZdddZee_G dd deZdd Zd
S )    )absolute_importprint_functiondivision)next)Table	asindicesc                 O   s   t | |fi |S )a  
    Replace missing values with non-missing values from the row above. E.g.::

        >>> import petl as etl
        >>> table1 = [['foo', 'bar', 'baz'],
        ...           [1, 'a', None],
        ...           [1, None, .23],
        ...           [1, 'b', None],
        ...           [2, None, None],
        ...           [2, None, .56],
        ...           [2, 'c', None],
        ...           [None, 'c', .72]]
        >>> table2 = etl.filldown(table1)
        >>> table2.lookall()
        +-----+-----+------+
        | foo | bar | baz  |
        +=====+=====+======+
        |   1 | 'a' | None |
        +-----+-----+------+
        |   1 | 'a' | 0.23 |
        +-----+-----+------+
        |   1 | 'b' | 0.23 |
        +-----+-----+------+
        |   2 | 'b' | 0.23 |
        +-----+-----+------+
        |   2 | 'b' | 0.56 |
        +-----+-----+------+
        |   2 | 'c' | 0.56 |
        +-----+-----+------+
        |   2 | 'c' | 0.72 |
        +-----+-----+------+

        >>> table3 = etl.filldown(table1, 'bar')
        >>> table3.lookall()
        +------+-----+------+
        | foo  | bar | baz  |
        +======+=====+======+
        |    1 | 'a' | None |
        +------+-----+------+
        |    1 | 'a' | 0.23 |
        +------+-----+------+
        |    1 | 'b' | None |
        +------+-----+------+
        |    2 | 'b' | None |
        +------+-----+------+
        |    2 | 'b' | 0.56 |
        +------+-----+------+
        |    2 | 'c' | None |
        +------+-----+------+
        | None | 'c' | 0.72 |
        +------+-----+------+

        >>> table4 = etl.filldown(table1, 'bar', 'baz')
        >>> table4.lookall()
        +------+-----+------+
        | foo  | bar | baz  |
        +======+=====+======+
        |    1 | 'a' | None |
        +------+-----+------+
        |    1 | 'a' | 0.23 |
        +------+-----+------+
        |    1 | 'b' | 0.23 |
        +------+-----+------+
        |    2 | 'b' | 0.23 |
        +------+-----+------+
        |    2 | 'b' | 0.56 |
        +------+-----+------+
        |    2 | 'c' | 0.56 |
        +------+-----+------+
        | None | 'c' | 0.72 |
        +------+-----+------+

    Use the `missing` keyword argument to control which value is treated as
    missing (`None` by default).

    )FillDownView)tablefieldskwargs r   M/var/www/Datamplify/venv/lib/python3.10/site-packages/petl/transform/fills.pyfilldown
   s   Nr   c                   @      e Zd ZdddZdd ZdS )r   Nc                 C   s   || _ || _|| _d S N)r	   r
   missing)selfr	   r
   r   r   r   r   __init__`   s   
zFillDownView.__init__c                 C   s   t | j| j| jS r   )iterfilldownr	   r
   r   r   r   r   r   __iter__e   s   zFillDownView.__iter__r   __name__
__module____qualname__r   r   r   r   r   r   r   ^   s    
r   c           
      c   s    t | }zt|}W n
 ty   Y d S w t|V  |s|}t||}tt|}t|V  |D ]#}t|}|D ]}	||	 |krH||	 ||	< q9||	 ||	< q9t|V  q1d S r   )iterr   StopIterationtupler   list)
r	   
fillfieldsr   ithdrfillindicesfillrowoutrowidxr   r   r   r   i   s*   


r   Nc                 C      t | |dS )aY  
    Replace missing values with preceding non-missing values. E.g.::

        >>> import petl as etl
        >>> table1 = [['foo', 'bar', 'baz'],
        ...           [1, 'a', None],
        ...           [1, None, .23],
        ...           [1, 'b', None],
        ...           [2, None, None],
        ...           [2, None, .56],
        ...           [2, 'c', None],
        ...           [None, 'c', .72]]
        >>> table2 = etl.fillright(table1)
        >>> table2.lookall()
        +------+-----+------+
        | foo  | bar | baz  |
        +======+=====+======+
        |    1 | 'a' | 'a'  |
        +------+-----+------+
        |    1 |   1 | 0.23 |
        +------+-----+------+
        |    1 | 'b' | 'b'  |
        +------+-----+------+
        |    2 |   2 |    2 |
        +------+-----+------+
        |    2 |   2 | 0.56 |
        +------+-----+------+
        |    2 | 'c' | 'c'  |
        +------+-----+------+
        | None | 'c' | 0.72 |
        +------+-----+------+

    Use the `missing` keyword argument to control which value is treated as
    missing (`None` by default).

    r   )FillRightViewr	   r   r   r   r   	fillright      &r+   c                   @   r   )r)   Nc                 C      || _ || _d S r   r*   r   r	   r   r   r   r   r         
zFillRightView.__init__c                 C      t | j| jS r   )iterfillrightr	   r   r   r   r   r   r         zFillRightView.__iter__r   r   r   r   r   r   r)          
r)   c                 c   s    t | }zt|}W n
 ty   Y d S w t|V  |D ].}t|}t|D ]\}}|dkrE|| |krE||d  |krE||d  ||< q't|V  qd S Nr      )r   r   r   r   r   	enumerater	   r   r    r!   r$   r%   i_r   r   r   r1      s    
$r1   c                 C   r'   )aX  
    Replace missing values with following non-missing values. E.g.::

        >>> import petl as etl
        >>> table1 = [['foo', 'bar', 'baz'],
        ...           [1, 'a', None],
        ...           [1, None, .23],
        ...           [1, 'b', None],
        ...           [2, None, None],
        ...           [2, None, .56],
        ...           [2, 'c', None],
        ...           [None, 'c', .72]]
        >>> table2 = etl.fillleft(table1)
        >>> table2.lookall()
        +-----+------+------+
        | foo | bar  | baz  |
        +=====+======+======+
        |   1 | 'a'  | None |
        +-----+------+------+
        |   1 | 0.23 | 0.23 |
        +-----+------+------+
        |   1 | 'b'  | None |
        +-----+------+------+
        |   2 | None | None |
        +-----+------+------+
        |   2 | 0.56 | 0.56 |
        +-----+------+------+
        |   2 | 'c'  | None |
        +-----+------+------+
        | 'c' | 'c'  | 0.72 |
        +-----+------+------+

    Use the `missing` keyword argument to control which value is treated as
    missing (`None` by default).

    r(   )FillLeftViewr*   r   r   r   fillleft   r,   r;   c                   @   r   )r:   Nc                 C   r-   r   r*   r.   r   r   r   r      r/   zFillLeftView.__init__c                 C   r0   r   )iterfillleftr	   r   r   r   r   r   r      r2   zFillLeftView.__iter__r   r   r   r   r   r   r:      r3   r:   c                 c   s    t | }zt|}W n
 ty   Y d S w t|V  |D ]2}tt|}t|D ]\}}|dkrG|| |krG||d  |krG||d  ||< q)tt|V  qd S r4   )r   r   r   r   r   reversedr6   r7   r   r   r   r<      s    
$r<   r   )
__future__r   r   r   petl.compatr   petl.util.baser   r   r   r   r   r+   r)   r1   r;   r:   r<   r   r   r   r   <module>   s    Q
)

)
