2017.06.07
先是安裝了Enthought Canopy (64-bit)的軟件
閱讀了《利用Python進(jìn)行數(shù)據(jù)分析》(Wes Mckinney 唐學(xué)韜等譯)
書本相關(guān)的數(shù)據(jù)文件網(wǎng)址為? http://github.com/pydata/pydata-book
引入慣例
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
(1)引入pandas,繪制一個(gè)簡單的matplotlib
import pandas
plot(arange(10))
(2)給一個(gè)文本數(shù)據(jù)進(jìn)行操作
文件各行的格式為JavaScript objection notation
閱讀第一行的代碼如下
path='E:\python\usa.govdecommissioning-1-usa-gov.txt'
open(path).readline()
將jason字符串轉(zhuǎn)化成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)但運(yùn)行編碼出現(xiàn)錯(cuò)誤拣展。找到的新的代碼可以運(yùn)行妆艘,原因暫未知旁趟。
索引字典中對應(yīng)的解釋
records[0]['tz'] #得到字符串對象形式
print records[0]['tz']#打印形式
(3)用python代碼對時(shí)區(qū)進(jìn)行計(jì)數(shù)
用列表推導(dǎo)式取出一組時(shí)區(qū)
time_zones=[rec['tz'] for rec in records if 'tz' in rec]
time_zones[:10] #前10條tz的記錄
(3.1)用標(biāo)準(zhǔn)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']
運(yùn)行后發(fā)現(xiàn)得到的結(jié)果是1恼布,顯然不對傻工。網(wǎng)上找的原因是觸發(fā)了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']
有點(diǎn)問題得到的結(jié)果雖然正確境钟,但是輸出的數(shù)據(jù)太多了。循環(huán)的次數(shù)偏多阻桅,需要改進(jìn)
(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標(biāo)準(zhǔn)庫種找到collections.Counter類凉倚,更簡單
from collections import Counter
counts=Counter(time_zones)
print(counts)
counts['America/New_York']
(4) 得到前10位的時(shí)區(qū)及其計(jì)數(shù)值
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對時(shí)區(qū)進(jìn)行計(jì)數(shù)
from pandas import DataFrame,Series
import pandas as pds;import numpy as np
frame=DataFrame(records)
frame
#得到的結(jié)果和書上不太一致
frame['tz'][:10]
得到前10條tz的解釋
對于計(jì)數(shù)可以采用
tz_counts=frame['tz'].value_counts()
tz_counts[:10]
通過布爾型數(shù)組索引用fillna函數(shù)替換缺失值(NA)
clean_tz=frame['tz'].fillna('Missing')
clean_tz[clean_tz=='']='unknown' ? ?? #沒有空格符號
tz_counts=clean_tz.value_counts()
得到新的前10位時(shí)區(qū)及計(jì)數(shù)值
利用counts對象的plot方法得到水平條形圖
tz_counts[:10].plot(kind='barh',rot=0)
a字段含有執(zhí)行URL短縮操作的瀏覽器、設(shè)備嫂沉、應(yīng)用程序的相關(guān)信息
frame['a'][1]
(6)將字符串的第一節(jié)分離出來得到另外一份用戶行為摘要
results=Series([x.split()[0] for x in frame.a.dropna()])
results[:5]
results.value_counts()[:8]
區(qū)分windows和非windows用戶
cframe=frame[frame.a.notnull()]
operating_system=np.where(cframe['a'].str.contains('Windows'),'Windows','not Windows')
operating_system[:5]
根據(jù)時(shí)區(qū)和操作系統(tǒng)列表對數(shù)據(jù)進(jìn)行分組
by_tz_os=cframe.groupby(['tz',operating_system])
用size對分組結(jié)果進(jìn)行計(jì)數(shù)稽寒,并用unstack對計(jì)數(shù)結(jié)果重塑
agg_counts=by_tz_os.size().unstack().fillna(0)
選取最常出現(xiàn)的時(shí)區(qū)根據(jù)行數(shù)構(gòu)成一個(gè)間接索引數(shù)組
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)
規(guī)范化重新畫圖
normed_subset=count_subset.div(count_subset.sum(1),axis=0)
normed_subset.plot(kind='barh',stacked=True)
2017.06.08