[读书笔记] Python数据分析 (二) 引言
1. 数据分析的任务:数据读写,数据准备(清洗,修整,规范化,重塑,切片切块,变形),转换,建模计算,呈现(模型/数据)
2. 数据集:
bit.ly的1.usa.gov数据:URL缩短服务bit.ly和美国政府usa.gov合作从.gov或.mil用户那里收集的匿名数据
# -*- coding:utf-8 -*-
#导入json模块,将json字符串转换为python字典
import json
from collections import defaultdict
from collections import Counter
from pandas import DataFrame, Series
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt path = "E:/Programming/Python/PythonDataAnalysis/datasets/usagov_bitly/example.txt"
#list comprehension
records = [json.loads(line) for line in open(path)]
#对时区计数, 同时保证tz必须在records中
time_zones = [rec['tz'] for rec in records if 'tz' in rec.keys()]
#--------------方法1:------------
#时区计数
def get_counts(sequence):
counts = {}
for x in sequence:
if x in counts:
counts[x] += 1
else:
counts[x] = 1
return counts
#取得前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:]
counts = get_counts(time_zones)
print(counts)
top_counts = top_counts(counts)
print(top_counts)
#--------------方法2:------------
def get_counts2(sequence):
counts = defaultdict(int)
for x in sequence:
counts[x] += 1
return counts
#--------------方法3:------------
#引入collections的Counter对象
def get_counts3(time_zones,n=10):
counts = Counter(time_zones)
return counts.most_common(n) top_counts3 = get_counts3(time_zones,10)
print(top_counts3)
#--------------方法3:------------
#用pandas对时区进行计数
#将records转换为DataFrame对象
frame = DataFrame(records)
#frame['tz']返回的对象有一个value_counts方法
tz_counts = frame['tz'].value_counts()
print(tz_counts[:10])
#fillna()函数填补空缺值NA
clean_tz = frame['tz'].fillna("Missing")
print(clean_tz)
#空字符串为Unknown
clean_tz[clean_tz == ''] = "Unknown"
tz_counts = clean_tz.value_counts()
print(tz_counts[:10])
#利用counts的plot方法
tz_counts[:10].plot(kind = "barh",rot=0)
plt.show()
#用户浏览器分析
results = Series([x.split()[0] for x in frame.a.dropna()])
#打印前8的浏览器
print(results.value_counts()[:8])
cframe = frame[frame.a.notnull()]
operating_system = np.where(cframe['a'].str.contains("Windows"),"Windows","Not Windows")
windows = 0
nonWindows = 0
for op in operating_system:
if op == "Windows":
windows += 1
else:
nonWindows += 1
print("windows:",windows,"nonWindows:",nonWindows)
#使用windows/nonwindows给时区分组
by_tz_os = cframe.groupby(['tz',operating_system])
agg_counts = by_tz_os.size().unstack().fillna(0)
print(agg_counts[:10])
#选取最常见的时区
indexer = agg_counts.sum(1).argsort()
print(indexer)
count_subset = agg_counts.take(indexer)[-10:]
print(count_subset)
#绘制windows/nonwindows 堆叠条形图
count_subset.plot(kind="barh",stacked=True)
#不加这句语句,在Ipython中可以显示但是脚本运行不显示
plt.show()
#规范化
normed_subset = count_subset.div(count_subset.sum(1),axis = 0)
normed_subset.plot(kind = "barh",stacked=True)
plt.show()
MovieLens 1M数据集:20世纪90年末到21世纪初6000名用户提供的4000部电影评分100万条数据,分为3个表:电影评分,电影元数据(类型,年代),用户的人口统计学数据(年龄,右边,性别,职业)
# -*- coding: utf-8 -*-
import pandas as pd
import os
#数据读取,读成3个表
path = 'E:/Programming/Python/PythonDataAnalysis/datasets/movielens/'
unames = ['user_id','gender','age','occupation','zip']
upath = os.path.join(path,'users.dat')
users = pd.read_table(upath,sep = "::",header=None,names=unames,engine='python')
rnames = ['user_id',"movie_id","rating","timestamp"]
ratings = pd.read_table(path+'ratings.dat',sep = "::",header=None,names=rnames,engine='python')
mnames = ['movie_id','title','genres']
movies = pd.read_table(path+'movies.dat',sep ="::",header=None,names=mnames,engine='python')
#数据表整合
data = pd.merge(pd.merge(ratings,users),movies)
print(data[:10])
print(data.ix[0])
#按性别计算每部电影的得分,index 中是标签,columns中是列标签
mean_ratings = data.pivot_table('rating',index = 'title',columns = "gender",aggfunc='mean')
print(mean_ratings[:10])
#过滤掉评分不足250条的电影
ratings_by_title = data.groupby('title').size()
print(ratings_by_title[:10])
active_titles = ratings_by_title[ratings_by_title >= 250]
print(active_titles)
#按照评论>=250的index筛选
mean_ratings = mean_ratings.ix[active_titles.index]
top_female_ratings = mean_ratings.sort_index(by='F',ascending=False)
print(top_female_ratings[:10])
#计算男性女性得分分歧最大的电影
mean_ratings['diff'] = mean_ratings['M'] - mean_ratings['F'] sorted_by_diff = mean_ratings.sort_index(by = 'diff')
#分歧最大且女性更喜欢的电影
print(sorted_by_diff[:15])
#对结果反序取出前15行,男性观众更喜欢的电影
print(sorted_by_diff[::-1][:15])
#分歧最大的电影,计算方差或者标准差
rating_std_by_title = data.groupby('title')['rating'].std()
#使用active_title进行过滤
rating_std_by_title = rating_std_by_title.ix[active_titles]
rating_std_by_title.order(ascending=False)
print(rating_std_by_title[:15])
1880-2010年间婴儿名字频率数据
# -*- coding:utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
path = 'E:/Programming/Python/PythonDataAnalysis/datasets/babynames/'
names1880 = pd.read_csv(path+'yob1880.txt',names = ['name','sex','births'],engine='python')
#按照sex对数据进行简单分组
names1880.groupby('sex').births.sum()
#将单个文件中的数据整合到一个数据表中
years = range(1880,2011)
pieces = []
columns = ['name','sex','birth']
for year in years:
subpath = 'yob%d.txt' % year
frame = pd.read_csv(path+subpath,names = columns)
frame['year'] = year
pieces.append(frame)
names = pd.concat(pieces,ignore_index = True)
#使用pivot_table()函数进行聚合
total_births = names.pivot_table('birth',index = 'year',columns = 'sex',aggfunc = sum)
print(total_births.tail())
#插入prop列存放指定的婴儿数相对于总出生数的比例
def add_prop(group):
births = group.birth.astype(float)
group['prop'] = births/births.sum()
return group names = names.groupby(['year','sex']).apply(add_prop)
#取出每个sex/year组合的前1000个名字
def get_top1000(group):
return group.sort_values(by='birth',ascending=False)[1:1000]
grouped = names.groupby(['year','sex'])
top1000 = grouped.apply(get_top1000)
#接下来的'命名趋势'分析针对这top1000个数据集
#取出男性
boys = top1000[top1000.sex == 'M']
#取出女性
girls = top1000[top1000.sex == 'F']
total_births = top1000.pivot_table('birth',index = 'year',columns = 'name',aggfunc = sum)
subset = total_births[['John','Harry','Mary','Marilyn']]
subset.plot(subplots = True,figsize = (12,10),grid=False,title = "Number of births per year")
plt.show()
#观察名字多样性变化
table = top1000.pivot_table('prop',index = 'year',columns = 'sex',aggfunc = sum)
table.plot(title = "sum of table1000.prop by year and sex",yticks = np.linspace(0,1.2,13),xticks = range(1880,2020,10))
plt.show()
# 名字最后一个字母的变化
[读书笔记] Python数据分析 (二) 引言的更多相关文章
- [读书笔记] Python 数据分析 (十二)高级NumPy
da array: 一个快速而灵活的同构多维大数据集容器,可以利用这种数组对整块的数据进行一些数学运算 数据指针,系统内存的一部分 数据类型 data type/dtype 指示数据大小的元组 str ...
- [读书笔记] Python数据分析 (三) IPython
1. 什么是IPython IPyhton 本身没有提供任何的计算或者数据分析功能,在交互式计算和软件开发者两个方面最大化地提高生产力,execute-explore instead of edit- ...
- [读书笔记] Python数据分析 (一) 准备工作
1. python中数据结构:矩阵,数组,数据框,通过关键列相互联系的多个表(SQL主键,外键),时间序列 2. python 解释型语言,程序员时间和CPU时间衡量,高频交易系统 3. 全局解释器锁 ...
- [读书笔记] Python数据分析 (四) 数组和矢量计算
Numpy:高性能计算和数学分析的基础包 ndarray, 一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对数组数据进行快速运算的标准数学函数 用于读写磁盘数据的工具和用于操作内存 ...
- [读书笔记] Python数据分析 (五) pandas入门
pandas: 基于Numpy构建的数据分析库 pandas数据结构:Series, DataFrame Series: 带有数据标签的类一维数组对象(也可看成字典) values, index 缺失 ...
- [读书笔记] Python 数据分析 (八)画图和数据可视化
ipython3 --pyplot pyplot: matplotlib 画图的交互使用环境
- [读书笔记] Python 数据分析 (十一)经济和金融数据应用
resample: 重采样函数,可以按照时间来提高或者降低采样频率,fill_method可以使用不同的填充方式. pandas.data_range 的freq参数枚举: Alias Descrip ...
- 《Linux内核设计与实现》读书笔记——第一、 二章
<Linux内核设计与实现>读书笔记--第一. 二章 标签(空格分隔): 20135321余佳源 第一章 Linux内核简介 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确 ...
- 《Linux内核设计与实现》读书笔记(十二)- 内存管理【转】
转自:http://www.cnblogs.com/wang_yb/archive/2013/05/23/3095907.html 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己 ...
随机推荐
- HDU 5322 Hope (分治NTT优化DP)
题面传送门 题目大意: 假设现在有一个排列,每个数和在它右面第一个比它大的数连一条无向边,会形成很多联通块. 定义一个联通块的权值为:联通块内元素数量的平方. 定义一个排列的权值为:每个联通块的权值之 ...
- 解决SpringBoot+JPA中使用set方法时自动更新数据库问题
项目进行了三分之二了,突然出现一个很诡异的bug,数据库存储的用户表中密码信息总是自动消失一部分,头疼了几天后突然想起同事有个对低权限用户查询的用户信息向前台传送时会把密码设成null后再传输,心想是 ...
- Python爬虫基础--爬取车模照片
import urllib from urllib import request, parse from lxml import etree class CarModel: def __init__( ...
- VUEX 总结
What is Vuex? vuex是一个专为Vue.js应用程序开发的状态管理模式.他采用集中式储存管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变换 VUEX并不限制你的代 ...
- jQuery scrollFix滚动定位插件
[插件功能] 当用户向上或向下滚动页面到一定位置时,目标元素开始固定定位(position:fixed),当回滚到原位置时目标元素恢复到原状态,可以定制触发滚动相对屏幕位置和触发滚动方向,兼容IE6 ...
- 【AIM Tech Round 5 (rated, Div. 1 + Div. 2) 总结】【题解往前或往后翻,不在这】
又是爆炸的一场 心态有点小崩.但问题不大.. 看A题,一直担心有多个正方形..小心翼翼地看完之后,毅然地交上去了. [00:08] A[Accpted] 然后开始看B题. 觉得和之前做的某题很像,但翻 ...
- centos solr 集群搭建
一.什么是 SolrCloud SolrCloud(solr 云)是 Solr 提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud.当一个系统的索引数据量少的时 ...
- Could not publish server configuration for Tomcat v7.0 Server at localhost. Multiple Contexts have a path of "/ezoutdoor".
Could not publish server configuration for Tomcat v7.0 Server at localhost. Multiple Contexts have a ...
- Android获取图片实际大小兼容平板电脑
项目中有个图片在平板电脑中显示特别小的原因.一直苦于没找到原因,也没有平板电脑測试,今天找了个改动分辨率的,编写相关方法最终处理了,记录下比較: 好让以后不造轮子. 主要是获取文章相关图片显示问题.直 ...
- HDU 4345
细心点想,就明白了,题目是求和为N的各数的最小公倍数的种数.其实就是求N以内的各素数的不同的组合(包含他们的次方),当然,是不能超过N的.用Dp能解决.和背包差不多. #include <ios ...