在引言章節裡,介紹了MovieLens 1M資料集的處理範例。書中介紹該資料集來自GroupLens Research(),該地址會直接跳到,這裡面提供了來自MovieLens網站的各種評估資料集,可以下載相應的壓縮包,我們需要的MovieLens 1M資料集也在裡面。
下載解壓縮後的資料夾如下:
這三個dat表都會在範例中用到。我所讀的《Python For Data Analysis》中文版(PDF)是2014年第一版的,裡面所有範例都是基於Python 2.7和pandas 0.8.2所寫的,而我安裝的是Python 3.5.2與pandas 0.20.2,裡面的一些函數與方法會有較大的不同,有些是新版本中參數改變了,而有些是新版本裡棄用了某些舊版本的函數,這導致我運行按照書中範例程式碼時,會遇到一些Error和Warning。在測試MovieLens 1M資料集程式碼時,在和一樣我的設定環境下,會遇到以下幾個問題。
在將dat資料讀入pandas DataFrame物件時,書中給出程式碼為:
users = pd.read_table('ml-1m/users.dat', sep='::', header=None, names=unames) rnames = ['user_id', 'movie_id', 'rating', 'timestamp'] ratings = pd.read_table('ml-1m/ratings.dat', sep='::', header=None, names=rnames) mnames = ['movie_id', 'title', 'genres'] movies = pd.read_table('ml-1m/movies.dat', sep='::', header=None, names=mnames)
直接運行會出現Warning:
F:/python/HelloWorld/DataAnalysisByPython-1.py:4: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'. users = pd.read_table('ml-1m/users.dat', sep='::', header=None, names=unames) F:/python/HelloWorld/DataAnalysisByPython-1.py:7: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'. ratings = pd.read_table('ml-1m/ratings.dat', sep='::', header=None, names=rnames) F:/python/HelloWorld/DataAnalysisByPython-1.py:10: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'. movies = pd.read_table('ml-1m/movies.dat', sep='::', header=None, names=mnames)
#雖然也能運行,但是作為完美強迫症的我還是想要解決這個Warning 。這個警告是說因為'C'引擎不支持,只能退回到'Python'引擎,而剛好pandas.read_table方法裡有個engine參數,用來設定使用哪種解析引擎,有'C'和'Python'這兩個選項。既然'C'引擎不支持,我們只需把engine設為'Python'就可以了。
users = pd.read_table('ml-1m/users.dat', sep='::', header=None, names=unames, engine = 'python') rnames = ['user_id', 'movie_id', 'rating', 'timestamp'] ratings = pd.read_table('ml-1m/ratings.dat', sep='::', header=None, names=rnames, engine = 'python') mnames = ['movie_id', 'title', 'genres'] movies = pd.read_table('ml-1m/movies.dat', sep='::', header=None, names=mnames, engine = 'python')
#使用pivot_table方法來對聚合後的資料以性別計算每部電影的平均得分,書中給出的程式碼為:
mean_ratings = data.pivot_table('rating', rows='title', cols='gender', aggfunc='mean')
直接運作會報錯,這段程式碼無法運作:
Traceback (most recent call last): File "F:/python/HelloWorld/DataAnalysisByPython-1.py", line 19, in <module>mean_ratings = data.pivot_table('rating', rows='title', cols='gender', aggfunc='mean') TypeError: pivot_table() got an unexpected keyword argument 'rows'
TypeError說明這裡的'rows'參數並不是方法裡可用的關鍵字參數,這是這麼回事呢?去官網上查了一下pandas的API使用文件(),發現是因為0.20.2版的pandas.pivot_table裡關鍵字參數變了,為了實現同樣效果,只需把rows換成index就可以了,同時也沒有cols參數,要用columns來代替。
mean_ratings = data.pivot_table('rating', index='title', columns='gender', aggfunc='mean')
#為了了解女性觀眾最喜歡的電影,使用DataFrame的方法對F列進行降序排序,書中的範例程式碼為:
top_female_ratings = mean_ratings.sort_index(by='F', ascending=False)
這裡也只是給一個Warning,並不會幹擾程式進行:
F:/python/HelloWorld/DataAnalysisByPython-1.py:32: FutureWarning: by argument to sort_index is deprecated, pls use .sort_values(by=...) top_female_ratings = mean_ratings.sort_index(by='F', ascending=False)
這裡是說進行排序的sort_index方法在將來語言或函式庫中可能會改變,建議改為使用sort_values。在API使用文件中,pandas.DataFrame.sort_index的描述為“Sort object by labels (along an axis)”,而對pandas.DataFrame.sort_values的描述為“Sort by the values along either axis”,兩者能達到同樣效果,那我就直接替換成sort_values就可以了。在後面的「計算評分分歧」也會用到sort_index,也可以替換成sort_values。
top_female_ratings = mean_ratings.sort_values(by='F', ascending=False)
#最後一個錯誤還是和排序有關。在「計算評分分歧」中計算得分資料的標準差之後,根據篩選後的值對Series進行降序排序,書中的程式碼為:
##print(rating_std_by_title.order(ascending=False)[:10])
这里的错误是:
Traceback (most recent call last): File "F:/python/HelloWorld/DataAnalysisByPython-1.py", line 47, in <module>print(rating_std_by_title.order(ascending=False)[:10]) File "E:\Program Files\Python35\lib\site-packages\pandas\core\generic.py", line 2970, in __getattr__return object.__getattribute__(self, name) AttributeError: 'Series' object has no attribute 'order'
居然已经没有这个order的方法了,只好去API文档中找替代的方法用。有两个,sort_index和sort_values,这和DataFrame中的方法一样,为了保险起见,我选择使用sort_values:
print(rating_std_by_title.sort_values(ascending=False)[:10]
得到的结果和数据展示的结果一样,可以放心使用。
第三方库不同版本间的差异还是挺明显的,建议是使用最新的版本,在使用时配合官网网站上的API使用文档,轻松解决各类问题~
以上是Python For Data Analysis學習之路的詳細內容。更多資訊請關注PHP中文網其他相關文章!