第一章 准备工作

今天开始码这本书--《利用python进行数据分析》。R和python都得会用才行,这是码这本书的原因。首先按照书上说的进行安装,google下载了epd_free-7.3-1-win-x86.msi,译者建议按照作者的版本安装,EPDFree包括了Numpy,Scipy,matplotlib,Chaco,IPython.这里的pandas需要自己安装,对应版本为pandas-0.9.0.win32-py2.7.exe.数据下载地址:github.com/pydata/pydata-book.下面是一个文档:

Welcome to Python For Data Analysis’s documentation!

第二章 引言

本章是一些例子。

1、来自bit.ly的1.usa.gov数据

首先,遇到的问题是pycharm的中文编码问题,注意IDEencoding改为utf-8,同时文件最开始加#-*- encoding:utf-8 -*-,同时含有中文的字符串记得加u。

下面是代码:

#-*- encoding: utf-8 -*-

importjsonimportnumpy as npimportpandas as pdimportmatplotlib.pyplot as pltfrom collections importdefaultdictfrom collections importCounter#注意这里的中文路径

path = u'D:\\你好\\usagov_bitly_data2012-03-16-1331923249.txt'

printopen(path).readline()#注意这里的json模块中的loads函数将字符串转换为字典,非常有用!#注意这里的缩略循环形式

records = [json.loads(line) for line inopen(path)]printrecords[0]printtype(records)printtype(records[0])print records[0]['tz']#注意这里的判断条件

time_zones = [rec['tz'] for rec in records if 'tz' inrec]print time_zones[:10]#下面定义函数对时区进行计数统计,注意这里计数的方式,注意这里的字典初始化方式

defget_counts(squence):

counts=defaultdict(int)for x insquence:

counts[x]+= 1

returncounts

counts=get_counts(time_zones)print counts['America/New_York']def top_counts(count_dict,n = 10):

value_key_pairs= [(count,tz) for tz,count incount_dict.items()]

value_key_pairs.sort()#请注意这里的索引方式,很好

return value_key_pairs[-n:]#这里是打印最后面的十个数,值得注意的是从倒数第十个开始一直到最后一个

printtop_counts(counts)#这里的Counter是一个神器,作者真实强大

counts =Counter(time_zones)print counts.most_common(10)

上面是利用python标准库中的函数进行数据分析。需要注意的几个方面:

1、关于列表索引的说明:

a = range(0,10,1)

a[0] >>>0

a[-1] >>> 9

a[:5] >>> [0,1,2,3,4]

a[0:2] >>> [0,1]

a[-3:-1] >>> [7,8]

a[-3:] >>> [7,8,9]

a[-1:-3:-1] >>> [9,8]

a[::2] >>> [0,2,4,6,8]

说明:

1、索引包含第一个,不包含第一个冒号后面的部分

2、符号表示从后面开始计数

3、第二个冒号后面是间隔,如果有负号,表示从后面开始计数,例如a[-1:-3]这种表示方式得到空列表。

2、关于模块 collections 的应用,见下面的地址:

collections 主要包括下面几个“数据类型”:namedtuple() 生成可以使用名字来访问元素内容的tuple子类;deque()双端队列,它最大的好处就是实现了从队列 头部快速增加和取出对象;Counter用来统计个数,字典、列表、字符串都能用,很方便;OrderedDict 生成有序字典;defaultdict 也有用 比如 defaultdict(int) 表示字典中每个值都是int型,defaultdict(list)表示字典每个值都是列表。更多更详细的内容见:

下面是用pandas对时区进行计数

DataFrame是Pandas最重要的数据结构,应该就是R语言中的数据框。下面看一下实现方式:

#-*- encoding: utf-8 -*-

importjsonimportnumpy as npimportpandas as pdfrom pandas importDataFrame,Seriesimportmatplotlib.pyplot as plt#注意这里的中文路径

path = u'D:\\你好\\usagov_bitly_data2012-03-16-1331923249.txt'

#注意这里的json模块中的loads函数将字符串转换为字典,非常有用!#注意这里的缩略循环形式

records = [json.loads(line) for line inopen(path)]#注意这里的DataFrame可以将每个元素都是字典的列表自动整理为数据框的形式,每一列是字典的key

frame =DataFrame(records)#数据太多只是会显示缩略图#print frame#下面是列名为tz的前十个元素#print frame['tz'][:10]#下面是用value_counts方法对不同的tz计数,太方便了!#print type(frame['tz'])

