Anonymous
Лучший способ агрегирования в Polars
Сообщение
Anonymous » 17 дек 2025, 15:16
Код: Выделить всё
import random
from datetime import datetime, timedelta
import polars as pl
data = []
measurements = {
'occupation': [],
'weight': [],
'height': [],
'bmi': [],
'sugar_level': [],
}
for j in range(1000000):
weight = random.uniform(50, 100)
height = random.uniform(4.5, 7)
bmi = weight / (height ** 2)
sugar_level = random.uniform(70, 150)
measurements['occupation'].append(random.choice(['Engineer', 'Doctor', 'Teacher', 'Artist']))
measurements['weight'].append(weight)
measurements['height'].append(height)
measurements['bmi'].append(bmi)
measurements['sugar_level'].append(sugar_level)
df = pl.DataFrame(measurements)
filter_required = ((pl.col('sugar_level') > 40) & (pl.col('weight') >= 30))
other_filter = ((pl.col('weight') < 60))
groups = (
df.group_by('occupation')
.agg(
q10=pl.col('bmi').filter(filter_required).quantile(0.10),
q25=pl.col('bmi').filter(filter_required).quantile(0.25),
q50=pl.col('bmi').filter(filter_required).quantile(0.50),
q75=pl.col('bmi').filter(filter_required).quantile(0.75),
q90=pl.col('bmi').filter(filter_required).quantile(0.90),
q25_sugar=pl.col('sugar_level').filter(other_filter).quantile(0.25),
q50_sugar=pl.col('sugar_level').filter(other_filter).quantile(0.50),
q75_sugar=pl.col('sugar_level').filter(other_filter).quantile(0.75)
))
Выше приведен мой фрагмент: я применяю один и тот же фильтр несколько раз внутри группы, и это, похоже, замедляет мои вычисления. Я показал фиктивный пример. Но мой вопрос: можно ли не использовать один и тот же фильтр несколько раз внутри группы? оптимизированный способ сделать?
Подробнее здесь:
https://stackoverflow.com/questions/768 ... -in-polars
1765973795
Anonymous
[code]import random from datetime import datetime, timedelta import polars as pl data = [] measurements = { 'occupation': [], 'weight': [], 'height': [], 'bmi': [], 'sugar_level': [], } for j in range(1000000): weight = random.uniform(50, 100) height = random.uniform(4.5, 7) bmi = weight / (height ** 2) sugar_level = random.uniform(70, 150) measurements['occupation'].append(random.choice(['Engineer', 'Doctor', 'Teacher', 'Artist'])) measurements['weight'].append(weight) measurements['height'].append(height) measurements['bmi'].append(bmi) measurements['sugar_level'].append(sugar_level) df = pl.DataFrame(measurements) filter_required = ((pl.col('sugar_level') > 40) & (pl.col('weight') >= 30)) other_filter = ((pl.col('weight') < 60)) groups = ( df.group_by('occupation') .agg( q10=pl.col('bmi').filter(filter_required).quantile(0.10), q25=pl.col('bmi').filter(filter_required).quantile(0.25), q50=pl.col('bmi').filter(filter_required).quantile(0.50), q75=pl.col('bmi').filter(filter_required).quantile(0.75), q90=pl.col('bmi').filter(filter_required).quantile(0.90), q25_sugar=pl.col('sugar_level').filter(other_filter).quantile(0.25), q50_sugar=pl.col('sugar_level').filter(other_filter).quantile(0.50), q75_sugar=pl.col('sugar_level').filter(other_filter).quantile(0.75) )) [/code] Выше приведен мой фрагмент: я применяю один и тот же фильтр несколько раз внутри группы, и это, похоже, замедляет мои вычисления. Я показал фиктивный пример. Но мой вопрос: можно ли не использовать один и тот же фильтр несколько раз внутри группы? оптимизированный способ сделать? Подробнее здесь: [url]https://stackoverflow.com/questions/76805552/better-way-to-aggregate-in-polars[/url]