Python

QQ圖片20171107234339.png

Jupyter Notebook 利器

入門基礎(chǔ)

windows一鍵安裝:3.5.2版本
第三方包:windows平臺(tái):pip install package(+包名)
因?yàn)榉阑饓栴}凤跑,直接輸入命令會(huì)失敗
+verbose會(huì)講如何失敗
在windows命令器中輸入:
pip install pandas(這個(gè)包名)

pip --verbose install pandas(打印失敗原因)

pip list(列出本地已經(jīng)安裝的包)
一般用這種代碼
pip install -i --trusted-host http://pypi.douban.com/simple/ pandas

win10可能有坑:紅字问词,cannot detect archive format
實(shí)在不行直接谷歌或者百度這個(gè)包然后來下載

環(huán)境搭建:notebook

如何學(xué)好編程

基礎(chǔ)部分:

  • 基本語法
  • 數(shù)據(jù)結(jié)構(gòu)
  • 輸入輸出
  • 異常處理

進(jìn)階提高:

  • 常用算法
  • 數(shù)據(jù)庫訪問
  • 面向?qū)ο?br> -其他

基本語法

  • 基本數(shù)據(jù)類型
  • 對(duì)象的定義和聲明
  • 循環(huán)和判斷:for搞莺,foreach然遏,if穷吮,while宣增,do
  • 邏輯運(yùn)算
  • 位運(yùn)算

數(shù)據(jù)結(jié)構(gòu)

  • 數(shù)組
  • 字符串
  • 系統(tǒng)標(biāo)準(zhǔn)庫自帶類型
  • 如何實(shí)現(xiàn)常用數(shù)據(jù)結(jié)構(gòu):鏈表诲祸、堆棧京办、二叉樹

輸入輸出

  • 標(biāo)準(zhǔn)輸入輸出:print掀序,echo,input
  • 文件讀寫:文本(行讀寫)/二進(jìn)制(偏移量+大胁研觥)
  • 格式化字符串

異常

  • 拋出和捕捉異常:try/catch不恭,try/except
  • 異常和錯(cuò)誤的區(qū)別以及應(yīng)用

pass:什么都不做,有時(shí)候需要做填充财饥,解決語義的歧義
continue:跳出當(dāng)前循環(huán)

:指數(shù)運(yùn)算 102 =100
//:除法换吧,且只留整數(shù)
not:取反
<<:左移位

:右移位(二進(jìn)制)
16<<2(左移兩位4)64
30<<3(左移三位
8)240
100>>3(右移3位/8,取整數(shù))

二進(jìn)制:0b開頭钥星,八進(jìn)制0o開頭

Python 語法基礎(chǔ)

  • 輸出
    print("")
  • 注釋
  1. 注釋法

print("")

  1. 三引號(hào)注釋法


    image.png
  • 標(biāo)識(shí)符


    image.png
  • 變量

  • 數(shù)據(jù)類型
    數(shù)沾瓦,字符串,列表(list)a=["my","name"]谦炒,元組(tuple)cde=("my","name"),cde[0]=my,元組和列表的區(qū)別:元組不能修改元素暴拄,列表可以修改元素,集合(set)编饺,字典(dictionary)


    image.png
image.png
image.png
  • 運(yùn)算符
      • / %(求余數(shù)) //求模
  • 縮進(jìn)


    image.png

    image.png

Python控制流

三種基本控制流:

  1. 順序結(jié)構(gòu)(做事情一直把他做下去)
  2. 條件分支結(jié)構(gòu)(利用if來實(shí)現(xiàn))
  3. 循環(huán)結(jié)構(gòu)()

if語句
while語句(循環(huán))
for語句(循環(huán))(遍歷列表的內(nèi)容)


image.png
image.png

中斷結(jié)構(gòu)

中途退出的一種結(jié)構(gòu)乖篷,常有break語句與continue語句。


image.png

image.png

輸出乘法口訣:

image.png

逆向乘法口訣作業(yè)

為什么要強(qiáng)制轉(zhuǎn)換透且,因?yàn)?是字符撕蔼,要相同的才能想加的,所以要轉(zhuǎn)化
range(start, end, scan)

for i in range(9,0,-1):     
    for j in range(i,0,-1):         
        print(str(i) + " * " +str(j)+ " = " + str(i*j) + " " ,end=" ")     
    print()
image.png

注意最后一個(gè)print的位置秽誊,要與第二個(gè)for對(duì)齊才能這樣輸鲸沮,反例


image.png

Python函數(shù)詳解

函數(shù)的本質(zhì)是功能的封裝。

局部變量與全局變量

作用域:生效范圍锅论,全局變量:作用域從頭到尾讼溺,局部變量:作用域在局部


image.png

把函數(shù)里面的局部變量變?yōu)槿肿兞?/p>

image.png

排錯(cuò)的時(shí)候可以利用二分段法(在中間,把后面注釋掉最易,加一個(gè)print)

函數(shù)的定義與調(diào)用

def定義函數(shù)怒坯,一般命名不要用拼音
def abc():

函數(shù)的參數(shù)

image.png

實(shí)實(shí)在在將10和19傳遞給a,b炫狱。ab相當(dāng)于形參


image.png

Python的模塊

可以理解成函數(shù)的一個(gè)升級(jí)版本,模塊按類別來分類(類似java的類)剔猿,把一類的功能都放在一個(gè)模塊里面视译。
系統(tǒng)自帶的模塊在lib目錄中。

模塊的導(dǎo)入

  1. import 模塊名
  2. from...import...(from模塊归敬,import模塊里的某一個(gè)方法)

不能跨層導(dǎo)入酷含,要一層層導(dǎo)入,(urlopen在request下面)汪茧。

import urllib
from urllib.request import urlopen
data1=urllib.request.urlopen("http://www.baidu.com").read()
print(len(data1))

第一種導(dǎo)入方法


image.png

第二種
一開始就定位到相關(guān)的文件

from urllib import request
data3=request.urlopen("http://jd.com").read()
print(len(data3))

自定義模塊

函數(shù)需要返回值椅亚,我們用return,執(zhí)行完這個(gè)函數(shù)這個(gè)函數(shù)的整體就成了return的值舱污。

文件操作概述

用Python做文件的打開呀舔,關(guān)閉,讀取慌闭,寫入等操作,例如合并多個(gè)excel表格文件的內(nèi)容躯舔。


image.png
image.png

Python異常處理

image.png

try:試著去執(zhí)行這一塊代碼


image.png
image.png

open("","a")

wb代表二進(jìn)制寫入

open(路徑+文件名,讀寫模式)

讀寫模式:r只讀,r+讀寫,w新建(會(huì)覆蓋原有文件),a追加,b二進(jìn)制文件.常用模式

如:'rb','wb','r+b'等等

讀寫模式的類型有:

rU 或 Ua 以讀方式打開, 同時(shí)提供通用換行符支持 (PEP 278)
w 以寫方式打開驴剔,
a 以追加模式打開 (從 EOF 開始, 必要時(shí)創(chuàng)建新文件)
r+ 以讀寫模式打開
w+ 以讀寫模式打開 (參見 w )
a+ 以讀寫模式打開 (參見 a )
rb 以二進(jìn)制讀模式打開
wb 以二進(jìn)制寫模式打開 (參見 w )
ab 以二進(jìn)制追加模式打開 (參見 a )
rb+ 以二進(jìn)制讀寫模式打開 (參見 r+ )
wb+ 以二進(jìn)制讀寫模式打開 (參見 w+ )
ab+ 以二進(jìn)制讀寫模式打開 (參見 a+ )

image.png

爬蟲初識(shí)

image.png

cp指的是版本,直接搜索就行粥庄。


image.png

下載之后的安裝:cmd下丧失,進(jìn)入下載的包的位置


image.png

網(wǎng)絡(luò)爬蟲原理

  • 通用爬蟲
  • 聚焦爬蟲:有一個(gè)過濾環(huán)節(jié),有一個(gè)篩選環(huán)節(jié)

正則表達(dá)式

image.png

非打印字符:\n換行惜互,\t制表符

格式:第一個(gè)是規(guī)則布讹,第二個(gè)是目標(biāo)


image.png

通用字符:

  • \w能匹配任意一個(gè)字母數(shù)字或者下劃線
  • \d匹配任意一個(gè)十進(jìn)制數(shù)
  • \s匹配任意一個(gè)空白字符
  • \W匹配小w相反的東西,匹配任意一個(gè)除了字母數(shù)字下劃線以外的字符
  • \D與\d同樣也相反


    image.png

原子表训堆,用來定義平等的原子描验。用[],[jsz]三個(gè)原子坑鱼,都是平等的膘流,有其中一個(gè)就ok,只能其中一位匹配不能多位匹配鲁沥。


image.png

元字符

image.png
  • .能夠匹配任意的字符
  • ^匹配字符串開始的位置
  • $匹配字符串結(jié)束的位置
  • *匹配一次或者多次還有0次例如s(右上角星號(hào))匹配ss sss s
  • 呼股?匹配0次或者1次
  • +匹配一次或多次沒有0次
  • {3}前面的原子恰好出現(xiàn)3次,t{6}恰好有6個(gè)- t(連在一起的) t{6画恰,}(恰好至少出現(xiàn)了6次)
    s{4,7}至少出現(xiàn)4次彭谁,至多出現(xiàn)7次。
  • |,t|s(二選一)
  • ()


    image.png

學(xué)到模式修正符

image.png

模式修正符:

  • I 可以讓正則表達(dá)式忽略大小寫
  • M 多行匹配
  • L 本地化識(shí)別匹配
  • U根據(jù)unique字符解析字符
  • S讓.的匹配也匹配上換行符


    image.png

貪婪模式允扇,懶惰模式

p.y:貪婪模式缠局,盡可能多的去匹配则奥。 中間的字符是什么,有多少都是ok的甩鳄。.替換任意通用字符逞度, 0,1,多個(gè)
p.*妙啃?y:懶惰模式档泽,夠用就溜了

image.png

懶惰模式:精確定位
貪婪模式:定位更廣

正則表達(dá)式函數(shù)

image.png

match:是從頭開始搜索,一開始就要滿足才可以揖赴。

search:滿足頭的東西可以出現(xiàn)任意位置馆匿。但只給一個(gè)結(jié)果。

image.png
image.png

引入一個(gè)全局匹配complie
re.compile(對(duì)應(yīng)的表達(dá)式).findall(待搜索字符)


image.png

image.png

