Saltar al contenido principal
DataStore ofrece un soporte completo para funciones de agregación y de ventana, aprovechando las potentes capacidades de agregación SQL de ClickHouse.

Agregaciones básicas

Métodos integrados

MétodoEquivalente en SQLDescripción
sum()SUM()Suma de valores
mean()AVG()Promedio/media
count()COUNT()Cuenta los valores no nulos
min()MIN()Valor mínimo
max()MAX()Valor máximo
median()MEDIAN()Mediana
std()stddevPop()Desviación estándar
var()varPop()Varianza
nunique()COUNT(DISTINCT)Cuenta los valores únicos
Ejemplos:
from pathlib import Path
Path("sales.csv").write_text("""\
region,product,category,amount,quantity,price,date,order_id
East,Widget,Electronics,5200,10,120,2024-01-15,1001
West,Gadget,Electronics,800,5,160,2024-02-20,1002
East,Gizmo,Home,6500,3,100,2024-03-10,1003
North,Widget,Electronics,4500,6,150,2024-06-18,1004
West,Gadget,Electronics,2000,8,250,2024-09-14,1005
""")

from chdb import datastore as pd

ds = pd.read_csv("sales.csv")

# Agregación de una columna
total = ds['amount'].sum()
average = ds['amount'].mean()
count = ds['amount'].count()

# Todas las agregaciones
print(ds['amount'].sum())    # Total
print(ds['amount'].mean())   # Media
print(ds['amount'].std())    # Desviación estándar
print(ds['amount'].median()) # Mediana
print(ds['amount'].nunique()) # Recuento de valores únicos

Agregaciones de GroupBy

Agregación simple

# Agrupar y agregar
result = ds.groupby('category')['amount'].sum()
result = ds.groupby('region')['sales'].mean()

Agregaciones múltiples

# Sintaxis de diccionario
result = ds.groupby('category').agg({
    'amount': 'sum',
    'quantity': 'mean',
    'order_id': 'count'
})

# Lista de agregaciones por columna
result = ds.groupby('category').agg({
    'amount': ['sum', 'mean', 'max'],
    'quantity': ['sum', 'count']
})

Agregaciones con nombre

# Agregación con nombre (estilo pandas)
result = ds.groupby('region').agg(
    total_amount=('amount', 'sum'),
    avg_quantity=('quantity', 'mean'),
    order_count=('order_id', 'count'),
    max_price=('price', 'max')
)

Múltiples claves de agrupación

# Agrupar por múltiples columnas
result = ds.groupby(['region', 'category']).agg({
    'amount': 'sum',
    'quantity': 'sum'
})

Agregaciones estadísticas

MétodoEquivalente en SQLDescripción
quantile(q)quantile(q)cuantil q-ésimo (0-1)
skew()skewPop()Asimetría
kurt()kurtPop()Curtosis
corr()corr()Correlación
cov()covar()Covarianza
sem()-Error estándar de la media
Ejemplos:
# Cuantiles
q50 = ds['amount'].quantile(0.5)  # Mediana
q95 = ds['amount'].quantile(0.95) # Percentil 95

# Múltiples cuantiles
quantiles = ds['amount'].quantile([0.25, 0.5, 0.75])

# Correlación entre columnas
correlation = ds[['sales', 'marketing_spend']].corr()

Agregaciones condicionales

Funciones de agregación condicional específicas de ClickHouse.
FunciónClickHouseDescripción
sum_if(cond)sumIf()Suma si se cumple la condición
count_if(cond)countIf()Recuento si se cumple la condición
avg_if(cond)avgIf()Promedio si se cumple la condición
min_if(cond)minIf()Mínimo si se cumple la condición
max_if(cond)maxIf()Máximo si se cumple la condición
Ejemplos:
from chdb.datastore import F, Field

# Sumar solo los pedidos de alto valor
high_value_sum = F.sum_if(Field('amount'), Field('amount') > 1000)

# Contar los usuarios activos
active_count = F.count_if(Field('status') == 'active')

# En el contexto de groupby
result = ds.groupby('region').agg({
    'total': ('amount', 'sum'),
    'high_value': ('amount', F.sum_if(Field('amount') > 1000)),
})

Agregaciones de recopilación

Funciones específicas de ClickHouse que recopilan valores.
FUNCTIONClickHouseDescription
group_array()groupArray()Recopila en un array
group_uniq_array()groupUniqArray()Recopila valores únicos en un array
group_concat(sep)groupConcat()Concatena cadenas
top_k(n)topK(n)Top K de valores más frecuentes
any()any()Un valor cualquiera
any_last()anyLast()Último valor
first_value()first_value()Primer valor en orden
last_value()last_value()Último valor en orden
Ejemplos:
from chdb.datastore import F, Field

# Recopila todas las etiquetas por categoría
result = ds.groupby('category').agg({
    'all_tags': ('tag', F.group_array()),
    'unique_tags': ('tag', F.group_uniq_array())
})

# Obtén los 5 productos principales por región
result = ds.groupby('region').agg({
    'top_products': ('product_id', F.top_k(5))
})

Funciones de ventana

Funciones de clasificación

FunciónSQLDescripción
row_number()ROW_NUMBER()Número de fila secuencial
rank()RANK()Rango con huecos
dense_rank()DENSE_RANK()Rango sin huecos
ntile(n)NTILE(n)Divide en n grupos
percent_rank()PERCENT_RANK()Rango porcentual (0-1)
cume_dist()CUME_DIST()Distribución acumulada
Ejemplos:
from chdb.datastore import F, Field

