我有一个包含产品销售的数据框。它包括客户帐号,交易日期,价值和其他信息。
我想了解客户的销售量是否在下降,并想想如果我按季度将他们分组在一起的话,我可以使用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)
有什么建议吗?有更好的解决方法吗?