数据库处理与分组存储

2023-12-13 06:05:52
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)
  1. 导入必要的库和模块。
  2. 定义了两个函数:
    • remove_digits_and_punctuations(text): 用于清除文本中的数字和标点符号。
    • remove_digits(string): 用于清除字符串中的数字。
  3. 构建了SQL查询语句,从数据库中选取符合条件的订单数据。
  4. 使用Connector158()连接数据库,并通过read_sql()方法执行SQL查询语句,将结果存储在DataFrame对象df中。
  5. df进行重命名,将列名"SKU"改为"sku"。
  6. 提取出df中所有唯一的SKU值,并将其转换为逗号分隔的字符串。
  7. 构建了第二个SQL查询语句,选取满足条件的SKU对应的产品名称。
  8. 使用ConnectorJavaTest()连接数据库,并通过read_sql()方法执行第二个SQL查询语句,将结果存储在DataFrame对象df1中。
  9. dfdf1通过"sku"列进行合并,得到合并后的DataFrame对象df1
  10. 定义了一个字符串列表strings_to_replace,用于替换商品名称中的特定字符串。
  11. 清除df1中"product_name"列首尾的空白字符。
  12. 使用replace()方法将指定字符串替换为空字符串。
  13. 通过astype()方法将"product_name"列转换为字符串类型,并应用两个清除函数remove_digits_and_punctuations()remove_digits()来处理"product_name"列的值。
  14. 删除df1中"product_name"列为空的行。
  15. 根据"OrderSourceContry"列将df1分组,并将每个分组的结果保存到以国家命名的Excel文件中。
  16. 使用read_excel()方法读取Excel文件,将结果存储在DataFrame对象df2中。
  17. 删除df2中"product_name"列为空的行。
  18. 将处理后的df2重新保存到同一Excel文件中,覆盖之前的内容

文章来源:https://blog.csdn.net/EaSoNgo111/article/details/134954538
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。