寫在[]表示非燥滑,只要是””這個(gè)字符是在中括號(hào)”[]”中被使用的話就是表示字符類的否定渐北,如果不是的話就是表示限定開頭。我這里說的是直接在”[]”中使用铭拧,不包括嵌套使用赃蛛。
其實(shí)也就是說”[]”代表的是一個(gè)字符集,”^”只有在字符集中才是反向字符集的意思搀菩。

image.png

左右不需要輸出來呕臂,打一個(gè)小括號(hào),只輸出這個(gè)小括號(hào)里面的東西肪跋。


image.png

單雙引號(hào)區(qū)別:


image.png

第二次作業(yè)爬取圖書館

import urllib.request
data=urllib.request.urlopen("https://read.douban.com/provider/all").read()
import re
data=data.decode("utf-8")
pat1='<div class="name">(.*?)</div>'
mydata=re.compile(pat1).findall(data)
print(mydata)

寫入


image.png

Urllib庫實(shí)戰(zhàn)

  • urlretrieve(要爬的參數(shù)歧蒋,本地地址):直接將某個(gè)網(wǎng)頁爬到本地
  • urlcleanup:清除由于urlretrieve產(chǎn)生的緩存。
  • info:顯示當(dāng)前環(huán)境的一些信息
  • getcode:當(dāng)前網(wǎng)頁狀態(tài)碼州既,返回200(網(wǎng)頁返回正確)谜洽,403禁止訪問。
  • geturl:現(xiàn)在爬的是哪個(gè)網(wǎng)頁


    image.png

超時(shí)測試:

image.png

image.png
image.png

自動(dòng)模擬http請(qǐng)求

image.png
image.png

url直接爬還不支持https吴叶,要寫成http


image.png

涉及到漢字的編碼問題


image.png

post

請(qǐng)求:(地址阐虚,數(shù)據(jù))


image.png

爬蟲異常處理

200是正常進(jìn)行


image.png
image.png

urlerror:

  1. 連不上服務(wù)器
  2. 遠(yuǎn)程Url不存在
  3. 本地沒有網(wǎng)絡(luò)
  4. 觸發(fā)了http子類

防屏蔽了,因?yàn)闆]有模擬瀏覽器登陸


image.png

瀏覽器偽裝技術(shù)

修改請(qǐng)求的報(bào)頭
網(wǎng)頁先用F12然后找 蚌卤,發(fā)生一次訪問操作敌呈,點(diǎn)network,點(diǎn)header 在找到user-agent


image.png

然后復(fù)制進(jìn)去
build_opener創(chuàng)建一個(gè)報(bào)頭

image.png

爬新聞程序

有些網(wǎng)站utf-8有問題造寝,可以在后面加一個(gè)ignore


image.png

第三次作業(yè)

image.png

作業(yè)代碼:

import re
import urllib.request
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
data=opener.open("https://www.csdn.net/").read()
data2=data.decode("utf-8","ignore")
pat='href="(https://.*?)"'
allurl=re.compile(pat).findall(data2)
for i in range(0,len(allurl)):
    try:
        print("第"+str(i)+"次爬取")
        thisurl=allurl[i]
        file="F:/python/test"+str(i)+".html"
        urllib.request.urlretrieve(thisurl,file)
        print("成功")
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)

爬蟲防屏蔽手段之代理服務(wù)器

image.png

因?yàn)橛米约旱暮苡锌赡鼙籭p封鎖磕洪,所以需要代理服務(wù)器
ProxyHandler{“http”;“代理ip及其端口”}

image.png

多次換代理ip诫龙,變換成一個(gè)列表析显,用循環(huán)就行


image.png

圖片爬蟲

  1. 爬取淘寶圖片
    圖片核心一直找不到,可以多換換瀏覽器看看签赃。


    image.png

將圖片顯示出來


image.png

找有js文件的地方谷异,來看抓包的源碼


image.png

第四次作業(yè)爬取千圖網(wǎng)

import urllib.request
import re
keyname="5244251"
key=urllib.request.quote(keyname)
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
urllib.request.install_opener(opener)
page=['','?page=02','?page=03']
for i in range(0,3):
    url="http://www.58pic.com/c/"+keyname+str(page[i])
    data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
    pat="background:url\('(.*?)'"
    imagelist=re.compile(pat).findall(data)
    for j in range(0,len(imagelist)):
        try:
            thisimg=imagelist[j]
            thisimgurl=thisimg
            file="F:/python/test/"+str(i)+str(j)+".jpg"
            urllib.request.urlretrieve(thisimgurl,filename=file)
        except urllib.error.URLError as e:
            if hasattr(e,"code"):
               print(e.code)
            if hasattr(e,"reason"):
               print(e.reason)

幾個(gè)tips:假如正則匹配時(shí)候有括號(hào)分尸,但本來括號(hào)用正則是選取里面內(nèi)容的,所以需要用轉(zhuǎn)義字符歹嘹。"background:url('(.*?)'" 用\進(jìn)行轉(zhuǎn)義

空字符直接用一個(gè)空格表示:

找圖片的方式:

  • 換不同的瀏覽器箩绍,找原圖的特殊字符。視頻23尺上,第32分鐘有講解
  • 找縮略圖與原圖鏈接之間的匹配關(guān)系材蛛。

淘寶爬圖片

import urllib.request
import re
keyname="q=%E6%96%87%E8%83%B8"
key=urllib.request.quote(keyname)
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
urllib.request.install_opener(opener)
page=['','&s=44','&s=88']
for i in range(0,3):
    url="https://s.taobao.com/search?"+keyname+str(page[i])
    data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
    pat='pic_url":"(.*?)","detail_url'
    imagelist=re.compile(pat).findall(data)
    for j in range(0,len(imagelist)):
        try:
            thisimg=imagelist[j]
            thisimgurl='http:'+thisimg
            file="F:/python/test/"+str(i)+str(j)+".jpg"
            urllib.request.urlretrieve(thisimgurl,filename=file)
        except urllib.error.URLError as e:
            if hasattr(e,"code"):
               print(e.code)
            if hasattr(e,"reason"):
               print(e.reason)

Python抓包分析

image.png

因?yàn)閿?shù)據(jù)很有可能隱藏其中

右邊分為response和request。上面是request(發(fā)送的請(qǐng)求)response(收到的回復(fù))
復(fù)制出評(píng)論頁,rate,右鍵copy锦亦,just url


image.png

騰訊視頻評(píng)論的抓取

image.png
image.png
print(eval("u\'"+comdata[0]+"\'"))

相當(dāng)于是 固定住u' ,后面在固定住'豆赏。

微信爬蟲

time模塊(延時(shí)模塊)
代碼:

#http://weixin.sogou.com/
import re
import urllib.request
import time
import urllib.error
import urllib.request
#自定義函數(shù),功能為使用代理服務(wù)器爬一個(gè)網(wǎng)址
def use_proxy(proxy_addr,url):
    #建立異常處理機(jī)制
    try:
        req=urllib.request.Request(url)
        req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
        proxy= urllib.request.ProxyHandler({'http':proxy_addr})  
        opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)  
        urllib.request.install_opener(opener)
        data = urllib.request.urlopen(req).read()
        return data
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
        #若為URLError異常富稻,延時(shí)10秒執(zhí)行
        time.sleep(10)
    except Exception as e:
        print("exception:"+str(e))
        #若為Exception異常掷邦,延時(shí)1秒執(zhí)行
        time.sleep(1)

#設(shè)置關(guān)鍵詞            
key="Python"
#設(shè)置代理服務(wù)器,該代理服務(wù)器有可能失效椭赋,讀者需要換成新的有效代理服務(wù)器
proxy="127.0.0.1:8888"
#爬多少頁
for i in range(0,10):
    key=urllib.request.quote(key)
    thispageurl="http://weixin.sogou.com/weixin?type=2&query="+key+"&page="+str(i)
    #a="http://blog.csdn.net"
    thispagedata=use_proxy(proxy,thispageurl)
    print(len(str(thispagedata)))
    pat1='<a href="(.*?)"'
    rs1=re.compile(pat1,re.S).findall(str(thispagedata))
    if(len(rs1)==0):
        print("此次("+str(i)+"頁)沒成功")
        continue
    for  j in range(0,len(rs1)):
        thisurl=rs1[j]
        thisurl=thisurl.replace("amp;","")
        file="F:/天善-Python數(shù)據(jù)分析與挖掘課程/result/32/第"+str(i)+"頁第"+str(j)+"篇文章.html"
        thisdata=use_proxy(proxy,thisurl)
        try:
            fh=open(file,"wb")
            fh.write(thisdata)
            fh.close()
            print("第"+str(i)+"頁第"+str(j)+"篇文章成功")
        except Exception as e:
            print(e)
            print("第"+str(i)+"頁第"+str(j)+"篇文章失敗")

=re.compile(pat1,re.S) 為了讓(.*抚岗?)也匹配上換行符

多線程爬蟲

程序并行執(zhí)行。
threading模塊纹份,可以多線程苟跪。
class A(threading.Thread)創(chuàng)建A這個(gè)多線程廷痘。
A里面必須要兩個(gè)函數(shù)蔓涧。
上面的方法是初始化線程。
后面的方法是具體的用法笋额。
要開啟線程元暴,先要實(shí)例化線程
t1=A()
t1.start()啟動(dòng)這個(gè)線程


image.png

分別爬奇數(shù),一個(gè)偶數(shù)兄猩。


image.png

image.png

image.png

image.png

Scrapy框架

利用做大型的爬蟲項(xiàng)目


image.png

Scrapy框架常見命令實(shí)戰(zhàn)

常見命令:
在cmd輸入:scrapy -h(看有哪些功能)
scrapy fetch -h(看這個(gè)功能的幫助)

scrapy fetch http://www.baidu.com 
(會(huì)顯示出過程)
scrapy fetch http://www.baidu.com --nolog
(不顯示過程)
  • fetch顯示爬取過程
  • run spider(運(yùn)行一個(gè)爬蟲文件茉盏,不需要建一個(gè)工程)
  • shell(啟動(dòng)scrapy交互終端,通常測試會(huì)用到)


    image.png

    在交互終端可以提取一些相應(yīng)的信息

  • startproject(創(chuàng)建爬蟲項(xiàng)目)后面接項(xiàng)目名
  • version查看對(duì)應(yīng)的版本信息
  • view(下載這個(gè)網(wǎng)頁并查看)


    image.png

    除了全局命令枢冤,還有項(xiàng)目命令鸠姨,要進(jìn)入項(xiàng)目文件夾之后才能看到。

  • bench測試本機(jī)性能

