Построение CDF столбцов из CSV-файла с использованием панд

#python #pandas #matplotlib #seaborn #cdf

Вопрос:

Я хочу построить значение CDF столбцов из CSV-файла, используя pandas следующим образом:

Я пробовал некоторые коды, но они не сообщают о правильном сюжете. Можете ли вы помочь с простым способом?

 df = pd.read_csv('pathfile.csv')
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
    return stats_df

cdf = []
for col in ['1','2','3','4']: 
    cdf.append(compute_distrib(df, col))
cdf = pd.concat(cdf, ignore_index=True)

import seaborn as sns

sns.lineplot(x=cdf["X"],
             y=cdf["CDF"],
             hue=cdf[" "]);
 

Комментарии:

1. Не могли бы вы, пожалуйста, добавить больше кода? Я не могу понять, что ты пытаешься сделать.

2. Спасибо, в том числе. Пожалуйста, посмотрите результат вывода; это не кривая CDF.

Ответ №1:

Из-за отсутствия исполняемого кода в вашем посте я создал свой собственный код для построения CDF столбцов фрейма данных df :

 import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from itertools import accumulate


# GENERATE EXAMPLE DATA
df = pd.DataFrame()
df['x1'] = np.random.uniform(-1,1, size=1000)
df['x2'] = df['x1']   np.random.uniform(-1,1, size=1000)
df['x3'] = df['x2']   np.random.uniform(-1,1, size=1000)
df['x4'] = df['x3']   np.random.uniform(-1, 1, size=1000)

# START A PLOT
fig,ax = plt.subplots()

for col in df.columns:

  # SKIP IF IT HAS ANY INFINITE VALUES
  if not all(np.isfinite(df[col].values)):
    continue

  # USE numpy's HISTOGRAM FUNCTION TO COMPUTE BINS
  xh, xb = np.histogram(df[col], bins=60, normed=True)

  # COMPUTE THE CUMULATIVE SUM WITH accumulate
  xh = list(accumulate(xh))
  # NORMALIZE THE RESULT
  xh = np.array(xh) / max(xh)

  # PLOT WITH LABEL
  ax.plot(xb[1:], xh, label=f"$CDF$({col})")
ax.legend()
plt.title("CDFs of Columns")
plt.show()
 

Результирующий график из этого кода приведен ниже:

Участок CDF

Чтобы ввести свои собственные данные, просто замените # GENERATE EXAMPLE DATA раздел на df = pd.read_csv('path/to/sheet.csv')

Дайте мне знать, если вам что-то в примере непонятно или если это нуждается в дополнительных объяснениях.

Комментарии:

1. @пользователь Я добавил это в нижней части моего поста, спасибо, что спросили.

2. @пользователь, в какой строке вы допустили эту ошибку?

3. @пользователь только что добавил проверку на конечность в каждом столбце. Если столбец содержит бесконечное значение, его вычисление CDF будет пропущено.

4. @пользователь Удаляет значения NaN из ваших данных. Они являются причиной проблемы. использовать df = df.dropna()

5. @пользователь это после того, как вы отметите мой ответ как «принято».