Python Скрипт с отказом квартилей - PullRequest
2 голосов
/ 08 июля 2020

Я получаю несколько python ошибок, когда пытаюсь запустить скрипт - мне было интересно, может ли кто-нибудь дать представление о том, что я делаю неправильно. Я пытаюсь учиться на работе и борюсь с устранением неполадок как новичок. Если у кого-то есть минутка, хотелось бы немного поработать.

Это адаптация сценария, который я нашел здесь Джоаолом Коррейра. https://github.com/joaolcorreia/RFM-analysis

здесь сообщение об ошибке

здесь код:

    import sys, getopt
import pandas as pd
from datetime import datetime


def main(argv):
    inputfile = 'sample-orders.csv'
    outputfile = 'rfm-segments.csv'
    inputdate = '2020-07-08'

    try:
        opts, args = getopt.getopt(argv, "hi:o:d:")
    except getopt.GetoptError:
        sys.exit(2)
    for opt, arg in opts:
        if opt == '-h':
            sys.exit()
        elif opt in ("-i", "--ifile"):
            inputfile = arg
        elif opt in ("-o", "--ofile"):
            outputfile = arg
        elif opt in ("-d", "--dinputdate"):
            inputdate = arg

    rfm(inputfile, outputfile, inputdate)


def rfm(inputfile, outputfile, inputdate):

    NOW = datetime.strptime(inputdate, "%Y-%m-%d")

    # Open orders file
    orders = pd.read_csv(inputfile, sep=',')
    orders['order_date'] = pd.to_datetime(orders['order_date'])

    rfmTable = orders.groupby('customer').agg({'order_date': lambda x: (NOW - x.max()).days,  # Recency
                                               'order_id': lambda x: len(x),  # Frequency
                                               'grand_total': lambda x: x.sum()})  # Monetary Value

    rfmTable['order_date'] = rfmTable['order_date'].astype(int)
    rfmTable.rename(columns={'order_date': 'recency',
                             'order_id': 'frequency',
                             'grand_total': 'monetary_value'}, inplace=True)

    quantiles = rfmTable.quantile(q=[0.25, 0.5, 0.75])
    quantiles = quantiles.to_dict()

    rfmSegmentation = rfmTable

    rfmSegmentation['R_Quartile'] = rfmSegmentation['recency'].apply(RClass, args=('recency', quantiles,))
    rfmSegmentation['F_Quartile'] = rfmSegmentation['frequency'].apply(FMClass, args=('frequency', quantiles,))
    rfmSegmentation['M_Quartile'] = rfmSegmentation['monetary_value'].apply(FMClass, args=('monetary_value', quantiles,))
    rfmSegmentation['RFMClass'] = rfmSegmentation.R_Quartile.map(str) + rfmSegmentation.F_Quartile.map(
        str) + rfmSegmentation.M_Quartile.map(str)

    rfmSegmentation.to_csv(outputfile, sep=',')



# We create two classes for the RFM segmentation since, being high recency is bad, while high frequency and monetary value is good.
# Arguments (x = value, p = recency, monetary_value, frequency, k = quartiles dict)
def RClass(x, p, d):
    if x <= d[p][0.25]:
        return 1
    elif x <= d[p][0.50]:
        return 2
    elif x <= d[p][0.75]:
        return 3
    else:
        return 4


# Arguments (x = value, p = recency, monetary_value, frequency, k = quartiles dict)
def FMClass(x, p, d):
    if x <= d[p][0.25]:
        return 4
    elif x <= d[p][0.50]:
        return 3
    elif x <= d[p][0.75]:
        return 2
    else:
        return 1


if __name__ == "__main__":
    main(sys.argv[1:])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...