Passer au contenu principal
DataStore prend en charge de façon complète l’agrégation et les fonctions de fenêtre, en s’appuyant sur les puissantes capacités d’agrégation SQL de ClickHouse.

Agrégations de base

Méthodes intégrées

MéthodeÉquivalent SQLDescription
sum()SUM()Somme des valeurs
mean()AVG()Moyenne
count()COUNT()Nombre de valeurs non NULL
min()MIN()Valeur minimale
max()MAX()Valeur maximale
median()MEDIAN()Valeur médiane
std()stddevPop()Écart-type
var()varPop()Variance
nunique()COUNT(DISTINCT)Nombre de valeurs uniques
Exemples :
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")

# Single column aggregation
total = ds['amount'].sum()
average = ds['amount'].mean()
count = ds['amount'].count()

# All aggregations
print(ds['amount'].sum())    # Total
print(ds['amount'].mean())   # Average
print(ds['amount'].std())    # Standard deviation
print(ds['amount'].median()) # Median
print(ds['amount'].nunique()) # Unique count

Agrégations avec GroupBy

Agrégation simple

# Group by and aggregate
result = ds.groupby('category')['amount'].sum()
result = ds.groupby('region')['sales'].mean()

Agrégations multiples

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

# List of aggregations per column
result = ds.groupby('category').agg({
    'amount': ['sum', 'mean', 'max'],
    'quantity': ['sum', 'count']
})

Agrégations nommées

# Named aggregation (pandas style)
result = ds.groupby('region').agg(
    total_amount=('amount', 'sum'),
    avg_quantity=('quantity', 'mean'),
    order_count=('order_id', 'count'),
    max_price=('price', 'max')
)

Plusieurs clés de GroupBy

# Group by multiple columns
result = ds.groupby(['region', 'category']).agg({
    'amount': 'sum',
    'quantity': 'sum'
})

Agrégations statistiques

MéthodeÉquivalent SQLDescription
quantile(q)quantile(q)quantile d’ordre q (0-1)
skew()skewPop()Asymétrie
kurt()kurtPop()Kurtose
corr()corr()Corrélation
cov()covar()Covariance
sem()-Erreur standard de la moyenne
Exemples :
# Quantiles
q50 = ds['amount'].quantile(0.5)  # Median
q95 = ds['amount'].quantile(0.95) # 95th percentile

# Multiple quantiles
quantiles = ds['amount'].quantile([0.25, 0.5, 0.75])

# Correlation between columns
correlation = ds[['sales', 'marketing_spend']].corr()

Agrégations conditionnelles

Fonctions d’agrégation conditionnelle spécifiques à ClickHouse.
FonctionClickHouseDescription
sum_if(cond)sumIf()Somme si la condition est remplie
count_if(cond)countIf()Nombre si la condition est remplie
avg_if(cond)avgIf()Moyenne si la condition est remplie
min_if(cond)minIf()Minimum si la condition est remplie
max_if(cond)maxIf()Maximum si la condition est remplie
Exemples :
from chdb.datastore import F, Field

# Sum only high value orders
high_value_sum = F.sum_if(Field('amount'), Field('amount') > 1000)

# Count active users
active_count = F.count_if(Field('status') == 'active')

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

Agrégations de collecte

Fonctions spécifiques à ClickHouse qui collectent des valeurs.
FonctionClickHouseDescription
group_array()groupArray()Collecte dans un Array
group_uniq_array()groupUniqArray()Collecte des valeurs uniques dans un Array
group_concat(sep)groupConcat()Concaténation de chaînes
top_k(n)topK(n)K valeurs les plus fréquentes
any()any()Valeur quelconque
any_last()anyLast()Dernière valeur
first_value()first_value()Première valeur dans l’ordre
last_value()last_value()Dernière valeur dans l’ordre
Exemples :
from chdb.datastore import F, Field

# Collect all tags per category
result = ds.groupby('category').agg({
    'all_tags': ('tag', F.group_array()),
    'unique_tags': ('tag', F.group_uniq_array())
})

# Get top 5 products per region
result = ds.groupby('region').agg({
    'top_products': ('product_id', F.top_k(5))
})

Fonctions de fenêtre

Fonctions de classement

