一、摘要:
本選題應用Python網絡爬蟲方法,在東方財富網站爬取個股資金流實時數據,通過數據可視化,展現各企業當日股價、漲跌率、凈額度、主力凈流入情況。
二、選題背景:
隨着社會的高速發展,股票作為股份公司為籌建資金而發行的一種有價證券,是證明投資者投資入股並據以獲取股利收入的一種股權憑證,早已走進千家萬戶,成為許多家庭投資的重要目標。股票投資已成為老百姓日常談論的熱門話題,但股票具有高收益、高風險的特點,所以在“炒股”過程中需要異常謹慎。
身為學習Python數據處理編程的人來說,最為清楚圖形中的奧秘:一張好的可視化圖形,不僅能夠直觀的表現出事物的現象,還能夠揭示現象背后的本質;而一張差強人意的可視化圖,卻會給人以誤導,蒙蔽現象背后的本質。在當今信息化時代,涌現了許多關於”炒股”的軟件,有些股票軟件數據雜亂無章,圖表信息量大且不能簡單明了,並不能為炒股人帶去幫助。制作合適的圖形來展示股市的變化信息對”炒股”來說尤為重要。在學習本課程中,學習到了一些網絡爬蟲和數據可視化的相關知識,利用這些知識繪制一些關於每天股市變化的相關信息,幫助炒股人規避一定的風險。
三、數據說明:
爬取東方財富網實時更新的企業資金流向數據,繪制股票價格條形圖、漲跌幅折線圖、凈額餅圖,展現各企業當天的股票行情。
四、實施過程及代碼:
1、企業當日個股資金流數據情況:
(1)數據爬取
1 import requests 2 import json 3 import matplotlib.pyplot as plt 4 import pandas as pd 5 from bs4 import BeautifulSoup 6 7 #設置瀏覽器對象 8 headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"} 9 10 #headers=headers表示偽裝瀏覽器訪問 11 resp=requests.get("http://push2.eastmoney.com/api/qt/clist/get?pn=1&pz=50&po=1&np=1&ut=b2884a393a59ad64002292a3e90d46a5&fltt=2&invt=2&fid0=f4001&fid=f62&fs=m:0+t:6+f:!2,m:0+t:13+f:!2,m:0+t:80+f:!2,m:1+t:2+f:!2,m:1+t:23+f:!2,m:0+t:7+f:!2,m:1+t:3+f:!2&stat=1&fields=f12,f14,f2,f3,f62,f184,f66,f69,f72,f75,f78,f81,f84,f87,f204,f205,f124&rt=53597607&cb=jQuery18303181849503270513_1607928142376&_=1607928235420",headers=headers)#headers=headers表示偽裝瀏覽器訪問 12 13 #print(resp.text) #輸出網頁內容 14 #把網頁內容存入content變量 15 content=resp.text 16 17 #去掉前后不是大括號內的代碼 18 rest=content.replace('jQuery18303181849503270513_1607928142376(','').replace(');','') #去掉前后不是大括號內的代碼 19 20 #rest 21 #將代碼通過json庫載入,成為鍵值對的形式 22 resp_dict=json.loads(rest) 23 24 #提取data里diff列表內容 25 datas=resp_dict.get('data').get('diff') 26 27 #輸出網頁內容 28 print(datas)

(2)數據集構建
1 #構建數據集 2 companies=[] 3 prices=[] 4 shares_1=[] 5 uds=[] 6 moneys=[] 7 8 #遍歷datas內容 9 for data in datas: 10 11 #公司名 12 company=data.get('f14') 13 14 #今日主力凈流入 凈占比 15 share_1=data.get('f184') 16 17 #凈額 18 money=data.get('f62') 19 20 #當日漲跌幅 21 ud=data.get('f3') 22 23 #當天股價 24 price=data.get('f2') 25 26 #把公司數據追加到companies 27 companies.append(company) 28 29 #把股價數據追加到prices 30 prices.append(price) 31 32 #把凈額數據追加到moneys 33 moneys.append(money) 34 35 #把凈占比追加到shares_1 36 shares_1.append(share_1) 37 38 #把漲跌幅數據追加到uds 39 uds.append(ud)
(3)儲存數據、讀取csv文件、檢測缺失值
1 #設置數據存儲 2 aa={"公司名稱":companies,"最新股票價格":prices,"漲跌幅":uds,"凈額":moneys,"凈占比":shares_1} 3 4 #創建二維數據表,aa數據存入 5 df=pd.DataFrame(aa) 6 7 #檢查是否有缺失值 8 df.isnull()

