trouver les valeurs moyennes de bin en utilisant histogram2d python [dupliquer]
cette question a déjà une réponse ici:
comment calculer les valeurs moyennes des bacs avec un histogramme 2D en python? J'ai des plages de température pour les axes x et y et j'essaie de tracer la probabilité de foudre utilisant des bacs pour les températures respectives. Je lis dans les données d'un fichier csv et mon code est tel:
filename = 'Random_Events_All_Sorted_85GHz.csv'
df = pd.read_csv(filename)
min37 = df.min37
min85 = df.min85
verification = df.five_min_1
#Numbers
x = min85
y = min37
H = verification
#Estimate the 2D histogram
nbins = 4
H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
#Rotate and flip H
H = np.rot90(H)
H = np.flipud(H)
#Mask zeros
Hmasked = np.ma.masked_where(H==0,H)
#Plot 2D histogram using pcolor
fig1 = plt.figure()
plt.pcolormesh(xedges,yedges,Hmasked)
plt.xlabel('min 85 GHz PCT (K)')
plt.ylabel('min 37 GHz PCT (K)')
cbar = plt.colorbar()
cbar.ax.set_ylabel('Probability of Lightning (%)')
plt.show()
Cela fait une belle parcelle, mais les données qui sont tracées est le nombre, ou le nombre d'échantillons qui tombent dans chaque cellule. La variable de vérification est un tableau qui contient 1's et 0's, où un 1 indique la foudre et un 0 indique aucun éclair. Je veux que les données de l'intrigue à la probabilité de foudre pour un bin basé sur le données de la variable de vérification-j'ai donc besoin de bin_mean * 100 pour obtenir ce pourcentage.
j'ai essayé d'utiliser une approche similaire à celle montrée ici ( binning data in python avec scipy/numpy ), mais j'avais de la difficulté à la faire fonctionner pour un histogramme 2D.
2 réponses
cela est faisable au moins avec la méthode suivante
# xedges, yedges as returned by 'histogram2d'
# create an array for the output quantities
avgarr = np.zeros((nbins, nbins))
# determine the X and Y bins each sample coordinate belongs to
xbins = np.digitize(x, xedges[1:-1])
ybins = np.digitize(y, yedges[1:-1])
# calculate the bin sums (note, if you have very many samples, this is more
# effective by using 'bincount', but it requires some index arithmetics
for xb, yb, v in zip(xbins, ybins, verification):
avgarr[yb, xb] += v
# replace 0s in H by NaNs (remove divide-by-zero complaints)
# if you do not have any further use for H after plotting, the
# copy operation is unnecessary, and this will the also take care
# of the masking (NaNs are plotted transparent)
divisor = H.copy()
divisor[divisor==0.0] = np.nan
# calculate the average
avgarr /= divisor
# now 'avgarr' contains the averages (NaNs for no-sample bins)
si vous connaissez les bords de la corbeille à l'avance, vous pouvez faire l'histogramme dans la même partie juste en ajoutant une rangée.
il y a un moyen élégant et rapide de le faire! Utiliser weights
paramètre pour additionner les valeurs:
denominator, xedges, yedges = np.histogram2d(x,y,bins=nbins)
nominator, _, _ = np.histogram2d(x,y,bins=[xedges, yedges], weights=verification)
donc tout ce que vous avez besoin est de diviser dans chaque bin la somme des valeurs par le nombre d'événements:
result = nominator / denominator
voilà!