说明
这个主要是为了在sql里快速建表
内容
对每列的变量进行遍历,去掉空之后进行简单的判定。数值(double
、float
和date
)的数据长度是固定的,变化比较大的是字符型。我觉得可以采用最大最小的方式限定其极值。
函数
# 1 变量最终要推断为几种类型:int, float, varchar , datetime
# 2 逻辑看,对每一列进行循环,丢掉空值分析。对这列尝试日期转换,然后尝试数值转换。
# 3 日期转换若成功,那么就是date。如果数值转化失败那么就是字符, 取最大长度的两倍和制定的max_len的最小值作为varchar长度
# 4 数值转化成功的,就判断是否有 「.」,如果有就是float,否则是int。
import pandas as pd
def infer_df_cols2(some_data_frame, max_varchar_len = 1000 , min_varchar_len = 10, len_times = 2):
cols = []
cols_type = []
for col in some_data_frame.columns:
s = some_data_frame[col].dropna()
if len(s) ==0:
cols.append(col)
cols_type.append('Missing')
continue
# 判日期
try:
pd.to_datetime(s)
cols.append(col)
cols_type.append('date')
except:
# 判数值
try:
s.apply(float)
if '.' in str(s.iloc[0]):
cols.append(col)
cols_type.append('float')
else:
cols.append(col)
cols_type.append('int(11)')
except:
max_len = len_times* s.apply(len).max()
str_len = min(max_len, max_varchar_len)
str_len = max(str_len, min_varchar_len)
cols.append(col)
cols_type.append('varchar(%s)' % str_len)
return cols, cols_type
使用
test_input_df
main_type sub_type key_name value xdate
0 微服务 mservice 字符判定 char_validator 名字 name 例:AlphaSet000 2022-01-01
1 微服务 mservice 介绍 introduction 名字 name 例:online_ner24000 2022-01-01
2 微服务 mservice 字符判定 char_validator b1 b2 2022-01-01
3 微服务 mservice 介绍 introduction a1 a2 2022-01-01
infer_df_cols2(test_input_df)
(['main_type', 'sub_type', 'key_name', 'value', 'xdate'],
['varchar(28)', 'varchar(42)', 'varchar(18)', 'varchar(38)', 'date'])