Comment créer des données de fréquence pour un histogramme?

2020-08-02 python

J'importe un fichier Excel avec une seule colonne de données et je souhaite créer un histogramme. Je veux que l'axe des x soit les données elles-mêmes et l'axe des y la fréquence de ces données.

Comment créer un dictionnaire qui compte la fréquence des données?

Je sais que j'ai besoin de créer deux dictionnaires:

x = The data from the excel file 
y = [] what goes here? 

Answers

Cela pourrait fonctionner dans votre cas:

# Need not be sorted, necessarily
>>> a = (0, 1, 1, 1, 2, 3, 7, 7, 23)

>>> def count_elements(seq) -> dict:
...     """Tally elements from `seq`."""
...     hist = {}
...     for i in seq:
...         hist[i] = hist.get(i, 0) + 1
...     return hist

>>> counted = count_elements(a)
>>> counted
{0: 1, 1: 3, 2: 1, 3: 1, 7: 2, 23: 1}

count_elements () renvoie un dictionnaire avec des éléments uniques de la séquence sous forme de clés et leurs fréquences (décomptes) sous forme de valeurs.

Dans la boucle sur seq, hist [i] = hist.get (i, 0) + 1 dit, "pour chaque élément de la séquence, incrémentez sa valeur correspondante dans hist de 1."

Si vous avez une entrée comme celle-ci:

x_orig=[1993, 1998, 1999, 1997, 1996, 1993, 1995, 1996]

Le moyen le plus efficace et le plus évolutif est d'utiliser les collections bibliothèques pour le y et de créer un ensemble de x_orig pour éviter les répétitions:

from collections import Counter

y=Counter(x_orig)
x=set(x_orig)

Résultat:

x={1993, 1995, 1996, 1997, 1998, 1999}
y=Counter({1993: 2, 1998: 1, 1999: 1, 1997: 1, 1996: 2, 1995: 1})

Vous pouvez ensuite facilement tracer ces deux variables.

Il n'y a aucune raison de réinventer la roue. Numpy fournit les outils dont vous avez besoin pour ce projet.

import numpy as np 

my_column = np.random.random(20) # this is the column you load from Excel
my_bins = np.linspace(0,1,num=5) # 4 bins in your histogram      
my_hist = np.histogram(my_column,bins = my_bins) 
print (my_hist[0]) # this is your freqency distribution

Production:

[6 4 5 5]

Related