تخطيط الرسم البياني: كيف يمكنني القيام بذلك من نقطة الصفر باستخدام البيانات المخزنة في قاعدة بيانات؟
سؤال
لدي بعض البيانات المخزنة في قاعدة بيانات مثل هذا:
Tablename: جدول الأخطاء:
+------------+--------------+
| fault_type | total |
+------------+--------------+
| 1 | 1 |
| 2 | 3 |
| 3 | 8 |
| 4 | 2 |
.............................
كيف من المفترض أن أحصل على مؤامرة رسم بياني تبدأ من هذا الجدول؟
المحلول
يفترض الحل أدناه أن لديك mysql و python و gnuplot. يمكن ضبط التفاصيل المحددة إذا لزم الأمر. نشره بحيث يمكن أن يكون خطًا أساسيًا للأقران الآخرين.
الخطوة رقم 1: تحديد نوع الرسم البياني.
إذا كانت مؤامرة تردد من نوع ما ، فيجب أن يقوم استعلام SQL البسيط بالخدعة:
select total, count(total) from faults GROUP BY total;
إذا كنت بحاجة إلى تحديد أحجام سلة ، فانتقل إلى الخطوة التالية.
الخطوة رقم 2: تأكد من أنك قادر على الاتصال بـ MySQL باستخدام Python. يمكنك استخدام استيراد MySQLDB للقيام بذلك.
بعد ذلك ، فإن رمز Python لإنشاء بيانات لمؤامرة الرسم البياني هو ما يلي (لقد تم كتابة هذا بدقة في 5 دقائق بحيث يكون خامًا جدًا):
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")
الخطوة رقم 3: استخدم gnuplot لإنشاء الرسم البياني. يمكنك استخدام البرنامج النصي التالي كنقطة انطلاق (ينشئ ملف صورة 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
احفظ البرنامج النصي أعلاه في بعض الملفات التعسفية ، sample.script. إذهب إلى الخطوة التالية.
الخطوة رقم 4: استخدم gnuplot مع البرنامج النصي للإدخال أعلاه لإنشاء ملف EPS
gnuplot sample.script
لا شيء معقد ، لكنني كنت أحسب إعادة استخدام بضع بت من هذا الرمز. مرة أخرى ، كما قلت ، هذا ليس مثاليًا ولكن يمكنك إنجاز المهمة :)
الاعتمادات:
Ofri Raviv (لمساعدتي في الخروج مع استعلام MySQL في هذا المنشور:الحصول على بيانات مؤامرة الرسم البياني)
نفسي (لكتابة السيناريو Python و Gnuplot: D)
نصائح أخرى
مقالة المدونة هذه ممكن أن تساعدك! يتحدث عن الإحصاء باستخدام gnuplot ورسم النتيجة في الرسم البياني.