快來看看招商銀行理財產品數據(代碼及分析)

往期經典回顧

盤膝而坐--跟你聊聊APP市場的數據分析

【乾貨】手把手帶你抓「網上購物」類APP信息(含代碼)

快來圍觀2W+的豆瓣電影分類排行榜(含代碼)

使用Python探索二手車市場(含代碼)

什麼?你了解二手車市場?(含爬蟲代碼)

前言

近段時間經常收到招商銀行關於理財相關的簡訊,看來我已成了招行的目標客戶(雖然我還很窮~)。窮歸窮,看看還是不花錢的,於是前往招行的理財產品網站看看,嚯!足足上千種理財產品,讓我迸發了了解數據的衝動。於是乎,按照分析師的習慣,先從網站抓取數據,然後基於獲得的數據作一個探究

數據爬蟲

當你來到對方的理財產品網站,你會發現網頁中的數據並沒有直接的存儲在網頁源代碼中,因為當我不停的下拉,並點擊下一頁時,其鏈接並沒有發生變化。OK,那這樣看來,數據一定是作了非同步存儲,接下來找到這個非同步存儲數據的鏈接才是最關鍵的。下面,把尋找目標鏈接的方法作一一說明:

1、使用Chrome瀏覽器,打開鏈接:cmbchina.com/cfweb/pers

2、按F12鍵,選擇「Network」選項,並點擊網頁中的下一頁

3、在「XHR」中你會出現一個文件,去點擊它

4、選擇「Preview」預覽,發現數據

5、雙擊「XHR」中的文件,得到數據鏈接

接下來要做的就是,發現鏈接中的規律,調整鏈接中對應的「pageindex」,得到不同頁下的數據,具體爬蟲代碼如下:

# ===== Python3 =====# 導入第三方包import requestsimport reimport timeimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport matplotlib.mlab as mlab# 設置請求頭headers = {Accept:*/*,Accept-Encoding:gzip, deflate,Accept-Language:zh-CN,zh;q=0.9,Connection:keep-alive,User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36 }# 拼接URL,用於翻頁爬蟲url_phase1 = http://www.cmbchina.com/cfweb/svrajax/product.ashx?op=search&type=m&pageindex=url_phase2 = &salestatus=&baoben=&currency=&term=&keyword=&series=01&risk=&city=&date=&pagesize=40&orderby=ord1&t=0.8683289736280901urls = []for i in range(1,29): urls.append(url_phase1+str(i)+url_phase2)# 構造空列表,用於後面的數據存儲Finacing = []# 通過for循環完成URL的遍歷for url in urls: # 獲取源代碼 res = requests.get(url, headers = headers).text # 正則表達式完成信息的獲取 ProdCode = re.findall(PrdCode:"(.*?)",,text) ProdName = re.findall(PrdName:"(.*?)",,text) TypeCode = re.findall(TypeCode:"(.*?)",,text) AreaCode = re.findall(AreaCode:"(.*?)",,text) BeginDate = re.findall(BeginDate:"(.*?)",,text) EndDate = re.findall(EndDate:"(.*?)",,text) ExpireDate = re.findall(ExpireDate:"(.*?)",,text) Status = re.findall(Status:"(.*?)",,text) NetValue = re.findall(NetValue:"(.*?)",,text) IsNewFlag = re.findall(IsNewFlag:"(.*?)",,text) NetValue = re.findall(NetValue:"(.*?)",,text) Term = re.findall(Term:"(.*?)",,text) Style = re.findall(Style:"(.*?)",,text) InitMoney = re.findall(InitMoney:"(.*?)",,text) IncresingMoney = re.findall(IncresingMoney:"(.*?)",,text) Risk = re.findall(Risk:"(.*?)",,text) FinDate = re.findall(FinDate:"(.*?)",,text) SaleChannel = re.findall(SaleChannel:"(.*?)",,text) SaleChannelName = re.findall(SaleChannelName:"(.*?)",,text) IsCanBuy = re.findall(IsCanBuy:"(.*?)"},text) # 數據存儲到字典中 Finacing.append({ProdCode:ProdCode,ProdName:ProdName,TypeCode:TypeCode,AreaCode:AreaCode, BeginDate:BeginDate,EndDate:EndDate,ExpireDate:ExpireDate,Status:Status, NetValue:NetValue,IsNewFlag:IsNewFlag,NetValue:NetValue,Term:Term, Style:Style,InitMoney:InitMoney,IncresingMoney:IncresingMoney,Risk:Risk, FinDate:FinDate,SaleChannel:SaleChannel,SaleChannelName:SaleChannelName,IsCanBuy:IsCanBuy}) # 睡眠3秒 time.sleep(3) # 將數據轉換為數據框CMB_Finance = pd.concat([pd.DataFrame(data) for data in Finacing]) # 數據導出CMB_Finance.to_excel(CMB_Finance.xlsx, index = False)

很快就可以把招商銀行網站中的1000多種理財產品全部獲取回來。接下來要做的就是數據的探索性分析,了解數據的特徵和分布。

探索性分析

