![轻松学大数据挖掘:算法、场景与数据产品](https://wfqqreader-1252317822.image.myqcloud.com/cover/472/23914472/b_23914472.jpg)
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所示。
![](https://epubservercos.yuewen.com/E9A0A5/12741016003776106/epubprivate/OEBPS/Images/figure_0051_0001.jpg?sign=1738958758-PAg7iwVAnA1Jp5wnrWTOOlHSI7OTvQI2-0-3ed0fd3eef334aa5274e0212a95a6dc8)
图2-28 IPython Notebook显示结果
In[3]:df.rename(columns = {0:'',1:'',2:'',3:''}, inplace=True)
(5)进行数据分析(用Python做Excel和SPSS做的事)。
对于数据的分析,主要有以下几种方式。
① 排序(升序和降序),如图2-29所示。
![](https://epubservercos.yuewen.com/E9A0A5/12741016003776106/epubprivate/OEBPS/Images/figure_0051_0002.jpg?sign=1738958758-5Q3ZenC20hWUJjpctK54ogtkln9mTmig-0-83c07b7bc1182b7057802ef2995aee0a)
图2-29 排序(升序和降序)
注:ascending=(0)为降序;ascending=(1)为升序。
② 查看前TopN、后TopN的数据,如图2-30所示为取前两名数据。
![](https://epubservercos.yuewen.com/E9A0A5/12741016003776106/epubprivate/OEBPS/Images/figure_0052_0001.jpg?sign=1738958758-VPPJR8GiORwCCf6ocyuyYqrlu8PV6LKy-0-ef3af4a311286a9d6f3a123edbd72d70)
图2-30 取前两名数据
注:df.tail(10)取后十个数。
③ 一些基本功能的使用。
· 选择某列数据(类似SQL中的Select功能),如图2-31所示。
![](https://epubservercos.yuewen.com/E9A0A5/12741016003776106/epubprivate/OEBPS/Images/figure_0052_0002.jpg?sign=1738958758-XzQMYdSmxexd3LhGBALUornTELJdAidM-0-7c39065b8db94b57344a77c6b0d2450b)
图2-31 选择某列数据
· 进行条件判断(类似SQL中的Where功能),如图2-32所示。
![](https://epubservercos.yuewen.com/E9A0A5/12741016003776106/epubprivate/OEBPS/Images/figure_0052_0003.jpg?sign=1738958758-IZN48ZggIzL4VVJaEzhTAcoM7FPcpqN9-0-4a8af55c6eea78a08ff0b86c2fb6c698)
图2-32 进行条件判断
注:以上介绍的功能就像SQL里面的and和or的功能。
· 查询某列缺失值,如图2-33所示。
![](https://epubservercos.yuewen.com/E9A0A5/12741016003776106/epubprivate/OEBPS/Images/figure_0052_0004.jpg?sign=1738958758-jKIPJzR3tRqG8SrsUZIDNaU6W4Bj64v7-0-42feec32b1278033315ed3bf6d987340)
图2-33 查询某列缺失值
· 分组计数功能(可以看作是Excel中的数据透视图),如图2-34所示。
![](https://epubservercos.yuewen.com/E9A0A5/12741016003776106/epubprivate/OEBPS/Images/figure_0053_0001.jpg?sign=1738958758-SIaYoYUIg7aGfLgCRwW5idSfwGt23ga0-0-bf9f5b7976a28a4511fdf909aea5c900)
图2-34 分组计数功能
注意:这里为什么不使用count()函数呢?因为count()函数适用于每列的计数,同时是针对非空的数值进行统计,如图2-35所示。
![](https://epubservercos.yuewen.com/E9A0A5/12741016003776106/epubprivate/OEBPS/Images/figure_0053_0002.jpg?sign=1738958758-ZZDitPASMhK29X5GnwbG0LL0egvMGmrB-0-dfd9760d35c87dccddcda9d0d1435428)
图2-35 和使用count()函数的差异性
· 高级些的分组计数,如图2-36和图2-37所示。
![](https://epubservercos.yuewen.com/E9A0A5/12741016003776106/epubprivate/OEBPS/Images/figure_0053_0003.jpg?sign=1738958758-lLbzZwBxDDKkddD4GzIwVZhT3CzMPmzf-0-852403cc20079a74393470f50337fa56)
图2-36 分组计数(1)
![](https://epubservercos.yuewen.com/E9A0A5/12741016003776106/epubprivate/OEBPS/Images/figure_0053_0004.jpg?sign=1738958758-wQMbVX2T42XbslPrfSWuHcINkKIHHkSz-0-502fb9ab7cadf323c57faac48b56c8c2)
图2-37 分组计数(2)
④ 类似数据库的一些操作。进行关联处理,类似SQL中的join功能。
所以学习Python的数据分析,一方面可以熟悉SQL的使用,另一方面也可以提前学习Spark的一些DataFrame命令。
内连接,如图2-38所示。
![](https://epubservercos.yuewen.com/E9A0A5/12741016003776106/epubprivate/OEBPS/Images/figure_0054_0001.jpg?sign=1738958758-R0Jk3LPbxyLwsUcZVtjkFFFW7R6KFQzj-0-3a2bcf39208f82c782704168def961ed)
图2-38 内连接
df1和df2为两个数据集,关联键为key。
左连接,如图2-39所示。同理,对于右连接类似,修改right就可以了。全连接,如图2-40所示。
![](https://epubservercos.yuewen.com/E9A0A5/12741016003776106/epubprivate/OEBPS/Images/figure_0054_0002.jpg?sign=1738958758-GB56iCRm0A0PxwjdAvALKWsFKABMv7kn-0-016afe4271d0c77b126a80d8953a2a44)
图2-39 左连接
![](https://epubservercos.yuewen.com/E9A0A5/12741016003776106/epubprivate/OEBPS/Images/figure_0054_0003.jpg?sign=1738958758-9LgPgAOfA6ayAg8R7X59mPlF4pIckmIy-0-3f6d2f55bc3742227b389fba3ed44660)
图2-40 全连接
同样需要理解SQL中的全连接。union会剔除重复的,如图2-41所示;union all不会剔除重复的,如图2-42所示。
![](https://epubservercos.yuewen.com/E9A0A5/12741016003776106/epubprivate/OEBPS/Images/figure_0054_0004.jpg?sign=1738958758-3ZnXdjZaoTkJc1hB4NCvy5vjl6JZjk3Y-0-dca305cd5c7dca90c66f92b9b3575fe3)
图2-41 union会剔除重复的
![](https://epubservercos.yuewen.com/E9A0A5/12741016003776106/epubprivate/OEBPS/Images/figure_0054_0005.jpg?sign=1738958758-U6eCY99CTgm5r4rt9YadLbHlya5PTdm2-0-e99e8a6aea494dff0f78b26a0ad8c0e6)
图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时,涉及数据分析的知识大概就是这些内容。要多动手才能跟上节奏,快速进步。