Timeseries получает последний требуемый день месяца и повторяет его - PullRequest
0 голосов
/ 27 июня 2018
  1. Фрейм данных имеет столбцы «START», «CLOSE», каждый представляющий дату.
  2. В столбец «WOM» добавляется неделя месяца, чтобы узнать, на какую неделю месяца выпадает данная дата начала (от 1 до 5).
  3. Добавлен еще один столбец «END» с условием, если «WOM» меньше 4, то используется в тех же месяцах в прошлом ЗАКРЫТЬ, а «END» еще используется в следующем последние месяцы закрываются как END.

Следующий код выполняет вышесказанное, но не создает правильный столбец END:

import pandas as pd

start = pd.date_range('2016-06-01', '2018-06-27', freq='7D')
close = start.shift(1) - pd.Timedelta('1Day')
df = pd.DataFrame({'START':start, 'CLOSE':close}, columns=['START', 'CLOSE'])
#Week of the month
df['WOM'] = df.START.apply(lambda x: (x.day-1)//7+1)
#Get end list
ends = df['CLOSE']
ends.index = ends
ends = ends.resample('M').last()

def get_end(x):
    try:
        wom = x['WOM']
        st = x['START']
        me = ends.searchsorted(st)
        print(f'{st:%Y-%m-%d}_{wom}_{me[0]}')
        if wom >= 4:
            return ends.iloc[me[0] +1]
        else:
            return ends.iloc[me[0]]
    except:
        return None

df['END'] = df.apply(lambda x: get_end(x), axis=1 )

Выделенный столбец на изображении должен был быть 2016-07-26 вместо 2016-08-30, что не так и как можно это исправить?

enter image description here

1 Ответ

0 голосов
/ 27 июня 2018

Я решил это следующим образом:

  1. Удален столбец WOM
  2. Поиск конца с использованием столбца «ЗАКРЫТЬ» вместо столбца «СТАРТ»

А вот и код:

import pandas as pd
start = pd.date_range('2016-06-01', '2018-06-27', freq='7D')
close = start.shift(1) - pd.Timedelta('1Day')
df = pd.DataFrame({'START':start, 'CLOSE':close}, columns=['START', 'CLOSE'])
#Get end list
ends = df['CLOSE']
ends.index = ends
ends = ends.resample('M').last()

def get_end(x):
    try:
        wom =  (x['CLOSE'].day - 1)// 7+1
        st = x['CLOSE']
        me = ends.searchsorted(st)
        if wom >= 4:
            return ends.iloc[me[0] +1]
        else:
            return ends.iloc[me[0]]
    except:
        return None

df['END'] = df.apply(lambda x: get_end(x), axis=1 )

Я ценю любое другое решение!

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