1.《利用python进行数据分析》读书笔记 ——第一章,第二章

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()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值