昨日稍微介绍了为什麽要取得这些资料,今天来实作取得资料,并且写入Table LegalDailyFutureOption
!
今天会从期交所取得:三大法人-区分期货与选择权二类-依日期的资料。
本日程序码使用:d6_3LegalPersonTrade.py
我们可以下载csv档:
https://www.taifex.com.tw/data_gov/taifex_open_data.asp?data_name=MarketDataOfMajorInstitutionalTradersDividedByFuturesAndOptionsBytheDate
观察一下我们的内容,我们会需要用到全部的资料,因此把这些资料全部列到资料库中。这些资料分别为:
因此资料库的SQL码会是:
CREATE TABLE `finance`.`LegalDailyFutureOption` (
`ID` INT NOT NULL AUTO_INCREMENT,
`TradeDate` DATE NOT NULL,
`TradeGroup` VARCHAR(10) NOT NULL,
`FutureLongQty` INT NOT NULL DEFAULT 0,
`OptionLongQty` INT NOT NULL DEFAULT 0,
`FutureLongAmount` INT NOT NULL DEFAULT 0,
`OptionLongAmount` INT NOT NULL DEFAULT 0,
`FutureShortQty` INT NOT NULL DEFAULT 0,
`OptionShortQty` INT NOT NULL DEFAULT 0,
`FutureShortAmount` INT NOT NULL DEFAULT 0,
`OptionShortAmount` INT NOT NULL DEFAULT 0,
`FutureNetQty` INT NOT NULL DEFAULT 0,
`OptionNetQty` INT NOT NULL DEFAULT 0,
`FutureNetAmount` INT NOT NULL DEFAULT 0,
`OptionNetAmount` INT NOT NULL DEFAULT 0,
`FutureLongOIQty` INT NOT NULL DEFAULT 0,
`OptionLongOIQty` INT NOT NULL DEFAULT 0,
`FutureLongOIAmount` INT NOT NULL DEFAULT 0,
`OptionLongOIAmount` INT NOT NULL DEFAULT 0,
`FutureShortOIQty` INT NOT NULL DEFAULT 0,
`OptionShortOIQty` INT NOT NULL DEFAULT 0,
`FutureShortOIAmount` INT NOT NULL DEFAULT 0,
`OptionShortOIAmount` INT NOT NULL DEFAULT 0,
`FutureOINetQty` INT NOT NULL DEFAULT 0,
`OptionOINetQty` INT NOT NULL DEFAULT 0,
`FutureOINetAmount` INT NOT NULL DEFAULT 0,
`OptionOINetAmount` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`));
其中把数量、金额全部预设为0
,并且不提供空值,这样资料比较乾净,不必额外处理异常数值状况,直接排除0
就可以。
资料表准备好,接着就是写入资料。
本次作法是把这个功能变成一个单独的物件,因此建立一个名为legal_daily_future_option
的class
。并且提供属性,让後面比较方便取得资料:
self.title = "三大法人-区分期货与选择权二类-依日期"
self.url = "https://www.taifex.com.tw/data_gov/taifex_open_data.asp?data_name=MarketDataOfMajorInstitutionalTradersDividedByFuturesAndOptionsBytheDate"
self.df = None # 把资料从csv转乘datframe
self.csv = self.get_csv_data() # 取得网路上的资料,格式为csv
其中url
保留弹性,万一网址修改了还可以使用参数法去改。
在政府提供的资料格式为:csv
,因此建立一个get_csv_data
的功能来取得服务器中的资料,把它存成csv
和dataframe
。虽然csv这次没有用到,但这可以抓到资料後直接存成一个csv档,当做资料备源,例如当格式改掉後,还有个参考依据,并补汇入资料。
因此主要的功能会在这边:
try:
csv = requests.get(self.url)
df = pandas.read_csv(StringIO(csv.text)) # 有header
print(df) # debug
self.df = df
except Exception as exc:
print(exc)
return False
这部份跟之前类似,就不多说明。
这次把连结单独拉出来,成为一个模组。这样不用每次与资料库连结时,都写一样的参数和方法,可直接呼叫使用,或是修改资料库资讯,以後如果要使用Azure或是搬到其他地方,也可以直接修改这个模组,而不用动到其他程序。(我这就是滚动式进步XD)
因此建立一个叫做db_connect.py
的档案,里面建立之前的MySQL连线:
import pymysql
class mysql_connect:
def __init__(self) -> None:
self.db_settings = {
"host": "127.0.0.1",
"port": 3306,
"user": "root",
"password": "pwd",
"db": "finance",
}
def connect(self):
conn = pymysql.connect(**self.db_settings)
return conn
就这样简简单单的完成。记住"password": "pwd"
这边要输入自己的密码,其他资料也是输入自己的连线资讯喔!
接着就是在原本的模组中,建立一个功能,用来把资料汇入MySQL中:
def insert_mysql(self) -> bool:
# 计数器:计算新增了几笔
counter = 0
try:
# 建立connection物件
my_connt_obj = db_connect.mysql_connect()
conn = my_connt_obj.connect()
with conn.cursor() as cursor:
# 新增SQL语法
for _, row in self.df.iterrows():
trade_date = str(row[0])
cmd = f"""INSERT INTO LegalDailyFutureOption
(TradeDate, TradeGroup,
FutureLongQty, OptionLongQty,
FutureLongAmount, OptionLongAmount,
FutureShortQty, OptionShortQty,
FutureShortAmount, OptionShortAmount,
FutureNetQty, OptionNetQty,
FutureNetAmount, OptionNetAmount,
FutureLongOIQty, OptionLongOIQty,
FutureLongOIAmount, OptionLongOIAmount,
FutureShortOIQty, OptionShortOIQty,
FutureShortOIAmount, OptionShortOIAmount,
FutureOINetQty, OptionOINetQty,
FutureOINetAmount, OptionOINetAmount)
values('{"{}-{}-{}".format(trade_date[:4],trade_date[4:6],trade_date[6:])}',
'{row[1]}',
{row[2]}, {row[3]},
{row[4]}, {row[5]},
{row[6]}, {row[7]},
{row[8]}, {row[9]},
{row[10]}, {row[11]},
{row[12]}, {row[13]},
{row[14]}, {row[15]},
{row[16]}, {row[17]},
{row[18]}, {row[19]},
{row[20]}, {row[21]},
{row[22]}, {row[23]},
{row[24]}, {row[25]});"""
cursor.execute(cmd)
counter += 1
conn.commit()
except Exception as exc:
print(exc)
return False
print(f"===Finish: {counter}==")
return True
最後执行他,就大功告成罗~
会显示的结果如下:
日期 身份别 期货多方交易口数 选择权多方交易口数 期货多方交易契约金额(千元) ... 选择权空方未平仓契约金额(千元) 期货多空未平仓口数净额 选择权多空未平仓口数净额 期货多空未平仓契约金额净额(千元) 选择权多空未平仓契约金额净额(千元)
0 20210906 自营商 41537 247258 46023473 ... 824397 6922 24371 31180664 343273
1 20210906 投信 27 2 76092 ... 0 2417 62 3763399 61
2 20210906 外资及陆资 380498 140362 372794596 ... 986546 -230431 -38464 -111817854 -499753
[3 rows x 26 columns]
===Finish: 3==
True
这篇以为一下子就可以完成,殊不知写了很多。不过,还是无法使用网友提供建议的pandas
的to_sql
功能,等之後学会再导入吧!
终於到了倒数第二天 现在一直在努力的写前後端的程序码跟串接 在前端 RxDB 中有一些 Middle...
CSS选择器 接续这上篇 选择器也可以多重选择多个元素 像是 h1,th {color:brown}...
在上个月初的时候,偶然在IThelp看到这篇讨论 setState後画面没有立即Render,决定趁...
到今天为止介绍了不少应用於k8s上的服务,并且大部分都可以透过operator的方式进行同性质的服务...
昨天介绍了一些名词,今天继续提Node.js Node.js一点入门 今天直接贴上程序码,再去做解释...