python - español - pandas series plot
Valores de histograma de una serie de pandas (3)
Tengo algunos valores en Python Pandas Series (tipo: pandas.core.series.Series)
In [1]: series = pd.Series([0.0,950.0,-70.0,812.0,0.0,-90.0,0.0,0.0,-90.0,0.0,-64.0,208.0,0.0,-90.0,0.0,-80.0,0.0,0.0,-80.0,-48.0,840.0,-100.0,190.0,130.0,-100.0,-100.0,0.0,-50.0,0.0,-100.0,-100.0,0.0,-90.0,0.0,-90.0,-90.0,63.0,-90.0,0.0,0.0,-90.0,-80.0,0.0,])
In [2]: series.min()
Out[2]: -100.0
In [3]: series.max()
Out[3]: 950.0
Me gustaría obtener valores de histograma (no es necesario trazar un histograma) ... Solo necesito obtener la frecuencia para cada intervalo.
Digamos que mis intervalos van desde [-200; -150] a [950; 1000]
por lo que los límites más bajos son
lwb = range(-200,1000,50)
y los límites superiores son
upb = range(-150,1050,50)
No sé cómo obtener la frecuencia (el número de valores que hay dentro de cada intervalo) ahora ... Estoy seguro de que la definición de lwb y upb no es necesaria ... pero no sé qué función debo usar para realizar esto! (Después de bucear en el documento de Pandas, creo que la función de cut
puede ayudarme porque es un problema de discretización ... pero no entiendo cómo usarlo)
Después de poder hacer esto, voy a echar un vistazo a la manera de mostrar el histograma (pero ese es otro problema)
Con el fin de obtener los recuentos de frecuencia de los valores en un intervalo binned intervalo dado, podríamos hacer uso de pd.cut
que devuelve índices de la mitad de los contenedores abiertos para cada elemento junto con value_counts
para calcular sus respectivos recuentos.
Para trazar sus cuentas, se puede hacer un diagrama de barras.
step = 50
bin_range = np.arange(-200, 1000+step, step)
out, bins = pd.cut(s, bins=bin_range, include_lowest=True, right=False, retbins=True)
out.value_counts(sort=False).plot.bar()
Frecuencia para cada intervalo ordenado en orden descendente de sus recuentos:
out.value_counts().head()
[-100, -50) 18
[0, 50) 16
[800, 850) 2
[-50, 0) 2
[950, 1000) 1
dtype: int64
Para modificar el trazado e incluir solo el intervalo inferior cerrado del rango con fines estéticos, puede hacer:
out.cat.categories = bins[:-1]
out.value_counts(sort=False).plot.bar()
Si dice que quiere obtener valores de histograma, simplemente está buscando la frecuencia de cada valor único en su serie, si no me equivoco. En ese caso, simplemente puede hacer serie.value_counts()
, que le dará:
0.0 16
-90.0 8
-100.0 5
-80.0 3
63.0 1
-50.0 1
130.0 1
190.0 1
840.0 1
-48.0 1
208.0 1
-64.0 1
812.0 1
-70.0 1
950.0 1
Solo necesita usar la función de histograma de numpy:
import numpy as np
count, division = np.histogram(series)
donde la división es el borde calculado automáticamente para sus contenedores y el recuento es la población dentro de cada contenedor.
Si necesita arreglar un cierto número de contenedores, puede usar los contenedores de argumentos y especificar un número de contenedores, o darle directamente los límites entre cada contenedor.
count, division = np.histogram(series, bins = [-201,-149,949,1001])
para trazar los resultados, puede usar la función hist. de matplotlib, pero si trabaja en pandas, cada serie tiene su propio identificador para la función hist y puede asignarle el binning elegido:
series.hist(bins=division)