【Python基础】第二十五课:SQL实战应用之汇率资讯储存与管理

SQL实战应用之汇率资讯储存与管理

Posted by x-jeff on August 23, 2021

本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.数据收集

通过网络爬虫收集汇率信息(网络爬虫的实现参照博客:【Python基础】第八课:网络爬虫 )。所爬取的汇率信息来自国家外汇管理局官方网站

确定目标内容的位置以及HTTP请求方法:

HTTP请求可以有很多方法。HTTP1.0定义了三种请求方法:GETPOSTHEAD。HTTP1.1新增了五种请求方法:OPTIONSPUTDELETETRACECONNECT。在此不再区分这几种方法的异同。

确定限定日期所用的字段名称:

1
2
3
4
5
import requests

payload = {'startDate': '2021-05-01', 'endDate': '2021-08-01', 'queryYN': 'true'}
res = requests.post('http://www.safe.gov.cn/AppStructured/hlw/RMBQuery.do', data=payload)
print(res)

输出为:

1
<Response [200]> #证明网页响应成功

tips:该网页在输入日期范围时,跨度不能超过366天。此时如果需要多年的数据,可以使用datetime生成一系列的日期,然后循环调用:

1
2
3
4
5
6
7
from datetime import datetime, timedelta

current_time = datetime.now()
for i in range(1, 5 * 366, 366):
    start_time = (current_time - timedelta(days=i + 366)).strftime('%Y%m%d')
    end_time = (current_time - timedelta(days=i + 1)).strftime('%Y%m%d')
    print(start_time, end_time)

输出为:

1
2
3
4
5
20200822 20210822
20190822 20200821
20180821 20190821
20170820 20180820
20160819 20170819

使用pandas.read_html快速获取在html页面中table格式的数据:

1
2
3
4
5
6
7
from bs4 import BeautifulSoup
import pandas as pd

soup = BeautifulSoup(res.text, 'html.parser')
dfs = pd.read_html(soup.select('#InfoTable')[0].prettify('utf-8-sig'), header=0)
df_rates = dfs[0]
print(df_rates.head())

2.数据转换

1
2
3
df_rates = pd.melt(df_rates, col_level=0, id_vars=['日期'])
df_rates.columns = ['date', 'currency', 'exchange']
print(df_rates.head())

输出为:

1
2
3
4
5
6
         date currency  exchange
0  2021-07-30     美元    646.02
1  2021-07-29     美元    649.42
2  2021-07-28     美元    649.29
3  2021-07-27     美元    647.34
4  2021-07-26     美元    647.63

pandas.melt的用法:链接

3.将数据储存到数据库中

1
2
3
4
import sqlite3 as lite

with lite.connect('currency.sqlite') as db:
    df_rates.to_sql('currency_data', con=db, if_exists='replace', index=None)

选取美元汇率数据:

1
2
3
with lite.connect('currency.sqlite') as db:
    df = pd.read_sql("SELECT * FROM currency_data WHERE currency='美元'", con=db)
    print(df.head())

输出为:

1
2
3
4
5
6
         date currency  exchange
0  2021-07-30     美元    646.02
1  2021-07-29     美元    649.42
2  2021-07-28     美元    649.29
3  2021-07-27     美元    647.34
4  2021-07-26     美元    647.63

绘制美元和英镑的汇率折线图:

1
2
3
4
5
6
7
with lite.connect('currency.sqlite') as db:
    df = pd.read_sql("SELECT * FROM currency_data WHERE currency IN ('美元','英镑')", con=db)
    df.currency.unique() #去除重复
    df['date'] = pd.to_datetime(df['date'], format="%Y-%m-%d")
    df2 = df.pivot_table(index='date', columns='currency')
    df2.plot(kind='line', rot=90)
    plt.show()

使用pandas绘制统计图表请参见:【Python基础】第二十课:使用pandas绘制统计图表

pivot_table的使用说明请参见:建立透视表(pivot_table)

4.代码地址

  1. SQL实战应用之汇率资讯储存与管理