2016-04-27 66 views
0

我正在为日志转换编写一个辅助类函数。它需要:在Python中的日志转换和索引更改

  1. 将日志应用到每个列变量。
  2. 将此新生成的变量命名为“log_variable”。例如,对于变量'InqCnt06',我需要创建一个名为“log_InqCnt06”的新变量。
  3. 对df [variables]列中值为零或缺失的值执行log(variable_value +1),以避免返回“-inf”。
  4. 查找原始变量的索引。
  5. indexplus添加到原始变量的索引中,并将其作为“log_variable”的索引。

我该怎么做log(variable_value +1)缺失或零值?我发现使用isnull()的值,我能否以某种方式使用where.isnull()函数?

我也很难将原始变量索引添加到indexplus,并将其分配给log_variable的索引。

这里是我的代码:

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() 

这是我的DF的样本。

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更加注重工程。选择取决于你的目标和背景。 – IanS