标签(空格分隔): 数据分析 python 数据挖掘

MovieLens 1M数据集

一组从20世纪90年末到21世纪初由MovieLens用户提供的电影评分数据。这些数据中包括电影评分、电影元数据(风格类型和年代)以及关于用户的人口统计学数据(年龄、邮编、性别和职业等)。

MovieLens 1M数据集含有来自6000名用户对4000部电影的100万条评分数据。分为三个表:评分、用户信息和电影信息。

以下代码,通过pandas.read_table将各个表分别读到一个pandas DataFrame对象中:

import pandas as pd

unames = ['user_id', 'gender', 'age', 'occupation', 'zip']

users = pd.read_table('G:\\lcw\\movielens\\users.dat', sep='::', header=None, names=unames)

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

ratings = pd.read_table('G:\\lcw\\movielens\\ratings.dat', sep='::', header=None, names=rnames)

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

movies = pd.read_table('G:\\lcw\\movielens\\movies.dat', sep='::', header=None, names=mnames)

# 如果是读取CSV的数据格式(说明):

import pandas as pd

# Reading data locally

df = pd.read_csv('/Users/al-ahmadgaidasaad/Documents/d.csv')

# Reading data from web

data_url = "https://raw.githubusercontent.com/alstat/Analysis-with-Programming/master/2014/Python/Numerical-Descriptions-of-the-Data/data.csv"

df = pd.read_csv(data_url)

问题:对分布在三个表的数据进行分析同时进行分析很难,那必须将所有的数据都合并到一个表中进行分析,下面,用pandas的merge函数将ratings跟users合并到一起,然后再将movies也合并进去。pandas会根据列名的重叠情况推断出哪些列是合并(或连接)键:

>>> data = pd.merge(pd.merge(ratings,users),movies)

>>> data

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

5 18 1193 4 978156168 F 18 3 95825

6 19 1193 5 982730936 M 1 10 48073

7 24 1193 5 978136709 F 25 7 10023

8 28 1193 3 978125194 F 25 1 14607

9 33 1193 5 978557765 M 45 3 55421

10 39 1193 5 978043535 M 18 4 61820

11 42 1193 3 978038981 M 25 8 24502

下面对pandas进行聚类操作:

1、按性别计算每部电影的平均得分,用Pivot_table方法:

DataFrame 对象有一个 .pivot_table(data, values=None, rows=None, cols=None, aggfunc='mean', fill_value=None, margins=False, dropna=True) 方法可以用来制作透视表,同时 pd.pivot_table() 也是一个顶层函数。

data 参数相当于 self,这里将其命名为 data 也许是为了与顶级函数版本的 pivot_table 保持一致。

values 参数可以是一个以列名为元素的列表,用于指定想要聚合的数据,不给出的话默认使用全部数据。

rows 参数用于指定行分组键

cols 参数用于指定列分组键

aggfunc 参数用于指定聚合函数,默认为均值(mean),也可以是np.sum

margins 参数是小计(Total)功能的开关,设为 True 后结果集中会出现名为 “ALL” 的行和列

>>> df

A B C D

0 foo one small 1

1 foo one large 2

2 foo one large 2

3 foo two small 3

4 foo two small 3

5 bar one large 4

6 bar one small 5

7 bar two small 6

8 bar two large 7

>>> table = pivot_table(df, values='D', rows=['A', 'B'], cols=['C'], aggfunc=np.sum)

>>> table

small large

foo one 1 4

two 6 NaN

bar one 5 4

two 6 7

具体实例:

>>> mean_ratings = data.pivot_table('rating', rows='title',cols='gender',aggfunc='mean')

>>> mean_ratings[:5]

gender F M

title

$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

ps 该操作产生了另一个DataFrame,其内容为电影平均得分,行标为电影名称,列表为性别。

2、过滤掉评分数据不够250条的电影,为了达到这个目的,先对title进行分组,然后利用size() 得到一个含有各电影分组大小的Series对象:

>>> ratings_by_titlr = data.groupby('title').size()

>>> ratings_by_titlr[:10]

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

1-900 (1994) 2

10 Things I Hate About You (1999) 700

101 Dalmatians (1961) 565

101 Dalmatians (1996) 364

12 Angry Men (1957) 616

dtype: int64

>>> active_titles = ratings_by_titlr.index[ratings_by_titlr >250]

>>> active_titles

ps 这个地方得到的其实是满足条件的title的Index索引值,然后在下面用索引字段ix中直接获取

然后从1中切出评论大于250条的电影了:

>>> mean_ratings = mean_ratings.ix[active_titles]

>>> active_titles

