3

我正在编写一个程序来模拟 Gallup 或 Rasmussen 等公司每天发布的实际投票数据:www.gallup.com 和 www.rassmussenreports.com

我正在使用蛮力方法,计算机生成一些随机的每日民意调查数据,然后计算三天的平均值,以查看随机数据的平均值是否与民意调查人数匹配。(大多数公司的民意调查数字是三天的平均值)

目前,它在一次迭代中运行良好,但我的目标是让它产生与平均轮询数据匹配的最常见的模拟。然后,我可以更改从 1 到 1000 次迭代的任何代码。

这是我的问题。在测试结束时,我在单个变量中有一个数组,看起来像这样:

[40.1, 39.4, 56.7, 60.0, 20.0 ..... 19.0]

该程序当前为每个正确的模拟生成一个数组。我可以将每个数组存储在一个变量中,但是我必须有一个程序可以根据我请求的迭代次数生成 1 到 1000 个变量!?

我该如何避免这种情况?我知道有一种智能方法可以做到这一点,它不需要程序根据我想要的模拟次数生成变量来存储数组。

McCain 的代码测试:

 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 变量的情况下重复?

4

6 回答 6

3

你是在谈论这样做吗?

>>> a = [ ['a', 'b'], ['c', 'd'] ]
>>> a[1]
['c', 'd']
>>> a[1][1]
'd'
于 2008-09-12T18:14:01.360 回答
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列表。

我改变了什么:

  • 使用列表推导来构建数据而不是 for 循环
  • 用于random.randint获取随机整数
  • 使用切片sum计算前三项的平均值
  • (回答您的实际问题:-))将结果放入列表中mcworks,而不是为每次迭代创建一个新变量
于 2008-09-12T19:08:38.827 回答
1

python 中的列表可以包含任何类型的对象——如果我正确理解了这个问题, a listof lists 会完成这项工作吗?像这样的东西(假设你有一个generate_poll_data()创建数据的函数:

data = []

for in xrange(num_iterations):
    data.append(generate_poll_data())

然后,data[n]将是(n-1)第一次运行的数据列表。

于 2008-09-12T18:14:04.060 回答
1

由于您正在考虑变量,因此您可能更喜欢字典而不是列表:

data = {}
data['a'] = [generate_poll_data()]
data['b'] = [generate_poll_data()]

等等

于 2008-09-12T18:31:04.860 回答
1

我会强烈考虑使用NumPy来做到这一点。您可以获得可以快速轻松地处理的高效 N 维数组。

于 2008-09-12T19:01:00.873 回答
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

如果您打算对不同的民意调查/人员使用相同的随机值,这也很简洁,只需添加另一列及其真实值并对其执行相同的搜索。

于 2018-12-20T07:54:33.923 回答