用DBeaver连接本地数据库进行数据筛选

目标:依次找到2023-01-03到2023-08-23之间的、不同标准期限的、债券类别为国债的、当天成交笔数最大的债券相关信息(剩余期限、债券简称、债券代码、成交笔数)。

表格信息如下:

用DBeaver连接本地数据库进行数据筛选

下面将演示全过程:

首先打开DBeaver软件,连接本地数据库mysql,(其他数据库要用到公司局域网,连不上去,只能自己创建一个本地数据库),点击左上角任务栏数据库(D),连接MYSQL:

用DBeaver连接本地数据库进行数据筛选 

 前面几篇文章讲过怎么连接了,这里不再赘述,

用DBeaver连接本地数据库进行数据筛选

 ,下面将演示原始数据:

用DBeaver连接本地数据库进行数据筛选

用DBeaver连接本地数据库进行数据筛选

 首先需要对原始数据进行处理,把不同表格数据进行拼接在一个文件里面,最重要的是要把文件格式改成’utf-8’格式,不然在DB里面无法读取数据,具体步骤如下:

import pandas as pd
df1=pd.read_excel(r'C:\Users\59980\Desktop\peixun\zong\债券区间日行情-1.1~3.31.xlsx')
df2=pd.read_excel(r'C:\Users\59980\Desktop\peixun\zong\债券区间日行情-4.1~6.30.xlsx')
df3=pd.read_excel(r'C:\Users\59980\Desktop\peixun\zong\债券区间日行情-7.1~8.23.xlsx')
result = pd.concat([df1,df2,df3],axis=0,ignore_index=True)
result = result.sort_values(by='TRADE_DATE')
result.to_csv(r'C:\Users\59980\Desktop\peixun\zong\债券区间日行情_zong.csv',encoding='utf-8', index=False)

 先读取3个文档,然后按行拼接数据,再按日期进行排序,原始数据是很乱的,有可能倒序,最后输出成csv格式,输出后的格式为:25000多行,

用DBeaver连接本地数据库进行数据筛选

 重要提示:最好是在把数据文档爬取下来后就对列名进行修改,改成对应中文的英文,一眼就能看懂得那种,后续在数据库创建表的时候会用到此处创建的列名,也就是说,数据导入到数据库的时候表名和本地数据表格 “债券区间日行情_zong.csv”的列名要相同,否则导入时会生成新的列,很麻烦。eg:

用DBeaver连接本地数据库进行数据筛选

对数据处理完毕后,现在在DB的本地数据库mysql里面你创建的数据库 datebases 里面创建新表:我的是mysql下面lite:

用DBeaver连接本地数据库进行数据筛选

 点击左上角的SQL——新建脚本 会生成脚本,在脚本里面输入:

CREATE TABLE lite.bond_transaction_daily_1 (
    ID INT,
    TRADE_DATE DATE,
    TRADE_CODE VARCHAR(50),
    BOND_NAME VARCHAR(50),
    ISSUER VARCHAR(50),
    REMAINING_TERM DECIMAL(10,2),
    TRADE_SOURCE VARCHAR(50),
    WEIGHTED_YTM DECIMAL(10,2),
    WEIGHTED_YTE DECIMAL(10,2),
    WEIGHTED_YIELD DECIMAL(10,2),
    WEIGHTED_PRICE DECIMAL(10,2),
    TRADE_COUNT INT,
    TRADE_VOLUME INT,
    TRADE_AMOUNT DECIMAL(10,2),
    CLOSING_YTM DECIMAL(10,2),
    CLOSING_YTE DECIMAL(10,2),
    CLOSING_YIELD_WIND DECIMAL(10,2),
    CLOSING_DEVIATION DECIMAL(10,2),
    CLOSING_MARKET_PRICE DECIMAL(10,2),
    DURATION DECIMAL(10,2),
    CONVEXITY DECIMAL(10,2),
    MAX_YIELD DECIMAL(10,2),
    MIN_YIELD DECIMAL(10,2),
    WEIGHTED_AVERAGE_YIELD DECIMAL(10,2),
    OPENING_YIELD DECIMAL(10,2),
    CLOSING_YIELD DECIMAL(10,2),
    MAX_CLEAN_PRICE DECIMAL(10,2),
    MIN_CLEAN_PRICE DECIMAL(10,2),
    WEIGHTED_AVERAGE_CLEAN_PRICE DECIMAL(10,2),
    OPENING_CLEAN_PRICE DECIMAL(10,2),
    CLOSING_CLEAN_PRICE DECIMAL(10,2),
    MAX_FULL_PRICE DECIMAL(10,2),
    MIN_FULL_PRICE DECIMAL(10,2),
    WEIGHTED_AVERAGE_FULL_PRICE DECIMAL(10,2),
    OPENING_FULL_PRICE DECIMAL(10,2),
    CLOSING_FULL_PRICE DECIMAL(10,2),
    ISSUE_COUPON_RATE DECIMAL(10,2),
    INTEREST_RATE_TYPE VARCHAR(50),
    BOND_RATING VARCHAR(50),
    ISSUER_RATING VARCHAR(50),
    SPECIAL_TERMS VARCHAR(50),
    BOND_TYPE VARCHAR(50),
    MARKET VARCHAR(50),
    ISSUE_DATE DATE
);

 创建一个名称为bond_transaction_daily_1的表,表的列名和表格的列名一致,点一下lite右键点击 refresh 会看到lite——表下面出现bond_transaction_daily_1的表,同时表为空:

