# encoding:utf-8
import sys,os,copy,traceback
import pandas as pd
sys.path.append("..")
from QhSetting import QHJSPATH
from QhCsvMode import *
# 【数据建模】此模块主要用于数据统一建模
# 统一字段名 统一字段类型 统一数据单位 统一数据格式
# 作者:阙辉
def QhReadCsv(QhJsonDb,QhFactionKey,QhCsvPath,QhCsvName,QhScode="Q000001"):
QhCsvPath = QhJsonDb[QhFactionKey][QhCsvPath]
QhCsvPath = QhDbPathJieXiIsMkdir(QhCsvPath,QHJSPATH)
QhCsvName = QHDFDBJSON[QhFactionKey][QhCsvName]
if "{}" in QhCsvName: QhCsvName = QhCsvName.format(QhScode)
QhCsvPath = "{}\{}".format(QhCsvPath,QhCsvName)
QhCsvDf = pd.read_csv(QhCsvPath,encoding='gbk',low_memory=False)
return QhCsvDf
def QhChangeDataType(QhJieGuoDf,QhFileds,QhType=float):
QhDfData_columns=QhJieGuoDf.columns.tolist()
if not isinstance(QhFileds,list):
QhFileds = [QhFileds]
for QhRow in QhFileds:
try:
if QhRow not in QhDfData_columns: continue
QhFiled = QhRow
QhJieGuoDf[QhFiled] = QhJieGuoDf[QhFiled].replace("-", "0")
QhJieGuoDf[QhFiled] = pd.to_numeric(QhJieGuoDf[QhFiled], errors='coerce') # 非数值字符串转换为NaN
QhJieGuoDf[QhFiled] = QhJieGuoDf[QhFiled].replace("",0)
QhJieGuoDf[QhFiled] = QhJieGuoDf[QhFiled].fillna(0)
QhJieGuoDf[QhFiled] = QhJieGuoDf[QhFiled].astype(QhType)
except:
QhErrMsg = traceback.format_exc()
print(QhErrMsg)
return QhJieGuoDf
def QhStockHisJiaoYiModel(QhScode="Q000001",QhFrom="DF",QhShiChang="深交所A股",QhZhouQi="日",QhFuQuan="前复权"):
"""
历史交易数据模型标准化
作者:阙辉
:param QhScode: Q股票代码
:param QhFrom: 数据来源
:param QhShiChang: 市场板块
:param QhZhouQi: 周期
:param QhFuQuan: 复权
:return: QSCODE|Q股票代码,TD|交易日期,OPEN|开盘价|元,CLOSE|收盘价|元,HIGH|最高价|元,LOW|最低价|元,
VOL|成交量|笔,AMOUNT|成交额|元,ZDF|涨跌幅|小数,ZDE|涨跌额|元,
ZF|振幅|小数,HSL|换手率|小数,ZQ|周期,FQ|复权,FROM|数据来源
"""
# 结果数据初始化
QhJieGuoDf = pd.DataFrame()
# 复权类型字典 标准
QhfltDicPbli = {"前复权": "B", "后复权": "C", "不复权": "A"}
# 周期类型字典 标准
QhkltDicPbli = {"日": "D", "周": "W", "月": "M", "季度": "Q", "半年": "HY", "年": "Y"} # 周期类型
if QhFrom=="DF": # 东方财富
# 复权类型字典
QhfltDic = {"前复权":"1","后复权":"2","不复权":"0"}
# 周期类型字典
QhkltDic = {"日":"101","周":"102","月":"103","季度":"104","半年":"105","年":"106"} # 周期类型
QhDfCoulmnsFloat = ["收盘","开盘","最高","最低","成交量","成交额","涨跌幅","涨跌额","振幅","换手率",] # 待转浮点型数值的字段
QhFuQuanBZ = QhfltDicPbli[QhFuQuan] # 标准复权
QhZhouQiBZ = QhkltDicPbli[QhZhouQi] # 标准周期
QhFuQuandf = QhfltDic[QhFuQuan] # 东方复权
QhZhouQidf = QhkltDic[QhZhouQi] # 东方周期
# 读取文件
QhReadDf = QhReadCsv(QhJsonDb = QHDFDBJSON,
QhFactionKey = "QhDFStockHisJiaoYiFlow",
QhCsvPath = "QhCsvPath",
QhCsvName = "QhCsvName",
QhScode = QhScode,
)
# 过滤数据
QhReadGuoLvDf = QhReadDf[(QhReadDf["周期代码"] == int(QhZhouQidf)) & (QhReadDf["复权代码"] == int(QhFuQuandf))]
# 数值转换
QhReadGuoLvDf = QhChangeDataType(QhReadGuoLvDf,QhDfCoulmnsFloat,QhType=float)
# 数据模型标准化
QhJieGuoDf["QSCODE"] = QhReadGuoLvDf["Q股票代码"]
QhJieGuoDf["TD"] = QhReadGuoLvDf["交易日期"] # YYYY-MM-DD
QhJieGuoDf["OPEN"] = QhReadGuoLvDf["开盘"] # 单位:元
QhJieGuoDf["CLOSE"] = QhReadGuoLvDf["开盘"] # 单位:元
QhJieGuoDf["HIGH"] = QhReadGuoLvDf["最高"] # 单位:元
QhJieGuoDf["LOW"] = QhReadGuoLvDf["最低"] # 单位:元
QhJieGuoDf["ZCLOSE"] = QhJieGuoDf["CLOSE"].shift(1) # 单位:元
QhJieGuoDf["VOL"] = QhReadGuoLvDf["成交量"]*100 # 单位:笔
QhJieGuoDf["AMOUNT"] = QhReadGuoLvDf["成交额"] # 单位:元
QhJieGuoDf["ZDF"] = QhReadGuoLvDf["涨跌幅"]/100 # 单位:小数
QhJieGuoDf["ZDE"] = QhReadGuoLvDf["涨跌额"] # 单位:元
QhJieGuoDf["ZF"] = QhReadGuoLvDf["振幅"]/100 # 单位:小数
QhJieGuoDf["HSL"] = QhReadGuoLvDf["换手率"]/100 # 单位:小数
QhJieGuoDf["JYBK"] = QhShiChang # 交易板块 待完善
QhJieGuoDf["ZQ"] = QhZhouQiBZ
QhJieGuoDf["FQ"] = QhFuQuanBZ
QhJieGuoDf["FROM"] = QhFrom
print(QhJieGuoDf)
return QhJieGuoDf
if __name__ == '__main__':
QhHisModel(QhScode="Q000001", QhFrom="DF", QhShiChang="深交所A股", QhZhouQi="日", QhFuQuan="前复权")
pass