image.png
收支情况模拟构建思路:
1、构建税收函数
2、构建专项扣除函数
3、构建社保函数
4、构建奖金函数
5、构建10年(即120个月)的专项扣除后和社保扣除后的税收函数
6、构建支出函数
7、构建花呗使用情况模型
8、每次取不同的随机数进行模拟
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings
1、构建税收函数
def tax(x):
if x<=5000:
return 0
elif x<=(5000+3000):
return (x-5000)*0.03
elif x<=(5000+3000+4000):
return 3000*0.03+(x-5000-3000)*0.1
elif x<=(5000+3000+4000+13000):
return 3000*0.03+4000*0.1+(x-5000-3000-4000)*0.2
elif x<=(5000+3000+4000+13000+10000):
return 3000*0.03+4000*0.1+13000*0.2+(x-5000-3000-4000-13000)*0.25
elif x<=(5000+3000+4000+13000+10000+20000):
return 3000*0.03+4000*0.1+13000*0.2+10000*0.25+(x-5000-3000-4000-13000-10000)*0.3
elif x<=(5000+3000+4000+13000+10000+20000+25000):
return 3000*0.03+4000*0.1+13000*0.2+10000*0.25+20000*0.3+(x-5000-3000-4000-13000-10000-20000)*0.35
elif x<=(5000+3000+4000+13000+10000+20000+25000+100000):
return (x-5000)*0.45
2、构建专项扣除函数
ched:子女教育,每个子女按1000元/月扣除,ched_mount:子女教育数量
mortgage:首套房贷利息,按1000元/月扣除,=1则为有,=0则为没有
rent:住房租金,按1500元/月扣除,=1则为有,=0则为没有
support:赡养老人,独生子女按2000元/月,非独生子女每人1000元/月扣除
only:是否独生,独生=2,非独生=1
def deduction(ched,ched_mount,mortgage,rent,support,only):
if mortgage==1:
return 1000*ched_mount+1000+support*1000*only
else:
return 1000*ched_mount+rent*1500+support*1000*only
3、构建社保函数
def insurance(s):#s为缴费基数
insurance_i=pd.DataFrame({
'养老保险':s*0.08,
'医疗保险':s*0.02,
'失业保险':s*0.01
},index = [0])
insurance_i['社保扣除']=insurance_i['养老保险']+insurance_i['医疗保险']+insurance_i['失业保险']
return int(insurance_i['社保扣除'])
4、构建奖金函数
def bouns(a):
return pd.Series(np.random.normal(loc=a,scale=200,size=120))
5、构建120个月的专项扣除后和社保扣除后的税收函数
def final_tax(s,s1,a,ched,ched_mount,mortgage,rent,support,only):
df_i=pd.DataFrame({
'月薪':[s for i in range(120)],
'专项扣除':[deduction(ched,ched_mount,mortgage,rent,support,only) for i in range(120)],
'社保扣除':[insurance(s1) for i in range(120)],
'奖金':bouns(a)
})
df_i['计税部分']=df_i['月薪']+df_i['奖金']
df_i['税收']=df_i['计税部分'].apply(lambda x:tax(x))
df_i['净收入']=df_i['月薪']+df_i['奖金']-df_i['税收']-df_i['社保扣除']
return df_i
出图:前12个月收入柱状图
plt.title('前12个月收入柱状图')
df2['净收入'].iloc[:12].plot(kind='Bar',stacked=True,alpha=0.6,color='Red')
plt.grid()
plt.figure(figsize=(12,4))
image.png
6、构建支出函数
假设总支出共分为五部分:房租水电(在3000左右,上下浮动200),家用(2000),基本生活支出(3000左右,上下浮动500),交际交通(2500左右,上下浮动800),日用品化妆品(2000左右,上下浮动500)
def expense():
df_2=pd.DataFrame({
'房租水电':np.random.normal(loc=3000,scale=200,size=120),
'家用':[2000 for i in range (120)],
'基本支出':np.random.normal(loc=3000,scale=500,size=120),
'交通交际':np.random.normal(loc=2500,scale=800,size=120),
'日用支出':np.random.normal(loc=2000,scale=500,size=120)
})
df_2['总支出']=df_2['房租水电']+df_2['家用']+df_2['基本支出']+df_2['交通交际']+df_2['日用支出']
return df_2
出图:前12个月支出直方图
result[['房租水电','家用','基本支出','交通交际','日用支出']].iloc[:12].plot(kind='Bar',figsize=(8,6),
stacked=True,colormap='Reds_r',alpha=0.6)
plt.title('前12个月支出直方图')
plt.grid()
image.png
7、构建花呗使用情况模型,假设不使用分期
#制作样本数据(收入、支出、盈余、负债)
income=df2['净收入'].tolist()
exp=expense()['总支出'].tolist()
saving=[0 for i in range(120)]
debt=[0 for i in range(120)]
#构建收支模型
def case():
month=[]#存放月份
data=[]#存放收支数据
for i in range(119):
money=income[i]+saving[i]-exp[i]-debt[i]
if money<-10000:
print('第%i个月花呗也救不了我了,我要吃土了!!!'%i)
else:
if money>0:
saving[i+1]=income[i]+saving[i]-exp[i]-debt[i]
debt[i+1]=0
else:
saving[i+1]=0
debt[i+1]=-(income[i]+saving[i]-exp[i]-debt[i])
month.append(i+1)
data.append([income[i],exp[i],saving[i+1],debt[i+1]])
result=pd.DataFrame(data,columns=['月收入','月支出','盈余','负债'],index=month)
return result
出图:前12个月收支盈亏情况
case().iloc[:12].plot(kind='Bar',figsize=(7,5),stacked=True,colormap='Reds',alpha=0.6)
plt.title('前12个月收支盈亏情况')
plt.grid()
image.png
8、每次取不同的支出随机数进行模拟并出图
case_a=[]
for i in range(10):
print('正在进行第%i次模拟'%i)
income=df2['净收入'].tolist()
exp=expense()['总支出'].tolist()
saving=[0 for i in range(120)]
debt=[0 for i in range(120)]
result_a=case()
case_a.append(result_a)
result_a.iloc[:12].plot(kind='Bar',figsize=(10,8),stacked=True,colormap='Reds',alpha=0.6)
plt.title('第%i次模拟,前12个月收支盈亏情况'%i)
plt.grid()
以上即为此次模拟全过程,快来预测看看吧~