写函数思路
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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人