Domanda

Sto scrivendo un programma per simulare i dati reali dei sondaggi che aziende come Gallup o Rasmussen pubblicano quotidianamente:www.gallup.com e www.rassmussenreports.com

Sto utilizzando un metodo di forza bruta, in cui il computer genera alcuni dati casuali di sondaggi giornalieri e quindi calcola le medie di tre giorni per vedere se la media dei dati casuali corrisponde ai numeri dei sondaggisti.(I numeri dei sondaggi della maggior parte delle aziende sono medie di tre giorni)

Attualmente funziona bene per un'iterazione, ma il mio obiettivo è far sì che produca la simulazione più comune che corrisponda ai dati medi dei sondaggi.Potrei quindi modificare il codice ovunque da 1 a 1000 iterazioni.

E questo è il mio problema.Alla fine del test ho un array in una singola variabile che assomiglia a questo:

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

Il programma attualmente produce un array per ogni simulazione corretta. Posso memorizzare ogni array in una singola variabile, ma devo avere un programma in grado di generare da 1 a 1000 variabili a seconda di quante iterazioni ho richiesto!?

Come posso evitarlo?So che esiste un modo intelligente per farlo che non richiede al programma di generare variabili per memorizzare gli array a seconda del numero di simulazioni che desidero.

Test del codice per 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 

Come posso ripetere senza creare più variabili mcwork?

È stato utile?

Soluzione

Qualcosa del genere funzionerebbe?

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

Alla fine, ti rimane un elenco di validi mctest elenchi.

Cosa ho cambiato:

  • Usato a comprensione delle liste per creare i dati invece di un ciclo for
  • Usato random.randint per ottenere numeri interi casuali
  • Usato fette E sum per calcolare la media dei primi tre elementi
  • (Per rispondere alla tua vera domanda :-)) Inserisci i risultati in un elenco mcworks, invece di creare una nuova variabile per ogni iterazione

Altri suggerimenti

Stai parlando di fare questo?

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

Gli elenchi in Python possono contenere qualsiasi tipo di oggetto: se ho capito correttamente la domanda, a list Di listcome va il lavoro?Qualcosa del genere (supponendo che tu abbia un file function generate_poll_data() che crea i tuoi dati:

data = []

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

Poi, data[n] sarà l'elenco dei dati da (n-1)esima corsa.

visto che stai pensando variabili, potresti preferire un dizionario a un elenco di elenchi:

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

eccetera.

Ne prenderei fortemente in considerazione l'utilizzo NumPy per fare questo.Ottieni array N-dimensionali efficienti che puoi elaborare rapidamente e facilmente.

Un modo semplice per farlo è utilizzare un elenco di elenchi in combinazione con Pandas.Quindi puoi creare una media mobile di 3 giorni.Ciò semplifica la ricerca tra i risultati semplicemente aggiungendo quelli reali come un'altra colonna e utilizzando la funzione loc per trovare quelli corrispondenti.

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

Questo è utile anche se intendi utilizzare gli stessi valori casuali per diversi sondaggi/persone, basta aggiungere un'altra colonna con i loro valori reali ed eseguire la stessa ricerca per essi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top