入门教程:Python tk+stats+requests(GUI界面+机器学习+网络爬虫)

本文主要是介绍入门教程:Python tk+stats+requests(GUI界面+机器学习+网络爬虫),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 人工智能-机器学习的简单应用
    • Python-tkinter的应用
      • 主背景创建
        • 1.窗口创建
        • 2.窗口尺寸和位置
        • 3.窗口标题
      • 元素创建
      • 元素放置
      • 元素相关函数
        • 1.改变文字
        • 2.绑定函数
        • 3.主函数
        • 4.tk自带函数
    • 简易机器学习的使用
    • 简单的网络文字爬虫
    • 代码总结
      • 1.main.py
      • 2.stats.py
      • 3.search.py
      • 4.image.py
    • 文章总结
    • 感谢阅读!

人工智能-机器学习的简单应用

机器学习嘛,老朋友了.正好最近学校里要求写了个人工智能的小项目,就顺手发出来,正好记录下python ttk的用法.

Python-tkinter的应用

tkinter是Python内置的可视化包.不同于wxPython,它具有更好的适用性和多线程兼容.本文仅对其进行简单介绍,不做深入探究.

主背景创建

1.窗口创建

和大多数可视化包一样,tkinter(下文简称tk)需要先创建窗口才能在上面加入元素,如:

import tkinter as tk
import tkinter.ttk as ttk
root=tk.Tk()
2.窗口尺寸和位置

在窗口创建完成后就可以调整它的大小(单位px)和左上角初始位置(相对屏幕左上角,单位px)啦:

root.geometry("800x600+0+0")
#第一个参数为窗口长度,第二个参数为高度
#第三个参数为初始位置距屏幕左上角水平距离,第四个参数为竖直距离 
3.窗口标题

窗口有了,其标题当然不能落下:

root.title("我是标题")

元素创建

tk中每一个对象都是tk或ttk(即tkinter.ttk)的一个类的对象.一般常用的对象有:

中文名称父类名称常用参数
标签(文本)ttk.Labelroot(窗口),text(文本)
按钮ttk.Buttonroot(窗口),text(文本),command(绑定函数)
输入框ttk.Entryroot(窗口),command/event(绑定函数/事件(如键盘)),show(显示样式)
滑动条tk.Scaleroot(窗口),from_(起始值),to(最大值),orient(样式)
分割线ttk.Separatorroot(窗口)
表格ttk.Frameroot(窗口),header(表头),data(数据)
非独立窗口tk.PanedWindowroot(窗口),orient(样式)
菜单栏tk.Menuroot(窗口)
菜单栏项目tk.Menuroot(菜单栏),tearoff(菜单索引)

通过直接应用类就可以创建对象,如:

label=ttk.Label(root,text="我是label")
entry=ttk.Entry(root)
scale=tk.Scale(root,from_=0,to=10,orient="horizontal")

值得注意的是,菜单栏应用方式比较特殊,需要如下代码:

menubar=tk.Menu(root)
filemenu=tk.Menu(menubar,tearoff=0)
menubar.add_cascade(label="项目...",menu=filemenu)
filemenu.add_command(label="label1",command=do1),filemenu.add_command(label="label2",command=do2),filemenu.add_command(label="label3",command=do3)

其中,menubar对象创建的是整个菜单条;filemenumenubar上每一条主栏目;add_cascade函数直接作用在menubar上是为了创建一个主栏目(这样filemenu的索引0就对应了这个label="项目..."的主栏目);而add_command作用在filemenu上,用于创建子栏目.

元素放置

创建好了元素,就需要将它们放置在窗口root上,一般有两种办法:
一是pack方法;二是place方法.pack不能指定位置,由tk自动安置,一般都是在上一个被pack的元素下方,居中;place则可以自己选择位置,语法如下:

label.pack()
entry.pack()
scale.place(x=100,y=50)

效果图:

元素相关函数

1.改变文字

