公众号后台(不是评论区)回复关键字 python库polars实现批量转换汇率 即可获取下载数链接(无密码,后台自动回复的链接复制到浏览器)(长按关键字复制粘贴即可,不必手写)
(不限行业,只是以跨境电商举例)
跨境电商行业,结算或者订单有很多列,从原始数据批量转换的时候,如汇率,有2种常用的方法。
方法1 是把宽表转成长表,即通过逆透视,把多列转成一列作为属性,只对值进行数值操作
方法2 是利用python的库polars很酷的1个功能,按照类型选择,并且支持剔除指定的某列
先看下数据示例
原币数据:
汇率:
注:表格里面的汇率使用动态数组生成的,每次打开都会不一样,可以数值粘贴后变成静态的。
方法1 :逆透视
import polars as pl path = r”D:\python库polars实现批量转换汇率.xlsx”df_原币数据 = ( pl.read_excel(path,sheet_name='原币数据') .with_row_index('index') .unpivot( index = ['index','国家','币种','SKU','数量'], variable_name='属性', value_name='原币' ) .with_columns( pl.col('原币').cast(pl.Float64) ))df_汇率 = ( pl.read_excel(path,sheet_name='汇率') .with_columns( pl.col('汇率').cast(pl.Float64) ) # 防止通过币种出现多次造成重复 .unique(subset=['币种']))df_人民币 = ( df_原币数据 .join( other=df_汇率, left_on=['币种'], right_on=['币种'], how='left' ) .with_columns( (pl.col('原币') * pl.col('汇率')).alias('人民币') ))# 此处应用2个检查# 检查1 : 是否有币种没有匹配到 # 检查2 : 是否匹配重复print(df_人民币)
方法2 :按照类型选择
import polars as pl import polars.selectors as cs path = r”D:\python库polars实现批量转换汇率.xlsx”df_原币数据 = ( pl.read_excel(path,sheet_name='原币数据') .with_row_index('index'))df_汇率 = ( pl.read_excel(path,sheet_name='汇率') .with_columns( pl.col('汇率').cast(pl.Float64) ) .unique(subset=['币种']))df_人民币 = ( df_原币数据 .join( other=df_汇率, left_on=['币种'], right_on=['币种'], how='left' ) .with_columns( # 保持原有列名,只是数字变成了人民币的 # cs.numeric().exclude('数量','汇率') * pl.col('汇率'), # 新增列,名字可以用后缀 _人民币 (cs.numeric().exclude('数量','汇率') * pl.col('汇率')).name.suffix('_人民币'), ))df_人民币.write_parquet('./df_人民币.parquet')# 此处应用2个检查# 检查1 : 是否有币种没有匹配到# 检查2 : 是否匹配重复print(df_人民币)
cs.numeric().exclude('数量','汇率') ,exclude里面把不想转换的都放上。
汇率也可以增加日期列 , 在join的条件里面增加日期。
.name.suffix('_人民币') , suffix后面写什么任意 ,也有 prefix作为前缀。
2个检查项:
检查是否有未匹配到的币种,写一个filter(pl.col('汇率').is_null()),然后看结果是否为空,不为空就是存在未匹配到的币种。
检查是否匹配重复,就是对index汇总 ,group_by 之后看每个index的计数(count 或者 len)是否有大于2的,存在的话就说明重复了。