«ValueError: невозможно переиндексировать с дублированной оси» при использовании `DataFrame.pct_change ()` с частотами, превышающими день ('D') - PullRequest
0 голосов
/ 21 апреля 2019

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

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

Sample of Data imagefreq='H'"> imagefreq='4H'"> imagefreq='D'"> imagefreq='W'"> imagefreq='M'">

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

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

PS: Вот код:

"""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 Ответ

0 голосов
/ 22 апреля 2019

Причина, по которой вы сталкиваетесь с этой ошибкой, заключается в том, что вы переходите от часовых расчетов к календарным вычислениям.Час работает, потому что ваш индекс в часах.День работает, потому что это абсолютный день, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...