Maison  >  Article  >  développement back-end  >  Parcours d'apprentissage Python pour l'analyse de données

Parcours d'apprentissage Python pour l'analyse de données

巴扎黑
巴扎黑original
2017-06-23 16:25:521957parcourir

Dans le chapitre d'introduction, un exemple de traitement de l'ensemble de données MovieLens 1M est présenté. Le livre introduit que l'ensemble de données provient de GroupLens Research (), à laquelle cette adresse accédera directement, qui fournit divers ensembles de données d'évaluation à partir du site Web MovieLens. Vous pouvez télécharger le package compressé correspondant dont nous avons besoin est également là. . dans.

Le dossier téléchargé et décompressé est le suivant :

Ces trois tables de données seront utilisées dans l'exemple. La version chinoise (PDF) de "Python For Data Analysis" que j'ai lue est la première édition en 2014. Tous les exemples qu'il contient sont écrits sur la base de Python 2.7 et pandas 0.8.2, et j'ai installé Python 3.5.2 et pandas 0.8. 2. pandas 0.20.2, certaines fonctions et méthodes seront assez différentes. Certaines d'entre elles sont des paramètres modifiés dans la nouvelle version, et d'autres sont obsolètes dans la nouvelle version. Cela m'a amené à exécuter selon le livre When sample code. , vous rencontrerez des erreurs et des avertissements. Lors du test du code de l'ensemble de données MovieLens 1M, dans le même environnement de configuration que le mien, je rencontrerai les problèmes suivants.

  • Lors de la lecture de données dans un objet Pandas DataFrame, le code donné dans le livre est :

    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)

    Lors de l'exécution directe, un avertissement apparaîtra :

    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)

    Bien qu'il puisse également être exécuté, comme un parfait obsessionnel-compulsif désordre, je veux toujours résoudre cet avertissement. Cet avertissement signifie que, comme le moteur « C » ne le prend pas en charge, il ne peut recourir qu'au moteur « Python », et il se trouve qu'il y a un paramètre de moteur dans la méthode pandas.read_table, qui est utilisé pour définir quel moteur d'analyse à utiliser, y compris « C » et « Python » Ces deux options. Puisque le moteur « C » ne le prend pas en charge, il suffit de définir le moteur sur « 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')

  • Utilisez la méthode du tableau croisé dynamique pour calculer la moyenne de chaque film par genre sur les données agrégées Score, le code donné dans le livre est :

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

    Si vous l'exécutez directement, une erreur sera signalée. Ce code ne peut pas être exécuté : <.>

    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 indique que le paramètre 'rows' ici n'est pas un paramètre de mot-clé disponible dans la méthode. J'ai vérifié la documentation d'utilisation de l'API pandas sur le site officiel () et j'ai découvert que c'était parce que les paramètres des mots-clés dans pandas.pivot_table avaient changé dans la version 0.20.2. Afin d'obtenir le même effet, remplacez simplement les lignes par index. et il n'y a pas de paramètre cols, utilisez donc plutôt des colonnes.

    mean_ratings = data.pivot_table('rating', index='title', columns='gender', aggfunc='mean')

  • Afin de comprendre les films préférés du public féminin, utilisez la méthode DataFrame pour réaliser colonne F Tri par ordre décroissant, l'exemple de code dans le livre est :
  • top_female_ratings = mean_ratings.sort_index(by='F', ascending=False)
    Cela donne uniquement un avertissement et n'interférera pas avec le programme :

    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)
    Ici, il est dit que la méthode de tri sort_index peut changer dans la langue ou la bibliothèque à l'avenir, et il est recommandé d'utiliser sort_values ​​​​​​plutôt. Dans la documentation d'utilisation de l'API, la description de pandas.DataFrame.sort_index est "Trier les objets par étiquettes (le long d'un axe)", tandis que la description de pandas.DataFrame.sort_values ​​​​​​est "Trier par les valeurs le long de chaque axe" . Les deux peuvent Pour obtenir le même effet, je vais simplement le remplacer par sort_values. Sort_index sera également utilisé dans le "
    Calculer la différence de score

    " suivant, et peut également être remplacé par sort_values.

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

  • La dernière erreur est toujours liée au tri. Après avoir calculé l'écart type des données de score dans "
  • Calculer la divergence du score

    ", triez les séries par ordre décroissant en fonction de la valeur filtrée. Le code dans le livre est : .

    这里的错误是:

    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使用文档,轻松解决各类问题~

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn