Хранение нескольких массивов в Python - PullRequest
3 голосов
/ 12 сентября 2008

Я пишу программу для имитации фактических данных опросов, которые ежедневно публикуют такие компании, как Gallup или Rasmussen: www.gallup.com и www.rassmussenreports.com

Я использую метод грубой силы, когда компьютер генерирует некоторые случайные данные ежедневного опроса, а затем вычисляет средние значения за три дня, чтобы увидеть, соответствует ли среднее значение случайных данных числам опросчиков. (Большинство опросов компаний являются средними за три дня)

В настоящее время он работает хорошо для одной итерации, но моя цель - сделать так, чтобы он производил наиболее распространенную симуляцию, которая соответствует средним данным опроса. Затем я мог бы изменить код от 1 до 1000 итераций.

И это моя проблема. В конце теста у меня есть массив в одной переменной, который выглядит примерно так:

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

В настоящее время программа создает один массив для каждого правильного моделирования. Я могу хранить каждый массив в одной переменной, но мне нужно иметь программу, которая может генерировать от 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?

Ответы [ 6 ]

3 голосов
/ 12 сентября 2008

Хотелось бы что-нибудь подобное?

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 для расчета среднего значения первых трех элементов
  • (Чтобы ответить на ваш актуальный вопрос :-)) Поместите результаты в список mcworks вместо создания новой переменной для каждой итерации
3 голосов
/ 12 сентября 2008

Вы говорите об этом?

>>> a = [ ['a', 'b'], ['c', 'd'] ]
>>> a[1]
['c', 'd']
>>> a[1][1]
'd'
1 голос
/ 12 сентября 2008

Я бы настоятельно рекомендовал использовать NumPy для этого. Вы получаете эффективные N-мерные массивы, которые вы можете быстро и легко обработать.

1 голос
/ 12 сентября 2008

, поскольку вы думаете о переменных , вы можете предпочесть словарь списку списков:

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

и т.д.

1 голос
/ 12 сентября 2008

Списки в python могут содержать объекты любого типа. Если я правильно понял вопрос, будут ли работать list из list с? Примерно так (при условии, что у вас есть функция generate_poll_data(), которая создает ваши данные:

data = []

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

Тогда data[n] будет списком данных из (n-1)-го прогона.

0 голосов
/ 20 декабря 2018

Хороший способ сделать это - использовать список списков в сочетании с пандами. Тогда вы сможете создать 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

Это также удобно, если вы собираетесь использовать одни и те же случайные значения для разных опросов / лиц, просто добавьте еще один столбец с их реальными значениями и выполните тот же поиск для них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...