Хобрук: Ваш путь к мастерству в программировании

ValueError: невозможно выполнить переиндексацию с повторяющейся оси при использовании `DataFrame.pct_change()` с частотой, превышающей день ('D')

У меня есть DataFrame с почасовыми данными о ценах за два года. Я использую DataFrame.pct_change() для расчета процентной доходности с разной периодичностью (ежечасно, ежедневно, еженедельно и т. д.). Это работает, когда я использую freq='H', freq='D' или любой из них (например: freq='7D' или freq='168H'), но я получаю «ValueError: невозможно переиндексировать из дублирующейся оси», когда я пытаюсь использовать частоту, превышающую день, например freq='W' или freq='M'.

Вот несколько скриншотов:

Образец данных Почасовая окупаемость Работа с использованием ‹code›freq='H'‹/code› 4-часовой возврат работает с использованием ‹code›freq='4H  '‹/code› Daily Returns Работа с использованием ‹code›freq='D'‹/code› Еженедельный возврат НЕ работает с использованием ‹code›freq='  W'‹/code› Ежемесячный возврат  ns НЕ РАБОТАЕТ с использованием ‹code›freq='M'‹/code›

Мне не понятно, почему параметры частоты перестают работать за пределами дня ('D'). Любое понимание будет оценено.

Заранее спасибо.

P.S. Вот код:

"""freq=H: Calculates the returns of each row relative to 1 row(s) before."""
daily_data2016to2018_df.pct_change(freq='H').head()

"""freq=4H: Calculates the returns of each row relative to 4 row(s) before."""
daily_data2016to2018_df.pct_change(freq='4H').head(10)

"""freq=D: Calculates the returns of each row relative to 24 row(s) before."""
daily_data2016to2018_df.pct_change(freq='D').head(30)

"""freq=W: Calculates the returns of each row relative to 24*7 row(s) before."""
daily_data2016to2018_df.pct_change(freq='W').head(30)

"""I don't understand why frequencies greater than a day aren't working. 
I could see why frequencies less than an hour wouldn't work because
the data isn't that granular, but why not weekly, monthly, etc.?"""
daily_data2016to2018_df.pct_change(freq='M')

Ответы:


1

Причина, по которой вы сталкиваетесь с этой ошибкой, заключается в том, что вы совершаете переход от почасовых расчетов к календарным. Час работает, потому что ваш индекс в часах. День работает, потому что это абсолютный день, 24 часа. Неделя не работает, потому что она ищет календарный день, а у вас есть несколько дней, отсюда и ошибка «повторяющаяся ось», которая говорит, что у вас есть несколько повторяющихся элементов, что вы и делаете, поскольку она ищет календарные дни.

Например, если вы попытаетесь использовать «B» для рабочего дня, это приведет к той же ошибке дублирования оси.

Простой обходной путь — использовать 7 дней * 24 часа = 168 часов в неделю.

# create dataframe
index = pd.date_range('2018-01-01', periods=30000, freq='H')
data = np.random.rand(30000)
df = pd.DataFrame(data, index, columns=['data'])

df['change'] = df.data.pct_change(freq='168H')
df.iloc[165:170, :]

                         data    change
2018-01-07 21:00:00  0.692558       NaN
2018-01-07 22:00:00  0.818543       NaN
2018-01-07 23:00:00  0.242034       NaN
2018-01-08 00:00:00  0.032420 -0.933596
2018-01-08 01:00:00  0.004672 -0.994401
22.04.2019
Новые материалы

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

стройный-i18следующий
Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

Обзор 20 основных и современных методов работы с массивами в JavaScript
Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

Да, но я чувствую необходимость указать, что это или не единственные два.
Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.