Python計算商品復購率

若如初見kk發表於2020-12-27

1. Python計算產品復購率

需求:

給出資料商品購買資料,資料格式.csv,包含:購買月份、手機號,根據該資料計算產品的復購率。

復購率演算法:

  1. 演算法一:單位時間內(按每月):R = 復購人數/總購買人數
  2. 演算法二:單位時間內(按每月):R = 復購交易次數/總交易次數

部分資料樣式如下:
在這裡插入圖片描述

2.參考程式碼

# coding = utf-8
import pandas as pd
import time


class RepurchaseRate(object):
    """1.普通配置電腦百萬條資料執行時間在20min左右;
       2.此版本版本包含 2 種計算方法;
    """

    def cal_repurchase_rate(self, method):
        """復購率計算"""
        if method == 1:
            # 演算法一:單位時間內(按每月):R = 復購人數/總購買人數
            total_transactions_dict, data_dict = self.data_processing(1)
        elif method == 2:
            # 演算法二:單位時間內:R = 復購交易次數/總交易次數
            total_transactions_dict, data_dict = self.data_processing(2)
        # 復購交易總數表:字典
        repurchase_transactions_dict = {}
        # 對應月份表
        month_list = []
        # 對每月總交易數進行遍歷並進行比較,得出每月復購交易數
        for month1 in data_dict.keys():
            repurchase_transactions_list = []  # 每月復購交易數列表
            # 計算每個月在所有月份的復購交易數
            for month2 in data_dict.keys():
                month_list.append(month2)
                # 判斷month2對month1是否為後一個月,如果是,則進入復購數計算
                if month2 > month1:
                    i = 0
                    # 對month1來說,計算month2裡有多少交易復購的
                    for num in data_dict[month2]:
                        # 該交易資料(手機號)在month1中出現,則認為是復購的,計數器+1
                        if num in data_dict[month1]:
                            i += 1
                    # 將month2中復購資料新增到復購交易列表
                    repurchase_transactions_list.append(i)
                # 如果month2對month1是前一個月,則復購數計為 0,並新增到復購交易列表進行佔位,方便後續計算
                else:
                    repurchase_transactions_list.append(0)
            # 將對應月份列表加入到復購交易資料中,方便後續計算或檢視
            repurchase_transactions_dict['month'] = month_list
            # 將每月復購交易數列表加入到復購交易數總表中
            repurchase_transactions_dict[month1] = repurchase_transactions_list

        # 計算復購率:R
        repurchase_rate_dict = {}  # 復購率總表
        month_list = []  # 對應月份
        # 對每月總交易數進行遍歷
        for key1, value1 in total_transactions_dict.items():
            month_list.append(key1)
            repurchase_rate_list = []  # 每月復購率列表
            # 對每月復購交易數進行遍歷
            for key2, value2 in repurchase_transactions_dict.items():
                if key1 == key2:
                    for num in value2:
                        # 計算每月復購率,格式化輸出,按百分比儲存,保留小數點後2位
                        repurchase_rate = format(num/value1, '.2%')
                        repurchase_rate_list.append(repurchase_rate)
            # 加入相對應的月份列表,方便後續計算或檢視
            repurchase_rate_dict['month'] = month_list
            # 將每月復購率加入到復購率總表
            repurchase_rate_dict[key1] = repurchase_rate_list
        return repurchase_rate_dict

    def data_processing(self, x):
        """資料處理:刪除缺失值、對資料進行去重、按月對資料進行分組等"""
        # 讀取檔案
        raw_data = pd.read_csv('./repurchase_data')
        # 判斷缺失值是否存在,存在就刪除該條(行)資料
        i = 0
        while i < raw_data.shape[0]:
            if pd.isnull(raw_data['收貨手機'][i]):
                # 根據行索引來刪除該條資料,axis=0 代表行
                raw_data = raw_data.drop(i, axis=0)
            i += 1

        # 通過對訂貨年月分組得出所有月份和每月總交易數、每月購買人數
        # 每月總交易數:不去重資料
        total_transactions = raw_data.groupby(['訂貨年月']).count()
        # 將Dateframe資料轉化為字典
        total_transactions_dict = total_transactions.to_dict()
        total_transactions_dict = total_transactions_dict['收貨手機']

        # 每月購買人數:去重資料
        total_buyers = raw_data.groupby(['訂貨年月']).收貨手機.nunique()
        # 將Dataframe資料轉化為字典
        total_buyers_dict = total_buyers.to_dict()

        # 按月對資料進行分組,交易次數為不去重資料,購買人數為去重資料
        # 將raw_data轉化成字典
        raw_data_dict = raw_data.to_dict()
        # 這裡一個手機號即代表一個交易訂單,即按月篩選手機號,存入字典
        data_dict = {}  # 不去重資料:交易次數
        uniq_data_dict = {}  # 去重資料:購買人數
        month_list = [x for x in total_transactions_dict.keys()]
        # 按月遍歷新增交易資料
        for month in month_list:
            num_list = []  # 不去重列表
            uniq_num_list = []  # 去重列表
            for key,value in raw_data_dict['訂貨年月'].items():
                # 如果是這個月的交易資料,則加入列表
                if value == month:
                    num_list.append(raw_data_dict['收貨手機'][key])  # 不去重:交易數
                    if raw_data_dict['收貨手機'][key] not in uniq_num_list:
                        uniq_num_list.append(raw_data_dict['收貨手機'][key])  # 去重:購買人數
            data_dict[month] = num_list
            uniq_data_dict[month] = uniq_num_list

        # 測試程式用
        print('資料處理完成!')

        if x == 1:
            return total_buyers_dict, uniq_data_dict
        elif x == 2:
            return total_transactions_dict, data_dict
        else:
            print('請輸入數字1或者2')


def main():
    # 開始計時
    time_start = time.time()
    print('開始計時。。。')
    repurchase_rate = RepurchaseRate()
    result = repurchase_rate.cal_repurchase_rate(1)
    print('計時結束!!!')
    time_end = time.time()
    # 執行所花的時間
    time_c = time_end - time_start
    print(result)
    print('本次計算耗時:%d 秒' % time_c)


if __name__ == "__main__":
    main()

相關文章