轻松学大数据挖掘:算法、场景与数据产品
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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时,涉及数据分析的知识大概就是这些内容。要多动手才能跟上节奏,快速进步。