2016-04-27 11 views
0

私はログ変換のためのヘルパークラス関数を書いています。Pythonでのログ変換とインデックスの変更

  1. 各列の変数にログを適用します。
  2. この新しく生成された変数「log_variable」に名前を付けます。たとえば、変数 'InqCnt06'では、 "log_InqCnt06"という新しい変数を作成する必要があります。
  3. "-inf"が返されないように、ゼロまたは不足しているdf [variables]列の値をlog(variable_value +1)します。
  4. 元の変数のインデックスを検索します。
  5. 元の変数のインデックスにindexplusを追加し、これを "log_variable"のインデックスにします。

紛失またはゼロ値はどうすればいいですか?log(variable_value +1)isnull()を使用して値を見つけましたが、何とかwhere.isnull()関数を使用できますか?

元の可変インデックスをindexplusに追加し、それをlog_variableのインデックスに割り当てることも難しいです。これは私のDFのサンプルです

def add_log_transform(df, variable, indexplus = 1): 
     print df[variable].isnull() 
     log_variable = (np.log(df[variable])) 
def main(): 
    variables_needs_tranform = ['DerogCnt', 'CollectCnt', 'InqCnt06', 'InqTimeLast', 'InqFinanceCnt24', 'TLTimeFirst', 'TLTimeLast', 'TLCnt03', 'TLCnt12', 'TLCnt24', 'TLCnt', 'TLSum', 'TLMaxSum', 'TLDel60Cnt', 'TLBadCnt24', 'TL75UtilCnt', 'TL50UtilCnt', 'TLBalHCPct', 'TLSatPct', 'TLDel3060Cnt24', 'TLDel90Cnt24', 'TLDel60CntAll', 'TLBadDerogCnt', 'TLDel60Cnt24', 'TLOpen24Pct'] 
util.add_log_transform(df, variables_needs_tranform, indexplus = 1) 

if __name__ == "__main__": 
     main() 

は、ここに私のコードです。

DerogCnt CollectCnt InqCnt06 InqTimeLast InqFinanceCnt24 TLTimeFirst \ 
0   1   1   7   1    4   125 
1   1   1   2   1    0   252 
2   0   0   1   1    4   254 
3   0   0   6   3    6   154 
4   0   0   1   0    1   311 
5   1   1   1   1    2   200 
6   2   0   3   1    2   137 
7   0   0   3   2    1   267 
8   0   0   0   16    3   359 
9   1   1   1   6    3   141 
10   0   0   1   4    1   487 
11   0   0   4   1    4   78 
12   3   3   4   0    5   117 
13   2   2   1   0    4   101 
14   1   1   2   1    8   260 
15   0   0   5   1    6   295 
16   0   0   0   NaN    0   223 
17  15   9   3   1    3   14 
18   0   0   3   2    7   345 
19   0   0   4   4    5   145 
20   0   0   3   1    3   222 
21   0   0   1   5    1   354 
22   8   8   0   8    2   111 
23   0   0   1   1    3   56 
24   8   5   6   1    10   16 

TLTimeLast TLCnt03 TLCnt12 TLCnt24  ...  TL75UtilCnt \ 

0   3  1  3  5  ...     3 
1   18  0  0  2  ...     1 
2   12  0  1  2  ...     3 
3   3  1  9  11  ...     4 
4   17  0  0  1  ...     2 
5   7  0  1  2  ...     1 
6   12  0  1  2  ...     2 
7   2  3  6  8  ...     1 
8   23  0  0  1  ...     0 
9   8  0  1  4  ...     7 
10   12  0  1  6  ...     9 
11   4  0  7  10  ...     1 
12   27  0  0  0  ...     3 
13   12  0  1  1  ...     3 
14   16  0  0  2  ...     2 
15   8  0  4  11  ...     9 
16   18  0  0  1  ...     2 
17   14  0  0  1  ...     1 
18   2  2  2  4  ...     3 
19   3  1  2  2  ...     2 
20   22  0  0  1  ...     1 
21   7  0  2  10  ...     4 
22   24  0  0  1  ...     0 
23   40  0  0  0  ...     0 
24   4  0  2  4  ...     2 

