为让学校统计学社的同学了解python在数据处理方面的功能,将手游模拟城市的工厂生产进行建模,让同学在建模与处理非结构数据的过程中学习和了解python。将准备的内容放在此让更多需要的人特别是统计人(准备时是按照统计学生的平时会遇到的问题准备的)学习。

首先是模拟城市这款手游

它的一个非常令人头秃之处是等级高时非常缺金币,而要在游戏内获取基本只能通过生产商品并出售。我们要做的是分析可以生产的商品,计算生产每种商品增加值以及结合各生产部门生产能力寻找出单位时间内能生产出价值最高的产品组合。

一、基本分析

我们所有的讨论都是基于这个游戏等级为10级的情况。十级时共有5个生产部门,包括工厂(生产原材料如:铁、木、塑料等)、材料厂、工具厂、家具厂、农贸厂。每个部门生产的产品都需要耗费时间都有一定的价格,除了工厂生产的原材料其他部门生产的产品都需要原料合成,于是,我们可以得到这些部门生产产品的基本信息(在实际经济的核算中我们也会得到各种不同形式的原始数据,一下面的表格为例进行分析)。

工厂:生产铁、木头、塑料、和种子

材料厂:生产木板和钉子,他们分别消耗两个木头和两个铁

材料厂:生产榔头、卷尺和铲子

家具厂:生产椅子,需耗费两个木头、一个榔头和一个钉子

农贸厂:生产果蔬需耗费两个种子

数据很少很简单,但处理这种广义表结构的数据值得我们练习

二、计算所有产品增加值

#导入pandas和numpy包,这两个包是数据处理最常用的包

import pandas as pd

import numpy as np

#构建字典来存储不同部门生产的不同商品每个商品都含有三个属性:价格、耗费时间、组成成分

'''rooms={'instrum':{'hammer':{'price':450,'time':1,'compon':['Fe','wood']}},

'materl':{'nail':{'price':400,'time':2,'compon':['Fe','Fe']}},

'elem':{'Fe':{'price':50,'time':3,'compon':[]},'wood':{'price':1,'time':1,'compon':[]},'seed':

{'price':1,'time':1,'compon':[]}}}

我们需要把excel中的数据转化成这种字典

'''

#每个部门的数据被存储在excel的一个sheet中,read_excel的sheet参数取None得到一个panel其键为sheet名。

data=pd.read_excel('result.xls',None)

rooms={}

for sheet in data.keys():

print(sheet)

df=pd.read_excel('result.xls',sheet,index_col =0)

tools={}

for name in df.columns:

labels={}

for idx in df.index:

if idx=='compon':

try:

labels[idx]=df[name][idx].split(',')

print(labels[idx])

except:

labels[idx]=['nan']

else:

labels[idx]=df[name][idx]

tools[name]=labels

rooms[sheet]=tools

#为方面我们后面使用,创建一个字典存放产品是属于哪个部门的

fromdic={}

for i in rooms:

for j in rooms[i]:

fromdic[str(j)]=i

#计算各产品增加值,得到一个以产品名为主码属性包含增加值的表

df={}

time,price,add,name=[],[],[],[]

room1,room2,room3,room4,room5=[],[],[],[],[]

for room in rooms:

for tools in rooms[room]:

toolsdic=rooms[room][tools]

for i in rooms:

occdic[i] = 0

time.append(rooms[room][tools]['time'])

price.append(rooms[room][tools]['price'])

sump=[]

occdic[fromdic[tools]] = rooms[room][tools]['time']

if tools not in rooms['factory']:

add.append(rooms[room][tools]['price']-np.sum([rooms[fromdic[i]][i]['price'] for i in rooms[room][tools]['compon']]))

for comp in rooms[room][tools]['compon']:

occdic[fromdic[comp]] += rooms[fromdic[comp]][comp]['time']

if comp in rooms['factory']:

pass

else:

for i in rooms[fromdic[comp]][comp]['compon']:

occdic[fromdic[i]] += rooms[fromdic[i]][i]['time']

else:

add.append(rooms[room][tools]['price']-0)

name.append(str(tools))

df['time']=time

df['price']=price

df['addition'] = add

df['name']=name

三、计算生产每种商品的收益和成本(cost)

