2.4.3 开发流程
(1)梳理业务逻辑,在集群环境中编写Hive脚本,定时加工数据,再同步到MySQL中。
(2)运行IPython Notebook,利用Python关联MySQL数据库,调取需求数据。
In[1]:import select_data
这样数据就存储在alldata中了,直接调用alldata即可。其中函数方法如下。
def select_data(): try: conn=MySQLdb.connect(host='', user='', passwd='', db='', charset= 'utf8') except Exception, e: print e sys.exit() cursor=conn.cursor() x =raw_input("输入sql的查询语句") sql=x.decode('gbk') cursor.execute(sql) alldata=cursor.fetchall() conn.commit() cursor.close() conn.close() return alldata
(3)循环导入数据,利用pandas库进行分析。
In[2]:df = pd.DataFrame( [[ij for ij in i] for i in alldata] )
(4)更新数据属性、更新列名,IPython Notebook显示结果如图2-28所示。
图2-28 IPython Notebook显示结果
In[3]:df.rename(columns = {0:'',1:'',2:'',3:''}, inplace=True)
(5)进行数据分析(用Python做Excel和SPSS做的事)。
对于数据的分析,主要有以下几种方式。
① 排序(升序和降序),如图2-29所示。
图2-29 排序(升序和降序)
注:ascending=(0)为降序;ascending=(1)为升序。
② 查看前TopN、后TopN的数据,如图2-30所示为取前两名数据。
图2-30 取前两名数据
注:df.tail(10)取后十个数。
③ 一些基本功能的使用。
· 选择某列数据(类似SQL中的Select功能),如图2-31所示。
图2-31 选择某列数据
· 进行条件判断(类似SQL中的Where功能),如图2-32所示。
图2-32 进行条件判断
注:以上介绍的功能就像SQL里面的and和or的功能。
· 查询某列缺失值,如图2-33所示。
图2-33 查询某列缺失值
· 分组计数功能(可以看作是Excel中的数据透视图),如图2-34所示。
图2-34 分组计数功能
注意:这里为什么不使用count()函数呢?因为count()函数适用于每列的计数,同时是针对非空的数值进行统计,如图2-35所示。
图2-35 和使用count()函数的差异性
· 高级些的分组计数,如图2-36和图2-37所示。
图2-36 分组计数(1)
图2-37 分组计数(2)
④ 类似数据库的一些操作。进行关联处理,类似SQL中的join功能。
所以学习Python的数据分析,一方面可以熟悉SQL的使用,另一方面也可以提前学习Spark的一些DataFrame命令。
内连接,如图2-38所示。
图2-38 内连接
df1和df2为两个数据集,关联键为key。
左连接,如图2-39所示。同理,对于右连接类似,修改right就可以了。全连接,如图2-40所示。
图2-39 左连接
图2-40 全连接
同样需要理解SQL中的全连接。union会剔除重复的,如图2-41所示;union all不会剔除重复的,如图2-42所示。
图2-41 union会剔除重复的
图2-42 union all不会剔除重复的
注:要理解union all和union的使用区别,因为在HQL中也会经常用到。
(6)将清洗后的数据生成附件,这里可以采取to_csv来生成,不过这样就容易导致生成的CSV文件通过Excel打开时会显示为乱码(需要设置Excel的编码格式)。所以最好采取to_excel来生成。
如果出现下面问题:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
利用如下代码解决。
import sys reload(sys) sys.setdefaultencoding('utf8')
(7)通过邮箱发送附件数据。
def send_email(): email=raw_input("input email: ") subject=raw_input("input subject: ") msg = MIMEMultipart() att1 = MIMEText(open(' 附件地址 ', 'rb').read(), 'base64', 'gb2312') att1["Content-Type"] = 'application/octet-stream' att1["Content-Disposition"] = 'attachment; filename="文件名称"' msg.attach(att1) msg['to'] = email msg['from'] = ’发送邮箱地址’ msg['subject'] = subject try: server = smtplib.SMTP() server.connect(’设置端口’) server.login(’发送邮箱地址’, ’密码’) server.sendmail(msg['from'], msg['to'], msg.as_string()) server.quit() print u’发送成功’ except Exception, e: print str(e)
总结:学习Python时,涉及数据分析的知识大概就是这些内容。要多动手才能跟上节奏,快速进步。