一些文件功能

image.png
  • init初始化文件
  • pipelines淹真,爬取之后的處理

image.png

在爬蟲工程建爬蟲文件讶迁,-l:看母版
basic:基本爬蟲
crawl:自動(dòng)爬蟲
xmlfeed:基于xml文件
csvfeed:基于csv文件
http協(xié)議名 www主機(jī)名 主機(jī)名例如:baidu.com
image.png

格式:
scrapy genspider -t 模板名(basic) peter(文件名) baidu.com(域名)

  • check(后面說到的都是項(xiàng)目命令)


    image.png
  • crawl(用的非常多,運(yùn)行某個(gè)爬蟲)

  • list(展示當(dāng)前項(xiàng)目下可以使用的爬蟲文件)

  • edit(直接打開編輯器對(duì)爬蟲編輯核蘸,linux環(huán)境下可以)

  • parse(獲取某個(gè)網(wǎng)頁)

第一個(gè)scrapy爬蟲

XPath表達(dá)式(適合用標(biāo)簽的)

/ 代表從頂端開始尋找一個(gè)標(biāo)簽
/html(尋找這個(gè)標(biāo)簽里面的東西)
/html/head/title


image.png

//表示尋找所有的標(biāo)簽

text():用來提取文字信息
@:提取標(biāo)簽的屬性信息:<a href>
標(biāo)簽[@屬性=值]


image.png

image.png

先寫items巍糯、pipelines啸驯、settings再寫py程序
scrapy.Field創(chuàng)建容器

Scrapy自動(dòng)爬蟲

image.png

allow:設(shè)置那個(gè)標(biāo)簽
callback回調(diào)函數(shù)
follow:是否跟隨:是否跟著爬下去

在setting里面接觸useragent注釋(讓除了第一次以外每一次爬都是從useragent來的)


image.png

這個(gè)地方的要用yield返回。如果是return的話祟峦,返回幾次就會(huì)崩潰掉罚斗。


image.png
image.png

init默認(rèn)的初始化方法,這個(gè)類會(huì)一開始執(zhí)行它宅楞。
close是最后執(zhí)行的

自動(dòng)登錄

image.png

把cookiejar設(shè)為1针姿,保留登錄狀態(tài)。

當(dāng)當(dāng)網(wǎng)爬取

引入數(shù)據(jù)庫

用的是本機(jī)咱筛,本機(jī)數(shù)據(jù)庫
db= 選擇數(shù)據(jù)庫
insert into插入信息(表名)
conn.query執(zhí)行語句

補(bǔ)充內(nèi)容

  • jason數(shù)據(jù):鍵值對(duì)


    image.png
  • 構(gòu)建分布式爬蟲需要用的:redis(分布式的集群)搓幌,scrapy-redis(結(jié)合scrapy與redis),scrapy

關(guān)閉cookie追蹤防止爬蟲發(fā)現(xiàn)的一種方法


image.png

u字符的翻譯查看


image.png

快速了解數(shù)據(jù)分析與數(shù)據(jù)挖掘技術(shù)

數(shù)據(jù)挖掘的步驟

目標(biāo):獲得什么樣的目標(biāo)等等
獲取數(shù)據(jù):爬蟲采集
四類建模模型:分類迅箩,聚類溉愁,關(guān)聯(lián),預(yù)測

image.png

image.png

數(shù)據(jù)挖掘相關(guān)模塊

image.png
  • numpy模塊饲趋,有數(shù)組支持(python默認(rèn)是沒有數(shù)組支持拐揭,之前一般用list列表進(jìn)行,當(dāng)數(shù)據(jù)量大了奕塑,列表處理很慢堂污,也是基礎(chǔ)模塊)
  • pandas很基礎(chǔ),基本數(shù)據(jù)相關(guān)都需要用到
image.png

選擇numpy+mkl這個(gè)包龄砰,不是單獨(dú)numpy單獨(dú)的包

相關(guān)模塊的基本使用

image.png

image.png

模塊的一些基本操作

numpy模塊(取別名盟猖,import numpy as aa)

  • 不知道格式的字符串排在最后
  • 三維數(shù)組排序(排數(shù)組里面元素排)
  • 切片 數(shù)組[起始下標(biāo):最終下標(biāo)+1]
    省略不寫代表衍生到頭


    image.png

pandas模塊

  • Series概念,指某一串?dāng)?shù)字(一串?dāng)?shù)字叫做一個(gè)series數(shù)字)有索引(不指定的話就是0,1,2...等排下去换棚;指定索引加上index數(shù)組)
  • DataFrame類似表格式镐,代表行列整合出來的數(shù)據(jù),指定列名(加一個(gè)columns)固蚤,還可以通過字典的方式娘汞,pandas中數(shù)字不夠會(huì)自動(dòng)填充的,填充為它本身


    image.png
image.png

結(jié)果輸出


image.png

head和tail


image.png

image.png
  • describe:統(tǒng)計(jì)數(shù)據(jù)情況夕玩,按列統(tǒng)計(jì)你弦,count(計(jì)數(shù),多少個(gè)元素燎孟,one這一列有三個(gè)元素)禽作;mean(平均數(shù));std(標(biāo)準(zhǔn)差)揩页;25%旷偿,50%,75%代表分位數(shù)(前25%的分位數(shù),前50%分位數(shù)等)


    image.png
  • 數(shù)據(jù)轉(zhuǎn)置(行列轉(zhuǎn)換)
    d.T


    image.png

數(shù)據(jù)導(dǎo)入學(xué)習(xí)

image.png

按照排序狸捅,放數(shù)據(jù)表頭第一個(gè)元素(按這個(gè)元素所有的分類的大小排序)降序利用:des和ascending=False
read_table:導(dǎo)入文本數(shù)據(jù)

  • sql導(dǎo)入衷蜓,設(shè)置connect,然后設(shè)置查詢語句
  • html讀取是讀取網(wǎng)頁標(biāo)簽里的table標(biāo)簽尘喝。
  • 導(dǎo)入數(shù)據(jù)磁浇,只導(dǎo)入數(shù)據(jù)部分不導(dǎo)入文字部分


    image.png

    image.png

matplotlib基礎(chǔ)

#折線圖/散點(diǎn)圖plot
import matplotlib.pylab as pyl
import numpy as npy
x=[1,2,3,4,8]
y=[5,7,2,1,5]
#pyl.plot(x,y)#plot(x軸數(shù)據(jù),y軸數(shù)據(jù)朽褪,展現(xiàn)形式)#多個(gè)plot的話會(huì)直接疊加上去
#pyl.show()
#默認(rèn)為折線圖置吓,設(shè)置為o就是散點(diǎn)圖
#pyl.plot(x,y,'o')
#pyl.show()
#改變散點(diǎn)的顏色
#pyl.plot(x,y,'oc') #不僅僅是青色還是散點(diǎn)圖
#顏色
'''
c:青色;r:紅色缔赠; m:品紅衍锚;g:綠色; b:藍(lán)色
y黃色 k黑色 w白色
'''
#形式
'''
直線 -
虛線 --
-.(就是-.形式)
:(細(xì)小虛線)
'''
'''
pyl.plot(x,y,'mp')
pyl.show()
'''
#點(diǎn)的樣式(表示散點(diǎn)的類型嗤堰,就不用重復(fù)用散點(diǎn)符號(hào)o)
'''
s方形 h/H六角形 *星形 +加號(hào) x(x)型 d/D菱形 p五角形 
'''
#起名字戴质,或者給x,y軸加名字
'''
pyl.plot(x,y)
x2=[1,3,6,8,10,12,19] 多條曲線的繪制
y2=[1,6,9,10,19,23,35]
pyl.plot(x2,y2)
pyl.title("show")
pyl.xlabel("peter")
pyl.ylabel("hah")
pyl.xlim(0,20) 給xy軸設(shè)定范圍
pyl.ylim(1,18)
pyl.show()
'''
#隨機(jī)數(shù)的生成
import numpy as npy
data=npy.random.random_integers(1,20,10)#整數(shù)的隨機(jī)數(shù)(最小值踢匣,最大值告匠,個(gè)數(shù))
#生成具有正態(tài)分布的隨機(jī)數(shù)(兩個(gè)重要的參數(shù):平均數(shù)和標(biāo)準(zhǔn)差,在平均數(shù)附近的人數(shù)很多离唬,大概判斷為正態(tài)分布)
#npy.random.normal(均數(shù)后专,西格瑪(越小越陡,越大越平緩输莺,生成的個(gè)數(shù))
#同一個(gè)區(qū)域
#直方圖hist
'''
data3=npy.random.normal(10.0,1.0,10000)
pyl.hist(data3)
pyl.show
'''
'''
data4=npy.random.random_integers(1,25,1000)
pyl.hist(data4)
pyl.show
'''
'''
data4=npy.random.random_integers(1,25,1000)
sty=npy.arange(2,17,4)#(橫坐標(biāo)起始戚哎,橫坐標(biāo)末端,間隔)
pyl.hist(data4,sty)
pyl.hist(data4,sty,histtype='stepfilled')(取消輪廓)
pyl.hist(data4,histtype='stepfilled')(取消間隔限制)
pyl.show()
'''
#子圖(在同一張圖片中繪制多張圖片)
#pyl.subplot(4,4,3)(行嫂用,列型凳,當(dāng)前區(qū)域())subplot將整個(gè)繪圖區(qū)域等分為行*列個(gè)子區(qū)域,
然后按照從左到右尸折,從上到下的順序?qū)γ總€(gè)子區(qū)域進(jìn)行編號(hào)啰脚,左上的子區(qū)域的編號(hào)為1
#pyl.show()
#在子圖中繪圖
pyl.subplot(2,2,1)#繪制一個(gè)兩行一列的圖片
#在這個(gè)區(qū)域里面寫得代碼會(huì)在第一個(gè)區(qū)域里面繪制
x1=[1,2,3,4,5]
y1=[5,3,5,23,5]
pyl.plot(x1,y1)

pyl.subplot(2,2,2)
#同樣輸入第二個(gè)區(qū)域的圖片數(shù)據(jù)
x2=[5,2,3,8,6]
y2=[7,9,12,12,3]
pyl.plot(x2,y2)

pyl.subplot(2,1,2)
#第三個(gè)區(qū)域
x3=[5,6,7,10,19,20,29]
y3=[6,2,4,21,5,1,5]
pyl.plot(x3,y3)
pyl.show()

讀取和訊博客的數(shù)據(jù)并可視化分析

