花唄數據挖掘-破產情況分析
阿新 • • 發佈:2019-04-12
序列 可能 matplot sim highlight 範圍 標準差 折線圖 生活
我也是剛開始學習數據分析,所以直方圖、柱形圖、折線圖這些也是挺蒙圈的,看視頻學學這個花唄模型還不錯
import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.style as psl #繪圖風格 # % matplotlib inline #魔法函數,在其他IDE中可能是必須的 psl.use(‘seaborn-bright‘) from pylab import mpl mpl.rcParams[‘font.sans-serif‘] = [‘SimHei‘] # 指定默認字體:解決plot不能顯示中文問題 #構建稅率計算函數 def tax(salary): if salary<=3500: tax=0 elif salary<=(3500+1500): tax=(salary-3500)*0.03 elif salary<=(3500+1500+3000): tax=1500*0.03+(salary-3500-1000)*0.1 elif salary<=(3500+1000+3000+4500): tax=1500*0.3+3000*0.1+(salary-3500-1000-3000)*0.2 elif salary<=(3500+1000+3000+4500+26000): tax=1500*0.03+3000*0.1+4500*0.2+(salary-3500-1000-3000-4500)*0.25 elif salary<=(3500+1000+3000+4500+26000+20000): tax=1500*0.03+3000*0.1+4500*0.2+26000*0.25+(salary-3500-1000-3000-4500-26000)*0.3 elif salary<=(3500+1000+3000+4500+26000+20000+25000): tax=1500*0.03+3000*0.1+4500*0.2+26000*0.2+20000*0.25+(salary-3500-1000-3000-4500-26000-25000)*0.35 else: tax=1500*0.03+3000*0.1+4500*0.2+26000*0.2+20000*0.25+25000*0.3+(salary-3500-1000-3000-4500-26000-25000)*0.45 return tax #構建五險一金函數 def insurance(salary): if salary<21396: return salary*0.175 else: return 3744.58 #構建獎金隨機函數 def bonus(bonus_avg): #Series是一種類似於一維數組的對象,這裏生成Series對象 return pd.Series(np.random.normal(loc=bonus_avg,scale=200,size=120)) #隨機生成120個以平均工資為bonus_avg為正態分布的數,200為標準差,決定瘦胖,loc為均值 # psl.use(‘seaborn-bright‘) #使用何種樣式 # print(bonus(1500)) # plt.title(‘直方圖‘) # plt.hist(bonus(1500),bins=30) #bins是一個整數,它定義了x寬度範圍內的等寬面元數量,如果bin是序列,它定義了允許非均勻bin寬度的bin邊緣 # plt.show() #構建月凈收入函數 #凈收入=月薪+獎金-五險一金-個人所得稅 def final_income(month,bonus_avg): df=pd.DataFrame({ ‘月薪‘:[month for i in range(120)], ‘獎金‘:bonus(bonus_avg), ‘五險一金‘:[insurance(month) for j in range(120)], ‘個人所得稅‘:[tax(month) for k in range(120)], }) df[‘月凈收入‘]=df[‘月薪‘]+df[‘獎金‘]-df[‘五險一金‘]-df[‘個人所得稅‘] return df # result=final_income(4500,1000) # print(result.head()) # result[‘月凈收入‘].iloc[:12].plot(kind=‘bar‘,figsize=(12,4)) # plt.title(‘前12個月凈收入‘) # plt.show() #每月支出=基本生活支出+購物支出+娛樂支出+學習支出+其他支出 def expense(): df=pd.DataFrame({ ‘基本生活支出‘:pd.Series(np.random.randint(3000,3500,size=120)),#生成在3000-3500範圍內的數值 ‘購物支出‘:pd.Series(np.random.normal(loc=5000,scale=500,size=120)), ‘娛樂支出‘:pd.Series(np.random.randint(400,1200,size=120)),#生成在400-1200範圍內的數值 ‘學習支出‘:pd.Series(np.random.randint(100,500,size=120)), ‘其他支出‘:pd.Series(np.random.normal(loc=500,scale=40,size=120)), }) df[‘月總支出‘]=df[‘基本生活支出‘]+df[‘購物支出‘]+df[‘娛樂支出‘]+df[‘學習支出‘]+df[‘其他支出‘] return df # result=expense() # result[[‘基本生活支出‘,‘購物支出‘,‘娛樂支出‘,‘學習支出‘,‘其他支出‘]].iloc[:12].plot.bar(figsize=(12,4),colormap=‘Reds_r‘,stacked=True) #柱形圖長度為月總支出,因為是前幾個的長度相加所得! # plt.show() #花唄還款情況分析 #第一回合:不使用分期 def case_a(): income=final_income(10000,1500)[‘月凈收入‘].tolist() expen=expense()[‘月總支出‘].tolist() saving=[0 for i in range(120)] #月初余額 debt=[0 for j in range(120)] #本月需還花唄 data=[] #存儲本月信息 for i in range(120): money=income[i]+saving[i]-expen[i]-debt[i] #本月剩下的錢 if (-money)>15000: print(‘第%i個月破產了!!!‘%i) break else: if money>=0: #說明有余額,存的了錢 saving[i+1]=money debt[i+1]=0 #負債為0 else: #說明需要用花唄借錢 saving[i+1]=0 debt[i+1]=(-money) #需要用花唄借的錢 data.append([income[i],expen[i],debt[i],saving[i+1],debt[i+1]]) #本月收入,支出,本月余額,本月欠款 resule_a=pd.DataFrame(data,columns=[‘月收入‘,‘月支出‘,‘本月需還花唄‘,‘本月余額‘,‘本月欠款‘]) resule_a.index.name=‘月份‘ return resule_a #第二回合:花唄分期 def case_b(n): income=final_income(10000,1500)[‘月凈收入‘].tolist() expen=expense()[‘月總支出‘].tolist() saving=[0 for i in range(120)] #月初余額 debt=[0 for j in range(120)] #本月需還花唄 data=[] #存儲本月信息 for i in range(120): money=income[i]+saving[i]-expen[i]-debt[i] #本月剩下的錢 if (-money)>15000: print(‘第%i個月破產了!!!‘%i) break else: if money>=0: #說明有余額,存的了錢 saving[i+1]=money debt[i+1]=0 #負債為0 else: #說明需要用花唄借錢 if n==3: money_pre=(abs(money)*(1+0.025))/3 #下個月要還的花唄 debt[i+1]=debt[i+1]+money_pre #假設分期3個月 debt[i+2]=debt[i+2]+money_pre debt[i+3]=debt[i+3]+money_pre elif n==6: money_pre = (abs(money) * (1 + 0.045)) / 6 # 下個月要還的花唄 debt[i + 1] = debt[i + 1] + money_pre # 假設分期6個月 debt[i + 2] = debt[i + 2] + money_pre debt[i + 3] = debt[i + 3] + money_pre debt[i + 4] = debt[i + 4] + money_pre debt[i + 5] = debt[i + 5] + money_pre debt[i + 6] = debt[i + 6] + money_pre elif n==9: money_pre = (abs(money) * (1 + 0.065)) / 9 # 下個月要還的花唄 debt[i + 1] = debt[i + 1] + money_pre # 假設分期9個月 debt[i + 2] = debt[i + 2] + money_pre debt[i + 3] = debt[i + 3] + money_pre debt[i + 4] = debt[i + 4] + money_pre debt[i + 5] = debt[i + 5] + money_pre debt[i + 6] = debt[i + 6] + money_pre debt[i + 7] = debt[i + 7] + money_pre debt[i + 8] = debt[i + 8] + money_pre debt[i + 9] = debt[i + 9] + money_pre else: money_pre = (abs(money) * (1 + 0.088)) / 12 # 下個月要還的花唄 debt[i + 1] = debt[i + 1] + money_pre # 假設分期12個月 debt[i + 2] = debt[i + 2] + money_pre debt[i + 3] = debt[i + 3] + money_pre debt[i + 4] = debt[i + 4] + money_pre debt[i + 5] = debt[i + 5] + money_pre debt[i + 6] = debt[i + 6] + money_pre debt[i + 7] = debt[i + 7] + money_pre debt[i + 8] = debt[i + 8] + money_pre debt[i + 9] = debt[i + 9] + money_pre debt[i + 10] = debt[i + 10] + money_pre debt[i + 11] = debt[i + 11] + money_pre debt[i + 12] = debt[i + 12] + money_pre saving[i + 1] = 0 data.append([income[i],expen[i],debt[i],saving[i+1],debt[i+1]]) #本月收入,支出,本月余額,本月欠款 resule_a=pd.DataFrame(data,columns=[‘月收入‘,‘月支出‘,‘本月需還花唄‘,‘本月余額‘,‘本月欠款‘]) resule_a.index.name=‘月份‘ return resule_a #一萬次模擬 def similar(): month=[] for p in range(10000): month.append(case_b(12).index.max()+1) #添加最大索引再加一,也就是破產月份 month=pd.DataFrame(month,columns=[‘月份‘]) month.plot.hist(figsize=(12,4)) plt.show() #使用花唄情況比較 r1=case_a()[‘本月欠款‘] r2=case_b(3)[‘本月欠款‘] r3=case_b(6)[‘本月欠款‘] r4=case_b(9)[‘本月欠款‘] r5=case_b(12)[‘本月欠款‘] result_b=pd.DataFrame({‘不分期‘:r1,‘分期3月‘:r2,‘分期6月‘:r3,‘分期9月‘:r4,‘分期12月‘:r5}, columns=[‘不分期‘,‘分期3月‘,‘分期6月‘,‘分期9月‘,‘分期12月‘]) #生成折線圖 result_b.plot.line(alpha=0.8,style=‘--‘,colormap=‘Accent‘,figsize=(12,4),use_index=True,legend=True) plt.title(‘不同情況下的破產情況‘) plt.show()
花唄數據挖掘-破產情況分析