В настоящее время я реализую это следующим образом:
Код: Выделить всё
import polars as pl
import numpy as np
# --- Sample DataFrame for demonstration purposes
df = pl.DataFrame(
{
"GROUP1": [1, 1, 1, 2, 2, 2],
"GROUP2": ["A", "A", "A", "B", "B", "B"],
"X": [0.0, 1.0, 2.0, 0.0, 1.0, 2.0],
"Y": [5.0, 7.0, 9.0, 3.0, 4.0, 6.0],
}
)
# --- Function to subtract linear best fit per group
def subtract_linear_best_fit(df: pl.DataFrame) -> pl.DataFrame:
result = []
for _, subdf in df.group_by(["GROUP1", "GROUP2"]):
x = subdf["X"].to_numpy()
y = subdf["Y"].to_numpy()
a, b = np.polyfit(x, y, 1)
residuals = y - (a * x + b)
result.append(subdf.with_columns(pl.Series("residual", residuals)))
return pl.concat(result)
# --- Apply function
df_with_residuals = subtract_linear_best_fit(df)
print(df_with_residuals)
Я попробовал оба этих подхода, но либо потерял столбцы из исходного фрейма данных, либо просто вычислил сводку. Но я хочу иметь фрейм данных той же высоты, но с еще одним столбцом.
Есть ли способ избежать объединения фреймов данных внутри цикла? В идеале это должно быть что-то вроде .group_by().pipe() или .pipe().over().
Подробнее здесь: https://stackoverflow.com/questions/796 ... data-frame
Мобильная версия