系列或每个向量的斜率或趋势计算(多列)

时间:2018-08-25 05:15:57

标签: python pandas scikit-learn

我们有多个时间序列数据集。有些是按月,日期和年份。

在这里,我们面临的挑战是快速扫描数据集并将见解告诉我们的管理层,而不是创建仪表板并单击一下进行检查。

“趋势”和“斜率”之类的东西似乎可以互换,专家每次都在以不同的方式进行计算。衡量趋势或斜率的最佳实践是什么?

我的数据大多参差不齐。我的意思是说几个月要上升,上升之后要稍微下降等等。我喜欢为每个向量得到一个数字,这样我就可以比较每个向量并讲述一个故事。非常感谢您的帮助。

## 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 :(得分:1)

一种方法是将numpy.polyfitdeg=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