我正在编写一个程序来模拟像Gallup或Rasmussen这样的公司每日发布的实际投票数据:www.gallup.com和www.rassmussenreports.com
我正在使用强力方法,计算机生成一些随机的每日轮询数据,然后计算三天平均值,以查看随机数据的平均值是否与民意测验数字相匹配。 (大多数公司的民意调查都是三天平均值)
目前,它适用于一次迭代,但我的目标是让它产生与平均轮询数据匹配的最常见模拟。然后我可以将代码改为1到1000次迭代。
这是我的问题。在测试结束时,我在一个变量中有一个数组,如下所示:
[40.1, 39.4, 56.7, 60.0, 20.0 ..... 19.0]
程序当前为每个正确的模拟生成一个数组。 我可以将每个数组存储在一个变量中,但是我必须有一个程序可以生成1到1000个变量,具体取决于我请求的迭代次数!?
我该如何避免这种情况?我知道有一种智能的方法,不需要程序生成变量来存储数组,具体取决于我想要的模拟数量。
麦凯恩的代码测试:
test = []
while x < 5:
test = round(100*random.random())
mctest.append(test)
x = x +1
mctestavg = (mctest[0] + mctest[1] + mctest[2])/3
#mcavg is real data
if mctestavg == mcavg[2]:
mcwork = mctest
如何在不创建多个mcwork变量的情况下重复?
答案 0 :(得分:3)
你在谈论这样做吗?
>>> a = [ ['a', 'b'], ['c', 'd'] ]
>>> a[1]
['c', 'd']
>>> a[1][1]
'd'
答案 1 :(得分:3)
这样的事情会起作用吗?
from random import randint
mcworks = []
for n in xrange(NUM_ITERATIONS):
mctest = [randint(0, 100) for i in xrange(5)]
if sum(mctest[:3])/3 == mcavg[2]:
mcworks.append(mctest) # mcavg is real data
最后,您将获得有效mctest
列表的列表。
我改变了什么:
random.randint
获取随机整数sum
计算前三项的平均值mcworks
中,而不是为每次迭代创建一个新变量答案 2 :(得分:1)
python中的列表可以包含任何类型的对象 - 如果我正确理解了这个问题,list
list
的{{1}}会做什么工作吗?这样的事情(假设你有一个创建数据的函数generate_poll_data()
:
data = []
for in xrange(num_iterations):
data.append(generate_poll_data())
然后,data[n]
将成为(n-1)
次运行的数据列表。
答案 3 :(得分:1)
因为您正在考虑变量,您可能更喜欢列表中的字典:
data = {}
data['a'] = [generate_poll_data()]
data['b'] = [generate_poll_data()]
等
答案 4 :(得分:1)
我强烈建议使用NumPy来执行此操作。您可以快速轻松地处理高效的N维数组。
答案 5 :(得分:0)
一种整洁的方法是将列表列表与Pandas结合使用。然后,您可以创建3天的滚动平均值。 只需将真实的结果添加到另一列中,然后使用loc函数查找匹配的结果,即可轻松搜索结果。
rand_vals = [randint(0, 100) for i in range(5))]
df = pd.DataFrame(data=rand_vals, columns=['generated data'])
df['3 day avg'] = df['generated data'].rolling(3).mean()
df['mcavg'] = mcavg # the list of real data
# Extract the resulting list of values
res = df.loc[df['3 day avg'] == df['mcavg']]['3 day avg'].values
如果您打算对不同的民意调查/人员使用相同的随机值,则只需添加另一列及其真实值并对它们执行相同的搜索,这也很方便。