入门教程: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

相关文章

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.