123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- import pandas as pd
- from model.DataBaseUtils import CkUtils,MysqlUtils
- import numpy as np
- from model.DateUtils import DateUtils
- import matplotlib.pyplot as plt
- from scipy.optimize import curve_fit
- import time
- plt.rcParams['font.sans-serif']=['SimHei']
- plt.rcParams['axes.unicode_minus'] = False
- ck=CkUtils()
- db = MysqlUtils()
- du=DateUtils()
- def run():
- sql="""select
- book,type,
- round(sum(w1)/sum(if(dt>=subtractDays(today(),5),0,a1)),2) wa1,
- round(sum(w2)/sum(if(dt>=subtractDays(today(),12),0,a1)),2) wa2,
- round(sum(w3)/sum(if(dt>=subtractDays(today(),19),0,a1)),2) wa3,
- round(sum(w4)/sum(if(dt>=subtractDays(today(),26),0,a1)),2) wa4,
- round(sum(w5)/sum(if(dt>=subtractDays(today(),33),0,a1)),2) wa5,
- round(sum(w6)/sum(if(dt>=subtractDays(today(),40),0,a1)),2) wa6,
- round(sum(w7)/sum(if(dt>=subtractDays(today(),47),0,a1)),2) wa7,
- round(sum(w8)/sum(if(dt>=subtractDays(today(),54),0,a1)),2) wa8,
- round(sum(w9)/sum(if(dt>=subtractDays(today(),61),0,a1)),2) wa9,
- round(sum(w10)/sum(if(dt>=subtractDays(today(),68),0,a1)),2) wa10,
- round(sum(w11)/sum(if(dt>=subtractDays(today(),75),0,a1)),2) wa11,
- round(sum(w12)/sum(if(dt>=subtractDays(today(),82),0,a1)),2) wa12,
- round(sum(w13)/sum(if(dt>=subtractDays(today(),89),0,a1)),2) wa13,
- round(sum(w14)/sum(if(dt>=subtractDays(today(),96),0,a1)),2) wa14,
- round(sum(w15)/sum(if(dt>=subtractDays(today(),103),0,a1)),2) wa15,
- round(sum(w16)/sum(if(dt>=subtractDays(today(),110),0,a1)),2) wa16,
- round(sum(w17)/sum(if(dt>=subtractDays(today(),117),0,a1)),2) wa17,
- round(sum(w18)/sum(if(dt>=subtractDays(today(),124),0,a1)),2) wa18,
- round(sum(w19)/sum(if(dt>=subtractDays(today(),131),0,a1)),2) wa19,
- round(sum(w20)/sum(if(dt>=subtractDays(today(),138),0,a1)),2) wa20,
- round(sum(w21)/sum(if(dt>=subtractDays(today(),145),0,a1)),2) wa21,
- round(sum(w22)/sum(if(dt>=subtractDays(today(),152),0,a1)),2) wa22,
- round(sum(w23)/sum(if(dt>=subtractDays(today(),159),0,a1)),2) wa23,
- round(sum(w24)/sum(if(dt>=subtractDays(today(),166),0,a1)),2) wa24,
- round(sum(w25)/sum(if(dt>=subtractDays(today(),173),0,a1)),2) wa25,
- round(sum(w26)/sum(if(dt>=subtractDays(today(),180),0,a1)),2) wa26,
- round(sum(w27)/sum(if(dt>=subtractDays(today(),187),0,a1)),2) wa27,
- round(sum(w28)/sum(if(dt>=subtractDays(today(),194),0,a1)),2) wa28,
- round(sum(w29)/sum(if(dt>=subtractDays(today(),201),0,a1)),2) wa29,
- round(sum(w30)/sum(if(dt>=subtractDays(today(),208),0,a1)),2) wa30,
- round(sum(w31)/sum(if(dt>=subtractDays(today(),215),0,a1)),2) wa31,
- round(sum(w32)/sum(if(dt>=subtractDays(today(),222),0,a1)),2) wa32,
- round(sum(w33)/sum(if(dt>=subtractDays(today(),229),0,a1)),2) wa33,
- round(sum(w34)/sum(if(dt>=subtractDays(today(),236),0,a1)),2) wa34,
- round(sum(w35)/sum(if(dt>=subtractDays(today(),243),0,a1)),2) wa35,
- round(sum(w36)/sum(if(dt>=subtractDays(today(),250),0,a1)),2) wa36,
- round(sum(w37)/sum(if(dt>=subtractDays(today(),257),0,a1)),2) wa37,
- round(sum(w38)/sum(if(dt>=subtractDays(today(),264),0,a1)),2) wa38,
- round(sum(w39)/sum(if(dt>=subtractDays(today(),271),0,a1)),2) wa39,
- round(sum(w40)/sum(if(dt>=subtractDays(today(),278),0,a1)),2) wa40,
- round(sum(w41)/sum(if(dt>=subtractDays(today(),285),0,a1)),2) wa41,
- round(sum(w42)/sum(if(dt>=subtractDays(today(),292),0,a1)),2) wa42,
- round(sum(w43)/sum(if(dt>=subtractDays(today(),299),0,a1)),2) wa43,
- round(sum(w44)/sum(if(dt>=subtractDays(today(),306),0,a1)),2) wa44,
- round(sum(w45)/sum(if(dt>=subtractDays(today(),313),0,a1)),2) wa45,
- round(sum(w46)/sum(if(dt>=subtractDays(today(),320),0,a1)),2) wa46,
- round(sum(w47)/sum(if(dt>=subtractDays(today(),327),0,a1)),2) wa47,
- round(sum(w48)/sum(if(dt>=subtractDays(today(),334),0,a1)),2) wa48,
- round(sum(w49)/sum(if(dt>=subtractDays(today(),341),0,a1)),2) wa49,
- round(sum(w50)/sum(if(dt>=subtractDays(today(),348),0,a1)),2) wa50,
- round(sum(w51)/sum(if(dt>=subtractDays(today(),355),0,a1)),2) wa51,
- round(sum(w52)/sum(if(dt>=subtractDays(today(),362),0,a1)),2) wa52
- from dw_daily_channel a
- left outer join
- (select toDate(formatDateTime(reg_time,'%Y-%m-%d')) as dt,
- channel as channel,
- sum(if(subtractDays(date, 1)>=toDate(reg_time),0,amount)) as a1,
- if(dt<subtractDays(today(), 5), sum(if(subtractDays(date, 7)>=toDate(reg_time),0,amount)),null) as w1,
- if(dt<subtractDays(today(), 12), sum(if(subtractDays(date, 14)>=toDate(reg_time),0,amount)),null) as w2,
- if(dt<subtractDays(today(), 19), sum(if(subtractDays(date, 21)>=toDate(reg_time),0,amount)),null) as w3,
- if(dt<subtractDays(today(), 26), sum(if(subtractDays(date, 28)>=toDate(reg_time),0,amount)),null) as w4,
- if(dt<subtractDays(today(), 33), sum(if(subtractDays(date, 35)>=toDate(reg_time),0,amount)),null) as w5,
- if(dt<subtractDays(today(), 40), sum(if(subtractDays(date, 42)>=toDate(reg_time),0,amount)),null) as w6,
- if(dt<subtractDays(today(), 47), sum(if(subtractDays(date, 49)>=toDate(reg_time),0,amount)),null) as w7,
- if(dt<subtractDays(today(), 54), sum(if(subtractDays(date, 56)>=toDate(reg_time),0,amount)),null) as w8,
- if(dt<subtractDays(today(), 61), sum(if(subtractDays(date, 63)>=toDate(reg_time),0,amount)),null) as w9,
- if(dt<subtractDays(today(), 68), sum(if(subtractDays(date, 70)>=toDate(reg_time),0,amount)),null) as w10,
- if(dt<subtractDays(today(), 75), sum(if(subtractDays(date, 77)>=toDate(reg_time),0,amount)),null) as w11,
- if(dt<subtractDays(today(), 82), sum(if(subtractDays(date, 84)>=toDate(reg_time),0,amount)),null) as w12,
- if(dt<subtractDays(today(), 89), sum(if(subtractDays(date, 91)>=toDate(reg_time),0,amount)),null) as w13,
- if(dt<subtractDays(today(), 96), sum(if(subtractDays(date, 98)>=toDate(reg_time),0,amount)),null) as w14,
- if(dt<subtractDays(today(), 103), sum(if(subtractDays(date, 105)>=toDate(reg_time),0,amount)),null) as w15,
- if(dt<subtractDays(today(), 110), sum(if(subtractDays(date, 112)>=toDate(reg_time),0,amount)),null) as w16,
- if(dt<subtractDays(today(), 117), sum(if(subtractDays(date, 119)>=toDate(reg_time),0,amount)),null) as w17,
- if(dt<subtractDays(today(), 124), sum(if(subtractDays(date, 126)>=toDate(reg_time),0,amount)),null) as w18,
- if(dt<subtractDays(today(), 131), sum(if(subtractDays(date, 133)>=toDate(reg_time),0,amount)),null) as w19,
- if(dt<subtractDays(today(), 138), sum(if(subtractDays(date, 140)>=toDate(reg_time),0,amount)),null) as w20,
- if(dt<subtractDays(today(), 145), sum(if(subtractDays(date, 147)>=toDate(reg_time),0,amount)),null) as w21,
- if(dt<subtractDays(today(), 152), sum(if(subtractDays(date, 154)>=toDate(reg_time),0,amount)),null) as w22,
- if(dt<subtractDays(today(), 159), sum(if(subtractDays(date, 161)>=toDate(reg_time),0,amount)),null) as w23,
- if(dt<subtractDays(today(), 166), sum(if(subtractDays(date, 168)>=toDate(reg_time),0,amount)),null) as w24,
- if(dt<subtractDays(today(), 173), sum(if(subtractDays(date, 175)>=toDate(reg_time),0,amount)),null) as w25,
- if(dt<subtractDays(today(), 180), sum(if(subtractDays(date, 182)>=toDate(reg_time),0,amount)),null) as w26,
- if(dt<subtractDays(today(), 187), sum(if(subtractDays(date, 189)>=toDate(reg_time),0,amount)),null) as w27,
- if(dt<subtractDays(today(), 194), sum(if(subtractDays(date, 196)>=toDate(reg_time),0,amount)),null) as w28,
- if(dt<subtractDays(today(), 201), sum(if(subtractDays(date, 203)>=toDate(reg_time),0,amount)),null) as w29,
- if(dt<subtractDays(today(), 208), sum(if(subtractDays(date, 210)>=toDate(reg_time),0,amount)),null) as w30,
- if(dt<subtractDays(today(), 215), sum(if(subtractDays(date, 217)>=toDate(reg_time),0,amount)),null) as w31,
- if(dt<subtractDays(today(), 222), sum(if(subtractDays(date, 224)>=toDate(reg_time),0,amount)),null) as w32,
- if(dt<subtractDays(today(), 229), sum(if(subtractDays(date, 231)>=toDate(reg_time),0,amount)),null) as w33,
- if(dt<subtractDays(today(), 236), sum(if(subtractDays(date, 238)>=toDate(reg_time),0,amount)),null) as w34,
- if(dt<subtractDays(today(), 243), sum(if(subtractDays(date, 245)>=toDate(reg_time),0,amount)),null) as w35,
- if(dt<subtractDays(today(), 250), sum(if(subtractDays(date, 252)>=toDate(reg_time),0,amount)),null) as w36,
- if(dt<subtractDays(today(), 257), sum(if(subtractDays(date, 259)>=toDate(reg_time),0,amount)),null) as w37,
- if(dt<subtractDays(today(), 264), sum(if(subtractDays(date, 266)>=toDate(reg_time),0,amount)),null) as w38,
- if(dt<subtractDays(today(), 271), sum(if(subtractDays(date, 273)>=toDate(reg_time),0,amount)),null) as w39,
- if(dt<subtractDays(today(), 278), sum(if(subtractDays(date, 280)>=toDate(reg_time),0,amount)),null) as w40,
- if(dt<subtractDays(today(), 285), sum(if(subtractDays(date, 287)>=toDate(reg_time),0,amount)),null) as w41,
- if(dt<subtractDays(today(), 292), sum(if(subtractDays(date, 294)>=toDate(reg_time),0,amount)),null) as w42,
- if(dt<subtractDays(today(), 299), sum(if(subtractDays(date, 301)>=toDate(reg_time),0,amount)),null) as w43,
- if(dt<subtractDays(today(), 306), sum(if(subtractDays(date, 308)>=toDate(reg_time),0,amount)),null) as w44,
- if(dt<subtractDays(today(), 313), sum(if(subtractDays(date, 315)>=toDate(reg_time),0,amount)),null) as w45,
- if(dt<subtractDays(today(), 320), sum(if(subtractDays(date, 322)>=toDate(reg_time),0,amount)),null) as w46,
- if(dt<subtractDays(today(), 327), sum(if(subtractDays(date, 329)>=toDate(reg_time),0,amount)),null) as w47,
- if(dt<subtractDays(today(), 334), sum(if(subtractDays(date, 336)>=toDate(reg_time),0,amount)),null) as w48,
- if(dt<subtractDays(today(), 341), sum(if(subtractDays(date, 343)>=toDate(reg_time),0,amount)),null) as w49,
- if(dt<subtractDays(today(), 348), sum(if(subtractDays(date, 350)>=toDate(reg_time),0,amount)),null) as w50,
- if(dt<subtractDays(today(), 355), sum(if(subtractDays(date, 357)>=toDate(reg_time),0,amount)),null) as w51,
- if(dt<subtractDays(today(), 362), sum(if(subtractDays(date, 364)>=toDate(reg_time),0,amount)),null) as w52
- from order a
- where reg_time>'2019-03-18 00:00:00' group by toDate(formatDateTime(reg_time,'%Y-%m-%d')),channel) b using (dt,channel)
- where cost>0 and a1>0 and book!=''
- group by book,type
- """
- col=['book','first_amount','start','end','w1','w2','w3','w4','w5','w6','w7','w8','w9','w10','w11','w12','w13','w14','w15','w16','w17','w18','w19','w20','w21','w22','w23','w24','w25','w26','w27','w28','w29','w30','w31','w32','w33','w34','w35','w36','w37','w38','w39','w40','w41','w42','w43','w44','w45','w46','w47','w48','w49','w50','w51','w52',]
- # df =ck.getData_pd(sql,col=col)
- # print(df)
- # df.to_csv('./book.csv',encoding='utf-8')
- df = ck.execute(sql)
- # print(df)
- li = [list(i) for i in df]
- # print(li)
- li2=[]
- for i in li:
- w = []
- w.append(i[0])
- w.append(i[1])
- x=1
- for j in i[2:]:
- if j is None:
- break
- if j>=x:
- w.append(j)
- x=j
- else:
- break
- li2.append(w)
- # print(li2)
- li4=[]
- for i in li2:
- li3=[]
- if len(i)<5:
- continue
- # print(i[0])
- y = np.array(i[2:])
- x = np.array([n for n in range(2,len(i))])
- # print(x,y)
- try:
- popt, pcov = curve_fit(func, x, y)
- # print(popt[0])
- if popt[0]<0:
- continue
- # print(i[0])
- # yvals = func(x, popt[0], popt[1], popt[2]) # 拟合y值
- li3.append(i[0])
- li3.append(i[1])
- li3.append(round(func(52, popt[0], popt[1], popt[2]),2))
- # di[i[0]]=round(func(52, popt[0], popt[1], popt[2]),2)
- # print(di)
- li4.append(li3)
- # 画图
- # plot1 = plt.plot(x, y, 's', label='original values')
- # plot2 = plt.plot(x, yvals, 'r', label='polyfit values')
- # plt.xlabel('x')
- # plt.ylabel('y')
- # plt.legend(loc=4) # 指定legend的位置右下角
- # plt.title(i[0])
- # plt.show()
- # time.sleep(1)
- except:
- print(i[0],i[1],'找不到解')
- print(li4)
- print(li4.__len__())
- update_data(li4)
- def func(x,a,b,k):
- return 1/(a*b**x+k)
- def update_data(data):
- dt =du.getNow()
- for i in data:
- book = i[0]
- type= i[1]
- mult = i[2]
- db.dm.execute(f"update src_book_info set annual_mult={mult} where book='{book}' and type ='{type}'")
- if __name__ == '__main__':
- # x=""
- # for i in range(1,53):
- # x+=f"'w{i}',"
- # print(x)
- run()
- # print(fuc(1,2,3,4))
|