book_annual_expect_profit.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. import pandas as pd
  2. from model.DataBaseUtils import CkUtils,MysqlUtils
  3. import numpy as np
  4. from model.DateUtils import DateUtils
  5. import matplotlib.pyplot as plt
  6. from scipy.optimize import curve_fit
  7. import time
  8. plt.rcParams['font.sans-serif']=['SimHei']
  9. plt.rcParams['axes.unicode_minus'] = False
  10. ck=CkUtils()
  11. db = MysqlUtils()
  12. du=DateUtils()
  13. def run():
  14. sql="""select
  15. book,type,
  16. round(sum(w1)/sum(if(dt>=subtractDays(today(),5),0,a1)),2) wa1,
  17. round(sum(w2)/sum(if(dt>=subtractDays(today(),12),0,a1)),2) wa2,
  18. round(sum(w3)/sum(if(dt>=subtractDays(today(),19),0,a1)),2) wa3,
  19. round(sum(w4)/sum(if(dt>=subtractDays(today(),26),0,a1)),2) wa4,
  20. round(sum(w5)/sum(if(dt>=subtractDays(today(),33),0,a1)),2) wa5,
  21. round(sum(w6)/sum(if(dt>=subtractDays(today(),40),0,a1)),2) wa6,
  22. round(sum(w7)/sum(if(dt>=subtractDays(today(),47),0,a1)),2) wa7,
  23. round(sum(w8)/sum(if(dt>=subtractDays(today(),54),0,a1)),2) wa8,
  24. round(sum(w9)/sum(if(dt>=subtractDays(today(),61),0,a1)),2) wa9,
  25. round(sum(w10)/sum(if(dt>=subtractDays(today(),68),0,a1)),2) wa10,
  26. round(sum(w11)/sum(if(dt>=subtractDays(today(),75),0,a1)),2) wa11,
  27. round(sum(w12)/sum(if(dt>=subtractDays(today(),82),0,a1)),2) wa12,
  28. round(sum(w13)/sum(if(dt>=subtractDays(today(),89),0,a1)),2) wa13,
  29. round(sum(w14)/sum(if(dt>=subtractDays(today(),96),0,a1)),2) wa14,
  30. round(sum(w15)/sum(if(dt>=subtractDays(today(),103),0,a1)),2) wa15,
  31. round(sum(w16)/sum(if(dt>=subtractDays(today(),110),0,a1)),2) wa16,
  32. round(sum(w17)/sum(if(dt>=subtractDays(today(),117),0,a1)),2) wa17,
  33. round(sum(w18)/sum(if(dt>=subtractDays(today(),124),0,a1)),2) wa18,
  34. round(sum(w19)/sum(if(dt>=subtractDays(today(),131),0,a1)),2) wa19,
  35. round(sum(w20)/sum(if(dt>=subtractDays(today(),138),0,a1)),2) wa20,
  36. round(sum(w21)/sum(if(dt>=subtractDays(today(),145),0,a1)),2) wa21,
  37. round(sum(w22)/sum(if(dt>=subtractDays(today(),152),0,a1)),2) wa22,
  38. round(sum(w23)/sum(if(dt>=subtractDays(today(),159),0,a1)),2) wa23,
  39. round(sum(w24)/sum(if(dt>=subtractDays(today(),166),0,a1)),2) wa24,
  40. round(sum(w25)/sum(if(dt>=subtractDays(today(),173),0,a1)),2) wa25,
  41. round(sum(w26)/sum(if(dt>=subtractDays(today(),180),0,a1)),2) wa26,
  42. round(sum(w27)/sum(if(dt>=subtractDays(today(),187),0,a1)),2) wa27,
  43. round(sum(w28)/sum(if(dt>=subtractDays(today(),194),0,a1)),2) wa28,
  44. round(sum(w29)/sum(if(dt>=subtractDays(today(),201),0,a1)),2) wa29,
  45. round(sum(w30)/sum(if(dt>=subtractDays(today(),208),0,a1)),2) wa30,
  46. round(sum(w31)/sum(if(dt>=subtractDays(today(),215),0,a1)),2) wa31,
  47. round(sum(w32)/sum(if(dt>=subtractDays(today(),222),0,a1)),2) wa32,
  48. round(sum(w33)/sum(if(dt>=subtractDays(today(),229),0,a1)),2) wa33,
  49. round(sum(w34)/sum(if(dt>=subtractDays(today(),236),0,a1)),2) wa34,
  50. round(sum(w35)/sum(if(dt>=subtractDays(today(),243),0,a1)),2) wa35,
  51. round(sum(w36)/sum(if(dt>=subtractDays(today(),250),0,a1)),2) wa36,
  52. round(sum(w37)/sum(if(dt>=subtractDays(today(),257),0,a1)),2) wa37,
  53. round(sum(w38)/sum(if(dt>=subtractDays(today(),264),0,a1)),2) wa38,
  54. round(sum(w39)/sum(if(dt>=subtractDays(today(),271),0,a1)),2) wa39,
  55. round(sum(w40)/sum(if(dt>=subtractDays(today(),278),0,a1)),2) wa40,
  56. round(sum(w41)/sum(if(dt>=subtractDays(today(),285),0,a1)),2) wa41,
  57. round(sum(w42)/sum(if(dt>=subtractDays(today(),292),0,a1)),2) wa42,
  58. round(sum(w43)/sum(if(dt>=subtractDays(today(),299),0,a1)),2) wa43,
  59. round(sum(w44)/sum(if(dt>=subtractDays(today(),306),0,a1)),2) wa44,
  60. round(sum(w45)/sum(if(dt>=subtractDays(today(),313),0,a1)),2) wa45,
  61. round(sum(w46)/sum(if(dt>=subtractDays(today(),320),0,a1)),2) wa46,
  62. round(sum(w47)/sum(if(dt>=subtractDays(today(),327),0,a1)),2) wa47,
  63. round(sum(w48)/sum(if(dt>=subtractDays(today(),334),0,a1)),2) wa48,
  64. round(sum(w49)/sum(if(dt>=subtractDays(today(),341),0,a1)),2) wa49,
  65. round(sum(w50)/sum(if(dt>=subtractDays(today(),348),0,a1)),2) wa50,
  66. round(sum(w51)/sum(if(dt>=subtractDays(today(),355),0,a1)),2) wa51,
  67. round(sum(w52)/sum(if(dt>=subtractDays(today(),362),0,a1)),2) wa52
  68. from dw_daily_channel a
  69. left outer join
  70. (select toDate(formatDateTime(reg_time,'%Y-%m-%d')) as dt,
  71. channel as channel,
  72. sum(if(subtractDays(date, 1)>=toDate(reg_time),0,amount)) as a1,
  73. if(dt<subtractDays(today(), 5), sum(if(subtractDays(date, 7)>=toDate(reg_time),0,amount)),null) as w1,
  74. if(dt<subtractDays(today(), 12), sum(if(subtractDays(date, 14)>=toDate(reg_time),0,amount)),null) as w2,
  75. if(dt<subtractDays(today(), 19), sum(if(subtractDays(date, 21)>=toDate(reg_time),0,amount)),null) as w3,
  76. if(dt<subtractDays(today(), 26), sum(if(subtractDays(date, 28)>=toDate(reg_time),0,amount)),null) as w4,
  77. if(dt<subtractDays(today(), 33), sum(if(subtractDays(date, 35)>=toDate(reg_time),0,amount)),null) as w5,
  78. if(dt<subtractDays(today(), 40), sum(if(subtractDays(date, 42)>=toDate(reg_time),0,amount)),null) as w6,
  79. if(dt<subtractDays(today(), 47), sum(if(subtractDays(date, 49)>=toDate(reg_time),0,amount)),null) as w7,
  80. if(dt<subtractDays(today(), 54), sum(if(subtractDays(date, 56)>=toDate(reg_time),0,amount)),null) as w8,
  81. if(dt<subtractDays(today(), 61), sum(if(subtractDays(date, 63)>=toDate(reg_time),0,amount)),null) as w9,
  82. if(dt<subtractDays(today(), 68), sum(if(subtractDays(date, 70)>=toDate(reg_time),0,amount)),null) as w10,
  83. if(dt<subtractDays(today(), 75), sum(if(subtractDays(date, 77)>=toDate(reg_time),0,amount)),null) as w11,
  84. if(dt<subtractDays(today(), 82), sum(if(subtractDays(date, 84)>=toDate(reg_time),0,amount)),null) as w12,
  85. if(dt<subtractDays(today(), 89), sum(if(subtractDays(date, 91)>=toDate(reg_time),0,amount)),null) as w13,
  86. if(dt<subtractDays(today(), 96), sum(if(subtractDays(date, 98)>=toDate(reg_time),0,amount)),null) as w14,
  87. if(dt<subtractDays(today(), 103), sum(if(subtractDays(date, 105)>=toDate(reg_time),0,amount)),null) as w15,
  88. if(dt<subtractDays(today(), 110), sum(if(subtractDays(date, 112)>=toDate(reg_time),0,amount)),null) as w16,
  89. if(dt<subtractDays(today(), 117), sum(if(subtractDays(date, 119)>=toDate(reg_time),0,amount)),null) as w17,
  90. if(dt<subtractDays(today(), 124), sum(if(subtractDays(date, 126)>=toDate(reg_time),0,amount)),null) as w18,
  91. if(dt<subtractDays(today(), 131), sum(if(subtractDays(date, 133)>=toDate(reg_time),0,amount)),null) as w19,
  92. if(dt<subtractDays(today(), 138), sum(if(subtractDays(date, 140)>=toDate(reg_time),0,amount)),null) as w20,
  93. if(dt<subtractDays(today(), 145), sum(if(subtractDays(date, 147)>=toDate(reg_time),0,amount)),null) as w21,
  94. if(dt<subtractDays(today(), 152), sum(if(subtractDays(date, 154)>=toDate(reg_time),0,amount)),null) as w22,
  95. if(dt<subtractDays(today(), 159), sum(if(subtractDays(date, 161)>=toDate(reg_time),0,amount)),null) as w23,
  96. if(dt<subtractDays(today(), 166), sum(if(subtractDays(date, 168)>=toDate(reg_time),0,amount)),null) as w24,
  97. if(dt<subtractDays(today(), 173), sum(if(subtractDays(date, 175)>=toDate(reg_time),0,amount)),null) as w25,
  98. if(dt<subtractDays(today(), 180), sum(if(subtractDays(date, 182)>=toDate(reg_time),0,amount)),null) as w26,
  99. if(dt<subtractDays(today(), 187), sum(if(subtractDays(date, 189)>=toDate(reg_time),0,amount)),null) as w27,
  100. if(dt<subtractDays(today(), 194), sum(if(subtractDays(date, 196)>=toDate(reg_time),0,amount)),null) as w28,
  101. if(dt<subtractDays(today(), 201), sum(if(subtractDays(date, 203)>=toDate(reg_time),0,amount)),null) as w29,
  102. if(dt<subtractDays(today(), 208), sum(if(subtractDays(date, 210)>=toDate(reg_time),0,amount)),null) as w30,
  103. if(dt<subtractDays(today(), 215), sum(if(subtractDays(date, 217)>=toDate(reg_time),0,amount)),null) as w31,
  104. if(dt<subtractDays(today(), 222), sum(if(subtractDays(date, 224)>=toDate(reg_time),0,amount)),null) as w32,
  105. if(dt<subtractDays(today(), 229), sum(if(subtractDays(date, 231)>=toDate(reg_time),0,amount)),null) as w33,
  106. if(dt<subtractDays(today(), 236), sum(if(subtractDays(date, 238)>=toDate(reg_time),0,amount)),null) as w34,
  107. if(dt<subtractDays(today(), 243), sum(if(subtractDays(date, 245)>=toDate(reg_time),0,amount)),null) as w35,
  108. if(dt<subtractDays(today(), 250), sum(if(subtractDays(date, 252)>=toDate(reg_time),0,amount)),null) as w36,
  109. if(dt<subtractDays(today(), 257), sum(if(subtractDays(date, 259)>=toDate(reg_time),0,amount)),null) as w37,
  110. if(dt<subtractDays(today(), 264), sum(if(subtractDays(date, 266)>=toDate(reg_time),0,amount)),null) as w38,
  111. if(dt<subtractDays(today(), 271), sum(if(subtractDays(date, 273)>=toDate(reg_time),0,amount)),null) as w39,
  112. if(dt<subtractDays(today(), 278), sum(if(subtractDays(date, 280)>=toDate(reg_time),0,amount)),null) as w40,
  113. if(dt<subtractDays(today(), 285), sum(if(subtractDays(date, 287)>=toDate(reg_time),0,amount)),null) as w41,
  114. if(dt<subtractDays(today(), 292), sum(if(subtractDays(date, 294)>=toDate(reg_time),0,amount)),null) as w42,
  115. if(dt<subtractDays(today(), 299), sum(if(subtractDays(date, 301)>=toDate(reg_time),0,amount)),null) as w43,
  116. if(dt<subtractDays(today(), 306), sum(if(subtractDays(date, 308)>=toDate(reg_time),0,amount)),null) as w44,
  117. if(dt<subtractDays(today(), 313), sum(if(subtractDays(date, 315)>=toDate(reg_time),0,amount)),null) as w45,
  118. if(dt<subtractDays(today(), 320), sum(if(subtractDays(date, 322)>=toDate(reg_time),0,amount)),null) as w46,
  119. if(dt<subtractDays(today(), 327), sum(if(subtractDays(date, 329)>=toDate(reg_time),0,amount)),null) as w47,
  120. if(dt<subtractDays(today(), 334), sum(if(subtractDays(date, 336)>=toDate(reg_time),0,amount)),null) as w48,
  121. if(dt<subtractDays(today(), 341), sum(if(subtractDays(date, 343)>=toDate(reg_time),0,amount)),null) as w49,
  122. if(dt<subtractDays(today(), 348), sum(if(subtractDays(date, 350)>=toDate(reg_time),0,amount)),null) as w50,
  123. if(dt<subtractDays(today(), 355), sum(if(subtractDays(date, 357)>=toDate(reg_time),0,amount)),null) as w51,
  124. if(dt<subtractDays(today(), 362), sum(if(subtractDays(date, 364)>=toDate(reg_time),0,amount)),null) as w52
  125. from order a
  126. where reg_time>'2019-03-18 00:00:00' group by toDate(formatDateTime(reg_time,'%Y-%m-%d')),channel) b using (dt,channel)
  127. where cost>0 and a1>0 and book!=''
  128. group by book,type
  129. """
  130. 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',]
  131. # df =ck.getData_pd(sql,col=col)
  132. # print(df)
  133. # df.to_csv('./book.csv',encoding='utf-8')
  134. df = ck.execute(sql)
  135. # print(df)
  136. li = [list(i) for i in df]
  137. # print(li)
  138. li2=[]
  139. for i in li:
  140. w = []
  141. w.append(i[0])
  142. w.append(i[1])
  143. x=1
  144. for j in i[2:]:
  145. if j is None:
  146. break
  147. if j>=x:
  148. w.append(j)
  149. x=j
  150. else:
  151. break
  152. li2.append(w)
  153. # print(li2)
  154. li4=[]
  155. for i in li2:
  156. li3=[]
  157. if len(i)<5:
  158. continue
  159. # print(i[0])
  160. y = np.array(i[2:])
  161. x = np.array([n for n in range(2,len(i))])
  162. # print(x,y)
  163. try:
  164. popt, pcov = curve_fit(func, x, y)
  165. # print(popt[0])
  166. if popt[0]<0:
  167. continue
  168. # print(i[0])
  169. # yvals = func(x, popt[0], popt[1], popt[2]) # 拟合y值
  170. li3.append(i[0])
  171. li3.append(i[1])
  172. li3.append(round(func(52, popt[0], popt[1], popt[2]),2))
  173. # di[i[0]]=round(func(52, popt[0], popt[1], popt[2]),2)
  174. # print(di)
  175. li4.append(li3)
  176. # 画图
  177. # plot1 = plt.plot(x, y, 's', label='original values')
  178. # plot2 = plt.plot(x, yvals, 'r', label='polyfit values')
  179. # plt.xlabel('x')
  180. # plt.ylabel('y')
  181. # plt.legend(loc=4) # 指定legend的位置右下角
  182. # plt.title(i[0])
  183. # plt.show()
  184. # time.sleep(1)
  185. except:
  186. print(i[0],i[1],'找不到解')
  187. print(li4)
  188. print(li4.__len__())
  189. update_data(li4)
  190. def func(x,a,b,k):
  191. return 1/(a*b**x+k)
  192. def update_data(data):
  193. dt =du.getNow()
  194. for i in data:
  195. book = i[0]
  196. type= i[1]
  197. mult = i[2]
  198. db.dm.execute(f"update src_book_info set annual_mult={mult} where book='{book}' and type ='{type}'")
  199. if __name__ == '__main__':
  200. # x=""
  201. # for i in range(1,53):
  202. # x+=f"'w{i}',"
  203. # print(x)
  204. run()
  205. # print(fuc(1,2,3,4))