Прокручивающийся градиент для столбца Pandas Dataframe

Как я могу создать столбец в кадре данных pandas с градиентом другого столбца?

Я хочу, чтобы градиент проходил через скользящее окно, чтобы одновременно оценивались только 4 точки данных.

Я предполагаю, что это что-то вроде: df['Gradient'] = np.gradient(df['Yvalues'].rolling(center=False,window=4))

Однако это дает ошибку: raise ValueError('Length of values does not match length of ' 'index') ValueError: Length of values does not match length of index

Любые идеи?

Спасибо!!


person cwse    schedule 04.01.2018    source источник
comment
Предоставьте образцы данных или статистику о вашем наборе данных, например, количество точек данных и т. Д.   -  person Bryce Ramgovind    schedule 04.01.2018
comment
не так много точек данных. например, столбец с 100 150 209 319 400, тогда соседний столбец будет иметь скользящее окно градиента   -  person cwse    schedule 04.01.2018


Ответы (2)


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

df['Gradient'] = np.gradient(df['Yvalues'].rolling(center=False,window=4).mean())

or

df['Gradient'] = np.gradient(df['Yvalues'].rolling(center=False,window=4).sum())

Вы можете узнать больше о скользящих функциях на этом веб-сайте: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.rolling.html

person Bryce Ramgovind    schedule 04.01.2018
comment
Привет @Bryce Ramgovind. Мне не нужна агрегатная функция ... градиент должен быть функцией. Я после скользящего окна по 4 ряда за раз. - person cwse; 04.01.2018

Думаю, я нашел решение. Хотя, наверное, не самый эффективный ..


class lines(object):
    def __init__(self):
        pass

    def date_index_to_integer_axis(self, dateindex):
        d = [d.date() for d in dateindex]
        days = [(d[x] - d[x-1]).days for x in range(0,len(d))]
        axis = np.cumsum(days)
        axis = [x - days[0] for x in axis]
        return axis

    def roll(self, Xvalues, Yvalues, w):  # Rollings Generator Function # https://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python
        for i in range(len(Xvalues) + 1 - w):
            yield Xvalues[i:i + w], Yvalues[i:i + w]

    def gradient(self,Xvalues,Yvalues):
        #Uses least squares method.
        #Returns the gradient of two array vectors (https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.linalg.lstsq.html)
        A = np.vstack([Xvalues, np.ones(len(Xvalues))]).T
        m, c = np.linalg.lstsq(A, Yvalues)[0]
        return m,c

    def gradient_column(self, data, window):
        """ Takes in a single COLUMN EXTRACT from a DATAFRAME (with  associated "DATE" index) """
        vars = variables()

        #get "X" values
        Xvalues = self.date_index_to_integer_axis(data.index)
        Xvalues = np.asarray(Xvalues,dtype=np.float)
        #get "Y" values
        Yvalues = np.asarray([val for val in data],dtype=np.float)
        Yvalues = np.asarray(Yvalues,dtype=np.float)

        #calculate rolling window "Gradient" ("m" in Y = mx + c)
        Gradient_Col = [self.gradient(sx,sy)[0] for sx,sy in self.roll(Xvalues,Yvalues, int(window))]
        Gradient_Col = np.asarray(Gradient_Col,dtype=np.float)

        nan_array = np.empty([int(window)-1])
        nan_array[:] = np.nan
        #fill blanks at the start of the "Gradient_Col" so it is the same length as the original Dataframe (its shorter due to WINDOW)
        Gradient_Col = np.insert(Gradient_Col, 0, nan_array)

        return Gradient_Col



df['Gradient'] = lines.gradient_column(df['Operating Revenue'],window=4)


person cwse    schedule 05.01.2018