在创建文本对象(如Label,Button等)时已经给定了初始文本text,那要如何后期修改呢?分情况:

  • Button对象文本修改
     对于大多数对象而言,只需要修改其属性之一就可以更改文本,这里以button举例:
button["text"]="new_text"

  这样button上就有了新文本: “new_text”.

  • Label对象文本修改
    Label对象除窗口外一般不设有其他属性,而python中不允许修改根属性,这意味着我们不能像button那样简单的只是修改text属性,而是利用重写函数config来操作:
label.config(text="new text")
2.绑定函数

在上一节中提到了ButtonEntry对象的绑定函数,现在让我们来讲讲什么是绑定函数.
第一种写法:

button=ttk.Button(root,text="我是button",command=doSome)

此时,只有当button被按下时才会且仅会触发一次doSome函数.
第二种写法:

button=ttk.Button(root,text="我是button",command=doSome())

此时,无论是否按下,在root窗口被创建之前会先执行一次doSome函数,随后启动窗口.在窗口中,button被按下时会调用两次doSome函数,因此这种写法是不建议的.

3.主函数

在所有元素和对象方法创建后,就可以启动程序了!只需要这样:

root.mainloop()

即可启动窗口root及其对象/方法.

4.tk自带函数
  • 空字符串
    对于用惯了"“的程序员,到这可得改一改了.在大量数据读取期间,”"要占用较多的内存,此时可采用
value=tk.Stringvar()

这样一来,value变量的所耗内存就变小了.

  • 关闭窗口
    在一个窗口的任务结束后,需要关闭它来结束它的mainloop以启动下一个窗口,此时需要调用关闭窗口函数:
root.destroy()
  • 消息弹窗
    运用好小窗口可以有利地节省主窗口root上的空间.小窗口需要引入包
import tkinter.messagebox as msg

共有八种函数,每种传入两个内容:小窗标题和小窗文本.

msg.showinfo("info","text1")#无返回值
msg.showwarning("warn","text2")#无返回值
msg.showerror("errr","text3")#无返回值
msg.askquestion("ques","?")#两个选项(yes/no) 返回True/False
msg.oknocancel("oncl","ok/no/cancel")#三个选项 返回"ok"/"no"/"cancel"
msg.askyesno("yn?","yes/no")#两个选项(yes/no) 返回"yes"/"no"
msg.askyenocancel("yncc","yes/no/cancel")#三个选项 返回"yes"/"no"/"cancel"
msg.askretrycancel("rcr","retry/cancel")#两个选项 返回"retry"/"cancel"
  • 获取函数
    entryscale中获取返回值,可用:
result=entry.get()

entry返回字符串,scale返回float.

简易机器学习的使用

受到篇幅限制,本文只讲述一下python包statsmodels.api的简单应用.
安装>>>pip install statsmodels
导入:

import statsmodels.api as sm
import numpy as np
import pandas as pd

假定现在有这样一个csv文件(以DataFrame形式表现):

特征组目标组
15
210
315
420
525
630
735
840
945
1050

(特征组可视为 x x x值,目标组可视为 y y y值)
一眼就看出来了吧?这显然是函数 y = 5 x y=5x y=5x对吧?那如何让机器知道它呢?我们将这个"eg1.csv"读出并制作为两个list:

la=pd.read_csv(path,usecols=['特征组'] )
lb=pd.read_csv(path,usecols=["目标组"]) 
X=list(la["特征组"])
Y=list(lb["目标组"])

然后运用一系列迷惑操作:

dX=np.column_stack((X,np.power(X,2),np.power(X,3),np.power(X,4),np.sin(X),np.tan(X),np.cos(X)  ))#第一步
X_added=sm.add_constant(dX)#第二步
model=sm.OLS(Y,X_added)#第三步
results=model.fit() #第四步