tz_counts = frame['tz'].value_counts()#print tz_counts[:10]#下面想画一个茎叶图,首先将缺失值NA进行填充

clean_tz = frame['tz'].fillna('Missing')#下面是对空白符通过布尔型数组索引加以替换#值得注意的是,空白符和NA缺失值是不一样的,跟R中道理一样

clean_tz[clean_tz == ''] = 'Unknown'tz_counts=clean_tz.value_counts()print tz_counts[:10]#书上说下面这条语句在pylab中打开才管用,其实加一句plt.show()就可以了

tz_counts[:10].plot(kind = 'barh',rot =0)

plt.show()

下面是对数据中的字符串和表达式之类的进行的工作(前些日子经人指点Beautiful Soup是个爬虫包):

#-*- encoding: utf-8 -*-

importjsonimportnumpy as npimportpandas as pdfrom pandas importDataFrame,Seriesimportmatplotlib.pyplot as pltfrom collections importdefaultdictfrom collections importCounter#注意这里的中文路径

path = u'D:\\你好\\usagov_bitly_data2012-03-16-1331923249.txt'

#print open(path).readline()#注意这里的json模块中的loads函数将字符串转换为字典,非常有用!#注意这里的缩略循环形式

records = [json.loads(line) for line inopen(path)]

frame=DataFrame(records)#对于一个 Series,dropna 返回一个仅含非空数据和索引值的 Series

results = Series([x.split()[0] for x inframe.a.dropna()])#print results.value_counts()

cframe =frame[frame.a.notnull()]#np.where函数是一个矢量化ifelse函数

operating_system = np.where(cframe['a'].str.contains('Windows'),'Windows','Not Windows')#print operating_system[:5]#下面是将tz按照operating_system进行分组并计数并用unstack进行展开并填充na为0

by_tz_os = cframe.groupby(['tz',operating_system])

agg_counts=by_tz_os.size().unstack().fillna(0)#print agg_counts#下面注意 sum函数 默认axis = 0,是普通加和,axis = 1是按行加和,argsort是从小到大排序并返回下表

indexer = agg_counts.sum(1).argsort()#下面是取出时区最多的值,注意take函数,接下标

count_subset = agg_counts.take(indexer)[-10:]printcount_subset#下面的图很好,是累积条形图

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

上面一个例子已经完成,看下一个例子。

GroupLens Research 采集了一组从20世纪90年代末到21世纪初由MovieLens用户提供的电影评分数据。这里的目的在于对数据进行切片分析。

#-*-coding:utf-8-*-

importpandas as pdimportnumpy as npimportmatplotlib.pyplot as plt

path1= 'E:\\Pyprojects\\usepython_2.2\\movielens\\users.dat'path2= 'E:\\Pyprojects\\usepython_2.2\\movielens\\ratings.dat'path3= 'E:\\Pyprojects\\usepython_2.2\\movielens\\movies.dat'unames= ['user_id','gender','age','occupation','zip']

users= pd.read_table(path1,sep = '::',header = None,names =unames)

rnames= ['user_id','movie_id','rating','timestamp']

ratings= pd.read_table(path2,sep = '::',header = None,names =rnames)

mnames= ['movie_id','title','genres']

movies= pd.read_table(path3,sep = '::',header = None,names =mnames)#print users.head()

#下面是对三个数据集合进行merge操作,最终的行数由ratings决定,原因显然

data =pd.merge(pd.merge(ratings,users),movies)#print data.ix[0]#下面按照性别计算每部电影的平均得分,说实话,这个透视表函数还真是通俗易懂

mean_ratings = data.pivot_table('rating',rows = 'title',cols = 'gender',aggfunc = 'mean')#print mean_ratings.head()#下面是按照title对data分组并计数

ratings_by_title = data.groupby('title').size()#下面的index返回的下标

active_titles = ratings_by_title.index[ratings_by_title >= 251]#下面之所以可以这样做是因为groupby函数和透视表都是按照相同是顺序排序的

mean_ratings =mean_ratings.ix[active_titles]#print mean_ratings

top_female_ratings = mean_ratings.sort_index(by = 'F',ascending =False)#print top_female_ratings.head()#下面一部分计算男性和女性分歧最大的电影#注意,下面的语句直接加入了一列diff,这样得到的就是女性最喜欢的电影,注意方法sort_index的应用

mean_ratings['diff'] = mean_ratings['M'] - mean_ratings['F']

