美文网首页
解决Python输出图不显示中文/数据分组统计

解决Python输出图不显示中文/数据分组统计

作者: 这是沸羊羊的干爹 | 来源:发表于2018-07-23 10:32 被阅读0次

Python分析建模,日常问题整理(一)


2018.07.23~2018.07.09


  1. 当数据类型是categories时,应该增加的是一类(一个水平),
df['b'] = df['b'].cat.add_categories(['k'])
## 对b列增加类为K的水平。

  1. Python 3.6不显示中文,需要增加以下几行代码
    import matplotlib
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    matplotlib.rcParams['font.family']='sans-serif'
    #解决负号'-'显示为方块的问题
    matplotlib.rcParams['axes.unicode_minus'] = False

  1. xgboost是黑箱,没有可解释的具体coef,只有变量重要性可提供参考。不能转化变量的分数,不能用于评分卡模型。

  1. sklearn.LogisticRegression 与 import statsmodels.api as sm的算法有不同(待补充)

  1. sklearn.LogistcRegression 的正则化项C,是权重的L1或者L2范数乘以一个λ,用来控制损失函数和正则化项的比重。防止训练出来的模型过分的依赖某一个特征,当最小化损失函数的时候,某一维度很大,拟合出来的函数值与真实的值之间的差距很小,通过正则化可以使整体的cost变大,避免过分依赖某一维度的结果。
sklogit = LogisticRegression(penalty='l2',
 C=1e5,solver='lbfgs', multi_class='ovr')

C越大,加大惩罚项的作用,一般在变量较多,高度相关的时候要加入L1,L2并调整lambda。否则直接使用会使得效果特别差。


  1. 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)  
 }
}

  1. 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问题解决
(不知道理解的对不对=_=)


  1. 判断字符串是否是数字(整数)
num = "1" 
num.isdigit()   
num.isdecimal() 
num.isnumeric() 

判断字符串是否可转化为小数

try:
    tem = float(str(x))
except ValueError:
    print('不能转化为浮点型')

  1. sm.logit 出现singular matrix 奇异矩阵(无唯一解的情况)怎么处理呢?

  1. @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

  1. 数据分组统计(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

相关文章

网友评论

      本文标题:解决Python输出图不显示中文/数据分组统计

      本文链接:https://www.haomeiwen.com/subject/tupdmftx.html