注意!
第一步中,我们尚未应用到模型,而是使用numpy的数组大量操作column_stack来分别取得对于每一个 x x x分别的 x , x 2 , x 3 , x 4 , sin ⁡ x , tan ⁡ x , cos ⁡ x x,x^2,x^3,x^4,\sin{x},\tan{x},\cos{x} x,x2,x3,x4,sinx,tanx,cosx的值.
第二步中,我们应用statsmodels.api提供的浅层机器学习,分别计算 x , x 2 , x 3 , x 4 , sin ⁡ x , tan ⁡ x , cos ⁡ x x,x^2,x^3,x^4,\sin{x},\tan{x},\cos{x} x,x2,x3,x4,sinx,tanx,cosx在对应的 y = f x y=f{x} y=fx中所占权重,返回array形式,包含每一项的权重 ω n \omega_n ωn,表达式为
对于 ∀ x ∈ X , \forall x\in X, xX, ω 1 x + ω 2 x 2 + ω 3 x 3 + ω 4 x 4 + ω 5 sin ⁡ x + ω 6 tan ⁡ x + ω 7 cos ⁡ x = y = f ( x ) ∈ Y \omega_1x+\omega_2x^2+\omega_3x^3+\omega_4x^4+\omega_5\sin{x}+\omega_6\tan{x}+\omega_7\cos{x}=y=f(x)\in Y ω1x+ω2x2+ω3x3+ω4x4+ω5sinx+ω6tanx+ω7cosx=y=f(x)Y.
这也意味这你可以在第一步中添加或删除或更改值栈,如更改成:

dX=np.column_stack((X,\
np.power(X,2),np.power(X,3),np.power(X,4),\
np.sin(X),np.tan(X),np.cos(X),\
np.power(np.sin(X),2),np.power(np.cos(X),2),\
np.power(2,np.sin(np.arccos(X)))))

注意括号数量对应.
第三步第四步中,我们将计算好的权重组返回到机器,获取培养模型.
因此这个results就是我们培养的学习模型.
对于其精度,一般采用方差:

jd=results.rsquared()
print(jd*100)

对于一个需要预测的特征组数 x x x,我们直接套用函数

prediction=results.predict([1,x,np.power(x,2),np.power(x,3),np.power(x,4),np.sin(x),np.tan(x),np.cos(x)])

注意,predict函数的实参为一个列表,内容应当与constant模型的基础元组内容完全一致.

简单的网络文字爬虫

通过对百度百科主站的探究发现,对于一个搜索词(以"python")举例,其词条位于python,网站格式:

https://baike.baidu.com/item/
Python/
{key}?fromModule=lemma_search-box)

而如果不给定keyfromModule值,只访问

https://baike.baidu.com/item/Python/

发现也可以访问.那思路就清晰了,直接用requests获取该网页所有内容就好了:

text="Python"
url = "https://baike.baidu.com/item/"+i 
r = requests.get(url) 
html_code = r.content.decode(r.encoding)

这个html_code就是网页上所有内容.假定我们现在只要获取词条的简要介绍,会发现位于html_code的第11行,因此我们可以简化思路,将它写入文本文件后再读出取index=[10]即可:

with open("new.txt","w",encoding="utf-8") as h:h.write(str(hc))
with open("new.txt","r",encoding="utf-8") as n:real=n.readlines()
get=real[10]  
text=get[34:-3]
os.remove("new.txt")

此时text就是我们想要的文本了.

代码总结

在结束本文之前,附上本次我期末项目的全代码:

1.main.py

#-*- utf-8 -*-
import tkinter as tk
import tkinter.ttk as ttk
from tkinter import filedialog as fd
import tkinter.messagebox as msg
import time
import sys 
import stats
import image
import search
import base64
from Crypto.Cipher import PKCS1_v1_5 as PKCS1_cipher
from Crypto.PublicKey import RSAdef get_key(path):with open(path) as f:pem_data = f.read()return RSA.importKey(pem_data)def encrypt(msg, pub_path):key = get_key(pub_path)cipher = PKCS1_cipher.new(key)encrypt_msg = cipher.encrypt(msg.encode("utf-8"))return base64.b64encode(encrypt_msg).decode()def decrypt(msg, pri_path):key = get_key(pri_path)cipher = PKCS1_cipher.new(key)decrypt_data = cipher.decrypt(base64.b64decode(msg), 0)return decrypt_data.decode("utf-8") 
with open("uap.log",mode="r",encoding="utf-8") as s:n=s.readlines()if len(n)!=0 and len(n)!=2 and len(n)!=4:print("注册表被篡改,无法打开程序.")time.sleep(3)sys.exit()root=tk.Tk()
root.geometry("800x600+0+0") 
root.title("登录")
x=150
label0=ttk.Label(root,text="用户名:");label0.place(x=x,y=20)
entry0=ttk.Entry(root);entry0.place(x=x+50,y=20)
label_1=ttk.Label(root,text="密码:");label_1.place(x=x+220,y=20)
entry_1=ttk.Entry(root,show="*");entry_1.place(x=x+270,y=20)  
IF=False
#第二部分 登录
def g():global entry0,entry_1,IF,label0,label_1,q  username=entry0.get()password=entry_1.get()with open("uap.log",mode="r",encoding="utf-8") as uap:try:an=uap.readlines()anu=an[0].replace("\n","")anp=an[1].replace("\n","")anu=decrypt(anu,"pri_key.pem")anp=decrypt(anp,"pri_key.pem") except:anu=anp=""    try:bnu=an[2].replace("\n","");bnp=an[3].replace("\n","")bnu=decrypt(anu,"pri_key.pem");bnp=decrypt(anp,"pri_key.pem")except:bnu=anu;bnp=anpif (username==anu and password==anp) or (username==bnu and password==bnp): IF=Trueroot.destroy()  else:q.config(width=25)q.place(x=200,y=50)q["text"]="用户名或密码不正确!(点击重试)" #第三部分 注册 
def zc():global entry0,entry_1,IF,label0,label_1,q  username=entry0.get()password=entry_1.get()with open("uap.log",mode="r",encoding="utf-8") as uap:try:an=uap.readlines()anu=an[0].replace("\n","")anp=an[1].replace("\n","") anu=decrypt(anu,"pri_key.pem")anp=decrypt(anp,"pri_key.pem")except:anu=anp=""    try:bnu=an[2].replace("\n","");bnp=an[3].replace("\n","")bnu=decrypt(anu,"pri_key.pem");bnp=decrypt(anp,"pri_key.pem")except:bnu="";bnp=""if username==anu or username==bnu or password==anp or password==bnp: z.config(width=40)z.place(x=220,y=80)z["text"]="该用户已经存在或有输入为空.请重新注册.(再次点击)"else:if len(an)==2:with open("uap.log",mode="a",encoding="utf-8") as u1:us=encrypt(username,"pub_key.pem")ps=encrypt(password,"pub_key.pem")u1.write("\n"+us)u1.write("\n"+ps)z.config(width=25)z.place(x=230,y=80)z["text"]="注册成功!"time.sleep(3)IF=Trueroot.destroy() elif len(an)==0:with open("uap.log",mode="a",encoding="utf-8") as u1:us=encrypt(username,"pub_key.pem")ps=encrypt(password,"pub_key.pem")u1.write(us)u1.write("\n"+ps)z.config(width=25)z.place(x=230,y=80)z["text"]="注册成功!"time.sleep(3)IF=Trueroot.destroy()     else:z["text"]="已有两个账号.请前往uap.log删除."    q = ttk.Button(root, text="确定并进入", command=g);q.place(x=250,y=50)
z = ttk.Button(root, text="注册新账号",command=zc);z.place(x=320,y=80)
out = ttk.Button(root,text="退出",command=sys.exit);out.place(x=400,y=50) 
root.mainloop() 
del roottry:if IF: local1=local2=input1=input2=""mode=0QD=Falsedef make ():global entry2,local1,local2,butto1,QD,input1,input2,mode,scale1 try:input1=local1.nameexcept:input1=""try:input2=local2.nameinput2=input2.replace("\\","/")except:try:input2=entry2.get()except:input2=""if mode==1:  try:modei=scale1.get()r1,r2=stats.st(input1,float(input2),modei)msg.showinfo("结果","%s\n返回值:%s"%(r1,r2))except Exception as e:msg.showerror("错误","%s"%e) elif mode==2:          try:reslut1,reslut2=image.get(input1)result=""for i in range(0,len(reslut1)):result=result+reslut1[i]+"  (自信度:"+str((reslut2[i])*100)+"%)\n"msg.showinfo("结果","返回值:\n%s"%result)except Exception as e:msg.showerror("错误","%s"%e)elif mode==3: try:re=search.search(input2)re=re[0]r=[]end=""if len(re)>=129:key=[]for i in range(0,len(re) ):p=re[i]if p=="。" or p==".":key.append(i)for j in re:  r.append(j)for m in range(key[-1],len(re)-key[-1]+1):del r[m+1]for n in r:  end=end+str(n)    re=end       if re=="":msg.showwarning("警告","从百度百科上未找到该词条.请重试.")else:msg.showinfo("结果","搜索结果:%s"%re)except Exception as e:msg.showerror("错误","%s"%e)def iget1(): global local1local1=fd.askopenfile(title="打开...",filetypes=[("数据存储文件",["*.txt","*.csv","*.log","*.img","*.png","*.jpg","*.jpeg","*.html","*.m3u8"])]) def iget2(): global local2local2=fd.askopenfile(title="打开...",filetypes=[("数据存储文件",["*.txt","*.csv","*.log"])])     def do1():global mode,label_statusmode=1  label_status.config(text="当前项目:一维数组映射分析")def do2():global mode,label_statusmode=2  label_status.config(text="当前项目:图像识别")def do3():global mode,label_statusmode=3  label_status.config(text="当前项目:简易分句和搜索" )    root=tk.Tk()root.geometry("800x600+0+0")root.title("Python人工智能项目")menubar=tk.Menu(root)filemenu=tk.Menu(menubar,tearoff=0)menubar.add_cascade(label="项目...",menu=filemenu)filemenu.add_command(label="一维数组映射分析",command=do1),filemenu.add_command(label="图像识别",command=do2),filemenu.add_command(label="简易分句和搜索",command=do3)root.config(menu=menubar) pw=tk.PanedWindow(root,orient="vertical",sashrelief="sunken")pw.pack(fill="both",expand=1) separator = ttk.Separator(root).pack(padx=2, fill='x')status_frame = ttk.Frame(root, relief='raised').pack(fill='x')label_status = ttk.Label(status_frame, text='当前项目:无')label_status.pack(side='left', fill='x')sizegrip = ttk.Sizegrip(status_frame).pack(anchor='ne') pw1=tk.PanedWindow(root,orient="vertical",sashrelief="flat") pw.add(pw1) label1=ttk.Label(pw1,text="数据一路径:(在模式1和2中必选,模式3中不可选)")butto_1=ttk.Button(pw1,text="打开...",command=iget1)butto_2=ttk.Button(pw1,text="打开...",command=iget2)label2=ttk.Label(pw1,text="数据二路径:(在模式1和3中必选,模式2中不可选。模式3应当输入而非选择文件。)")  value1=tk.StringVar()value2=tk.StringVar()  entry2=ttk.Entry(pw1)label3=ttk.Label(pw1,text="数据分析复杂度:默认为0(最高),范围0-10(10最低)")scale1=tk.Scale(pw1,from_=0,to=10,orient="horizontal")scale1.config(length=200)butto1=ttk.Button(pw1,text="确定",command=make)  butto2=ttk.Button(pw1,text="退出",command=sys.exit)  label1.place(x=80,y=20)butto_1.place(x=350,y=20)label2.place(x=80,y=50)entry2.place(x=550,y=50)butto_2.place(x=700,y=50)label3.place(x=250,y=80)scale1.place(x=300,y=110)butto1.place(x=300,y=160)butto2.place(x=300,y=190) root.mainloop()else:sys.exit()    
except NameError:sys.exit()       

