mysql_dao.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. from database import MySqlDatabaseHelper
  2. from sqlalchemy import text
  3. import pandas as pd
  4. class MySqlDao:
  5. _instance = None
  6. def __new__(cls):
  7. if not cls._instance:
  8. cls._instance = super(MySqlDao, cls).__new__(cls)
  9. cls._instance._initialized = False
  10. return cls._instance
  11. def __init__(self):
  12. if self._initialized:
  13. return
  14. self.db_helper = MySqlDatabaseHelper()
  15. self._product_tablename = "tads_brandcul_product_info"
  16. self._cust_tablename = "tads_brandcul_cust_info"
  17. self._order_tablename = "tads_brandcul_cust_order"
  18. self._mock_order_tablename = "yunfu_mock_data"
  19. # self._shopping_tablename = "tads_brandcul_cust_info_lbs"
  20. self._shopping_tablename = "yunfu_shopping_mock_data"
  21. self._initialized = True
  22. def load_product_data(self, city_uuid):
  23. """从数据库中读取商品信息"""
  24. query = f"SELECT * FROM {self._product_tablename} WHERE city_uuid = :city_uuid"
  25. params = {"city_uuid": city_uuid}
  26. data = self.db_helper.load_data_with_page(query, params)
  27. return data
  28. def load_cust_data(self, city_uuid):
  29. """从数据库中读取商户信息"""
  30. query = f"SELECT * FROM {self._cust_tablename} WHERE BA_CITY_ORG_CODE = :city_uuid"
  31. params = {"city_uuid": city_uuid}
  32. data = self.db_helper.load_data_with_page(query, params)
  33. return data
  34. def load_order_data(self, city_uuid):
  35. """从数据库中读取订单信息"""
  36. query = f"SELECT * FROM {self._order_tablename} WHERE city_uuid = :city_uuid"
  37. params = {"city_uuid": city_uuid}
  38. data = self.db_helper.load_data_with_page(query, params)
  39. data.drop('stat_month', axis=1, inplace=True)
  40. data.drop('city_uuid', axis=1, inplace=True)
  41. # 去除重复值和填补缺失值
  42. data.drop_duplicates(inplace=True)
  43. data.fillna(0, inplace=True)
  44. data = data.infer_objects(copy=False)
  45. return data
  46. def load_mock_order_data(self):
  47. """从数据库中读取mock的订单信息"""
  48. query = f"SELECT * FROM {self._mock_order_tablename}"
  49. data = self.db_helper.load_data_with_page(query, {})
  50. # 去除重复值和填补缺失值
  51. data.drop_duplicates(inplace=True)
  52. data.fillna(0, inplace=True)
  53. data = data.infer_objects(copy=False)
  54. return data
  55. def load_shopping_data(self, city_uuid):
  56. """从数据库中读取商圈数据"""
  57. query = f"SELECT * FROM {self._shopping_tablename} WHERE city_uuid = :city_uuid"
  58. params = {"city_uuid": city_uuid}
  59. data = self.db_helper.load_data_with_page(query, params)
  60. return data
  61. def get_cust_list(self, city_uuid):
  62. """获取商户列表"""
  63. data = self.load_cust_data(city_uuid)
  64. cust_list = data["BB_RETAIL_CUSTOMER_CODE"].to_list()
  65. if len(cust_list) == 0:
  66. return []
  67. return cust_list
  68. def get_product_by_id(self, city_uuid, product_id):
  69. """根据city_uuid 和 product_id 从表中获取拼柜信息"""
  70. query = text(f"""
  71. SELECT *
  72. FROM {self._product_tablename}
  73. WHERE city_uuid = :city_uuid
  74. AND product_code = :product_id
  75. """)
  76. params = {"city_uuid": city_uuid, "product_id": product_id}
  77. data = self.db_helper.fetch_one(query, params)
  78. return data
  79. def get_cust_by_ids(self, city_uuid, cust_id_list):
  80. """根据零售户列表查询其信息"""
  81. if not cust_id_list:
  82. return None
  83. cust_id_str = ",".join([f"'{cust_id}'" for cust_id in cust_id_list])
  84. query = text(f"""
  85. SELECT *
  86. FROM {self._cust_tablename}
  87. WHERE BA_CITY_ORG_CODE = :city_uuid
  88. AND BB_RETAIL_CUSTOMER_CODE IN ({cust_id_str})
  89. """)
  90. params = {"city_uuid": city_uuid}
  91. data = self.db_helper.fetch_all(query, params)
  92. return data
  93. def data_preprocess(self, data: pd.DataFrame):
  94. data.drop(["cust_uuid", "longitude", "latitude", "range_radius"], axis=1, inplace=True)
  95. remaining_cols = data.columns.drop(["city_uuid", "cust_code"])
  96. col_with_missing = remaining_cols[data[remaining_cols].isnull().any()].tolist() # 判断有缺失的字段
  97. col_all_missing = remaining_cols[data[remaining_cols].isnull().all()].to_list() # 全部缺失的字段
  98. col_partial_missing = list(set(col_with_missing) - set(col_all_missing)) # 部分缺失的字段
  99. for col in col_partial_missing:
  100. data[col] = data[col].fillna(data[col].mean())
  101. for col in col_all_missing:
  102. data[col] = data[col].fillna(0).infer_objects(copy=False)
  103. if __name__ == "__main__":
  104. dao = MySqlDao()
  105. city_uuid = "00000000000000000000000011445301"
  106. # city_uuid = "00000000000000000000000011441801"
  107. cust_id_list = ["441800100006", "441800100051", "441800100811"]
  108. cust_list = dao.load_mock_order_data()