本月收入决定下个月提成点数的函数写法

问题遇到的现象和发生背景

背景:本人想用python是想解决下办公自动化的问题。现在有一组时间序列数据,比如下图

img


现在是每人当月的revenue决定下个月的rate,100000以内,下个月的提成点是6%,rate=6%;如果100000到200000,那么下个月的提成点是10%,rate=10%;如果本月达到200000以上,那么下个月的提成点是14%。注意是下个月点数。本月的收入决定下个月的提成点数。现在想要用python pandas 编一个函数解决这个问题

# coding=utf-8
import pandas as pd
from datetime import date

date = date.fromisoformat
join = '-'.join


def date2int(d: int) -> int:
    """将数字转换为日期格式,减去一个月,返回6位(YYYYMM)十进制整数。"""
    d = str(d)
    d = d[:4], d[4:], '01'
    d = date(join(d))  # 检验日期数据
    m = d.month - 1
    d = f'{d.year}{m:02}' if m else f'{d.year - 1}12'  # 检验月份
    return int(d)


def rate(rv: float) -> float:
    """依据业绩返回提成比例,默认提成比例返回None"""
    if rv >= 200000:
        return 0.14
    if rv >= 100000:
        return 0.10


def get_rate(tsr, row) -> float:
    """依据上个月业绩取提成比例,没有业绩返回默认提成比例"""
    if sr := tsr.get(date2int(row.time)):
        if rt := sr.get(row.sales):
            return rt
    return 0.06  # 100000以下的默认提成比例


def set_rate(data) -> dict:
    """生成{time:{sales:rate}}数据结构,以优化提成比例的查找性能"""
    tsr = {}
    for row in data.itertuples():
        t = row.time
        sr = {row.sales: rate(row.revenue)}
        if tsr.setdefault(t, sr) is not sr:
            tsr[t].update(sr)
    return tsr


def award(data):
    dt = data.T  # 数据转置,行轴
    tsr = set_rate(data)
    for row in data.itertuples():
        _rate = get_rate(tsr, row)
        dt[row.Index]['rate', 'award'] = _rate, _rate * row.revenue
    return dt.T


if __name__ == '__main__':
    revenue = pd.read_excel(r'C:\pyt.xlsx')
    sales_award = award(revenue)
    print(sales_award)

img


img

Excel的if函数就能解决吧,怎么简单怎么来啊。你非要用pyhton当我没说

这样?


import pandas as pd

data = [['202104',10000,None],['202105',10000,None],['202106',200001,None],['202107',200000,None]]
df = pd.DataFrame(data,columns=['time','revenue', 'rate'])


def js(data):
    if data['revenue_q'] == 0:
        return 0
    elif data['revenue_q'] < 100000:
        return 0.06
    elif data['revenue_q'] <= 200000:
        return 0.1
    else:
        return 0.14
df['revenue_q'] = 0

df.loc[1:,('revenue_q')] = list(df['revenue'][:-1])
df['rate'] = df.apply(js, axis=1)
print(df)

你确定这个问题值100嘛, python 直接吧表里数据读出来, 然后按照你想要的规则 写一点代码, 然后在输出到文件保存,
这样的功能百度一下 就都出来了

这问题,不值100元。

你这个好几年的数据量有多大,超过10W条记录没。(一般用excel存的数据量都不能算大)
如果没超过10W,直接在Excel用公式搞一下就可以了,不用额外Python支持。

前面的答案解决你的问题了没,没的话我这边试下
如果上面的答案已经满足你需求了,这边就不再尝试了。