У меня есть датафрейм, содержащий информацию о продажах продуктов. Он включает в себя номер счета клиента, дату транзакции, стоимость + другие.
Я хочу выяснить, снижаются ли продажи клиентов, и подумал, что если бы я сгруппировал их по кварталам, я мог бы тогда использовать 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)
Есть предложения? На лучший способ справиться с этим?