打开这个链接可以获取汇率数据 IMF汇率查询
选择如图
然后全选
继续
点击导出为xml
第一步,从xml获取汇率数据写入mysql
第二步,从mysql读取数据,通过tkinter展示
#coding:utf-8
import tkinter as tk
from tkinter import filedialog,ttk,messagebox
import pandas as pd
import datetime
import matplotlib.pyplot as plt
from sqlalchemy import create_engine
import xml.etree.ElementTree as ET
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei']
conn=create_engine("mysql+pymysql://root:passwd@127.0.0.1:3306/economy")
window=tk.Tk()
window.geometry('600x500')
window.wm_attributes('-topmost',True)
window.title('主要货币汇率')
window.bind("<Escape>",lambda event:window.iconify())
#更新数据
def getfile():
file=filedialog.askopenfilename(filetype=[('xml','.xml')])
path.set(file)
with open(file,'r') as f:
res=f.read()
root = ET.fromstring(res)
content={}
content['date']=[]
line1=root[1]
for item in line1:
currency=item.items()[1][1]
content[currency]=[]
#遍历每一个日期
for index,line in enumerate(root):
if(not line.attrib):
continue
content['date'].append(line.attrib['VALUE']) #获取日期
for item in line:
currency=item.items()[1][1]
if(item.text=='Blank'):
content[currency].append(np.nan) #空值
else:
content[currency].append(float(item.text)) #获取汇率r5
df=pd.DataFrame(content)
df['date']=pd.to_datetime(df['date']).astype(str) #日期转换为字符串
segmap={'DZD': '阿尔及利亚', 'AUD': '澳元', 'BWP': '博茨瓦纳', 'BRL': '巴西', 'BND': '文莱', 'CAD': '加拿大', 'CLP': '智利', 'CNY': '人民币', 'COP': '哥伦比亚', 'CZK': '捷克', 'DKK': '丹麦克朗', 'EUR': '欧元', 'INR': '印度卢比', 'ILS': '以色列', 'JPY': '日元', 'KRW': '韩元', 'KWD': '科威特', 'MYR': '马来西亚', 'MUR': '毛里求斯', 'MXN': '墨西哥', 'NZD': '新西兰', 'NOK': '挪威', 'OMR': '阿曼', 'PEN': '秘鲁', 'PHP': '菲律宾', 'PLN': '波兰', 'QAR': '卡塔尔', 'RUB': '俄罗斯卢布', 'SAR': '沙特里亚尔', 'SGD': '新加坡', 'ZAR': '南非兰特', 'SEK': '瑞典克朗', 'CHF': '瑞士法郎', 'THB': '泰铢', 'TTD': '特立尼达', 'AED': '阿联酋', 'GBP': '英镑', 'USD': '美元', 'UYU': '乌拉圭'}
df.rename(columns=segmap,inplace=True)
df.to_sql(name='exchange', con=conn, if_exists='append', index=False) #导入mysql
messagebox.showinfo('提示',"数据更新完成")
#出图
def getrate():
chosed=[i.get() for i in v if i.get()] #选择的国家
segs=','.join(chosed)
startdate=start_date.get()
enddate=end_date.get()
if(startdate):
sql="select date 日期,{} from exchange where date between '{}' and '{}'".format(segs,startdate,enddate)
else:
sql="select date 日期,{} from exchange where 1=1".format(segs)
dfx=pd.read_sql(sql,conn).dropna()
if not dfx.shape[0]:
messagebox.showerror('警告','没有数据')
dfx.set_index('日期',inplace=True)
dfx.plot(kind='line',title=segs+'汇率')
plt.show()
#反选
def unselectall():
for index,item in enumerate(templist):
v[index].set('')
#全选
def selectall():
for index,item in enumerate(templist):
v[index].set(item)
frame0=tk.Frame(window,pady=10,padx=15)
frame0.grid(row=0,column=0,sticky='w')
ttk.Button(frame0,text="打开xml",command=getfile).grid(row=0,column=0)
path=tk.StringVar()
ttk.Entry(frame0,textvariable=path).grid(row=0,column=1)
frame1=tk.Frame(window,pady=10,padx=15)
frame1.grid(row=1,column=0)
#全选反选
opt=tk.IntVar()
ttk.Radiobutton(frame1,text='全选',variable=opt,value=1,command=selectall).grid(row=0,column=0,sticky='w')
ttk.Radiobutton(frame1,text='反选',variable=opt,value=0,command=unselectall).grid(row=0,column=1,sticky='w')
#勾选货币
df=pd.read_sql('select * from exchange',conn)
templist = df.columns.tolist()
templist.remove('date')
v=[]
for index,item in enumerate(templist):
v.append(tk.StringVar())
ttk.Checkbutton(frame1,text=item,variable=v[-1],onvalue=item,offvalue='').grid(row=index//6+1,column=index%6,sticky='w')
frame2=tk.Frame(window,padx=15,pady=10)
frame2.grid(row=2,column=0,sticky='w')
start_date=tk.StringVar()
end_date=tk.StringVar()
end_date.set(datetime.datetime.now().strftime('%Y-%m-%d'))
ttk.Label(frame2,text="开始日期").grid(row=0,column=0,sticky='w',pady=6)
ttk.Entry(frame2,textvariable=start_date).grid(row=0,column=1)
ttk.Label(frame2,text="结束日期").grid(row=0,column=2)
ttk.Entry(frame2,textvariable=end_date).grid(row=0,column=3)
ttk.Button(frame2,text="获取汇率曲线",command=getrate).grid(row=1,column=0,columnspan=2,sticky='w')
window.mainloop()
效果如下
在这里插入图片描述