金融接口基方法Python

python 复制代码
# encoding:utf-8
import sys,traceback,copy,time
from loguru import logger
from tqdm import tqdm
import pandas as pd
sys.path.append("..")
from QhSetting import QHJSPATH
from QhSpiderObj import QhQTSpider
from QhCsvMode import QhDBToCsv,QHQTDBJSON
from QhSpiderTool import QhDbPathJieXiIsMkdir,QhStarEndTime

@QhStarEndTime
def QhBaseInterface(QhFactionKey="QhJCJiaoYiRiLi",   # 01 主要用来获取配置
                    QhIsDf=True,                     # 02 返回df还是list 默认df
                    QhIsCsv=True,                    # 03 是否保存csv 默认保存
                    QhIsMd5 = True,                  # 04 id是否加密md5 默认加密
                    QhDateSort = "",                 # 05 日期排序字段名 只支持日子字段,默认空
                    QhPinJieName = None,             # 05 拼接文件名QhPinJieName = None, 支持多参数拼接逗号隔开;值为"交易日期"时,文件名会拼接交易日期
                    QhSdate=None,                    # 06 开始日期
                    QhType="A",                      # 07 循环获取类型  A表示按交易日期
                    QhParamsDic=None,                # 08 请求动态参数,支持url,param,payload三种方式,默认None
                    QhUrlCanShu="",                  # 09 url参数,必须是param参数内参数,否则无效,和QhParamsDic key一致 只会加到
                    QhIsJiaoYiDate=False,            # 10 是否加交易日期列表 默认不加
                    QhIsBanBenHao=False,             # 11 是否加版本号 默认不加
                    QhTongYongJson = QHQTDBJSON,     # 12 获取配置文件
                    QhShiLiSpider = QhQTSpider(),    # 13 请求对象实例化
                    QhInterfaceName = "其他网",       # 14 接口名称
                    **Qhkwargs,                      # **其他参数  可以动态传递到请求方法中
                    ):
    """
    金融接口基方法
    作者:阙辉
    """
    # QH001参数配置获取逻辑
    QhUrl = QhTongYongJson[QhFactionKey]["url"]                     # 默认URL # 01主要用来获取配置
    qh_method = QhTongYongJson[QhFactionKey].get("method",None)     # 请求方法 # 01主要用来获取配置
    qh_params = QhTongYongJson[QhFactionKey].get("params",None)     # 请求参数 # 01主要用来获取配置
    qh_payload = QhTongYongJson[QhFactionKey].get("payload",None)       # 请求参数 # 01主要用来获取配置

    fielddic = QhTongYongJson[QhFactionKey]["fielddic"]    # 结果字段 # 01主要用来获取配置

    QhUniqueValue = QhTongYongJson[QhFactionKey]["QhUniqueValue"]  # 唯一值参数获取 # 01主要用来获取配置
    QhCsvPath = QhTongYongJson[QhFactionKey]["QhCsvPath"]          # 存储路径 # 01主要用来获取配置
    QhCsvPath = QhDbPathJieXiIsMkdir(QhCsvPath,QHJSPATH)           # 存储路径检查,如果文件夹不存在则创建

    if isinstance(fielddic,dict):
        fielddic_keys = list(fielddic.keys())        # 原key
        fielddic_values = list(fielddic.values())    # 中文字段名

    QhSpiderOdj = QhShiLiSpider              # 请求对象实例化   13请求对象实例化
    QhJiaoYiDate = QhSpiderOdj.QhJiaoYiDate  # 交易日期列表
    QhSpiderOdj.qh_url = QhUrl               # 请求url传递给请求对象
    if qh_method not in [None,""]: QhSpiderOdj.qh_method = qh_method  # 请求方法 传递给请求对象

    # QH002请求逻辑
    if QhParamsDic in [None,""]:
        # QH00201请求逻辑>无动态参数传递逻辑
        if qh_params not in [None,""]: QhSpiderOdj.qh_params = qh_params  # 请求参数 url参数01
        if qh_payload not in [None,""]: QhSpiderOdj.qh_payload = qh_payload     # 请求参数 post参数01
        logger.warning("【{}请求-固定】无动态参数请求,QueHui!\n请求参数【{}】".format(QhInterfaceName,QhSpiderOdj.qh_params))
        # QhSpiderForMain 这个函数的命名必须一致
        QhJieGuoList = QhSpiderOdj.QhSpiderForMain(QhFielddicKeys=fielddic_keys,
                                                QhSdate=QhSdate,
                                                QhType=QhType,
                                                **Qhkwargs, # **其他参数
                                                )

        if QhIsDf:
            # 返回list,此函数组装df
            if len(QhJieGuoList) == 0 or QhJieGuoList in [None,""]: return
            QhJieGuoDf = pd.DataFrame(QhJieGuoList,columns=fielddic_values)
        else:
            # 返回df
            QhJieGuoDf = QhJieGuoList
    else:
        # QH00202请求逻辑>有动态参数传递逻辑

        # 动态参数,参数可变 设计说明 阙辉
        # QhParamsDic = {
        # "QhKey" : "请求参数01|请求参数02^|...",   # QhValue 的参数值位置要对应 ^表示是qh_proxy的动态参数
        # "QhFied" : "存储字段名01|存储字段名02|..",  # QhValue 的存储值位置要对应
        # "QhValue":{"请求参数值01|请求参数值02|...":"存储字段值01|存储字段值02|..."},}
        #  当QhKey与QhUrlCanShu01相等时,参数就是url参数 url多参数的情况通过","隔开分割 例:"参数01,参数02,..."

        QhI=0
        QhKeyList= QhParamsDic["QhKey"].split("|")
        QhFiedList= QhParamsDic["QhFied"].split("|")
        QhParamsDicVal = QhParamsDic["QhValue"]
        QhReqLen = len(QhParamsDicVal.items())  # 获取动态参数的总数量 即请求次数
        # QhPbar = tqdm(total=len(QhParamsDicVal.items()))
        # QhPbar.set_description("【{}请求-进度条】".format(QhInterfaceName))
        for QhKey,QhValue in QhParamsDicVal.items():
            QhUrl01 = copy.deepcopy(QhUrl)
            QhKeyListv = QhKey.split("|")
            QhFiedListv = QhValue.split("|")
            for i,QhRow in enumerate(QhKeyListv):
                QhCanShuKey = QhKeyList[i]
                QhCanShuValue = QhRow
                if "^" in QhCanShuKey: 
                    # ^符号代表是payload参数 post请求参数
                    QhCanShuKey = QhCanShuKey.replace("^","")  # 去掉^符号,^一般放在参数最后,代表是payload参数
                    qh_payload[QhCanShuKey] = QhCanShuValue
                elif QhUrlCanShu == QhCanShuKey and "{}" in QhUrl01:
                    # 财联社url内部参数添加  已支持多参数传递,但是需要顺序一致 阙辉
                    # 目前已解决  支持url多个参数拼接
                    QhCanShuValue = QhCanShuValue.split(",")  # 多个参数拼接是由","隔开,然后再切分成列表
                    QhUrl01 = QhUrl01.format(*QhCanShuValue)  # 组装url
                    QhSpiderOdj.qh_url = QhUrl01              # 重新赋值url到请求对象 只能赋值一次 所以直接赋值对象
                else:
                    # params参数 主要是get请求的参数
                    qh_params[QhCanShuKey] = QhCanShuValue

            if qh_params not in [None,""]: QhSpiderOdj.qh_params = qh_params  # 请求参数 url参数02
            if qh_payload not in [None,""]: QhSpiderOdj.qh_proxy = qh_payload     # 请求参数 post参数02
            QhReqsCount = QhI + 1
            logger.warning("【{}请求-动态】第[{}]次请求,有动态参数,共[{}]次请求,QueHui!\n请求参数【{}】".format(QhInterfaceName,
                                                                                      QhReqsCount,QhReqLen,
                                                                                      QhSpiderOdj.qh_params))
            # QhSpiderForMain 这个函数的命名必须一致
            QhJieGuoList=QhSpiderOdj.QhSpiderForMain(QhFielddicKeys=fielddic_keys,
                                                QhSdate=QhSdate,
                                                QhType=QhType,
                                                **Qhkwargs, # **其他参数
                                                )
            # QhPbar.update(1)
            if QhIsDf:
                # 返回list,此函数组装df
                if len(QhJieGuoList) == 0 or QhJieGuoList in [None,""]: continue
                QhJieGuoDfRow = pd.DataFrame(QhJieGuoList,columns=fielddic_values)

                for i,QhRow in enumerate(QhFiedListv):
                    # 动态参数存储字段值增加到pandas对象中
                    # 字段名不为空的时候才赋值新的列,否则不赋值 
                    if QhFiedList[i] != "":QhJieGuoDfRow[QhFiedList[i]] = QhRow

                # 合并多次请求的数据
                if QhI == 0:
                    QhJieGuoDf = QhJieGuoDfRow
                else:
                    QhJieGuoDf = pd.concat([QhJieGuoDf,QhJieGuoDfRow],axis=0, ignore_index=True)
            else:
                # 返回List  
                # 合并多次请求的数据 不会做存储处理,直接返回list
                if QhI == 0:
                    QhJieGuoDfList = QhJieGuoList
                else:
                    QhJieGuoDfList = QhJieGuoDfList + QhJieGuoList

            QhI+=1   # 计数器+1
            
    # QH003请求结束后的处理逻辑 阙辉
    if QhIsDf:
        # QH00301数据处理逻辑 阙辉
        if QhIsJiaoYiDate: QhJieGuoDf["交易日期"] = QhJiaoYiDate[2]   # 添加交易日期
        if QhIsBanBenHao: QhJieGuoDf["版本号"] = "Q{}".format(time.strftime("%Y%m%d%H%M%S",time.localtime()))  # 添加版本号

        # QH00302文件名和路径处理逻辑 阙辉
        QhCsvName0 = copy.deepcopy(QhTongYongJson[QhFactionKey]["QhCsvName"])   # 01主要用来获取配置
        # 表格名拼接可以考虑放在是否存储后添加,
        if "{}" in QhCsvName0 and QhPinJieName not in [None]:
            # 判断表名是否需要加股票代码
            # 需要加股票代码
            # symbol = QhSpiderOdj.qh_params["symbol"]
            QhCsvNameA = copy.deepcopy(QhCsvName0)
            if QhPinJieName in ["交易日期"]:
                # 交易日期拼接到文件名  仅拼接交易日期,其他参数不拼接
                QhJiaoYiDate00 = QhJiaoYiDate[2]
                QhCsvNameA = QhCsvNameA.format(QhJiaoYiDate00.replace("-",""))
            else:
                if QhPinJieName not in [None]:
                    if "." in QhPinJieName: QhPinJieName = QhPinJieName.replace(".","_")  # 替换文件名中的点
                QhPinJieName = QhPinJieName.split(",")         # 多个参数拼接是由","隔开,然后再切分成列表
                QhCsvNameA = QhCsvNameA.format(*QhPinJieName)  # 支持多个参数拼接 但是位置要一致
            QhCsvPath = "{}\{}".format(QhCsvPath,QhCsvNameA)
        else:
            # 不需要加股票代码
            QhCsvPath = "{}\{}".format(QhCsvPath,QhCsvName0)
            
        # QH00303数据存储处理逻辑 阙辉
        if QhIsCsv:
            # QhJieGuoDf = QhDBToCsv(QhCsvPath,
            QhDBToCsv(QhCsvPath,
                    QhUniqueValue,
                    QhJieGuoDf=QhJieGuoDf,
                    QhDateSort=QhDateSort,
                    QhIsCsv=QhIsCsv,
                    QhIsMd5=QhIsMd5) 
    else:
        # 返回List  
        # 合并多次请求的数据 不会做存储处理,直接返回list  阙辉
        QhJieGuoDf = QhJieGuoDfList

    return QhJieGuoDf

