背景:本人想用python是想解决下办公自动化的问题。现在有一组时间序列数据,比如下图
# 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)
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支持。
前面的答案解决你的问题了没,没的话我这边试下
如果上面的答案已经满足你需求了,这边就不再尝试了。