質問
私は、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
リスト。
変更した点:
他のヒント
これをすることについて話しているのですか?
>>> a = [ ['a', 'b'], ['c', 'd'] ]
>>> a[1]
['c', 'd']
>>> a[1][1]
'd'
Python のリストにはあらゆる種類のオブジェクトを含めることができます -- 質問を正しく理解できれば、 list
の list
仕事はするの?このようなもの(関数があると仮定します) 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
これは、異なる世論調査や人物に同じランダム値を使用する場合にも便利です。実際の値を含む別の列を追加して、それらに対して同じ検索を実行するだけです。