Python датафрейм настраиваемая функция применения - PullRequest
0 голосов
/ 22 апреля 2020

Я хотел бы сделать ниже в python, используя dataframe и пользовательскую функцию применения.

Month,1,2,3,4,5

Oct 2018,0.1,0.2,0.3,0.4,NaN

Nov 2018,0.5,1.0,1.5,NaN,NaN

Первая строка - заголовки столбцов. Я хотел бы взять каждую строку и сделать линейное выравнивание и заполнить наклон и перехватить в отдельный столбец. Например, строка «Окт 2018» имеет x:[1,2,3,4],y:[0.1,0.2,0.3,0.4], должно дать slope=0.1 и intercept=0.0, тогда как строка «Ноябрь 2018» имеет x:[1,2,3], y:[0.5,1.0,1.5], должно дать slope=0.5 и intercept=0.0.

Я получаю х значений из имен столбцов. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 22 апреля 2020
def get_slope_interscept(x):
    # Need two valid points to determine slope and interscept
    first_index = x[1:,].first_valid_index()
    second_index = x[first_index+1:,].first_valid_index()
    x1, x2, y1, y2 = first_index, second_index, x[first_index], x[second_index]
    slope = (y2-y1)/ (x2-x1)
    interscept = y2 - slope*x2
    return [slope, interscept]

df.apply(lambda x: pd.Series(get_slope_interscept(x), index=['slope', 'interscept']), axis=1)

Это также будет обрабатывать случай, если в строке будут впереди недопустимые NaN.

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

Вы можете получить новый столбец уклона, используя .stack и выполняя .groupby месяца, при этом ключевой вещью является .sum(), .rename столбцов и .eval для вычисления склон. Наконец, отправьте значения в список, чтобы вернуть его во вновь созданный столбец «Наклон». Для столбца перехвата вы можете просто установить, что перехват равен нулю.

Данные:

import pandas as pd
import numpy as np
df = pd.DataFrame({'Month':['Oct', 'Nov'],
                   1: [0.1,0.5],
                   2: [0.2,1.0],
                   3: [0.3,1.5],
                   4: [0.4,np.NaN],
                   5: [np.NaN,np.NaN]})

Код:

df['Slope'] = pd.DataFrame(df.set_index('Month').stack()).reset_index().groupby('Month').sum().rename(columns={'level_1' : 'x', 0 : 'y'}).eval('Slope = y / x')['Slope'].to_list()

Выход:

df

    Month   1   2   3   4   5   Slope
0   Oct     0.1 0.2 0.3 0.4 NaN 0.5
1   Nov     0.5 1.0 1.5 NaN NaN 0.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...