Advertisement
Guest User

Untitled

a guest
Aug 21st, 2019
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.84 KB | None | 0 0
  1. rfm = (
  2. df.groupby("customer_id")
  3. .agg(
  4. {
  5. "order_date": lambda x: (x.max() - x.min()).days,
  6. "order_id": "nunique",
  7. "price": "mean",
  8. }
  9. )
  10. .rename(
  11. columns={"order_date": "recency", "order_id": "frequency", "price": "monetary"}
  12. )
  13. )
  14.  
  15. rfm_quantiles = rfm.quantile(q=[0.2, 0.4, 0.6, 0.8])
  16.  
  17. recency_conditions = [
  18. rfm.recency >= rfm_quantiles.recency.iloc[3],
  19. rfm.recency >= rfm_quantiles.recency.iloc[2],
  20. rfm.recency >= rfm_quantiles.recency.iloc[1],
  21. rfm.recency >= rfm_quantiles.recency.iloc[0],
  22. rfm.recency <= rfm_quantiles.recency.iloc[0],
  23. ]
  24.  
  25. frequency_conditions = [
  26. rfm.frequency <= rfm_quantiles.frequency.iloc[0],
  27. rfm.frequency <= rfm_quantiles.frequency.iloc[1],
  28. rfm.frequency <= rfm_quantiles.frequency.iloc[2],
  29. rfm.frequency <= rfm_quantiles.frequency.iloc[3],
  30. rfm.frequency >= rfm_quantiles.frequency.iloc[3],
  31. ]
  32.  
  33. monetary_conditions = [
  34. rfm.monetary <= rfm_quantiles.monetary.iloc[0],
  35. rfm.monetary <= rfm_quantiles.monetary.iloc[1],
  36. rfm.monetary <= rfm_quantiles.monetary.iloc[2],
  37. rfm.monetary <= rfm_quantiles.monetary.iloc[3],
  38. rfm.monetary >= rfm_quantiles.monetary.iloc[3],
  39. ]
  40.  
  41. ranks = [1, 2, 3, 4, 5]
  42.  
  43. rfm["r"] = np.select(recency_conditions, ranks, "other")
  44. rfm["f"] = np.select(frequency_conditions, ranks, "other")
  45. rfm["m"] = np.select(monetary_conditions, ranks, "other")
  46.  
  47. rfm["segment"] = rfm["r"].astype(str).add(rfm["f"].astype(str))
  48.  
  49. segment_map = {
  50. r"[1-2][1-2]": "hibernating",
  51. r"[1-2][3-4]": "at risk",
  52. r"[1-2]5": "cannot lose",
  53. r"3[1-2]": "about to sleep",
  54. r"33": "need attention",
  55. r"[3-4][4-5]": "loyal customers",
  56. r"41": "promising",
  57. r"51": "new customers",
  58. r"[4-5][2-3]": "potential loyalists",
  59. r"5[4-5]": "champions",
  60. }
  61.  
  62. rfm["segment"] = rfm.segment.replace(segment_map, regex=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement