目录
1.8、解决dataframe写入csv会出现科学技术法的情况
1.35、SyntaxError: Non-UTF-8 code starting with '\xe9' in file xxx.py ...
1.36、生成当前项目下的依赖包到requirements.txt
2.8、hive select * 查询分区表时,不查询分区字段。
一、简言
本文主要记录一些工作中记录的一些需求处理方式方法,后续如再遇到可以直接查看。主要涉及python、linux、sql领域一些内容,后续如有其他内容还会新增。
一、python方面
1.1、字符串前补0
str(1).zfill(4)
# 输出:0001
1.2、python安装包镜像网站
https://pypi.tuna.tsinghua.edu.cn/simple
1.3、pip无法卸载包时
pip install --ignore-installed xxx
1.4、dataframe设置全行或全列显示
# 设置全列显示
pd.set_option('display.max_columns',None)
# 设置全行显示
pd.set_option('display.max_rows',None)
1.5、dataframe对某一列特征编码
sex_mapping = {label: idx for idx, label in enumerate(set(df['sex']))}
df['sex'] = df['sex'].map(sex_mapping)
1.6、dataframe任意位置插入一列值
# res:dataframe对象
# 0:插入的位置,从0开始算起
# c_id.to_frame():插入的也必须是dataframe的一列
res.insert(0,'客户id',c_id.to_frame())
1.7、sklearn算法,输出特征方程
Y = a0 + a1*x1 + a2*x2 + a3*x3 + an*xn + u
model.coef_ 得到[a1,a2,a3,...,an] 变量系数
model.intercept_ 得到β0 截距
1.8、解决dataframe写入csv会出现科学技术法的情况
cust_base_df.replace('\s+','',regex=True,inplace=True)
1.9、dataframe行转列(行列互换)
new_df = crash_result.set_index(['card_no','target_description'])['target_value']
new_df = new_df.unstack().rename_axis(columns=None).reset_index().fillna(0)
1.10、正则找出两个特定字符中间的所有内容
pattern = '(?<=左特定字符).*(?=右特定字符)'
result = re.findall(pattern,l)
print("结果:",result )
1.11、正则匹配字符串中的中文内容
print(re.sub(r'[^\u4e00-\u9fa5]','','ABC中啊啊,。*'))
1.12、正则匹配括号里的内容
# 替换括号里的内容为ccc
print(re.sub('\[.*\]','ccc','aa[b[v]]d'))
# 输出 aacccd
# 找到所有括号里的内容
print(re.findall('\[.*\]','aa[b[v]]d'))
# 输出 ['[b[v]]']
1.13、try捕获具体报错的行数及文件
try:
raise ValueError('手动触发异常')
except Exception as e:
print(e)
print(e.__traceback__.tb_frame.f_globals['__file__'])
print(e.__traceback__.tb_lineno)
1.14、升级pip
python -m pip install -U pip
1.15、ip地址转int类型
import IPy
IPy.IP(x).int()
1.16、ip校验
#ip校验
def check_ip(ipAddr):
compile_ip=re.compile('^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)$')
if compile_ip.match(ipAddr):
return True
else:
return False
1.17、特征归一化
train_x=(train_x-np.mean(train_x,axis=0))/(np.std(train_x,axis=0,ddof=1))
1.18、dataframe自动转变类型
# 整体转换
train_x = train_x.apply(pd.to_numeric,errors='ignore')
# 对一列进行类型转变:
train_x['列名']=pd.to_numeric(train_x['列名'])
1.19、机器学习分类问题求精度
h=np.dot(test_X,theta)
y_mean=np.mean(test_Y,axis=0) # 真实值的平均数
u=np.sum((h-test_Y)**2) # 预测值和真实值之间的方差
v=np.sum((test_Y-np.mean(y_mean,0))**2) #真实值和真实值的平均值的方差
score=1-u/v
1.20、忽略警告
import warnings
warnings.filterwarnings('ignore')
1.21、matplotlib图上正常显示中文
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #在图中正确显示中文
plt.rcParams['axes.unicode_minus']=False # 默认是使用Unicode负号,设置正常显示字符,如正常显示负号
1.22、dataframe的merge与concat
new_df = pd.merge(df1,df2,how='outer',left_index=True,right_index=True,sort=False)
df = pd.concat([stand_df, orignial_df], sort=False)
1.23、字符串空白检查与替换
1)判断字符串中是否包含空格
s.isspace()
2)删除字符串中的空白字符
s.strip(rm) # 删除s开头、结尾的rm
s.lstrip(rm) # 删除s开头的rm
s.rstrip(rm) # 删除s结尾的rm
当 rm 为空时,默认删除空白字符,包括:\n,\r,\t
可以使用replace进行替换
1.24、dataframe按某列排序
# 1
df.sort_values(by=['column1'],inplace=True,ascending=False)
# 2
df = df.ix[:, ::-1]
print(df)
1.25、dataframe去重并重置索引index
# 按照subset所列字段进行去重,keep=first只保留首次出现的。
# 再通过reset_index重置索引
df.drop_duplicates(subset=['规则id', '查询账号', '查询卡号'],keep='first',inplace=True).reset_index(drop=True)
1.26、dataframe中带条件筛选
df.query("交易金额>=4700 & 交易金额>=5300")
df['列'].isin([4700,5300]) # 筛选等于列表的值
df['列'].between(4700,5300) # 筛选两者之间的值
1.27、比较两个dataframe是否相同
# 两个pandas的DataFrame比较是否相同
# 初始化两个dataframe
train_target = pd.DataFrame()
zero_mat = pd.DataFrame()
# 比较
np.array_equal(train_target.values,zero_mat.values)
1.28、datetime获取当前时间并格式化其他形式
# 获取当前时间并修改格式
# 获取当前时间
curr_time=datetime.datetime.now()
# 1、格式化 yyyy-mm-dd hh:mm:ss
time_str = datetime.datetime.strftime(curr_time, '%Y-%m-%d %H:%M:%S')
# 2、格式化 yyyy-mm-dd hh:mm:ss.SSS (三位数毫秒)
time_str = datetime.datetime.strftime(curr_time, '%Y-%m-%d %H:%M:%S.%f')[:-3]
1.29、dataframe删除满足条件的行
df = df.drop(df[ df['sex'] == '男' ].index).reset_index(drop=True)
df = df.drop(df[ df['sex'].str.len() == 0].index).reset_index(drop=True)
1.30、retry重试
# 安装
pip install retrying
from retrying import retry
import random
@retry(括号里可放参数)
def rtry():
a = random.randint(0,100)
if a < 10:
raise Exception('不是我想要的数')
else:
return a
1.31、jupyter notebook 密码
打开cmd,输入jupyter notebook list ,在输出的内容中找到 token=xxxxxxxxx 等号后面的就是密码。
1.32、机器学习ks指标计算
# ks值:
KS_max=0
best_thr=0
for i in range(len(fpr)):
if(i==0):
KS_max=tpr[i]-fpr[i]
best_thr=thresholds[i]
elif (tpr[i]-fpr[i]>KS_max):
KS_max = tpr[i] - fpr[i]
best_thr = thresholds[i]
print("ks值: ",KS_max)
1.33、selenium获取jsessionid
s = requests.session()
r = s.get(f'http://22.246.53.134:8080/investMg/dealInvesCt.action?jspFlg=result&investNo={clue_id}')
print(r.headers['Set-Cookie'])
print(dict(r.cookies)['JSESSIONID'])
jsessionid = dict(r.cookies)['JSESSIONID']
id_c = str(jsessionid).split('-')[-1]
1.34、python os模块获取当前文件的路径
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
1.35、SyntaxError: Non-UTF-8 code starting with '\xe9' in file xxx.py ...
# -*- coding:utf-8 -*-
# 原因:代码中包含有非utf-8字符集的字符,所以无法进行编解码。
1.36、生成当前项目下的依赖包到requirements.txt
# 安装pipreqs
pip install pipreqs
# 执行名称,cd到项目根目录
pipreqs ./ --encoding=utf-8
# 生成文件
./requirements.txt
1.37、pandas逻辑运算
# 逻辑运算函数
df.query("交易金额>=4700 & 交易金额>=5300")
df['列'].isin([4700,5300]) # 筛选等于列表的值
df['列'].between(4700,5300) # 筛选两者之间的值
1.38、两个dataframe比较是否相同
# 两个pandas的DataFrame比较是否相同
# 初始化两个dataframe
train_target = pd.DataFrame(train_target)
ero_mat = pd.DataFrame(zero_mat)
# 比较
np.array_equal(train_target.values,zero_mat.values)
1.39、retry重试
pip install retrying
from retrying import retry
import random
@retry(括号里可放参数)
def rtry():
a = random.randint(0,100)
if a < 10:
raise Exception('不是我想要的数')
else:
return a
1.40、数字转千分位展示
import locale
# 设置本地化信息,zh_CN.UTF-8 对应中国大陆地区的简体中文,可以根据需要修改
locale.setlocale(locale.LC_ALL, 'zh_CN.UTF-8')
formatted_number = locale._format('%0.2f', 123456789.116, grouping=True)
print(formatted_number) # 输出: 123,456,789
二、sql方面
2.1、hive时间格式化
select from_unixtime(unix_timestamp('20231106120814',"yyyyMMddHHmmss"), "yyyy-MM-dd HH:mm:ss")
2.2、hive后台load data入表
-- 1、准备离线txt文档或csv 确保hive表的分隔符为离线文档一样的分隔符,且hive表格式为textfile
-- row format
-- delimited fields
-- terminated by ','
-- LINES TERMINATED BY '\n'
-- STORED AS textfile
-- 2、通过命令进入hive后台交互
-- 3、输入 load data local inpath filePath overwrite into table tableName;
-- 下面为一个案例
hive> load data local inpath '/data/et_base_ip_region_jspoc.csv' overwrite into table jxpoc_dm.et_base_ip_region_jspoc;
Loading data to table jxpoc_dm.et_base_ip_region_jspoc
OK
Time taken: 0.674 seconds
2.3、hive批量删除分区
alter table xxx drop partition (data_dt <= '20240109')
2.4、对位数不足的进行填补
-- gp数据库给不足x位数的数补齐
-- 左补0函数:lpad()
select lpad(‘538’, 6, ‘0’) //解释:538不满6位数时,左变补0,让其达到6位长度
-- 右补0函数:rpad()
select rpad(‘538’, 6, ‘0’)//解释:538不满6位数时,右边补0,让其达到6位长度
2.4、greenplum将ip转换为int
SELECT split_part('200.233.1.2','.',1)::bigint*16777216 + split_part('200.233.1.2','.',2)::bigint*65536 +
split_part('200.233.1.2','.',3)::bigint*256 + split_part('200.233.1.2','.',4)::bigint;
2.5、模糊匹配多项
# 1.mysql
# 2.greenplum
select 'xxx' like any( array['%x%','%v%','%xx%'] )
# 3.hive
select 'xxx' regexp 'x|v|xx'
2.6、sql中排序函数的使用情况
-- 相同为并列,下一个不相同从所占位置开始
rank()
-- 相同为并列,下一个不相同从下个自然数开始
dense_rank()
-- 相同也排序,按照自然数顺序往下排
row_number()
-- 示例写法
row_number() over(partition by 字段1,字段2,字段n order by 字段1,字段2,字段n desc) as rank1
2.7、其他sql优化建议
最后附上一些sql调优的总结,以后有时间再深入研究
1、列类型尽量定义成数值类型,且长度尽可能短,如主键和外键,类型字段等等
2、建立单列索引
3、根据需要建立多列联合索引,当单个列过滤之后还有很多数据,那么索引的效率将会比较低,即列的区分度较低,那么如果在多个列上建立索引,那么多个列的区分度就大多了,将会有显著的效率提高。
4、根据业务场景建立覆盖索引,只查询业务需要的字段,如果这些字段被索引覆盖,将极大的提高查询效率
5、多表连接的字段上需要建立索引这样可以极大的提高表连接的效率
6、where条件字段上需要建立索引
7、排序字段上需要建立索引
8、分组字段上需要建立索引
9、Where条件上不要使用运算函数,以免索引失效
2.8、hive select * 查询分区表时,不查询分区字段。
-- 前置语句
set hive.support.quoted.identifiers=none;
-- 去掉分区字段data_dt 其他全部查询出来
select `(data_dt)?+.+`
from bdm.base_info
where data_dt = '20240129'
2.9、hive 表新增字到指定位置
-- cascade 对之前的分区新增字段并赋值NULL,否则之前的分区不会新增字段。
-- 对于分区表,修改表结构时一定要加上cascade。用于同时更新旧分区数据,以避免不必要的麻烦。
alter table aml.zqy_account_info add columns (xxx string comment 'xxx' ) cascade;
-- 先插入再指定位置 指定字段xxx到yyy字段后
alter table aml.zqy_account_info change xxx xxx string comment'xxx' after yyy;
2.10、hive中取余数方法和函数
-- 1、内置函数
pmod(a,b)
-- 2、公式计算
MOD(a,b) = a-b * INT(a/b)
2.11、sql两个字段合并
hive
concat(column1,column2)
concat_ws(separator,column)
postgresql
column1 || column2
string_agg(separator,separator)
2.12、postgresql判断某字段是否在表中
-- cnt1等于0则表示字段不存在表中
if (
select count(*) as ct1
from information_schema.columns
where table_name = '表名'
and column_name = '字段名'
) = 0
2.13、postgresql判断表是否存在
-- open为schema t_test为表名
-- 判断表是否存在 存在返回 1 不存在返回 0
select count(1) as cnt
from pg_class c
left join pg_namespace n
on (n.oid = c.relnamespace)
where n.nspname = 'open'
and c.relname = 't_test';
三、linux方面
3.1、linux中python设置后台运行
nohup python run.py > nohup.log 2>&1 &
3.2、linux远程拷贝
scp -r source_path user@host:target_path
scp -r text_clusters/ root@172.30.6.212:/data/ici/
3.3、linux查看文件编码
file --mime-encoding processing_record/project_record.py
3.4、linux打包与解压
# 打包:
tar -czvf name.tgz filePath
# 解压:
tar -zxvf name.tgz
3.5、设置vim打开文件的默认编码格式
echo 'set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936' >> /etc/vimrc
3.6、文本文件关键字符替换
# 替换","为|@|
sed -i 's/","/|@|/g' aa.dat
# 替换行首"为空,行首^
sed -i 's/^"//g' aa.dat
# 替换行尾"为空,行尾$
sed -i 's/"$//g' aa.dat
3.7、按照名称kill掉程序进程
# 可配合 netstat -nltp 使用
kill -9 $(pidof google-chrome)
3.8、找出文件中不满足分隔符数量的行
# 找出小于5个|分隔符的行
# 以下示例:找出xxx.txt文件中,分隔符|的数量小于5的行。然后写入到yyy.txt文件中
awk -F '|' '{if (NF<5) print $0}' xxx.txt > yyy.txt
四、其他
因时间有限,本文会持续更新,记录常用方法。