我们的目的是找出单位时间内赚金币最快的生产组合,可以思考一下当我们生产椅子时耗费了什么。首先需要占据椅子店一定的时间,然后要耗费一个锤子、一个钉子和两个木头,每生产一个椅子我们其实必须生产一个锤子、一个钉子和两个木头。

所以我们可以把椅子分解为一个抽象的家具A加它的组成产品(家具A没有组成材料且价格为椅子增加值,生产家具A要且只要耗费家具厂生产一个椅子的时间),那么我们生产的椅子其实是一个产品集合即{锤子,钉子,2*木头,家具A}。我们生产锤子和钉子又分别耗费工具店的一定时间、一木一铁和材料店的一定时间、两铁,

我们又可以把锤子和钉子分别分解为{工具A,木头,铁}{材料A,2*铁},其中工具A是抽象的工具不耗费材料价格为锤子的增加值且生产它要耗费工具厂生产一个锤子的时间。最后我们可以把铁、木头等价表示为{工厂A、工厂B}生产他们分别要耗费工厂生产一个铁和一个木头的时间。那么椅子就可以分解为集合{工具A,材料A,家具A,3*工厂A,3*工厂B},集合中给工具A、材料A、家具A表示生产椅子实质会占用这三个部门生产时间。

于是我们可以把每种产品都写成它占据各部门时间的集合。

occdic={}

for i in rooms:

occdic[i]=0

df=pd.DataFrame(df)

df={}

time,price,add,name=[],[],[],[]

room1,room2,room3,room4,room5=[],[],[],[],[]

for room in rooms:

for tools in rooms[room]:

toolsdic=rooms[room][tools]

for i in rooms:

occdic[i] = 0

time.append(rooms[room][tools]['time'])#此处先记直接占用部门的时间

price.append(rooms[room][tools]['price'])

sump=[]

occdic[fromdic[tools]] = rooms[room][tools]['time']

if tools not in rooms['factory']:

for comp in rooms[room][tools]['compon']:

occdic[fromdic[comp]] += rooms[fromdic[comp]][comp]['time']#此处记录间接占用部门的时间

if comp in rooms['factory']:

pass

else:

for i in rooms[fromdic[comp]][comp]['compon']:

occdic[fromdic[i]] += rooms[fromdic[i]][i]['time']

name.append(str(tools))

room1.append(occdic['instrum'])

room2.append(occdic['metrl'])

room3.append(occdic['factory'])

room4.append(occdic['vegatable'])

room5.append(occdic['furnit'])

df['time']=time

df['price']=price

df['name']=name

df['instrum']=room1

df['metrl']=room2

df['factory']=room3

df['vegatable']=room4

df['furnit']=room5

四、总结

最终我们得到了一个含有各种产品增加值、占用各部门时间的数据框。

有了这个数据框我们就可以根据提炼出的信息寻优找到在给定部门使用时间内生产总值最大的产品组合。因为这个问题本质是一个限制条件下求极大值问题,对于真实情况我们可以选择各种算法比如遗传算法、随机森林、神经网络等等,当然对于我们这个小规模的问题甚至可以枚举选出收益最大的组合。

所以本文主要是对不那么结构化的数据进行处理是我们后面的数据分析更加方便简单,希望对学习用python做数据分析的人有帮助。

PS:最后在本人博客的文件中附上本次用到的数据供大家联系,文件名为simcity.zip。

