Хранение нескольких массивов в Python

1

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

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

В настоящее время он хорошо работает для одной итерации, но моя цель - получить наиболее распространенное симуляцию, которая соответствует средним данным опроса. Затем я мог бы изменить код в любом месте от 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 vars?

Теги:
arrays

6 ответов

2
Лучший ответ

Что-то вроде этой работы?

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

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

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

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

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

и др.

  • 0
    Думаете в переменных? Что еще я мог думать в? Некоторый фон. Я немного знаю PASCAL и использую это как проект для изучения Python.
  • 0
    Я бы предпочел Dict списков списку списков также.
1

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

1

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

data = []

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

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

  • 0
    s / nth / (n + 1) th / run. Прогоны отсчитываются от 1 (первый прогон, второй прогон и т. Д.).
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню