【Python】第二章:引言 数据处理的入门演练

来自bit.ly的1.usa.gov数据

原文件是JOSN格式(JavaScript Object Notation,这是一种常用的Web数据格式), 读取文件的一行
关于readline()等:http://blog.csdn.net/werm520/article/details/6898473
#注意:这是在shell下直接写的,路径不在“平时练习”!
>>> open('usagov_bitly_data.txt').readline()   
'{ "a": "Mozilla\\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\\/535.11 (KHTML, like Gecko) Chrome\\/17.0.963.78 Safari\\/535.11", "c": "US", "nk": 1, "tz": "America\\/New_York", "gr": "MA", "g": "A6qOVH", "h": "wfLQtf", "l": "orofrog", "al": "en-US,en;q=0.8", "hh": "1.usa.gov", "r": "http:\\/\\/www.facebook.com\\/l\\/7AQEFzjSi\\/1.usa.gov\\/wfLQtf", "u": "http:\\/\\/www.ncbi.nlm.nih.gov\\/pubmed\\/22415991", "t": 1331923247, "hc": 1331822918, "cy": "Danvers", "ll": [ 42.576698, -70.954903 ] }\n'
使用json模块及其loads函数将JSON字符串→Python字典对象:
使用Python解析JSON数据的基本方法:http://www.jb51.net/article/73450.htm
json.loads 几种错误 解决方案(以后可能用到):http://blog.csdn.net/altenli/article/details/42641083
#列表推导式  #处理后的records对象就成为一组Python字典了,索引从[0]开始,可访问   #可以字符串形式给出想访问的键
>>> import json
>>> records=[json.loads(line)for line in open('usagov_bitly_data.txt')] 
>>> records[0] 
{'al': 'en-US,en;q=0.8', 'g': 'A6qOVH', 'gr': 'MA', 'u': 'http://www.ncbi.nlm.nih.gov/pubmed/22415991', 't': 1331923247, 'cy': 'Danvers', 'a': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.78 Safari/535.11', 'r': 'http://www.facebook.com/l/7AQEFzjSi/1.usa.gov/wfLQtf', 'l': 'orofrog', 'll': [42.576698, -70.954903], 'hh': '1.usa.gov', 'nk': 1, 'c': 'US', 'tz': 'America/New_York', 'h': 'wfLQtf', 'hc': 1331822918}
>>> records[0]['tz']
'America/New_York'
>>> print(records[0]['tz'])
America/New_York

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

欲知数据集最长出现的是哪个时区(time zone):
先用列表推导式取出一组时区 #注:因不是所有记录都有时区字段,故在式中加了判断条件“if 'tz'in rec”
>>> time_zones=[rec['tz']for rec in records if 'tz'in rec]
>>> time_zones[:10]#只看前十个时区
['America/New_York', 'America/Denver', 'America/New_York', 'America/Sao_Paulo', 'America/New_York', 'America/New_York', 'Europe/Warsaw', '', '', '']
对时区进行计数(法一:只使用标准Python库)
#遍历时区的过程中将计数值保存在字典中
def get_counts(sequence):
        counts={}
        for x in sequence:
                if x in counts:
                        counts[x]+=1
                else:
                        counts[x]=1 #单词第一次统计时在counts中相应的键存下默认值1
        return countsdef get_counts(sequence):
        counts={}
        for x in sequence:
                if x in counts:
                        counts[x]+=1
                else:
                        counts[x]=1 #单词第一次统计时在counts中相应的键存下默认值1
        return counts
#使用defaultdict方法
from collections import defaultdict
def get_counts2(sequence):
        counts=defaultdict(int)
#用dict.setdefault()方法设置默认值,defaultdict类的初始化函数接受一个类型作为参数,
#当所访问的键不存在时,可实例化一个值作为默认值——这所有值均被初始化为0
        for x in sequence:
                counts[x]+=1
        return counts
from collections import defaultdict
def get_counts2(sequence):
        counts=defaultdict(int)
#用dict.setdefault()方法设置默认值,defaultdict类的初始化函数接受一个类型作为参数,
#当所访问的键不存在时,可实例化一个值作为默认值——这所有值均被初始化为0
        for x in sequence:
                counts[x]+=1
        return counts
写到函数里获得更高的可重用性,要对时区进行处理,只需传入time_zones即可:
>>> counts=get_counts(time_zones)
>>> counts['America/New_York'] #别写错单词!——得1251
>>> len(time_zones)——得3440
要想得到前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:]
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)
#用collections.Counter类,使其变得简单
from collections import Counter
counts=Counter(time_zones)
counts.most_common(10)

from collections import Counter
counts=Counter(time_zones)
counts.most_common(10)
>>>counts.most_common(10)


 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值