官术网_书友最值得收藏!

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時,涉及數據分析的知識大概就是這些內容。要多動手才能跟上節奏,快速進步。

主站蜘蛛池模板: 玉山县| 邯郸县| 枞阳县| 闻喜县| 彰化县| 新蔡县| 漾濞| 通化县| 石门县| 汉阴县| 平谷区| 克山县| 海宁市| 平顶山市| 威海市| 罗源县| 天等县| 天水市| 千阳县| 祁连县| 攀枝花市| 自贡市| 鹰潭市| 通化市| 河西区| 天全县| 潮安县| 乳山市| 五台县| 绥阳县| 瓮安县| 土默特右旗| 屯留县| 乐业县| 富阳市| 玉树县| 尤溪县| 云林县| 茌平县| 安仁县| 崇信县|