Python Plotly CDF с данными распределения частот

#python #plotly #data-visualization #plotly-python

#python #plotly #визуализация данных #plotly-python

Вопрос:

Как вы создаете график CDF с данными распределения частот в фрейме данных Pandas, используя Plotly? Предположим, что следующие игрушечные данные

 value   freq    
1       3
2       2
3       1
 

Все примеры показывают, как это сделать с необработанными данными, которые выглядят как:

 value
1
1
1
2
2
3
 

Я могу сделать это с Pandas .plot подобным образом (но я бы предпочел сделать то же самое с Plotly):

 stats_df = df
stats_df['pdf'] = stats_df['count'] / sum(stats_df['count'])

# calculate CDF
stats_df['cdf'] = stats_df['pdf'].cumsum()
stats_df = stats_df.reset_index()

# plot
stats_df.plot(x = 'n_calls', 
              y = ['pdf', 'cdf'], 
              logx = True,
              kind = 'line',
              grid = True)
 

Если вы хотите продемонстрировать с помощью игрушечного набора данных, вот один из них: https://raw.githubusercontent.com/plotly/datasets/master/2010_alcohol_consumption_by_country.csv

Список литературы:

https://plotly.com/python/v3/discrete-frequency/

https://plotly.com/python/distplot/

Ответ №1:

Невозможно построить CDF в Plotly.

На Plotly можно построить только PDF-файл и гистограмму (образец алкоголя см. Ниже).

введите описание изображения здесь

Код для приведенного выше графика выглядит следующим образом:

 import plotly.figure_factory as ff
import pandas as pd

data = pd.read_csv(
    'https://raw.githubusercontent.com/plotly/datasets/master/2010_alcohol_consumption_by_country.csv')

x = data['alcohol'].values.tolist()

group_labels = ['']
fig = ff.create_distplot([x], group_labels,
                         bin_size=.25, show_rug=False)
fig.show()

 

Если вам нужен именно CDF, то используйте сторонние библиотеки для подготовки данных.
В приведенном ниже примере я использую Numpy.

введите описание изображения здесь

Код для приведенного выше графика выглядит следующим образом:

 import plotly.graph_objs as go
import numpy as np
import pandas as pd

data = pd.read_csv(
    'https://raw.githubusercontent.com/plotly/datasets/master/2010_alcohol_consumption_by_country.csv')

x = data['alcohol'].values.tolist()

hist, bin_edges = np.histogram(x, bins=100, density=True)
cdf = np.cumsum(hist * np.diff(bin_edges))
fig = go.Figure(data=[
    go.Bar(x=bin_edges, y=hist, name='Histogram'),
    go.Scatter(x=bin_edges, y=cdf, name='CDF')
])
fig.show()
 

Обратите внимание, что CDF представляет собой прерывистую линию. Это связано с тем, что это не приближенная функция для неизвестного распределения.
Чтобы получить плавную функцию, вам нужно знать закон распределения.