データ科学パッケージ-Day 2-pandas(二)

54838 ワード

文書ディレクトリ
  • 映画データ分析
  • データ読み出し
  • データ統合
  • コアデータ構造
  • Series
  • ndarayから作成
  • 辞書から作成
  • スカラーから作成
  • Seriesはクラスndarrayオブジェクト
  • です.
  • Seriesはクラス辞書オブジェクト
  • です.
  • ラベル整列動作
  • nameプロパティ
  • DataFrame
  • 辞書から作成
  • 構造化データから
  • を作成する.
  • ディクショナリリストから作成
  • タプル辞書から作成
  • Seriesから作成
  • 列選択/追加/削除
  • assign()メソッドを使用して、新しい列
  • を挿入する
  • インデックスおよび選択
  • データ整列
  • numpy関数
  • を使用
  • Panel

  • 映画データ解析
    Pandasによる映画採点データの分析
  • データ読み出し
  • データ統合
  • 統計映画平均得点
  • アクティブ映画を集計->採点された回数が多いほど、映画がアクティブになる
  • 女子が一番好きな映画ランキング
  • 男子が一番好きな映画ランキング
  • 男女の採点差が最も大きい映画->ある映画の女子学生は好きだが、男子学生は
  • が好きではない.
  • 最も論争のある映画ランキング->採点の分散最大
  • %matplotlib inline
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    

    データ読み込み
    user_names = ['user_id', 'gender', 'age', 'occupation', 'zip']
    users = pd.read_table('ml-1m/users.dat', sep='::', header=None, names=user_names, engine='python')
    
    rating_names = ['user_id', 'movie_id', 'rating', 'timestamp']
    ratings = pd.read_table('ml-1m/ratings.dat', sep='::', header=None, names=rating_names, engine='python')
    
    movie_names = ['movie_id', 'title', 'genres']
    movies = pd.read_table('ml-1m/movies.dat', sep='::', header=None, names=movie_names, engine='python')
    
    print len(users)
    users.head(5)
    print len(ratings)
    ratings.head(5)
    print len(movies)
    movies.head(5)
    

    データの結合
    data = pd.merge(pd.merge(users, ratings), movies)
    len(data)
    data.head(5)
    data[data.user_id == 1]
    #               
    mean_ratings_gender = data.pivot_table(values='rating', index='title', columns='gender', aggfunc='mean')
    mean_ratings_gender.head(5)
    #             ->    /    
    mean_ratings_gender['diff'] = mean_ratings_gender.F - mean_ratings_gender.M
    mean_ratings_gender.head(5)
    mean_ratings_gender.sort_values(by='diff', ascending=True).head(10)
    #        
    ratings_by_movie_title = data.groupby('title').size()
    ratings_by_movie_title.head(5)
    #         ->            
    top_ratings = ratings_by_movie_title[ratings_by_movie_title > 1000]
    top_10_ratings = top_ratings.sort_values(ascending=False).head(10)
    top_10_ratings
    #          ->          
    mean_ratings = data.pivot_table(values='rating', index='title', aggfunc='mean')
    top_20_mean_ratings = mean_ratings.sort_values(ascending=False).head(20)
    top_20_mean_ratings
    #              ->          ,    
    mean_ratings[top_10_ratings.index]
    #               ->              ,              ,     
    ratings_by_movie_title[top_20_mean_ratings.index]
    #       ->       1000      
    top_10_movies = mean_ratings[top_ratings.index].sort_values(ascending=False).head(10)
    top_10_movies
    #             
    df_top_10_movies = pd.DataFrame(top_10_movies)
    df_top_10_movies['hot'] = top_ratings[top_10_movies.index]
    df_top_10_movies
    

    コアデータ構造
    import pandas as pd
    import numpy as np
    

    Series
    Seriesは1次元ラベル付き配列で,配列に任意のデータ(整数,浮動小数点数,文字列,Python Object)を入れることができる.基本的な作成関数は次のとおりです.
    s=pd.Series(data,index=index)では、indexはデータのラベルとして使用されるリストです.dataは、異なるデータ型であってもよい.
  • Python辞書
  • ndarrayオブジェクト
  • スカラー値、例えば5
  • ndarayから作成
    s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
    s
    s.index
    s = pd.Series(np.random.randn(5))
    s
    s.index
    

    辞書から作成
    #        
    d = {'a' : 0., 'b' : 1., 'd' : 3}
    s = pd.Series(d, index=list('abcd'))
    s
    

    スカラーから作成
    pd.Series(3, index=list('abcde'))
    print "Missing required dependencies {values}".format(values = ['aaa', 'bbb'])
    

    Seriesはクラスndarrayオブジェクトです
    s = pd.Series(np.random.randn(5))
    s
    s[:3]
    np.exp(s)
    np.sin(s)
    

    Seriesはクラス辞書オブジェクトです
    s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
    s
    s['a']
    s['e'] = 5
    s['g'] = 100
    print s.get('f', np.nan)
    

    ラベルの整列
    s1 = pd.Series(np.random.randn(3), index=['a', 'c', 'e'])
    s2 = pd.Series(np.random.randn(3), index=['a', 'd', 'e'])
    print '{0}

    {1}'
    .format(s1, s2) s1 + s2

    nameプロパティ
    s = pd.Series(np.random.randn(5), name='Some Thing')
    s
    s.name
    

    DataFrame
    DataFrameは、2 D行ラベルと列ラベルの配列です.DataFrameをExcelテーブルやSQLデータベースのテーブルにしたり、Seriesオブジェクト辞書にしたりすることができます.Pandasで最もよく使われるデータ構造です.
    DataFrameを作成する基本形式は次のとおりです.
    df=pd.DataFrame(data,index=index,columns=columns)indexは行ラベル、columnsは列ラベル、dataは次のデータです.
  • 一次元numpy配列,list,Seriesからなる辞書
  • 二次元numpy配列
  • Series
  • 別のDataFrameオブジェクト
  • 辞書から作成
    d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
         'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
    pd.DataFrame(d)
    pd.DataFrame(d, index=['d', 'b', 'a'])
    pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three'])
    d = {'one' : [1, 2, 3, 4],
         'two' : [21, 22, 23, 24]})
    pd.DataFrame(d, index=['a', 'b', 'c', 'd'])
    

    構造化データから作成
    data = [(1, 2.2, 'Hello'), (2, 3., "World")]
    pd.DataFrame(data)
    pd.DataFrame(data, index=['first', 'second'], columns=['A', 'B', 'C'])
    

    辞書リストから作成
    data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
    pd.DataFrame(data)
    pd.DataFrame(data, index=['first', 'second'])
    pd.DataFrame(data, columns=['a', 'b'])
    

    タプル辞書から作成
    d = {('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2},
         ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4},
         ('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6},
         ('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8},
         ('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}}
    #     
    pd.DataFrame(d)
    

    Seriesから作成
    s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
    pd.DataFrame(s)
    pd.DataFrame(s, index=['a', 'c', 'd'])
    pd.DataFrame(s, index=['a', 'c', 'd'], columns=['A'])
    

    列の選択/追加/削除
    df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three', 'four'])
    df
    df['one']
    df['three'] = df['one'] + df['two']
    df
    df['flag'] = df['one'] > 0
    df
    del df['three']
    df
    four = df.pop('four')
    four
    df['five'] = 5
    df
    #       
    df.insert(1, 'bar', df['one'])
    df
    

    assign()メソッドを使用して新しいカラムを挿入
    df = pd.DataFrame(np.random.randint(1, 5, (6, 4)), columns=list('ABCD'))
    df
    df.assign(Ratio = df['A'] / df['B'])
    df.assign(AB_Ratio = lambda x: x.A / x.B, CD_Ratio = lambda x: x.C - x.D)
    df.assign(AB_Ratio = lambda x: x.A / x.B).assign(ABD_Ratio = lambda x: x.AB_Ratio * x.D)
    
    

    索引と選択
    対応するアクション、構文、および結果の戻し
    列を選択->df[col]->Series行ラベルから行を選択->df.loc[label]->Series行位置から行を選択->df.iloc[label]->Series行を選択->df[5:10]->DataFrameブールベクトルから複数行を選択->df[bool_vector]->DataFrame
    df = pd.DataFrame(np.random.randint(1, 10, (6, 4)), index=list('abcdef'), columns=list('ABCD'))
    df
    df['A']
    df.loc['a']
    df.iloc[0]
    df[1:4]
    df[[False, True, True, False, True, False]]
    

    データの配置
    df1 = pd.DataFrame(np.random.randn(10, 4), index=list('abcdefghij'), columns=['A', 'B', 'C', 'D'])
    df1
    df2 = pd.DataFrame(np.random.randn(7, 3), index=list('cdefghi'), columns=['A', 'B', 'C'])
    df2
    df1 + df2
    df1 - df1.iloc[0]
    

    numpy関数の使用
    df = pd.DataFrame(np.random.randn(10, 4), columns=['one', 'two', 'three', 'four'])
    df
    np.exp(df)
    np.asarray(df) == df.values
    type(np.asarray(df))
    np.asarray(df) == df
    # TAB       
    df.one
    

    Panel
    Panelは3 Dラベル付き配列です.実際,Pandasの名称の由来はPanelによって進化したもの,すなわちpan(el)−da(ta)−sである.Panelは比較的少ないが、依然として最も重要な基礎データ構造の一つである.
    items:座標軸0、インデックス対応要素はDataFrame major_axis:座標軸1,DataFrameの行ラベルminor_axis:座標軸2,DataFrameの列ラベル
    data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
            'Item2' : pd.DataFrame(np.random.randn(4, 2))}
    pn = pd.Panel(data)
    pn
    pn['Item1']
    pn.items
    #     
    pn.major_xs(pn.major_axis[0])
    #     
    pn.minor_xs(pn.major_axis[1])
    pn.to_frame()