import json
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from collections import defaultdict
from collections import Counter
path = r'..\test_file\0636920023784-master\ch02\usagov_bitly_data2012-03-16-1331923249.txt'
# print( open(path).readline())
#注意这里的json模块中的loads函数将字符串转换为字典,非常有用!
#注意这里的缩略循环形式
records = [json.loads(line) for line in open(path)]
#records[0] 是一个字典
#for rec in records 从这个records列表中获取每一个字典
#判断'tz'这个key是否在rec这个字典中
#返回rec['tz']这个值
time_zones = [rec['tz'] for rec in records if 'tz' in rec]
# print(time_zones[:10])
# defaultdict(int):初始化为 0
# defaultdict(float):初始化为 0.0
# defaultdict(str):初始化为 ‘’
# defaultdict(list):初始化为[]
def get_counts(sequence):
counts = defaultdict(int) # defaultdict(int):初始化为 0 用来初始化一个字典
for x in sequence: #取出列表中的 每一个元素
counts[x] += 1 # 放入字典中,key=x, value=counts[x]+1 累计
return counts #返回这个字典
counts = get_counts(time_zones)
print(counts['America/New_York'])
#传入一个字典
def top_counts(count_dict, n=10):
# 将value,key返回, 注意返回的key,和value对调了
# 因为后面的排序需要
value_key_pairs = [(count, tz) for tz, count in count_dict.items()]
# 进行排序
value_key_pairs.sort() #这个是根据 key排序的
return value_key_pairs[-n:] #这个索引还是挺牛逼的
#使用colletions.Counter这类,使任务更加简单
counts = Counter(time_zones) #传入的是一个list, 用来统计多少类,返回一个字典,类名+个数
print(counts) #
print(counts.most_common(10))
#注意这里的json模块中的loads函数将字符串转换为字典,非常有用!
#注意这里的缩略循环形式
records = [json.loads(line) for line in open(path)]
frame = pd.DataFrame(records) #可以直接将其转化为DataFrame
print(frame['tz'].value_counts()[:10])
clean_tz = frame['tz'].fillna('Missing') #返回的是Series 一个列名是tz的表
clean_tz[clean_tz == ''] = 'Unknown'
tz_counts = clean_tz.value_counts()
print( tz_counts)
result = [x for x in frame.a.dropna()]
print(result[0])
#Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.78 Safari/535.11
print(result[0].split())
#['Mozilla/5.0', '(Windows', 'NT', '6.1;', 'WOW64)', 'AppleWebKit/535.11', '(KHTML,', 'like', 'Gecko)', 'Chrome/17.0.963.78', 'Safari/535.11']
#对于一个 Series,dropna 返回一个仅含非空数据和索引值的 Series
result = pd.Series([x.split()[0] for x in frame.a.dropna()])
cframe = frame[frame.a.notnull()] #去除agent缺失的值,
#np.where函数是一个矢量化ifelse函数
#包含windows的就返回windos 不包含就是 not windows
operating_system = np.where(cframe['a'].str.contains('Windows'), 'Windows', 'Not Windows')
by_tz_os = cframe.groupby(['tz', operating_system])
#下面是将tz按照operating_system进行分组并计数并用unstack进行展开并填充na为0
agg_counts = by_tz_os.size().unstack().fillna(0)
#下面注意 sum函数 默认axis = 0,是普通加和,axis = 1是按列加和,argsort是从小到大排序并返回下表
indexer = agg_counts.sum(1).argsort()
#下面是取出时区最多的值,注意take函数,接下标
#通过take按照这个顺序截取列最后10行
count_subset = agg_counts.take(indexer)[-10:]
#下面的图很好,是累积条形图
count_subset.plot(kind='barh', stacked=True)
plt.show()
normed_subset = count_subset.div(count_subset.sum(1), axis=0)
normed_subset.plot(kind = 'barh',stacked = True)
plt.show()