Question

J'écris un programme pour simuler les données de sondage réelles que des sociétés comme Gallup ou Rasmussen publient quotidiennement :www.gallup.com et www.rassmussenreports.com

J'utilise une méthode de force brute, dans laquelle l'ordinateur génère des données d'interrogation quotidiennes aléatoires, puis calcule des moyennes sur trois jours pour voir si la moyenne des données aléatoires correspond aux chiffres des sondeurs.(Les chiffres des sondages de la plupart des entreprises sont des moyennes sur trois jours)

Actuellement, cela fonctionne bien pour une itération, mais mon objectif est de lui faire produire la simulation la plus courante qui correspond aux données d'interrogation moyennes.Je pourrais alors changer le code de 1 à 1000 itérations.

Et c'est mon problème.A la fin du test, j'ai un tableau dans une seule variable qui ressemble à ceci :

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

Le programme produit actuellement un tableau pour chaque simulation correcte. Je peux stocker chaque tableau dans une seule variable, mais je dois alors disposer d'un programme capable de générer de 1 à 1000 variables en fonction du nombre d'itérations que j'ai demandé !?

Comment puis-je éviter cela ?Je sais qu'il existe une manière intelligente de procéder qui ne nécessite pas que le programme génère des variables pour stocker des tableaux en fonction du nombre de simulations que je souhaite.

Tests de code pour 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 

Comment répéter sans créer plusieurs variables Mcwork ?

Était-ce utile?

La solution

Est-ce que quelque chose comme ça fonctionnerait ?

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

En fin de compte, vous vous retrouvez avec une liste de valides mctest listes.

Ce que j'ai modifié :

  • Utilisé un compréhension de liste pour construire les données au lieu d'une boucle for
  • Utilisé random.randint pour obtenir des entiers aléatoires
  • Utilisé tranches et sum calculer la moyenne des trois premiers éléments
  • (Pour répondre à votre vraie question :-) ) Mettez les résultats dans une liste mcworks, au lieu de créer une nouvelle variable pour chaque itération

Autres conseils

Tu parles de faire ça ?

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

Les listes en python peuvent contenir n'importe quel type d'objet. Si je comprends bien la question, un list de listest-ce que ça fait le travail ?Quelque chose comme ça (en supposant que vous ayez une fonction generate_poll_data() qui crée vos données :

data = []

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

Alors, data[n] sera la liste des données du (n-1)la course.

puisque tu penses à variables, vous préférerez peut-être un dictionnaire à une liste de listes :

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

etc.

J'envisagerais fortement d'utiliser NumPy pour faire ça.Vous obtenez des tableaux à N dimensions efficaces que vous pouvez traiter rapidement et facilement.

Une bonne façon de procéder consiste à utiliser une liste de listes en combinaison avec Pandas.Vous pouvez ensuite créer une moyenne mobile sur 3 jours.Cela facilite la recherche dans les résultats en ajoutant simplement les vrais dans une autre colonne et en utilisant la fonction loc pour trouver ceux qui correspondent.

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

C'est également intéressant si vous avez l'intention d'utiliser les mêmes valeurs aléatoires pour différents sondages/personnes, ajoutez simplement une autre colonne avec leurs valeurs réelles et effectuez la même recherche pour elles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top