1. 程式人生 > >【利用python進行資料分析】準備與例項(一)

【利用python進行資料分析】準備與例項(一)

我已經分享了本書的ipynb,所以跟著我一起來實驗吧。如果你不懂怎麼開啟ipynb格式的檔案,那也沒關係,anaconda3讓一切變得更簡單(我像是打廣告的)。

安裝玩anaconda之後,我們在開始裡就可以找到它的資料夾,裡面有一個Jupyter Notebook,就是它了。點開之後,彈出cmd的黑視窗,接著瀏覽器彈出網頁,那麼就啟動成功了(這裡別去關掉cmd的黑視窗,最小化就行),它的主頁一般定位在“我的文件”,所以,為了方便起見,把你下載好的ipynb檔案放到“我的檔案”下,解壓成資料夾即可在瀏覽器中點選檢視。

我們處理資料,基本都要完成以下幾大任務:

  • 與外界進行互動,讀寫各種各樣的檔案格式和資料庫
  • 準備,對資料進行清理、修整、整合、規範化、重塑、切片切塊、變形等處理以便進行分析
  • 轉換,對資料集做一些數學和統計運算,以產生新的資料集。比如說,根據分組變數對一個大表進行聚合
  • 建模和計算,將資料跟統計模型、機器學習演算法或其他計算工具聯絡起來
  • 展示,建立互動式的或靜態的圖片或文字摘要

來自bit.ly的1.usa.gov資料

資料簡單介紹:2011年,URL縮短服務bit.ly跟美國政府網站usa.gov合作,提供了一份從生成.gov或.mil短連結的使用者那裡收集來的匿名資料。除實時資料之外,還可以下載文字形式的每小時快照。以每小時快照為例,檔案中各行的格式為JSON。

例如,如果我們只讀取某個檔案中的第一行

,那麼你所看到的結果應該是下面這樣:

path = 'ch02/usagov_bitly_data2012-03-16-1331923249.txt'
open(path).readline()

輸出結果如下:

'{ "a": "Mozilla\\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\\/535.11 (KHTML, like Gecko) Chrome\\/17.0.963.78 Safari\\/535.11", "c": "US", "nk": 1, "tz": "America\\/New_York", "gr": "MA", "g": "A6qOVH", "h": "wfLQtf", "l": "orofrog", "al": "en-US,en;q=0.8", "hh": "1.usa.gov", "r": "http:\\/\\/www.facebook.com\\/l\\/7AQEFzjSi\\/1.usa.gov\\/wfLQtf", "u": "http:\\/\\/www.ncbi.nlm.nih.gov\\/pubmed\\/22415991", "t": 1331923247, "hc": 1331822918, "cy": "Danvers", "ll": [ 42.576698, -70.954903 ] }\n'

我們可以讀取json檔案後用列表推導式將檔案轉化為列表,以下是轉為列表和讀取列表的操作:

import json
path = 'ch02/usagov_bitly_data2012-03-16-1331923249.txt'
records = [json.loads(line) for line in open(path)]

records[0]
records[0]['tz']

以下是輸出的結果

{'a': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.78 Safari/535.11',
 'al': 'en-US,en;q=0.8',
 'c': 'US',
 'cy': 'Danvers',
 'g': 'A6qOVH',
 'gr': 'MA',
 'h': 'wfLQtf',
 'hc': 1331822918,
 'hh': '1.usa.gov',
 'l': 'orofrog',
 'll': [42.576698, -70.954903],
 'nk': 1,
 'r': 'http://www.facebook.com/l/7AQEFzjSi/1.usa.gov/wfLQtf',
 't': 1331923247,
 'tz': 'America/New_York',
 'u': 'http://www.ncbi.nlm.nih.gov/pubmed/22415991'}
'America/New_York'

對時區進行計數,假設我們想要知道該資料集中最常出現的是哪個時區(即tz欄位)

from pandas import DataFrame
import json
path = 'ch02/usagov_bitly_data2012-03-16-1331923249.txt'
records = [json.loads(line) for line in open(path)]
frame=DataFrame(records)
tz_counts=frame['tz'].value_counts()
#print(tz_counts[:10]) 

