Мой вход dataframe имеет Date
в формате четверти и Rate
. В Date
отсутствует квартал. Теперь я пытаюсь вычислить Update
основанное на логике, что, если доступна 3-я четверть четверть, выберите эту скорость, иначе выберите последнюю скорость. Мой текущий код выглядит следующим образом:
# Create dataframe
df1 = pd.DataFrame([[1, '2015Q3'], [2, '2015Q4'],
[6, '2017Q1'], [7, '2017Q4'],
[9, '2018Q1'], [3, '2018Q2'],
[5, '2018Q3'], [4, '2018Q4']],
columns=['Rate', 'Date'])
df1.index = pd.PeriodIndex(df1.Date, freq='Q')
df1.drop(columns='Date', inplace=True)
# This Code produces 'FutureWarning' message
df1['Update'] = np.where(np.in1d(df1.index - 3, df1.index.values),
df1.loc[df1.index - 3].Rate, df1.Rate.shift(1))
Полное предупреждающее сообщение:
FutureWarning:
Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.
See the documentation here:
https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike
Ссылка в предупреждении: deprecate-loc-reindex-listlike
Я понимаю, что, поскольку на моем index
есть арифметический расчет, а часть значения index
при расчете отсутствует, что вызывает это предупреждающее сообщение и предлагает использовать pandas.DataFrame.reindex. Хотя мое намерение заключается в доступе к Rate
только если index
доступен на основе значения True
или False
из условия в np.where
но я предполагаю, что numpy вычисляет для всех и, следовательно, отсутствующий index.
Я попытался расширить диапазон Date
, но у него будет такая же проблема вблизи границы. Итак, теперь мой вопрос заключается в том, как разрешить это предупреждение. Любые идеи/мысли/информация/ссылки были бы полезными.
Проблема в том, что при подготовке к тому, что np.where
может или не понадобится, df.loc[df.index - 3]
оценивается для всех значений df.index - 3
. Предупреждающее сообщение является хорошим и предполагает, что вместо этого вы должны использовать df.reindex(df.index - 3)
.
df1['Update'] = np.where(np.in1d(df1.index - 3, df1.index.values),
df1.reindex(df1.index - 3).Rate, df1.Rate.shift(1))