import pandas as pda
import numpy as npy
import matplotlib.pylab as pyl
data=pda.read_csv("F:/Python/代碼/源碼/第5周/hexun.csv")
#data.shape()#看有多少行多少列 雷士descrip
#data.values[][]#[第幾行][第幾列]自動(dòng)變成數(shù)組
data.values #所有
data.values[1] #實(shí)際第二行
data.values[1][1]#具體的那個(gè)數(shù)

#本來五行 id  名字 網(wǎng)址 閱讀數(shù) 評(píng)論數(shù)
#分析所有的數(shù)據(jù)中閱讀數(shù)與評(píng)論數(shù)之間的關(guān)系
data2=data.T #轉(zhuǎn)置行變列
y1=data2.values[3] #把這一塊完全取出來
x1=data2.values[4]#獲取評(píng)論數(shù)
#pyl.plot(x1,y1)
#pyl.show()
#分析id與閱讀數(shù)之間的關(guān)系
x2=data2.values[0]#獲取id
pyl.plot(x2,y1)
pyl.show()

數(shù)據(jù)板塊作業(yè):

image.png

數(shù)據(jù)探索與清洗

數(shù)據(jù)探索核心:

  • 數(shù)據(jù)質(zhì)量分析(跟數(shù)據(jù)清洗密切聯(lián)系)
  • 數(shù)據(jù)特征分析(分布殷蛇,對(duì)比实夹,周期性,相關(guān)性粒梦,常見統(tǒng)計(jì)量)

數(shù)據(jù)清理的步驟

  • 先看數(shù)據(jù)有無缺失亮航,describe統(tǒng)計(jì)所有有值的數(shù)據(jù),len可以統(tǒng)計(jì)出沒有值的數(shù)據(jù)匀们,兩者相對(duì)比缴淋。或者通過0數(shù)據(jù)發(fā)現(xiàn)缺失值(一些價(jià)格等數(shù)據(jù)不會(huì)為0,評(píng)論數(shù)這些可以不為0)
  • 插補(bǔ)方式:均值


    image.png
#導(dǎo)入數(shù)據(jù)
import pymysql
import numpy as npy
import pandas as pda
import matplotlib.pylab as pyl
conn=pymysql.connect(host="127.0.0.1",user="root",passwd="root",db="csdn")
sql="select*from taob"
data=pda.read_sql(sql,conn)
print(data.describe())
#數(shù)據(jù)清洗
#發(fā)現(xiàn)缺失值
#price字段有缺失重抖,利用插補(bǔ)法處理(36是中位數(shù))
x=0
data["price"][(data["price"]==0)]=None #在price這個(gè)標(biāo)簽里面只要里面的內(nèi)容=0露氮,就賦值為空
for i in data.columns:
    for j in range(len(data)):
        if(data[i].isnull())[j]:
            data[i][j]="36"
            x+=1
print(x)
#異常值處理,畫散點(diǎn)圖(縱軸用評(píng)論數(shù)钟沛,橫軸用價(jià)格)
#得到價(jià)格
data2=data.T
price=data2.values[2]
#得到評(píng)論數(shù)據(jù)
comt=data2.values[3]
pyl.plot(price,comt,'o')
pyl.show
#異常值處理(評(píng)論數(shù)異常200000以上畔规,價(jià)格異常大于2300)
line=len(data.values)  #取出的是行數(shù),data.values有所有的恨统,加len得到行數(shù)
col=len(data.values[0]) #第0行加len叁扫,拿到列數(shù)
da=data.values
for i in range(0,line):
    for j in range(0,col):
        if(da[i][2]>2300):
            print(da[i][j])
            da[i][2]="36"
        if(da[i][3]>20000):
            print(da[i][j])
            da[i][2]="58"
da2=da.T
price=da2[2]
comt=da2[3]
pyl.plot(price,comt,'0')
pyl.show()
#分布分析
#得到價(jià)格的最大值最小值
pricemax=da2[2].max() #(價(jià)格是在第二行)
pricemin=da2[2].min()
#評(píng)論的最大值最小值
commentmax=da2[3].max() #(評(píng)論是在第三行)
commentmin=da2[3].min()
#極差:最大值-最小值
pricerg=pricemax-pricemin
commentrg=commentmax-commentmin
#組距:極差/組數(shù)(自己隨便定)
pricedst=pricerg/12
commentdst=commentrg/12
#畫出價(jià)格的直方圖
pricesty=npy.arange(pricemin,pricemax,pricedst)
pyl.hist(da2[2],pricesty)
pyl.show()
#畫出評(píng)論的直方圖
commentsty=npy.arange(commentmin,commentmax,commentdst)
pyl.hist(da2[3],commentsty)
pyl.show()

數(shù)據(jù)集成

image.png

同名不同意(一張表title代表商品,另一張表title不代表商品)
同意不同名


image.png

數(shù)據(jù)規(guī)約

  1. 簡單變換


    image.png
  2. 數(shù)據(jù)規(guī)范化


    image.png

離差標(biāo)準(zhǔn)化:消除單位影響

import pymysql
import pandas as pda
import numpy as npy
conn=pymysql.connect(host="127.0.0.1",user="root",passwd="root",db="csdn")
sql="select price,comment from taob"
data=pda.read_sql(sql,conn)
#離差標(biāo)準(zhǔn)化 直接使用data2處理就可以了
data2=(data-data.min())/(data.max()-data.min())
print(data2)
#標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化(也叫零-均值標(biāo)準(zhǔn)化):有正負(fù)畜埋,一半一半莫绣,他們的平均數(shù)為0,標(biāo)準(zhǔn)差為1
data3=(data-data.mean())/data.std()
print(data3)
#小數(shù)定標(biāo)規(guī)范化
k=npy.ceil(npy.log10(data.abs().max())) #ceil是取整數(shù)(3.1取到4悠鞍,3.6取到4)
data4=data/10**k
  1. 離散化(將連續(xù)數(shù)據(jù)變成離散數(shù)據(jù)对室,把0-10的數(shù)據(jù)歸為一類,10-20歸為一類)
  • 等寬離散化(將屬性的值分為具有相同寬度的區(qū)間)
  • 等頻率離散化(相同數(shù)量的記錄放進(jìn)去咖祭,把相同頻率的點(diǎn)放在一個(gè)區(qū)間)
  • 一維聚類離散化(將屬性的值先用聚類算法)
#連續(xù)性數(shù)據(jù)離散化
#等寬離散化
data5=data[u"price"].copy() #拷貝一份软驰,加u固定數(shù)據(jù)
data6=data5.T
data7=data6.values
#cut 函數(shù)
# pda.cut(data,k,label=["便宜","適中","有點(diǎn)貴","天價(jià)"])
#k等分為幾分,如果k=4心肪,四份锭亏;也可以用數(shù)組[3,6,10,19],label每個(gè)區(qū)域的標(biāo)簽名字
k=3
c1=pda.cut(data7,k,label=["便宜","適中","有點(diǎn)貴"])
print(c1)
#非等寬離散化
k=[0,50,100,300,500,2000,data7.max()]
c2=pda.cut(data7,k,label=["非常便宜","便宜","適中","有點(diǎn)貴","很貴","非常貴"])
print(c2)

屬性構(gòu)造

例如根據(jù)一個(gè)博客的評(píng)論數(shù)和點(diǎn)擊數(shù)硬鞍,構(gòu)造一個(gè)點(diǎn)評(píng)比等

#屬性構(gòu)造
import pymysql
import pandas as pda
import numpy as npy
conn=pymysql.connect(host="127.0.0.1",user="root",passwd="root",db="hexun")
sql="select * from myhexun"
data8=pda.read_sql(sql,conn)
print(data8)
ch=data8[u"comment"]/data8[u"hits"]
data[u"評(píng)點(diǎn)比"]=ch
#把這個(gè)評(píng)點(diǎn)比寫進(jìn)文件
file="./hexun.xls"
data8.to_excel(file,index=False)#索引index=無

規(guī)約

規(guī)約=精簡

  1. 屬性規(guī)約(采用降維度慧瘤,丟掉一些屬性)
  2. 數(shù)值規(guī)約(化范圍0-100,100-200)

主成分分析

  • 主要用來屬性規(guī)約
  • PCA算法(主要用來屬性降維,在盡量保持?jǐn)?shù)據(jù)本質(zhì)的情況下將數(shù)據(jù)維數(shù)降低固该,將n維特征映射到K維上锅减,k是有正交特征,k維特征也稱為組元)
#屬性構(gòu)造
import pymysql
import pandas as pda
import numpy as npy
from sklearn.decomposition import PCA
conn=pymysql.connect(host="127.0.0.1",user="root",passwd="root",db="hexun")
sql="select hits,comment from myhexun"
data9=pda.read_sql(sql,conn)
print(data9)
ch=data9[u"comment"]/data9[u"hits"]
data[u"評(píng)點(diǎn)比"]=ch
#主成分分析進(jìn)行中
pca1=PCA()
pca1.fit(data9) #利用pca來處理data9
Characteristic=pca1.components #返回模型中各個(gè)特征向量
print(Characteristic)
#各個(gè)成分中各自方差的百分比伐坏,貢獻(xiàn)率
rate=pca1.explained_variance_ratio_
print(rate)
#主成分分析
pca2=PCA(2) #()內(nèi)為希望的維數(shù)
pca2.fit(data9)
reduction=pca2.transform(data9) #降維
print(reduction)
recovery=pca2.inverse_transform(reduction) #對(duì)其還原
print(recovery)

文本挖掘

跟數(shù)據(jù)有關(guān)
遇到的問題:由于目標(biāo)計(jì)算機(jī)積極拒絕怔匣,無法連接

一般txt不能分析的話,新建一個(gè)txt另存為utf-8桦沉,如果還是不行每瞒,存為一個(gè)html網(wǎng)頁用urllib爬出來,在讀取

import jieba
sentence="我喜歡上海東方明珠"
w1=jieba.cut(sentence,cut_all=True)#第一個(gè)參數(shù)要分詞的話纯露,第二個(gè)參數(shù):分詞模式:全模式(分詞很全剿骨,可能疊加)
#遇到generator要用循環(huán)把他變出
for item in w1:
    print(item)
