получение ошибки «Ошибка значения: индекс должен быть монотонным»

#python #pandas #datetime #reindex

#python #панды #дата и время #переиндексация

Вопрос:

У меня есть некоторые подробные данные для фондового SRE, то есть csv-файл. Я импортировал его и создал фрейм данных, используя данные. Затем я создал скользящую 20-дневную скользящую среднюю, но получаю сообщение об ошибке. Код:

 import pandas as pd
ticker = 'SRE'
df = pd.read_csv('/Volumes/Seagate Portable/Samp;P 500 List/{}.txt'.format(ticker))
df.columns = ['Extra', 'Dates', 'Open', 'High', 'Low', 'Close', 'Volume']
df.drop(['Extra', 'Open', 'High', 'Volume', 'Low'], axis=1, inplace=True)
df.Dates = pd.to_datetime(df.Dates)
df.set_index('Dates', inplace=True)
df = df.between_time('9:30', '16:00')
df[f'MA {ticker}'] = df.rolling('20d').mean()
 

Хотя я получаю ошибку:

 ValueError                                Traceback (most recent call last)
<ipython-input-51-2c18a3d320d8> in <module>
      6 df.set_index('Dates', inplace=True)
      7 df = df.between_time('9:30', '16:00')
----> 8 df[f'MA {ticker}'] = df.rolling('20d').mean()
      9 
     10 # data[f'MA {ticker}'] = pd.Series

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py in rolling(self, window, min_periods, center, win_type, on, axis, closed)
  11234             )
  11235 
> 11236         return Rolling(
  11237             self,
  11238             window=window,

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/window/rolling.py in __init__(self, obj, window, min_periods, center, win_type, axis, on, closed, **kwargs)
    111         self.win_freq = None
    112         self.axis = obj._get_axis_number(axis) if axis is not None else None
--> 113         self.validate()
    114 
    115     @property

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/window/rolling.py in validate(self)
   1897         ):
   1898 
-> 1899             self._validate_monotonic()
   1900 
   1901             # we don't allow center

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/window/rolling.py in _validate_monotonic(self)
   1938         """
   1939         if not (self._on.is_monotonic_increasing or self._on.is_monotonic_decreasing):
-> 1940             self._raise_monotonic_error()
   1941 
   1942     def _raise_monotonic_error(self):

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/window/rolling.py in _raise_monotonic_error(self)
   1944         if self.on is None:
   1945             formatted = "index"
-> 1946         raise ValueError(f"{formatted} must be monotonic")
   1947 
   1948     def _validate_freq(self):

ValueError: index must be monotonic
 

Комментарии:

1. всегда помещайте полное сообщение об ошибке (начинающееся со слова «Traceback») в вопрос (не комментарий) в виде текста (не скриншота). Есть и другая полезная информация.

2. ошибка здесь довольно очевидна — индекс (df.Dates), по-видимому, не монотонен — вы должны проверить свои данные на это

3. Что значит, что она монотонна? (извините, я новичок в этом) И есть ли способ это изменить?

4. монотонность означает, что значения либо всегда уменьшаются, либо всегда увеличиваются

5. Я в замешательстве относительно того, почему они должны всегда увеличиваться или уменьшаться, если это цены на акции. Разве они не должны быть в состоянии быть любым числом? Есть ли способ сделать его монотонным? Эти данные являются частью большого набора, и это одна из 2 компаний, у которых есть эта проблема. Как я могу это сделать, или мне просто нужно удалить эти стандартные CSV-файлы

Ответ №1:

df.sort_index(inplace = True) прямо перед df.rolling('20D') строкой должно сработать.

.rolling() Функция в временных рядах требует, чтобы строки были упорядочены по времени (-index), т. е. Время (-index) должно постоянно увеличиваться. Это сделано для предотвращения огромных вычислительных затрат, которых пользователь не ожидает. Простая сортировка по индексу заранее соответствует этому требованию.