Index([u''burbs, The (1989)', u'10 Things I Hate About You (1999)', u'101 Dalmatians (1961)', ...], dtype='object')

ps :这个地方用ix[active_titles] 直接获取对应的数据

我们做了个试验:

>>> data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],'year': [2000, 2001, 2002, 2001, 2002],'pop':[1.5, 1.7, 3.6, 2.4, 2.9]}

>>> frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],index=['one', 'two', 'three', 'four', 'five'])

>>> frame2.columns

Index([u'year', u'state', u'pop', u'debt'], dtype='object')

>>> frame2.ix['three']

year 2002

state Ohio

pop 3.6

debt NaN

Name: three, dtype: object

>>> obj = frame2.index

>>> frame2.ix[obj]

year state pop debt

one 2000 Ohio 1.5 NaN

two 2001 Ohio 1.7 NaN

three 2002 Ohio 3.6 NaN

four 2001 Nevada 2.4 NaN

five 2002 Nevada 2.9 NaN

这里涉及到切片,DataFrame对象的标准切片语法为:.ix[::,::].ix对象可以接受两套切片,分别为行(axis =0)和列(axis =1)的方向:

>>> df

Ohio Texas California

a 0 1 2

c 3 4 5

d 6 7 8

[3 rows x 3 columns]

>>> df.ix[:2,:2]

Ohio Texas

a 0 1

c 3 4

[2 rows x 2 columns]

>>> df.ix['a','Ohio']

0

而不使用 ix,直接切的情况就特殊了:索引时,选取的是列,切片时,选取的是行

>>> df['Ohio']

a 0

c 3

d 6

Name: Ohio, dtype: int32

>>> df[:'c']

Ohio Texas California

a 0 1 2

c 3 4 5

[2 rows x 3 columns]

>>> df[:2]

Ohio Texas California

a 0 1 2

c 3 4 5

[2 rows x 3 columns]

使用布尔型数组的情况,注意行与列的不同切法(列切法的“:”不能省)

>>> df['Texas']>=4

a False

c True

d True

Name: Texas, dtype: bool

>>> df[df['Texas']>=4]

Ohio Texas California

c 3 4 5

d 6 7 8

[2 rows x 3 columns]

>>> df.ix[:,df.ix['c']>=4]

Texas California

a 1 2

c 4 5

d 7 8

[3 rows x 2 columns]

我只是不知道为什么不能显示摘要模式

接下来就是对某一行的数据进行排列,主要用到的是sort_index

>>> top_female_ratings = mean_ratings.sort_index(by = 'F', ascending = False)

>>> top_female_ratings

Series 的sort_index(ascending=True) 方法可以对index进行排序操作,ascdending 参数用于控制升序或者降序,默认是升序 DataFrame 上,.sort_index(axis=0, by=None, ascending=True) 方法多了一个轴向的选择参数与一个 by 参数,by 参数的作用是针对某一(些)列进行排序(不能对行使用 by 参数):。

3、计算评分分歧,找出男性和女性观众分歧最大的电影。在mean_ratings 加上一个用于存放平均得分之差的列,并对其进行排序:

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

>>> sort_by_diff = mean_ratings.sort_index(by='diff')

>>> sort_by_diff[:15]

gender F M diff

title

Dirty Dancing (1987) 3.790378 2.959596 -0.830782

Jumpin' Jack Flash (1986) 3.254717 2.578358 -0.676359

Grease (1978) 3.975265 3.367041 -0.608224

Little Women (1994) 3.870588 3.321739 -0.548849

Steel Magnolias (1989) 3.901734 3.365957 -0.535777

Anastasia (1997) 3.800000 3.281609 -0.518391

Rocky Horror Picture Show, The (1975) 3.673016 3.160131 -0.512885

Color Purple, The (1985) 4.158192 3.659341 -0.498851

Age of Innocence, The (1993) 3.827068 3.339506 -0.487561

Free Willy (1993) 2.921348 2.438776 -0.482573

French Kiss (1995) 3.535714 3.056962 -0.478752

Little Shop of Horrors, The (1960) 3.650000 3.179688 -0.470312

Guys and Dolls (1955) 4.051724 3.583333 -0.468391

Mary Poppins (1964) 4.197740 3.730594 -0.467147

Patch Adams (1998) 3.473282 3.008746 -0.464536

对排序结果反序并取出前15行,得到的则是观众更喜欢的电影:[:: -1] 取反

>>> sort_by_diff[:: -1][:15]

gender F M diff

title

Good, The Bad and The Ugly, The (1966) 3.494949 4.221300 0.726351

Kentucky Fried Movie, The (1977) 2.878788 3.555147 0.676359

Dumb & Dumber (1994) 2.697987 3.336595 0.638608

Longest Day, The (1962) 3.411765 4.031447 0.619682

Cable Guy, The (1996) 2.250000 2.863787 0.613787