'''
#把cut_all改成false 精準(zhǔn)模式(根據(jù)優(yōu)先級(jí))
w2=jieba.cut(sentence,cut_all=False)
for item in w2:
    print(item)

#第三種 搜索引擎模式(利用搜索引擎的原理)
w3=jieba._lcut_for_search(sentence)
for item in w3:
    print(item)

#默認(rèn)的分詞模式(默認(rèn)采用精準(zhǔn)模式)
w4=jieba.cut(sentence)
for item in w4:
    print(item)

#詞性標(biāo)注 利用posseg方法

import jieba.posseg
w5=jieba.posseg.cut(sentence)
#.flag詞性
#.word詞語
for item in w5:
    print(item.word+"---"+item.flag)
'''
'''
a:形容詞 
c:連詞
d:副詞
e:嘆詞
f:方位語
i:成語
m:數(shù)詞
n:名詞
nr:人名
ns:地名
nt:機(jī)構(gòu)團(tuán)體
nz:其他專有名詞
p:介詞
r:代詞
t:時(shí)間
u:助詞
v:動(dòng)詞
vn:名動(dòng)詞
w:標(biāo)點(diǎn)符號(hào)
un:未知詞語
'''
'''
#新建詞典之后,詞典加載(新加詞典記得更改為utf-8)
jieba.load_userdict("") #新加的詞典目錄,不是持久化存儲(chǔ)的埠褪,每一個(gè)需要添加一次
sentence2="天善智能是一個(gè)很好的機(jī)構(gòu)"
w6=jieba.posseg.cut(sentence2)
for item in w6:
    print(item.word+"---"+item.flag)

#更改詞頻浓利,兩種方式
sentence="我喜歡上海東方明珠"
w7=jieba.cut(sentence)
for item in w7:
    print(item)
#發(fā)現(xiàn)上海挤庇,東方是兩個(gè)詞語,我們想要得到上海東方贷掖,結(jié)合在一起
#add_word把詞語添加在字典中嫡秕,我們要修改詞頻(有點(diǎn)問題)
jieba.suggest_freq("上海東方",True)
w8=jieba.cut(sentence)
for item in w8:
    print(item)


#返回文本中詞頻高的詞語,關(guān)鍵詞
import jieba.analyse
sentence3="我喜歡上海東方明珠"
tag=jieba.analyse.extract_tags(sentence3,3) #第二個(gè)參數(shù)苹威,提取詞頻高的前幾個(gè)參數(shù)淘菩,默認(rèn)20個(gè)
print(tag)

#返回詞語的位置
w9=jieba.tokenize(sentence)
for item in w9:
    print(item)

#以搜索引擎的模式來返回詞語的位置
w10=jieba.tokenize(sentence,mode="search")
for item in w10:
    print(item)
'''

#分析血尸的詞頻,一開始無法打開,加上utf-8還無法打開之后
#直接新建一個(gè)文本文檔屠升,全部復(fù)制過去潮改,另存為的時(shí)候調(diào)為utf-8
#編碼問題解決方案
import urllib.request
data=urllib.request.urlopen("http://127.0.0.1/dmbj.html").read.decode("utf-8","ignore")
tag=jieba.analyse.extract_tags(data,20)
print(tag)

Mysql爬蟲補(bǔ)充

spider dangdang代碼部分(注意Dangdangitem包的引用)

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request

from dangdang.dd.items import DangdangItem


class DdSpider(scrapy.Spider):
    name = "dd"
    allowed_domains = ["dangdang.com"]
    start_urls = (
        'http://www.dangdang.com/',
    )

    def parse(self, response):
        item=DangdangItem()
        item["title"]=response.xpath("http://a[@class='pic']/@title").extract()
        item["link"] = response.xpath("http://a[@class='pic']/@href").extract()
        item["comment"] = response.xpath("http://a[@name='itemlist-review']/text()").extract()

        yield item
        for i in range(2,101):
            url="http://category.dangdang.com/pg"+str(i)+"-cp01.54.06.00.00.00.html"
            yield Request(url,callback=self.parse)

pipeline代碼部分

# -*- coding: utf-8 -*-
import pymysql
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html


class DangdangPipeline(object):
    def process_item(self, item, spider):
        conn = pymysql.connect(host="127.0.0.1", user="root", passwd="123456", db="dd")
        for i in range(0,len(item["title"])):
            title=item["title"][0]
            link=item["link"][0]
            comment=item["comment"][0]
#編碼的問題解決方案
            conn.set_charset("utf8")
            cursor=conn.cursor()
            cursor.execute('SET NAMES utf8;')
            cursor.execute('SET CHARACTER SET utf8;')
            cursor.execute('SET character_set_connection=utf8;')
#sql插入的格式
            sql="insert into goods(title,link,comment) values('"+title+"','"+link+"','"+comment+"')"
            conn.query(sql)
            conn.commit()
        conn.close()
        return item

Navicat用法:
crtl+s 保存退出

Mysql基本的語句:
進(jìn)入:F:\MySQL\mysql-5.7.20-winx64\bin>mysql -u root -p
mysql> use dd
Database changed
mysql> select * from goods(映射goods表內(nèi)所有的內(nèi)容)
sql語句中輸入的時(shí)候想要退出 ;+enter

反思:耐心看cmd里面的error

文本相似度分析

TF-IDF:用來評(píng)估一個(gè)詞對(duì)于文件的
重要性腹暖。與出現(xiàn)的次數(shù)成正比汇在,用來相似度的計(jì)算。

稀疏向量和稀疏矩陣

相似度分析的步驟


image.png
#文本相似度計(jì)算脏答,以詞語為單位糕殉,分詞
from gensim import corpora,models,similarities
import  jieba
from collections import  defaultdict
#1 得到文檔的內(nèi)容
doc1="F:/Python/test/peter/d1.txt"
doc2="F:/Python/test/peter/d2.txt"
d1=open(doc1).read()
d2=open(doc2).read()
#2 分詞
data1=jieba.cut(d1)
data2=jieba.cut(d2)
#3 整理為指定格式"詞語1 詞語2 詞語3....詞語n"整理成這種格式
data11=""
for item in data1:
    data11+=item+" "
data21=""
for item in data2:
    data21+=item+" "
#如果有第三個(gè)文檔直接加在后面就行
documents=[data11,data21]
#4 計(jì)算詞語的頻率(沒看懂)
texts=[[word for word in document.split()]
        for document in  documents]
frequency=defaultdict(int)
for text in texts:
    for token in text:
        frequency[token]+=1
#5 過濾掉部分低頻詞匯
texts=[[word for word in text if frequency[token]>=1]
for text in texts]
#6 建立詞典
dictionary=corpora.Dictionary(texts)
dictionary.save("F:/Python/test/peter/wenben2.dict")
#7 加載要對(duì)比的文檔
doc3="F:/Python/test/peter/d3.txt"
d3=open(doc3).read()
data3=jieba.cut(d3)
data31=""
for item in data3:
    data31+=item+" "
new_doc=data31
#8 變?yōu)橄∈柘蛄浚梢灾苯邮褂胐oc2bow
new_vec=dictionary.doc2bow(new_doc.split())
#9 依據(jù)稀疏向量進(jìn)一步處理得到語料庫
corpus=[dictionary.doc2bow(text) for text in texts]
#10 通過models處理,得到tfidf
tfidf=models.TfidfModel(corpus)
corpora.MmCorpus.serialize("F:/Python/test/peter/d3.mm",corpus)
#11 通過tfidf得到特征向量
featureNum=len(dictionary.token2id.keys())
#12 稀疏矩陣相似度殖告,建立索引
index=similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=featureNum)
sim=index[tfidf[new_vec]]
print(sim)

image.png

從后到左阿蝶,從后往前

目前的問題

pca 稀疏向量 127.0.0.1

Python數(shù)據(jù)建模

image.png

模型的建立依賴算法

Python數(shù)據(jù)分類實(shí)現(xiàn)過程

image.png

常見的分類算法

image.png

KNN算法

總的原則:物以類聚,人以群分黄绩。判斷這一個(gè)事情的特征進(jìn)行分類羡洁。

計(jì)算所有點(diǎn)到M點(diǎn)的距離,找出距離最近的點(diǎn)爽丹,KNN(中的k是指選擇幾個(gè)點(diǎn)筑煮,k=4,選擇最近的4個(gè)點(diǎn)粤蝎,圖中選出cbgn真仲,看哪個(gè)類別占的越多,就把他歸為那一類)

knn算法實(shí)現(xiàn)步驟

  • 處理數(shù)據(jù)
  • 數(shù)據(jù)向量化
  • 計(jì)算歐幾里得距離
  • 按照距離分類
from numpy import *
import operator
def knn(k,testdata,traindata,labels):
    traindatasize=traindata.shape[0] #取到行數(shù)初澎,1取列數(shù)
    dif=tile(testdata,(traindatasize,1))-traindata#轉(zhuǎn)換維度(范本有四個(gè)點(diǎn)秸应,這邊讓他變成4個(gè)點(diǎn))計(jì)算出差值
    #對(duì)已經(jīng)存在的數(shù)組進(jìn)行維度拓展,tile(要拓展的數(shù)組碑宴,重復(fù)多少次)
    #從縱方向拓展tile(a,(size,1)) 改成1软啼,size是重復(fù)幾次

    #計(jì)算差值平方
    sqdif=dif**2

    sumsqdif=sqdif.sum(axis=1) #每一行求和
    distance=sumsqdif**0.5
    sortdistance=distance.argsort() #排序,他的結(jié)果是每一位的序號(hào)
    count={}
    for i in range(0,k):
        vote=labels[sortdistance[i]]  #labels相當(dāng)于一個(gè)字典
        count[vote]=count.get(vote,0)+1
    sortcount=sorted(count.items(),key=operator.itemgetter(1),revers=True)#reverse=true 降序
    sortcount[0][0]

參考文章
https://www.cnblogs.com/ybjourney/p/4702562.html

手寫體數(shù)字的識(shí)別

讀取每個(gè)像素墓懂,如果是黑色的就用數(shù)字1表示在這個(gè)像素上面
利用pillow模塊處理模塊

from numpy import *
import operator
def knn(k,testdata,traindata,labels):
    traindatasize=traindata.shape[0] #取到行數(shù)焰宣,1取列數(shù)
    dif=tile(testdata,(traindatasize,1))-traindata#計(jì)算出差值
    #對(duì)已經(jīng)存在的數(shù)組進(jìn)行維度拓展霉囚,tile(要拓展的數(shù)組捕仔,重復(fù)多少次)
    #從縱方向拓展tile(a,(size,1)) 改成1,size是重復(fù)幾次

    #計(jì)算差值平方
    sqdif=dif**2

    sumsqdif=sqdif.sum(axis=1) #每一行求和
    distance=sumsqdif**0.5
    sortdistance=distance.argsort() #排序,他的結(jié)果是每一位的序號(hào)
    count={}
    for i in range(0,k):
        vote=labels[sortdistance[i]]  #labels相當(dāng)于一個(gè)字典
        count[vote]=count.get(vote,0)+1
    sortcount=sorted(count.items(),key=operator.itemgetter(1),revers=True)#reverse=true 降序
    sortcount[0][0]


