能用的到的函数系列4(数据操作包DataManipulation)"/>
Python一些可能用的到的函数系列4(数据操作包DataManipulation)
说明
DataManipulation是个人开发的包,当前版本0.1.6,后续可能还会继续更新。主要用于建模前的数据处理。
构建方式见之前的文章
函数主要在DataManipulation文件夹下面。内容审核后包可以在这里下载。
内容
-
1 存储类
- from_pickle和to_pickle
-
2 数据集的分割
- train_validate_split
- 用于样本的分割,确保模型稳定性
-
3 数据查探
- view_df_varattr
- 查看数据集的变量元数据
-
4 离散化
- get_dis_dict
- 获取离散化的「标尺」
- discrete_df
- 根据「标尺」进行离散化
- get_dis_dict
-
5 查看变量重要性(目标相关性)
- df_iv_summary
- 计算变量的信息值
# 保存为pickle
from .func1 import to_pickle
# 从pickle载入
from .func2 import from_pickle
# 训练和验证分割
from .func3 import train_validate_split
# 字典的键和值反转(值变为键,键变为值)
from .func4 import kv2vk
# 获得df中某个变量的元信息
from .func5 import collect_var_attr
# 获得df某些变量的元信息
from .func6 import view_df_varattr
# 对某个series离散化
from .func7 import mat_quat
# 计算x,y的iv值
from .func8 import iv_pro
# 计算一个DF下的iv值
from .func9 import df_iv_summary
# 取出某个series的百分位数列唯一值
from .func10 import get_qtiles_val
# 按某个固定的qtiles取出所有变量的分位数,存在字典里(For Continuous)
from .func11 import get_qtiles_c_dict
# 去除某个series的唯一值(对连续变量)
from .func12 import get_unique_val
# 将离散变量的每一个值都做成 k:v 键值对 attr1:1 -> attrn:n
from .func13 import get_map_d_dict
# 一次性的给出c_dis_dict和d_dis_dict
from .func14 import get_dis_dict
# 将df根据target_name , target_ratio, random_seed重新进行抽样
from .func15 import df_zoom
# 连续变量Series根据list进行匹配
from .func16 import discrete_cSeries
# 离散变量Series的根据字典进行匹配
from .func17 import discrete_dSereis
# 根据变量的「标尺」类型,自动使用对应的方式来对C和D进行离散化
from .func18 import discrete_df
应用
考虑到pickle的版本可能不同,可以去下载这个资源读入。
import numpy as np
import pandas as pd
import DataManipulation as dm
# 一次调试时如果版本有更新,可以使用reload
from imp import reload
reload(dm)
# 1 读取数据
raw_df = dm.from_pickle('raw_data')id_varname = 'SK_ID_CURR'
target_varname = 'TARGET'conserve_list = [id_varname, target_varname]zoom_df = dm.df_zoom(df=raw_df, target_varname=target_varname,target_ratio =0.1, random_seed =1234)
# 2 分割数据
train, validate = dm.train_validate_split(df = zoom_df,target_varname=target_varname,random_seed=123, train_ratio=0.7, stratified=1)# 3 观察数据
train_meta = dm.view_df_varattr(train)# 4 选择出连续和离散的变量
c_list = [x for x in train_meta[train_meta.vartype_infer=='C']['varname'] if x not in conserve_list]
d_list = [x for x in train_meta[train_meta.vartype_infer!='C']['varname'] if x not in conserve_list]
qtiles =[0.25, 0.5, 0.75]dis_dict = dm.get_dis_dict(train, c_list = c_list, d_list = d_list,qtiles=qtiles)# 5 获得被离散化的数据框
train_dis = dm.discrete_df(train, dis_dict)
部分结果:
In [40]: train_dis.head().T
Out[40]: 0 1 2 3 4
AMT_INCOME_TOTAL 2 2 2 2 2
AMT_CREDIT 3 4 2 1 1
AMT_ANNUITY 2 4 2 1 1
AMT_GOODS_PRICE 3 4 1 1 1
REGION_POPULATION_RELATIVE 4 2 2 4 3
DAYS_BIRTH 2 3 4 4 1
DAYS_EMPLOYED 2 1 2 4 4
DAYS_REGISTRATION 3 3 1 3 1
DAYS_ID_PUBLISH 4 1 3 4 1
OWN_CAR_AGE 4 4 4 4 4
HOUR_APPR_PROCESS_START 2 1 2 2 1
EXT_SOURCE_1 2 1 4 1 4
EXT_SOURCE_2 1 1 1 2 1
EXT_SOURCE_3 1 4 3 4 2
APARTMENTS_AVG 1 2 4 4 3
BASEMENTAREA_AVG 1 4 4 4 3
YEARS_BEGINEXPLUATATION_AVG 1 2 4 4 3
YEARS_BUILD_AVG 1 4 4 4 3
COMMONAREA_AVG 1 4 4 4 2
ELEVATORS_AVG 2 2 3 3 2
ENTRANCES_AVG 2 3 4 4 4
FLOORSMAX_AVG 1 2 3 3 2
FLOORSMIN_AVG 2 4 4 4 3
LANDAREA_AVG 1 4 4 4 3
LIVINGAPARTMENTS_AVG 1 4 4 4 2
LIVINGAREA_AVG 1 3 4 4 3
NONLIVINGAPARTMENTS_AVG 2 3 3 3 3
NONLIVINGAREA_AVG 2 2 4 4 3
APARTMENTS_MODE 1 3 4 4 3
BASEMENTAREA_MODE 2 4 4 4 3
... .. .. .. .. ..
WALLSMATERIAL_MODE 1 2 3 3 2
EMERGENCYSTATE_MODE 1 1 2 2 1
DEF_30_CNT_SOCIAL_CIRCLE 1 1 1 1 1
DEF_60_CNT_SOCIAL_CIRCLE 1 1 1 1 1
FLAG_DOCUMENT_2 1 1 1 1 1
FLAG_DOCUMENT_3 1 1 1 2 2
FLAG_DOCUMENT_4 1 1 1 1 1
FLAG_DOCUMENT_5 1 1 1 1 1
FLAG_DOCUMENT_6 1 1 1 1 1
FLAG_DOCUMENT_7 1 1 1 1 1
FLAG_DOCUMENT_8 1 1 1 1 1
FLAG_DOCUMENT_9 1 1 1 1 1
FLAG_DOCUMENT_10 1 1 1 1 1
FLAG_DOCUMENT_11 1 1 1 1 1
FLAG_DOCUMENT_12 1 1 1 1 1
FLAG_DOCUMENT_13 1 1 1 1 1
FLAG_DOCUMENT_14 1 1 1 1 1
FLAG_DOCUMENT_15 1 1 1 1 1
FLAG_DOCUMENT_16 1 1 1 1 1
FLAG_DOCUMENT_17 1 1 1 1 1
FLAG_DOCUMENT_18 1 1 1 1 1
FLAG_DOCUMENT_19 1 1 1 1 1
FLAG_DOCUMENT_20 1 1 1 1 1
FLAG_DOCUMENT_21 1 1 1 1 1
AMT_REQ_CREDIT_BUREAU_HOUR 1 2 1 2 1
AMT_REQ_CREDIT_BUREAU_DAY 1 2 1 2 1
AMT_REQ_CREDIT_BUREAU_WEEK 1 2 1 2 1
AMT_REQ_CREDIT_BUREAU_MON 1 2 3 2 1
AMT_REQ_CREDIT_BUREAU_QRT 1 2 3 2 3
AMT_REQ_CREDIT_BUREAU_YEAR 1 2 1 2 3[120 rows x 5 columns]
更新
- 版本0.1.7, 增加函数dummy4discrete,生成数据集中离散变量的哑变量,获取单个属性的占比。哑变量的好处是易于表达,并且还可以参与多项式衍生。
# 获取离散变量的哑变量
# 如果有缺失则自动跳过(不会统计)
from . import pd, np
def dummy4discrete(df, dis_cols):res_df = pd.DataFrame()for c in dis_cols:tem_df = pd.get_dummies(df[c], prefix=c)res_df = pd.concat([res_df,tem_df],axis=1)return res_df# --- 使用pyechart函数画图
from pyecharts import options as opts
from pyecharts.charts import Bardef Stacked1SouceBarH(source_name1,x_str_list, y_val_list1, title, filename, path='./'):x_str_list = [str(x) for x in x_str_list]y_val_list1 = [int(x) for x in y_val_list1]c = (Bar().add_xaxis(x_str_list).add_yaxis(source_name1, y_val_list1).reversal_axis().set_series_opts(label_opts=opts.LabelOpts(position="right")).set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title=title)).render(path+filename))print('File Saved To ', path+filename)return True
应用:
# 3.1 对天然的离散变量执行dummyies
d_list = [x for x in train_meta[train_meta.vartype_infer!='C']['varname'] if x not in conserve_list]
# 60 个
dummy_df = dm.dummy4discrete(train, d_list)
dummy_df_summary = dummy_df.sum().sort_values(ascending=False)source_name1 = 'Discrete Dummy of Data'
x_str_list = list(dummy_df_summary.index)
y_val_list1 = dummy_df_summary.values
title = '离散变量的哑变量分析'
filename = 'DisDum1.html'
Stacked1SouceBarH(source_name1, x_str_list, y_val_list1, title, filename)
效果:
版本0.1.8
- 更新列表的排序函数。可以对x1,x2, x11这种类型的情况正常排序(否则会是x1,x11,x2) 。本次小更改不上传新的函数包。
# 按首个字母 + 数字的方法列表排序
# a = ['a1', 'a11', 'a2', 'b3', 'b1']
def sort_ax_list(ax_list):b = [(x[0], int(x[1:])) for x in ax_list]b1 = sorted(b, key=lambda x: (x[0], x[1]))b2 = [x[0]+str(x[1]) for x in b1]return b2In [1]: import DataManipulation as dm In [2]: a =['x1','x2', 'x11'] In [3]: sorted(a)
Out[3]: ['x1', 'x11', 'x2']In [4]: dm.sort_ax_list(a)
Out[4]: ['x1', 'x2', 'x11']
功能函数列表
函数名 Function Name | 函数描述 Function Description | 函数入参 Input Parameter | 函数出参 Output Parameter | 版本要求 Version Required |
---|---|---|---|---|
get_qtiles_val | 给定一个百分位数列,取出Series对应的百分位数(去重) | |||
get_qtiles_c_dict | 按某个固定的qtiles取出所有变量的分位数,存在字典里 | |||
discrete_cSeries | 连续变量Series根据list进行匹配 | |||
discrete_dSereis | 离散变量Series的根据字典进行匹配 | |||
df_iv_summary | 对df执行要计算iv的列和对应的目标列,输出iv_df和woe_dict | |||
get_dis_dict | 一次性的给出c_dis_dict和d_dis_dict | |||
discrete_df | 根据变量的「标尺」类型,自动使用对应的方式来对C和D进行离散化,返回新的df | |||
to_pickle | 将Python对象存到指定位置 | >=0.1.9 | ||
from_pickle | 将指定位置的Python对象读出 | >=0.1.9 | ||
sort_ax_list | 对字母+数字的命名方式进行逻辑排序 | >=0.1.9 | ||
get_curdate_str | 获取当前系统日期的字符串 | >=0.1.9 | ||
path_traceback | 按照分隔符回溯上级目录 | >=0.1.9 | ||
get_rel_path | 获取某个分隔符之后的路径 | >=0.1.9 | ||
create_folder_if_notexist | 如果路径不存在则创建 | >=0.1.9 | ||
read_excel_with_sheets | 根据筛选列表读取excel的多个sheet - 返回匹配筛选的第一个 | >=0.1.10 | ||
transpose_df | 将一个pd.DataFrame的行列转置 | >=0.1.10 | ||
is_df_superset | 判断df的列是否是指定列的超级 issuperset | >=0.1.10 | ||
clean_df_columns | 简单清洗df字段名称,去除头尾空格,中英文冒号。可以指定希望保留的列。 | >=0.1.10 | ||
show_some_files | 展示某个路径(文件夹)下面以某些后缀名结尾,不以某些前缀开头的文件(“.”通常是隐藏文件) | >=0.1.10 | ||
md5_trans | 将文本去掉空格,返回md5 摘要 | >=0.1.11 | ||
get_md5_digest | 对可pickle dumps的python对象提取摘要 | >=0.1.11 | ||
make_mq_connection | 输入用户(user)、密码(pwd)、网址(url)、端口(5672)、用户权限(/)来创建一个连接 ,改为不定参 | >=0.1.12 | ||
make_an_direct_exchange | 给定一个连接,声明一个最简单的MQ交换机 | >=0.1.12 | ||
make_an_simple_queue | 给定一个连接,声明一个队列(需要先存在交换机) | >=0.1.12 | ||
send_a_message | 单发模式(一连一发):向某个信道发出一条消息。注意body必须{‘data’:yourdata,‘meta’:{‘handle_func’:the_func}} | >=0.1.12 | ||
OMQ | 可字典化MQ对象(Object of MQ),可以在内存中反复使用 | >=0.1.12 | ||
buffer_txt_files | 序号48,给定路径和文件列表,将文本文件读入并暂存在内存中 | >=0.1.12 | ||
tem_parse_sql2table | 序号53, 将sql语句解析为关系表格 ,实验版 | >=0.1.12 | ||
cross_target | 序号40,计算目标(0,1)交叉表并显示比例。展示交叉表(N,T)和目标率(TargetRate) | >=0.1.14 | ||
hiedict2df | 序号41,将层级式字典转为DF,字典的键值深度相同 ,实验版,目前假定为两层 | >=0.1.14 | ||
is_str_dlm_is_started_by | 序号42, 校验一串可分割字符的某个是否以某个前缀(列表)开始 | >=0.1.14 | ||
is_list_eles_ended_by | 序号43,校验一串可分割字符的某个是否以某个前缀(列表)结尾 | >=0.1.14 | ||
amend_path_slash | 序号45, 修正地址,确保路径最后一个是斜杠 | >=0.1.14 | ||
cp_txt_topath | 序号46, 将一个可读的文本文件从一处拷贝到到另一处 | >=0.1.14 | ||
fetch_dir_txt_file_list | 序号47, # 读取一个目录下指定类型的文件,并在另一个目录下重建[注意,文件不要太大,结果会暂存在内存中] | >=0.1.14 | ||
buffer_txt_files | 序号48,# 给定路径和文件列表,将文本文件读入并暂存在内存中 | >=0.1.14 | ||
output_txt_files | 序号49, 按路径和文件名和文件内容重新写回 | >=0.1.14 | ||
try_to_convert_float | 序号55,尝试进行浮点数比较(处理可能有文本情况) | >=0.1.14 | ||
try_convert_dim1_float | 序号56,将一维列表进行普通数值转换 | >=0.1.14 | ||
try_convert_dim2_float | 序号57,将二维列表进行普通数值转换 | >=0.1.14 | ||
save_df_list_excel | 序号58,将数据框列表保存为excel的多个sheet | >=0.1.14 | ||
ATimer | 序号62,自定义时间对象 | >=0.1.15.1 | ||
scalar_dis | 序号63,使用一维向量(ruler)对一个标量离散化 | >=0.1.15.1 | ||
max_dict_layer | 序号64,计算字典的最大层数(递归) | >=0.1.15.1 | ||
flat_dict | 序号65,字典扁平化(递归)。把字典全部拆为键值对(方便表格化) | >=0.1.15.1 | ||
flat_dict_1dim_scalar | 序号66,将字典拆解成键值-标量对(如果值是列表,会尝试把列表也扁平化),注意,假定列表是1层的 | >=0.1.15.1 | ||
is_str_date | 序号67,正则 判断是否含日期 yyyy-mm-dd 实验版 | >=0.1.15.1 | ||
flat_dict2df | 序号68,配合(flat_dict_1dim_scalar), 把扁平化字典变成df | >=0.1.15.1 | ||
dis_df_filter | 序号69,针对全部为离散型变量的列,执行筛选, in | >=0.1.15.1 | ||
color_print | 序号70,彩虹打印终端字体 1(高亮),4(下划线),5(闪烁),7(反白); red(红),green(绿),yellow(黄),blue(蓝),purple(紫) | >=0.1.15.1 | ||
dis_df_filter_chain | 序号71,对离散型变量进行链式筛选 | >=0.1.15.1 | ||
tryload_pkl | 序号72,尝试载入某个pkl, 如果失败则为None | >=0.1.15.1 | ||
superior_var | 序号73,如果有a就返回a, 否则返回b | >=0.1.15.1 | ||
get_num | 序号74,从abc123类型中提取出数字 | >=0.1.15.1 | ||
get_code_by_num | 序号75,根据123取出对应的abc123 | >=0.1.15.1 | ||
get_current_max_code | 序号76,获取当前字典数字序号最大的键值,或者只是序号(键值类型abc123) | >=0.1.15.1 | ||
LogicLog | 序号77,记录逻辑步骤的日志对象。如果值记录主程序,建议命名ll_mainstream,如果是子程序ll_funcstream | >=0.1.15.1 | ||
get_alphabet | 序号78,返回字符中的字母,主要提取abc123中的abc | >=0.1.15.1 | ||
get_current_new_code | 序号79,获取新的key_code , 例如原来最大的是a123,那么当前获取的就是a124 | >=0.1.15.1 | ||
df2fronendjson | 序号80,将数值类型经过int或者float处理的数据返回成前端可用的json。cols_name是新的标签名 | >=0.1.15.1 | ||
df2fronendjsonL2 | 序号81,根据某个字段,拆成多个表格列表 | >=0.1.15.1 | ||
get_obj_attrs_methods | 序号82,获取对象的属性和方法返回两个列表:属性列表和方法列表(以下划线开头和结尾的都认为是默认属性、方法) | >=0.1.15.1 | ||
get_obj_only_attrs | 序号83,获取对象的字符和数值属性 | >=0.1.15.3 | ||
FuncChain | 序号84,与LogicLog配合,实现函数的链式执行,未来也可加入分支 | >=0.1.15.3 | ||
lookup_update_dict | 序号85,查询值是否在字典的值列表中(字典的键值需要符合abc123的命名方式),如果没有则创建一个新键保存 | >=0.1.15.3 | ||
get_machine_hostname | 序号86,获取运行主机的名称 | >=0.1.15.3 | ||
get_machine_ip | 序号87,获取运行主机的ip | >=0.1.15.3 | ||
get_machine_mac | 序号88,获得主机MAC地址 | >=0.1.15.3 | ||
get_curdatetime_str | 序号89,获得当前日期时间字符串 | >=0.1.15.3 | ||
mysql_read_table | 序号90,从pymysql中读取一张表,转为df | >=0.1.15.3 | ||
mysql_insert_rows | 序号91,mysql_insert_rows | >=0.1.15.3 | ||
mysql_update_rows | 序号92,根据where条件修改数据 | >=0.1.15.3 | ||
mysql_delete_rows | 序号93,删除数据(如果有外键约束则无法删除) | >=0.1.15.3 | ||
s_current_last_ratio | 序号94,计算列,当前期与上一期的比值。inplace = True, 由new_colname指定新名称,结果添加在df中;inplace=False 则直接返回 | >=0.1.15.3 | ||
s_last_current_ratio | 序号95,计算列,上一期与当前期的比值。inplace = True, 由new_colname指定新名称,结果添加在df中;inplace=False 则直接返回 | >=0.1.15.3 | ||
s_col_diff | 序号96,计算一阶差分, inplace =True, 则在原数据表加一列;inplace=False 则返回一个新列 | >=0.1.15.3 | ||
s_cols_weighted_sum_ignore_null | 序号97,多列加权相加,如果缺失则补0. inplace=True 结果为df增加的两列(一列是和,一列是缺失统计,可自定义名称); inplace=False 则把结果返回。 | >=0.1.16.2 | ||
s_cols_weighted_sum | 序号98,多列加权相加,如果缺失则【不】补0. inplace=True 结果为df增加的两列(一列是和,一列是缺失统计,可自定义名称); inplace=False 则把结果返回。 | >=0.1.16.2 | ||
s_col_avg | 序号99,计算一阶平均 本期与上期的平均.inplace=True增加一列,否则返回一列 | >=0.1.16.2 | ||
mysql_query_counts | 序号100,根据查询条件计算条数 | >=0.1.16.2 | ||
read_conf | 序号101,数据文件完整的path+filename,读取某个配置文件,返回OrderedDict | >=0.1.16.2 | ||
get_df_missing_dict | 序号102,获取df的字段缺失比例字典 | >=0.1.16.2 | ||
filter_dict_by_value | 序号103,根据字典的值筛选子字典 in, between(左闭右开) , ge , le ;val_list 是列表形式 | >=0.1.16.2 | ||
del_dictkey_ifexists | 序号104,如果字典里有某个键值,那么删除 | >=0.1.16.2 | ||
gen_by_j2 | 序号105,指定存放模板的文件夹和文件名,然后传入kw参数,返回模板生成的结果 | >=0.1.16.2 | ||
get_num_digit | 序号106,正则提取短语中数字(含小数点) | >=0.1.16.2 | ||
get_chinese_str | 序号107,正则提取短语里的中文 | >=0.1.16.2 | ||
create_txtfile_auto_createfolder | 序号108,传入文件的绝对路径,以及需要写入的值,如果不存在目录则自动创建 | >=0.1.16.2 | ||
make_folder_struct | 序号109,只要改名字和改对应文件名的内容就好了,默认文件是docker-compose的 | >=0.1.16.9 | ||
gen_df_insert_sql | 序号110,输入一个df,指定要插入的表名,要插入的列名(可选),返回执行插入的sql语句 | >=0.1.16.9 | ||
exe_sql | 序号111,指定mysql数据库连接参数和待执行sql语句,函数以try…except, finnaly的方式执行 | >=0.1.16.9 | ||
file_size_abbr | 序号112,文件数值大小转为常见缩写,例如1000-> 1k | >=0.1.16.9 | ||
gen_uri_binfile | 序号113,指定源文件的地址和名称以及目标文件的的地址(如果不写目录,默认为当前目录),标签前缀(下划线代表层级)。文件要有后缀名。 | >=0.1.16.9 |
函数名称|解释|||>=0.1.15.3
更多推荐
Python一些可能用的到的函数系列4(数据操作包DataManipulation)
发布评论