[英]Plot more than one CDF in single plot
我創建了一個 function 來計算我的 dataframe 列的CDF
。 它返回一個新的 dataframe column
傳遞、 frequency
、計算PDF
和CDF
,如下所示:
import pandas as pd
import numpy as np
def compute_distrib(df, col):
stats_df = df.groupby(col)[col].agg('count').pipe(pd.DataFrame).rename(columns = {col: 'frequency'})
# PDF
stats_df['pdf'] = stats_df['frequency'] / sum(stats_df['frequency'])
# CDF
stats_df['cdf'] = stats_df['pdf'].cumsum()
stats_df = stats_df.reset_index()
return stats_df
所以以下面的 dataframe 為例:
df = pd.DataFrame(np.random.randn(100,4), columns=list('ABCD'))
要計算CDF
,我會:
df_n = compute_distrib(df, 'B')
df_n.head()
B frequency pdf cdf
0 -2.124058 1 0.01 0.01
1 -1.949440 1 0.01 0.02
2 -1.738689 1 0.01 0.03
3 -1.733489 1 0.01 0.04
4 -1.693070 1 0.01 0.05
然后到 plot CDF
:
df_n.plot(x='B', y=['cdf'], grid=True)
plt.show()
但是這個 function 允許我 plot 僅來自原始df
的 1 列的CDF
。 如何在一個 plot 中 plot 列A,B,C,D
的CDF
?
在這里,我不提供僅 pandas 的解決方案。 我認為使用plotly或seaborn會更容易。 我將稍微修改您的compute_distrib
,因為我認為避免 x 帶有列名並不是更好。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(100,4), columns=list('ABCD'))
def compute_distrib(df, col):
stats_df = df.groupby(col)[col].agg('count')\
.pipe(pd.DataFrame).rename(columns={col: 'frequency'})
# PDF
stats_df['pdf'] = stats_df['frequency'] / sum(stats_df['frequency'])
# CDF
stats_df['cdf'] = stats_df['pdf'].cumsum()
# modifications
stats_df = stats_df.reset_index()\
.rename(columns={col:"x"})
stats_df["col"] = col
return stats_df
# I calculate cdf for every columns
cdf = []
for col in list('ABCD'):
cdf.append(compute_distrib(df, col))
cdf = pd.concat(cdf, ignore_index=True)
plotly.express
import plotly.express as px
px.line(cdf, x="x", y="cdf", color="col")
seaborn
import seaborn as sns
sns.lineplot(x=cdf["x"],
y=cdf["cdf"],
hue=cdf["col"]);
我不確定是否是這種情況,但有一種方法可以只使用 plot 的cdf
而無需事先計算。
seaborn
import seaborn as sns
df1 = pd.melt(df, var_name="col", value_name="x")
kwargs = {'cumulative': True}
for grp in df1.groupby("col"):
label = grp[0]
grp = grp[1]
kwargs["label"] = label
sns.distplot(grp["x"], hist=False, kde_kws=kwargs)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.