Я работаю с DataFrame Polars в Python, где у меня есть столбец, содержащий списки значений. Мне нужно рассчитать Z-показатели для каждого списка, используя заранее вычисленные значения среднего и стандартного отклонения. Вот образец моего DataFrame:
import polars as pl
data = {
"transcript_id": ["ENST00000711184.1"],
"OE": [[3.933402, 1.057907, None, 3.116513]],
"mean_OE": [11.882091],
"std_OE": [3.889974],
}
df_human = pl.DataFrame(data)
Для каждого списка в столбце OE я хочу вычесть среднее значение (mean_OE) и разделить на стандартное отклонение (std_OE), чтобы получить Z-показатели. Я также хочу обрабатывать значения «Нет» в списках, оставив их как «Нет» в списке Z-показателей.
Как правильно применить расчет Z-показателя к каждому списку, сохранив при этом значения «Нет»?
Заранее спасибо за любые рекомендации!
Если вас интересует обычное определение Z-показателя (с использованием сводной статистики фактических данных списка), вы можете просто использовать pl.Expr.list.eval следующим образом.
df_human.select(
pl.col("OE").list.eval((pl.element() - pl.element().mean()) / pl.element().std()).alias("z_OE")
)
shape: (1, 1)
┌─────────────────────────────────────┐
│ OE │
│ --- │
│ list[f64] │
╞═════════════════════════════════════╡
│ [1.230795, -1.6447, null, 0.413906] │
└─────────────────────────────────────┘
Если вы хотите вычислить Z-показатель явно, используя столбцы mean_OE
и std_OE
, в идеале вы можете использовать их внутри pl.Expr.list.eval
. Однако ссылка на «внешний» столбец в контексте оценки списка в настоящее время еще не поддерживается.
Вместо этого вы можете использовать технику взрыва и взрыва , как описано здесь.
z_score_expr = ((pl.col("OE").explode() - pl.col("mean_OE")) / pl.col("std_OE"))
df_human.with_columns(
z_score_expr.implode().over(pl.int_range(pl.len()))
)
shape: (1, 1)
┌─────────────────────────────────────────┐
│ OE │
│ --- │
│ list[f64] │
╞═════════════════════════════════════════╡
│ [-2.043378, -2.782585, null, -2.253377] │
└─────────────────────────────────────────┘
в вашем подходе list.eval
вы забыли разделить на станд.
@DeanMacGregor Хороший улов. Я отредактировал вопрос.
mean_OE
не содержит среднего значения элементов списка. Следует ли использовать столбцыmean_OE
/std_OE
для расчета z-показателя или следует применить обычное определение?