Evil Dead II (Dead By Dawn) (1987) 3.297297 3.909283 0.611985

Hidden, The (1987) 3.137931 3.745098 0.607167

Rocky III (1982) 2.361702 2.943503 0.581801

Caddyshack (1980) 3.396135 3.969737 0.573602

For a Few Dollars More (1965) 3.409091 3.953795 0.544704

Porky's (1981) 2.296875 2.836364 0.539489

Animal House (1978) 3.628906 4.167192 0.538286

Exorcist, The (1973) 3.537634 4.067239 0.529605

Fright Night (1985) 2.973684 3.500000 0.526316

Barb Wire (1996) 1.585366 2.100386 0.515020

但是,只是想要找出分歧最大的电影(不考虑性别因素),则可以计算得分数据的方差或者标准差

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

>>> rating_std_by_title

title

$1,000,000 Duck (1971) 1.092563

'Night Mother (1986) 1.118636

'Til There Was You (1997) 1.020159

'burbs, The (1989) 1.107760

...And Justice for All (1979) 0.878110

1-900 (1994) 0.707107

10 Things I Hate About You (1999) 0.989815

101 Dalmatians (1961) 0.982103

101 Dalmatians (1996) 1.098717

12 Angry Men (1957) 0.812731

13th Warrior, The (1999) 1.140421

187 (1997) 1.057919

2 Days in the Valley (1996) 0.921592

20 Dates (1998) 1.151943

20,000 Leagues Under the Sea (1954) 0.869685

...

Name: rating, Length: 3706, dtype: float64

注意,这个地方用了groupby 默认的情况下就是统计这个属性出现的次数,但是,就像我们用mysql一样,用了groupby,肯定也会有很多相关的统计的方法:

一些numpy常用的统计方法:

count 非 NA 值的数量

describe 针对 Series 或 DF 的列计算汇总统计

min , max 最小值和最大值

argmin , argmax 最小值和最大值的索引位置(整数)

idxmin , idxmax 最小值和最大值的索引值

quantile 样本分位数(0 到 1)

sum 求和

mean 均值

median 中位数

mad 根据均值计算平均绝对离差

var 方差

std 标准差

skew 样本值的偏度(三阶矩)

kurt 样本值的峰度(四阶矩)

cumsum 样本值的累计和

cummin , cummax 样本值的累计最大值和累计最小值

cumprod 样本值的累计积

diff 计算一阶差分(对时间序列很有用)

pct_change 计算百分数变化

接下来,过滤掉评论不足250条的记录:

>>> rating_std_by_title = rating_std_by_title.ix[active_titles]

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

title

Dumb & Dumber (1994) 1.321333

Blair Witch Project, The (1999) 1.316368

Natural Born Killers (1994) 1.307198

Tank Girl (1995) 1.277695

Rocky Horror Picture Show, The (1975) 1.260177

Eyes Wide Shut (1999) 1.259624

Evita (1996) 1.253631

Billy Madison (1995) 1.249970

Fear and Loathing in Las Vegas (1998) 1.246408

Bicentennial Man (1999) 1.245533

Name: rating, dtype: float64

若要按值对 Series 进行排序,当使用 .order(na_last=True, ascending=True, kind='mergesort') 方法,任何缺失值默认都会被放到 Series 的末尾。

扩展: 排名(Series.rank(method='average', ascending=True))的作用与排序的不同之处在于,他会把对象的 values 替换成名次(从 1 到 n)。这时唯一的问题在于如何处理平级项,方法里的 method 参数就是起这个作用的,他有四个值可选:average, min, max, first。

>>> ser=Series([3,2,0,3],index=list('abcd'))

>>> ser

a 3

b 2

c 0

d 3

dtype: int64

>>> ser.rank()

a 3.5

b 2.0

c 1.0

d 3.5

dtype: float64

>>> ser.rank(method='min')

a 3

b 2

c 1

d 3

dtype: float64

>>> ser.rank(method='max')

a 4

b 2

c 1

d 4

dtype: float64

>>> ser.rank(method='first')

a 3

b 2

c 1

d 4

dtype: float64

