Переменная Zip становится пустой после запуска следующего кода - PullRequest
1 голос
/ 02 апреля 2020

У меня есть фрейм данных (data), который содержит несколько дат (loss_date, report_date, good_date), и я пытаюсь подсчитать определенные строки фрейма данных. Следующий код отлично работает при первом запуске:

# Set up bins
BUCKET_SIZE = 30
min_date = np.min(data.loss_date)
max_date = np.max(data.report_date)
num_days = (max_date - min_date).days
num_buckets = int(np.ceil(num_days/BUCKET_SIZE))

bounds = [min_date + timedelta(days = BUCKET_SIZE*i)
               for i in range(0, num_buckets+1)
]

starts = bounds[0:len(bounds)-1]
ends = bounds[1:len(bounds)]
buckets = zip(starts, ends)

# Get data subset
l_data = data[data.good_date.notna()]
before = l_data[l_data.loss_date < l_data.good_date]
after = l_data[l_data.loss_date >= l_data.good_date]


# Define count function
def count_loss(df, start, end):
    is_start = df.loss_date >= start
    is_end = df.loss_date < end
    count = len(df[is_start & is_end].index)
    return(count)

# FIRST_TIME
count_before = [count_loss(before, s, e) for s,e in buckets]

Но теперь, когда я запускаю его снова, например,

# CODE_AGAIN
count_after = [count_loss(after, s, e) for s,e in buckets]

, я получаю список [] в качестве вывода. Однако, если я запускаю следующее:

# CODE_AGAIN (but redefining buckets)
buckets = zip(starts, ends)
count_after = [count_loss(after, s, e) for s,e in buckets]

, я получаю непустой список. После выполнения FIRST_TIME почтовый индекс корзины становится пустым - и повторение buckets = zip(starts, ends) устраняет проблему; т.е. CODE_AGAIN работает как надо. Я не могу понять, почему!

Большое спасибо.

1 Ответ

2 голосов
/ 02 апреля 2020

Короче говоря, проблема заключается в концепции вашего заголовка: "zip variable". Это не список c; это объект генератора.

buckets = zip(starts, ends)

buckets - это вызываемый интерфейс, функция с yield. После того, как вы прошли через базовую структуру, генератор исчерпан; любые дальнейшие ссылки приведут к None.

. Если вы хотите повторять несколько раз, либо заново создайте выражение zip при каждом использовании, либо сохраните его как list:

buckets = list(zip(starts, ends))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...