1 #數據保存為gupiao.csv文件,取消索引,編碼為utf-8 2 df.to_csv("gupiao.csv",index=False,encoding='utf-8') 3 4 #讀取gupiao.csv文件,構建數據框province_df 5 province_df= pd.read_csv(r"個股資金流數據.csv", sep=",",encoding='utf-8')
2、當日股價前十公司對比(條形圖):
1 from pyecharts.charts import Bar 2 import numpy as np 3 import matplotlib.pyplot as plt 4 5 # 解決中文問題 6 plt.rcParams['font.sans-serif'] = ['SimHei'] 7 8 #對原始數據集按照股票價格降序排列 9 province_sorted = province_df.sort_values(by = '最新股票價格', ascending = False) 10 11 #把公司名稱數據存入列表a 12 a=province_sorted['公司名稱'] 13 14 #把最新股票價格數據存入列表b 15 b=province_sorted['最新股票價格'] 16 17 #繪制區域大小 18 plt.figure(figsize=(12,6)) 19 20 #取a列表前10條數據 21 x=a[:10] 22 23 #取b列表前10條數據 24 y=b[:10] 25 26 #設置標題內容 27 plt.title('當日前十股票最高價公司對比圖',fontsize=14,color='red') 28 29 #設置x坐標標簽,字體大小 30 plt.xlabel('公司名稱',fontsize=15) 31 32 #設置x坐標標簽,字體大小 33 plt.ylabel('股票價/元',fontsize=15) 34 35 #顯示圖形 36 plt.bar(x, y) 37 38 #循環為圖形添加數據注釋 39 for x,y in zip(x,y): 40 plt.text(x, y, '%.2f' % y, ha='center', va= 'bottom',fontsize=15,color='b')
運行后的條形圖如下:
3、各企業股票漲跌幅比較(折線圖):
1 #把漲跌幅數據存入列表c 2 c=province_sorted['漲跌幅'] 3 4 ##繪制區域大小 5 fig=plt.figure(dpi=100,figsize=(10,6)) 6 7 #繪制一行兩列的子圖,第一張圖 8 ax1 = plt.subplot(1,2,1) 9 10 #獲取前15條公司數據 11 x=a[:15] 12 13 #獲取前15條漲跌幅數據 14 y=c[:15] 15 16 #為圖形添加標題,字體大小,顏色 17 plt.title('今日股票價1~15名公司漲跌幅比較圖',fontsize=10,color='r') 18 19 #設置x坐標標簽 20 plt.xlabel('公司名稱') 21 22 #設置y坐標標簽 23 plt.ylabel('漲跌幅\%') 24 25 #設置x軸數據字體大小 26 plt.xticks(fontsize=8) 27 28 #設置y軸數據字體大小 29 plt.yticks(fontsize=8) 30 31 #設置x軸數據斜顯示 32 fig.autofmt_xdate() 33 34 #繪制圖形,洋紅色,點形狀標記v,線形狀-- 35 plt.plot(x,y, color='m', marker='v',linestyle = "--") 36 37 #添加網格背景,透明度為0.5,樣式為-- 38 plt.grid(alpha=0.5,linestyle='--') 39 40 #繪制一行兩列的子圖,第二張圖 41 ax2 = plt.subplot(1,2,2) 42 43 #獲取15-30條公司數據 44 x1=a[15:30] 45 46 #獲取15-30條漲跌幅數據 47 y1=c[15:30] 48 49 #為圖形添加標題,字體大小,顏色 50 plt.title('今日股票價15~30名公司漲跌幅比較圖',fontsize=10,color='r') 51 52 #設置x坐標標簽 53 plt.xlabel('公司名稱') 54 55 #設置y坐標標簽 56 plt.ylabel('漲跌率\%') 57 58 #設置x軸數據字體大小 59 plt.xticks(fontsize=8) 60 61 #設置y軸數據字體大小 62 plt.yticks(fontsize=8) 63 64 #設置x軸數據斜顯示 65 fig.autofmt_xdate() 66 67 #繪制圖形,青色,點形狀標記v,線形狀: 68 plt.plot(x1,y1, color='c', marker='p',linestyle = ":") 69 70 #添加網格背景,透明度為0.5,樣式為-- 71 plt.grid(alpha=0.5,linestyle='--')
運行后的折線圖如下:

4、股價前10公司凈額比例對比(餅圖):
1 #把凈額數據存入列表d 2 d=province_sorted['凈額']/100000000 3 4 #提取前10公司數據 5 x=a[:10] 6 7 #提取前10凈額數據 8 y=d[:10] 9 10 #設置各項距離圓心n個半徑 11 explode=[0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04] 12 13 #為圖形添加標題,pad設置位置 14 plt.title('當日股價前10公司凈額比例對比圖',fontsize=20,pad=130) 15 16 #繪制餅圖,百分率,大小 17 plt.pie(y,explode=explode,labels=x,autopct='%1.2f%%',radius=2,textprops={'fontsize':10}) 18 19 #繪制圖例,圖例位置 20 plt.legend(loc='upper left', bbox_to_anchor=(1.7, 1.5)) 21 22 #顯示圖形 23 plt.show()
運行后的餅圖如下:

