Ë
    Ìiú  ã                   ój   — 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 dl	m
Z
 d dlmZ  G d„ d	e«      Zy)
é    N)ÚAggregation)ÚHasNulls)ÚNumber)ÚDataTypeError)Ú	Quantiles)Úwarn_null_calculationc                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚPercentilesa\  
    Divide a column into 100 equal-size groups using the "CDF" method.

    See `this explanation <http://www.amstat.org/publications/jse/v14n3/langford.html>`_
    of the various methods for computing percentiles.

    "Zeroth" (min value) and "Hundredth" (max value) percentiles are included
    for reference and intuitive indexing.

    A reference implementation was provided by
    `pycalcstats <https://code.google.com/p/pycalcstats/>`_.

    This aggregation can not be applied to a :class:`.TableSet`.

    :param column_name:
        The name of a column containing :class:`.Number` data.
    c                 ó   — || _         y )N)Ú_column_name)ÚselfÚcolumn_names     ú_/var/www/html/strategist-ai/venv/lib/python3.12/site-packages/agate/aggregations/percentiles.pyÚ__init__zPercentiles.__init__   s
   € Ø'ˆÕó    c                 óæ   — |j                   | j                     }t        |j                  t        «      st        d«      ‚t        | j                  «      j                  |«      }|rt        | |«       y y )NzBPercentiles can only be applied to columns containing Number data.)	Úcolumnsr   Ú
isinstanceÚ	data_typer   r   r   Úrunr   )r   ÚtableÚcolumnÚ	has_nullss       r   ÚvalidatezPercentiles.validate    s_   € Ø—‘˜t×0Ñ0Ñ1ˆä˜&×*Ñ*¬FÔ3ÜÐ dÓeÐeä˜T×.Ñ.Ó/×3Ñ3°EÓ:ˆ	áÜ! $¨Õ/ð r   c           
      ód  — |j                   | j                     }|j                  «       }|s"t        t	        d«      D �cg c]  }d‘Œ c}«      S |d   g}t	        dd«      D ]«  }t        |«      t        |«      dz  z  }t        dt        t        j                  |«      «      «      }t        t        |«      t        t        j                  |dz   «      «      «      }||k(  r	||dz
     }	n||dz
     ||dz
     z   dz  }	|j                  |	«       Œ­ |j                  |d   «       t        |«      S c c}w )zJ
        :returns:
            An instance of :class:`Quantiles`.
        ée   Nr   é   éd   é   éÿÿÿÿ)r   r   Úvalues_without_nulls_sortedr   ÚrangeÚlenÚfloatÚmaxÚintÚmathÚceilÚminÚfloorÚappend)
r   r   r   ÚdataÚ
percentileÚ	quantilesÚkÚlowÚhighÚvalues
             r   r   zPercentiles.run+   s"  € ð
 —‘˜t×0Ñ0Ñ1ˆà×1Ñ1Ó3ˆáÜ´U¸3³ZÖ@ zšdÒ@ÓAÐAð ˜!‘W�Iˆ	ä  3›-ò 	$ˆJÜ�D“	œU :Ó.°Ñ4Ñ5ˆAä�aœœTŸY™Y q›\Ó*Ó+ˆCÜ”s˜4“y¤#¤d§j¡j°°Q±Ó&7Ó"8Ó9ˆDð �dŠ{Ø˜S 1™W™‘ð ˜c A™g™¨¨d°Q©h©Ñ7¸1Ñ<�à×Ñ˜UÕ#ð	$ð  	×Ñ˜˜b™Ô"ä˜Ó#Ð#ùò/ As   ¾	D-N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   © r   r   r
   r
      s   „ ñò"(ò	0ó!$r   r
   )r'   Úagate.aggregations.baser   Úagate.aggregations.has_nullsr   Úagate.data_typesr   Úagate.exceptionsr   Úagate.utilsr   Úagate.warnsr   r
   r7   r   r   ú<module>r>      s(   ðÛ å /Ý 1Ý #Ý *Ý !Ý -ôA$�+õ A$r   