#圖片處理
#先將所有圖片轉(zhuǎn)化為固定寬高(用圖片軟件就行)榜跌,然后再轉(zhuǎn)化為文本
from PIL import Image
from numpy import *
from os import listdir
im=Image.open("C:/Users/me/Pictures/weixin3.jpg")#圖片地址
fh=open("C:/Users/me/Pictures/weixin3.txt","a") #追加的模式
im.save("C:/Users/me/Pictures/weixin.bmp") #保存為一個(gè)新的圖片
width=im.size[0]#圖片寬和高size[0] 寬
height=im.size[1]
k=im.getpixel((1,9)) #獲取像素(那個(gè)坐標(biāo)點(diǎn))顏色
#例如返回RGB(255闪唆,255,255)钓葫,白色的悄蕾,加入三者之和為0,則黑色
for i in range(0,width):
    for j in range(0,height):
        cl=im.getpixel((i,j))
        clall=cl[0]+cl[0]+cl[0]
        if(clall==0):
            #黑色
            fh.write("1")
        else:
            fh.write("0")
    fh.write("\n")
fh.close()
#加載數(shù)據(jù)
def datatoarray(fname):
    arr=[]
    fh=open(fname)
    for i in range(0,32):
        thisline=fh.readline()
        for j in range(0,32):
            arr.append(int(thisline[j]))
    return arr
#建立一個(gè)函數(shù)取文件前綴
def seplabel(fname):
    filestr=fname.split(".")[0]
    label=int(filestr.split(".")[0])
    return label
#建立訓(xùn)練數(shù)據(jù)
def traindata():
    labels=[]
    #listdir("文件夾名字")可以的到一個(gè)文件夾下所有的文件名
    trainfile=listdir("")
    num=len(trainfile)
    #行的長度為1024(列)础浮,每一行存儲(chǔ)一個(gè)文件
    #用一個(gè)數(shù)組存儲(chǔ)所有的訓(xùn)練數(shù)據(jù)帆调,行:文件總數(shù),列:1024
    #zeros((2,5))生成兩行五列的0
    trainarr=zeros((num,1024)) #相當(dāng)于一個(gè)初始化
    for i in range(0,num):
        thisfname=trainfile[i]
        thislabel=seplabel(thisfname)
        labels.append(thislabel)
        trainarr[i,:]=datatoarray("traindata/"+thisfname) #理解為為i行上寫上以下的的內(nèi)容
    return trainarr,labels
#用測試數(shù)據(jù)調(diào)用KNN算法去測試豆同,看是否能夠準(zhǔn)確識(shí)別
def datatest():
    trainarr,labels=traindata() #拿到訓(xùn)練集
    testlist=listdir("testdata")
    tnum=len(testlist)
    for i in range(0,tnum):
        thistestfile=testlist[i] #得到當(dāng)前測試文件
        testarr=datatoarray("testdata/" + thistestfile)
        rknn = knn(3, testarr, trainarr, labels)
        print(rknn)
datatest()

#抽某一個(gè)測試文件出來進(jìn)行試驗(yàn)
trainarr,labels=traindata()
thistestfile=""
testarr=datatoarray(""+thistestfile)
rknn=knn(3,testarr,trainarr,labels)
print(rknn)

邏輯回歸

做不出來番刊,可能是sklearn包有問題導(dǎo)致的

