web-dev-qa-db-fra.com

Valeurs d'histogramme d'une série Pandas

J'ai quelques valeurs dans une série Python Pandas (tapez: 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

Je voudrais obtenir des valeurs d'histogramme (pas d'histogramme de traçage nécessaire) ... J'ai juste besoin d'obtenir la fréquence pour chaque intervalle.

Disons que mes intervalles vont de [-200; -150] à [950; 1000]

donc les limites inférieures sont

lwb = range(-200,1000,50)

et les limites supérieures sont

upb = range(-150,1050,50)

Je ne sais pas comment obtenir la fréquence (le nombre de valeurs qui sont à l'intérieur de chaque intervalle) maintenant ... Je suis sûr que la définition de lwb et upb n'est pas nécessaire ... mais je ne sais pas quelle fonction je dois utiliser pour effectuer cela! (après avoir plongé dans Pandas doc, je pense que la fonction cut peut m'aider car c'est un problème de discrétisation ... mais je ne comprends pas comment l'utiliser)

Après avoir pu le faire, je vais voir comment afficher l'histogramme (mais c'est un autre problème)

58
Femto Trader

Il vous suffit d'utiliser la fonction histogramme de NumPy:

import numpy as np
count, division = np.histogram(series)

où la division est la frontière calculée automatiquement pour vos bacs et le nombre est la population à l'intérieur de chaque bac.

Si vous devez corriger un certain nombre de casiers, vous pouvez utiliser l'argument casiers et spécifier un certain nombre de casiers, ou lui donner directement les limites entre chaque casier.

count, division = np.histogram(series, bins = [-201,-149,949,1001])

pour tracer les résultats, vous pouvez utiliser la fonction matplotlib hist, mais si vous travaillez dans pandas chaque série a sa propre poignée pour la fonction hist, et vous pouvez lui donner le binning choisi:

series.hist(bins=division)
71
EnricoGiampieri

Pour obtenir le décompte des fréquences des valeurs dans une plage d'intervalles donnée, nous pourrions utiliser pd.cut qui renvoie des indices de casiers à moitié ouverts pour chaque élément avec value_counts pour calculer leurs comptes respectifs.

Pour tracer leurs comptages, un diagramme à barres peut ensuite être réalisé.

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()

enter image description here

Fréquence pour chaque intervalle triée par ordre décroissant de leurs nombres:

out.value_counts().head()
[-100, -50)    18
[0, 50)        16
[800, 850)      2
[-50, 0)        2
[950, 1000)     1
dtype: int64

Pour modifier l'intrigue afin d'inclure uniquement l'intervalle fermé inférieur de la plage à des fins esthétiques, vous pouvez procéder comme suit:

out.cat.categories = bins[:-1]
out.value_counts(sort=False).plot.bar()

enter image description here

16
Nickil Maveli

Si vous dites que vous voulez obtenir des valeurs d'histogramme, vous recherchez simplement la fréquence de chaque valeur unique de votre série, si je ne me trompe pas. Dans ce cas, vous pouvez simplement faire serie.value_counts(), ce qui vous donnera:

 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
3
st19297