Хранение нескольких массивов в Python
Вопрос
Я пишу программу для имитации реальных данных опросов, которые такие компании, как Gallup или Rasmussen, публикуют ежедневно:www.gallup.com и www.rassmussenreports.com
Я использую метод грубой силы, при котором компьютер генерирует некоторые случайные данные ежедневного опроса, а затем вычисляет средние значения за три дня, чтобы увидеть, соответствует ли среднее значение случайных данных номерам опрошенных.(Данные опроса большинства компаний приведены в среднем за три дня)
В настоящее время он хорошо работает для одной итерации, но моя цель - заставить его выдавать наиболее распространенное моделирование, соответствующее средним данным опроса.Затем я мог бы изменить код в любом месте от 1 до 1000 итераций.
И в этом моя проблема.В конце теста у меня есть массив в одной переменной, который выглядит примерно так:
[40.1, 39.4, 56.7, 60.0, 20.0 ..... 19.0]
В настоящее время программа создает один массив для каждого правильного моделирования. Я могу сохранить каждый массив в одной переменной, но тогда у меня должна быть программа, которая могла бы генерировать от 1 до 1000 переменных в зависимости от того, сколько итераций я запросил!?
Как мне избежать этого?Я знаю, что есть разумный способ сделать это, который не требует, чтобы программа генерировала переменные для хранения массивов в зависимости от того, сколько симуляций я хочу.
Тестирование кода для 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
Как мне повторить без создания нескольких переменных 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
чтобы вычислить среднее значение по первым трем пунктам - (Чтобы ответить на ваш актуальный вопрос :-) ) Поместите результаты в список
mcworks
, вместо создания новой переменной для каждой итерации
Другие советы
Ты говоришь о том, чтобы сделать это?
>>> 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)
го беги.
поскольку вы думаете в переменные, возможно , вы предпочтете словарь списку списков:
data = {}
data['a'] = [generate_poll_data()]
data['b'] = [generate_poll_data()]
и т.д.
Я бы настоятельно рекомендовал использовать NumPy чтобы сделать это.Вы получаете эффективные 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
Это также удобно, если вы собираетесь использовать одни и те же случайные значения для разных опросов / людей, просто добавьте еще один столбец с их реальными значениями и выполните для них тот же поиск.