文章数据
收藏(次)

【python数据分析】第十四章 数据分析案例

加关注
来自Bitly的USA.gov数据
--------------------------------------------------------------------------------
数据是作者的提供的,位置在 'datasets/bitly_usagov/example.txt'
这个是数据的第一行。每一行都是一个 json 数据,但是全部的数据是不符合json数据格式,
现在的数据格式 {第一行} {第二行} {第三行}...
如果文件全部内容是一个大的json应该是这样的, [{第一行}, {第二行}, {第三行}, .... ]

第一行数据:json
{
"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
]
}
--------------------------------------------------------------------------------
数据中的字段 tz 是时区,统计数据,找出访问网站最多的十个时区。
--------------------------------------------------------------------------------
使用 Python 代码来做
--------------------------------------------------------------------------------
可能需要的包
import json
from collections import Counter
from collections import defaultdict
--------------------------------------------------------------------------------
加载数据:
path = 'py/pydata/datasets/bitly_usagov/example.txt'
records = [json.loads(line) for line in open(path)] # record 是list, 元素是 dict
--------------------------------------------------------------------------------
获取所有的时区:

# 看看哪个时区访问的人数比较多, 但是并不是所有json数据对象中都有 tz 字段
#time_zones = [rec['tz'] for rec in records]

time_zones = [rec['tz'] for rec in records if 'tz' in rec] # 把空数据过滤掉
time_zones[0:10] 输出: 有时区的数据时区拿出来组成的list
['America/New_York',
'America/Denver',
'America/New_York',
'America/Sao_Paulo',
'America/New_York',
'America/New_York',
'Europe/Warsaw',
'',
'',
'']
--------------------------------------------------------------------------------
定义统计方法,返回dict, 键是 时区, 值是 访问次数,下面两个方式实现

def get_count(seq):
count = {}
for x in seq:
if x in count:
count[x] += 1 # 已经存在,则加1
else:
count[x] = 1 # 不存在就设置为1
return count

from collections import defaultdict

def get_count2(seq):
count = defaultdict(int) # 初始哈一个int类型的对象,并初始哈为0
for x in seq:
count[x] += 1
return count
--------------------------------------------------------------------------------
调用方法,得到 时区和次数的 dict
counts = get_count(time_zones)
--------------------------------------------------------------------------------
定义方法,从 dict 中找到前十的时区

def top_count(count_dict, n=10):
'''
for k in dictobj:
pass
for pair = dictobj.items():
pass
for k,v = dictobj.items():
pass
'''
value_key_pairs = [(count, tz) for tz,count in count_dict.items()]
value_key_pairs.sort()
return value_key_pairs[-n:]

或者使用 Python 提供的方法
from collections import Counter # 工具包
counts = Counter(time_zones) # 把原始list数据变成, key:keycount 的 dict
counts.most_common(10) # 取前十的数据
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
用pandas对时区进行计数
--------------------------------------------------------------------------------
path = 'py/pydata/datasets/bitly_usagov/example.txt'
records = [json.loads(line) for line in open(path)]
frame = pd.DataFrame(records)
以前传入的json 数据是这样的
{
'name':[xx,xx,xx],
'age': [xx,xx,xx],
'addr': [xx,xx,xx]
}

现在数据是这样的
[
{name:xx, age:xx, addr:xx},
{name:xx, age:xx, addr:xx},
{name:xx, age:xx, addr:xx}
]

pd.DataFrame(records) 都能成功的加载进来
--------------------------------------------------------------------------------
frame.info() # 查看这个 frame 的常规信息
--------------------------------------------------------------------------------
tz_count = frame['tz'].value_counts() 直接就是对时区的统计数量
tz_count[0:10] # 取出前十个,
--------------------------------------------------------------------------------
# 数据中有没有 tz 字段的数据,也有 tz:NA 的数据
clean_tz = frame['tz'].fillna('Missing')

# 数据还有 tz: 空字符串,不是 NA
clean_tz[clean_tz == ''] = 'unknown'
--------------------------------------------------------------------------------
# 画直方图
import seaborn as sns
subset = tz_counts[:10]
sns.barplot(y=subset.index, x=subset.values)
--------------------------------------------------------------------------------
# 获取 a 列, 第50行的数据,是字符串太长,取50个字符
frame['a'][51][:50] 输出: 'Mozilla/5.0 (Linux; U; Android 2.2.2; en-us; LG-P9'
--------------------------------------------------------------------------------
其他案例,略



>> 目录 << 


 

分享
收藏
点赞人
举报
文章标签
评论列表

推荐

暂无推荐