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