使用熊猫计算日期序列值的变化

时间:2019-10-22 19:18:04

标签: python pandas

我有一个包含产品销售的数据框。它包括客户帐号,交易日期,价值和其他信息。

我想了解客户的销售量是否在下降,并想想如果我按季度将他们分组在一起的话,我可以使用pct_change()来解决这个问题,但它不能达到我的预期。

+------------+------------+------------+
| SA_ACCOUNT | SA_TRDATE  | SA_TRVALUE |
+------------+------------+------------+
| AAA1       | 2019-01-01 |      65.65 |
| AAA1       | 2019-02-08 |     698.65 |
| AVD2       | 2019-01-05 |      98.28 |
+------------+------------+------------+

我首先按日期和帐户分组并总计值。然后将其重新采样为四分之一,然后最后将日期堆叠起来,使它们成为列标题。这样就以下面的格式显示了数据。

代码:

sales_by_q = new_frame2.groupby(["SA_ACCOUNT","SA_TRDATE"]).sum().reset_index().set_index("SA_TRDATE")[["SA_ACCOUNT","SA_TRVALUE"]].groupby("SA_ACCOUNT").resample("q").sum().unstack().fillna(0)

示例输出:

    +------------+------------+------------+------------+------------+------------+------------+------------+------------+
    | SA_ACCOUNT | 2017-12-31 | 2018-03-31 | 2018-06-30 | 2018-09-30 | 2018-12-31 | 2019-03-31 | 2019-06-30 | 2019-09-30 |
    +------------+------------+------------+------------+------------+------------+------------+------------+------------+
    | AA11       |      0.000 |      0.000 |     12.000 |      4.000 |      0.000 |      3.000 |      0.000 |      0.000 |
    | AA99       |      0.000 |      3.000 |      0.000 |      0.000 |      0.000 |      0.000 |      0.000 |      0.000 |
    | AAA1       |    171.000 |    407.000 |     78.000 |     23.000 |     23.000 |     20.000 |     70.000 |    208.000 |
    | AAC1       |      0.000 |      0.000 |      0.000 |     64.000 |     10.000 |      5.000 |     21.000 |      6.000 |
    +------------+------------+------------+------------+------------+------------+------------+------------+------------+

我现在不知道这些值是否随着时间的推移而下降(如果客户的支出是否减少),但似乎找不到找到最佳解决方案的最佳方法。

然后我以为我可以算出回归线的系数并使用scikitlearn。但是它仍然不完全是我想要的,不是每个客户都会按季度订购,有的多很多,有的少很多。同样,如果有人在中部季度表现出色,但在开始季度和结束季度表现良好,那么系数仍然主要是负面的。

from sklearn import linear_model

    def calc_vert(x):
        df = pd.DataFrame(x).reset_index()
        x_vals = np.arange(0,df[df.columns[0]].count()).reshape(-1, 1)
        y_vals = df[df.columns[1]]
        regr = linear_model.LinearRegression()
        regr.fit (x_vals, y_vals)
        return regr.coef_

    test1["coeff"] = test1.apply(lambda x: calc_vert(x),axis = 1)    

有什么建议吗?有更好的解决方法吗?

0 个答案:

没有答案