2016-05-07 2 views
0

numeric変数のヒストグラムをプロットして、その分布が歪んでいるかどうかを判断する必要があります。以下は、関数定義と呼ばれる関数です。変数ごとにヒストグラムを表示するのが難しい

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import sys 

def variable_type(df, nominal_level = 3): 
    categorical, numeric, nominal = [],[],[] 
    for variable in df.columns.values: 
     if np.issubdtype(np.array(df[variable]).dtype, int) or np.issubdtype(np.array(df[variable]).dtype, float): #if srray variable is of type int or float 
      if len(np.unique(np.array(df[variable]))) <= nominal_level: 
       nominal.append(variable) 
      else: 
       numeric.append(variable) 
     else: 
      categorical.append(variable) 
    return numeric,categorical,nominal 
def draw_histograms(df, variables, n_rows, n_cols): 
    fig = plt.figure() 
    import math 
    for i in range(min(n_rows * n_cols, len(variables))): 
     index = n_rows * 100 + n_cols * 10 + i + 1 
     ax = fig.add_subplot(index) 
     df[variables[i]].hist(bins = 20, ax = ax) 
     plt.title(variables[i]+' distribution') 
     #plt.xlabel(variables[i]) 
     #plt.ylabel('Count') 
    plt.show() 

def main(): 
    df = read_data() 
    col_names = df.columns.tolist() 
    numeric,categorical,nominal = variable_type(df) 
    util.draw_histograms(df, numeric, 3, 3) 
if __name__ == "__main__": 
    main() 

私のプログラムは、私は3を使用する場合、作品3 n_rowsn_colsのための呼び出し機能では、それが唯一の20個の変数の9をプロットしているため、これは問題です。私が他の数字を試してみると、私が選択したとn_colsに応じて、ValueError: num must be 1 <= num <= 18, not 0または他の範囲が得られます。 1つの図に20の数値変数をすべてサブプロットとしてプロットするにはどうすればよいですか?それを別の数字に壊すべきですか?これは自分のデータフレームのサンプルです。

TARGET_B  ID GiftCnt36 GiftCntAll GiftCntCard36 GiftCntCardAll \ 
0   0 14974   2   4    1    3 
1   0 6294   1   8    0    3 
2   1 46110   6   41    3    20 
3   1 185937   3   12    3    8 
4   0 29637   1   1    1    1 

    GiftAvgLast GiftAvg36 GiftAvgAll GiftAvgCard36  ...  \ 
0   17  13.50  9.25   17.00  ...   
1   20  20.00  15.88   NaN  ...   
2   6  5.17  3.73   5.00  ...   
3   10  8.67  8.50   8.67  ...   
4   20  20.00  20.00   20.00  ...   

    PromCntCardAll StatusCat96NK StatusCatStarAll DemCluster DemAge \ 
0    13    A     0   0  NaN 
1    24    A     0   23  67 
2    22    S     1   0  NaN 
3    16    E     1   0  NaN 
4    6    F     0   35  53 

    DemGender DemHomeOwner DemMedHomeValue DemPctVeterans DemMedIncome 
0   F    U    $0    0   $0 
1   F    U  $186,800    85   $0 
2   M    U   $87,600    36  $38,750 
3   M    U  $139,200    27  $38,942 
4   M    U  $168,100    37  $71,509 
+0

「util」?これはあなたが定義したものですか? – mwm314

+0

はい。 variable_typeはユーティリティクラスで定義されています。疑いを避けるために私の質問を編集させてください。 – squidvision

答えて

0

あなたの10番目の属性にはNaNがあります。あなたのコードでこれを処理できますか? 10番目の属性をプロットしますか?

+0

それは別の問題です.NaNをnp.Nanに置き換える必要があります。私はdf.replace( 'Nan'、np.NaN)を試しましたが、うまくいきませんでした。これらのNaN値をどのように置き換えることができますか? – squidvision

+0

これらはまだ 'np.NaN'であり、問​​題を引き起こす可能性があります。ですから、ヒストグラム#10 *をプロットすることはできますか? –

+0

いいえ、できません。これは私がプロットする必要がある変数です。 「GiftCnt36」、「GiftCntAll」、「GiftCntAll」、「GiftAvgLast」、「GiftAvg36」、「GiftAvgAll」、「GiftAvgCard36」、「GiftTimeLast」、「GiftTimeFirst」、「PromCnt12」、 'PromCntCll'、 'PromCntCard36'、 'PromCntCardAll'、 'DemCluster'、 'DemAge'、 'DemPctVeterans'] 'など、私は 'ID'から 'GiftAvgCard36'までしかプロットできません。これらの9つの変数は、Nan値にもかかわらずプロットします。 – squidvision

関連する問題