2.stats.py

import statsmodels.api as sm
import pandas as pd
import numpy as np
def st(path,x:float,mode=0):      la=pd.read_csv(path,usecols=['特征组'] )lb=pd.read_csv(path,usecols=["目标组"]) la1=list(la["特征组"])lb1=list(lb["目标组"])X=la1Y=lb1if mode==0:dX=np.column_stack((X,np.power(X,2),np.power(X,3),np.power(X,4),np.sin(X),np.tan(X),np.cos(X)  ))X_added=sm.add_constant(dX)model=sm.OLS(Y,X_added)results=model.fit() p1="本次精度为"+str(results.rsquared*100)+"%"   p2=results.predict([1,x,np.power(x,2),np.power(x,3),np.power(x,4),np.sin(x),np.tan(x),np.cos(x)])elif mode==1:dX=np.column_stack((X,np.power(X,2),np.power(X,3),np.power(X,4),np.sin(X)))X_added=sm.add_constant(dX)model=sm.OLS(Y,X_added)results=model.fit() p1="本次精度为"+str(results.rsquared*100)+"%"   p2=results.predict([1,x,np.power(x,2),np.power(x,3),np.power(x,4),np.sin(x) ])elif mode==2:dX=np.column_stack((X,np.power(X,2),np.power(X,3),np.power(X,4)))X_added=sm.add_constant(dX)model=sm.OLS(Y,X_added)results=model.fit() p1="本次精度为"+str(results.rsquared*100)+"%"   p2=results.predict([1,x,np.power(x,2),np.power(x,3),np.power(x,4)])   elif mode==3:dX=np.column_stack((X,np.power(X,2),np.power(X,3),np.power(X,4),np.power(X,5)))X_added=sm.add_constant(dX)model=sm.OLS(Y,X_added)results=model.fit() p1="本次精度为"+str(results.rsquared*100)+"%"   p2=results.predict([1,x,np.power(x,2),np.power(x,3),np.power(x,4),np.power(X,5)])   elif mode==4:dX=np.column_stack((X,np.power(X,2),np.power(X,3),np.power(X,4),np.power(X,5),np.power(X,6)))X_added=sm.add_constant(dX)model=sm.OLS(Y,X_added)results=model.fit() p1="本次精度为"+str(results.rsquared*100)+"%"   p2=results.predict([1,x,np.power(x,2),np.power(x,3),np.power(x,4),np.power(X,5),np.power(X,6)])   elif mode==5:dX=np.column_stack((X,np.power(X,2),np.power(X,3),np.power(X,4),np.power(X,5),np.power(X,6),np.power(X,7)))X_added=sm.add_constant(dX)model=sm.OLS(Y,X_added)results=model.fit() p1="本次精度为"+str(results.rsquared*100)+"%"   p2=results.predict([1,x,np.power(x,2),np.power(x,3),np.power(x,4),np.power(X,5),np.power(X,6),np.power(X,7)])   elif mode==6:dX=np.column_stack((X,np.power(X,2),np.power(X,3),np.power(X,4),np.power(X,5),np.power(X,6),np.power(X,7),np.power(X,8)))X_added=sm.add_constant(dX)model=sm.OLS(Y,X_added)results=model.fit() p1="本次精度为"+str(results.rsquared*100)+"%"   p2=results.predict([1,x,np.power(x,2),np.power(x,3),np.power(x,4),np.power(X,4),np.power(X,5),np.power(X,6),np.power(X,7),np.power(X,8)])   elif mode==7:dX=np.column_stack((X,np.power(X,2),np.power(X,3),np.power(X,4),np.power(X,4),np.power(X,5),np.power(X,6),np.power(X,7),np.power(X,8),np.power(X,9)))X_added=sm.add_constant(dX)model=sm.OLS(Y,X_added)results=model.fit() p1="本次精度为"+str(results.rsquared*100)+"%"   p2=results.predict([1,x,np.power(x,2),np.power(x,3),np.power(x,4),np.power(X,4),np.power(X,5),np.power(X,6),np.power(X,7),np.power(X,8),np.power(X,9)]) elif mode==8:dX=np.column_stack((X,np.power(X,2),np.power(X,3),np.power(X,4),np.power(X,4),np.power(X,5),np.power(X,6),np.power(X,7),np.power(X,8),np.power(X,9),np.power(X,10)))X_added=sm.add_constant(dX)model=sm.OLS(Y,X_added)results=model.fit() p1="本次精度为"+str(results.rsquared*100)+"%"   p2=results.predict([1,x,np.power(x,2),np.power(x,3),np.power(x,4),np.power(X,4),np.power(X,5),np.power(X,6),np.power(X,7),np.power(X,8),np.power(X,9),np.power(X,10)])   elif mode==9:dX=np.column_stack((X,np.power(X,2),np.power(X,3),np.power(X,4),np.power(X,4),np.power(X,5),np.power(X,6),np.power(X,7),np.power(X,8),np.power(X,9),np.power(X,10),np.power(X,11)))X_added=sm.add_constant(dX)model=sm.OLS(Y,X_added)results=model.fit() p1="本次精度为"+str(results.rsquared*100)+"%"   p2=results.predict([1,x,np.power(x,2),np.power(x,3),np.power(x,4),np.power(X,4),np.power(X,5),np.power(X,6),np.power(X,7),np.power(X,8),np.power(X,9),np.power(X,10),np.power(X,11)])   elif mode==10:dX=np.column_stack((X,np.power(X,2),np.power(X,3),np.power(X,4),np.power(X,4),np.power(X,5),np.power(X,6),np.power(X,7),np.power(X,8),np.power(X,9),np.power(X,10),np.power(X,11),np.power(X,12)))X_added=sm.add_constant(dX)model=sm.OLS(Y,X_added)results=model.fit() p1="本次精度为"+str(results.rsquared*100)+"%"   p2=results.predict([1,x,np.power(x,2),np.power(x,3),np.power(x,4),np.power(X,4),np.power(X,5),np.power(X,6),np.power(X,7),np.power(X,8),np.power(X,9),np.power(X,10),np.power(X,11),np.power(X,12)]) a1=p1;a2=p2                                             try:p=p2[0]p=list(p)p0=p[0]sum0=0for i in p0:sum0=sum0+ip2=sum0/len(p0)except:p1=a1p2=a2return p1,p2

