Pergunta

Estou escrevendo um programa para simular os dados reais de pesquisas que empresas como Gallup ou Rasmussen publicam diariamente:www.gallup.com e www.rassmussenreports.com

Estou usando um método de força bruta, onde o computador gera alguns dados aleatórios de pesquisas diárias e depois calcula médias de três dias para ver se a média dos dados aleatórios corresponde aos números dos pesquisadores.(Os números das pesquisas da maioria das empresas são médias de três dias)

Atualmente, funciona bem para uma iteração, mas meu objetivo é que ele produza a simulação mais comum que corresponda aos dados médios da pesquisa.Eu poderia então alterar o código de 1 a 1.000 iterações.

E este é o meu problema.No final do teste eu tenho um array em uma única variável que se parece com isto:

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

O programa atualmente produz uma matriz para cada simulação correta. Posso armazenar cada array em uma única variável, mas então preciso ter um programa que possa gerar de 1 a 1000 variáveis ​​dependendo de quantas iterações solicitei!?

Como posso evitar isso?Eu sei que existe uma maneira inteligente de fazer isso que não exige que o programa gere variáveis ​​para armazenar arrays dependendo de quantas simulações eu quiser.

Teste de código para 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 

Como repito sem criar vários vars mcwork?

Foi útil?

Solução

Algo assim funcionaria?

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

No final, você fica com uma lista de válidos mctest listas.

O que eu mudei:

  • Usei um compreensão da lista para construir os dados em vez de um loop for
  • Usado random.randint para obter números inteiros aleatórios
  • Usado fatias e sum para calcular a média dos três primeiros itens
  • (Para responder à sua pergunta real :-)) Coloque os resultados em uma lista mcworks, em vez de criar uma nova variável para cada iteração

Outras dicas

Você está falando em fazer isso?

>>> a = [ ['a', 'b'], ['c', 'd'] ]
>>> a[1]
['c', 'd']
>>> a[1][1]
'd'

Listas em python podem conter qualquer tipo de objeto - Se entendi a pergunta corretamente, um list de listvamos fazer o trabalho?Algo assim (supondo que você tenha uma função generate_poll_data() que cria seus dados:

data = []

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

Então, data[n] será a lista de dados do (n-1)a corrida.

já que você está pensando variáveis, você pode preferir um dicionário a uma lista de listas:

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

etc.

Eu consideraria fortemente usar NumPy para fazer isso.Você obtém matrizes N-dimensionais eficientes que podem ser processadas de forma rápida e fácil.

Uma maneira legal de fazer isso é usar uma lista de listas em combinação com o Pandas.Então você poderá criar uma média móvel de 3 dias.Isso torna mais fácil pesquisar os resultados apenas adicionando os reais como outra coluna e usando a função loc para encontrar quais correspondem.

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

Isso também é legal se você pretende usar os mesmos valores aleatórios para diferentes enquetes/pessoas, basta adicionar outra coluna com seus valores reais e realizar a mesma busca por eles.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top