Traçage de l'histogramme :Comment puis-je le faire à partir de zéro en utilisant des données stockées dans une base de données ?
Question
J'ai des données stockées dans une base de données comme celle-ci :
Nom de la table:Tableau des défauts:
+------------+--------------+
| fault_type | total |
+------------+--------------+
| 1 | 1 |
| 2 | 3 |
| 3 | 8 |
| 4 | 2 |
.............................
Comment suis-je censé obtenir un histogramme à partir de ce tableau ?
La solution
La solution ci-dessous suppose que vous disposez de MySQL, Python et GNUPlot.Les détails spécifiques peuvent être affinés si nécessaire.Le publier afin qu'il puisse servir de référence pour d'autres pairs.
Étape 1:Décidez du type de graphique.
S'il s'agit d'un tracé de fréquence, une simple requête SQL devrait faire l'affaire :
select total, count(total) from faults GROUP BY total;
Si vous devez spécifier des tailles de bac, passez à l'étape suivante.
Étape 2:Assurez-vous que vous pouvez vous connecter à MySQL à l'aide de Python.Vous pouvez utiliser l'importation MySQLdb pour ce faire.
Après cela, le code python pour générer des données pour un tracé d'histogramme est le suivant (cela a été écrit précisément en 5 minutes donc c'est très brut) :
import MySQLdb
def DumpHistogramData(databaseHost, databaseName, databaseUsername, databasePassword, dataTableName, binsTableName, binSize, histogramDataFilename):
#Open a file for writing into
output = open("./" + histogramDataFilename, "w")
#Connect to the database
db = MySQLdb.connect(databaseHost, databaseUsername, databasePassword, databaseName)
cursor = db.cursor()
#Form the query
sql = """select b.*, count(*) as total
FROM """ + binsTableName + """ b
LEFT OUTER JOIN """ + dataTableName + """ a
ON a.total between b.min AND b.max
group by b.min;"""
cursor.execute(sql)
#Get the result and print it into a file for further processing
count = 0;
while True:
results = cursor.fetchmany(10000)
if not results:
break
for result in results:
#print >> output, str(result[0]) + "-" + str(result[1]) + "\t" + str(result[2])
db.close()
def PrepareHistogramBins(databaseHost, databaseName, databaseUsername, databasePassword, binsTableName, maxValue, totalBins):
#Connect to the database
db = MySQLdb.connect(databaseHost, databaseUsername, databasePassword, databaseName)
cursor = db.cursor()
#Check if the table was already created
sql = """DROP TABLE IF EXISTS """ + binsTableName
cursor.execute(sql)
#Create the table
sql = """CREATE TABLE """ + binsTableName + """(min int(11), max int(11));"""
cursor.execute(sql)
#Calculate the bin size
binSize = maxValue/totalBins
#Generate the bin sizes
for i in range(0, maxValue, binSize):
if i is 0:
min = i
max = i+binSize
else:
min = i+1
max = i+binSize
sql = """INSERT INTO """ + binsTableName + """(min, max) VALUES(""" + str(min) + """, """ + str(max) + """);"""
cursor.execute(sql)
db.close()
return binSize
binSize = PrepareHistogramBins("localhost", "testing", "root", "", "bins", 5000, 100)
DumpHistogramData("localhost", "testing", "root", "", "faults", "bins", binSize, "histogram")
Étape 3:Utilisez GNUPlot pour générer l'histogramme.Vous pouvez utiliser le script suivant comme point de départ (génère un fichier image eps) :
set terminal postscript eps color lw 2 "Helvetica" 20
set output "output.eps"
set xlabel "XLABEL"
set ylabel "YLABEL"
set title "TITLE"
set style data histogram
set style histogram cluster gap 1
set style fill solid border -1
set boxwidth 0.9
set key autotitle columnheader
set xtics rotate by -45
plot "input" using 1:2 with linespoints ls 1
Enregistrez le script ci-dessus dans un fichier arbitraire, par exemple sample.script.Passez à l'étape suivante.
Étape 4:Utilisez gnuplot avec le script d'entrée ci-dessus pour générer un fichier eps
gnuplot sample.script
Rien de compliqué mais j'ai pensé que quelques bits de ce code pouvaient être réutilisés.Encore une fois, comme je l'ai dit, ce n'est pas parfait mais vous pouvez faire le travail :)
Crédits:
OFRI RAVIV (pour m'avoir aidé avec la requête MySQL dans ce post:Obtenir des données pour le tracé de l'histogramme)
Moi-même (pour écrire le script Python et GnupLot: D)
Autres conseils
Cet article de blog peut vous aider ! Il parle de statistique en utilisant gnuplot et tracer le résultat dans l'histogramme.