Как использовать groupby и применять с полярами

#python #pandas #pandas-groupby #python-polars

Вопрос:

Я ломаю голову, пытаясь понять, как использовать groupby apply поляры в библиотеке Python и в ней.

Исходя из Панд, я использовал:

 def get_score(df):  return spearmanr(df["prediction"], df["target"]).correlation  correlations = df.groupby("era").apply(get_score)  

Но в полярных сияниях это не работает.

Я попробовал несколько подходов, в основном вокруг:

 correlations = df.groupby("era").apply(get_score)  

Но это не удается с сообщением об ошибке:

«Может ли сеть получить атрибут фрейма данных «_df». Убедитесь, что вы возвращаете объект фрейма данных.: PyErr { тип: lt;класс ‘Ошибка атрибута’gt;, значение: ошибка атрибута («объект’numpy.float64’ не имеет атрибута ‘_df'»),

Есть какие-нибудь идеи?

Комментарии:

1. Не могли бы вы предоставить образец, пожалуйста?

Ответ №1:

По polarsgt;=0.10.4 состоянию на вас вы можете использовать эту pl.spearman_rank_corr функцию.

Если вы хотите использовать пользовательскую функцию, вы можете сделать это следующим образом:

Пользовательская функция для нескольких столбцов/выражений

 import polars as pl from typing import List from scipy import stats  df = pl.DataFrame({  "g": [1, 1, 1, 2, 2, 2, 5],  "a": [2, 4, 5, 190, 1, 4, 1],  "b": [1, 3, 2, 1, 43, 3, 1] })  def get_score(args: List[pl.Series]) -gt; pl.Series:  return pl.Series([stats.spearmanr(args[0], args[1]).correlation], dtype=pl.Float64)  (df.groupby("g", maintain_order=True)  .agg(  pl.apply(  exprs=["a", "b"],   f=get_score).alias("corr")  ))  

Поляры обеспечивали функцию

 (df.groupby("g", maintain_order=True)  .agg(  pl.spearman_rank_corr("a", "b").alias("corr")  ))  

Оба вывода:

 shape: (3, 2) ┌─────┬──────┐ │ g ┆ corr │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞═════╪══════╡ │ 1 ┆ 0.5 │ ├╌╌╌╌╌┼╌╌╌╌╌╌┤ │ 2 ┆ -1e0 │ ├╌╌╌╌╌┼╌╌╌╌╌╌┤ │ 5 ┆ NaN │ └─────┴──────┘  

Пользовательская функция для одного столбца/выражения

Мы также можем применять пользовательские функции к отдельным выражениям с помощью .apply или .map .

Ниже приведен пример того, как мы можем выровнять столбец с помощью пользовательской функции и с помощью обычных выражений полярности. Синтаксис выражения всегда должен быть предпочтительным, так как он намного быстрее.

 (df.groupby("g")  .agg(  pl.col("a").apply(lambda group: group**2).alias("squared1"),  (pl.col("a")**2).alias("squared2")  ))  

в чем разница между apply и map ?

map работает на всю колонку series . apply работает с отдельными значениями или отдельными группами, в зависимости от контекста.

select контекст:
  • map
    • тип ввода/вывода: Series
    • семантическое значение входных данных: значение столбца
  • apply
    • тип ввода/вывода: Union[int, float, str, bool]
    • семантическое значение входных данных: отдельные значения в столбце
groupby контекст:
  • map
    • тип ввода/вывода: Series
    • семантическое значение ввода: столбец списка, в котором значениями являются группы
  • apply
    • тип ввода/вывода: Series
    • семантическое значение входных данных: Группы

Комментарии:

1. Спасибо @ritchie46. Это сработало идеально.