Python-pandas:Goodinfo的法人買賣超資訊整理
前言
本篇將著重在如何使用python的pandas整理Goodinfo的各家公司的法人買賣超資訊,關於怎麼爬可以先參考:Python爬蟲:Goodinfo的ROE排名
將學習到 pandas的使用介紹
- 基本用法
- index、columns
- loc、iloc
- 資料排序、刪除
環境設定
win10 Anaconda 的 jupyter(6.0.3)
使用套件
import requests
import bs4
import pandas
from datetime import datetime
pandas使用介紹
rows為行(上到下)=0
columns為列(左到右)=1
爬取該網站並先初步整理
import requests
import bs4
import pandas as pd#使用requests
url = “https://goodinfo.tw/StockInfo/StockList.asp?MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E4%B8%89%E5%A4%A7%E6%B3%95%E4%BA%BA%E7%B4%AF%E8%A8%88%E8%B2%B7%E8%B6%85%E5%BC%B5%E6%95%B8+%E2%80%93+%E7%95%B6%E6%97%A5%40%40%E4%B8%89%E5%A4%A7%E6%B3%95%E4%BA%BA%E7%B4%AF%E8%A8%88%E8%B2%B7%E8%B6%85%40%40%E4%B8%89%E5%A4%A7%E6%B3%95%E4%BA%BA%E8%B2%B7%E8%B6%85%E5%BC%B5%E6%95%B8+%E2%80%93+%E7%95%B6%E6%97%A5&SHEET=%E6%B3%95%E4%BA%BA%E8%B2%B7%E8%B3%A3&SHEET2=%E6%B3%95%E4%BA%BA%E8%B2%B7%E8%B3%A3%E5%BC%B5%E6%95%B8"
headers = {‘user-agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36’}
res = requests.get(url,headers=headers)
res.encoding = “utf-8”#使用bs4的BeautifulSoup
soup = bs4.BeautifulSoup(res.text,”lxml”)
data = soup.select_one(“#txtStockListData”)#使用pandas
df = pd.read_html(data.prettify())
#第[1]個為我們要的表格
dfs = df[1]
#將重複的標頭篩選掉
dfs.columns = dfs.columns.get_level_values(16)
#顯示頭10筆資料
dfs.head(10)
爬蟲法人原始碼
基本用法
dfs.head(10) #顯示頭10筆資料,可用.head()則為預設5
dfs.tail(10) #顯示尾部10筆資料
dfs.shape() #顯示出資料共有(X行,Y列)
len(dfs) #顯示資料的總筆數
dfs.dtypes #顯示資料類型
dfs.select_dtypes("string") #選取字串類型的資料(新功能)
dfs.describe()#顯示統計數字(最大、最小、平均......等)
dfs[['名稱']] #顯示Columns(列)為名稱的數據
dfs.名稱 #顯示Columns(列)為名稱的數據
dfs.info() #顯示資料的狀態與資訊
dfs.info(memory_usage='deep') #顯示記憶體使用狀況
columns
dfs.columns#顯示有哪些欄位dfs.columns = dfs.columns.get_level_values(16)#將重複的cloums取第16個dfs= dfs[["代號","名稱","外資 買賣超 張數","投信 買賣超 張數","自營 買賣超 張數","合計 買賣超 張數"]]#取出要得欄位columnsdfs.columns=[u"代號",u"名稱",u"外資買賣超張數",u"投信買賣超張數",u"自營買賣超張數",u"合計買賣超張數"]#取代欄位名稱dfs.rename(columns={'舊欄位名稱': '新欄位名稱'},{'舊欄位名稱': '新欄位名稱'}) #修改欄位名稱 dfs.columns = ['XXX','XXX', 'XXX'] #新增欄位dfs["date"]=datetime.now().strftime("%Y-%m-%d")#新增時間欄位(年月日)dfs[["名稱",'外資買賣超張數']]#查看columns裡的[名稱]和[外資買賣超張數]
index
dfs.index#顯示有哪些行dfs.index=amount[‘代號’]#將columns的['代號']變成indexdfs.set_index("代號" , inplace=True)#將columns的'代號'變成indexdfs.reset_index(inplace=True)#重製index回原本的樣子,使用inplace=True才會把原本的資料改變
loc[]依照名稱查詢
dfs.loc[“2317”]#查2317dfs.loc[“2317”,”合計買賣超張數”]#查2317裡的合計買賣超張數dfs.loc[["2317","2330"]]#同時查詢2317和2330
iloc[]依照絕對位置查詢
dfs.iloc[10]#查詢第10筆資料dfs.iloc[[0,4]]#查詢第0跟4筆的資料dfs.iloc[0:4]#查詢第0到第3筆的資料dfs.iloc[4:5,:]#[row,columns],查詢第4筆資料的全部,':'為全部的意思dfs.iloc[:,4] # 第4欄的全部資料
資料排序、刪除
資料排序
dfs[dfs.loc[:,”合計買賣超張數”] > 5000]#查詢”合計買賣超張數”大於5000dfs.sort_index(axis = 0, ascending = True) # 透過索引值做排序,axis 可以指定第幾欄,ascending 用於設定升冪(True)或降密(False)dfs.sort_values(by = '合計買賣超張數', ascending=False) #透過指定欄位的數值排序dfs.nlargest(3,'合計買賣超張數') #查詢'合計買賣超張數'中數值前3大的dfs.nsmallest(3,'合計買賣超張數') #查詢'合計買賣超張數'中數值前3小的刪除資料
df.drop(labels=['投信買賣超張數','自營買賣超張數'],axis='columns') #刪除這兩個欄位df.drop(labels=['投信買賣超張數','自營買賣超張數'],axis='columns',inplace=True)df=df.drop_duplicates() #刪除重複的資料df.drop(df.index[-1]) #刪除最後一筆資料#axis=0和asxis='row'一樣
#axis=1和axis='columns'一樣
#使用inplace=True才會把原本的資料改變
關於排序都要將資料轉換成數值型態而不是str,會的朋友可以是將資料裡的’+’和’-’做型態轉換再做排序。
小結
以上用的都是我常用的pandas基本指令,關於更深入的資料整理當然還有,可以參考以下的資料去找到你需要的,對於以上資料有建議或錯誤的地方可以留言告訴我,讓我們一起進步。
參考資料
Python 資料處理筆記 — 使用Panda進行數據處理
[Day09]Pandas索引的運用!
[Python] Pandas 基礎教學
python中pandas库中DataFrame对行和列的操作使用方法