Armazenando vários arrays em Python
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?
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 list
vamos 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.