MovieLens數(shù)據(jù)集是一個(gè)關(guān)于電影評分的數(shù)據(jù)集,里面包含了從IMDB, The Movie DataBase上面得到的用戶對電影的評分信息,詳細(xì)請看下面的介紹。
成都創(chuàng)新互聯(lián)主營安塞網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app軟件開發(fā)公司,安塞h5小程序制作搭建,安塞網(wǎng)站營銷推廣歡迎安塞等地區(qū)企業(yè)咨詢
文件里面的內(nèi)容是幫助你如何通過網(wǎng)站id在對應(yīng)網(wǎng)站上找到對應(yīng)的電影鏈接的。
movieId, imdbId, tmdbId
表示這部電影在movielens上的id,可以通過鏈接 來得到。
表示這部電影在imdb上的id,可以通過鏈接
來得到。
movieId, title, genres
文件里包含了一部電影的id和標(biāo)題,以及該電影的類別
movieId, title, genres
每部電影的id
電影的標(biāo)題
電影的類別(詳細(xì)分類見readme.txt)
文件里面的內(nèi)容包含了每一個(gè)用戶對于每一部電影的評分。
數(shù)據(jù)排序的順序按照userId,movieId排列的。
文件里面的內(nèi)容包含了每一個(gè)用戶對于每一個(gè)電影的分類
數(shù)據(jù)排序的順序按照userId,movieId排列的。
=======
該數(shù)據(jù)集(ml-latest-small)描述了電影推薦服務(wù)[MovieLens]( )的5星評級和自由文本標(biāo)記活動(dòng)。它包含9742部電影的100836個(gè)評級和3683個(gè)標(biāo)簽應(yīng)用程序。這些數(shù)據(jù)由610位用戶在1996年3月29日到2018年9月24日之間創(chuàng)建。該數(shù)據(jù)集于2018年9月26日生成。
隨機(jī)選擇用戶以包含在內(nèi)。所有選定的用戶評分至少20部電影。不包括人口統(tǒng)計(jì)信息。每個(gè)用戶都由一個(gè)id表示,并且不提供其他信息。
數(shù)據(jù)包含在 links.csv , movies.csv , ratings.csv 和 tags.csv 文件中。有關(guān)所有這些文件的內(nèi)容和用法的更多詳細(xì)信息如下。
這是一個(gè)發(fā)展的數(shù)據(jù)集。因此,它可能會(huì)隨著時(shí)間的推移而發(fā)生變化,并不是共享研究結(jié)果的適當(dāng)數(shù)據(jù)集。
========
要確認(rèn)在出版物中使用數(shù)據(jù)集,請引用以下文件:
========================
數(shù)據(jù)集文件以[逗號分隔值]文件寫入,并帶有單個(gè)標(biāo)題行。包含逗號( , )的列使用雙引號(```)進(jìn)行轉(zhuǎn)義。這些文件編碼為UTF-8。如果電影標(biāo)題或標(biāo)簽值中的重音字符(例如Misérables,Les(1995))顯示不正確,確保讀取數(shù)據(jù)的任何程序(如文本編輯器,終端或腳本)都配置為UTF-8。
MovieLens用戶隨機(jī)選擇包含。他們的ID已經(jīng)匿名化了。用戶ID在 ratings.csv 和 tags.csv 之間是一致的(即,相同的id指的是兩個(gè)文件中的同一用戶)。
數(shù)據(jù)集中僅包含至少具有一個(gè)評級或標(biāo)記的電影。這些電影ID與MovieLens網(wǎng)站上使用的電影ID一致(例如,id 1 對應(yīng)于URL )。電影ID在 ratings.csv , tags.csv , movies.csv 和 links.csv 之間是一致的.
通過[pandas.read_csv]將各表轉(zhuǎn)化為pandas 的DataFrame對象
其中用到的參數(shù)為分隔符sep、頭文件header、列名定義names、解析器引擎engine
這里和書上相比多用了engine參數(shù),engine參數(shù)有C和Python,C引擎速度更快,而Python引擎目前功能更完整。
可用pandas.merge 將所有數(shù)據(jù)都合并到一個(gè)表中。merge有四種連接方式(默認(rèn)為inner),分別為
通過索引器查看第一行數(shù)據(jù),使用基于標(biāo)簽的索引.loc或基于位置的索引.iloc
可通過數(shù)據(jù)透視表( pivot_table )實(shí)現(xiàn)
該操作產(chǎn)生了另一個(gè)DataFrame,輸出內(nèi)容為rating列的數(shù)據(jù),行標(biāo)index為電影名稱,列標(biāo)為性別,aggfunc參數(shù)為函數(shù)或函數(shù)列表(默認(rèn)為numpy.mean),其中“columns”提供了一種額外的方法來分割數(shù)據(jù)。
by參數(shù)的作用是針對特定的列進(jìn)行排序(不能對行使用),ascending的作用是確定排序方式,默認(rèn)為升序
增加一列存放平均得分之差,并對其排序,得到分歧最大且女性觀眾更喜歡的電影
按照電影標(biāo)題將數(shù)據(jù)集分為不同的groups,并且用size( )函數(shù)得到每部電影的個(gè)數(shù)(即每部電影被評論的次數(shù)),按照從大到小排序,取最大的前20部電影列出如下
按照電影名稱分組,用agg函數(shù)通過一個(gè)字典{‘rating’: [np.size, np.mean]}來按照key即rating這一列聚合,查看每一部電影被評論過的次數(shù)和被打的平均分。取出至少被評論過100次的電影按照平均評分從大到小排序,取最大的10部電影。
DataFrame.agg( func , axis = 0 , * args , ** kwargs? )
func : 函數(shù),函數(shù)名稱,函數(shù)列表,字典{‘行名/列名’,‘函數(shù)名’}
使用指定軸上的一個(gè)或多個(gè)操作進(jìn)行聚合。
agg是一個(gè)聚合函數(shù),聚合函數(shù)操作始終是在軸(默認(rèn)是列軸,也可設(shè)置行軸)上執(zhí)行,不同于?numpy聚合函數(shù) (np.sum() //求和;np.prod() //所有元素相乘;np.mean() //平均值;np.std() //標(biāo)準(zhǔn)差;np.var() //方差;np.median() //中數(shù);np.power() //冪運(yùn)算;np.sqrt() //開方;np.min() //最小值;np.max() //最大值;np.argmin() //最小值的下標(biāo);np.argmax() //最大值的下標(biāo);np.inf //無窮大;np.exp(10) //以e為底的指數(shù);np.log(10) //對數(shù))
下面示例展示agg具體用法:
定義一個(gè)列表值:
在行上聚合這些函數(shù)
col1 ? ? ? col2 ? ? col3 ? ? ? col4
max? 1111.0? 2222.0? 3333.0? 4444.0
min? ? ? 1.0? ? 2.0? ? 3.0? ? 4.0
mean? 308.5? 617.0? 925.5? 1234.0
每列不同的聚合
col1????? col2 ? ? ? col3
max? ? NaN? 2222.0? ? NaN
min? ? 1.0? ? ?? 2.0? ?????? 3 .0
sum? 1234.0? ? NaN? 3702.0
注:當(dāng)某列沒有其他聚合函數(shù)時(shí),則用NaN填充。
好啦,就到這里了,謝謝
apply()
和applymap()是DataFrame數(shù)據(jù)類型的函數(shù),map()是Series數(shù)據(jù)類型的函數(shù)。
apply()的操作對象DataFrame的一列或者一行數(shù)據(jù),
applymap()是element-wise的,作用于每個(gè)DataFrame的每個(gè)數(shù)據(jù)。
map()也是element-wise的,對Series中的每個(gè)數(shù)據(jù)調(diào)用一次函數(shù)。
* apply works on a row / column basis of a DataFrame, applymap
works element-wise on a DataFrame, and map works element-wise on a
Series.
這是漫長的一周,本周完成了Python的進(jìn)階模塊,主要是pandas、numpy、matplotlib、seaborn、pyecharts這些模塊的學(xué)習(xí)以及一個(gè)實(shí)際的案例:商品銷售情況分析,之前一直覺得課程難度不夠,但到這一周難度就大大提高了。尤其是案例練習(xí)中的RFM模型和用戶生命周期建立,看懂不難但是自己寫一直出錯(cuò),在不斷出錯(cuò)不斷嘗試中知識得到了積累,另外可視化部分沒有什么練習(xí)題,希望后面可以加上一些這方面的練習(xí),接下來分模塊來總結(jié)一下學(xué)習(xí)的內(nèi)容。
重新設(shè)置索引:df.set_index()
Series格式轉(zhuǎn)換為DataFrame:df.to_frame()
文件讀取:pd.read_csv(filepath, header = 0,skiprows=[1,2])?
使用位置做索引:df.loc[0]????????使用列表做索引:df.loc[[0,1,2]]
使用切片做索引:df.loc[0:4]????????使用bool類型索引:df[df['年齡']30]
loc 是基于索引值的,切片是左閉右閉的
iloc 是基于位置的,切片是左閉右開的
修改列索引:df.rename(columns={'姓名':'name', '年齡':'age'},inplace=True)
替換一個(gè)值:df.replace({'name':{'小明':'xiaoming'}},inplace=True)
對數(shù)據(jù)進(jìn)行排序:df.sort_values('age')
累加求和:df.cumsum(0)
刪除列:del df['player']?????????刪除行:df.drop(labels=0)?labels 是行列的名字
數(shù)據(jù)拼接:pd.concat([left,right],axis=1)
# 指定列進(jìn)行關(guān)聯(lián),默認(rèn)是 inner join ????result = pd.merge(left,right,on='key')
#多個(gè)關(guān)聯(lián)條件:result = pd.merge(left, right, on=['key1', 'key2'])
#左連接:result = pd.merge(left, right, how='left', on=['key1', 'key2'])
# 列名不一樣的關(guān)聯(lián):pd.merge(left,right,left_on = ['key1','key2'],right_on = ['key3','key4'])
#單個(gè)分組:groups = df.groupby('district')
# 作用多個(gè)聚合函數(shù):groups.agg([np.mean,np.sum,np.std])
# 針對具體列聚合 groups.age.agg([np.mean,np.sum,np.std])
# 不同列不同聚合函數(shù) groups.agg({"age":np.mean,"novip_buy_times":np.sum})
分組后該列值求和顯示:groups['vip_buy_times'].transform('sum')
通常用于求占比:transform(lambda x: x /sum(x))
# 填充指定值:np.full([3,4],1)
# 起始為10,5為步長,30為結(jié)尾取不到:np.arange(10, 30, 5)
#隨機(jī)矩陣:np.random.random((2,3))
# 平均劃分:np.linspace( 0, 2*pi, 100 )
# 類型及轉(zhuǎn)換:vector.astype('float')
# 多維變一維:matrix.ravel()
# 矩陣的擴(kuò)展:a = np.arange(0, 40, 10)? ? b = np.tile(a, (3, 5))? ? # 行變成3倍,列變成5倍
# 水平拼接:np.hstack((a,b))? 豎直拼接:np.vstack((a,b))
# 豎直分割:np.hsplit(a,3)? ? #水平分割:np.vsplit(a,3)
8. Select the data in rows [3, 4, 8] and in columns ['animal', 'age'].
A:df.loc[df.index[[3,4,8]],['animal','age']]
行采用位置,列采用普通索引,這里利用index函數(shù)將位置變化為具體的普通索引,再利用loc函數(shù)
19. The 'priority' column contains the values 'yes' and 'no'. Replace this column with a column of boolean values: 'yes' should be True and 'no' should be False
A1:df['priority'].replace(['yes','no'],[True,False],inplace=True) 用replace函數(shù)替換
A2:df['priority'] = df['priority'].map({'yes': True, 'no': False}) 用map函數(shù)替換
最大最小值的索引:df.idxmax、df.idxmin
找出最大最小的前N個(gè)數(shù):nlargest()和nsmallest()?
將原表分組 并設(shè)置分段區(qū)間 pd.cut(df['A'], np.arange(0, 101, 10))
resample函數(shù) 日期重采樣:s.resample('M').mean()
TimeGrouper 重組:s.groupby(pd.TimeGrouper('4M')).idxmax()
split 分割函數(shù):temp = df['From_To'].str.split('_', expand=True) True為DataFrame
兩個(gè)DataFrame拼接用join:df = df.join(temp)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負(fù)號
%matplotlib inline 直接顯示
折線圖:plt.plot(x,y,color = 'r')
柱狀圖:plt.bar(x,y)? plt.barh(x,y) 多個(gè)bar x設(shè)置不同 堆積圖 bottom設(shè)置不同
散點(diǎn)圖:plt.scatter(x, y, c=colors, alpha=0.5, s = area)
直方圖:plt.hist(a,bins= 20) bin代表分隔的最小單位
plt.legend() 顯示圖例
for a,b in zip(X+W[i],data[i]):
plt.text(a,b,"%.0f"% b,ha="center",va= "bottom") 添加數(shù)據(jù)標(biāo)簽
plt.annotate('注釋文本',xy=(1, np.sin(1)),xytext=(2, 0.5), fontsize=16,arrowprops=dict(arrowstyle="-")) 添加注釋文本
plt.xlabel("Group") x軸標(biāo)題
plt.ylabel("Num") y軸標(biāo)題
fig, axes = plt.subplots(nrows=2, ncols=2,facecolor='darkslategray')? 繪制多個(gè)圖形
axes[0,0] axes[0,1] axes[1,0] axes[1,1]
pylab.rcParams['figure.figsize'] = (10, 6) # 調(diào)整圖片大小
動(dòng)態(tài)展示圖表
from pyecharts.charts import Bar
from pyecharts import options as opts
** pyecharts 繪圖的五個(gè)步驟:**
創(chuàng)建圖形對象:bar = Bar()
添加繪圖數(shù)據(jù):bar.add_xaxis(["襯衫", "毛衣", "領(lǐng)帶", "褲子", "風(fēng)衣", "高跟鞋", "襪子"])
? ? ???????????????? bar.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
? ? ? ? ? ? ? ? ? ? ?bar.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
配置系列參數(shù):對標(biāo)簽、線型等的一些設(shè)置
配置全局參數(shù):bar.set_global_opts(title_opts=opts.TitleOpts(title="銷售情況"))
渲染圖片:生成本地 HTML 文件 bar.render("mycharts.html")? bar.render()
notebook 渲染:bar.render_notebook()
bar = (Bar()
.add_xaxis(["襯衫", "毛衣", "領(lǐng)帶", "褲子", "風(fēng)衣", "高跟鞋", "襪子"])
.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
.set_global_opts(title_opts=opts.TitleOpts(title="某商場銷售情況"))
)
bar.render_notebook()
柱狀圖:Bar()
條形圖:bar.reversal_axis() #翻轉(zhuǎn)XY軸,將柱狀圖轉(zhuǎn)換為條形圖
折線圖:from pyecharts.charts import Line? line=Line()
餅圖:from pyecharts.charts import Page, Pie????Pie()?
轉(zhuǎn)換日期類型:df['order_dt']=pd. to_datetime (df.order_dt,format="%Y%m%d")
將日期轉(zhuǎn)換為月為單位:df['month']=df.order_dt.values. astype('datetime64[M]') 所有日期顯示為當(dāng)月第一天
去除日期單元值:order_diff/ np.timedelta64(1,'D')
過濾部分極值:grouped_user.sum() .query('order_products100') .order_amount
數(shù)據(jù)透視表:rfm=df.pivot_table( index ='user_id', values =['order_products','order_amount'], aggfunc ={'order_amount':'sum','order_products':'sum'})
map() 方法是pandas.series.map()方法, 對DF中的元素級別的操作, 可以對df的某列或某多列
applymap(func) 也是DF的屬性, 對整個(gè)DF所有元素應(yīng)用func操作
purchase_r=pivoted_counts.applymap(lambda x: 1 if x1 else np.NaN if x==0 else 0)
apply(func) 是DF的屬性, 對DF中的行數(shù)據(jù)或列數(shù)據(jù)應(yīng)用func操作,也可用于Series
apply(lambda x:x.cumsum()/x.sum())? ? 累計(jì)占比
apply(lambda x:x/x.sum(),axis=0)? ? ?每一列中每行數(shù)據(jù)占比
下周開始進(jìn)入數(shù)據(jù)分析思維的課程,很期待后面的課程以及項(xiàng)目,加油!
前言分組原理
核心:
1.不論分組鍵是數(shù)組、列表、字典、Series、函數(shù),只要其與待分組變量的軸長度一致都可以傳入groupby進(jìn)行分組。
2.默認(rèn)axis=0按行分組,可指定axis=1對列分組。
對數(shù)據(jù)進(jìn)行分組操作的過程可以概括為:split-apply-combine三步:
1.按照鍵值(key)或者分組變量將數(shù)據(jù)分組。
2.對于每組應(yīng)用我們的函數(shù),這一步非常靈活,可以是python自帶函數(shù),可以是我們自己編寫的函數(shù)。
3.將函數(shù)計(jì)算后的結(jié)果聚合。
1 分組模式及其對象
1.1 分組的一般模式
三個(gè)要素:分組依據(jù)、數(shù)據(jù)來源、操作及其返回結(jié)果
df.groupby(分組依據(jù))[數(shù)據(jù)來源].使用操作
1.2 分組依據(jù)的本質(zhì)
1.3Groupby 對象
通過 ngroups 屬性,可以訪問分為了多少組:
通過 groups 屬性,可以返回從 組名映射到 組索引列表的字典:
當(dāng) size 作為 DataFrame 的屬性時(shí),返回的是表長乘以表寬的大小,但在 groupby 對象上表示統(tǒng)計(jì)每個(gè)組的 元素個(gè)數(shù):
通過 get_group 方法可以直接獲取所在組對應(yīng)的行,此時(shí)必須知道組的具體名字:
1.4 分組的三大操作
分組的三大操作:聚合、變換和過濾
2.聚合函數(shù)
2.1內(nèi)置聚合函數(shù)
包括如下函數(shù): max/min/mean/median/count/all/any/idxmax/idxmin/mad/nunique/skew/quantile/sum/std/var/sem/size/prod
2.2agg 方法
【a】使用多個(gè)函數(shù)
當(dāng)使用多個(gè)聚合函數(shù)時(shí),需要用列表的形式把內(nèi)置聚合函數(shù)的對應(yīng)的字符串傳入,先前提到的所有字符串都是合法的。
【b】對特定的列使用特定的聚合函數(shù)
對于方法和列的特殊對應(yīng),可以通過構(gòu)造字典傳入 agg 中實(shí)現(xiàn),其中字典以列名為鍵,以聚合字符串或字符串列表為值。
【c】使用自定義函數(shù)
在 agg 中可以使用具體的自定義函數(shù),需要注意傳入函數(shù)的參數(shù)是之前數(shù)據(jù)源中的列,逐列進(jìn)行計(jì)算
【d】聚合結(jié)果重命名 如果想要對結(jié)果進(jìn)行重命名,只需要將上述函數(shù)的位置改寫成元組,元組的第一個(gè)元素為新的名字,第二個(gè)位置為原來的函數(shù),包括聚合字符串和自定義函數(shù)
3 變換和過濾
3.1 變換函數(shù)與 transform 方法
變 換 函 數(shù) 的 返 回 值 為 同 長 度 的 序 列, 最 常 用 的 內(nèi) 置 變 換 函 數(shù) 是 累 計(jì) 函 數(shù):cum- count/cumsum/cumprod/cummax/cummin ,它們的使用方式和聚合函數(shù)類似,只不過完成的是組內(nèi) 累計(jì)操作。
3.2 組索引與過濾
過濾在分組中是對于組的過濾,而索引是對于行的過濾
組過濾作為行過濾的推廣,指的是如果對一個(gè)組的全體所在行進(jìn)行統(tǒng)計(jì)的結(jié)果返回 True 則會(huì)被保留,F(xiàn)alse 則該組會(huì)被過濾,最后把所有未被過濾的組其對應(yīng)的所在行拼接起來作為 DataFrame 返回。
在 groupby 對象中,定義了 filter 方法進(jìn)行組的篩選,其中自定義函數(shù)的輸入?yún)?shù)為數(shù)據(jù)源構(gòu)成的 DataFrame 本身,在之前例子中定義的 groupby 對象中,傳入的就是 df[['Height', 'Weight']] ,因此所有表方法和屬性 都可以在自定義函數(shù)中相應(yīng)地使用,同時(shí)只需保證自定義函數(shù)的返回為布爾值即可。
4 跨列分組
4.1 apply 的引入
4.2 apply 的使用
在設(shè)計(jì)上,apply 的自定義函數(shù)傳入?yún)?shù)與 filter 完全一致,只不過后者只允許返回布爾值
【a】標(biāo)量情況:結(jié)果得到的是 Series ,索引與 agg 的結(jié)果一致
【b】Series 情況:得到的是 DataFrame ,行索引與標(biāo)量情況一致,列索引為 Series 的索引
【c】DataFrame 情況:得到的是 DataFrame ,行索引最內(nèi)層在每個(gè)組原先 agg 的結(jié)果索引上,再加一層返 回的 DataFrame 行索引,同時(shí)分組結(jié)果 DataFrame 的列索引和返回的 DataFrame 列索引一致