如果你沒有完成上面的爬蟲也沒有關係,本文後面提供了數據集下載的鏈接,你可以通過讀取的方式進行這部分的探索性分析。

數據類型轉換

# 讀取數據cmb = pd.read_excel(CMB_Finance.xlsx)# 查看數據集的行列數cmb.shape# 查看數據前幾行cmb.head()# 查看數據集的數據類型cmb.dtypes

從爬下來的數據表來看,除了InitMoney(最低投資額)、IncresingMoney(投資增加額)和TypeCode(產品類型編碼)是數值型的,其他都是字元串型。這裡,我們是可以把FinDate(期限)和NetValue(收益率)欄位轉換為數值型的。

# 數據類型轉換# 將FinDate(期限)欄位轉換為數值型cmb.FinDate = cmb.FinDate.str[:-1].astype(int)# 將NetValue(收益率)欄位轉換為數值型cmb.NetValue = cmb.NetValue.str[:-1].astype(float)/100

收益率最高和最低的3種產品

對於大部分理財用戶來說,都會非常關心理財產品的收益率,雖然都知道高風險高收益,但還是會權衡收益率最高的產品和最低的產品。接下來,我們藉助於條形圖來展示收益率:

# 預期收益率最高的3個產品NetValue_sort_desc = cmb[[ProdCode, NetValue]].sort_values(by = NetValue, ascending=False)NetValue_duplicate_top = NetValue_sort_desc.drop_duplicates(subset = NetValue).head(3)# 預期收益率最低的3個產品NetValue_sort_asc = cmb[[ProdCode, NetValue]].sort_values(by = NetValue, ascending=True)NetValue_duplicate_last = NetValue_sort_asc.drop_duplicates(subset = NetValue).head(3)# 中文和負號的正常顯示plt.rcParams[font.sans-serif] = [Microsoft YaHei]plt.rcParams[axes.unicode_minus] = False# 設置圖形的顯示風格plt.style.use(ggplot)# 為了讓多張子圖在一張圖中完成,設置子圖的位置ax1 = plt.subplot2grid((2,1),(0,0))ax2 = plt.subplot2grid((2,1),(1,0))# 繪製條形圖ax1.bar(range(3), NetValue_duplicate_top.NetValue, align = center, color = steelblue, alpha = 0.7)# y軸範圍ax1.set_ylim(0.045,0.051)# x軸刻度標籤ax1.set_xticks(np.arange(3)) ax1.set_xticklabels(NetValue_duplicate_top.ProdCode)# x軸標籤ax1.set_xlabel(產品編號)# y軸刻度標籤ax1.set_yticks(np.arange(0.045,0.051,0.001))ax1.set_yticklabels([str(i*100) + % for i in np.arange(0.045,0.051,0.001)])# y軸標籤ax1.set_ylabel(預期收益率)# 標題ax1.set_title(預期收益率最高的5類產品)ax2.bar(range(3), NetValue_duplicate_last.NetValue, align = center,color = steelblue, alpha = 0.7)ax2.set_ylim(0.045,0.048)ax2.set_xticks(np.arange(3)) ax2.set_xticklabels(NetValue_duplicate_last.ProdCode)# x軸標籤ax2.set_xlabel(產品編號)# y軸刻度標籤ax2.set_yticks(np.arange(0.045,0.048,0.001)) ax2.set_yticklabels([str(i*100) + % for i in np.arange(0.045,0.048,0.001)])# y軸標籤ax2.set_ylabel(預期收益率)ax2.set_title(預期收益率最低的5類產品)# 調整子圖之間的高度間距plt.subplots_adjust(hspace=0.5)# 去除圖形頂部邊界和右邊界的刻度plt.tick_params(top=off, right=off)# 圖形顯示plt.show()

圖中顯示,最高的收益率可以達到5%,最低的收益率為4.6%(肯定都比存銀行的收益率都高吧~)。

理財產品風險類型分布

從表中我們得知,這1000多種產品分為三種風險類型,分別是謹慎性、穩健性和平穩性,他們之間的比例如何呢?我們通過餅圖來呈現這個比例:

# 先對各風險類型的樣本量作統計stats = cmb.Risk.value_counts()plt.axes(aspect=equal)# 控制x軸和y軸的範圍plt.xlim(0,4)plt.ylim(0,4)explode = [0,0,0.1,] colors=[#9999ff,#ff9999,#7777aa] # 自定義顏色# 繪製餅圖plt.pie(x = stats.values, # 繪圖數據 explode=explode, # 突出顯示謹慎性產品 labels=stats.index, # 添加教育水平標籤 colors=colors, # 設置餅圖的自定義填充色 autopct=%.1f%%, # 設置百分比的格式,這裡保留一位小數 pctdistance=0.8, # 設置百分比標籤與圓心的距離 labeldistance = 1.15, startangle = 180, # 設置餅圖的初始角度 radius = 1.5, # 設置餅圖的半徑 counterclock = False, # 是否逆時針,這裡設置為順時針方向 wedgeprops = {linewidth: 1.5, edgecolor:green},# 設置餅圖內外邊界的屬性值 textprops = {fontsize:12, color:k}, # 設置文本標籤的屬性值 center = (1.8,1.8), # 設置餅圖的原點 frame = 1 )# 是否顯示餅圖的圖框,這裡設置顯示# 刪除x軸和y軸的刻度plt.xticks(())plt.yticks(())# 添加圖標題plt.title(理財產品風險類型分布)# 顯示圖形plt.show()