FunctionSQLDescription
row_number()ROW_NUMBER()Numéro de ligne consécutif
rank()RANK()Rang avec sauts
dense_rank()DENSE_RANK()Rang sans sauts
ntile(n)NTILE(n)Répartir en n groupes
percent_rank()PERCENT_RANK()Rang en percentile (0-1)
cume_dist()CUME_DIST()Distribution cumulée
Exemples :
from chdb.datastore import F, Field

# Add row number
ds['row_num'] = F.row_number().over(order_by='date')

# Rank within groups
ds['rank'] = F.rank().over(
    partition_by='category',
    order_by='sales'
)

# Dense rank (no gaps)
ds['dense_rank'] = F.dense_rank().over(
    partition_by='region',
    order_by=('revenue', 'desc')
)

# Divide into quartiles
ds['quartile'] = F.ntile(4).over(order_by='score')

Fonctions de valeur

FonctionSQLDescription
lag(n)LAG(col, n)Valeur de la ligne précédente
lead(n)LEAD(col, n)Valeur de la ligne suivante
first_value()FIRST_VALUE()Première valeur de la fenêtre
last_value()LAST_VALUE()Dernière valeur de la fenêtre
nth_value(n)NTH_VALUE(col, n)Nième valeur de la fenêtre
Exemples :
# Previous and next value
ds['prev_price'] = F.lag('price', 1).over(order_by='date')
ds['next_price'] = F.lead('price', 1).over(order_by='date')

# First and last in partition
ds['first_order'] = F.first_value('amount').over(
    partition_by='customer_id',
    order_by='date'
)

Fonctions cumulatives

MéthodeDescription
cumsum()Somme cumulée
cummax()Maximum cumulé
cummin()Minimum cumulé
cumprod()Produit cumulé
diff(n)Différence par rapport à la valeur n lignes auparavant
pct_change(n)Variation en pourcentage par rapport à la valeur n lignes auparavant
Exemples :
# Cumulative calculations
ds['running_total'] = ds['amount'].cumsum()
ds['running_max'] = ds['amount'].cummax()

# With grouping
ds['group_cumsum'] = ds.groupby('category')['amount'].cumsum()

# Period over period
ds['daily_diff'] = ds['sales'].diff(1)
ds['pct_change'] = ds['sales'].pct_change(1)

Fenêtres glissantes

# Rolling window aggregations
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()

# Expanding windows
ds['expanding_max'] = ds['price'].expanding().max()
ds['expanding_sum'] = ds['amount'].expanding().sum()

Espace de noms F

L’espace de noms F donne accès aux fonctions ClickHouse.

Import

from chdb.datastore import F, Field

Utiliser les fonctions F

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

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

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

# String
F.length(Field('name'))
F.upper(Field('text'))

# Date/Time
F.to_year(Field('date'))
F.date_diff('day', Field('start'), Field('end'))

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

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

F avec les fonctions de fenêtre

# Define window frame
window = F.window(
    partition_by='category',
    order_by='date',
    rows_between=(-7, 0)  # Current row and 7 preceding
)

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

Modèles d’agrégation courants

Top N par groupe

# Top 3 products per category by sales
result = (ds
    .assign(rank=F.row_number().over(
        partition_by='category',
        order_by=('sales', 'desc')
    ))
    .filter(ds['rank'] <= 3)
)

Cumul

# Running total of sales
ds['running_total'] = F.sum('amount').over(
    order_by='date',
    rows_between=(None, 0)  # All rows up to current
)

Moyenne mobile

# 7-day moving average
ds['ma_7'] = F.avg('price').over(
    order_by='date',
    rows_between=(-6, 0)
)

Comparaison d’une année à l’autre

# YoY comparison
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']

Rang centile

# Rank customers by total spend
ds['spend_percentile'] = F.percent_rank().over(order_by='total_spend')

Résumé des méthodes d’agrégation

CatégorieMéthodes
De basesum, mean, count, min, max, median
Statistiquesstd, var, quantile, skew, kurt, corr, cov
Conditionnellessum_if, count_if, avg_if, min_if, max_if
Collectionsgroup_array, group_uniq_array, group_concat, top_k
Classementrow_number, rank, dense_rank, ntile, percent_rank
Valeurslag, lead, first_value, last_value, nth_value
Cumuléescumsum, cummax, cummin, cumprod, diff, pct_change
Glissantesrolling().mean/sum/std/..., expanding().mean/sum/...
Dernière modification le 29 juin 2026