sorted_by_diff= mean_ratings.sort_index(by = 'diff')#下面是对数据框的行反序并取出前15行,但是 如何对行反序呢?(哦,就是按照原来的行的反向就行)#print sorted_by_diff[::-1][:15]#下面考虑分歧最大的电影,不考虑性别因素

rating_std_by_title = data.groupby('title')['rating'].std()

rating_std_by_title=rating_std_by_title.ix[active_titles]#对Series对象进行排序,需要用order

print rating_std_by_title.order(ascending=False)[:10]

上面的例子中,有不少需要注意的地方,信息量比较大(对于新手)。下面的例子内容更多一些:

#-*- encoding: utf-8 -*-

importjsonimportnumpy as npimportpandas as pdfrom pandas importDataFrame,Seriesimportmatplotlib.pyplot as pltfrom collections importdefaultdictfrom collections importCounter

path_base= u'E:\\BaiduYun\\计算机\\python\\利用python进行数据分析\\pydata-book-master\ch02\\names\\'

#下面读入多个文件到同一个DataFrame中

years = range(1880,2011)

pices=[]

columns= ['name','sex','births']for year inyears:

path= path_base + 'yob%d.txt' %year

frame= pd.read_csv(path,names=columns)

frame['year'] =year

pices.append(frame)break

#注意pd.concat是默认按行进行的合并,是一种outer外连接,按照索引作为连接键

names = pd.concat(pices,ignore_index=True)#下面进行一下聚合,注意这里的pivot_table真是太有用了!

total_births = names.pivot_table('births',rows = 'year',cols = 'sex',aggfunc=sum)#print total_births.tail()#total_births.plot(title = 'Total births by sex and year')#3plt.show()#下面要插入一列,出生量占总出生量的比例

defadd_prop(group):#下面将数据换为float类型

births =group.births.astype(float)

group['prop'] = births /births.sum()returngroup

names= names.groupby(['year','sex']).apply(add_prop)#下面对prop列进行加和看是不是等于1,由于是浮点型数据,用的是allclose函数,判断是否和1足够接近#print np.allclose(names.groupby(['year','sex']).prop.sum(),1)#现在要取一个子集,是每一个‘year’‘sex’对的出生量前1000名

defget_top1000(group):return group.sort_index(by = 'births',ascending=False)[:1000]

grouped= names.groupby(['year','sex'])

top1000=grouped.apply(get_top1000)#print top1000.head()

下面是把后半部分补充完整:

#-*- encoding: utf-8 -*-

importosimportjsonimportnumpy as npimportpandas as pdfrom pandas importDataFrame,Seriesimportmatplotlib.pyplot as plt

path_base= u'D:\\pydata-book-master\\ch02\\names\\'

#下面读入多个文件到同一个DataFrame中

years = range(1880,2011)

pices=[]

columns= ['name','sex','births']for year inyears:

path= path_base + 'yob%d.txt' %year

frame= pd.read_csv(path,names=columns)

frame['year'] =year

pices.append(frame)#注意pd.concat是默认按行进行的合并,是一种outer外连接,按照索引作为连接键

names = pd.concat(pices,ignore_index=True)#下面进行一下聚合,注意这里的pivot_table真是太有用了!

total_births= names.pivot_table('births',rows = 'year',cols = 'sex',aggfunc=sum)#print total_births.tail()#total_births.plot(title = 'Total births by sex and year')#3plt.show()#下面要插入一列,出生量占总出生量的比例

defadd_prop(group):#下面将数据换为float类型

births =group.births.astype(float)

group['prop'] = births /births.sum()returngroup

names= names.groupby(['year','sex']).apply(add_prop)#下面对prop列进行加和看是不是等于1,由于是浮点型数据,用的是allclose函数,判断是否和1足够接近#print np.allclose(names.groupby(['year','sex']).prop.sum(),1)#现在要取一个子集,是每一个‘year’‘sex’对的出生量前1000名

defget_top1000(group):return group.sort_index(by = 'births',ascending=False)[:1000]

grouped= names.groupby(['year','sex'])

top1000=grouped.apply(get_top1000)#print top1000.head()#下面是分析命名趋势

boys = top1000[top1000.sex == 'M']

girls= top1000[top1000.sex == 'F']#下面做一个透视表

total_births = top1000.pivot_table('births',rows = 'year',cols = 'name',aggfunc =sum)

