example python pandas series cdf

example - python pandas series



Trazando el CDF de una serie de pandas en python (4)

Creo que la funcionalidad que está buscando está en el método hist de un objeto Serie que envuelve la función hist () en matplotlib

Aquí está la documentación relevante

In [10]: import matplotlib.pyplot as plt In [11]: plt.hist? ... Plot a histogram. Compute and draw the histogram of *x*. The return value is a tuple (*n*, *bins*, *patches*) or ([*n0*, *n1*, ...], *bins*, [*patches0*, *patches1*,...]) if the input contains multiple data. ... cumulative : boolean, optional, default : True If `True`, then a histogram is computed where each bin gives the counts in that bin plus all bins for smaller values. The last bin gives the total number of datapoints. If `normed` is also `True` then the histogram is normalized such that the last bin equals 1. If `cumulative` evaluates to less than 0 (e.g., -1), the direction of accumulation is reversed. In this case, if `normed` is also `True`, then the histogram is normalized such that the first bin equals 1. ...

Por ejemplo

In [12]: import pandas as pd In [13]: import numpy as np In [14]: ser = pd.Series(np.random.normal(size=1000)) In [15]: ser.hist(cumulative=True, normed=1, bins=100) Out[15]: <matplotlib.axes.AxesSubplot at 0x11469a590> In [16]: plt.show()

¿Hay alguna forma de hacer esto? No puedo parecer una manera fácil de conectar series pandas con trazar un CDF.


Para mí, esto parecía una forma sencilla de hacerlo:

import numpy as np import pandas as pd import matplotlib.pyplot as plt heights = pd.Series(np.random.normal(size=100)) # empirical CDF def F(x,data): return float(len(data[data <= x]))/len(data) vF = np.vectorize(F, excluded=[''data'']) plt.plot(np.sort(heights),vF(x=np.sort(heights), data=heights))


Un diagrama de funciones de distribución acumulativa o CDF es básicamente un gráfico con los valores ordenados en el eje X y en el eje Y la distribución acumulada. Entonces, crearía una nueva serie con los valores ordenados como índice y la distribución acumulativa como valores.

Primero crea una serie de ejemplos:

import pandas as pd import numpy as np ser = pd.Series(np.random.normal(size=100))

Ordenar la serie:

ser = ser.sort_values()

Ahora, antes de continuar, vuelva a agregar el último (y mayor) valor. Este paso es importante especialmente para tamaños de muestra pequeños para obtener un CDF imparcial:

ser[len(ser)] = ser.iloc[-1]

Cree una nueva serie con los valores ordenados como índice y la distribución acumulativa como valores:

cum_dist = np.linspace(0.,1.,len(ser)) ser_cdf = pd.Series(cum_dist, index=ser)

Finalmente, trace la función como pasos:

ser_cdf.plot(drawstyle=''steps'')