Расчет наклона или тренда для серии или каждого вектора (несколько столбцов) - PullRequest
0 голосов
/ 25 августа 2018

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

Здесь наша задача состоит в быстром сканировании набора данных и информировании нашего руководства, а не в создании панели мониторинга и проверке щелчком мыши.

Похоже, что Trend и Slope являются взаимозаменяемыми, и эксперты каждый раз вычисляют по-разному. Какова наилучшая практика для измерения трендов или наклона?

Мои данные в основном смешанные. Я имею в виду, что некоторые месяцы идут вверх, а после повышения немного снижаются и т. Д. Мне нравится получать число для каждого вектора, по которому я могу сравнить каждый вектор и рассказать историю. Большое спасибо за вашу помощь.

## Sample Dataframe
    revenue = [0.85, 0.99, 1.01, 1.12, 1.25, 1.36, 1.28, 1.44]
    expense = [0.5, 0.9, 0.01, 0.12, 0.25, 0.36, 0.28, 0.44]
    net = [0.85, 0.81, 1.01, 1.12, 0.25, 0.36, 0.28, 1.44]
    year = [1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000]
    df1 = pd.DataFrame({'year': year, 'revenue': revenue,'expense': expense, 'net': net})

Результат, который я хотел бы получить здесь (только пример, а не точный результат: -)) ..

revenue slope/trend: 0.98
expense slope/trend: -0.50
net slope/trend: 0.70

Спасибо за вашу помощь.


Новый набор данных

year = [1993, 1994, 1995, 1993, 1994, 1995] 
category =['rev', 'rev', 'exp', 'exp', 'net', 'net'] 
values = [200, 250, 42, 32, 9, 4] 

df1 = pd.DataFrame({'year': year, 'category': category,'values': values})

1 Ответ

0 голосов
/ 27 августа 2018

Один из способов - использовать numpy.polyfit с deg=1, что дает вам наклон и перехват в этом порядке. Просто возьмите первый (наклон) , используя срез [0].

import numpy as np

# obtain only the slope part (df below is df1 in your question)
# np.polyfit(x, y, deg) is the order of arguments.
a = np.polyfit(df.year, df.expense, 1)[0]
b = np.polyfit(df.year, df.net, 1)[0]
c = np.polyfit(df.year, df.revenue, 1)[0]

# output
print("slope of expense: {:.3f}, net: {:.3f}, revenue:{:.3f}".format(a, b, c))

Выход:

slope of expense: -0.028, net: -0.016, revenue:0.080

Надеюсь, это поможет вам начать работу с Python:)


РЕДАКТИРОВАТЬ : Чтобы применить вышеуказанный код к вашему новому набору данных

cats = df1.category.unique().tolist()
slopes = [np.polyfit(df1.loc[df1.category == cat, "year"], df1.loc[df1.category == cat, "values"], 1)[0] for cat in cats]
for cat, slope in zip(cats, slopes):
    print("{} slope/trend: {:.3f}".format(cat, slope))

выход:

rev slope/trend: 50.000
exp slope/trend: 5.000
net slope/trend: -5.000

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...