Python—从IMF网站获取汇率数据并通过tkinter展示

打开这个链接可以获取汇率数据 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()

效果如下

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值