簡體   English   中英

Plot 單個 plot 中的多個 CDF

[英]Plot more than one CDF in single plot

我創建了一個 function 來計算我的 dataframe 列的CDF 它返回一個新的 dataframe column傳遞、 frequency 、計算PDFCDF ,如下所示:

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,DCDF

在這里,我不提供僅 pandas 的解決方案。 我認為使用plotlyseaborn會更容易。 我將稍微修改您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM