Код: Выделить всё
df = pl.DataFrame({
"Buy_Signal": [1, 0, 1, 0, 0],
"Returns": np.random.normal(0, 0.1, 5),
})
Каков наиболее полярный способ сделать это?< /p>
Мое «глупое» решение (прежде чем я смогу применить агрегирование) выглядит следующим образом:
Код: Выделить всё
df = (df
.with_columns(pl.col("Buy_Signal").cum_sum().alias("Holdings"))
# (1) Determine returns for each holding period (>=1, >=2) and unpivot into one column
.with_columns(
pl.when(pl.col("Holdings") >= 1).then(pl.col("Returns")).alias("Port_1"),
pl.when(pl.col("Holdings") >= 2).then(pl.col("Returns")).alias("Port_2"),
)
)
Код: Выделить всё
def calc_port_returns(_df: pl.DataFrame) -> pl.DataFrame:
n_portfolios = _df["Buy_Signal"].sum()
data = pl.DataFrame()
_df = _df.with_columns(pl.col("Buy_Signal").cum_sum().alias("Holdings"))
for i in range(1, n_portfolios + 1):
tmp = (
_df.with_columns(
pl.when(pl.col("Holdings") >= i).then(pl.col("Returns")).alias(f"Port_{i}"),
)
.select(pl.col(f"Port_{i}"))
)
data = pl.concat([data, tmp], how="horizontal")
_df = pl.concat([_df, data], how="horizontal")
return _df
df = pl.DataFrame({
"Buy_Signal": [1, 0, 1, 0, 0],
"Returns": np.random.normal(0, 0.1, 5),
})
df.pipe(calc_port_returns)
Спасибо за любые предложения.
Подробнее здесь: https://stackoverflow.com/questions/778 ... ferent-len