TL50UtilCnt TLBalHCPct TLSatPct TLDel3060Cnt24 TLDel90Cnt24 \ 
0    4  0.85  0.67    0    0 
1    2  0.48  0.30    0    1 
2    3  0.84  0.67    0    1 
3    5  0.73  0.76    0    1 
4    3  0.88  0.63    0    0 
5    1  0.13  0.25    1    1 
6    2  0.70  0.64    0    0 
7    1  0.47  0.42    0    1 
8    2  0.41  0.69    0    0 
9    7  0.84  0.67    0    0 
10   10  0.77  0.82    0    0 
11   2  0.79  0.74    0    0 
12   3  0.92  0.21    2    3 
13   4  0.90  0.22    3    0 
14   3  0.80  0.35    0    1 
15   12  0.47  0.73    0    0 
16   4  0.89  0.57    3    0 
17   1  0.80  0.00    0    0 
18   3  0.86  0.52    0    0 
19   3  0.59  0.41    0    2 
20   2  0.25  0.62    2    0 
21   5  0.36  0.65    0    1 
22   0  0.38  0.40    0    0 
23   0  0.28  0.20    3    1 
24   3  0.91  0.25    1    1 

TLDel60CntAll TLBadDerogCnt TLDel60Cnt24 TLOpen24Pct 

0    1    0    0   0.71 
1    4    2    1   0.50 
2    1    1    1   0.33 
3    1    1    1   1.22 
4    1    0    0   0.20 
5    3    1    1   0.67 
6    0    2    0   0.40 
7    2    1    1   2.00 
8    2    0    0   0.17 
9    0    1    0   0.44 
10    0    0    0   0.46 
11    0    0    0   1.67 
12    7    4    4   0.00 
13    4    1    2   0.17 
14    1    1    1   0.67 
15    0    0    0   0.28 
16    5    0    2   0.17 
17    0    12    0   1.00 
18    0    0    0   0.67 
19    7    2    2   0.25 
20    3    0    1   0.10 
21    1    1    1   0.53 
22    0    4    0   0.50 
23    4    1    3   0.00 
24    1    7    1   1.33 
+0

あなたのポイント#3は悪いアイデアのように聞こえるので、私はそれを私の答えから省いた。 – IanS

+0

私は理解していません。5. indexplusとはどういう意味ですか? また、最終結果はどうなりますか?ログ列を持つ新しいデータフレーム、または同じデータフレーム内に入れたいですか? – Shovalt

+0

@Shovalt良い点。 @squidvision元のデータフレームにログの列が必要な場合は、私の答え(おそらく 'concat')に' df'と 'df_log'をマージしてください。 – IanS

答えて

2

私はあなたの質問の簡易版答えてみましょう:あなたは欠損値のために特別な処理をしたい場合は、あなたが行うことができます

# example dataframe 
df = pd.DataFrame({'a': [0, 1, 2, 3], 
        'b': [4, 5, np.nan, 7], 
        'c': [8, 9, 10, 11]}) 

# apply log(x+1) element-wise to a subset of columns 
to_log = ['a', 'b'] 
df_log = df[to_log].applymap(lambda x: np.log(x+1)) 

# rename columns 
df_log.columns = 'log_' + df_log.columns 

# shift the index 
df_log.index = df_log.index + 1 

を:

df_log[df_log.isnull()] = -1 

あなたは今、すべて置くことができますこれをヘルパー関数で表します。

+0

良かった@IanS。私は疑問を持っています。ログ変換を行うには、np.log alwaysまたはnp.log10も使用する必要がありますか?私たちはどちらを使うべきなのか? – JKC

+1

@JKCあなたの質問はかなり一般的です。私は、log10はよりエンジニアリング指向である一方、logはより多くの数学指向であると言います。選択はあなたの目標と文脈によって異なります。 – IanS

関連する問題