如何计算pct_change的极地?



现在我有一个像这样的数据框架:

df = pd.DataFrame({"asset":["a","b","c","a","b","c","b","c"],"v":[1,2,3,4,5,6,7,8],"date":["2017","2011","2012","2013","2014","2015","2016","2010"]})

我可以计算pct_change通过groupby和我的函数,像这样:

def fun(df):
df = df.sort_values(by="date")
df["pct_change"] = df["v"].pct_change()
return df
df = df.groupby("asset",as_index=False).apply(fun)

现在我想知道如何通过极值得到相同的结果?

这里有两个选项。一个使用window函数,一个使用groupby + explode函数。

您应该进行基准测试,看看在您的用例中哪个更快。

准备数据
df = pl.DataFrame({
"asset":["a","b","c","a","b","c","b","c"],
"v":[1,2,3,4,5,6,7,8],
"date":["2017","2011","2012","2013","2014","2015","2016","2010"]
})

使用窗口函数


(  
df.sort(["asset", "date"])
.with_columns([
pl.col("v").pct_change().over("asset").alias("pct_change")
])
)

使用groupby + explosion

(df.groupby("asset")
.agg([
pl.all().first(),
pl.col("v").sort_by("date").pct_change().alias("pct_change")
]).explode("pct_change")
)
结果

两输出:

shape: (8, 4)
┌───────┬─────┬──────┬────────────┐
│ asset ┆ v   ┆ date ┆ pct_change │
│ ---   ┆ --- ┆ ---  ┆ ---        │
│ str   ┆ i64 ┆ str  ┆ f64        │
╞═══════╪═════╪══════╪════════════╡
│ a     ┆ 4   ┆ 2013 ┆ null       │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ a     ┆ 1   ┆ 2017 ┆ -0.75      │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ b     ┆ 2   ┆ 2011 ┆ null       │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ b     ┆ 5   ┆ 2014 ┆ 1.5        │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ b     ┆ 7   ┆ 2016 ┆ 0.4        │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ c     ┆ 8   ┆ 2010 ┆ null       │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ c     ┆ 3   ┆ 2012 ┆ -0.625     │
├╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ c     ┆ 6   ┆ 2015 ┆ 1.0        │
└───────┴─────┴──────┴────────────┘

最新更新