Создайте дополнительные столбцы в DataFrame с индексированием по времени - PullRequest
0 голосов
/ 26 мая 2018

В настоящее время у меня есть дата-индексированный фрейм данных с тремя столбцами:

                     Glucosa   Insulina  Carbs
Hour
2018-05-16 06:43:00    156.0       7.0   65.0
2018-05-16 07:43:00    170.0       0.0   65.0
2018-05-16 08:45:00    185.0       2.0    0.0
2018-05-16 09:45:00    150.0       0.0    0.0
2018-05-16 10:45:00     80.0       0.0    0.0
     ...

Я хотел бы создать три дополнительных столбца, которые содержат значения, проиндексированные за один час из текущего индекса, чтобы в итоге получилось что-то вроде этого:

                     Glucosa   Insulina  Carbs  Glucosa1  Insulina1  Carbs1
Hour
2018-05-16 06:43:00    156.0       7.0   65.0      170.0        0.0   65.0
2018-05-16 07:43:00    170.0       0.0   65.0      185.0        2.0    0.0
2018-05-16 08:45:00    185.0       2.0    0.0      150.0        0.0    0.0
2018-05-16 09:45:00    150.0       0.0    0.0       80.0        0.0    0.0
2018-05-16 10:45:00     80.0       0.0    0.0       ...         ...    ...
     ...

Я уже определил функцию, которая создает фрейм данных со столбцами 'Glucosa1', 'Insulina1', 'Carbs1', но она работает очень плохо, и я хотел бы, чтобы она работала быстрее.

Я профилирую время, используемое различными функциями в моем коде, используя следующее:

start = time.time()
  # foo() 
end = time.time()
print(f' Time required to execute foo() : {end - start}')

Это выводит время в среднем 8,331165 секунд (для функции nn_format_df ()) по сравнению с аналогичнымфункции (которые перебирают строки в кадре данных) с выводом 0,366158 секунд.

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

df2 = nn_format_df(df)
df = df.join([df2])

Функция:

def nn_format_df( df : pd.core.frame.DataFrame ) -> pd.core.frame.DataFrame:

  _indices   : pd.core.indexes.datetimes.DatetimeIndex = [ idx for idx in df.index ]
  indices    = _indices[:-60]
  _df        : pd.core.frame.DataFrame = df.copy()
  _df1       : pd.core.frame.DataFrame
  _glc1      : pd.core.series.Series   = pd.Series(pd.np.nan, index=_indices)
  _insu1     : pd.core.series.Series   = pd.Series(pd.np.nan, index=_indices)
  _carbs1    : pd.core.series.Series   = pd.Series(pd.np.nan, index=_indices)

  aux        : pd._libs.tslibs.timestamps.Timestamp
  aux1       : pd._libs.tslibs.timestamps.Timestamp
  one        : datetime.timedelta = datetime.timedelta(hours=1) 

  for idx in indices:
    aux  = _df.ix[ idx, : ].name
    aux1 = aux + one
    _glc1[   idx ]  = _df.ix[ aux1, 'Glucosa' ]
    _insu1[  idx ]  = _df.ix[ aux1, 'Insulina' ]
    _carbs1[ idx ]  = _df.ix[ aux1, 'Carbs' ]

  _df1 = pd.DataFrame({ 'Glucosa1': _glc1,\
                       'Insulina1': _insu1,\
                          'Carbs1': _carbs1
                      }, index=_indices)

  return _df1

Подводя итог:

  • Буду признателен за любые комментарии о том, как улучшить футак, чтобы это не заняло так много времени.
  • Лучший, более Pythonic или pandas-y способ получить желаемый фрейм данных приветствуется.Я новичок в пандах и понимаю, что моя реализация этой функции - совершенно наивный подход.

1 Ответ

0 голосов
/ 26 мая 2018

Вы можете сделать это очень быстро с помощью .shift, что смещает целое DataFrame.Просто используйте pd.concat, чтобы объединить их вместе;аргумент axis=1 указывает, что вы хотите добавлять новые столбцы вместо строк.

import pandas as pd
pd.concat([df, df.shift(-1).rename(columns=dict((elem, elem+'1') for elem in df.columns))], axis=1)

Приведенный выше код дает следующий вывод:

                     Glucosa  Insulina  Carbs  Glucosa1  Insulina1  Carbs1
Hour                                                                      
2018-05-16 06:43:00    156.0       7.0   65.0     170.0        0.0    65.0
2018-05-16 07:43:00    170.0       0.0   65.0     185.0        2.0     0.0
2018-05-16 08:45:00    185.0       2.0    0.0     150.0        0.0     0.0
2018-05-16 09:45:00    150.0       0.0    0.0      80.0        0.0     0.0
2018-05-16 10:45:00     80.0       0.0    0.0       NaN        NaN     NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...