说明:本文章为Python数据处理学习日志,主要内容来自书本《利用Python进行数据分析》,Wes McKinney著,机械工业出版社。

电影数据分析

所需文件在Day2中下载,接下来要用到的一些文件的文件格式如下:

    users.dat文件格式1::F::1::10::480672::M::56::16::700723::M::25::15::55117ratings.dat文件格式1::1193::5::9783007601::661::3::9783021091::914::3::978301968movies.dat文件格式1::Toy Story (1995)::Animation|Children's|Comedy2::Jumanji (1995)::Adventure|Children's|Fantasy3::Grumpier Old Men (1995)::Comedy|Romance
[/code]通过pandas.read_table将各个表分别读到pandas DataFrame对象中:​```codeimport pandas as pdimport ospath='E:\\Enthought\\book\\ch02\\movielens'os.chdir(path) #改变当前工作目录到pathunames = ['user_id','gender','age','occupation','zip']users = pd.read_table('users.dat',sep='::',header=None,names=unames) #根据'::'分解记录-c:1: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators; you can avoid this warning by specifying engine='python'.rnames = ['user_id','movie_id','rating','timestamp']ratings = pd.read_table('ratings.dat',sep='::',header=None,names=rnames,engine='python') #加了engine='python'就不会出现上述报错mnames = ['movie_id','title','genres']movies = pd.read_table('movies.dat',sep='::',header=None,names=mnames,engine='python')
[/code]查看各个DataFrame对象:​```codeusers[:5]Out[11]: user_id gender  age  occupation    zip0        1      F    1          10  480671        2      M   56          16  700722        3      M   25          15  551173        4      M   45           7  024604        5      M   25          20  55455ratings[:5]Out[12]: user_id  movie_id  rating  timestamp0        1      1193       5  9783007601        1       661       3  9783021092        1       914       3  9783019683        1      3408       4  9783002754        1      2355       5  978824291movies[:5]Out[13]: movie_id                               title                        genres0         1                    Toy Story (1995)   Animation|Children's|Comedy1         2                      Jumanji (1995)  Adventure|Children's|Fantasy2         3             Grumpier Old Men (1995)                Comedy|Romance3         4            Waiting to Exhale (1995)                  Comedy|Drama4         5  Father of the Bride Part II (1995)                        Comedy
[/code]其中年龄age,职业occupation是以编码形式给出,具体含义参见README。
接下来尝试分析散布在三个表中的数据。假设我们想根据性别和年龄计算某部电影的平均得分,如果将所有数据合并到一个表的话问题就简单多了。我们先用pandas的merge函数将ratings跟users
**合并** 到一起,然后再将movies野合并进去。pandas会根据列明的重叠情况推断出哪些是合并(或连接)键:​```codedata = pd.merge(pd.merge(ratings,users),movies)data[:5] #可能输merge策略改变,接下来两个输出结果均与书本不同Out[16]: user_id  movie_id  rating  timestamp gender  age  occupation    zip  \0        1      1193       5  978300760      F    1          10  48067   1        2      1193       5  978298413      M   56          16  70072   2       12      1193       4  978220179      M   25          12  32793   3       15      1193       4  978199279      M   25           7  22903   4       17      1193       5  978158471      M   50           1  95350   title genres  0  One Flew Over the Cuckoo's Nest (1975)  Drama  1  One Flew Over the Cuckoo's Nest (1975)  Drama  2  One Flew Over the Cuckoo's Nest (1975)  Drama  3  One Flew Over the Cuckoo's Nest (1975)  Drama  4  One Flew Over the Cuckoo's Nest (1975)  Drama  data.ix[0] #输出第一条记录Out[17]: user_id                                            1movie_id                                        1193rating                                             5timestamp                                  978300760gender                                             Fage                                                1occupation                                        10zip                                            48067title         One Flew Over the Cuckoo's Nest (1975)genres                                         DramaName: 0, dtype: object
[/code]接下来就可以根据任意个用户或者电影属性对评分数据进行 **聚合** 操作。按性别计算每部电影的平均分,可以使用pivot_table方法:​```codemean_ratings = data.pivot_table('rating',index='title',columns='gender',aggfunc='mean') #参数改变rows-index,cols-columns,与书本不一样mean_ratings[:5]Out[26]: gender                                F         Mtitle                                            $1,000,000 Duck (1971)         3.375000  2.761905'Night Mother (1986)           3.388889  3.352941'Til There Was You (1997)      2.675676  2.733333'burbs, The (1989)             2.793478  2.962085...And Justice for All (1979)  3.828571  3.689024
[/code]该操作产生一个DataFrame,其内容为电影平均分,行标为电影名称,列标为性别。现在,过滤掉评分数据不够250条的电影。先对title进行分组,然后利用size()得到一个含有各电影分组大小的Series对象:​```coderatings_by_title = data.groupby('title').size()ratings_by_title[:10]Out[28]: title$1,000,000 Duck (1971)                37'Night Mother (1986)                  70'Til There Was You (1997)             52'burbs, The (1989)                   303...And Justice for All (1979)        1991-900 (1994)                           210 Things I Hate About You (1999)    700101 Dalmatians (1961)                565101 Dalmatians (1996)                36412 Angry Men (1957)                  616dtype: int64active_titles = ratings_by_title.index[ratings_by_title>=250]active_titlesOut[31]: Index([u''burbs, The (1989)', u'10 Things I Hate About You (1999)',u'101 Dalmatians (1961)', u'101 Dalmatians (1996)',u'12 Angry Men (1957)', u'13th Warrior, The (1999)',u'2 Days in the Valley (1996)', u'20,000 Leagues Under the Sea (1954)',u'2001: A Space Odyssey (1968)', u'2010 (1984)',...u'X-Men (2000)', u'Year of Living Dangerously (1982)',u'Yellow Submarine (1968)', u'You've Got Mail (1998)',u'Young Frankenstein (1974)', u'Young Guns (1988)',u'Young Guns II (1990)', u'Young Sherlock Holmes (1985)',u'Zero Effect (1998)', u'eXistenZ (1999)'],dtype='object', name=u'title', length=1216)
[/code]该索引中含有评分数据大于250条的电影名称,然后就可以据此从前面的mean_ratings中 **选取** 所需的行了:​```codemean_ratings = mean_ratings.ix[active_titles]mean_ratings[:5] #此处与书本不同Out[34]: gender                                    F         Mtitle                                                'burbs, The (1989)                 2.793478  2.96208510 Things I Hate About You (1999)  3.646552  3.311966101 Dalmatians (1961)              3.791444  3.500000101 Dalmatians (1996)              3.240000  2.91121512 Angry Men (1957)                4.184397  4.328421
[/code]为了了解女性观众最喜欢的电影,可以对F列降序排列:​```codetop_female_ratings = mean_ratings.sort_index(by='F',ascending=False)-c:1: FutureWarning: by argument to sort_index is deprecated, pls use .sort_values(by=...)#此处出现警告,pandas0.18.1版本sort_index没有by参数,具体见下top_female_ratings = mean_ratings.sort_values(by='F',ascending=False)top_female_ratings[:10]Out[38]: gender                                                     F         Mtitle                                                                 Close Shave, A (1995)                               4.644444  4.473795Wrong Trousers, The (1993)                          4.588235  4.478261Sunset Blvd. (a.k.a. Sunset Boulevard) (1950)       4.572650  4.464589Wallace & Gromit: The Best of Aardman Animation...  4.563107  4.385075Schindler's List (1993)                             4.562602  4.491415Shawshank Redemption, The (1994)                    4.539075  4.560625Grand Day Out, A (1992)                             4.537879  4.293255To Kill a Mockingbird (1962)                        4.536667  4.372611Creature Comforts (1990)                            4.513889  4.272277Usual Suspects, The (1995)                          4.513317  4.518248
[/code]警告函数比较,pandas版本0.18.1> **pandas.DataFrame.sort_index()**
>  **Parameters:**
>  **_axis_ ** : index, columns to direct sorting
>  **_level_ ** : int or level name or list of ints or list of level names
>  if not None, sort on values in specified index level(s)
>  **_ascending_ ** : boolean, default True
>  Sort ascending vs. descending
>  **_inplace_ ** : bool, if True, perform operation in-place
>  **_kind_ ** : {quicksort, mergesort, heapsort}
>  Choice of sorting algorithm. See also ndarray.np.sort for more information.
> mergesort is the only stable algorithm. For DataFrames, this option is only
> applied when sorting on a single column or label.
>  **_na_position_ ** : {‘first’, ‘last’}
>  first puts NaNs at the beginning, last puts NaNs at the end
>  **_sort_remaining_ ** : bool
>  if true and sorting by level and index is multilevel, sort by other levels
> too (in order) after sorting by specified level
>  **Returns:**
>  **_sorted_obj_ ** : DataFrame
>
> **pandas.DataFrame.sort_values()**
>  **Parameters** :
>  **_by_ ** : string name or list of names which refer to the axis items
>  **_axis_ ** : index, columns to direct sorting
>  **_ascending_ ** : bool or list of bool
>  Sort ascending vs. descending. Specify list for multiple sort orders. If
> this is a list of bools, must match the length of the by.
>  **_inplace_ ** : bool
>  if True, perform operation in-place
>  **_kind_ ** : {quicksort, mergesort, heapsort}
>  Choice of sorting algorithm. See also ndarray.np.sort for more information.
> mergesort is the only stable algorithm. For DataFrames, this option is only
> applied when sorting on a single column or label.
>  **_na_position_ ** : {‘first’, ‘last’}
>  first puts NaNs at the beginning, last puts NaNs at the end
>  **Returns** :
>  **_sorted_obj_ ** : DataFrame计算评分分歧
假设我们想要找出男性和女性观众分歧最大的电影。一个办法师给mean_ratings加上一个用于存放平均得分之差的列diff,并对其进行排序可得到分歧最大且女性观众更喜欢的电影:​```codemean_ratings['diff'] = mean_ratings['M']-mean_ratings['F']sort_by_diff = mean_ratings.sort_values(by='diff')sort_by_diff[:5]Out[41]: gender                            F         M      difftitle                                                  Dirty Dancing (1987)       3.790378  2.959596 -0.830782Jumpin' Jack Flash (1986)  3.254717  2.578358 -0.676359Grease (1978)              3.975265  3.367041 -0.608224Little Women (1994)        3.870588  3.321739 -0.548849Steel Magnolias (1989)     3.901734  3.365957 -0.535777
[/code]堆排序结果反序并取前5行,得到的则是男性观众更喜爱的电影:​```codesort_by_diff[::-1][:5]Out[43]: gender                                         F         M      difftitle                                                               Good, The Bad and The Ugly, The (1966)  3.494949  4.221300  0.726351Kentucky Fried Movie, The (1977)        2.878788  3.555147  0.676359Dumb & Dumber (1994)                    2.697987  3.336595  0.638608Longest Day, The (1962)                 3.411765  4.031447  0.619682Cable Guy, The (1996)                   2.250000  2.863787  0.613787
[/code]如果只想要找出分歧最大的电影(不考虑性别因素),则可以计算得分数据的方差或者标准差:​```code#分组后计算标准差rating_std_by_title = data.groupby('title')['rating'].std()#筛选评分多于250条的rating_std_by_title = rating_std_by_title.ix[active_titles]rating_std_by_title.order(ascending=False)[:5]-c:1: FutureWarning: order is deprecated, use sort_values(...) #虽有警告,依然能得出结果rating_std_by_title.sort_values(ascending=False)[:5]Out[50]: titleDumb & Dumber (1994)                     1.321333Blair Witch Project, The (1999)          1.316368Natural Born Killers (1994)              1.307198Tank Girl (1995)                         1.277695Rocky Horror Picture Show, The (1975)    1.260177Name: rating, dtype: float64
[/code]![在这里插入图片描述](https://img-blog.csdnimg.cn/20210608151750993.gif)

Python数据分析示例(2)Day3相关推荐

  1. 《Python数据分析与挖掘实战》示例源码免费下载

    <Python数据分析与挖掘实战>​ 在当今大数据驱动的时代,要想从事机器学习.人工智能.数据挖掘等前沿技术,离不开数据跟踪与分析,通过NumPy.Pandas等进行数据科学计算,通过Se ...

  2. python 住区数据_Python实现的北京积分落户数据分析示例

    本文实例讲述了Python实现的北京积分落户数据分析.分享给大家供大家参考,具体如下: 北京积分落户状况 获取数据(爬虫/文件下载)-> 分析 (维度-指标) 从公司维度分析不同公司对落户人数指 ...

  3. Python数据分析三剑客学习笔记Day3——pandas包的使用:认识series类型,DataFrame类型,读取excel表格数据及数据操作

    本文是视频Python数据分析三剑客 数学建模基础 numpy.pandas.matplotlib的学习笔记. -------------------------------------------- ...

  4. 彩民看过来,看老程序员如何用Python数据分析双色球基于线性回归算法预测下期中奖结果示例

    @本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 本文实例讲述了Python数据分析之双色球基于线性回归算法预测下期中奖结果.分享给大家供大家参考,具体如下: 前面讲述了关于双色球 ...

  5. python数据分析简单实例-利用Python进行数据分析――基础示例

    编辑推荐: 来源csdn ,文章通过美国官方网站的几个案例详细讲解了Python数据分析,介绍较为详细,更多内容请参阅下文. import json import numpy as np import ...

  6. python数据分析基础 余本国_Python数据分析基础

    本书根据作者多年教学经验编写, 条理清楚, 内容深浅适中, 尽量让读者从实例出发, 结合课后练习, 少走弯路.本书涉及的内容主要包括Python数据类型与运算.流程控制及函数与类.Pandas库的数据 ...

  7. python代码示例图形-纯干货:手把手教你用Python做数据可视化(附代码)

    原标题:纯干货:手把手教你用Python做数据可视化(附代码) 导读:制作提供信息的可视化(有时称为绘图)是数据分析中的最重要任务之一.可视化可能是探索过程的一部分,例如,帮助识别异常值或所需的数据转 ...

  8. 如何自学python数据分析-良心整理!学习Python数据分析的正确姿势

    学习 Python 数据分析的正确姿势 如果你是通过学习给程序员设计的 Python 课程来学习 Python 数据分析,那就大错特错了.很多数据分析师在开始学习 Python 数据分析之前就被引导学 ...

  9. 从零开始学python数据分析-从零开始学Python数据分析与挖掘 PDF 扫描版

    给大家带来的一篇关于数据挖掘相关的电子书资源,介绍了关于Python.数据分析.数据挖掘方面的内容,本书是由清华大学出版社出版,格式为PDF,资源大小67.8 MB,刘顺祥编写,目前豆瓣.亚马逊.当当 ...

最新文章

  1. Android MediaPlayer 和 NativePlayer 播放格式控制
  2. IOS , plist 配置项说明
  3. 韩国浦项化学在中国斥资超2800亿韩元投建电动车电池材料厂
  4. php ajax loading图片居中显示,PHP语言入门之PHP+ajax实现登录按钮加载loading效果
  5. Tensorflow官方文档学习理解 (六)-TensorFlow运作方式入门
  6. [C#]通过ARP获取Mac与IP的对应表
  7. python做什么模型_用python做模型
  8. 图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析
  9. opencv 在图片上打印字符。
  10. ros2 launch 用法以及一些基础功能函数的示例
  11. SELECT TOP 100 PERCENT * 的含义
  12. Typora最常用的记笔记教程
  13. python之pip常用命令
  14. unity ugui image组件ngui uisprite 对称显示功能
  15. 用PAM自定义身份验证
  16. MATLAB【函数和图像】
  17. C#高效编程:改进C#代码的50个行之有效的办法(第2版)(奋斗的小鸟)_PDF 电子书
  18. rdkitpython | 挑选多个互变异构体的主要构象
  19. Springboot(编程不良人)
  20. 概率论小课堂:伯努利实验(正确理解随机性,理解现实概率和理想概率的偏差)

热门文章

  1. 【SAP BO】制作SAP BO Dashboards入门教程(一)
  2. 拼多多APP产品使用体验报告
  3. Qt 设置窗口背景图片的几种方法实例
  4. 激活 MarkDownPad 2
  5. nyoj 541 最强DE 战斗力(大数问题)
  6. QT使用openGL绘制一个三角形
  7. 半导体公司----仙童、英特尔、AMD
  8. 一键安装Lnmp教程
  9. Firefly笔记一之http模块
  10. movie计算机英语作文,关于电影的英语作文movie