1. 程式人生 > >花唄數據挖掘-破產情況分析

花唄數據挖掘-破產情況分析

序列 可能 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()

  

花唄數據挖掘-破產情況分析