Переглянути джерело

增加数据库读取数据的功能

Sherlock 1 рік тому
батько
коміт
bcc8878480

+ 1 - 0
dao/__init__.py

@@ -1,6 +1,7 @@
 #!/usr/bin/env python3
 # -*- coding:utf-8 -*-
 from dao.mysql_client import Mysql
+
 __all__ = [
     "Mysql"
 ]

BIN
dao/__pycache__/__init__.cpython-38.pyc


BIN
dao/__pycache__/mysql_client.cpython-38.pyc


+ 7 - 4
dao/mysql_client.py

@@ -1,12 +1,13 @@
 #!/usr/bin/env python3
 # -*- coding:utf-8 -*-
+import os
 from sqlalchemy import create_engine, text
 from sqlalchemy.dialects.mysql import pymysql
 from sqlalchemy.orm import sessionmaker
 from sqlalchemy.ext.declarative import declarative_base
 from config import database_config
 import pandas as pd
-
+import sys
 
 class Mysql(object):
     def __init__(self):
@@ -50,9 +51,11 @@ if __name__ == '__main__':
     try:
         results = session.execute(
             text("select * from tads_brandcul_cust_order")
-            ).mappings().all()
+            ).all()
         # 将结果转换为DataFrame
-        df = pd.DataFrame(results) # 提取列名
-        print(df)
+        df = pd.DataFrame(results).drop(columns=['stat_month']) # 提取列名
+        
+        # 获取c
+        print(len(df.columns))
     finally:
         session.close()

BIN
models/__pycache__/__init__.cpython-38.pyc


BIN
models/recall/__pycache__/__init__.cpython-38.pyc


BIN
models/recall/__pycache__/itemCF.cpython-38.pyc


+ 45 - 17
models/recall/itemCF.py

@@ -10,29 +10,37 @@
 import joblib
 import pandas as pd
 import numpy as np
+from sqlalchemy import create_engine, text
+from dao.mysql_client import Mysql
+from decimal import Decimal
 
 # 算法封装成一个类
 class ItemCFModel:
     """TODO 1. 将结果保存到redis数据库中"""
     def __init__(self):
         self.weights = {
-            "MONTH6_SALE_QTY": 0.1,
-            "MONTH6_SALE_AMT": 0.1,
-            "MONTH6_GROSS_PROFIT_RATE": 0.03,
-            "MONTH6_SALE_QTY_YOY": 0.1,
-            "MONTH6_SALE_QTY_MOM": 0.1,
-            "MONTH6_SALE_AMT_YOY": 0.1,
-            "MONTH6_SALE_AMT_MOM": 0.1,
-            "ORDER_FULLORDR_RATE": 0.1,
-            "NEW_PRODUCT_ORDER_QTY_OCC": 0.03,
-            "LISTING_RATE": 0.1,
-            "OUT_STOCK_DAYS": 0.02,
-            "RETAIL_PRICE_INDEX": 0.02
+            "MONTH6_SALE_QTY": Decimal(0.1),
+            "MONTH6_SALE_AMT": Decimal(0.1),
+            "MONTH6_GROSS_PROFIT_RATE": Decimal(0.03),
+            "MONTH6_SALE_QTY_YOY": Decimal(0.1),
+            "MONTH6_SALE_QTY_MOM": Decimal(0.1),
+            "MONTH6_SALE_AMT_YOY": Decimal(0.1),
+            "MONTH6_SALE_AMT_MOM": Decimal(0.1),
+            "ORDER_FULLORDR_RATE": Decimal(0.1),
+            "NEW_PRODUCT_ORDER_QTY_OCC": Decimal(0.03),
+            "LISTING_RATE": Decimal(0.1),
+            "OUT_STOCK_DAYS": Decimal(0.02),
+            "RETAIL_PRICE_INDEX": Decimal(0.02)
         }
 
     # 均值方差归一化函数
     def standardize_column(self, column):
-        return (column - column.min()) / (column.max() - column.min())
+        if(column.max() == column.min() and column.max() == 0):
+            return 0
+        elif (column.max() == column.min() and column.max() != 0):
+            return 1
+        else:
+            return (column - column.min()) / (column.max() - column.min())
 
     # 按照品规分组归一化和计算热度值
     def calculate_heart_per_product(self, group):
@@ -42,7 +50,7 @@ class ItemCFModel:
             else:
                 group[column] = self.standardize_column(group[column])
         group["FC_SCORE"] = group.apply(
-            lambda row: sum(row[col] * weight for col, weight in self.weights.items()) * 100, axis=1
+            lambda row: sum(Decimal(row[col]) * weight for col, weight in self.weights.items()) * 100, axis=1
         )
         return group
 
@@ -64,16 +72,36 @@ class ItemCFModel:
             recomend_list.append({"keys": product_code, "value": group_values})
         
         return recomend_list
+
+def load_data_from_dataset():
+    client = Mysql()
+    # 创建会话
+    session = client.create_session()
     
+    # 使用 session 执行查询等操作
+    try:
+        results = session.execute(
+            text("select * from tads_brandcul_cust_order")
+            ).all()
+        # 将结果转换为DataFrame
+        df = pd.DataFrame(results).drop(columns=['stat_month']) # 提取列名
+        
+    finally:
+        session.close()
+        
+    return df
+ 
 if __name__ == "__main__":
     # 创建一个 ItemCF 类的实例
     item_cf_algorithm = ItemCFModel()
 
     # 读取数据
-    order_data = pd.read_csv('order.csv')
+    # order_data = pd.read_csv('order.csv')
+    order_data = load_data_from_dataset()
 
     # 调用算法
     recomand_list = item_cf_algorithm.recommend(order_data)
+    print(recomand_list)
 
-    # 序列化
-    joblib.dump(item_cf_algorithm, "item_cf.model")
+    # # 序列化
+    # joblib.dump(item_cf_algorithm, "item_cf.model")