"""  
'''''1. data1 是40名癌癥病人的一些生存資料, 
其中影锈,X1表示生活行動(dòng)能力評(píng)分(1~100)芹务, 
X2表示病人的年齡,X3表示由診斷到直入研究時(shí)間(月)鸭廷; 
X4表示腫瘤類型枣抱,X5把ISO兩種療法(“1”是常規(guī),“0”是試驗(yàn)新療法)辆床; 
Y表示病人生存時(shí)間(“0”表示生存時(shí)間小于200天佳晶, 
“1”表示生存時(shí)間大于或等于200天) 
試建立Y關(guān)于X1~X5的logistic回歸模型'''  
#######################################################  
#讀取整理數(shù)據(jù)  
import pandas as pd  
from sklearn.linear_model import LogisticRegression as LR  
from sklearn.linear_model import RandomizedLogisticRegression as RLR   
data=pd.read_table('data1.txt',encoding='gbk')  
data  
x=data.iloc[:,1:6].as_matrix()  
y=data.iloc[:,6].as_matrix()  
rlr = RLR() #建立隨機(jī)邏輯回歸模型,篩選變量  
rlr.fit(x, y) #訓(xùn)練模型  
rlr.get_support() #獲取特征篩選結(jié)果讼载,也可以通過.scores_方法獲取各個(gè)特征的分?jǐn)?shù)  
print(u'通過隨機(jī)邏輯回歸模型篩選特征結(jié)束宵晚。')  
print(u'有效特征為:%s' % ','.join(data.columns[rlr.get_support()]))  
x = data[data.columns[rlr.get_support()]].as_matrix() #篩選好特征  
  
lr = LR() #建立邏輯回歸模型  
lr.fit(x, y) #用篩選后的特征數(shù)據(jù)來訓(xùn)練模型  
print(u'邏輯回歸模型訓(xùn)練結(jié)束。')  
print(u'模型的平均正確率為:%s' % lr.score(x, y)) #給出模型的平均正確率维雇,本例為0.75  

貝葉斯算法

image.png
import numpy
class Bayes:
    def _init_(self): #初始化這個(gè)類淤刃,最開始執(zhí)行
        #初始化參數(shù)length
        self.length=-1 #length=-1 表示未經(jīng)過訓(xùn)練,如果經(jīng)過訓(xùn)練肯定是有數(shù)據(jù)的則大于等于0
        self.labelcount=dict()
        self.vectorcount=dict()
    def fit(self,dataSet:list,labels:list): #數(shù)據(jù)集吱型,標(biāo)簽集
        if(len(dataSet)!=len(labels)):
            raise ValueError("輸入的測試數(shù)組與類別數(shù)組長度不一致")
        self.length=len(dataSet[0]) #測試數(shù)據(jù)特征值的長度
        labelsnum=len(labels) #得到所有類別的數(shù)量
        norlabels=set(labels) #得到不重復(fù)類別的數(shù)量
        for item in norlabels:
            thislabel=item #得到當(dāng)前類別,看當(dāng)前類別一共有多少的數(shù)據(jù)
            self.labelcount[thislabel]=labels.count(thislabel)/labelsnum #求當(dāng)前類別占總數(shù)的比例
        for vector,label in zip(dataSet,labels): #相當(dāng)于是兩個(gè)一起的循環(huán) 例如 [[A,100010].[B.110001]]的循環(huán)
            if(label not in self.vectorcount): #一開始為空逸贾,只要不在都往里面填入,但不要重復(fù)的津滞,就可以寫成 [A,100010,100011] [B,101000]
                self.vectorcount[label]=[]
            self.vectorcount[label].append(vector)
            print("訓(xùn)練結(jié)束")
            return  self
    def btest(self,TestData,labelsSet):
        if(self.length==-1):
            raise ValueError("還未訓(xùn)練")
        #計(jì)算當(dāng)前testdata分別為各個(gè)類別的概率
        IbDict=dict()
        for thisIb in labelsSet:
            p=1
            alllabel=self.labelcount[thisIb] #先求出這個(gè)標(biāo)簽的總占比
            allvector=self.vectorcount[thisIb] #拿到這個(gè)標(biāo)簽對(duì)應(yīng)的數(shù)據(jù)[A,100010,100011] ([B,101000]這個(gè)就沒有了)
            vnum=len(allvector) #數(shù)據(jù)集的個(gè)數(shù)
            allvector=numpy.array(allvector).T
            for index in range(0,len(TestData)):
                vector=list(allvector[index])
                p*=vector.count(TestData[index])/vnum #相當(dāng)于+= 累乘
            IbDict[thisIb]=p*alllabel
        thislabel=sorted(IbDict,key=lambda x:IbDict[x],reverse=True)[0]
        return thislabel

決策樹算法

ID3 看信息的價(jià)值
C4.5
CART

信息熵的計(jì)算
log以2為底
去分析得到信息增益

import pandas as pda
from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO
from sklearn.tree import DecisionTreeClassifier as DTC
fname="F:/Python/code/code/8/xiaoliang.csv"
dataf=pda.read_csv(fname,encoding="gbk")
x=dataf.iloc[:,1:5].as_matrix()
y=dataf.iloc[:,5].as_matrix()
#遍歷x這個(gè)二維數(shù)組
for i in range(0,len(x)):
    for j in range(0,len(x[i])):
        thisdata=x[i][j]
        if(thisdata=="是" or thisdata=="多" or thisdata=="高"):
            x[i][j]=int(1)
        else:
            x[i][j] = -1
for i in range(0,len(y)):
    thisdata=y[i]
    if(thisdata=="高"):
        y[i]=1
    else:
        y[i]=-1
"""
#容易錯(cuò)的地方: 如下直接使用
#建立決策樹
from sklearn.tree import DecisionTreeClassifier as DTC
dtc=DTC(criterion="entropy") #將參數(shù)設(shè)置為信息熵的模式
dtc.fit(x,y) #此時(shí)訓(xùn)練就會(huì)出錯(cuò)铝侵,y是一維而且不是數(shù)字類型
"""
#正確的做法:轉(zhuǎn)化好格式,將x触徐,y轉(zhuǎn)化為數(shù)據(jù)框咪鲜,然后再轉(zhuǎn)化為數(shù)組并指定格式
xf=pda.DataFrame(x) #把數(shù)據(jù)轉(zhuǎn)化為數(shù)據(jù)框
yf=pda.DataFrame(y)
x2=xf.as_matrix().astype(int) #指定形式和格式,不讓他們有那個(gè)type=object
y2=yf.as_matrix().astype(int)
dtc=DTC(criterion="entropy")
dtc.fit(x2,y2)
#可視化決策樹
with open("F:/Python/code/code/8/dtc.dot","w") as file:  #打開建立這個(gè)文件
    export_graphviz(dtc,feature_names=["combat","num","promotion","datum"],out_file=file)#(決策樹的名稱撞鹉,特征的名稱,out_file=指定輸出文件)

#利用程序直接預(yù)測銷量高低疟丙,格式要保持與x2一致颖侄,構(gòu)建一個(gè)二維數(shù)組
x3=npy.array([1,-1,-1,1],[1,1,1,1],[-1,1,-1,1])
result=dtc.predict(x3)
print(result)

決策樹往左看是負(fù)能量,往右看是正能量
如圖promotion【8享郊,3】 說明8個(gè)沒有促銷览祖,3個(gè)有
信息熵表示信息增益,越大表示占越大權(quán)重炊琉,更有用


image.png

聚類

指定聚類的個(gè)數(shù)展蒂,自動(dòng)將數(shù)據(jù)分為那么多類。

聚類三法

劃分法(主要利用劃分的方法聚類)苔咪、層次分析法(從上到下锰悼,從下到上兩種)、密度分析法(觀察數(shù)據(jù)密度团赏,大于某個(gè)閾值松捉,比較好的)、網(wǎng)格法馆里、模型法隘世。

kmeans算法屬于劃分法材彪。
k個(gè)點(diǎn)就表示k類別

kmeans的步驟

image.png

#通過程序?qū)崿F(xiàn)對(duì)錄取學(xué)生的聚類
#通過程序?qū)崿F(xiàn)淘寶商品的聚類
import numpy as npy
from sklearn.cluster import  Birch
from sklearn.cluster import KMeans
import pandas as pda
import matplotlib.pylab as pyl
fname="F:/Python/code/code/8/luqu2.csv"
dataf=pda.read_csv(fname)
x=dataf.iloc[:,1:4].as_matrix()
kms=KMeans(n_clusters=4,n_jobs=2,max_iter=500) #(指定聚類的個(gè)數(shù),指定線程數(shù)惠猿,最大的循環(huán)次數(shù))
y=kms.fit_predict(x)
print(y) #y為多少表示為在第幾類
#畫圖 x代表學(xué)生序號(hào) y代表學(xué)生類別
s=npy.arange(0,len(y))
pyl.plot(s,y,"o")
pyl.show()
#商品的聚類
import pymysql
conn=pymysql.connect(host="127.0.0.1",user="root",passwd="root",db="tb")
sql="select price,comment from goods limit 30" #選擇讀出的字段刘陶,從哪個(gè)表阔馋,限制讀出來的數(shù)量
dataf=pda.read_sql(sql,conn)
x=dataf.iloc[:,:].as_matrix()
kms=KMeans(n_clusters=3) #(指定聚類的個(gè)數(shù),指定線程數(shù)巢音,最大的循環(huán)次數(shù))
y=kms.fit_predict(x)
print(y) #y為多少表示為在第幾類
for i in range(0,len(y)):
    if(y[i]==0):  #繪制第0類
        pyl.plot(dataf.iloc[i:i+1,0].as_matrix(),dataf.iloc[i:i+1,1].as_matrix(),"*r")
    elif(y[i]==1):
        pyl.plot(dataf.iloc[i:i+1,0].as_matrix(),dataf.iloc[i:i+1,1].as_matrix(),"sy")
    elif(y[i]==2):
        pyl.plot(dataf.iloc[i:i+1,0].as_matrix(),dataf.iloc[i:i+1,1].as_matrix(),"pk")
pyl.show()

貝葉斯應(yīng)用

import numpy
from numpy import *
from os import listdir
import numpy as npy
class Bayes:
    def __init__(self): #初始化這個(gè)類划址,最開始執(zhí)行(四個(gè)杠蛀骇,不要寫錯(cuò))
        #初始化參數(shù)length
        self.length=-1 #length=-1 表示未經(jīng)過訓(xùn)練和泌,如果經(jīng)過訓(xùn)練肯定是有數(shù)據(jù)的則大于等于0
        self.labelcount=dict()
        self.vectorcount=dict()
    def fit(self,dataSet:list,labels:list): #數(shù)據(jù)集评汰,標(biāo)簽集
        if(len(dataSet)!=len(labels)):
            raise ValueError("輸入的測試數(shù)組與類別數(shù)組長度不一致")
        self.length=len(dataSet[0]) #測試數(shù)據(jù)特征值的長度
        labelsnum=len(labels) #得到所有類別的數(shù)量
        norlabels=set(labels) #得到不重復(fù)類別的數(shù)量
        for item in norlabels:
            thislabel=item #得到當(dāng)前類別,看當(dāng)前類別一共有多少的數(shù)據(jù)
            self.labelcount[thislabel]=labels.count(thislabel)/labelsnum #求當(dāng)前類別占總數(shù)的比例
        for vector,label in zip(dataSet,labels): #相當(dāng)于是兩個(gè)一起的循環(huán) 例如 [[A,100010].[B.110001]]的循環(huán)
            if(label not in self.vectorcount): #一開始為空纷捞,只要不在都往里面填入,但不要重復(fù)的被去,就可以寫成 [A,100010,100011] [B,101000]
                self.vectorcount[label]=[]
            self.vectorcount[label].append(vector)
        print("訓(xùn)練結(jié)束")
        return self
    def btest(self,TestData,labelsSet):
        if(self.length==-1):
            raise ValueError("還未訓(xùn)練")
        #計(jì)算當(dāng)前testdata分別為各個(gè)類別的概率
        IbDict=dict()
        for thisIb in labelsSet:
            p=1
            alllabel=self.labelcount[thisIb] #先求出這個(gè)標(biāo)簽的總占比
            allvector=self.vectorcount[thisIb] #拿到這個(gè)標(biāo)簽對(duì)應(yīng)的數(shù)據(jù)[A,100010,100011] ([B,101000]這個(gè)就沒有了)
            vnum=len(allvector) #數(shù)據(jù)集的個(gè)數(shù)
            allvector=numpy.array(allvector).T
            for index in range(0,len(TestData)):
                vector=list(allvector[index])
                p*=vector.count(TestData[index])/vnum #相當(dāng)于+= 累乘
            IbDict[thisIb]=p*alllabel
        thislabel=sorted(IbDict,key=lambda x:IbDict[x],reverse=True)[0]
        return thislabel
#加載數(shù)據(jù)
def datatoarray(fname):
    arr=[]
    fh=open(fname)
    for i in range(0,32):
        thisline=fh.readline()
        for j in range(0,32):
            arr.append(int(thisline[j]))
    return arr
#建立一個(gè)函數(shù)取文件前綴
def seplabel(fname):
    filestr=fname.split(".")[0]
    label=int(filestr.split("_")[0])
    return label
#建立訓(xùn)練數(shù)據(jù)
def traindata():
    labels=[]
    #listdir("文件夾名字")可以的到一個(gè)文件夾下所有的文件名
    trainfile=listdir("F:/Python/code/code/7/testandtraindata/traindata")
    num=len(trainfile)
    #行的長度為1024(列)主儡,每一行存儲(chǔ)一個(gè)文件
    #用一個(gè)數(shù)組存儲(chǔ)所有的訓(xùn)練數(shù)據(jù),行:文件總數(shù)惨缆,列:1024
    #zeros((2,5))生成兩行五列的0
    trainarr=zeros((num,1024)) #相當(dāng)于一個(gè)初始化
    for i in range(0,num):
        thisfname=trainfile[i]
        thislabel=seplabel(thisfname)
        labels.append(thislabel)
        trainarr[i,:]=datatoarray("F:/Python/code/code/7/testandtraindata/traindata/"+thisfname) #理解為為i行上寫上以下的的內(nèi)容
    return trainarr,labels
bys=Bayes()
#訓(xùn)練數(shù)據(jù)
train_data,labels=traindata()
bys.fit(train_data,labels)
#測試
thisdata=datatoarray("F:/Python/code/code/7/testandtraindata/traindata/8_90.txt")
labelsall=[0,1,2,3,4,5,6,7,8,9]
#識(shí)別單個(gè)手寫體數(shù)字
'''
result=bys.btest(thisdata,labelsall)
print(result)
'''
#識(shí)別多個(gè)手寫體數(shù)字
testfileall=listdir("F:/Python/code/code/7/testandtraindata/testdata")
num=len(testfileall)
for i in range(0,num):
    thisfilename=testfileall[i] #得到當(dāng)前文件名
    thislabel=seplabel(thisfilename)
    thisdataarray=datatoarray("F:/Python/code/code/7/testandtraindata/testdata/"+thisfilename)
    label=bys.btest(thisdataarray,labelsall)
    #print("該數(shù)字是:"+str(thislabel)+",識(shí)別出來的是"+str(label))
    #計(jì)算錯(cuò)誤率
    x=0
    if (label!=thislabel):
        x+=1
print(x)
print("錯(cuò)誤率是:",str(float(x)/float(num))

人工神經(jīng)網(wǎng)絡(luò)

在分類用的很多

  • BP神經(jīng)網(wǎng)絡(luò):會(huì)根據(jù)誤差做一些計(jì)算糜值,如圖第一層兩個(gè)節(jié)點(diǎn)(輸入層),第二層五個(gè)節(jié)點(diǎn)(隱藏層)坯墨,第三層一般只有一個(gè)節(jié)點(diǎn)(輸出層)寂汇。 每一個(gè)輸入層的點(diǎn)在第二層進(jìn)行計(jì)算,權(quán)值變動(dòng)=學(xué)習(xí)率誤差輸出

人工神經(jīng)網(wǎng)絡(luò)實(shí)戰(zhàn)

一些問題:

  • 1捣染、The nb_epoch argumenthas been renamed epochs everywhere.所以神經(jīng)網(wǎng)絡(luò)的訓(xùn)練次數(shù)需要用epochs來定義骄瓣,不再是nb_epoch 。
    以前寫法:
    model.fit(X_train, y_train,validation_data=(X_test, y_test), nb_epoch=69, batch_size=200, verbose=2)
    正確寫法:
    model.fit(X_train, y_train,validation_data=(X_test, y_test), epochs=69, batch_size=200, verbose=2)
  • import os
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
    image.png

課程銷量預(yù)測代碼

#bp人工神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)
#1.讀取數(shù)據(jù)
#2.keras.models Sequential (建立模型)/keras.layer.core 下面的Dense Activation(添加激活函數(shù))主要建立輸入層和輸出層
#3.sequential建立模型
#4.dense建立層
#5.activation激活函數(shù)
#6.compile模型編譯
#7.fit訓(xùn)練(學(xué)習(xí))
#8.驗(yàn)證(測試耍攘,分類預(yù)測)

#讀取數(shù)據(jù)
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import pandas as pda
fname="/Users/yuanxin/Desktop/lesson.csv"
dataf=pda.read_csv(fname,encoding="gbk")
x=dataf.iloc[:,1:5].as_matrix()
y=dataf.iloc[:,5].as_matrix()
for i in range(0,len(x)):
    for j in range(0,len(x[i])):
        thisdata=x[i][j]
        if(thisdata=="是" or thisdata=="多" or thisdata=="高"):
            x[i][j]=int(1)
        else:
            x[i][j]=0
for i in range(0,len(y)):
    thisdata=y[i]
    if(thisdata=="高"):
        y[i]=1
    else:
        y[i]=0
#下面四行是一個(gè)固定的套路榕栏,需要轉(zhuǎn)化好格式畔勤,前兩步將x,y轉(zhuǎn)化為數(shù)據(jù)框臼膏,然后兩步轉(zhuǎn)化為數(shù)組并指定格式
xf=pda.DataFrame(x)
yf=pda.DataFrame(y)
x2=xf.as_matrix().astype(int)
y2=yf.as_matrix().astype(int)

#利用人工神經(jīng)網(wǎng)絡(luò)模型
from keras.models import Sequential
from keras.layers.core import Dense,Activation
model=Sequential()
model.add(Dense(10,input_dim=4)) #第一個(gè)表示輸入層數(shù)硼被,一般沒什么要求示损;inputdim代表有多少個(gè)特征
model.add(Activation("relu"))#用acti建立激活函數(shù),relu這個(gè)函數(shù)準(zhǔn)確率比較高
#上面做完了輸入層 現(xiàn)在做輸出層
#輸出層
model.add(Dense(1,input_dim=1))  #一般輸出的話就用一個(gè)輸出層,特征就一個(gè)
model.add(Activation("sigmoid")) #因?yàn)榻Y(jié)果是二元的渗磅,所以我們用二元分類sigmod
#模型的編譯
model.compile(loss="binary_crossentropy",optimizer="adam") #loss是損失函數(shù),一般二元的就用這種;optimizer求解方法检访,常用adam始鱼;
#訓(xùn)練
model.fit(x2,y2,epochs=1000,batch_size=100) #epochs 學(xué)習(xí)的次數(shù),batch_size?
#預(yù)測分類
rst=model.predict_classes(x).reshape(len(x))
x=0
for i in range(0,len(x2)):
    if(rst[i]!=y[i]):  #跟原來的結(jié)果做比較
        x+=1
print(1-x/len(x2))
import numpy as npy
x3=npy.array([[1,-1,-1,1],[1,1,1,1],[-1,1,-1,1]])
rst=model.predict_classes(x3).reshape(len(x3))
print("其中第一門課的預(yù)測結(jié)果為:"+str(rst[0]))

手寫體識(shí)別代碼

#使用人工神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)手寫體數(shù)字識(shí)別
#數(shù)據(jù)的讀取與整理
#加載數(shù)據(jù)
from numpy import *
import operator
from os import listdir
import numpy as npy
import pandas as pda
import numpy
def datatoarray(fname):
    arr=[]
    fh=open(fname)
    for i in range(0,32):
        thisline=fh.readline()
        for j in range(0,32):
            arr.append(int(thisline[j]))
    return arr
#建立一個(gè)函數(shù)取文件名前綴
def seplabel(fname):
    filestr=fname.split(".")[0]
    label=int(filestr.split("_")[0])
    return label
#建立訓(xùn)練數(shù)據(jù)
def traindata():
    labels=[]
    trainfile=listdir("/Users/yuanxin/Desktop/traindata/")
    num=len(trainfile)
    #長度1024(列),每一行存儲(chǔ)一個(gè)文件
    #用一個(gè)數(shù)組存儲(chǔ)所有訓(xùn)練數(shù)據(jù)脆贵,行:文件總數(shù)医清,列:1024
    trainarr=zeros((num,1024))
    for i in range(0,num):
        thisfname=trainfile[i]
        thislabel=seplabel(thisfname)
        labels.append(thislabel)
        trainarr[i,:]=datatoarray("/Users/yuanxin/Desktop/traindata/"+thisfname)
    return trainarr,labels
trainarr,labels=traindata()
#固定格式用
xf=pda.DataFrame(trainarr)  #先轉(zhuǎn)成數(shù)據(jù)框
yf=pda.DataFrame(labels)
tx2=xf.as_matrix().astype(int) #轉(zhuǎn)成數(shù)組
ty2=yf.as_matrix().astype(int)

#使用人工神經(jīng)網(wǎng)絡(luò)模型
from keras.models import Sequential
from keras.layers.core import Dense,Activation
model=Sequential()
#輸入層
model.add(Dense(10,input_dim=1024))
model.add(Activation("relu"))
#輸出層
model.add(Dense(1,input_dim=1))
model.add(Activation("sigmoid"))
#模型的編譯
model.compile(loss="mean_squared_error",optimizer="adam")
#訓(xùn)練
model.fit(tx2,ty2,nb_epoch=10000,batch_size=6)
#預(yù)測分類
rst=model.predict_classes(tx2).reshape(len(tx2))
x=0
for i in range(0,len(tx2)):
    if(rst[i]!=ty2[i]):
        x+=1
print(1-x/len(tx2))


輸入層的層數(shù)無所謂
輸出層可以根據(jù)數(shù)據(jù)量一般也就是10層

Apriori算法

關(guān)聯(lián)分析:分析出關(guān)聯(lián)性比較大的商品。
可以在超市里面把關(guān)聯(lián)性高的商品擺放在一起卖氨。
Apriori也是一種關(guān)聯(lián)性分析的算法会烙。
Apriori中:

  • 支持度:兩件事物同時(shí)發(fā)生的概率 Support(A=>B)=P(A and B)
  • 置信度:若A發(fā)生,B發(fā)生的概率 Confidence(A=>B)=P(B|A)

Apriori算法的實(shí)現(xiàn):

  1. 設(shè)定閾值:最小支持度筒捺,最小置信度
  2. 計(jì)算柏腻,置信度和支持度。支持度利用發(fā)生的頻率去除概率系吭。


    image.png
  3. 篩選
  4. 繼續(xù)計(jì)算

關(guān)于series的解釋

https://www.cnblogs.com/sirkevin/p/5741853.html

課程關(guān)聯(lián)性代碼

#計(jì)算學(xué)員購買課程的關(guān)聯(lián)性
from apriori import *
import pandas as pda
import xlrd
filename="/Users/yuanxin/Desktop/lesson_buy.xls"
dataframe=pda.read_excel(filename,header=None) #header=none表示沒有表頭
print(dataframe)
dataframe1=dataframe.as_matrix()
print(dataframe1)
#轉(zhuǎn)化一下數(shù)據(jù)(因?yàn)橛兄形臐h字不好分析五嫂,所以要轉(zhuǎn)化成矩陣)
change=lambda x:pda.Series(1,index=x[pda.notnull(x)])
#理解為依次去作為索引,先讓java為索引去查肯尺,有的就置1沃缘,然后是php去查,有置為1.根據(jù)字母順序來做的索引
#lamda是指 給一個(gè)數(shù)據(jù)x则吟,他按照轉(zhuǎn)換規(guī)則給出數(shù)據(jù)槐臀。規(guī)則(有數(shù)據(jù)為1)
mapok=map(change,dataframe.as_matrix())
data=pda.DataFrame(list(mapok)).fillna(0)
print(data)

#臨界支持度、置信度設(shè)置
spt=0.2
cfd=0.5

#使用apriori算法計(jì)算關(guān)聯(lián)結(jié)果
find_rule(data,spt,cfd)

自己電腦python環(huán)境的一些問題以及解釋

  1. pycharm也是可以直接下載包的氓仲,終端的pip3 install是為idle服務(wù)峰档,而不是為pycharm。http://www.360doc.com/content/16/0827/13/35922414_586284807.shtml
  2. idle增添源文件的方法寨昙,找到路徑直接放進(jìn)去讥巡。
import sys
>>> print(sys.path)
['/Users/yuanxin/Desktop', '/Users/yuanxin/Documents', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']

新浪微博的幾種爬蟲方式

  1. 接口
  2. 傳統(tǒng)爬蟲

charles抓包
http://blog.csdn.net/u010187139/article/details/51986854

https:一般會(huì)是unknown 抓不到https的 ,在這里面添加設(shè)置


image.png

下圖是可以只抓取特定的網(wǎng)站以及除了什么網(wǎng)站之外都抓舔哪。 格式
" *.baidu.com "


image.png

一個(gè)新的知識(shí)點(diǎn)欢顷,布隆比較器。(很輕易檢查容器類是否有重復(fù)的東西)http://blog.csdn.net/jiaomeng/article/details/1495500

phantomjs

安裝selenium捉蚤,可以利用python操作phantomjs這個(gè)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抬驴,一起剝皮案震驚了整個(gè)濱河市炼七,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌布持,老刑警劉巖豌拙,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異题暖,居然都是意外死亡按傅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門胧卤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唯绍,“玉大人,你說我怎么就攤上這事枝誊】雒ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵叶撒,是天一觀的道長绝骚。 經(jīng)常有香客問我,道長祠够,這世上最難降的妖魔是什么压汪? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮哪审,結(jié)果婚禮上蛾魄,老公的妹妹穿的比我還像新娘。我一直安慰自己湿滓,他們只是感情好滴须,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叽奥,像睡著了一般扔水。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上朝氓,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天魔市,我揣著相機(jī)與錄音,去河邊找鬼赵哲。 笑死待德,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枫夺。 我是一名探鬼主播将宪,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了较坛?” 一聲冷哼從身側(cè)響起印蔗,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丑勤,沒想到半個(gè)月后华嘹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡法竞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年耙厚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爪喘。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颜曾,死狀恐怖纠拔,靈堂內(nèi)的尸體忽然破棺而出秉剑,到底是詐尸還是另有隱情,我是刑警寧澤稠诲,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布侦鹏,位于F島的核電站,受9級(jí)特大地震影響臀叙,放射性物質(zhì)發(fā)生泄漏略水。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一劝萤、第九天 我趴在偏房一處隱蔽的房頂上張望渊涝。 院中可真熱鬧,春花似錦床嫌、人聲如沸跨释。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳖谈。三九已至,卻和暖如春阔涉,著一層夾襖步出監(jiān)牢的瞬間缆娃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工瑰排, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贯要,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓椭住,卻偏偏與公主長得像崇渗,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容