[读书笔记] 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 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己 ...
随机推荐
- Project Euler 23 Non-abundant sums( 整数因子和 )
题意: 完全数是指真因数之和等于自身的那些数.例如,28的真因数之和为1 + 2 + 4 + 7 + 14 = 28,因此28是一个完全数. 一个数n被称为亏数,如果它的真因数之和小于n:反之则被称为 ...
- IntelliJ IDEA 2017.1.6 x64 的破解
方式一 现在用这个 http://idea.imsxm.com/好使 步骤如下,点击help按钮,选择Register 点击license server 修改下面的服务器激活地址 方式二 由于Je ...
- 【hihocoder 1312】搜索三·启发式搜索(启发式搜索写法)
[题目链接]:http://hihocoder.com/problemset/problem/1312?sid=1092363 [题意] [题解] 定义一个A*函数 f = step+val 这里的v ...
- [Beginning SharePoint Designer 2010]Chapter4 发布页面
本章概要: 1.SharePoint中的Web内容管理 2.SharePoint发布系统的特性 3.SharePoint发布页面的组成 4.母板页 5.如何构建页面布局和他们潜在的内容类型
- 安装ftp碰到的问题及解决方法
1 CRT显示乱码: 本地windows机器.改动SecureCRT的设置.找到"选项"->"会话选项"->"外观" ...
- HDU 1874 畅通project续 (最短路径)
畅通project续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- svn 服务器的搭建
SVN服务器运行模式:模式1:svn服务器单独运行 监听: 3690端口 访问: svn://IP模式2: svn 服务器+ apache : 80 端口 访问: http://IP ...
- UVA - 11021 - Tribles 递推概率
GRAVITATION, n.“The tendency of all bodies to approach one another with a strengthproportion to the ...
- linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库
linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库 创建静态库:ar -rcs test.a *.o查看静态库:ar -tv test.a解压静态库:ar -x test.a 查 ...
- phpmyadmin客户端多服务器配置
修改libraries/config.default.php 545行,添加 $cfg['Servers']['2'] = $cfg['Servers'][$i];$cfg['Servers']['2 ...