【利用python進行資料分析】準備與例項(一)
阿新 • • 發佈:2019-01-06
我已經分享了本書的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()