if __name__ == '__main__':
    
    pass

本文介绍了一个名为QhDFBaseInterface的金融接口基方法,主要用于获取金融数据并处理。该方法支持多种配置选项,如返回数据类型(DataFrame或List)、是否保存为CSV文件、是否对ID进行MD5加密等。通过动态参数传递,可以灵活处理不同的请求逻辑,包括URL参数、POST参数等。方法还支持交易日期、版本号等字段的自动添加,并提供了文件名拼接功能。最终,数据可以存储为CSV文件或直接返回。该方法的设计旨在简化金融数据的获取与处理流程,适用于多种金融数据接口的调用场景。

相关推荐
知乎的哥廷根数学学派4 小时前
面向可信机械故障诊断的自适应置信度惩罚深度校准算法(Pytorch)
人工智能·pytorch·python·深度学习·算法·机器学习·矩阵
且去填词4 小时前
DeepSeek :基于 Schema 推理与自愈机制的智能 ETL
数据仓库·人工智能·python·语言模型·etl·schema·deepseek
人工干智能4 小时前
OpenAI Assistants API 中 client.beta.threads.messages.create方法,兼谈一星*和两星**解包
python·llm
databook4 小时前
当条形图遇上极坐标:径向与圆形条形图的视觉革命
python·数据分析·数据可视化
猫头虎5 小时前
如何在浏览器里体验 Windows在线模拟器:2026最新在线windows模拟器资源合集与技术揭秘
运维·网络·windows·系统架构·开源·运维开发·开源软件
阿部多瑞 ABU5 小时前
`chenmo` —— 可编程元叙事引擎 V2.3+
linux·人工智能·python·ai写作
acanab5 小时前
VScode python插件
ide·vscode·python
知乎的哥廷根数学学派6 小时前
基于生成对抗U-Net混合架构的隧道衬砌缺陷地质雷达数据智能反演与成像方法(以模拟信号为例,Pytorch)
开发语言·人工智能·pytorch·python·深度学习·机器学习
WangYaolove13146 小时前
Python基于大数据的电影市场预测分析(源码+文档)
python·django·毕业设计·源码
知乎的哥廷根数学学派6 小时前
基于自适应多尺度小波核编码与注意力增强的脉冲神经网络机械故障诊断(Pytorch)
人工智能·pytorch·python·深度学习·神经网络·机器学习