日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【机器学习】数据处理详解

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器学习】数据处理详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【機器學習】數據處理詳解


活動地址:[CSDN21天學習挑戰賽](https://marketing.csdn.net/p/bdabfb52c5d56532133df2adc1a728fd)


作者簡介:在校大學生一枚,華為云享專家,阿里云星級博主,騰云先鋒(TDP)成員,云曦智劃項目總負責人,全國高等學校計算機教學與產業實踐資源建設專家委員會(TIPCC)志愿者,以及編程愛好者,期待和大家一起學習,一起進步~
.
博客主頁ぃ靈彧が的學習日志
.
本文專欄人工智能
.
專欄寄語:若你決定燦爛,山無遮,海無攔
.

文章目錄

  • 【機器學習】數據處理詳解
  • 前言
      • 什么是網絡爬蟲?
  • 一、明星圖片爬取
    • (一)、定義爬取指定url頁面的函數
    • (二)、爬取圖片
  • 二、股票行情爬取與分析
    • (一)、爬取股票列表信息
    • (二)、股票數據獲取
    • (三)、股票數據分析
  • 三、科比職業生涯數據爬取與分析
    • (一)、科比職業生涯賽事數據爬取
    • (二)、科比職業生涯數據分析
  • 總結


前言

什么是網絡爬蟲?

編寫程序從網絡中自動獲取數據的過程叫作數據爬取,也叫作網絡爬蟲。網絡爬蟲一般步驟為:獲取爬取頁的url,獲取頁面內容、解析頁面、獲取所需數據,重復上述過程至爬取結束。


一、明星圖片爬取

明星圖片爬取基于百度搜索的返回結果進行,在百度搜索“中國藝人”,解析返回頁面展示的藝人圖片鏈接并保持。


(一)、定義爬取指定url頁面的函數

  • 導入相關包:
  • import requests import json import os
  • 直接使用程序爬取網絡數據會被網站識別出來,然后封禁該IP,導致數據爬取中斷,所以我們需要首先將程序訪問頁面偽裝成瀏覽器訪問頁面
  • User-Agent:定義一個真實瀏覽器的代理名稱,表明自己的身份(是哪種瀏覽器),本demo為谷歌瀏覽器

    Accept:告訴WEB服務器自己接受什么介質類型,/ 表示任何類型

    Referer:瀏覽器向WEB服務器表明自己是從哪個網頁URL獲得點擊當前請求中的網址/URL

    Connection:表示是否需要持久連接

    Accept-Language:瀏覽器申明自己接收的語言

    Accept-Encoding:瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支持壓縮,支持什么壓縮方法(gzip,deflate)


    def getPicinfo(url):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36","Accept": "*/*","Referer": "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E4%B8%AD%E5%9B%BD%E8%89%BA%E4%BA%BA&fenlei=256&rsv_pq=cf6f24c500067b9f&rsv_t=c2e724FZlGF9fJYeo9ZV1I0edbhV0Z04aYY%2Fn6U7qaUoH%2B0WbUiKdOr8JO4&rqlang=cn&rsv_dl=ib&rsv_enter=1&rsv_sug3=15&rsv_sug1=6&rsv_sug7=101","Host": "sp0.baidu.com","Connection": "keep-alive","Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,zh-TW;q=0.6","Accept-Encoding": "gzip, deflate"}# 根據url,使用get()方法獲取頁面內容,返回相應response = requests.get(url,headers) # 成功訪問了頁面if response.status_code == 200:return response.text# 沒有成功訪問頁面,返回Nonereturn None

    (二)、爬取圖片

    使用上述定義好的函數,進行指定url頁面的爬取,然后解析返回的頁面源碼,獲取其中的圖片鏈接,并保存圖片:

    #圖片存放地址 Download_dir='picture' if os.path.exists(Download_dir)==False:os.mkdir(Download_dir)pn_num=1 # 爬取多少頁 rn_num=10 # 每頁多少個圖片for k in range(pn_num): # for循環,每次爬取一頁url="https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?resource_id=28266&from_mid=1&&format=json&ie=utf-8&oe=utf-8&query=%E4%B8%AD%E5%9B%BD%E8%89%BA%E4%BA%BA&sort_key=&sort_type=1&stat0=&stat1=&stat2=&stat3=&pn="+str(k)+"&rn="+str(rn_num)+"&_=1613785351574"res = getPicinfo(url) # 調用函數,獲取每一頁內容json_str=json.loads(res) # 將獲取的文本格式轉化為字典格式figs=json_str['data'][0]['result'] for i in figs: # for循環讀取每一張圖片的名字name=i['ename']img_url=i['pic_4n_78'] # img_url:圖片地址img_res=requests.get(img_url) # 讀取圖片所在頁面內容if img_res.status_code==200: ext_str_splits=img_res.headers['Content-Type'].split('/')ext=ext_str_splits[-1] # 索引-1指向列表倒數第一個元素fname=name+"."+ext# 保存圖片open(os.path.join(Download_dir,fname), 'wb' ).write(img_res.content)print(name,img_url,"saved")

    爬取內容部分如圖1-1所示:


    二、股票行情爬取與分析

    首先爬取一個股票名稱列表,再獲取列表里每支股票的信息。


    (一)、爬取股票列表信息

    代碼如下:

    #coding=utf-8 ''' Created on 2021年02月20日@author: zhongshan ''' #http://quote.eastmoney.com/center/gridlist.html #爬取該頁面股票信息import requests from fake_useragent import UserAgent from bs4 import BeautifulSoup import json import csvdef getHtml(url):r = requests.get(url,headers={'User-Agent': UserAgent().random,})r.encoding = r.apparent_encodingreturn r.text#num為爬取多少條記錄,可手動設置 num = 20 #該地址為頁面實際獲取數據的接口地址 stockUrl='http://99.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112408733409809437476_1623137764048&pn=1&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:80&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1623137764167:formatted' if __name__ == '__main__':responseText = getHtml(stockUrl)jsonText = responseText.split("(")[1].split(")")[0];resJson = json.loads(jsonText)datas = resJson["data"]["diff"] datalist = []for data in datas:# if (str().startswith('6') or str(data["f12"]).startswith('3') or str(data["f12"]).startswith('0')):row = [data["f12"],data["f14"]]datalist.append(row)print(datalist) f =open('stock.csv','w+',encoding='utf-8',newline="")writer = csv.writer(f)writer.writerow(('代碼', '名稱'))for data in datalist:writer.writerow((data[0]+"\t",data[1]+"\t"))f.close()

    輸出結果如圖2-1所示:


    (二)、股票數據獲取

    在獲取股票代碼及名稱列表之后,逐個下載股票數據,根據觀察,每支股票的歷史數據由四部分組成:頭url,上市地(深市,滬市)、股票代碼、尾url,只需要組合好上述url,即可獲得csv格式的數據,并下載,如下:

    import csv import urllib.request as r import threading#讀取之前獲取的個股csv丟入到一個列表中 def getStockList():stockList = []f = open('stock.csv','r',encoding='utf-8')f.seek(0)reader = csv.reader(f)for item in reader:stockList.append(item)f.close()return stockListdef downloadFile(url,filepath):# print(filepath)try:r.urlretrieve(url,filepath)except Exception as e:print(e)print(filepath,"is downloaded")pass#設置信號量,控制線程并發數 sem = threading.Semaphore(1) def downloadFileSem(url,filepath):with sem:downloadFile(url,filepath)urlStart = 'http://quotes.money.163.com/service/chddata.html?code=' urlEnd = '&end=20210221&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;VOTURNOVER;VATURNOVER'if __name__ == '__main__':stockList = getStockList()stockList.pop(0)print(stockList)for s in stockList:scode = str(s[0].split("\t")[0])#0:滬市;1:深市url = urlStart + ("0" if scode.startswith('6') else "1") + scode + urlEndprint(url)filepath = (str(s[1].split("\t")[0])+"_"+scode) + ".csv"threading.Thread(target=downloadFileSem,args=(url,filepath)).start()

    下載文件部分列表如圖2-2所示:


    (三)、股票數據分析

    現在,我們對股票數據做一些簡單的分析,比如股票的最高價、最低價隨時間的變化,股票的漲跌幅/漲跌額隨時間的變化,以及當天的成交量與前一天的漲跌幅有何關系等。

    上述分析可以使用作圖的方式進行直觀展示。

  • 定義加載數據的功能函數:
  • import pandas as pd import matplotlib.pyplot as plt import csv # 設置顯示中文 plt.rcParams['font.sans-serif'] = ['simhei'] # 指定默認字體 plt.rcParams['axes.unicode_minus']=False # 用來顯示負號 plt.rcParams['figure.dpi'] = 100 # 每英寸點數 files = [] # ['日期' '股票代碼' '名稱' '收盤價' '最高價' '最低價' '開盤價' '前收盤' '漲跌額' '漲跌幅' '成交量' '成交金額'] def read_file(file_name):data = pd.read_csv(file_name,encoding='gbk') col_name = data.columns.values return data, col_namedef get_files_path():stock_list=getStockList()paths = []for stock in stock_list[1:]:p = stock[1].strip()+"_"+stock[0].strip()+".csv" print(p) data,_ = read_file(p)if len(data)>1:files.append(p) print(p) get_files_path() print(files)
  • 定義get_diff(file_name)函數,作該股票的漲跌幅/漲跌額隨時間的變化圖像,可以將該支股票的波動性觀察一段時間。
  • # 獲取股票的漲跌額及漲跌幅度變化曲線 # ['日期' '股票代碼' '名稱' '收盤價' '最高價' '最低價' '開盤價' '前收盤' '漲跌額' '漲跌幅' '成交量' '成交金額'] def get_diff(file_name):data, col_name = read_file(file_name)index = len(data['日期'])-1sep = index//15plt.figure(figsize=(15,17)) x = data['日期'].values.tolist()x.reverse()# x = x[-index:]xticks=list(range(0,len(x),sep))xlabels=[x[i] for i in xticks]xticks.append(len(x))# xlabels.append(x[-1])y1 = [float(c) if c!='None' else 0 for c in data['漲跌額'].values.tolist()]y2=[float(c) if c!='None' else 0 for c in data['漲跌幅'].values.tolist()]y1.reverse()y2.reverse()# y1 = y1[-index:]# y2 = y2[-index:]ax1 = plt.subplot(211)plt.plot(range(1,len(x)+1),y1,c='r')plt.title('{}-漲跌額/漲跌幅'.format(file_name.split('_')[0]),fontsize=20)ax1.set_xticks(xticks)ax1.set_xticklabels(xlabels, rotation=40)# plt.xlabel('日期')plt.ylabel('漲跌額',fontsize=20)ax2 = plt.subplot(212)plt.plot(range(1,len(x)+1),y2,c='g')# plt.title('{}-漲跌幅'.format(file_name.split('_')[0]))ax2.set_xticks(xticks)ax2.set_xticklabels(xlabels, rotation=40)plt.xlabel('日期',fontsize=20)plt.ylabel('漲跌幅',fontsize=20) plt.savefig('work/'+file_name.split('.')[0]+'_diff.png')plt.show()
  • 定義get_max_min(file_name)函數,做該股票的每日最高價/最低價隨時間的變化圖像,也可以將該支股票的波動性或者是否增值觀察一段時間。
  • def get_max_min(file_name):data, col_name = read_file(file_name)index = len(data['日期'])-1sep = index//15plt.figure(figsize=(15,10)) x = data['日期'].values.tolist()x.reverse()x = x[-index:]xticks=list(range(0,len(x),sep))xlabels=[x[i] for i in xticks]xticks.append(len(x))# xlabels.append(x[-1])y1 = [float(c) if c!='None' else 0 for c in data['最高價'].values.tolist()]y2=[float(c) if c!='None' else 0 for c in data['最低價'].values.tolist()]y1.reverse()y2.reverse()y1 = y1[-index:]y2 = y2[-index:]ax = plt.subplot(111)plt.plot(range(1,len(x)+1),y1,c='r',linestyle="-")plt.plot(range(1,len(x)+1),y2,c='g',linestyle="--")plt.title('{}-最高價/最低價'.format(file_name.split('_')[0]),fontsize=20)ax.set_xticks(xticks)ax.set_xticklabels(xlabels, rotation=40)plt.xlabel('日期',fontsize=20)plt.ylabel('價格',fontsize=20) plt.legend(['最高價','最低價'],fontsize=20)plt.savefig('work/'+file_name.split('.')[0]+'_minmax.png')plt.show()
  • 定義get_deal(file_name)函數,作該股票的每日成交量/成交金額隨時間變化的圖像,可以觀察一段時間內該支股票的成交量變化,以及是否存在大宗交易:
  • def get_deal(file_name):data, col_name = read_file(file_name)index = len(data['日期'])-1sep = index//15plt.figure(figsize=(15,10)) x = data['日期'].values.tolist()x.reverse()x = x[-index:]xticks=list(range(0,len(x),sep))xlabels=[x[i] for i in xticks]xticks.append(len(x))# xlabels.append(x[-1])y1 = [float(c) if c!='None' else 0 for c in data['成交量'].values.tolist()]y2=[float(c) if c!='None' else 0 for c in data['成交金額'].values.tolist()] y1.reverse()y2.reverse()y1 = y1[-index:]y2 = y2[-index:]ax = plt.subplot(111)plt.plot(range(1,len(x)+1),y1,c='b',linestyle="-")plt.plot(range(1,len(x)+1),y2,c='r',linestyle="--")plt.title('{}-成交量/成交金額'.format(file_name.split('_')[0]),fontsize=20)ax.set_xticks(xticks)ax.set_xticklabels(xlabels, rotation=40)plt.xlabel('日期',fontsize=20)# plt.ylabel('') plt.legend(['成交量','成交金額'],fontsize=20)plt.savefig('work/'+file_name.split('.')[0]+'_deal.png')plt.show()
  • 定義get_rel(flie_name)函數,做該股票的成交量與前一天漲跌額的關系圖像,直觀地展示漲跌額對成交量的影響。
  • def get_rel(file_name):data, col_name = read_file(file_name)index = len(data['日期'])-1sep = index//15plt.figure(figsize=(15,10)) x = data['日期'].values.tolist()x.reverse()x = x[-index:]xticks=list(range(0,len(x),sep))xlabels=[x[i] for i in xticks]xticks.append(len(x))# xlabels.append(x[-1])y1 = [float(c) if c!='None' else 0 for c in data['成交量'].values.tolist()]y2=[float(c) if c!='None' else 0 for c in data['漲跌幅'].values.tolist()] y1.reverse()y2.reverse()y1 = y1[-index:]y2 = y2[-index:]y2 = [0] + y2[:-1]ax = plt.subplot(111)plt.scatter(y2,y1)plt.title('{}-成交量與前一天漲跌幅的關系'.format(file_name.split('_')[0]),fontsize=20)# ax.set_xticks(xticks)# ax.set_xticklabels(xlabels, rotation=40)plt.xlabel('前一天漲跌幅',fontsize=20)plt.ylabel('成交量',fontsize=20) # plt.legend(['成交量','成交金額'],fontsize=20)plt.savefig('work/'+file_name.split('.')[0]+'_rel.png')plt.show() # for file in files: # get_diff(file)# for file in files: # get_max_min(file) print(len(files))
  • 調用上述分析函數,為每支股票繪制相關的展示圖:
  • for file in files:get_max_min(file)get_deal(file)get_diff(file)get_rel(file)

    股票的漲跌額及漲跌幅度變化如下圖2-3、2-4所示:

    股票的最高價/最低價變化如圖2-5所示:

    股票成交量/成交金額變化如圖2-6所示:

    股票的漲跌額與次日成交量關系如下圖2-7所示:


    三、科比職業生涯數據爬取與分析

    本實驗從網址http://www.stat-nba.com獲取科比的相關數據,主要包括:常規賽、季后賽、全明星賽三種賽事的數據。


    (一)、科比職業生涯賽事數據爬取

  • 導入相關包
  • import requests from bs4 import BeautifulSoup import csv import matplotlib.pyplot as plt import pandas as pd
  • 獲取url頁面內容,并以文本格式返回
  • def getKobeList(code):url = "http://www.stat-nba.com/player/stat_box/195_"+code+".html"response = requests.get(url)resKobe = response.textreturn resKobe
  • 獲取Kobe歷史數據
  • #獲取kobe歷史數據 def getRow(resKobe,code):soup = BeautifulSoup(resKobe,"html.parser") table = soup.find_all(id='stat_box_avg')#表頭header = []if code == "season":header = ["賽季","出場","首發","時間","投籃","命中","出手","三分","命中","出手","罰球","命中","出手","籃板","前場","后場","助攻","搶斷","蓋帽","失誤","犯規","得分","勝","負"]if code == "playoff":header = ["賽季","出場","時間","投籃","命中","出手","三分","命中","出手","罰球","命中","出手","籃板","前場","后場","助攻","搶斷","蓋帽","失誤","犯規","得分","勝","負"]if code == "allstar":header = ["賽季","首發","時間","投籃","命中","出手","三分","命中","出手","罰球","命中","出手","籃板","前場","后場","助攻","搶斷","蓋帽","失誤","犯規","得分"]#數據rows = [];rows.append(header)for tr in table[0].find_all("tr",class_="sort"): row = []for td in tr.find_all("td"):rank = td.get("rank")if rank != "LAL" and rank != None:row.append(td.get_text())rows.append(row)return rows#寫入csv文件,rows為數據,dir為寫入文件路徑 def writeCsv(rows,dir):with open(dir, 'w', encoding='utf-8-sig', newline='') as f:writer = csv.writer(f)writer.writerows(rows)#常規賽數據 resKobe = getKobeList("season") rows = getRow(resKobe,"season") #print(rows) writeCsv(rows,"season.csv") print("season.csv saved")#季后賽數據 resKobe = getKobeList("playoff") rows = getRow(resKobe,"playoff") #print(rows) writeCsv(rows,"playoff.csv") print("playoff.csv saved")#全明星數據 resKobe = getKobeList("allstar") rows = getRow(resKobe,"allstar") #print(rows) writeCsv(rows,"star.csv") print("star.csv saved")

    (二)、科比職業生涯數據分析

    針對不同賽事以及不同時間,繪制科比的職業生涯得分情況,比如,繪制各個賽季科比的籃板數、助攻、得分情況分布,可以在一定程度上反映其在各個賽季的貢獻程度。首先定義展示函數show_score(),傳入不同賽事的名稱,要展示的項,以及繪制線型等:

    # 籃板、助攻、得分 def show_score(game_name='season', item='籃板', plot_name='line'):# game_name: season, playoff, star# item: 籃板,助攻,得分# plot_name: line,barfile_name = game_name+'.csv'data = pd.read_csv(file_name)X= data['賽季'].values.tolist()X.reverse()if item=='all':Y1 = data['籃板'].values.tolist()Y2 = data['助攻'].values.tolist()Y3 = data['得分'].values.tolist()Y1.reverse()Y2.reverse()Y3.reverse()else:Y = data[item].values.tolist() Y.reverse() if plot_name=='line':if item=='all':plt.plot(X,Y1,c='r',linestyle="-.")plt.plot(X,Y2,c='g',linestyle="--")plt.plot(X,Y3,c='b',linestyle="-")legend=['籃板','助攻','得分']else:plt.plot(X,Y,c='g',linestyle="-")legend=[item]elif plot_name=='bar':#facecolor:表面的顏色;edgecolor:邊框的顏色if item=='all':fig = plt.figure(figsize=(15,5))ax1 = plt.subplot(131)plt.bar(X,Y1,facecolor = '#9999ff',edgecolor = 'white')plt.legend(['籃板'])plt.title('Kobe職業生涯數據分析:'+game_name)plt.xticks(rotation=60)plt.ylabel('籃板')ax2 = plt.subplot(132)plt.bar(X,Y2,facecolor = '#999900',edgecolor = 'white')plt.legend(['助攻'])plt.title('Kobe職業生涯數據分析:'+game_name)plt.xticks(rotation=60)plt.ylabel('助攻')ax3 = plt.subplot(133)plt.bar(X,Y3,facecolor = '#9988ff',edgecolor = 'white')legend=['得分']else:plt.bar(X,Y,facecolor = '#9900ff',edgecolor = 'white')legend=[item] else:returnplt.legend(legend)plt.title('Kobe職業生涯數據分析:'+game_name)plt.xticks(rotation=60)plt.xlabel('賽季')if item!='all':plt.ylabel(item)else:plt.ylabel('得分')plt.savefig('work/Kobe職業生涯數據分析_{}_{}.png'.format(game_name,item))plt.show()# 籃板、助攻、得分 game_name = 'season' for game_name in ['season','playoff','star']:show_score(game_name=game_name, item='籃板', plot_name='bar')show_score(game_name=game_name, item='助攻', plot_name='bar')show_score(game_name=game_name, item='得分', plot_name='bar')show_score(game_name=game_name, item='籃板', plot_name='line')show_score(game_name=game_name, item='助攻', plot_name='line')show_score(game_name=game_name, item='得分', plot_name='line')show_score(game_name=game_name, item='all', plot_name='bar')show_score(game_name=game_name, item='all', plot_name='line')

    根據上面定義的繪圖函數,繪制Kobe在各種賽事中的相關數據,如下圖3-1、3-2、3-3所示:

    輸出部分結果如圖3-4至3-8所示:


    總結

    本系列文章內容為根據清華社出版的《機器學習實踐》所作的相關筆記和感悟,其中代碼均為基于百度飛槳開發,若有任何侵權和不妥之處,請私信于我,定積極配合處理,看到必回!!!

    最后,引用本次活動的一句話,來作為文章的結語~( ̄▽ ̄~)~:

    學習的最大理由是想擺脫平庸,早一天就多一份人生的精彩;遲一天就多一天平庸的困擾。

    ps:更多精彩內容還請進入本文專欄人工智能,進行查看,歡迎大家支持與指教啊~( ̄▽ ̄~)~

    總結

    以上是生活随笔為你收集整理的【机器学习】数据处理详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。