完整代碼:
1 import requests 2 import json 3 import matplotlib.pyplot as plt 4 import pandas as pd 5 from bs4 import BeautifulSoup 6 7 #設置瀏覽器對象 8 headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"} 9 10 #headers=headers表示偽裝瀏覽器訪問 11 resp=requests.get("http://push2.eastmoney.com/api/qt/clist/get?pn=1&pz=50&po=1&np=1&ut=b2884a393a59ad64002292a3e90d46a5&fltt=2&invt=2&fid0=f4001&fid=f62&fs=m:0+t:6+f:!2,m:0+t:13+f:!2,m:0+t:80+f:!2,m:1+t:2+f:!2,m:1+t:23+f:!2,m:0+t:7+f:!2,m:1+t:3+f:!2&stat=1&fields=f12,f14,f2,f3,f62,f184,f66,f69,f72,f75,f78,f81,f84,f87,f204,f205,f124&rt=53597607&cb=jQuery18303181849503270513_1607928142376&_=1607928235420",headers=headers)#headers=headers表示偽裝瀏覽器訪問 12 13 #print(resp.text) #輸出網頁內容 14 #把網頁內容存入content變量 15 content=resp.text 16 17 #去掉前后不是大括號內的代碼 18 rest=content.replace('jQuery18303181849503270513_1607928142376(','').replace(');','') #去掉前后不是大括號內的代碼 19 20 #rest 21 #將代碼通過json庫載入,成為鍵值對的形式 22 resp_dict=json.loads(rest) 23 24 #提取data里diff列表內容 25 datas=resp_dict.get('data').get('diff') 26 27 #輸出網頁內容 28 print(datas) 29 30 #構建數據集 31 companies=[] 32 prices=[] 33 shares_1=[] 34 uds=[] 35 moneys=[] 36 37 #遍歷datas內容 38 for data in datas: 39 40 #公司名 41 company=data.get('f14') 42 43 #今日主力凈流入 凈占比 44 share_1=data.get('f184') 45 46 #凈額 47 money=data.get('f62') 48 49 #當日漲跌幅 50 ud=data.get('f3') 51 52 #當天股價 53 price=data.get('f2') 54 55 #把公司數據追加到companies 56 companies.append(company) 57 58 #把股價數據追加到prices 59 prices.append(price) 60 61 #把凈額數據追加到moneys 62 moneys.append(money) 63 64 #把凈占比追加到shares_1 65 shares_1.append(share_1) 66 67 #把漲跌幅數據追加到uds 68 uds.append(ud) 69 70 #設置數據存儲 71 aa={"公司名稱":companies,"最新股票價格":prices,"漲跌幅":uds,"凈額":moneys,"凈占比":shares_1} 72 73 #創建二維數據表,aa數據存入 74 df=pd.DataFrame(aa) 75 76 #檢查是否有缺失值 77 df.isnull() 78 79 #數據保存為gupiao.csv文件,取消索引,編碼為utf-8 80 df.to_csv("gupiao.csv",index=False,encoding='utf-8') 81 82 #讀取gupiao.csv文件,構建數據框province_df 83 province_df= pd.read_csv(r"個股資金流數據.csv", sep=",",encoding='utf-8') 84 85 from pyecharts.charts import Bar 86 import numpy as np 87 import matplotlib.pyplot as plt 88 89 # 解決中文問題 90 plt.rcParams['font.sans-serif'] = ['SimHei'] 91 92 #對原始數據集按照股票價格降序排列 93 province_sorted = province_df.sort_values(by = '最新股票價格', ascending = False) 94 95 #把公司名稱數據存入列表a 96 a=province_sorted['公司名稱'] 97 98 #把最新股票價格數據存入列表b 99 b=province_sorted['最新股票價格'] 100 101 #繪制區域大小 102 plt.figure(figsize=(12,6)) 103 104 #取a列表前10條數據 105 x=a[:10] 106 107 #取b列表前10條數據 108 y=b[:10] 109 110 #設置標題內容 111 plt.title('當日前十股票最高價公司對比圖',fontsize=14,color='red') 112 113 #設置x坐標標簽,字體大小 114 plt.xlabel('公司名稱',fontsize=15) 115 116 #設置x坐標標簽,字體大小 117 plt.ylabel('股票價/元',fontsize=15) 118 119 #顯示圖形 120 plt.bar(x, y) 121 122 #循環為圖形添加數據注釋 123 for x,y in zip(x,y): 124 plt.text(x, y, '%.2f' % y, ha='center', va= 'bottom',fontsize=15,color='b') 125 126 #把漲跌幅數據存入列表c 127 c=province_sorted['漲跌幅'] 128 129 ##繪制區域大小 130 fig=plt.figure(dpi=100,figsize=(10,6)) 131 132 #繪制一行兩列的子圖,第一張圖 133 ax1 = plt.subplot(1,2,1) 134 135 #獲取前15條公司數據 136 x=a[:15] 137 138 #獲取前15條漲跌幅數據 139 y=c[:15] 140 141 #為圖形添加標題,字體大小,顏色 142 plt.title('今日股票價1~15名公司漲跌幅比較圖',fontsize=10,color='r') 143 144 #設置x坐標標簽 145 plt.xlabel('公司名稱') 146 147 #設置y坐標標簽 148 plt.ylabel('漲跌幅\%') 149 150 #設置x軸數據字體大小 151 plt.xticks(fontsize=8) 152 153 #設置y軸數據字體大小 154 plt.yticks(fontsize=8) 155 156 #設置x軸數據斜顯示 157 fig.autofmt_xdate() 158 159 #繪制圖形,洋紅色,點形狀標記v,線形狀-- 160 plt.plot(x,y, color='m', marker='v',linestyle = "--") 161 162 #添加網格背景,透明度為0.5,樣式為-- 163 plt.grid(alpha=0.5,linestyle='--') 164 165 #繪制一行兩列的子圖,第二張圖 166 ax2 = plt.subplot(1,2,2) 167 168 #獲取15-30條公司數據 169 x1=a[15:30] 170 171 #獲取15-30條漲跌幅數據 172 y1=c[15:30] 173 174 #為圖形添加標題,字體大小,顏色 175 plt.title('今日股票價15~30名公司漲跌幅比較圖',fontsize=10,color='r') 176 177 #設置x坐標標簽 178 plt.xlabel('公司名稱') 179 180 #設置y坐標標簽 181 plt.ylabel('漲跌率\%') 182 183 #設置x軸數據字體大小 184 plt.xticks(fontsize=8) 185 186 #設置y軸數據字體大小 187 plt.yticks(fontsize=8) 188 189 #設置x軸數據斜顯示 190 fig.autofmt_xdate() 191 192 #繪制圖形,青色,點形狀標記v,線形狀: 193 plt.plot(x1,y1, color='c', marker='p',linestyle = ":") 194 195 #添加網格背景,透明度為0.5,樣式為-- 196 plt.grid(alpha=0.5,linestyle='--') 197 198 #把凈額數據存入列表d 199 d=province_sorted['凈額']/100000000 200 201 #提取前10公司數據 202 x=a[:10] 203 204 #提取前10凈額數據 205 y=d[:10] 206 207 #設置各項距離圓心n個半徑 208 explode=[0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04] 209 210 #為圖形添加標題,pad設置位置 211 plt.title('當日股價前10公司凈額比例對比圖',fontsize=20,pad=130) 212 213 #繪制餅圖,百分率,大小 214 plt.pie(y,explode=explode,labels=x,autopct='%1.2f%%',radius=2,textprops={'fontsize':10}) 215 216 #繪制圖例,圖例位置 217 plt.legend(loc='upper left', bbox_to_anchor=(1.7, 1.5)) 218 219 #顯示圖形 220 plt.show()
五、案例自評:
股票是當代社會最重要的投資方式之一,深受人們的歡迎。作為一名軟件工程專業的學生,在學習完Python數據處理編程后,借助Python工具,處理股市中對股民具有參考價值的數據,是我本次的目標。通過各類可視化圖形的繪制,幫助股民
分析股市行情,及時加倉或者賣出。
(1)創新性
市面上的相關炒股軟件,大部分並不能直觀的為股民帶來有用的數據消息,且有的軟件並沒有及時更新數據。Python有着”流程可控、工作高效、豐富的庫”的特點,使用Python分析股市數據,可以大大提高數據處理的效率,實時更新股市情況,快速
的獲取炒股所需要的數據信息,分析股票行情。
與使用傳統的作圖軟件相比,使用Python中繪制的各類數據圖形更加簡便美觀,效率也更加快。
(2)實用性
通過Python進行數據處理,大大提高了獲取數據的效率。將網絡爬蟲和數據可視化結合起來,把獲取到的數據進行可視化,能夠使我們快速、高效的得到有幫助的信息。使用Python進行股市數據分析,可以極大程度上幫助股民規避一定的風險,也可
以幫助剛接觸炒股的股民快速上手。該思路可以應用到許多其他的領域的實時數據展示,比如:天氣情況、房子信息、用戶網上消費情況等。

