首頁 >後端開發 >Python教學 >Python For Data Analysis學習之路

Python For Data Analysis學習之路

巴扎黑
巴扎黑原創
2017-06-23 16:25:521978瀏覽

在引言章節裡,介紹了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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn