Pregunta

Estoy escribiendo un programa para simular los datos de encuestas reales que empresas como Gallup o Rasmussen publican diariamente:www.gallup.com y www.rassmussenreports.com

Estoy usando un método de fuerza bruta, donde la computadora genera algunos datos aleatorios de encuestas diarias y luego calcula promedios de tres días para ver si el promedio de los datos aleatorios coincide con los números de los encuestadores.(La mayoría de las cifras de las encuestas de empresas son promedios de tres días)

Actualmente, funciona bien para una iteración, pero mi objetivo es que produzca la simulación más común que coincida con los datos promedio de las encuestas.Luego podría cambiar el código de 1 a 1000 iteraciones.

Y este es mi problema.Al final de la prueba tengo una matriz en una sola variable que se parece a esta:

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

Actualmente, el programa produce una matriz para cada simulación correcta. Puedo almacenar cada matriz en una sola variable, pero luego tengo que tener un programa que pueda generar de 1 a 1000 variables dependiendo de cuántas iteraciones solicité.

¿Cómo evito esto?Sé que existe una forma inteligente de hacer esto que no requiere que el programa genere variables para almacenar matrices dependiendo de cuántas simulaciones quiera.

Pruebas 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 

¿Cómo repito sin crear múltiples vars de mcwork?

¿Fue útil?

Solución

Algo como esto funcionaría?

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

Al final, te quedará una lista de válidos. mctest liza.

Lo que cambié:

  • Uso un comprensión de la lista para construir los datos en lugar de un bucle for
  • Usado random.randint para obtener números enteros aleatorios
  • Usado rebanadas y sum para calcular el promedio de los primeros tres ítems
  • (Para responder a su pregunta real :-)) Coloque los resultados en una lista mcworks, en lugar de crear una nueva variable para cada iteración

Otros consejos

¿Estás hablando de hacer esto?

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

Las listas en Python pueden contener cualquier tipo de objeto. Si entiendo la pregunta correctamente, ¿habrá un list de list¿Hacemos el trabajo?Algo como esto (asumiendo que tienes una función generate_poll_data() que crea sus datos:

data = []

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

Entonces, data[n] será la lista de datos del (n-1)ª carrera.

ya que estás pensando en variables, es posible que prefieras un diccionario a una lista de listas:

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

etc.

Consideraría seriamente usar NumPy para hacer esto.Obtiene matrices N-dimensionales eficientes que puede procesar rápida y fácilmente.

Una buena forma de hacerlo es utilizar una lista de listas en combinación con Pandas.Luego podrá crear un promedio móvil de 3 días.Esto facilita la búsqueda entre los resultados simplemente agregando los reales como otra columna y usando la función loc para encontrar cuáles coinciden.

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

Esto también es bueno si tiene la intención de utilizar los mismos valores aleatorios para diferentes encuestas/personas, simplemente agregue otra columna con sus valores reales y realice la misma búsqueda para ellos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top