Смещение дат панд шаг за шагом - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь изменить мой кадр данных панд, но все же я не получил никаких результатов.У меня есть датафрейм этой формы:

fc.iloc[:,:2][:10]
Out[309]: 
             DATE  TOTAL_REVENUE_TTM
TIC                                 
AMZN.O 2018-01-01       3.769385e+11
AMZN.O 2018-01-01       3.775364e+11
AMZN.O 2018-01-01       3.772219e+11
AMZN.O 2018-01-01       3.766596e+11
AMZN.O 2018-01-01       3.757391e+11
AMZN.O 2018-02-01       3.931331e+11
AMZN.O 2018-02-01       3.935390e+11
AMZN.O 2018-02-01       3.932100e+11
AMZN.O 2018-02-01       3.926973e+11
AMZN.O 2018-02-01       3.917282e+11

Мне нужно правильно изменить столбец DATE, который не отражает реальную дату.Сложность в том, что мне нужно изменить его, следуя некоторому шаблону.Здесь я напечатал только 10 столбцов, но у меня есть много наблюдений, которые следуют одному и тому же правилу.

Подводя итог, это выходные данные размера 5 сети LSTM (я напечатал только два выхода) и напечатанныедата - только последняя дата вывода.Мне нужно восстановить все другие даты, зная, что все они сдвинуты во времени на 12 месяцев.На практике я должен сместить дату в 4-й строке на 1 год, дату в 3-й строке на 2 года и так далее.Это должно применяться к каждому выводу (скажем, к каждой 5 строке в фрейме данных) и к каждой компании в фрейме данных.

То, как работает код, также должно быть обобщено, если, например, я бы изменил размервыходных данных, чтобы у меня могло быть 3 повторяющихся даты вместо 5, а также если бы я изменил смещение назад во времени.

Я пытался написать функцию, которая принимает эти 2 параметра и возвращает весь фрейм данныхс корректно смещенными датами, но мне трудно найти способ правильно воспроизвести шаблон.

Здесь есть фрагмент кода для моей функции, который должен принимать каждый фрагмент данных, относящийся к компании,разработайте его и затем объедините снова, чтобы сформировать новый фрейм данных:

def modify_forecasts_dates(fc,offset,output_size):


    #extract the company names
    companies = fc.index.get_level_values(0).unique()
    cmp_to_concat = []

    for tick in companies:

        cmp = fc.loc[tick]      
        cmp.insert(0, 'ROW_NUM', range(1,len(cmp)+1))
        cmp['BOOL'] = np.where((np.mod(cmp['ROW_NUM'],output_size)==0), 'OK', 'MODIFY')   



        #cmp.drop(labels=['ROW_NUM','BOOL'],inplace=True)
        cmp_to_concat.append(cmp)

    final_df = pd.concat(cmp_to_concat)

    return final_df

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

Есть ли простой способ взять кадр данных с шагом 5 строк (или эквивалентно с шагомвыходной размер) и правильно сместить все предыдущие даты, получая t, t-смещение, t-2 * смещение и т. д.

Я знаю, что немного сложно понять, что мне нужно сделать, но яя действительно борюсьЯ мог бы сделать это вручную, но лучше автоматизировать процесс.

1 Ответ

1 голос
/ 18 апреля 2019

Я предполагаю, что ваши данные будут входить в группу num_year строк (в данном случае num_year=5).Кроме того, я обнаружил, что иметь неуникальный индекс небезопасно, что затрудняет обновление столбца.Поэтому я решил сбросить индекс:

# sample data
df = pd.DataFrame({'tic':['a']*10+['b']*20,
                   'date': sorted(list(pd.date_range('2018-01-01', '2018-01-06', freq='d')
                           )* 5 )}).set_index('tic')

# make sure companies are grouped together, 
# skip if they are already
df = df.reset_index().sort_values(['tic','date'])

num_year = 5

# offset pattern
delta = pd.Series([pd.DateOffset(years=i) 
                      for i in range(num_year-1,-1,-1)] * (len(df)//num_year))

# update date
df.date = df.date - delta

df.head(10)

Вывод:

+----+------+------------+
|    | tic  |    date    |
+----+------+------------+
| 0  | a    | 2014-01-01 |
| 1  | a    | 2015-01-01 |
| 2  | a    | 2016-01-01 |
| 3  | a    | 2017-01-01 |
| 4  | a    | 2018-01-01 |
| 5  | a    | 2014-01-02 |
| 6  | a    | 2015-01-02 |
| 7  | a    | 2016-01-02 |
| 8  | a    | 2017-01-02 |
| 9  | a    | 2018-01-02 |
+----+------+------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...