Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- rfm = (
- df.groupby("customer_id")
- .agg(
- {
- "order_date": lambda x: (x.max() - x.min()).days,
- "order_id": "nunique",
- "price": "mean",
- }
- )
- .rename(
- columns={"order_date": "recency", "order_id": "frequency", "price": "monetary"}
- )
- )
- rfm_quantiles = rfm.quantile(q=[0.2, 0.4, 0.6, 0.8])
- recency_conditions = [
- rfm.recency >= rfm_quantiles.recency.iloc[3],
- rfm.recency >= rfm_quantiles.recency.iloc[2],
- rfm.recency >= rfm_quantiles.recency.iloc[1],
- rfm.recency >= rfm_quantiles.recency.iloc[0],
- rfm.recency <= rfm_quantiles.recency.iloc[0],
- ]
- frequency_conditions = [
- rfm.frequency <= rfm_quantiles.frequency.iloc[0],
- rfm.frequency <= rfm_quantiles.frequency.iloc[1],
- rfm.frequency <= rfm_quantiles.frequency.iloc[2],
- rfm.frequency <= rfm_quantiles.frequency.iloc[3],
- rfm.frequency >= rfm_quantiles.frequency.iloc[3],
- ]
- monetary_conditions = [
- rfm.monetary <= rfm_quantiles.monetary.iloc[0],
- rfm.monetary <= rfm_quantiles.monetary.iloc[1],
- rfm.monetary <= rfm_quantiles.monetary.iloc[2],
- rfm.monetary <= rfm_quantiles.monetary.iloc[3],
- rfm.monetary >= rfm_quantiles.monetary.iloc[3],
- ]
- ranks = [1, 2, 3, 4, 5]
- rfm["r"] = np.select(recency_conditions, ranks, "other")
- rfm["f"] = np.select(frequency_conditions, ranks, "other")
- rfm["m"] = np.select(monetary_conditions, ranks, "other")
- rfm["segment"] = rfm["r"].astype(str).add(rfm["f"].astype(str))
- segment_map = {
- r"[1-2][1-2]": "hibernating",
- r"[1-2][3-4]": "at risk",
- r"[1-2]5": "cannot lose",
- r"3[1-2]": "about to sleep",
- r"33": "need attention",
- r"[3-4][4-5]": "loyal customers",
- r"41": "promising",
- r"51": "new customers",
- r"[4-5][2-3]": "potential loyalists",
- r"5[4-5]": "champions",
- }
- rfm["segment"] = rfm.segment.replace(segment_map, regex=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement