Travel Tips
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Python数据分析实战——社会财富分配问题模拟三
模型假设:
① 每个人初始基金仍为100元
② 一共玩17000轮
③ 每天拿出一元钱,并且随机分配给另一个人
④ 有10个人加倍努力,从而获得了1%的竞争优势
⑤ 允许借贷
允许借贷意味着可以找亲友、银行、投资人借贷 → 资产为负时,仍然参与游戏
要求:
① 构建模型模拟,再次模拟财富分配情况
② 努力的人,最后是否富有?
③ 绘制柱状图,查看该轮财富情况
** 横轴标签代表一个玩家的编号,柱子的高低变动反映该玩家财富值的变化
** 这里只需要每轮按照财富值排序绘制
** 前100轮,按照每10轮绘制一次柱状图,查看财富变化情况
** 100至1000轮,按照每100轮绘制一次柱状图,查看财富变化情况
** 1000至17000轮,按照每400轮绘制一次柱状图,查看财富变化情况
提示:
① 这里设置的10个人id分别为:[1,11,21,31,41,51,61,71,81,91]
② np.random.choice(person_n, p =[...]) → 这里通过设置p来修改概率:努力的10人概率为0.0101,其他人概率为(0.899/90)
# 这里注意:当某人的财富值降到0元时,他在该轮无需拿出1元钱给别人,但仍然有机会得到别人给出的钱
person_p = [0.899/90 for i in range(100)] for i in [1,11,21,31,41,51,61,71,81,91]: person_p[i-1] = 0.0101 # 设置概率 def game3(data, roundi): round_i = pd.DataFrame({'pre_round':data[roundi-1],'lost':1}) # 设定每轮分配财富之前的情况 choice_i = pd.Series(np.random.choice(person_n,100, p = person_p)) gain_i = pd.DataFrame({'gain':choice_i.value_counts()}) # 这一轮中每个人随机指定给“谁”1元钱,并汇总这一轮每个人的盈利情况 round_i = round_i.join(gain_i) round_i.fillna(0,inplace = True) return round_i['pre_round'] - round_i['lost'] + round_i['gain'] # 合并数据,得到这一轮财富分配的结果 print('finished!')
person_n = [x for x in range(1,101)] fortune = pd.DataFrame([100 for i in range(100)], index = person_n) fortune.index.name = 'id' # 设定初始参数:游戏玩家100人,起始资金100元 starttime = time.time() # 模型开始时间 for round in range(1,17001): fortune[round] = game3(fortune,round) # 进行17000轮随机分配模拟 game3_result = fortune.T # 转置后得到结果数据 → 列为每一个人的id,行为每一轮的财富分配结果 endtime = time.time() # 模型结束时间 print('模型总共用时%i秒' % (endtime - starttime)) # 计算时间 game3_result.tail() # 查看最后5条数据
os.chdir('/home/zty/Documents/python/Python进阶数据分析及可视化/实战/练习08_社会财富分配问题模拟/财富分配模型_努力人生/') plt.figure(figsize = (10,6)) data0 = pd.DataFrame({'money':game3_result.iloc[0],'color':'gray'}) data0['color'].loc[[1,11,21,31,41,51,61,71,81,91]] = 'red' plt.bar(data0.index,data0['money'],color=data0['color'],alpha = 0.8,width = 0.9) plt.grid(color='gray', linestyle='--', linewidth=0.5) plt.ylim((-200,400)) plt.xlim((-10,110)) plt.title('Round %d' % 0) plt.xlabel('PlayerID') plt.ylabel('Fortune') plt.savefig('graph5_round_%d.png' % 0, dpi=200) # 绘制起始图片 def graph5(data,start,end,length): for n in list(range(start,end,length)): datai = pd.DataFrame({'money':data.iloc[n],'color':'gray'}) datai['color'].loc[[1,11,21,31,41,51,61,71,81,91]] = 'red' datai = datai.sort_values(by = 'money').reset_index() plt.figure(figsize = (10,6)) plt.bar(datai.index,datai['money'],color=datai['color'],alpha = 0.8,width = 0.9) plt.grid(color='gray', linestyle='--', linewidth=0.5) plt.ylim((-200,400)) plt.xlim((-10,110)) plt.title('Round %d' % n) plt.xlabel('PlayerID') plt.ylabel('Fortune') plt.savefig('graph5_round_%d.png' % n, dpi=200) # 创建绘图函数2 graph5(game3_result,10,100,10) graph5(game3_result,100,1000,100) graph5(game3_result,1000,17400,400) print('finished!') # 结论 # 社会财富的总体分布形态没有什么变化 # 10位努力玩家中多位都进入了富人top20!
Sed ac lorem felis. Ut in odio lorem. Quisque magna dui, maximus ut commodo sed, vestibulum ac nibh. Aenean a tortor in sem tempus auctor
December 4, 2020 at 3:12 pm
Sed ac lorem felis. Ut in odio lorem. Quisque magna dui, maximus ut commodo sed, vestibulum ac nibh. Aenean a tortor in sem tempus auctor
December 4, 2020 at 3:12 pm
Donec in ullamcorper quam. Aenean vel nibh eu magna gravida fermentum. Praesent eget nisi pulvinar, sollicitudin eros vitae, tristique odio.
December 4, 2020 at 3:12 pm
我是 s enim interduante quis metus. Duis porta ornare nulla ut bibendum
Rosie
6 minutes ago