#以下是對空缺值的清洗
clean_tz=frame['tz'].fillna(value='Missing')
clean_tz[clean_tz ==''] = 'Unknown'
tz_counts=clean_tz.value_counts()
print(tz_counts[:10])

輸出結果:

America/New_York       1251
Unknown                 521
America/Chicago         400
America/Los_Angeles     382
America/Denver          191
Missing                 120
Europe/London            74
Asia/Tokyo               37
Pacific/Honolulu         36
Europe/Madrid            35
Name: tz, dtype: int64

最常出現的10個時區的水平條形圖程式碼:

from matplotlib import pyplot as plt
tz_counts[:10].plot(kind='barh',rot=0)
plt.show()

然後,我們來看一下里面的“a”欄位,用字串函式和正則表示式將裡面資訊解析出來,統計最常用的幾個瀏覽器

from pandas import DataFrame,Series
from matplotlib import pyplot as plt
import json
path = 'ch02/usagov_bitly_data2012-03-16-1331923249.txt'
records = [json.loads(line) for line in open(path)]
frame=DataFrame(records)
results=Series([x.split()[0] for x in frame.a.dropna()])
print(results.value_counts()[:8])

輸出結果:

Mozilla/5.0                 2594
Mozilla/4.0                  601
GoogleMaps/RochesterNY       121
Opera/9.80                    34
TEST_INTERNET_AGENT           24
GoogleProducer                21
Mozilla/6.0                    5
BlackBerry8520/5.0.0.681       4
dtype: int64

最常用的8個瀏覽器的水平條形圖程式碼:

res_cnt=results.value_counts()[:8]
res_cnt.plot(kind='barh',rot=0)
plt.show()

然後,我們繼續看一下里面的“a”欄位,按windows和非windows使用者對時區統計資訊進行分析

from pandas import DataFrame,Series
from matplotlib import pyplot as plt
import json
path = 'ch02/usagov_bitly_data2012-03-16-1331923249.txt'
records = [json.loads(line) for line in open(path)]
frame=DataFrame(records)
cframe=frame[frame.a.notnull()]
# print(cframe.groupby('tz').size())   發現tz分組後,有521類
operating_system=np.where(cframe['a'].str.contains('Windows'),'Windows','Not Windows')
cframe['a']=DataFrame(operating_system)
by_tz_os=cframe.groupby(['tz','a'])
agg_counts=by_tz_os.size().unstack().fillna(0)   #用unstack將行轉換成列
print(agg_counts[:10])

輸出結果:

a                               Not Windows  Windows
tz                                                  
                                      180.0    316.0
Africa/Cairo                            1.0      2.0
Africa/Casablanca                       0.0      1.0
Africa/Ceuta                            1.0      1.0
Africa/Johannesburg                     0.0      1.0
Africa/Lusaka                           1.0      0.0
America/Anchorage                       0.0      4.0
America/Argentina/Buenos_Aires          0.0      1.0
America/Argentina/Cordoba               1.0      0.0
America/Argentina/Mendoza               0.0      1.0

最後,接著剛才的操作我們選出最常出現的時區,程式碼如下:

#用於按升序排列
indexer = agg_counts.sum(1).argsort()
#通過take按照這個順序截取了最後10行
count_subset = agg_counts.take(indexer)[-10:]
print(count_subset)

輸出結果:

a                    Not Windows  Windows
tz                                       
America/Sao_Paulo           12.0     21.0
Europe/Madrid               15.0     19.0
Pacific/Honolulu            10.0     25.0
Asia/Tokyo                  14.0     23.0
Europe/London               32.0     40.0
America/Denver              56.0    125.0
America/Los_Angeles        122.0    247.0
America/Chicago            131.0    249.0
                           180.0    316.0
America/New_York           426.0    798.0

用堆積條形圖表示:

count_subset.plot(kind='barh',stacked=True)
plt.show()