2017.06.07
先是安裝了Enthought Canopy (64-bit)的軟件
閱讀了《利用Python進行數據分析》(Wes Mckinney 唐學韜等譯)
書本相關的數據文件網址為? http://github.com/pydata/pydata-book
引入慣例
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
(1)引入pandas,繪制一個簡單的matplotlib
import pandas
plot(arange(10))
(2)給一個文本數據進行操作
文件各行的格式為JavaScript objection notation
閱讀第一行的代碼如下
path='E:\python\usa.govdecommissioning-1-usa-gov.txt'
open(path).readline()
將jason字符串轉化成python中的字典對象代碼如下
import json
path='E:\python\usa.govdecommissioning-1-usa-gov.txt'
records=[json.loads(unicode(line,'ISO-8859-1')) for line in open(path)] ? ? ? #書上原本只用json loads(line)但運行編碼出現錯誤。找到的新的代碼可以運行,原因暫未知。
索引字典中對應的解釋
records[0]['tz'] #得到字符串對象形式
print records[0]['tz']#打印形式
(3)用python代碼對時區進行計數
用列表推導式取出一組時區
time_zones=[rec['tz'] for rec in records if 'tz' in rec]
time_zones[:10] #前10條tz的記錄
(3.1)用標準python庫
def get_counts(sequence):
counts={}
for x in sequence:
if x in counts:
counts[x]+=1
else:
counts[x]=1
return counts
counts=get_counts(time_zones)
counts['America/New_York']
運行后發現得到的結果是1,顯然不對。網上找的原因是觸發了key erro,解決辦法如下
def get_counts(sequence):? ?
?counts={}?
? for x in sequence:
? if x in counts:? ? ? ? ? ?
? ? ?? print(x) ? ? ? ?
? ? ?? print(counts)? ? ? ? ? ?
? ? ?? counts[x]+=1
else:? ? ? ? ? ?
? ? ?? counts[x]=1
return counts
counts=get_counts(time_zones)
counts['America/New_York']
有點問題得到的結果雖然正確,但是輸出的數據太多了。循環的次數偏多,需要改進
(3.2)使用pandas
from collections import defaultdict
def get_counts2(sequence):
counts=defaultdict(int)
for x in sequence:
? ? counts[x]+=1
? return counts
print(get_counts2(time_zones))
counts=get_counts2(time_zones)
counts['America/New_York']
(3.3)使用python標準庫種找到collections.Counter類,更簡單
from collections import Counter
counts=Counter(time_zones)
print(counts)
counts['America/New_York']
(4) 得到前10位的時區及其計數值
def top_counts(count_dict,n=10):
value_key_pairs=[(count,tz) for tz,count in count_dict.items()]
value_key_pairs.sort()
return value_key_pairs[-n:]
top_counts(counts)
(5)用pandas對時區進行計數
from pandas import DataFrame,Series
import pandas as pds;import numpy as np
frame=DataFrame(records)
frame
#得到的結果和書上不太一致
frame['tz'][:10]
得到前10條tz的解釋
對于計數可以采用
tz_counts=frame['tz'].value_counts()
tz_counts[:10]
通過布爾型數組索引用fillna函數替換缺失值(NA)
clean_tz=frame['tz'].fillna('Missing')
clean_tz[clean_tz=='']='unknown' ? ?? #沒有空格符號
tz_counts=clean_tz.value_counts()
得到新的前10位時區及計數值
利用counts對象的plot方法得到水平條形圖
tz_counts[:10].plot(kind='barh',rot=0)
a字段含有執行URL短縮操作的瀏覽器、設備、應用程序的相關信息
frame['a'][1]
(6)將字符串的第一節分離出來得到另外一份用戶行為摘要
results=Series([x.split()[0] for x in frame.a.dropna()])
results[:5]
results.value_counts()[:8]
區分windows和非windows用戶
cframe=frame[frame.a.notnull()]
operating_system=np.where(cframe['a'].str.contains('Windows'),'Windows','not Windows')
operating_system[:5]
根據時區和操作系統列表對數據進行分組
by_tz_os=cframe.groupby(['tz',operating_system])
用size對分組結果進行計數,并用unstack對計數結果重塑
agg_counts=by_tz_os.size().unstack().fillna(0)
選取最常出現的時區根據行數構成一個間接索引數組
index=agg_counts.sum(1).argsort()
index[:10]
截取最后10行
count_subset=agg_counts.take(index)[-10:]
用stack=True生成一張堆積條形圖
count_subset.plot(kind='barh',stacked=True)
規范化重新畫圖
normed_subset=count_subset.div(count_subset.sum(1),axis=0)
normed_subset.plot(kind='barh',stacked=True)
2017.06.08