【python数据挖掘课程】十一.Pandas、Matplotlib结合SQL语句可视化分析

1.MySQL数据库知识

首先在"[python爬虫] Selenium爬取内容并存储至MySQL数据库"这篇文章中我讲述了爬虫爬取数据并存储在MySQL中,如下图所示,我的所有博客文章。

【python数据挖掘课程】十一.Pandas、Matplotlib结合SQL语句可视化分析


其中创建的数据库表****内容如下所示:

[sql] view plain copy
  1. CREATE TABLE `****` (    
  2.   `ID` int(11) NOT NULL AUTO_INCREMENT,    
  3.   `URL` varchar(100) COLLATE utf8_bin DEFAULT NULL,    
  4.   `Author` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '作者',    
  5.   `Artitle` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '标题',    
  6.   `Description` varchar(400) COLLATE utf8_bin DEFAULT NULL COMMENT '摘要',    
  7.   `Manage` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '信息',    
  8.   `FBTime` datetime DEFAULT NULL COMMENT '发布日期',    
  9.   `YDNum` int(11) DEFAULT NULL COMMENT '阅读数',    
  10.   `PLNum` int(11) DEFAULT NULL COMMENT '评论数',    
  11.   `DZNum` int(11) DEFAULT NULL COMMENT '点赞数',    
  12.   PRIMARY KEY (`ID`)    
  13. ) ENGINE=InnoDB AUTO_INCREMENT=9371 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;    
运行结果如下图所示:

【python数据挖掘课程】十一.Pandas、Matplotlib结合SQL语句可视化分析


        如果再安装过程中,报错:Fatal error in launcher: Unable to create process using “”C:\Program Files (x86)\Python33\python.exe“ ”C:\Program Files (x86)\Python33\pip.exe“使用下面的命令安装。

【python数据挖掘课程】十一.Pandas、Matplotlib结合SQL语句可视化分析



2.绘制24小时博客对比

SQL语句如下:

select HOUR(FBTime) as hh, count(*) as cnt from **** group by hh;

分析博主24小时写博客的个时间段的博客数量:

【python数据挖掘课程】十一.Pandas、Matplotlib结合SQL语句可视化分析
代码如下所示:

