Python分析建模,日常问题整理(一)
2018.07.23~2018.07.09
- 当数据类型是categories时,应该增加的是一类(一个水平),
df['b'] = df['b'].cat.add_categories(['k'])
## 对b列增加类为K的水平。
- Python 3.6不显示中文,需要增加以下几行代码
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
#解决负号'-'显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False
- xgboost是黑箱,没有可解释的具体coef,只有变量重要性可提供参考。不能转化变量的分数,不能用于评分卡模型。
- sklearn.LogisticRegression 与 import statsmodels.api as sm的算法有不同(待补充)
- sklearn.LogistcRegression 的正则化项C,是权重的L1或者L2范数乘以一个λ,用来控制损失函数和正则化项的比重。防止训练出来的模型过分的依赖某一个特征,当最小化损失函数的时候,某一维度很大,拟合出来的函数值与真实的值之间的差距很小,通过正则化可以使整体的cost变大,避免过分依赖某一维度的结果。
sklogit = LogisticRegression(penalty='l2',
C=1e5,solver='lbfgs', multi_class='ovr')
C越大,加大惩罚项的作用,一般在变量较多,高度相关的时候要加入L1,L2并调整lambda。否则直接使用会使得效果特别差。
- R语言循环计算最优分箱+错误跳过代码:
for(i in names(data)) {
print(i)
if("出现错误" %in% tryCatch(smbinning(df = data[data[,i]!=-99999,],y='y',x=i,p=0.1),
error=function(e){print("出现错误")} )) next
if("try-error" %in% class(try(smbinning(df = data[data[,i]!=-99999,],y='y',x=i,p=0.1)$ivtable,silent = TRUE))){
print('try-error')
result = smbinning(df = data[(data[,i]!=-99999)&(data[,i]!=0),],y='y',x=i,p=0.1)
x.inv = try(result$ivtable,silent = TRUE)
if("try-error" %in% class(x.inv)) next
print(result$cuts)
}else{
result = smbinning(df = data[(data[,i]!=-99999),],y='y',x=i,p=0.1)
x.inv = try(result$ivtable,silent = TRUE)
if("try-error" %in% class(x.inv)) next
# print(result$ivtable)
print(result$cuts)
}
}
- SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame的warning如何解决。
意思是:如果你对原始数据新定义了一个数据名称,对这个新定义的数据名称进行数据处理(map/apply之类的)将会影响到你的原始数据。
eg:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0, 5, (10, 3)), columns=list('abc'))
cp = df[df.a > 0]
cp.loc[:, 'c'] = cp.groupby('a').b.transform('sum')
## 原始的df就已经改变了
↓
stackoverflow问题解决
(不知道理解的对不对=_=)
- 判断字符串是否是数字(整数)
num = "1"
num.isdigit()
num.isdecimal()
num.isnumeric()
判断字符串是否可转化为小数
try:
tem = float(str(x))
except ValueError:
print('不能转化为浮点型')
- sm.logit 出现singular matrix 奇异矩阵(无唯一解的情况)怎么处理呢?
- @staticmethod,这个装饰器很好理解,就是让类中的方法变成一个普通的函数(因为是普通函数,并没有绑定在任何一个特定的类或者实例上。所以与不需要对象实例化就可以直接调用)。可以使用类或者类的实例调用,并且没有任何隐含参数的传入,所以不需要self(参数名是随便定的)。
class C(object):
@staticmethod
def add(a,b):
return a+b
def get_weight(self):
return self.add(1,2)
C.add
C().add
C.get_weight
- 数据分组统计(groupby和pivot_table)
使用数据透视表求多个变量的总和、最大值、最小值、均值、方差
df = pd.DataFrame({'key1':['a','a','b','b','a'],
'key2':['one','two','one','two','one'],
'data1':np.random.randn(5),'data2':np.random.randn(5)})
>--
data1 data2 key1 key2
0 0.234002 0.543056 a one
1 0.192700 -1.729537 a two
2 -0.678138 -0.177472 b one
3 -0.103935 -0.051124 b two
4 -2.318317 0.532077 a one
group1 = df.groupby('key1') #对key1为基准进行分组
[x for x in group1] # 查看分组细项
group1['data1','data2'].agg(['mean','sum','max','min','std']) #计算以key1为基准各变量下的统计量
QQ截图20180729194251.png
pd.pivot_table(df,index=["key1"],values=['var1','var2'],
aggfunc=[np.sum,np.max,np.min,np.mean,np.std])
data.pivot_table(columns='var1',index='var2',
aggfunc=[len,min],values='var3')
QQ截图20180729194251.png
[level2+'_'+level1 for level1,level2 in zip(tem1.columns.get_level_values(1),tem1.columns.get_level_values(0))]
df.columns = [' '.join(col).strip() for col in df.columns.values]
# ↑为变量命名,对pivot_table 和groupby都适用。
groupby.agg与groupby.apply的区别,apply是对分类后的group(df数据类型)进行函数处理,lambda里面可以是任何两个变量的函数。但是只能输出某个函数的结果,不能输出一系列的结果。
group1.apply(lambda df:df['data1'].sum())
def max_min(group):
return group.max()-group.min()
def Skew(group):
return group.skew(axis=0)
def Kurt(group):
return group.kurt(axis=0)
def count1(group):
return (group=='1').sum()
dat1 = group1.agg({'apply_dt':'max','OVER_DAYS':['count','mean','sum','max','min',Skew,Kurt,max_min],'ACC_DAYS':'max','OVER_DAYS_TAR':[count1]})
agg是对group后的数据变量进行函数运算。agg里面可以是字典形式的,指定对不同的变量使用不同的函数运算,还可以进行自定义哦。(做变量衍生的时候非常方便)
可以看到,pivot_table 和groupby的不同之处之一是,columns的level顺序不同。据说groupby比pivot_table 效率更高一些。
## 看数据是否为空值nan
np.isnan(df1.ix[0,3])
##
import datetime
t1 = datetime.datetime.strptime('2012-03-05 17:41:20', '%Y-%m-%d %H:%M:%S')
t2 = datetime.datetime.strptime('2013-03-05 17:41:20', '%Y-%m-%d %H:%M:%S')
(t2-t1).days
网友评论