Trazado De Histograma:¿Cómo puedo hacer desde cero con los datos almacenados en una base de datos?
Pregunta
Tengo algunos datos almacenados en una base de datos como este:
TableName:fallos Tabla:
+------------+--------------+
| fault_type | total |
+------------+--------------+
| 1 | 1 |
| 2 | 3 |
| 3 | 8 |
| 4 | 2 |
.............................
Cómo se supone que voy a obtener un histograma de la parcela a partir de esta tabla?
Solución
La solución a continuación se supone que tiene MySQL, Python y GNUPlot.Los detalles específicos pueden ajustarse si es necesario.La publicación, de manera que podría ser un punto de referencia para otros compañeros.
Paso #1:Decidir el tipo de gráfico.
Si se trata de una trama de frecuencia de algún tipo, entonces una simple consulta SQL debe hacer el truco:
select total, count(total) from faults GROUP BY total;
Si necesita especificar tamaños de bin, a continuación, continúe con el paso siguiente.
Paso #2:Asegúrese de que usted es capaz de conectarse a MySQL usando Python.Usted puede usar el import MySQLdb para ello.
Después de eso, el código de python para generar los datos de un histograma de la trama es la siguiente (esto fue escrito precisamente en 5 minutos, así que es muy crudo):
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")
Paso #3:El uso de GNUPlot para generar el histograma.Puede utilizar la siguiente secuencia de comandos como un punto de partida (genera un archivo de imagen 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
Guardar la secuencia de comandos anterior en algunos de archivo arbitrario decir, de la muestra.secuencia de comandos.Continúe con el paso siguiente.
Paso #4:El uso de gnuplot con la anterior entrada de secuencia de comandos para generar un archivo eps
gnuplot sample.script
Nada complicado, pero me di cuenta de un par de bits a partir de este código se puede reutilizar.De nuevo, como he dicho, no es perfecto, pero usted puede conseguir el trabajo hecho :)
Créditos:
Ofri Raviv (por ayudarme con la consulta de MySQL en este post:La obtención de datos para el histograma de la parcela)
A mí mismo (por escrito en python y gnuplot script :D)
Otros consejos
Este artículo del blog puede ayudarle ! Se habla de estadística usando gnuplot y trazar el resultado en histograma.