用DBeaver连接本地数据库进行数据筛选

 

用DBeaver连接本地数据库进行数据筛选

现在点击bond_transaction_daily_1——右键——导入数据:

用DBeaver连接本地数据库进行数据筛选

 在新窗口一直点next即可,选中刚才要导入的数据 _zong.csv:

用DBeaver连接本地数据库进行数据筛选

 最后点proceed,加载数据,导入完成后表的数据如图:

用DBeaver连接本地数据库进行数据筛选

 如果表的列名和表格的列名不一致会发生(如列名ID不一致,表的列名为ID,表格列名为:“代码”),ID列为NULL,且在表的最后一列会生成“代码”一列,后面做运算极其麻烦,要规避这种情况,到这里数据导入部分结束了。

下面就要对数据进行处理了,首先需要创建目标表,表的形式如下,用于存储债券相关信息:

CREATE TABLE info_table (
    TRADE_DATE DATE,
    standard_term VARCHAR(50),
    start_remaining_term DECIMAL(10,4),
    end_remaining_term DECIMAL(10,4),
    BOND_TYPE VARCHAR(50),
    REMAINING_TERM DECIMAL(10,2),
    TRADE_CODE VARCHAR(50),
    BOND_NAME VARCHAR(50),
    TRADE_COUNT DECIMAL(10,2)

);

select * from info_table;

用DBeaver连接本地数据库进行数据筛选

 下面就要对数据进行处理了:

相关的其他SQL语句会经常用到:

drop PROCEDURE insert_table;--删除存储过程

drop table info_table ;--删除信息表


select * from info_table;--查看信息表


SHOW PROCEDURE STATUS;--展示存储过程状态

对数据处理的逻辑如下:

首先我要筛选日期,把当天的日期提取出来,然后我要筛选国债,其他债券不要,接着要筛选剩余期限在对应期限内的债券,最后要对成交笔数做排序,仅提取成交笔数最大的那个债券:

查询符合 REMAINING_TERM 范围的债券相关信息,并插入到 info_table 表中:

CREATE PROCEDURE insert_table()-- 创建存储过程
begin-- 声明变量
    DECLARE v_current_date DATE DEFAULT '2023-01-03';-- 开始时间
    DECLARE v_end_date DATE DEFAULT '2023-08-23';-- 结束时间
    DECLARE i INT DEFAULT 1;-- 遍历的辅助变量
    declare v_standard_term VARCHAR(50);-- 标准期限的辅助变量
    DECLARE v_remaining_term_min DECIMAL(10, 4);-- 剩余期限的上限
    DECLARE v_remaining_term_max DECIMAL(10, 4);-- 剩余期限的下限
-- 外循环,遍历所有要找的日期
    WHILE v_current_date <= v_end_date DO

        SET i = 1;-- 初始化辅助变量,标准期限的辅助变量

        WHILE i  v_remaining_term_min AND REMAINING_TERM  v_remaining_term_min AND REMAINING_TERM <= v_remaining_term_max
                AND BOND_TYPE = '国债'
                AND start_remaining_term IS NULL; -- 仅更新未被更新过的记录

            SET i = i + 1;-- 对每种标准期限进行遍历,
        END WHILE;

        SET v_current_date = DATE_ADD(v_current_date, INTERVAL 1 DAY);-- 对日期进行处理,外部循环结束
    END WHILE;
END

运行好后如下图:

用DBeaver连接本地数据库进行数据筛选

 可以看到存储过程被定义了,在对应的过程里面:

SHOW PROCEDURE STATUS;

用DBeaver连接本地数据库进行数据筛选

 下面都处理好后调用存储过程:

CALL insert_table();

25000多条数据会有点慢,看个人的处理器性能,期间可以打一把游戏:

用DBeaver连接本地数据库进行数据筛选

 完成后结果如下:用DBeaver连接本地数据库进行数据筛选

查看info_table里面债券的相关信息:

用DBeaver连接本地数据库进行数据筛选

然后点击下方的导出数据:

用DBeaver连接本地数据库进行数据筛选 

依次点击next即可:成功后:

用DBeaver连接本地数据库进行数据筛选 

查看相应导出的表格,与目标表格对比没什么毛病:

用DBeaver连接本地数据库进行数据筛选 

做个检查:看是否正确:

 导出的数据表08-17、30Y期限成交笔数最大的目标债券信息为:用DBeaver连接本地数据库进行数据筛选

 对原始数据表格进行筛选发现:

1、

用DBeaver连接本地数据库进行数据筛选

 2、用DBeaver连接本地数据库进行数据筛选

 3、

用DBeaver连接本地数据库进行数据筛选

 结果:

用DBeaver连接本地数据库进行数据筛选

与SQL查找的数据相同,没问题。 

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/72422dd6d9.html