上圖顯示,謹慎性的產品是最少的,只有10%。這個也比較容易理解,畢竟銀行也是想從更多的風險投資人那邊獲得更多的利益,而謹慎性的產品(收益率不會高,並且是浮動收益)應該是用來起吆喝,吸流量的作用(畢竟大部分人還是停留在保值的心理階段)。

理財產品期限的描述性統計

接下來我們來了解一下,這些理財產品的期限FinDate,上面已經將該變數轉換為數值型了,首先對改變了作一下描述性統計

# 理財產品期限的描述性統計cmb.FinDate.describe()

我們發現,這些理財產品的平均期限為半年(180天),而且四分之三的產品也是在180天以內。我想這應該是招商銀行做過統計,例如,什麼樣的理財產品好賣,這些產品在消費者手中的持有時間都是多少天等。同時,我們也可以針對這個期限作一個直方圖,來看看時間上的分布特徵:

# 理財產品期限的直方圖plt.hist(cmb.FinDate, # 繪圖數據 bins = np.arange(cmb.FinDate.min(),cmb.FinDate.max(),30), # 指定直方圖的組距 normed = True, # 設置為頻率直方圖 color = steelblue, # 指定填充色 edgecolor = k) # 指定直方圖的邊界色# 設置坐標軸標籤和標題plt.title(理財產品期限直方圖)plt.xlabel(期限(天數))plt.ylabel(頻率)# 生成正態曲線的數據x1 = np.linspace(cmb.FinDate.min(), cmb.FinDate.max(), 1000)normal = mlab.normpdf(x1, cmb.FinDate.mean(), cmb.FinDate.std())# 繪製正態分布曲線line1, = plt.plot(x1,normal,r-, linewidth = 2) # 生成核密度曲線的數據kde = mlab.GaussianKDE(cmb.FinDate)x2 = np.linspace(cmb.FinDate.min(), cmb.FinDate.max(), 1000)# 繪製line2, = plt.plot(x2,kde(x2),g-, linewidth = 2)# 去除圖形頂部邊界和右邊界的刻度plt.tick_params(top=off, right=off)# 顯示圖例plt.legend([line1, line2],[正態分布曲線,核密度曲線],loc=best)# 顯示圖形plt.show()

不錯所料,期限呈現嚴重的右偏特徵,這也是絕大多數經濟活動的共性,如消費頻次越多的人肯定越少;花費金額越多的人也肯定越少。

基於風險類型的期限分布

我們可以進一步細化,看看不同類型風險的產品,是不是產品期限存在明顯的差異,這裡我們就藉助於箱線圖做一個比較:

# 如果將其劃分到不同的Risk(風險類型)中,期限的分布是否存在差異FinDate = []Risks = cmb.Risk.unique()Risks.sort()for Risk in Risks: FinDate.append(cmb.loc[cmb.Risk==Risk,FinDate])# 繪圖plt.boxplot(x = FinDate, patch_artist=True, labels = Risks, # 添加具體的標籤名稱 showmeans=True, boxprops = {color:black,facecolor:#9999ff}, flierprops = {marker:o,markerfacecolor:red,color:black}, meanprops = {marker:D,markerfacecolor:indianred}, medianprops = {linestyle:--,color:orange})# 設置坐標軸標籤和標題plt.title(不同風險類型下的產品期限差異盒形圖圖)plt.xlabel(風險類型)plt.ylabel(期限)# 去除圖形頂部邊界和右邊界的刻度plt.tick_params(top=off, right=off)# 顯示圖形plt.show()

圖中顯示,不同風險類型的理財產品確實在期限上存在差異,對於平衡性的產品,平均期限在500天左右,而穩健性和謹慎性的平均期限只有110天和170天。

結語

OK,今天關於數據爬蟲和數據的探索性分析就分享到這裡,希望感興趣的朋友能夠照著做一遍,相信對你一定有幫助。如果你有任何問題,歡迎在公眾號的留言區域表達你的疑問。同時,也歡迎各位朋友繼續轉發與分享文中的內容,讓更多的人學習和進步。

關注「每天進步一點點2015」,與小編同進步!

  • 文內代碼及數據

鏈接: pan.baidu.com/s/1mi1hUt 密碼: ya9v

推薦閱讀:

誰才是鬥魚一哥?(用Python抓取鬥魚直播間信息)
新浪微博採集-大神教你5分鐘配置一個微博爬蟲
數據分析案例:51job網站職位信息探索
python爬蟲之scrapy掃盲:搜集美圖信息之多層掃描(2)
DAY25:10行代碼搞定簡單python爬蟲核心

TAG:Python | 爬蟲 | 理財產品 |