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

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

机器学习嘛,老朋友了.正好最近学校里要求写了个人工智能的小项目,就顺手发出来,正好记录下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 RSA


def 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=anp
        if (username==anu and password==anp) or (username==bnu and password==bnp): 
            IF=True
            root.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=True
                root.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=True
                root.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 root

try:
    if IF: 
        local1=local2=input1=input2=""
        mode=0
        QD=False
        def make ():
            global entry2,local1,local2,butto1,QD,input1,input2,mode,scale1 
            try:input1=local1.name
            except:input1=""
            try:
                input2=local2.name
                input2=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 local1
            local1=fd.askopenfile(title="打开...",filetypes=[("数据存储文件",["*.txt","*.csv","*.log","*.img","*.png","*.jpg","*.jpeg","*.html","*.m3u8"])]) 

        def iget2(): 
            global local2
            local2=fd.askopenfile(title="打开...",filetypes=[("数据存储文件",["*.txt","*.csv","*.log"])])     

        def do1():
            global mode,label_status
            mode=1  
            label_status.config(text="当前项目:一维数组映射分析")


        def do2():
            global mode,label_status
            mode=2  
            label_status.config(text="当前项目:图像识别")

        def do3():
            global mode,label_status
            mode=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=la1
    Y=lb1
    if 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=0
        for i in p0:
            sum0=sum0+i
        p2=sum0/len(p0)
    except:
        p1=a1
        p2=a2
    return 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_code
    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]
    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_token
    request_url = request_url + "?access_token=" + access_token
    headers = {'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:下期讲傅里叶变换


感谢阅读!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值