利用Python 進行數據分析

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容