3.search.py

import requests 
import os
import jieba 
def search(name:str)->str :nali=jieba.cut(name)result=[]for i in nali:url = "https://baike.baidu.com/item/"+i r = requests.get(url) html_code = r.content.decode(r.encoding) hc=html_codewith open("new.txt","w",encoding="utf-8") as h:h.write(str(hc))with open("new.txt","r",encoding="utf-8") as n:real=n.readlines()get=real[10]  text=get[34:-3]result.append(text)os.remove("new.txt")return result  

4.image.py

import requests
import base64  
def get(path:str):request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general" f = open(path, 'rb')img = base64.b64encode(f.read()) params = {"image":img}access_token = your_access_tokenrequest_url = request_url + "?access_token=" + access_tokenheaders = {'content-type': 'application/x-www-form-urlencoded'}response = requests.post(request_url, data=params, headers=headers)if response:lre=response.json()res=dict(lre)reu=res["result"]kes=[]scs=[]for i in reu:kes.append(i["keyword"])scs.append(i["score"])return kes,scs          

注意,文中的your_access_token需要替换成你自己的token!


文章总结

本文讲了简单tkinter/statsmodels的应用.多多关注和评论.
评论1:下期讲matplotlib数据可视化
评论2:下期讲tk进阶
评论3:下期讲图片爬虫
评论4:下期讲sklearn机器学习
评论5:下期讲Crypt数据加解密
评论6:下期讲图像识别
评论7:下期讲傅里叶变换


感谢阅读!

这篇关于入门教程:Python tk+stats+requests(GUI界面+机器学习+网络爬虫)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/249257

相关文章

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur