Лучшая линия для тренда - PullRequest
1 голос
/ 14 марта 2019

У меня есть следующие данные

df = pd.DataFrame({ 
'region'  : ['a', 'a', 'a','a',' a','a','a', 's', 's','s','l','a','c','a', 'e','a','g', 'd','c','d','a','f','a','a','a'],
'month_number' : [5, 12, 3, 12, 3, 6,7,8,9,10,11,12,4,5,2,6,7,8,3, 4, 7, 6,7,8,8],
'score' : [2.5, 5, 3.5, 2.5, 5.5, 3.5,2,3.5,4,2,1.5,1,1.5,4,5.5,2,3,1,2,3.5,4,2,3.5,3,4]})

Я хочу рассчитать среднее значение для региона и создать его тренд за год, так как в последний раз я хочу получить линию наилучшего соответствия, чтобы увидеть, растет ли тренд с течением времени. (Не для прогнозируемых значений, просто в среднем)

Я отфильтровал регион 'a':

filtered = df[(df['region'] == 'a')]

И создал тренд:

filtered.groupby(['month_number','region']).mean()['score'].unstack().plot(figsize=(10,6))

Это дает следующее: enter image description here

Теперь я застрял в той части, которая соответствует наилучшей линии тренда. В конце концов, моя цель - создать столбец со значениями плюса или минуса, указывающими тенденцию к росту или падению в этом регионе. Если есть какой-то другой подход к этому, я хотел бы услышать это.

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Если вы хотите просто построить прямую линию, используйте Seaborn.

Однако, если вы хотите рассчитать соответствие данных прямой линии, используйте numpy.polyfit.

import numpy as np
f1 = filtered.groupby('month_number').mean().reset_index()
x = f1.month_number.values
y = f1.score.values
m, c = np.polyfit(x, y, 1)

Вы рассчитали наклон и y-точку пересечения для своей точки.

Вы можете рассчитать баллы выше и ниже ваших позиций следующим образом:

yHat = m*x + c
yError = y - yHat

Для вашего нового столбца просто используйте значения ошибок:

f1['HiLo'] = [ ('+' if m else '-')  for m in yError>0]

Вы получите свои плюсы и минусы ..

month_number     score HiLo
           3  3.500000    +
           5  3.250000    -
           6  2.750000    -
           7  3.166667    +
           8  3.500000    +
          12  2.833333    -
1 голос
/ 14 марта 2019

Вы можете сделать это, используя seaborn регрессионный график regplot, как показано ниже.Затененная область - это доверительный интервал.

import seaborn as sns
import pandas as pd

df = pd.DataFrame({ 
'region'  : ['a', 'a', 'a','a',' a','a','a', 's', 's','s','l','a','c','a', 'e','a','g', 'd','c','d','a','f','a','a','a'],
'month_number' : [5, 12, 3, 12, 3, 6,7,8,9,10,11,12,4,5,2,6,7,8,3, 4, 7, 6,7,8,8],
'score' : [2.5, 5, 3.5, 2.5, 5.5, 3.5,2,3.5,4,2,1.5,1,1.5,4,5.5,2,3,1,2,3.5,4,2,3.5,3,4]})

filtered = df[(df['region'] == 'a')]
df1 = filtered.groupby(['month_number','region']).mean()['score'].unstack()
sns.regplot(x=df1.index.tolist(), y=df1['a'], data=df1)

enter image description here

Если вы не хотите, чтобы заштрихованный доверительный интервал можно использовать ci=0 в качестве

sns.regplot(x=df1.index.tolist(), y=df1['a'], data=df1, ci=0)

enter image description here

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