# Agregar número de fila
ds['row_num'] = F.row_number().over(order_by='date')

# Rango dentro de grupos
ds['rank'] = F.rank().over(
    partition_by='category',
    order_by='sales'
)

# Rango denso (sin huecos)
ds['dense_rank'] = F.dense_rank().over(
    partition_by='region',
    order_by=('revenue', 'desc')
)

# Dividir en cuartiles
ds['quartile'] = F.ntile(4).over(order_by='score')

Funciones de valor

FunciónSQLDescripción
lag(n)LAG(col, n)Valor de la fila anterior
lead(n)LEAD(col, n)Valor de la fila siguiente
first_value()FIRST_VALUE()Primer valor de la ventana
last_value()LAST_VALUE()Último valor de la ventana
nth_value(n)NTH_VALUE(col, n)Enésimo valor de la ventana
Ejemplos:
# Valor anterior y siguiente
ds['prev_price'] = F.lag('price', 1).over(order_by='date')
ds['next_price'] = F.lead('price', 1).over(order_by='date')

# Primero y último en la partición
ds['first_order'] = F.first_value('amount').over(
    partition_by='customer_id',
    order_by='date'
)

Funciones acumulativas

MétodoDescripción
cumsum()Suma acumulada
cummax()Máximo acumulado
cummin()Mínimo acumulado
cumprod()Producto acumulado
diff(n)Diferencia respecto a n filas atrás
pct_change(n)Cambio porcentual respecto a n filas atrás
Ejemplos:
# Cálculos acumulados
ds['running_total'] = ds['amount'].cumsum()
ds['running_max'] = ds['amount'].cummax()

# Con agrupación
ds['group_cumsum'] = ds.groupby('category')['amount'].cumsum()

# Período a período
ds['daily_diff'] = ds['sales'].diff(1)
ds['pct_change'] = ds['sales'].pct_change(1)

Ventanas móviles

# Agregaciones de ventana deslizante
ds['rolling_avg'] = ds['price'].rolling(window=7).mean()
ds['rolling_sum'] = ds['amount'].rolling(window=30).sum()
ds['rolling_std'] = ds['value'].rolling(window=10).std()

# Ventanas en expansión
ds['expanding_max'] = ds['price'].expanding().max()
ds['expanding_sum'] = ds['amount'].expanding().sum()

Espacio de nombres F

El espacio de nombres F proporciona acceso a las funciones de ClickHouse.

Importación

from chdb.datastore import F, Field

Uso de funciones F

# Agregaciones
F.sum(Field('amount'))
F.avg(Field('price'))
F.count(Field('id'))

# Estadísticas
F.quantile(Field('value'), 0.95)
F.stddev_pop(Field('score'))
F.corr(Field('x'), Field('y'))

# Condicionales
F.sum_if(Field('amount'), Field('status') == 'completed')
F.count_if(Field('is_active'))

# Cadenas de texto
F.length(Field('name'))
F.upper(Field('text'))

# Fecha/Hora
F.to_year(Field('date'))
F.date_diff('day', Field('start'), Field('end'))

# Arrays
F.array_sum(Field('values'))
F.array_avg(Field('scores'))

# Matemáticas
F.abs(Field('delta'))
F.round(Field('price'), 2)
F.floor(Field('value'))
F.ceil(Field('value'))

F con funciones de ventana

# Definir el marco de ventana
window = F.window(
    partition_by='category',
    order_by='date',
    rows_between=(-7, 0)  # Fila actual y las 7 anteriores
)

ds['rolling_avg'] = F.avg(Field('price')).over(window)

Patrones de agregación comunes

Top N por grupo

# Top 3 productos por categoría según ventas
result = (ds
    .assign(rank=F.row_number().over(
        partition_by='category',
        order_by=('sales', 'desc')
    ))
    .filter(ds['rank'] <= 3)
)

Suma acumulada

# Total acumulado de ventas
ds['running_total'] = F.sum('amount').over(
    order_by='date',
    rows_between=(None, 0)  # Todas las filas hasta la actual
)

Media móvil

# promedio móvil de 7 días
ds['ma_7'] = F.avg('price').over(
    order_by='date',
    rows_between=(-6, 0)
)

Comparación interanual

# Comparación interanual
ds['prev_year_sales'] = F.lag('sales', 12).over(
    partition_by='product_id',
    order_by='month'
)
ds['yoy_growth'] = (ds['sales'] - ds['prev_year_sales']) / ds['prev_year_sales']

Clasificación percentil

# Clasificar clientes por gasto total
ds['spend_percentile'] = F.percent_rank().over(order_by='total_spend')

Resumen de métodos de agregación

CategoríaMétodos
Básicosum, mean, count, min, max, median
Estadísticostd, var, quantile, skew, kurt, corr, cov
Condicionalsum_if, count_if, avg_if, min_if, max_if
Coleccióngroup_array, group_uniq_array, group_concat, top_k
clasificaciónrow_number, rank, dense_rank, ntile, percent_rank
Valorlag, lead, first_value, last_value, nth_value
Acumulativocumsum, cummax, cummin, cumprod, diff, pct_change
móvilrolling().mean/sum/std/..., expanding().mean/sum/...
Última modificación el 10 de junio de 2026