movielens数据集导入mysql_我来做数据--如何对数据进行处理以满足机器学习技术(一):MovieLens数据...相关推荐

  1. movielens数据集导入mysql_GitHub - Colaplusice/movielens_recommend: 基于movielens数据集的电影推荐系统...

    毕业设计--基于Django的电影推荐系统和论坛 说明 注册普通用户通过web界面来设置,创建创建用户通过creeatsuperuser创建.下文有详细命令 导入电影信息通过insert_movies ...

  2. 怎样开启成功的“数据分析师”职业生涯(R、Python、机器学习、通信和数据可视化、数据直觉)

    目录 数据分析师是做什么的? 如何成为一名数据分析师:成为一名成功的数据分析师所需的技能 如何成为数据分析师:数据分析师职业的编程技能 ? R语言编程 Python 统计 数学 机器学习 在监督学习 ...

  3. 【大数据】AI、IoT、区块链这些技术与大数据融合,大数据基础软件干货不容错过

    作者:刘学习  | 小编:阿软 在IT产业发展中,包括CPU.操作系统在内的基础软硬件地位独特,不但让美国赢得了产业发展的先机,成就了产业巨头,而且因为技术.标准和生态形成的壁垒,主宰了整个产业的发展 ...

  4. 工程数据计算机处理的方法有,第二章 CADCAM技术基础-工程数据的计算机处理2011.ppt...

    文档介绍: CAD/CAM技术基础 CAD/CAM Technology Base 主讲人:XXX E-mail:XXX 第二章 工程数据的计算机处理 Computer Processing of E ...

  5. 关于ArcGISPro镶嵌数据集导入多源大批量栅格数据出现空白情况的解决方案

    关于ArcGISPro镶嵌数据集导入多源大批量栅格数据出现空白情况的解决方案 问题 在使用ArcGIS测试部分区域数据的服务发布和切片,没有遇到问题,但是在测试全省范围内的影像数据和地形,这里提供的影 ...

  6. 大数据早报:Google向化学家开放量子计算机 科学家将机器学习技术用于地震预测(10.25)

    数据早知道,上36dsj看早报! 来源36大数据,作者:奥兰多 『谷歌』Google向化学家开放量子计算机 Google 此前已经发布了一些开源且免费使用的软件,方便化学家和材料学家通过访问量子计算机 ...

  7. 荔枝机器学习平台与大数据调度系统“双剑合璧”,打造未来数据处理新模式!...

    点击上方 蓝字关注我们 ✎ 编 者 按 在线音频行业在中国仍是蓝海一片.根据 CIC 数据显示,中国在线音频行业市场规模由 2016 年的 16 亿元增长至 2020 年的 131 亿元,复合年增长率 ...

  8. 机器学习需要的最小数据量是多少?

    数据不够,假设来凑.一个数据点甚至没有数据都能搞. 参数不多的参数化统计模型(比如线性模型或者是基于被建模对线机理而定制的参数化模型)或者是常见的非参数化贝叶斯模型(例如高斯过程)都是不错的选择. 机 ...

  9. 外部表如何导入mysql_如何利用Oracle外部表导入文本文件的数据

    Oracle外部表支持两种类型的驱动:一种是ORACLE_LOADER,外部表的数据必须来源于文件文件,另一种则是ORACLE_DATAPUMP,外部表的 同事最近在忙数据一致性比对工作,需要对不同文 ...

最新文章

  1. python一切皆对象的理解_在 Python 中万物皆对象
  2. boost asio resolver
  3. 工业交换机品牌选择时注意的事项介绍
  4. NTP时间服务器实现Linux时间同步
  5. 虚拟存储器管理c语言_内存管理;虚拟内存
  6. [ASP.NET]NTKO插件使用常见问题
  7. 组件中使用_Cocos Creator中Button组件使用详解
  8. Android WebView内核版本的探究
  9. oracle数据库报01033,oracle数据库报ORA-01033错误
  10. 破解md5加密的方法
  11. excel两列数据对比找不同_快速找出表格中两列的不同项,事半功倍的方法记得收藏...
  12. Reentrantlock和背后金主AQS —————— 开开开山怪
  13. JPA中could not insert: 的解决办法
  14. 【数学建模笔记】对策论
  15. mysql报错No operations allowed after statement closed
  16. CentOS安装mysql*.rpm提示conflicts with file from package的解决办法
  17. 数学建模-朴素贝叶斯分类器
  18. 无锡设计培训——平面设计师都学什么
  19. android 手机找回密码,如何使用android手机找回以前使用的无线密码
  20. Python 获取视频时长(附代码) | Python工具

热门文章

  1. 【Unity小游戏】 | 愤怒的小鸟
  2. I.MX6ULL开发板基于阿里云项目实战 6:遇到的问题,解决方法及项目总结
  3. 深度学习图像视频压缩技术
  4. 一些vue功能和css样式
  5. TTO热转印打码机色带的故障与维护技巧
  6. 陀螺仪加速度计MPU6050程序与校准方法
  7. 飞图平板电脑android系统怎么更新,苹果平板电脑怎么更新教程【图文】
  8. TP-LINK WR886N路由器登录过程分析
  9. 三瞬属性matlab,MATLAB GUI与中学物理匀变速直线运动可视化教学的应用
  10. Linux下端口映射工具