[python] view plain copy
  1. # coding=utf-8  
  2. ''''' 
  3. ' 这篇代码主要讲述获取MySQL中数据,再进行简单的统计 
  4. ' 统计采用SQL语句进行 By:Eastmount **** 
  5. '''  
  6.   
  7. import matplotlib.pyplot as plt  
  8. import matplotlib  
  9. import pandas as pd  
  10. import numpy as np  
  11. import pylab  
  12. import MySQLdb  
  13. from pylab import *  
  14.   
  15.   
  16. # 根据SQL语句输出24小时的柱状图  
  17. try:  
  18.     conn = MySQLdb.connect(host='localhost',user='root',  
  19.                          passwd='123456',port=3306, db='test01')  
  20.     cur = conn.cursor() #数据库游标  
  21.   
  22.     #防止报错:UnicodeEncodeError: 'latin-1' codec can't encode character  
  23.     conn.set_character_set('utf8')  
  24.     cur.execute('SET NAMES utf8;')  
  25.     cur.execute('SET CHARACTER SET utf8;')  
  26.     cur.execute('SET character_set_connection=utf8;')  
  27.     sql = "select HOUR(FBTime) as hh, count(*) as cnt from **** group by hh;"  
  28.     cur.execute(sql)  
  29.     result = cur.fetchall()        #获取结果复合纸给result  
  30.     hour1 = [n[0for n in result]  
  31.     print hour1  
  32.     num1 = [n[1for n in result]  
  33.     print num1  
  34.       
  35.     N = 23    
  36.     ind = np.arange(N)  #赋值0-23    
  37.     width=0.35    
  38.     plt.bar(ind, num1, width, color='r', label='sum num')     
  39.     #设置底部名称      
  40.     plt.xticks(ind+width/2, hour1, rotation=40#旋转40度  
  41.     for i in range(23):   #中心底部翻转90度  
  42.         plt.text(i, num1[i], str(num1[i]),  
  43.                  ha='center', va='bottom', rotation=45)   
  44.     plt.title('Number-24Hour')      
  45.     plt.xlabel('hours')  
  46.     plt.ylabel('The number of blog')  
  47.     plt.legend()  
  48.     plt.savefig('08****.png',dpi=400)      
  49.     plt.show()  
  50.   
  51.   
  52. #异常处理  
  53. except MySQLdb.Error,e:  
  54.     print "Mysql Error %d: %s" % (e.args[0], e.args[1])  
  55. finally:  
  56.     cur.close()  
  57.     conn.commit()    
  58.     conn.close()  
  59.   
  60.          
运行结果如下图所示,突然发现我10点钟没有写过博客,哈哈!所以参数np.arange(23)设置成23,从图中看出午夜写博客很平凡。


【python数据挖掘课程】十一.Pandas、Matplotlib结合SQL语句可视化分析

3.每年每月博客对比

SQL语句如下:

select DATE_FORMAT(FBTime,'%Y%m') as 年份, count(*) as 数量 
from ****_blog
group by DATE_FORMAT(FBTime,'%Y%m');

分析博主从2013年开始,每个月份写博客的数量:

【python数据挖掘课程】十一.Pandas、Matplotlib结合SQL语句可视化分析

代码如下所示:

[python] view plain copy
  1. # coding=utf-8  
  2. ''''' 
  3. ' 这篇代码主要讲述获取MySQL中数据,再进行简单的统计 
  4. ' 统计采用SQL语句进行 By:Eastmount 
  5. '''  
  6.   
  7. import matplotlib.pyplot as plt  
  8. import matplotlib  
  9. import pandas as pd  
  10. import numpy as np  
  11. import pylab  
  12. import MySQLdb  
  13. from pylab import *  
  14. import matplotlib.pyplot as plt  
  15.   
  16. #根据SQL语句输出散点  
  17. try:  
  18.     conn = MySQLdb.connect(host='localhost',user='root',  
  19.                          passwd='123456',port=3306, db='test01')  
  20.     cur = conn.cursor() #数据库游标  
  21.   
  22.     #防止报错:UnicodeEncodeError: 'latin-1' codec can't encode character  
  23.     conn.set_character_set('utf8')  
  24.     cur.execute('SET NAMES utf8;')  
  25.     cur.execute('SET CHARACTER SET utf8;')  
  26.     cur.execute('SET character_set_connection=utf8;')  
  27.     sql = '''''select DATE_FORMAT(FBTime,'%Y%m'), count(*) from **** 
  28.             group by DATE_FORMAT(FBTime,'%Y%m');'''  
  29.     cur.execute(sql)  
  30.     result = cur.fetchall()        #获取结果复合纸给result  
  31.     date1 = [n[0for n in result]  
  32.     print date1  
  33.     num1 = [n[1for n in result]  
  34.     print num1  
  35.     print type(date1)  
  36.     plt.scatter(date1,num1,25,color='white',marker='o',  
  37.                 edgecolors='#0D8ECF',linewidth=3,alpha=0.8)  
  38.     plt.title('Number-12Month')      
  39.     plt.xlabel('Time')  
  40.     plt.ylabel('The number of blog')      
  41.     plt.savefig('02****.png',dpi=400)   
  42.     plt.show()  
  43.   
  44.   
  45. #异常处理  
  46. except MySQLdb.Error,e:  
  47.     print "Mysql Error %d: %s" % (e.args[0], e.args[1])  
  48. finally:  
  49.     cur.close()  
  50.     conn.commit()    
  51.     conn.close()  
  52.               
运行结果如下图所示:
【python数据挖掘课程】十一.Pandas、Matplotlib结合SQL语句可视化分析
【python数据挖掘课程】十一.Pandas、Matplotlib结合SQL语句可视化分析

然后发现改图运行效果不好,下面进行改进。


4.通过DataFrame每年每月博客对比

SQL语句查询每年发表博客数据:
select DATE_FORMAT(FBTime,'%Y'), Count(*) from ****
group by DATE_FORMAT(FBTime,'%Y');

核心代码如下所示:

[python] view plain copy
  1. # coding=utf-8  
  2. ''''' 
  3. ' 这篇代码主要讲述获取MySQL中数据,再进行简单的统计 
  4. ' 统计采用SQL语句进行 By:Eastmount 
  5. '''  
  6.   
  7. import matplotlib.pyplot as plt  
  8. import matplotlib  
  9. import pandas as pd  
  10. import numpy as np  
  11. import pylab  
  12. import MySQLdb  
  13. from pylab import *  
  14. from pandas import *  
  15.   
  16.   
  17. # 根据SQL语句输出24小时的柱状图  
  18. try:  
  19.     conn = MySQLdb.connect(host='localhost',user='root',  
  20.                          passwd='123456',port=3306, db='test01')  
  21.     cur = conn.cursor() #数据库游标  
  22.   
  23.     #防止报错:UnicodeEncodeError: 'latin-1' codec can't encode character  
  24.     conn.set_character_set('utf8')  
  25.     cur.execute('SET NAMES utf8;')  
  26.     cur.execute('SET CHARACTER SET utf8;')  
  27.     cur.execute('SET character_set_connection=utf8;')  
  28.     sql = '''''select DATE_FORMAT(FBTime,'%Y'), Count(*) from **** 
  29.                 group by DATE_FORMAT(FBTime,'%Y');'''  
  30.     cur.execute(sql)  
  31.     result = cur.fetchall()        #获取结果复合纸给result  
  32.     day1 = [n[0for n in result]  
  33.     print len(day1)  
  34.     num1 = [n[1for n in result]  
  35.     print len(num1),type(num1)  
  36.     matplotlib.style.use('ggplot')  
  37.     df=DataFrame(num1, index=day1,columns=['Nums'])  
  38.     plt.show(df.plot(kind='bar'))  
  39.     plt.savefig('05****.png',dpi=400)  
  40.   
  41.   
  42. #异常处理  
  43. except MySQLdb.Error,e:  
  44.     print "Mysql Error %d: %s" % (e.args[0], e.args[1])  
  45. finally:  
  46.     cur.close()  
  47.     conn.commit()    
  48.     conn.close()  
  49.   
  50.       
运行结果如下图所示,同时设置SQL语句"%Y-%m-%d"可以设置年月日。

【python数据挖掘课程】十一.Pandas、Matplotlib结合SQL语句可视化分析


发现2015年我写博客最多,下面是绘制月份的对比,原理一样。

【python数据挖掘课程】十一.Pandas、Matplotlib结合SQL语句可视化分析


同时如果想对比多个用户,参考下面代码:
df=DataFrame(np.random.rand(6,4),index=['one','two','three','four','five','six'],
        columns=['A','B','C','D'])
df.columns.name='Genus'
参考文章:http://www.cnblogs.com/splended/p/5229699.html

【python数据挖掘课程】十一.Pandas、Matplotlib结合SQL语句可视化分析


5.时间序列图

核心代码如下所示:

[python] view plain copy
  1. # coding=utf-8  
  2. ''''' 
  3. ' 这篇代码主要讲述获取MySQL中数据,再进行简单的统计 
  4. ' 统计采用SQL语句进行 By:Eastmount **** 
  5. '''  
  6.   
  7. import matplotlib.pyplot as plt  
  8. import matplotlib  
  9. import pandas as pd  
  10. import numpy as np  
  11. import pylab  
  12. import MySQLdb  
  13. from pylab import *  
  14.   
  15.   
  16. # 根据SQL语句输出24小时的柱状图  
  17. try:  
  18.     conn = MySQLdb.connect(host='localhost',user='root',  
  19.                          passwd='123456',port=3306, db='test01')  
  20.     cur = conn.cursor() #数据库游标  
  21.   
  22.     #防止报错:UnicodeEncodeError: 'latin-1' codec can't encode character  
  23.     conn.set_character_set('utf8')  
  24.     cur.execute('SET NAMES utf8;')  
  25.     cur.execute('SET CHARACTER SET utf8;')  
  26.     cur.execute('SET character_set_connection=utf8;')  
  27.     sql = '''''select DATE_FORMAT(FBTime,'%Y-%m-%d'), Count(*) from **** 
  28.                 group by DATE_FORMAT(FBTime,'%Y-%m-%d');'''  
  29.     cur.execute(sql)  
  30.     result = cur.fetchall()        #获取结果复合纸给result  
  31.     day1 = [n[0for n in result]  
  32.     print len(day1)  
  33.     num1 = [n[1for n in result]  
  34.     print len(num1),type(num1)  
  35.     matplotlib.style.use('ggplot')  
  36.     #获取第一天  
  37.     start = min(day1)  
  38.     print start  
  39.     #np.random.randn(len(num1)) 生成正确图形 正态分布随机数  
  40.     ts = pd.Series(np.random.randn(len(num1)),  
  41.                    index=pd.date_range(start, periods=len(num1)))  
  42.     ts = ts.cumsum()  
  43.     ts.plot()  
  44.     plt.title('Number-365Day')      
  45.     plt.xlabel('Time')  
  46.     plt.ylabel('The number of blog')  
  47.     plt.savefig('04****.png',dpi=400)      
  48.     plt.show()  
  49.   
  50.   
  51. #异常处理  
  52. except MySQLdb.Error,e:  
  53.     print "Mysql Error %d: %s" % (e.args[0], e.args[1])  
  54. finally:  
  55.     cur.close()  
  56.     conn.commit()    
  57.     conn.close()  
  58.               
运行结果如下所示:
【python数据挖掘课程】十一.Pandas、Matplotlib结合SQL语句可视化分析

同时如何设置具体的博客数量呢?设置num1参数总数递增的曲线,更多知识明天上班来解决及学习啦。