subset= total_births[['John','Harry','Mary','Marilyn']]#下面的subplots是用来标明是否将几个图画在一起,figsize用来标明大小,grid 是标明是否有网格线#subset.plot(subplots = True,figsize = (12,10),grid = True,title = 'Number of births per year')#plt.show()

#下面评估明明多样性的增长,计算最流行的1000个名字所占的比例#table = top1000.pivot_table('prop',rows = 'year',cols = '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()#另一个方式是计算总出生人数前50%的不同名字的数量#df = boys[boys.year == 2010]#下面就要找到prop的和是0.5的位置,书上说写循环也行,但是numpy中也有cunsum函数,R语言中也有,这当然是极好的。

#prop_cumsum = df.sort_index(by = 'prop',ascending = False).prop.cumsum()#print prop_cumsum[:10]#下面这个函数简直太方便,searchsorted#print prop_cumsum.searchsorted(0.5)#注意下面的函数,将所有的年份都进行一次计算

def get_quantile_count(group,q = 0.5):

group= group.sort_index(by = 'prop',ascending=False)return group.prop.cumsum().searchsorted(q) + 1diversity= top1000.groupby(['year','sex']).apply(get_quantile_count)

diversity= diversity.unstack('sex')#print diversity.head()

diversity.plot(title = 'Number of popular names in top 50%')

plt.show()#最后一个字母的变革#从name列取出最后一个字母,注意lamda这个语句使用来创建匿名函数

get_last_letter = lambda x:x[-1]#注意这里的map函数是一种 “并行”式的函数,对name的每个元素进行后面的函数

last_letters =names.name.map(get_last_letter)

last_letters.name= 'last_letter'

#下面的语句让我感到了奇怪,为何last_latters不在names中却还能顺利生成数据透视表?毁三观呐

table = names.pivot_table('births',rows = last_letters,cols = ['sex','year'],aggfunc =sum)

subtable= table.reindex(columns = [1910,1960,2010],level = 'year')#print subtable.head()

letter_prop = subtable /subtable.sum().astype(float)

fig,axes= plt.subplots(2,1,figsize=(10,8))

letter_prop['M'].plot(kind = 'bar',rot = 0,ax = axes[0],title = 'Male')

letter_prop['F'].plot(kind = 'bar',rot = 0,ax = axes[1],title = 'Female',legend =False)

plt.show()

letter_prop= table /table.sum().astype(float)

dny_ts= letter_prop.ix[['d','n','y'],'M'].T

dny_ts.plot()

plt.show()#下面是最后一项,变成女孩名字的男孩名字(以及相反的情况)

all_names =top1000.name.unique()#这里的in函数应该是一个部分匹配函数,另外上面的语句中的unique很熟悉,R语言中也有

mask = np.array(['lesl' in x.lower() for x inall_names])

lesley_like=all_names[mask]#然后用这个结果过滤掉其他的名字,并按名字分组计算出生数以查看相对频率#下面这个isin函数非常方便

flitered =top1000[top1000.name.isin(lesley_like)]

flitered.groupby('name').births.sum()

table= flitered.pivot_table('births',rows = 'year',cols = 'sex',aggfunc = 'sum')#print table.head()#注意这里的div函数是做一个归一化

table = table.div(table.sum(1),axis =0)printtable.head()#print table.tail()

table.plot(style = {'M':'k-','F':'k--'})

plt.show()

这二章完事,下一章是IPython,第三章少写一点,本章是受益匪浅。

