質問

私は、Gallup や Rasmussen などの企業が毎日発行する実際の世論調査データをシミュレートするプログラムを作成しています。www.gallup.com および www.rassmussenreports.com

私は、コンピュータがランダムな毎日の世論調査データを生成し、その後 3 日間の平均を計算して、ランダムなデータの平均が世論調査員の数値と一致するかどうかを確認する、総当り的な方法を使用しています。(ほとんどの企業の世論調査の数字は 3 日間の平均です)

現在のところ、1 回の反復ではうまく機能しますが、私の目標は、平均ポーリング データと一致する最も一般的なシミュレーションを生成することです。その後、1 ~ 1000 回の反復の範囲でコードを変更できます。

そして、これが私の問題です。テストの最後には、次のような単一の変数の配列が得られます。

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

現在、プログラムは正しいシミュレーションごとに 1 つの配列を生成します。 各配列を 1 つの変数に格納できますが、その場合、要求した反復回数に応じて 1 ~ 1000 の変数を生成できるプログラムが必要になります。

これを回避するにはどうすればよいですか?必要なシミュレーションの数に応じて、プログラムで配列を保存するための変数を生成する必要がなく、これを行うインテリジェントな方法があることは知っています。

マケインのコードテスト:

 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 

複数の mcwork 変数を作成せずに繰り返すにはどうすればよいですか?

役に立ちましたか?

解決

このようなことはうまくいくでしょうか?

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

最終的には、有効なリストが残ります。 mctest リスト。

変更した点:

  • 使用した リスト内包表記 for ループの代わりにデータを構築するには
  • 使用済み random.randint ランダムな整数を取得するには
  • 使用済み スライス そして sum 最初の 3 つの項目の平均を計算するには
  • (実際の質問に答えるには :-) ) 結果をリストに入れます mcworks, 反復ごとに新しい変数を作成する代わりに

他のヒント

これをすることについて話しているのですか?

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

Python のリストにはあらゆる種類のオブジェクトを含めることができます -- 質問を正しく理解できれば、 listlist仕事はするの?このようなもの(関数があると仮定します) generate_poll_data() これによりデータが作成されます。

data = []

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

それから、 data[n] からのデータのリストになります。 (n-1)3回目の走行。

あなたが考えているから 変数, 、リストのリストよりも辞書の方がよい場合があります。

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

使用を強く検討します ナムピー これをする。迅速かつ簡単に処理できる効率的な N 次元配列が得られます。

これを行うための優れた方法は、リストのリストを Pandas と組み合わせて使用​​することです。その後、3 日間の移動平均を作成できます。これにより、実際の結果を別の列として追加し、loc 関数を使用して一致するものを見つけるだけで、結果の検索が簡単になります。

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

これは、異なる世論調査や人物に同じランダム値を使用する場合にも便利です。実際の値を含む別の列を追加して、それらに対して同じ検索を実行するだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top