我有五个时期的数据及其概率,我想用20000次模拟它 使用泊松分布,我希望x轴从0-1开始,我试过但我在这里用我的代码存货: 是否有任何方法可以比我做的更容易编码
import numpy
import matplotlib.pyplot
import pylab
import numpy as np
from pylab import *
data = []
inventory = 0
for j in range(4000):
totalOrder= 0
totalProduction = 0
for i in range (5):
# calculate order
mean = 105
order = np.random.gamma(mean, 20000)
totalOrder = totalOrder+order
# calculate production
production = numpy.random.choice([80, 100, 130, 150], p = [0.2, 0.50 ,0.20, 0.1])
totalProduction = totalProduction + production
# calcculate new inventory
inventory = inventory + production - order
if inventory < 0:
inventory = 0
# calculate fill rate for last 5 orders
fr = float(totalProduction) / float(totalOrder)
if fr > 1:
fr = 1
# append FR to dataset
data.append(fr)
grid(True)
xlabel('Fill Rate')
ylabel('Density')
title('Simulate the system for 20000 week')
matplotlib.pyplot.hist(data, normed = True)
pylab.show()
答案 0 :(得分:1)
您想要使用matplotlib的set_xlim
method作为轴。看看他们的一些例子this one,例如,更好地了解你可以用模块做些什么。
对于您的代码,您需要添加:
ax = plt.gca()
ax.set_xlim(0,1)
对于某些优化,我发现您在不同的别名下添加了相同的模块(例如,您已导入numpy及其别名np,这些也是由pylab导入的)。它告诉我你还没有很多使用该语言的经验。在您继续学习的过程中,您最终会将所有这些导入减少到几个,例如
import numpy as np
import matplotlib.pyplot as plt
并且您将调用属于这些命名空间的正确函数(例如plt.show()
,而不是pylab.show
- pylab对于numpy和matplotlib包只不过是一层薄薄的面纱。 / p>
您可以对代码进行一些优化(例如,对循环进行矢量化),但考虑到当前的级别,我认为这会使其过于复杂。此外,循环确实使你更清楚你正在做什么。
也许只有一个提示:在python中,当你想要更新一个数字变量(int,float,...)时,你可以这么做:
inventory += production - order
它可以帮助您避免再次输入inventory
,从而减少将来发生错误的可能性,如果您想对代码进行更改。