前言
據東方財富網統計最新數據,中國股民人數超1.7億
伴隨着資本市場規模的擴大,投資者數量也在不斷增長。據中國證券登記結算有限責任公司的數據,2016年1月,投資者人數正式突破1億人。
截至2020年10月末,投資者人數達1.74億人,拋開炒股技術不講,這么多的股票數據非常難找與統計,但我們能夠使用網絡爬蟲爬取股票的各種詳細數據,再將這些數據進行整理與分析。
更直觀的觀看股票的數據情況從而進行對比
數據來源
爬蟲設計方案
1. 爬蟲名稱
股票數據的爬取和數據清洗與分析
2. 爬取內容與數據特征分析
爬取所有股票的信息並進行對比分析
3. 方案概述
分析網站的頁面結構,找到爬取的位置,制定方案,保存成csv文件
網站頁面的結構與特征分析
主頁中包括了各種市場的股票,而我們從中篩選滬深股市進行爬取,
點擊后從網站截圖可以看出,該網站有兩個結構 分為左區的股市總覽,中間這一部分是股票的具體數據,此區域就是我們需要爬取的區域
網站的Htmls 頁面解析與
節點(標簽)查找方法與遍歷方法
檢查網站源代碼 發現有許多數據,此時我們篩選出XHR數據
篩選出后發現一條內容點進去
進入后 從中可以得知 總共有4432條數據
繼續展開發現數據都在列表里面
展開第一條數據,發現第一條數據的名稱與網站上的第一條數據相對應
那么從上推斷可以得出4432條是所有股票的記錄
然后從股票數據中,來定位數據的標簽
網絡爬蟲程序設計
1. 爬取數據
(1)股票數據爬取並保存
1 import requests 2 import csv 3 4 5 6 #打開一個文件並命名 7 file = open('data.csv', mode='a', encoding='utf-8', newline='') 8 #使用DictWriter方法以字典形式寫入 9 csv_write = csv.DictWriter(file, fieldnames=['股票代碼', '股票名稱', '當前價', '漲跌額', '漲跌幅', '年初至今', '成交量', '成交額', '換手率', '市盈率(TTM)', 10 '股息率', '市值']) 11 12 csv_write.writeheader() #寫入一次表頭數據 13 14 15 #原本網頁一頁最多只能顯示90支股票數據,通過查看 結合頁數計算 一共有4432支股票數據 修改url中的size 以達到獲取全部股票數據 16 url = 'https://xueqiu.com/service/v5/stock/screener/quote/list?page=1&size=4432&order=desc&orderby=percent&order_by=percent&market=CN&type=sh_sz&_=1623304455997' 17 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"}#遭遇反爬 加請求參數 18 # 發送網絡請求 19 response = requests.get(url=url, headers=headers) 20 json_data = response.json() 21 22 # 數據篩選 23 data_list = json_data['data']['list'] 24 for data in data_list: #建立for循環 把列表數據遍歷出來 25 # print(data) #解析數據 26 #設置data取鍵值對 27 data1 = data['symbol'] 28 data2 = data['name'] 29 data3 = data['current'] 30 data4 = data['chg'] 31 if data4: 32 if float(data4) > 0: 33 data4 = '+' + str(data4) 34 else: 35 data4 = str(data4) 36 data5 = str(data['percent']) + '%' 37 data6 = str(data['current_year_percent']) + '%' 38 data7 = data['volume'] 39 data8 = data['amount'] 40 data9 = str(data['turnover_rate'])+'%' 41 data10 = data['pe_ttm'] 42 data11 =data['dividend_yield'] 43 if data11: 44 data11 = str(data['dividend_yield'])+'%' 45 else: 46 data11 = None 47 data12 = data['market_capital'] 48 print(data1, data2, data3, data4, data5, data6, data7, data8, data9, data10, data11, data12,) 49 50 #數據保存 51 data_dict = {'股票代碼': data1, '股票名稱': data2, '當前價': data3, '漲跌額': data4, '漲跌幅': data5, '年初至今': data6, 52 '成交量': data7, '成交額':data8, '換手率': data9, '市盈率(TTM)': data10, '股息率': data11, '市值': data12, } 53 csv_write.writerow(data_dict)
2. 數據查看並清洗
1 import pandas as pd 2 import numpy as np 3 #加載csv數據 4 data_df = pd.read_csv('data.csv') 5 #顯示頭文件 6 data_df.head() 7 #判斷數據行中書是否存在缺失值 8 data_df.isnull().any(axis=1)
從中發現還是有缺失值存在,所以我們選擇進行用0填充
1 #將缺失值都補為0 2 data_df = data_df.fillna(0) 3 #再次查看數據行中書是否修改成功 4 data_df.isnull().any(axis=1)
填充成功,數據里已無缺失值
1 #再次查看數據行 2 data_df.head()
1 #統計每一列空值的個數: 2 data_df.isnull().any().sum()
進行排序,因為我們只取成交量前十的十支股票來進行數據對比操作
1 #讓值從大到小進行排序 2 df = data_df.sort_values(by='成交量',ascending=False) 3 data_df.head(10)
保存處理后的數據
1 #保存處理后的數據 2 import pandas as pd 3 df = df.set_index('股票名稱') 4 df.to_csv("data1.csv",encoding='utf-8') 5 data_df = pd.read_csv("data1.csv")
讀取處理后的數據
1 #讀取處理后的數據 2 data_df = pd.read_csv('data1.csv') 3 df = data_df.dropna() 4 df1 = df[['股票名稱', '成交量']] 5 data_df.sort_values(by='成交量',ascending=False) 6 #取前10條股票 7 df2 = df1.iloc[:10] 8 #打印出來顯示檢查結果是否正確 9 print(df2['股票名稱'].values) 10 print(df2['成交量'].values)
導入相關圖包
繪制成交量柱形圖進行對比
成交量第一的股票是京東方A
1 from pyecharts.charts import Bar 2 from pyecharts.globals import ThemeType 3 #設置風格 4 bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.ESSOS)) 5 #x軸數據 6 bar.add_xaxis(list(df2['股票名稱'].values)) 7 #x軸數據 8 bar.add_yaxis("股票成交量情況",list(df2['成交量'].values)) 9 #設置標簽配置項 10 bar.set_series_opts(label_opts=opts.LabelOpts(position="top")) 11 #設置標題 12 bar.set_global_opts(title_opts=opts.TitleOpts(title="成交量圖表")) 13 #直接在notebook顯示圖表 14 bar.render_notebook()
繪制成交額柱形圖進行對比
成交額最高的是股票是中遠海控
1 from pyecharts import options as opts 2 from pyecharts.charts import Bar 3 4 #讀取表 5 data_df = pd.read_csv('data1.csv') 6 df = data_df.dropna() 7 df1 = df[['股票名稱', '成交額']] 8 data_df.sort_values(by='成交額',ascending=False) 9 #取前10條股票 10 df2 = df1.iloc[:10] 11 print(df2['股票名稱'].values) 12 print(df2['成交額'].values) 13 #設置風格 14 bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK)) 15 #x軸數據 16 bar.add_xaxis(list(df2['股票名稱'].values)) 17 #y軸數據 18 bar.add_yaxis("股票成交額情況",list(df2['成交額'].values)) 19 #設置標簽配置項 20 bar.set_series_opts(label_opts=opts.LabelOpts(position="top")) 21 #設置標題 22 bar.set_global_opts(title_opts=opts.TitleOpts(title="成交額圖表")) 23 #直接在notebook顯示圖表 24 bar.render_notebook()
繪制市值圖表 進行對比
市值最高的股票為中國石油
1 from pyecharts import options as opts 2 from pyecharts.charts import Bar 3 import pandas as pd 4 from pyecharts.globals import ThemeType 5 #讀取表 6 data_df = pd.read_csv('data1.csv') 7 df = data_df.dropna() 8 df1 = df[['股票名稱', '市值']] 9 data_df.sort_values(by='市值',ascending=False) 10 df2 = df1.iloc[:10] 11 #打印出股票名稱與市值 查看數據是否正確 12 print(df2['股票名稱'].values) 13 print(df2['市值'].values) 14 15 #設置風格 16 bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC)) 17 #導入Y軸數據 18 y_data = [212966200430,9248273205,107335530969,73391902563,949878874875,317276616395,281115930557,12651913335,92773567583,12646728429] 19 #x軸數據,導入數據 20 bar.add_xaxis(list(df2['股票名稱'].values)) 21 #y軸數據,導入數據 22 bar.add_yaxis("股票市值情況",y_data) 23 #設置數字顯示位置 24 bar.set_series_opts(label_opts=opts.LabelOpts(position="right")) 25 #設置標題 26 bar.set_global_opts(title_opts=opts.TitleOpts(title="市值圖表")) 27 bar.reversal_axis() 28 #直接在notebook顯示圖表 29 bar.render_notebook()
繪制折線圖,
對比這些股票的漲幅度情況
漲幅度最高的是中銀絨業
1 import pyecharts.options as opts 2 from pyecharts.charts import Line 3 4 #查看數據得知漲跌幅情況,設置Y軸參數 5 y_data = [3.03,10.15,2,0,5.7,3.4,-0.63,2.31,6.03,3.39] 6 7 line=( 8 Line() 9 .set_global_opts( 10 tooltip_opts=opts.TooltipOpts(is_show=True), 11 xaxis_opts=opts.AxisOpts(type_="category"), 12 yaxis_opts=opts.AxisOpts( 13 type_="value", 14 axistick_opts=opts.AxisTickOpts(is_show=True), 15 splitline_opts=opts.SplitLineOpts(is_show=True), 16 ), 17 title_opts=opts.TitleOpts(title="單位(%)", pos_left="left"), 18 ) 19 .add_xaxis(list(df2['股票名稱'].values)) 20 .add_yaxis( 21 series_name="漲跌幅折線圖", 22 y_axis=y_data, 23 symbol="emptyCircle", 24 is_symbol_show=True, 25 label_opts=opts.LabelOpts(is_show=True), 26 27 ) 28 ) 29 #在notebook上直接顯示圖片 30 line.render_notebook()
繪制折線圖,
對比年初至今的漲幅情況
漲幅最顯著的股票是中遠海控
1 import pyecharts.options as opts 2 from pyecharts.charts import Line 3 4 5 df = data_df.dropna() 6 df1 = df[['股票名稱', '年初至今']] 7 data_df.sort_values(by='年初至今',ascending=False) 8 #取前10條股票 9 df2 = df1.iloc[:10] 10 #打印出股票名稱與年初至今查看數據 11 print(df2['股票名稱'].values) 12 print(df2['年初至今'].values) 13 #查看數據得知各股票年初至今的漲幅情況,設置Y軸參數 14 y_data = [3.65,104.72,9.55,37.61,25.06,111.96,18.41,-2.21,50.14,89.51] 15 16 line=( 17 Line() 18 .set_global_opts( 19 tooltip_opts=opts.TooltipOpts(is_show=True), 20 xaxis_opts=opts.AxisOpts(type_="category"), 21 yaxis_opts=opts.AxisOpts( 22 type_="value", 23 axistick_opts=opts.AxisTickOpts(is_show=True), 24 splitline_opts=opts.SplitLineOpts(is_show=True), 25 ), 26 #設置單位標題,並且顯示在左上方 27 title_opts=opts.TitleOpts(title="單位(%)", pos_left="left"), 28 ) 29 #設置x軸 30 .add_xaxis(list(df2['股票名稱'].values)) 31 #設置y軸 32 .add_yaxis( 33 #標題名稱 34 series_name="年初至今漲幅情況折線圖", 35 #賦值數據 36 y_axis=y_data, 37 symbol="emptyCircle", 38 is_symbol_show=True, 39 label_opts=opts.LabelOpts(is_show=True), 40 41 ) 42 ) 43 line.render_notebook()
繪制折線圖,
對比各股票當前的價格
1 from pyecharts import options as opts 2 from pyecharts.charts import Bar 3 import pandas as pd 4 from pyecharts.globals import ThemeType 5 #讀取表 6 data_df = pd.read_csv('data1.csv') 7 df = data_df.dropna() 8 df1 = df[['股票名稱', '當前價']] 9 data_df.sort_values(by='當前價',ascending=False) 10 df2 = df1.iloc[:10] 11 #打印出股票名稱與市值 查看數據是否正確 12 print(df2['股票名稱'].values) 13 print(df2['當前價'].values) 14 #設置data_x數據 15 data_x = ["京東方A", "中銀絨業", "TCL科技",] 16 #設置data_y數據 17 data_y = [6.12, 2.17, 7.65,1.61,5.19,25.88, 11, 2.21, 5.45, 8.85] 18 inner_data_pair = [list(z)for z in zip(data_x, data_y)] 19 20 outer_data_x = ["包鋼股份","中國石油","中遠海控","紫金礦業","二三四五","中國鋁業","數碼視訊"] 21 outer_data_y = [1.61, 5.19, 25.88, 11, 2.21, 5.45, 8.85] 22 outer_data_pair = [list(z) for z in zip(outer_data_x, outer_data_y)] 23 24 c = ( 25 Pie(init_opts=opts.InitOpts(width="1200px", height="800px")) 26 #設置內圈數據 27 .add( 28 series_name="當前價", 29 data_pair= inner_data_pair, 30 radius=[0, "30%"], 31 label_opts=opts.LabelOpts(position="inner"), 32 ) 33 #設置外圈數據 34 .add( 35 series_name="當前價", 36 radius=["40%","55%"], 37 data_pair=outer_data_pair, 38 label_opts=opts.LabelOpts( 39 position="outside", 40 formatter="{a|{a}}\n{hr|}\n {b|{b}: }{c} {per|{d}%} ", 41 background_color="#eee", 42 border_color="#aaa", 43 border_width=1, 44 border_radius=4, 45 46 rich={ 47 "a": {"color": "#999", "LineHeight": 22, "align": "center" }, 48 "abg": { 49 "backgroundColor": "#e3e3e3", 50 "width": "100%", 51 "align": "right", 52 "height": 22, 53 "borderRadius": [4, 4, 0, 0] 54 }, 55 "hr": { 56 "borderColor": "#aaa", 57 "width" :"100%", 58 "borderWidth": 0.5, 59 "height": 0, 60 }, 61 "b": {"fontSize": 16,"LineHeight": 33}, 62 "per": { 63 "color": "#eee", 64 "backgroundColor": "#334455", 65 "padding": [2, 4], 66 "borderRadius": 2, 67 }, 68 }, 69 ), 70 ) 71 .set_global_opts(legend_opts=opts.LegendOpts(pos_left="left", orient="vertical",)) 72 .set_series_opts( 73 tooltip_opts=opts.TooltipOpts( 74 trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)", 75 76 ) 77 78 ) 79 .set_global_opts(title_opts=opts.TitleOpts(title='當前價位餅圖', subtitle='元/股')) 80 ) 81 Pie.render_notebook()
完整代碼如下
1 import requests 2 import csv 3 4 5 6 #打開一個文件並命名 7 file = open('data.csv', mode='a', encoding='utf-8', newline='') 8 #使用DictWriter方法以字典形式寫入 9 csv_write = csv.DictWriter(file, fieldnames=['股票代碼', '股票名稱', '當前價', '漲跌額', '漲跌幅', '年初至今', '成交量', '成交額', '換手率', '市盈率(TTM)', 10 '股息率', '市值']) 11 12 csv_write.writeheader() #寫入一次表頭數據 13 14 15 #原本網頁一頁最多只能顯示90支股票數據,通過查看 結合頁數計算 一共有4432支股票數據 修改url中的size 以達到獲取全部股票數據 16 url = 'https://xueqiu.com/service/v5/stock/screener/quote/list?page=1&size=4432&order=desc&orderby=percent&order_by=percent&market=CN&type=sh_sz&_=1623304455997' 17 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"}#遭遇反爬 加請求參數 18 # 發送網絡請求 19 response = requests.get(url=url, headers=headers) 20 json_data = response.json() 21 22 # 數據篩選 23 data_list = json_data['data']['list'] 24 for data in data_list: #建立for循環 把列表數據遍歷出來 25 # print(data) #解析數據 26 #設置data取鍵值對 27 data1 = data['symbol'] 28 data2 = data['name'] 29 data3 = data['current'] 30 data4 = data['chg'] 31 if data4: 32 if float(data4) > 0: 33 data4 = '+' + str(data4) 34 else: 35 data4 = str(data4) 36 data5 = str(data['percent']) + '%' 37 data6 = str(data['current_year_percent']) + '%' 38 data7 = data['volume'] 39 data8 = data['amount'] 40 data9 = str(data['turnover_rate'])+'%' 41 data10 = data['pe_ttm'] 42 data11 =data['dividend_yield'] 43 if data11: 44 data11 = str(data['dividend_yield'])+'%' 45 else: 46 data11 = None 47 data12 = data['market_capital'] 48 print(data1, data2, data3, data4, data5, data6, data7, data8, data9, data10, data11, data12,) 49 50 #數據保存 51 data_dict = {'股票代碼': data1, '股票名稱': data2, '當前價': data3, '漲跌額': data4, '漲跌幅': data5, '年初至今': data6, 52 '成交量': data7, '成交額':data8, '換手率': data9, '市盈率(TTM)': data10, '股息率': data11, '市值': data12, } 53 csv_write.writerow(data_dict) 54 55 56 57 import pandas as pd 58 import numpy as np 59 #加載csv數據 60 data_df = pd.read_csv('data.csv') 61 #顯示頭文件 62 data_df.head() 63 #判斷數據行中書是否存在缺失值 64 data_df.isnull().any(axis=1) 65 #將缺失值都補為0 66 data_df = data_df.fillna(0) 67 #再次查看數據行中書是否修改成功 68 data_df.isnull().any(axis=1) 69 #再次查看數據行 70 data_df.head() 71 #統計每一列空值的個數: 72 data_df.isnull().any().sum() 73 #讓值從大到小進行排序 74 df = data_df.sort_values(by='成交量',ascending=False) 75 data_df.head(10) 76 #保存處理后的數據 77 import pandas as pd 78 df = df.set_index('股票名稱') 79 df.to_csv("data1.csv",encoding='utf-8') 80 data_df = pd.read_csv("data1.csv") 81 82 from pyecharts import options as opts 83 84 #讀取處理后的數據 85 data_df = pd.read_csv('data1.csv') 86 df = data_df.dropna() 87 df1 = df[['股票名稱', '成交量']] 88 data_df.sort_values(by='成交量',ascending=False) 89 #取前10條股票 90 df2 = df1.iloc[:10] 91 #打印出來顯示檢查結果是否正確 92 print(df2['股票名稱'].values) 93 print(df2['成交量'].values) 94 95 from pyecharts.charts import Bar 96 from pyecharts.globals import ThemeType 97 #設置風格 98 bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.ESSOS)) 99 #x軸數據 100 bar.add_xaxis(list(df2['股票名稱'].values)) 101 #x軸數據 102 bar.add_yaxis("股票成交量情況",list(df2['成交量'].values)) 103 #設置標簽配置項 104 bar.set_series_opts(label_opts=opts.LabelOpts(position="top")) 105 #設置標題 106 bar.set_global_opts(title_opts=opts.TitleOpts(title="成交量圖表")) 107 #直接在notebook顯示圖表 108 bar.render_notebook() 109 110 111 from pyecharts import options as opts 112 from pyecharts.charts import Bar 113 114 #讀取表 115 data_df = pd.read_csv('data1.csv') 116 df = data_df.dropna() 117 df1 = df[['股票名稱', '成交額']] 118 data_df.sort_values(by='成交額',ascending=False) 119 df2 = df1.iloc[:10] 120 print(df2['股票名稱'].values) 121 print(df2['成交額'].values) 122 #設置風格 123 bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK)) 124 #x軸數據 125 bar.add_xaxis(list(df2['股票名稱'].values)) 126 #y軸數據 127 bar.add_yaxis("股票成交額情況",list(df2['成交額'].values)) 128 #設置標簽配置項 129 bar.set_series_opts(label_opts=opts.LabelOpts(position="top")) 130 #設置標題 131 bar.set_global_opts(title_opts=opts.TitleOpts(title="成交額圖表")) 132 #直接在notebook顯示圖表 133 bar.render_notebook() 134 135 from pyecharts import options as opts 136 from pyecharts.charts import Bar 137 import pandas as pd 138 from pyecharts.globals import ThemeType 139 #讀取表 140 data_df = pd.read_csv('data1.csv') 141 df = data_df.dropna() 142 df1 = df[['股票名稱', '市值']] 143 data_df.sort_values(by='市值',ascending=False) 144 df2 = df1.iloc[:10] 145 #打印出股票名稱與市值 查看數據是否正確 146 print(df2['股票名稱'].values) 147 print(df2['市值'].values) 148 149 #設置風格 150 bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC)) 151 #導入Y軸數據 152 y_data = [212966200430,9248273205,107335530969,73391902563,949878874875,317276616395,281115930557,12651913335,92773567583,12646728429] 153 #x軸數據,導入數據 154 bar.add_xaxis(list(df2['股票名稱'].values)) 155 #y軸數據,導入數據 156 bar.add_yaxis("股票市值情況",y_data) 157 #設置數字顯示位置 158 bar.set_series_opts(label_opts=opts.LabelOpts(position="right")) 159 #設置標題 160 bar.set_global_opts(title_opts=opts.TitleOpts(title="市值圖表")) 161 bar.reversal_axis()#翻轉xy軸 162 #直接在notebook顯示圖表 163 bar.render_notebook() 164 165 import pyecharts.options as opts 166 from pyecharts.charts import Line 167 168 169 170 #查看數據得知漲跌幅情況,設置Y軸參數 171 y_data = [3.03,10.15,2,0,5.7,3.4,-0.63,2.31,6.03,3.39] 172 173 line=( 174 Line() 175 .set_global_opts( 176 tooltip_opts=opts.TooltipOpts(is_show=True), 177 xaxis_opts=opts.AxisOpts(type_="category"), 178 yaxis_opts=opts.AxisOpts( 179 type_="value", 180 axistick_opts=opts.AxisTickOpts(is_show=True), 181 splitline_opts=opts.SplitLineOpts(is_show=True), 182 ), 183 title_opts=opts.TitleOpts(title="單位(%)", pos_left="left"), 184 ) 185 .add_xaxis(list(df2['股票名稱'].values)) 186 .add_yaxis( 187 series_name="漲跌幅折線圖", 188 y_axis=y_data, 189 symbol="emptyCircle", 190 is_symbol_show=True, 191 label_opts=opts.LabelOpts(is_show=True), 192 193 ) 194 ) 195 line.render_notebook() 196 197 198 import pyecharts.options as opts 199 from pyecharts.charts import Line 200 201 202 df = data_df.dropna() 203 df1 = df[['股票名稱', '年初至今']] 204 data_df.sort_values(by='年初至今',ascending=False) 205 #取前10條股票 206 df2 = df1.iloc[:10] 207 #打印出股票名稱與年初至今查看數據 208 print(df2['股票名稱'].values) 209 print(df2['年初至今'].values) 210 #查看數據得知各股票年初至今的漲幅情況,設置Y軸參數 211 y_data = [3.65,104.72,9.55,37.61,25.06,111.96,18.41,-2.21,50.14,89.51] 212 213 line=( 214 Line() 215 .set_global_opts( 216 tooltip_opts=opts.TooltipOpts(is_show=True), 217 xaxis_opts=opts.AxisOpts(type_="category"), 218 yaxis_opts=opts.AxisOpts( 219 type_="value", 220 axistick_opts=opts.AxisTickOpts(is_show=True), 221 splitline_opts=opts.SplitLineOpts(is_show=True), 222 ), 223 #設置單位標題,並且顯示在左上方 224 title_opts=opts.TitleOpts(title="單位(%)", pos_left="left"), 225 ) 226 #設置x軸 227 .add_xaxis(list(df2['股票名稱'].values)) 228 #設置y軸 229 .add_yaxis( 230 #標題名稱 231 series_name="年初至今漲幅情況折線圖", 232 #賦值數據 233 y_axis=y_data, 234 symbol="emptyCircle", 235 is_symbol_show=True, 236 label_opts=opts.LabelOpts(is_show=True), 237 238 ) 239 ) 240 line.render_notebook() 241 242 243 244 from pyecharts import Pie 245 from pyecharts import options as opts 246 from pyecharts.charts import Bar 247 import pandas as pd 248 from pyecharts.globals import ThemeType 249 #讀取表 250 data_df = pd.read_csv('data1.csv') 251 df = data_df.dropna() 252 df1 = df[['股票名稱', '當前價']] 253 data_df.sort_values(by='當前價',ascending=False) 254 df2 = df1.iloc[:10] 255 #打印出股票名稱與市值 查看數據是否正確 256 print(df2['股票名稱'].values) 257 print(df2['當前價'].values) 258 #設置data_x數據 259 data_x = ["京東方A", "中銀絨業", "TCL科技",] 260 #設置data_y數據 261 data_y = [6.12, 2.17, 7.65,1.61,5.19,25.88, 11, 2.21, 5.45, 8.85] 262 inner_data_pair = [list(z)for z in zip(data_x, data_y)] 263 264 outer_data_x = ["包鋼股份","中國石油","中遠海控","紫金礦業","二三四五","中國鋁業","數碼視訊"] 265 outer_data_y = [1.61, 5.19, 25.88, 11, 2.21, 5.45, 8.85] 266 outer_data_pair = [list(z) for z in zip(outer_data_x, outer_data_y)] 267 268 c = ( 269 Pie(init_opts=opts.InitOpts(width="1200px", height="800px")) 270 #設置內圈數據 271 .add( 272 series_name="當前價", 273 data_pair= inner_data_pair, 274 radius=[0, "30%"], 275 label_opts=opts.LabelOpts(position="inner"), 276 ) 277 #設置外圈數據 278 .add( 279 series_name="當前價", 280 radius=["40%","55%"], 281 data_pair=outer_data_pair, 282 label_opts=opts.LabelOpts( 283 position="outside", 284 formatter="{a|{a}}\n{hr|}\n {b|{b}: }{c} {per|{d}%} ", 285 background_color="#eee", 286 border_color="#aaa", 287 border_width=1, 288 border_radius=4, 289 290 rich={ 291 "a": {"color": "#999", "LineHeight": 22, "align": "center" }, 292 "abg": { 293 "backgroundColor": "#e3e3e3", 294 "width": "100%", 295 "align": "right", 296 "height": 22, 297 "borderRadius": [4, 4, 0, 0] 298 }, 299 "hr": { 300 "borderColor": "#aaa", 301 "width" :"100%", 302 "borderWidth": 0.5, 303 "height": 0, 304 }, 305 "b": {"fontSize": 16,"LineHeight": 33}, 306 "per": { 307 "color": "#eee", 308 "backgroundColor": "#334455", 309 "padding": [2, 4], 310 "borderRadius": 2, 311 }, 312 }, 313 ), 314 ) 315 .set_global_opts(legend_opts=opts.LegendOpts(pos_left="left", orient="vertical",)) 316 .set_series_opts( 317 tooltip_opts=opts.TooltipOpts( 318 trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)", 319 320 ) 321 322 ) 323 .set_global_opts(title_opts=opts.TitleOpts(title='當前價位餅圖', subtitle='元/股')) 324 ) 325 Pie.render_notebook()
總結:
本次爬取股票不僅包括了對網站的爬取,也包括對所爬取數據的清洗及分析,對我的個人能力是一次巨大的考驗和提升。
技術難點:做圖時導入我所構建的列表有數據不顯示,找不出問題所在原因,只能構建一個data來引用
總體來說大部分難點都集中在pyecharts設置畫圖方面,但這部分原因也是基礎不夠扎實所導致,所以到最后還是沒有達到所預期的目標,
編寫過程還有許多漏洞是自己無法解決處理的的,代碼沒有達到要求,還有顯示圖片的問題,也查不到問題所在
通過這次作業才發現自己原來有這么多不足,知識點不全面,還有很大的提升空間,只有多寫多看多用才能做到真正的掌握,有不懂的地方要及時解決虛心求教。