python数据分析和可视化——一篇文章足以(未完成)
📋前言📋
💝博客主頁:紅目香薰_CSDN博客-大數(shù)據(jù),計(jì)算機(jī)理論,MySQL,PHP領(lǐng)域博主💝
?本文由在下【紅目香薰】原創(chuàng),首發(fā)于CSDN?
🤗2022年最大愿望:【服務(wù)百萬技術(shù)人次】🤗
環(huán)境需求
環(huán)境:win10
環(huán)境管理器:Anaconda(推薦下載地址)
開發(fā)工具:PyCharm Community Edition 2021.3.1(或Jupyter Lab)
【pip install jupyter lab】
python版本:3.7
第一節(jié) python爬蟲
使用【request與response】進(jìn)行爬取
pip install requests如果安裝成功【requests】可以直接【ALT+回車】引入啊,引入的過程自動(dòng)下載?
import requests #獲取請(qǐng)求的響應(yīng)結(jié)果【response】 response=requests.get("http://www.baidu.com") #類型 print(type(response)) #響應(yīng)狀態(tài)【200為成功】 print(response.status_code) #響應(yīng)文本類型-一般都是str字符串 print(type(response.text)) #響應(yīng)文本內(nèi)容 print(response.text) #<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]> print(response.cookies) #響應(yīng)內(nèi)容 print(response.content) #修改響應(yīng)的編碼格式 print(response.content.decode("utf-8"))正則表達(dá)式
第二節(jié) Scrapy框架
pip install scrapy?
基礎(chǔ)的scrapy使用
創(chuàng)建項(xiàng)目
scrapy startproject dangdang啟動(dòng)
scrapy crawl dangdangSpideritems.py編碼
settings.py編碼
pipelines.py編碼
# Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface from itemadapter import ItemAdapterclass DangdangPipeline:def process_item(self, item, spider):bookfile=open("./dangdangInfo.txt","a+",encoding="utf-8")print(bookfile)bookfile.write(item["a1"]+","+item["a2"]+","+item["a3"]+","+item["a4"]+","+item["a5"]+"\n")bookfile.flush()bookfile.close()return itemdangdangSpider.py編碼
import scrapy from scrapy.selector import Selector from dangdang.items import DangdangItemclass ExampleSpider(scrapy.Spider):name = 'dangdangSpider'allowed_domains = ['www.bang.dangdang.com']start_urls = []for i in range(1, 26):start_urls.append('http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' + str(i))def parse(self, response):#print(response.text)bookInfo=Selector(text=response.text)bookList=bookInfo.css("li")for book in bookList:item=DangdangItem()a1=book.css("div.name a::text").extract()if(len(a1)>0):item["a1"]=a1[0]a2=book.css("div.star a::text").extract()if(len(a1)>0):item["a2"]=a2[0]a3=book.css("div.publisher_info a::text").extract()if(len(a1)>0):item["a3"]=a3[0]a4=book.css("div.price span.price_n::text").extract()if(len(a1)>0):item["a4"]=a4[0][1:].strip()a5=book.css("div.price span.price_s::text").extract()if(len(a1)>0):item["a5"]=a5[0]print(item)yield item?執(zhí)行
效果
TOP500信息爬取完畢。?
第三節(jié) 分詞處理
Numpy簡介 ? 雖然在Python中包含許多的標(biāo)準(zhǔn)庫能夠處理文本和數(shù)值類型的數(shù)據(jù),但Python還有更為豐富的第三方組件更擅長與各類數(shù)據(jù)打交道,例如Xlrd、Numpy、Scipy、Pandas等。這些組件它們側(cè)重于數(shù)據(jù)處理,提供了一些強(qiáng)大的功能,比如數(shù)據(jù)統(tǒng)計(jì)、科學(xué)計(jì)算、統(tǒng)計(jì)建模等。其中Numpy是最為基礎(chǔ)和常見的一個(gè)科學(xué)計(jì)算庫。Numpy是一個(gè)運(yùn)行速度非常快的數(shù)學(xué)庫,主要用于數(shù)組計(jì)算,包括:強(qiáng)大的N維數(shù)組對(duì)象ndarray、廣播功能函數(shù)、線性代數(shù)、傅里葉變換、隨機(jī)數(shù)生成等功能。
import numpy as np ndarray_a = np.array([[1, 2, 3], [4, 5, 6]]) ndarray_b = np.arange(12) print("數(shù)組a中的類型是:", type(ndarray_a)) print("數(shù)組a中的內(nèi)容是:\n", ndarray_a) print("數(shù)組b中的類型是:", type(ndarray_b)) print("數(shù)組b中的內(nèi)容是:\n", ndarray_b)? ndarray屬性 在ndarray中,有幾個(gè)重要的屬性:數(shù)據(jù)的類型、秩(軸)、形狀、元素個(gè)數(shù)。 ?數(shù)據(jù)的類型。Numpy支持的數(shù)據(jù)類型比Python內(nèi)置的基本類型要多得多,可以通過numpy.dtype來查看ndarray的數(shù)據(jù)類型。 ?秩(軸)。ndarray的維度被稱為秩,秩就是ndarray軸的數(shù)量,即數(shù)組的維度,一維數(shù)組的秩是1,二維數(shù)組的秩是2,可以通過ndarray.ndim來查看。 ?形狀。ndarray的形狀通過一個(gè)元組來描述,元組中的第一個(gè)數(shù)代表ndarray的第一個(gè)維度,第二個(gè)數(shù)代表第二個(gè)維度,以此類推。通過ndarray.shape查看數(shù)組的形狀。 ?元素個(gè)數(shù)。ndarray的元素總個(gè)數(shù)可以通過ndarray.size查看,其結(jié)果相當(dāng)于形狀中所有數(shù)值的乘積。
import numpy as np ndarray_a = np.array([1, 2, 3]) ndarray_b = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float32) print("數(shù)組a中的數(shù)據(jù)類型是:", ndarray_a.dtype) print("數(shù)組b中的數(shù)據(jù)類型是:", ndarray_b.dtype) print("數(shù)組a中的秩是:", ndarray_a.ndim) print("數(shù)組b中的秩是:", ndarray_b.ndim) print("數(shù)組a的形狀是:", ndarray_a.shape) print("數(shù)組b的形狀是:", ndarray_b.shape) print("數(shù)組a的元素總個(gè)數(shù)是:", ndarray_a.size) print("數(shù)組b的元素總個(gè)數(shù)是:", ndarray_b.size)快速創(chuàng)建特殊的ndarray ?使用numpy.empty來創(chuàng)建一個(gè)空的數(shù)組。 ?使用numpy.zeros來創(chuàng)建一個(gè)全0的數(shù)組,數(shù)組中的各個(gè)元素均為0。 ?使用numpy.ones來創(chuàng)建一個(gè)全1的數(shù)組,數(shù)組中的各個(gè)元素均為1。 ?使用numpy.eye來創(chuàng)建一個(gè)對(duì)角線為1的數(shù)組,數(shù)組中其他元素均為0。
import numpy as np ndarray_empty = np.empty((2, 3)) ndarray_ones = np.ones((3, 2)) ndarray_zeros = np.zeros((3, 3)) ndarray_eye = np.eye(3) print("創(chuàng)建的空ndarray是:\n", ndarray_empty) print("創(chuàng)建的全一ndarray是:\n", ndarray_ones) print("創(chuàng)建的全零ndarray是:\n", ndarray_zeros) print("創(chuàng)建的對(duì)角線ndarray是:\n", ndarray_eye)改變ndarray形狀 ndarray的形狀是可以改變的,比如一個(gè)元素總個(gè)數(shù)為24的數(shù)組,通過ndarray.reshape可以將該數(shù)組改變成2x12、4x6、2x3x4等各種符合元素個(gè)數(shù)的形狀。
import numpy as np ndarray_c = np.arange(24) print("ndarray_c未改變形狀之前的形狀是:", ndarray_c.shape) ndarray_c = ndarray_c.reshape(2, 12) print("ndarray_c改變形狀之后的形狀是:", ndarray_c.shape) ndarray_c = ndarray_c.reshape(4, 6) print("ndarray_c改變形狀之后的形狀是:", ndarray_c.shape) ndarray_c = ndarray_c.reshape(2, 3, 4) print("再次改變ndarray_c的形狀后,結(jié)果是:", ndarray_c.shape)ndarray的索引機(jī)制 ndarray對(duì)象的內(nèi)容可以通過索引來訪問和修改,其方式基本與Python中l(wèi)ist的操作一樣。
import numpy as np ndarray_d = np.arange(12) print("ndarray_d數(shù)組的內(nèi)容是:\n", ndarray_d) print("ndarray_d數(shù)組中第2個(gè)元素是:", ndarray_d[1]) ndarray_d[5] = 20 print("ndarray_d數(shù)組的內(nèi)容是:\n", ndarray_d)數(shù)組的索引與切片 ?對(duì)于一維數(shù)組 可以通過[index1]獲取index1索引位置的某個(gè)元素 也可以通過[start: end]獲取索引從start開始到end-1處的一段元素 還可以通過[start: end: step]獲取步長為step的start開始到end-1處的一段元素 ?對(duì)于多維數(shù)組 可以通過[rank1_index, rank2_index,…],獲取ndarray數(shù)組中處于指定位置處的某個(gè)元素。 也可以通過[rank1_start: rank1_end, rank2_start: rank2_end, …]獲取索引從start開始到end-1處的一段元素 還可以通過使用省略號(hào)…來對(duì)剩余rank進(jìn)行缺省
import numpy as np ndarray_e = np.arange(24) ndarray_f = np.arange(24).reshape(2, 3, 4) print("ndarray_e:\n", ndarray_e) print("ndarray_f:\n", ndarray_f) print("對(duì)ndarray_e進(jìn)行切片,獲取索引為2-12處的所有元素:", ndarray_e[2: 13]) print("對(duì)ndarray_e進(jìn)行切片,指定步長為2,獲取索引為2-12處的所有元素:", ndarray_e[2: 13: 2]) print("對(duì)ndarray_f進(jìn)行切片,秩1上索引為1&秩2上索引為1-2&秩3上索引為0-1的元素:\n", ndarray_f[1, 1:3, 0:2]) print("對(duì)ndarray_f進(jìn)行切片,秩0上索引為1&秩2上索引為1到剩余的所有元素:\n", ndarray_f[0, 1: , ...])Numpy廣播機(jī)制 NumPy廣播是NumPy對(duì)不同形狀的數(shù)組進(jìn)行數(shù)值計(jì)算的方式,NumPy廣播要求對(duì)數(shù)組的算術(shù)運(yùn)算通常在相應(yīng)的元素上進(jìn)行。如果當(dāng)運(yùn)算中的2個(gè)數(shù)組的形狀不同時(shí),numpy將自動(dòng)觸發(fā)廣播機(jī)制: 讓所有輸入數(shù)組都向其中形狀最長的數(shù)組看齊,形狀中不足的部分都在前面加1補(bǔ)齊。 輸出數(shù)組的形狀是輸入數(shù)組形狀的各個(gè)維度上的最大值。 如果輸入數(shù)組的某個(gè)維度和輸出數(shù)組的對(duì)應(yīng)維度的長度相同或者其長度為1時(shí),這個(gè)數(shù)組能夠用來計(jì)算,否則出錯(cuò)。 當(dāng)輸入數(shù)組的某個(gè)維度的長度為1時(shí),沿著此維度運(yùn)算時(shí)都用此維度上的第一組值。 簡單的說,當(dāng)兩個(gè)數(shù)組計(jì)算時(shí),會(huì)比較它們的每個(gè)維度(若其中一個(gè)數(shù)組沒有當(dāng)前維度則忽略),如果滿足以下三個(gè)條件則觸發(fā)廣播機(jī)制: 數(shù)組擁有相同形狀。 當(dāng)前維度的值相等。 當(dāng)前維度的值有一個(gè)是1。 若條件不滿足,則拋出"ValueError: frames are not aligned"異常。
ndarray_g = np.arange(12).reshape(4, 3) ndarray_h = np.arange(3) print("ndarray_g的形狀是:", ndarray_g.shape) print("ndarray_h的形狀是:", ndarray_h.shape) print("ndarray_g與ndarray_h相加后的結(jié)果是:\n", ndarray_g+ndarray_h) ndarray_i = np.arange(24).reshape(2, 4, 3) print("ndarray_g與ndarray_i相加后的結(jié)果是:\n", ndarray_g+ndarray_i)numpy pands
【pip install pands】
Series
下載的時(shí)候比較慢,等一會(huì)就好了。?
import numpy as np import pandas as pd series_a = pd.Series(np.arange(5), index=["a", "b", "c", "d", "e"]) print("series_a的類型是:", type(series_a)) print("series_a:") print(series_a) series_a["a"] = 5 print("series_a:") print(series_a) series_b = pd.Series([8, 6, -5, 2], index=["a", "b", "c", "d"]) print(series_b[series_b > 0]) #獲取值大于0的數(shù)據(jù)。 print(series_b * 2) #輸出Series對(duì)象中每個(gè)數(shù)據(jù)乘2之后的結(jié)果。 print("a" in series_b) #判斷obj對(duì)象中是否存在索引值為"a"的數(shù)據(jù)。 print(series_b.isnull()) #檢測(cè)缺失數(shù)據(jù) series_b.index = ["f","g","k","m"] print(series_b)輸出結(jié)果如下:?
series_a的類型是: <class 'pandas.core.series.Series'>
series_a:
a ? ?0
b ? ?1
c ? ?2
d ? ?3
e ? ?4
dtype: int32
series_a:
a ? ?5
b ? ?1
c ? ?2
d ? ?3
e ? ?4
dtype: int32
a ? ?8
b ? ?6
d ? ?2
dtype: int64
a ? ?16
b ? ?12
c ? -10
d ? ? 4
dtype: int64
True
a ? ?False
b ? ?False
c ? ?False
d ? ?False
dtype: bool
f ? ?8
g ? ?6
k ? -5
m ? ?2
dtype: int64
Process finished with exit code 0
DataFrame
DataFrame數(shù)據(jù)結(jié)構(gòu) ?DataFrame是由多種類型的列構(gòu)成的二維標(biāo)簽數(shù)據(jù)結(jié)構(gòu),類似于Excel、SQL表,或Series 對(duì)象構(gòu)成的字典。 ?與Series不同的是,DataFrame具有兩個(gè)索引,通過傳遞索引可以定位到具體的數(shù)值。
import pandas as pd import numpy as np frame_a = pd.DataFrame(np.arange(6).reshape(2, 3),index=["a", "b"],columns=["x", "y", "z"],dtype=np.float32) print(frame_a)?
import pandas as pd import numpy as np frame_c = pd.DataFrame(np.arange(12).reshape(3, 4),index=["a", "b", "c"],columns=["w", "x", "y", "z"]) print("frame_c的行索引是:", frame_c.index) print("frame_c的列索引是:", frame_c.columns) print("frame_c中第二行第3個(gè)元素是:", frame_c.iloc[1, 2]) print("frame_c中行索引為\"a\"、列索引為\"x\"的元素是:", frame_c.loc["a"]["x"]) frame_c.iloc[1, 2] = 99 print("修改frame_c中第二行第3個(gè)元素后,frame_c是:") print(frame_c) print("frame_c丟棄\"z\"列后的結(jié)果是:") print(frame_c.drop("z", axis=1)) print("frame_c丟棄\"a\"行后的結(jié)果是:") print(frame_c.drop("a"))?
排序與統(tǒng)計(jì)
import pandas as pd import numpy as np frame_d = pd.Series(range(4),index=["d", "a", "b", "c"]) print(frame_d.sort_index()) #sort_index函數(shù) frame_e = pd.DataFrame(np.arange(9).reshape(3, 3),columns=["z", "x", "y"],index=["c", "a", "d"]) print(frame_e.sort_index())#sort_index函數(shù) print(frame_e.sort_index(axis=1)) print(frame_e.sort_index(axis=1,ascending=False)) frame_f = pd.DataFrame({"b":[4, -3, 7, 2], "a":[1, 6, 5, 3]}) print(frame_f.sort_values(by="b"))#對(duì)"b"這一列進(jìn)行升序排列 print(frame_f.sort_values(by=["a", "b"]))#同時(shí)對(duì)兩列進(jìn)行升序排列輸出結(jié)果?
a ? ?1
b ? ?2
c ? ?3
d ? ?0
dtype: int64
? ?z ?x ?y
a ?3 ?4 ?5
c ?0 ?1 ?2
d ?6 ?7 ?8
? ?x ?y ?z
c ?1 ?2 ?0
a ?4 ?5 ?3
d ?7 ?8 ?6
? ?z ?y ?x
c ?0 ?2 ?1
a ?3 ?5 ?4
d ?6 ?8 ?7
? ?b ?a
1 -3 ?6
3 ?2 ?3
0 ?4 ?1
2 ?7 ?5
? ?b ?a
0 ?4 ?1
3 ?2 ?3
2 ?7 ?5
1 -3 ?6
Process finished with exit code 0
| 統(tǒng)計(jì)函數(shù) | 功能說明 |
| count | 非NaN值的數(shù)量 |
| min,max | 最小值和最大值 |
| argmin,argmax | 最小值和最大值的索引位置(整數(shù)) |
| idxmin,idxmax | 最小值和最大值的索引值 |
| sum | 求和 |
| mean | 均值 |
| var | 方差 |
| std | 標(biāo)準(zhǔn)差 |
| diff | 計(jì)算一階差分(對(duì)時(shí)間序列很有用) |
異常值處理
缺失數(shù)據(jù)在大部分?jǐn)?shù)據(jù)分析應(yīng)用中都很常見,Pandas的設(shè)計(jì)目標(biāo)之一就是讓缺失數(shù)據(jù)的處理任務(wù)盡量輕松 ?Pandas使用浮點(diǎn)值NaN(Not a umber)表示浮點(diǎn)和非浮點(diǎn)數(shù)組中的缺失數(shù)據(jù) ?Pandas提供了專門的處理缺失數(shù)據(jù)的函數(shù):
| 函數(shù) | 說明 |
| dropna | 根據(jù)各標(biāo)簽的值中是否存在缺失數(shù)據(jù)對(duì)軸標(biāo)簽進(jìn)行過濾 |
| fillna | 用指定值或插值函數(shù)填充缺失數(shù)據(jù) |
| isnull | 返回一個(gè)含有布爾值的對(duì)象,這些布爾值表示哪些值是缺失值 |
| notnull | 返回一個(gè)含有布爾值的對(duì)象,這些布爾值表示哪些值不是缺失值 |
?
時(shí)間處理
時(shí)間序列數(shù)據(jù)是一種重要的結(jié)構(gòu)化數(shù)據(jù)形式。 ?
在Python語言中,主要使用datatime模塊來處理時(shí)間:
datetime對(duì)象間的減法運(yùn)算會(huì)得到一個(gè)timedelta對(duì)象,timedelta對(duì)象代表兩個(gè)時(shí)間之間的時(shí)間差。
datetime對(duì)象與它所保存的字符串格式時(shí)間戳之間可以互相轉(zhuǎn)換。
在Pandas中,主要使用從Series派生出來的子類TimeStamp:
最基本的時(shí)間序列類型就是以時(shí)間戳(TimeStamp)為index元素的Series類型。
時(shí)間序列只是index比較特殊的Series,因此一般的索引操作對(duì)時(shí)間序列依然有效。
時(shí)間序列只是index比較特殊的Series,因此一般的索引操作對(duì)時(shí)間序列依然有效。
import datetime as datetime import pandas as pd import numpy as np print(pd.to_datetime(datetime.datetime.now())) print(pd.to_datetime(np.nan)) dates = [datetime.datetime(2022,1,1),datetime.datetime(2022,1,2),datetime.datetime(2022,1,3)] ts = pd.Series(np.random.rand(3), index=dates) print(ts)時(shí)間處理
import pandas as pd print(pd.date_range("20220101", "20220108")) print(pd.date_range(start="20220101", periods=8)) print(pd.date_range(end="20220108", periods=8)) print(pd.date_range("20220101", "20220501", freq="M")) print(pd.date_range('20221018', '2022-10-25')) print(pd.date_range('2022/10/18', '2022-10-25')) print(pd.date_range('2022/10/21', '2022-10-22', freq="4H"))文件讀寫
常見的文件讀寫有3種,
分別是一般文本文件、 CSV文件Excel文件,
Pandas提供了便利的CSV和Excel文件讀寫方式: ?
使用to_csv()函數(shù)將DataFrame對(duì)象寫入到CSV文件。
使用read_csv()函數(shù)讀取CSV文件。 ?
使用to_excel()函數(shù)將DataFrame對(duì)象寫入到CSV文件。 ?
使用read_excel()函數(shù)讀取CSV文件。
import pandas as pd import os df_write = pd.DataFrame({"name": ["Alice", "Mary", "Anna"],"age": ["23", "34", "28"]}) root_path = os.getcwd() file_with_path = os.path.join(root_path, 'test.csv') df_write.to_csv(file_with_path, index=False) df_read = pd.read_csv(file_with_path) print(df_read)?
總結(jié)
以上是生活随笔為你收集整理的python数据分析和可视化——一篇文章足以(未完成)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: No module named pip
- 下一篇: C盘不够用了怎么办,看我4年未重做系统如