from sql_connector import ConnectorJavaTest,Connector158
import pandas as pd
import re
# 定义一个函数,用于清除product_name列下的数字
def remove_digits_and_punctuations(text):
pattern = r'[^\w\s]' # 匹配非单词字符和非空白字符
return re.sub(pattern, '', str(text))
def remove_digits(string):
pattern = r'\d+'
return re.sub(pattern, '', string)
query=f"""
SELECT
FORMAT(a.PayTime, 'yyyy-MM-dd') AS 时间,
a.ordersourceid,
a.OrderSourceContry,
COUNT(DISTINCT CASE WHEN a.SalesRefunds = 0 AND a.OrderCode != '' THEN a.OrderCode END) AS 订单数,
a.SKU,
a.WareHouseName,
CONCAT(ROUND(CASE WHEN SUM(a.Incomes) = 0 THEN 0 ELSE SUM(a.Profits) / SUM(a.Incomes) * 100 END, 2), '%') AS 毛率,
SUM(a.Profits) AS 利润
FROM dbo.RB_Report_OrderSettlement a
WHERE a.PayTime >= '2023-06-06' AND a.PayTime < '2023-12-06'
AND a.OrderSourceType = 70
AND a.WareHouseName LIKE '%中国%'
GROUP BY FORMAT(a.PayTime, 'yyyy-MM-dd'),
a.ordersourceid,
a.SKU,
a.OrderSourceContry,
a.WareHouseName
HAVING SUM(a.Profits) > 0
ORDER BY COUNT(DISTINCT CASE WHEN a.SalesRefunds = 0 AND a.OrderCode != '' THEN a.OrderCode END) DESC;
"""
df = Connector158().read_sql(query)
df = df.rename(columns={'SKU': 'sku'})
# 获取df中的所有唯一SKU值
sku_list = df['sku'].unique()
# 将SKU值转换为逗号分隔的字符串
sku_str = "','".join(sku_list)
query1 = f"""
SELECT sku, product_name
FROM rb_product
WHERE SKU IN ('{sku_str}')
"""
df1=ConnectorJavaTest().read_sql(query1)
df1 = pd.merge(df, df1, how='left', on='sku')
# 定义要替换的字符串列表
strings_to_replace = ['sets', 'set', 'PC', 'pcs', 'PCS', 'Pcs', 'pc', 'Sets', 'pcs']
df1['product_name'] = df1['product_name'].str.strip() # 去除首尾空白字符
# 将指定字符串替换为空字符串
df1['product_name'] = df1['product_name'].replace(strings_to_replace, '')
# 应用函数到 product_name 列
df1['product_name'] = df1['product_name'].astype(str).apply(remove_digits_and_punctuations)
df1['product_name'] = df1['product_name'].astype(str).apply(remove_digits)
# 去除df1中product_name为空的行
df1 = df1.dropna(subset=['product_name'])
for country, group in df1.groupby('OrderSourceContry'):
# 将分组结果写入 Excel 文件
file_path = r'C:\Users\wangkejun\Desktop\{}.xlsx'.format(country)
group.to_excel(file_path, index=False)
# 读取 Excel 文件
df2 = pd.read_excel(file_path)
# 删除 product_name 列为空的行
df2 = df2.dropna(subset=['product_name'])
df2.to_excel(file_path, index=False)
- 导入必要的库和模块。
- 定义了两个函数:
remove_digits_and_punctuations(text)
: 用于清除文本中的数字和标点符号。remove_digits(string)
: 用于清除字符串中的数字。
- 构建了SQL查询语句,从数据库中选取符合条件的订单数据。
- 使用
Connector158()
连接数据库,并通过read_sql()
方法执行SQL查询语句,将结果存储在DataFrame对象df
中。 - 对
df
进行重命名,将列名"SKU"改为"sku"。 - 提取出
df
中所有唯一的SKU值,并将其转换为逗号分隔的字符串。 - 构建了第二个SQL查询语句,选取满足条件的SKU对应的产品名称。
- 使用
ConnectorJavaTest()
连接数据库,并通过read_sql()
方法执行第二个SQL查询语句,将结果存储在DataFrame对象df1
中。 - 将
df
和df1
通过"sku"列进行合并,得到合并后的DataFrame对象df1
。 - 定义了一个字符串列表
strings_to_replace
,用于替换商品名称中的特定字符串。 - 清除
df1
中"product_name"列首尾的空白字符。 - 使用
replace()
方法将指定字符串替换为空字符串。 - 通过
astype()
方法将"product_name"列转换为字符串类型,并应用两个清除函数remove_digits_and_punctuations()
和remove_digits()
来处理"product_name"列的值。 - 删除
df1
中"product_name"列为空的行。 - 根据"OrderSourceContry"列将
df1
分组,并将每个分组的结果保存到以国家命名的Excel文件中。 - 使用
read_excel()
方法读取Excel文件,将结果存储在DataFrame对象df2
中。 - 删除
df2
中"product_name"列为空的行。 - 将处理后的
df2
重新保存到同一Excel文件中,覆盖之前的内容