利用python进行数据分析C02.P21-P29

利用python进行数据分析C02.P21-P29

用纯python代码对时区进行计数


#按行读取文件内容,并提取其中时区(‘tz’)属性的全部取值
import json
path = 'D:/document/Python/ziliao/kebendaima/pydata-book-master/ch02/usagov_bitly_data2012-03-16-1331923249.txt'
open(path).readline()
records = [json.loads(line) for line in open(path)]
'''begin'''
#数组编码为JSON格式数据https://docs.python.org/2/library/json.html
#json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]
json = json.dumps(data)
print json
print json.dumps({'a': 'Runoob', 'b': 7}, sort_keys=True, indent=4, separators=(',', ':'))
#json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
#编译出现的问题  AttributeError: 'str' object has no attribute 'dumps' 
#NameError: name 'json' is not defined
#重新import json
#解码 JSON 数据。该函数返回 Python 字段的数据类型
jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
text = json.loads(jsonData)
print text
'''end'''
time_zones = [rec['tz'] for rec in records if 'tz' in rec]
#统计时区属性的某一个取值出现的次数:
#计数方法1
def get_counts(sequence):
    counts = {}
    for x in sequence:
        if x in counts:
            counts[x] += 1
        else:
            counts[x] = 1
    return counts
#计数方法2    
from collections import defaultdict
def get_counts2(sequence):
    counts = defaultdict(int)
    for x in sequence:
        counts[x] += 1
    return counts
#计数方法3
from collections import Counter
def get_counts3(sequence):
    counts = Counter()
    for x in sequence:
        counts.update(x)
    return counts

counts3 = get_counts(time_zones)
counts = get_counts(time_zones)
counts['Africa/Cairo']
#defaultdict:dict没有默认初始值 设置初始值资料可参考http://kodango.com/understand-defaultdict-in-python
#根据value排序
#统计时区属性取值次数前10的全部属性:
#排序方法1 参数可取前10个
def top_counts(count_dict,n=10):
    value_key_pairs = [(count,tz) for tz, count in count_dict.items()]
    #items() 函数以列表返回可遍历的(键, 值) 元组数组
    value_key_pairs.sort()
    return value_key_pairs[-n:]#list的倒数10个-最后一个
top_counts(counts)
#排序方法2
sorted(counts.items(),key = lambda x:x[1],reverse = True)
#排序方法3
import operator
#operator操作符相关函数 https://www.cnblogs.com/nju2014/p/5568139.html
sorted(counts.items(),key = operator.itemgetter(1)) #从小到大
sorted(counts.items(),key = operator.itemgetter(1),reverse=True) #从大到小
#排序方法4 从大到小,指定前10个
from collections import Counter
#collections http://www.pythoner.com/205.html
counts2 = Counter(time_zones)#Counter计词
counts2.most_common(10)#返回一个TopN列表

用pandas对时区进行计数


from pandas import DataFrame,Series
import numpy as np
frame = DataFrame(records)
frame
frame['tz'][:10]
tz_counts = frame['tz'].value_counts() #计数
tz_counts[:10]
#缺失值用Missing替代,fillna函数替换缺失值,未知值用布尔型数组索引加以替换
#缺失值处理 
clean_tz = frame['tz'].fillna('Missing') #nan替换成Missing
clean_tz[clean_tz == ''] = 'Unknown'     #空值替换成unknown
#用 matplotlib进行绘图:
tz_counts[:10].plot(kind='barh',rot=0)#rot旋转角度 bar barh条形图 hist柱状图 kde density密度图 area面积图 scatter散点图 hexbin箱 pie饼图

#用户使用浏览器、设备、应用程序统计
results = Series([x.split()[0] for x in frame.a.dropna()]) #split()默认所有的空格符为分隔符
results.value_counts()[:8]

统计window和非window用户数


#现在想按照windows用户和非windows用户进行信息分解,含有windows都认为是w用户
cframe = frame[frame.a.notnull()]#去掉缺失值
operating_system = np.where(cframe['a'].str.contains('Windows'),'Windows','Not Windows')#where(a,b,c)相当于java a=true?b:c;

根据时区和操作系统进行数据分组


by_tz_os = cframe.groupby(['tz',operating_system]) #by_tz_os是一个GroupBy对象,它实际上还没有进行任何计算
#size()对分组进行计数,unstack将行信息变成列信息
#stack()函数,可以将DataFrame的列转化成行,原来的列索引成为行的层次索引。(stack和unstack方法是两个互逆的方法,可以用来进行Series和DataFrame之间的转换)
agg_counts = by_tz_os.size().unstack().fillna(0)
#根据agg_counts中的行数构造一个间接索引数组 
#用于按升序排列
indexer=agg_counts.sum(1).argsort()
indexer[:10]
#sum(n).argsort():如果frame中的值是数字,可以使用sum函数计算frame中某个属性,各个因子分别求和,并返回一个Series
#这个Series可以做为frame.take的参数,拿到frame中对应的行
#看不懂度娘的解释
'''
d1 = DataFrame([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
d1.sum(1).argsort() 结果0,1,2
d2 = DataFrame([[2, 3],[1, 0.5],[7, 8]])
d2.sum(1).argsort() 结果1,0,2
总结:按行1(列0)求和5,1.5,15,排序1.5(索引0),5(索引1),15(索引2) 返回索引即1,0,2 
'''
#take 截取最后10行 take传入行索引,ix传入行号 根据index找出值
count_subset = agg_counts.take(indexer)[-10:]
count_subset
#stacked=True生成堆积条形图
count_subset.plot(kind='barh', stacked=True)
#数据规范化 即总计设为1
normed_subset = count_subset.div(count_subset.sum(1),axis=0)#div除法 add+ mul* sub- axis=0行
normed_subset.plot(kind='barh', stacked=True)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值