用python进行数据分析举例说明_《利用python进行数据分析》读书笔记 --第一、二章 准备与例子...相关推荐

  1. python输入数组并计算_利用Python进行数据分析——Numpy基础:数组和矢量计算

    利用Python进行数据分析--Numpy基础:数组和矢量计算 ndarry,一个具有矢量运算和复杂广播能力快速节省空间的多维数组 对整组数据进行快速运算的标准数学函数,无需for-loop 用于读写 ...

  2. python处理水站的数据_利用Python进行数据分析(一):数据清洗与准备

    b站的小伙伴们大家吼~~ 在b站摸了快四年鱼的菜鸡也想开始做知识分享了,虽然说是分享其实根本目的也是为了督促自己好好学习把QAQ. 从今天开始,我将会在专栏分享我在学习<利用Python进行数据 ...

  3. 利用python从网页查找数据_利用Python模拟淘宝的搜索过程并对数据进行可视化分析...

    数据挖掘入门与实战 公众号: datadw 本文讲述如何利用Python模拟淘宝的搜索过程并对搜索结果进行初步的数据可视化分析. 搜索过程的模拟:淘宝的搜索页面有两种形式, 一种形式是, 2019/2 ...

  4. python 打卡记录代码_利用Python实现对考勤打卡数据处理的总结

    利用Python实现对考勤打卡数据处理的总结 一.背景交代 二.说明 三. 8种方法 1. 查看文件是否存在 2. 导入excel文件,并把数据保存为dataframe格式 3. 计算程序运行时间 4 ...

  5. python自动生成word报告_利用Python实现报告自动生成

    前几天,在网上看到一篇介绍利用Python组件实现MS word内容生成的文章.可能是很久没接触编码,感觉在技术领域变得有点孤陋寡闻了,看见一些实用的功能都觉的屌屌的.以前经常通过代码写Excel文件 ...

  6. python怎么读取sav格式_利用Python读取外部数据文件

    利用Python读取外部数据文件 [color=rgb(0, 0, 0) !important]刘顺祥 [color=rgb(0, 0, 0) !important]摘要: 不论是数据分析,数据可视化 ...

  7. python怎么去掉视频字幕_利用Python实现字幕挂载(把字幕文件与视频合并)思路详解...

    其实超简单超简单!python好现成的库,一下子省略了好多步骤! 本文在Windows环境下!linux只是不需要手动输入imagicmagick的位置! 需要用到的环境 python(基本上只要不是 ...

  8. python制作心形照片墙_利用python生成照片墙的示例代码

    PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了.其官方主页为:PIL. PIL历 ...

  9. python 物理学中的应用_利用python求解物理学中的双弹簧质能系统详解

    前言 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的模型如下: 在这个系统里有两个物体,它们的质 ...

  10. python用渐变色画圆_利用python控制Autocad:pyautocad方式

    发现pyautocad模块:可以用python控制autocad的包.今天把文档中的重点内容摘录出来,以后绘图.计算大工程量.或者识别施工图的时候时候也许可以用到. 一.连接cad pyautocad ...

最新文章

  1. 技术图文:02 创建型设计模式(下)
  2. 郁闷。用户的无聊话题
  3. R语言可视化包ggplot2绘制分组回归线实战(Regression Line by Group)
  4. nodejs写html文件路径,Nodejs读取文件时相对路径的正确写法(使用fs模块)
  5. 深入理解java虚拟机 - jvm高级特性与最佳实践(第三版)_JVM虚拟机面试指南:年薪30W以上高薪岗位需求的JVM,你必须要懂!...
  6. 基于matlab的升压斩波实验,升降压斩波电路matlab仿真
  7. c++工作笔记001---c++相关零碎要点_endl、“\n”和‘\n’区别_extern int a关键字_-的意思_::的意思_指针和引用的区别
  8. spring aop中使用@Pointcut注解抽取可重用的切入点表达式
  9. python手机版-QPython3手机版下载
  10. 各类资源工具下载地址(http://msdn.itellyou.cn/)
  11. 亲测好用的PS图片无损放大插件:Blow Up 3 for Mac
  12. python start方法_进程方法 run和start的区别
  13. NCN8025 TDA8035 智能卡接口IC读卡器芯片的替代解决方案
  14. 计算机论文word版,计算机应用基础第05章Word高级应用-毕业论文排版
  15. 冒烟测试的7个好处,你是否经常用到它?
  16. 在西安,1000万人的城市,有多少家IT培训机构?
  17. Large Division-----同余模定理(大数的求余)
  18. RDD论文翻译:基于内存的集群计算容错抽象
  19. VC++6.0 用gSoap客户端访问WebService
  20. 精美的微信小程序简历让面试官一目了然

热门文章

  1. 如何在微信H5页面链接跳转到第三方小程序的任意页面?
  2. day13-搜索过滤
  3. 船舶物资与市场杂志船舶物资与市场杂志社船舶物资与市场编辑部2022年第7期目录
  4. JS与jQuery获取任意事件的子元素下标(获取当前类数组的某一子元素下标)
  5. 2020年同济软院夏令营经历
  6. 费曼技巧:学习任何东西的最佳方法
  7. HAL库版STM32双轮自平衡车(一) ———代码思路和PID基础精讲
  8. 开源农业SaaS系统(Version:2.0.1)包含源代码
  9. DETR3D模型源码导读 MMDetection3D构建流程
  10. IntelliJ IDEA java项目导入jar包,打jar包