python经济统计_给统计人讲python(3)模拟城市_数据分析相关推荐

  1. 会python的人多吗_为什么很多人喜欢 Python?

    对于这个问题,汇智妹为大家请来了我们汇智动力的技术大咖--贵哥,贵哥从事近20年的软件开发.测试工作,今天就让他来为我们谈谈Python这门计算机语言. 福贵哥作为一个多年在IT界摸爬滚打的老兵,因项 ...

  2. 申请python原因_为什么很多人喜欢 Python?

    目录 为什么Python适合作为学习编程的第一语言呢? 如何入门Python? 相信有不少人和我一样,喜欢Python的主要原因是即便零编程基础,但依然可以在短时间内学会,并且熟练灵活的使用. 可能我 ...

  3. python django 优势_那么多人选择Python,它的优势,缺点有哪些?

    提及到目前最火的编程语言,Python可谓是非常受欢迎的,属于四大编程语言之一,近些年来Python的增长趋势也是非常明显的,很多人都将Python作为入门的语言,对于很多人来说都会选择学习Pytho ...

  4. python编写赛车_90%的人说Python程序慢,5大神招让你的代码像赛车一样跑起来

    2.用set而不用list 我们再来看一个常见的场景,搜索性能的时候用set是列表10倍,不信看下面这个例子 原因搜索成员的时候,Python的set比list快很多.差距就在if i in myli ...

  5. matlab 火柴人_超级火柴人白神手游下载_超级火柴人白神v1.0客户端下载 - 云骑士一键重装系统...

    超级火柴人白神游戏是一款有趣的动作冒险游戏,超级火柴人白神游戏采用经典火柴人角色,玩家可以用火柴人和敌方英雄作战,操作打击感强,非常热血有趣. 游戏介绍 超级火柴人白神是一款拥有许许多多元素的动作冒险 ...

  6. python创建类统计属性_轻松创建统计数据的Python包

    python创建类统计属性 介绍 (Introduction) Sometimes you may need a distribution figure for your slide or class ...

  7. python制作统计图_刻意练习11:Python描述统计、简单统计图形

    学习计划 MyPlan11 主题:Python描述统计.简单统计图形 时间:8.5-8.11周内完成 参考资料:新书<谁说菜鸟不会数据分析python篇> 各位星友们,在这个星球里每个人都 ...

  8. python做数据分析难么_做统计学习,数据分析应该学Python还是R?

    如果你是数据分析领域的新兵,那么你一定很难抉择--在进行数据分析时,到底应该使用哪个语言,R还是Python?在网络上,也经常出现诸如"我想学习机器语言,我应该用哪个编程语言"或者 ...

  9. python怎么命名未知数_码如其人,小老弟,你能写一手漂亮的Python函数吗

    与多数现代编程语言一样,在 Python 中,函数是抽象和封装的基本方法之一.你在开发阶段或许已经写过数百个函数,但并非每个函数都生而平等.写出「糟糕的」函数会直接影响代码的可读性和可维护性.那么,什 ...

最新文章

  1. 零基础入门NLP - 新闻文本分类
  2. 2008_12_24_星期三
  3. 机器学习之梯度下降法
  4. 网站假设php,PHP个人网站架设连环讲(一)
  5. 【ARM】数据操作指令(下)
  6. Spark RDD使用详解4--Key-Value型Transformation算子
  7. PyCharm设置字体大小与颜色
  8. 数据结构之线性表代码实现顺序存储,链式存储,静态链表(选自大话数据结构)...
  9. 求一篇计算机word文档作业,计算机应用基础作业3:Word2003
  10. 找出回文字符串用c语言写,寻找回文字符串
  11. 《Objective-C 程序设计(第4版)》图书信息
  12. 带后台管理的超酷jquery+ajax幻灯相册php源码,六屏仿手风琴效果的js焦点幻灯片代码_js特效_js幻灯片是什么...
  13. IKAnalyzer总结
  14. 【Verilog语法001】Verilog log2 函数
  15. 视频教程-Excel高效办公必会技巧(Excel系列课程)-Office/WPS
  16. python颜色识别_Python人体肤色检测
  17. springboot学校快递站点管理系统的设计与实现毕业设计源码111554
  18. php调用 firebird,使用PHP从Firebird数据库显示Blob数据
  19. svm对未知数据的分类_LibSVM学习3:一个实例搞定libsvm分类
  20. 完整,详细的基于jquery省市三级联动和基于angular的省市三级联动对比

热门文章

  1. 【clickhouse】未解决 ClickHouse exception, code: 1002 DB::Exception: Directory already exists
  2. 【Flink】kafka Response from server for which there are no in-flight requests NETWORK_EXCEPTION
  3. 【ElasticSearch】Es 源码之 RestController 源码解读
  4. 【SpringCloud】服务调用OpenFeign
  5. 自定义 Git - Git 钩子
  6. Spark SQL兼容Hive及扩展
  7. 95-240-060-源码-state-状态生存时间(TTL)
  8. 【Yarn】yarn local dirs的管理实现
  9. ecs服务器换系统,ecs服务器更换操作系统
  10. java 实验张智,java实验指导书