美文网首页
解决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