Скользящий windows - измерение длины наблюдений на каждом зацикленном окне - PullRequest
0 голосов
/ 03 августа 2020

Давайте проанализируем этот пример кода, где zip () используется для создания различных windows из набора данных и возврата их в l oop.

months = [Jan, Feb, Mar, Apr, May]

for x, y in zip(months, months[1:]):
    print(x, y)

# Output of each window will be:
Jan Feb 
Feb Mar
Mar Apr
Apr May

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

Пример по шагам:

  1. При возврате первого окна (январь февраль ), Я хочу вычислить% длины января по всему окну (что равно янв + февраль) и вернуть ему новую переменную
  2. При возврате второго окна (февраль, март) я хочу вычислить % длины февраля по всему окну (что равно февралю + мар) и вернуть его в виде новой переменной
  3. Продолжение этого процесса до последнего окна

Любые предложения о том, как я могу реализовать эта идея в l oop приветствуется!

Спасибо!

РЕДАКТИРОВАТЬ

months = [Jan, Feb, Mar, Apr, May]

for x, y in zip(months, months[2:]):
    print(x, y)

# Output of each window will be:
Jan Feb March
Feb Mar Apr
Mar Apr May

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

* 10 30 * 1-е окно: янв + фев / янв + фев + март 2-е окно: фев + март / фев + март + апр продолжается до последнего окна

Теперь мы можем рассчитать один месяц сверх размера каждого окна (с start.month) . Однако как мы можем адаптировать это, чтобы включить более одного месяца?

Кроме того, вместо использования days_in_month , будет ли способ использовать длину точек данных (строк) в каждом month?

Используя длину точек данных (строк), я имею в виду, что каждый месяц имеет много точек данных в формате «времени» (например, в формате 60 минут). Это будет означать, что 1 день в месяце будет иметь 24 разных точки данных (строк). Пример:

                         column
rows             
01-Jan-2010 T00:00        value
01-Jan-2010 T01:00        value
01-Jan-2010 T02:00        value
...                       ...
01-Jan-2010 T24:00        value
02-Jan-2010 T00:00        value
...                       ...

Спасибо!

1 Ответ

2 голосов
/ 03 августа 2020

Вот один способ. (В моем случае months - это объект period_range.)

import pandas as pd
months = pd.period_range(start='2020-01', periods=5, freq='M')

Теперь перебираем диапазон. Каждая итерация - это двухмесячное окно.

# print header labels
print('{:10s} {:10s} {:>10s} {:>10s} {:>10s} {:>10s} '.format(
    'start', 'end', 'month', 'front (d)', 'total (d)', 'frac'))

for start, end in zip(months, months[1:]):
    front_month = start.month

    # number of days in first month (e.g., Jan)
    front_month_days = start.days_in_month

    # number of days in current sliding window (e.g., Jan + Feb)
    days_in_curr_window = (end.end_time - start.start_time).days

    frac = front_month_days / days_in_curr_window

    print('{:10s} {:10s} {:10d} {:10d} {:10d} {:10.3f}'.format(
        str(start), str(end), front_month,
        front_month_days, days_in_curr_window, frac))


start      end             month  front (d)  total (d)       frac 
2020-01    2020-02             1         31         60      0.517
2020-02    2020-03             2         29         60      0.483
2020-03    2020-04             3         31         61      0.508
2020-04    2020-05             4         30         61      0.492
...