写函数思路

1.dict的反转

#主要思路,不写表达式,在表达式直接放在return 
def reverse_dict(d):
    '''
    就是字典的反转,key,value互换,但是注意value不能有重复值
    '''
    return {value:key for key,value in d.items()}

 

2.两个集合的笛卡尔积组合

#要记住的是两个for 其实就是一个笛卡尔积,相当于 for i in a ,缩一层循环,for  j in b ,这个平时很常见,但是有时理解不了
def dical_set(set1, set2, return_type='string'):
    '''
    做两个集合的笛卡尔积,做组合时,输出全排列组合
    set1, set2, :任意可迭代对象
    return_type:str ,'string' 表示把2个元素合并成一个字符串,
    以'list' 表示把2个元素放在一个list中
    '''
    dical = [[i,j] for i in set1 for j in set2]
    if return_type == 'string':
        dical = [item[0] + "_" + item[1] for item in dical]
    return dical
    
dical_set([1,3,4], [7,8,9], return_type='list')
#[[1, 7], [1, 8], [1, 9], [3, 7], [3, 8], [3, 9], [4, 7], [4, 8], [4, 9]]

 

3.展平嵌套列表结构

#去除嵌套的时候,使用的函数的递归,我们需要留意一下什么时候使用递归
def flatten(x):
    '''
    x元素中含有list,我们需要去掉这[]
    '''
    out = []
    for i in x:
        if isinstance(i, (list, tuple)):
            out.extend(flatten(i))
        else:
            out.append(i)
    return out
flatten([1,2,3,[1,2,3]])  #[1, 2, 3, 1, 2, 3]
flatten([1,2,'3',['1','2','3']]) #[1, 2, 3, 1, 2, 3]

 

4.时间格式的转化

#要注意各类日期表达的方法,以及时间的计算
def date2str(date_obj, sep='-'):
    '''
    把datetime.date对象转换成日期字符串, 转换的格式由 sep 参数决定
    date_obj: datetime.date or datetime.datetime 对象
    参数的日期只有一个值
    '''
    assert sep in ('-','/',''), '仅支持sep 在('-', '/', '')中取值'
    str_f = '%Y{0}%m{0}%d'.format(sep)
    date_str = date_obj.strftime(str_f) if pd.notnull(date_obj) else 'NaT'
    return date_str
import datetime as dt
a=dt.datetime.now()
a  #datetime.datetime(2020, 12, 9, 20, 33, 55, 920105)
date2str(a)  #'2020-12-09'

如果要对某一列日期进行这样的处理,可以使用map函数结合使用,或者是apply使用

 

5.日期格式的转化

#要注意split和list的配合使用,参数和返回值都是一个值,如果要批量实现,请配合apply或者map一起使用
def str2date(date_str):
    '''
    将字符串日期转换成datetime.date形式
         参数:
     ------------
     date_str: str, 表示日期的字符串。  \n
        只要date_str的前 8/10 位表示日期就行,多余的字符串不影响解析; \n
        日期格式只能是下列之一: \n
            '2017-06-01' 格式的日期,   \n
            '2017/06/01' 格式的日期;  \n
            '20170601' 格式的日期。   \n
    返回值:
    -----------
    date_obj: datetime.date 对象。"""
    
    '''
    from datetime import date
    sep = date_str[4]
    if sep in ('-','/'):
        return date(*[int(i) for i in date_str[:10].split(sep)])
    else:
        return date(int(date_str[:4]),int(date_str[4:6]),int(date_str[6:8]))
str2date('2020-01-01') #datetime.date(2020, 1, 1)
str2date('2020/01/01') #datetime.date(2020, 1, 1)
str2date('2020/1/1') #datetime.date(2020, 1, 1)
str2date('20200101') #datetime.date(2020, 1, 1)
type(str2date('20200101'))   

 

6.计算相关性之后挑选变量

def corr_cut(df_corr):
    '''
    通过df.corr()之后挑选变量,在变量特别多的时候,就特别重要
    返回的挑选之后的表
    由于行和列的都是原来的列名,如果发现某个相关值大于0.5,即刻删除后面的变量名所在行以及列
    '''
    idx = 0 
    while idx <len(df_corr) -1:
        for j in range(idx+1,len(df_corr)):
            if df_corr.iloc[j,idx]>=0.5:
                col = df_corr.index[j] 
                df_corr.drop(index=col,inplace=True)
                df_corr.drop(columns=col,inplace=True)
                break
        else:
            idx +=1
    return df_corr

 

7.异常值处理

本次异常值处理是75%-25%分位数的3倍为标准处理,顺便还画出了处理缺失值前后的箱型图

#异常值的出来了,将异常值放到边界里面去
import seaborn as sns 
import matplotlib.pyplot as plt
def due_outliers(data,col_name,scale=3):
    def due(data_ser,box_scale):
        '''
        data_ser接受的是ser
        '''
        iqr=box_scale*(data_ser.quantile(0.75)-data_ser.quantile(0.25))   #0.75分位数的值-0.25分位数的值
        val_low=data_ser.quantile(0.25)-iqr  #低于这个值
        val_up=data_ser.quantile(0.75) + iqr  #高出这个值
        data_ser[data_ser < val_low] = val_low #低于临界值改为临界值 
        data_ser[data_ser > val_up] = val_up  #高于临界值修改为临界值
        return data_ser  #返回修改之后的数据

    fig, ax = plt.subplots(1, 2, figsize=(10, 7))
    sns.boxplot(y=col_name, data=data, palette="Set1", ax=ax[0])  #某列原来的箱型图
    data_n = due(data[col_name], box_scale=scale)
    data_n = pd.DataFrame(data_n.values,columns=[col_name])
    sns.boxplot(y=col_name, data=data_n, palette="Set1", ax=ax[1])  #删除异常值后的箱型图
    return data_n  #返回删除后的值

批量处理可以这样

#反正就是写for循环
#先copy一份,
num_tmp = num_df.copy()
for i in list(num_tmp.columns)[5:]:
    due_outliers(num_tmp,i,scale=3)

 

posted on 2020-12-09 20:33  小小喽啰  阅读(32)  评论(0编辑  收藏  举报