sort_dealer.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. # coding=utf-8
  2. import datetime
  3. import pandas as pd
  4. import matplotlib.pyplot as plt
  5. from matplotlib.font_manager import FontProperties
  6. from pylab import mpl
  7. from apps.web.core.bridge.wechat.v3api import WechatApiProxy
  8. from apps.web.core.models import WechatServiceProvider
  9. from apps.web.core.networking import MessageSender
  10. from apps.web.device.models import DeviceDict
  11. from apps.web.merchant.models import MerchantSourceInfo
  12. def make_autopct(total):
  13. def my_autopct(pct):
  14. val = int(round(pct*total/100.0))
  15. # 同时显示数值和占比的饼图
  16. return '{p:.2f}% ({v:d})'.format(p=pct,v=val)
  17. return my_autopct
  18. def parse_data1():
  19. """
  20. 解析数据
  21. """
  22. # 读取数据
  23. df = pd.read_csv("dealerMerchantStatus1.csv", header=0)
  24. # 标准化画布
  25. plt.axes(aspect='equal')
  26. allCount = df.id.count()
  27. #
  28. df.merStatus.value_counts().sort_values().plot.pie(autopct=make_autopct(allCount), fontsize=10, counterclock=False, explode=(0.2,0.3,0.4,0.2, 0))
  29. # df.set_index('merStatus', inplace=True)
  30. plt.title(u'商户开通整体情况', fontsize=16, fontweight='bold')
  31. plt.ylabel(u"发出邀请总人数 {}".format(df["merStatus"].count()), fontsize=16, fontweight='bold')
  32. plt.show()
  33. def parse_data2():
  34. """
  35. 解析数据
  36. """
  37. # 读取数据
  38. df = pd.read_csv("dealerMerchantStatus1.csv", header=0)
  39. # 标准化画布
  40. plt.axes(aspect='equal')
  41. # 条件筛选出未开通商户的
  42. online4 = df[df["merStatus"] == 4].onlineCount.sum()
  43. online3 = df[df["merStatus"] == 3].onlineCount.sum()
  44. online2= df[df["merStatus"] == 2].onlineCount.sum()
  45. online1 = df[df["merStatus"] == 1].onlineCount.sum()
  46. online0 = df[df["merStatus"] == 0].onlineCount.sum()
  47. allOnline = df.onlineCount.sum()
  48. s = pd.Series([
  49. online0,
  50. online1,
  51. online2,
  52. online3,
  53. online4,
  54. ],[
  55. u"未提交资料",
  56. u"京东入驻中",
  57. u"申请失败",
  58. u"申请成功(微信审核)",
  59. u"已经切换"
  60. ]
  61. )
  62. s.sort_values().plot.pie(autopct=make_autopct(allOnline), fontsize=10, counterclock=False, explode=(0.3,0,0,0,0))
  63. plt.title(u"设备分布图", fontsize=16, fontweight='bold')
  64. plt.ylabel(u"设备总数{}".format(allOnline), fontsize=16, fontweight='bold')
  65. #
  66. plt.show()
  67. def parse_data3():
  68. """
  69. 最后登录
  70. """
  71. # 读取数据
  72. df = pd.read_csv("dealerMerchantStatus1.csv", header=0)
  73. # 标准化画布
  74. plt.axes(aspect='equal')
  75. # 找出所有没有提交资料的经销商
  76. df = df[df["merStatus"] == 0]
  77. # 比较登录日期
  78. now = datetime.datetime.now()
  79. login14 = df[df.lastLogin.astype('datetime64') >= now - datetime.timedelta(days=14)].onlineCount.sum()
  80. login15_30 = df[(df.lastLogin.astype('datetime64') < now - datetime.timedelta(days=14)) & (df.lastLogin.astype('datetime64') >= now - datetime.timedelta(days=30))].onlineCount.sum()
  81. login30_90 = df[(df.lastLogin.astype('datetime64') < now - datetime.timedelta(days=30)) & (df.lastLogin.astype('datetime64') >= now - datetime.timedelta(days=90))].onlineCount.sum()
  82. login90 = df[(df.lastLogin.astype('datetime64') < now - datetime.timedelta(days=90))].onlineCount.sum()
  83. allCount = df.onlineCount.sum()
  84. s = pd.Series([
  85. login14,
  86. login15_30,
  87. login30_90,
  88. login90,
  89. ], [
  90. u"14天以内",
  91. u"14天到30天",
  92. u"30天到90天",
  93. u"3个月以上"
  94. ])
  95. s.sort_values().plot.pie(autopct=make_autopct(allCount), fontsize=10, counterclock=False, explode=(0.3,0.3,0.3,0))
  96. plt.title(u"最后登录分布图(设备)", fontsize=16, fontweight='bold')
  97. plt.ylabel(u"总数{}".format(allCount), fontsize=16, fontweight='bold')
  98. #
  99. plt.show()
  100. def parse_data4():
  101. # 读取数据
  102. df = pd.read_csv("dealerMerchantStatus1.csv", header=0)
  103. # 读取所有的里歌经销商ID
  104. with open("lgdid") as f:
  105. lg = f.read().split()
  106. with open('hpdid') as f:
  107. hp = f.read().split()
  108. ids = lg + hp
  109. # 标准化画布
  110. # plt.axes(aspect='equal')
  111. # 分种类经销商
  112. df0 = df[df.merStatus == 0]
  113. df1 = df[df.merStatus == 1]
  114. df2 = df[df.merStatus == 2]
  115. df3 = df[df.merStatus == 3]
  116. df4 = df[df.merStatus == 4]
  117. num_list = [
  118. df0.onlineCount.sum(),
  119. df1.onlineCount.sum(),
  120. df2.onlineCount.sum(),
  121. df3.onlineCount.sum(),
  122. df4.onlineCount.sum(),
  123. ]
  124. num_list1 = [
  125. df0[df0.id.isin(ids)].onlineCount.sum(),
  126. df1[df1.id.isin(ids)].onlineCount.sum(),
  127. df2[df2.id.isin(ids)].onlineCount.sum(),
  128. df3[df3.id.isin(ids)].onlineCount.sum(),
  129. df4[df4.id.isin(ids)].onlineCount.sum(),
  130. ]
  131. # 比较登录日期
  132. name_list = [u"未提交", u"入驻中", u"设备失败", u"入驻成功(微信申请)", u"已切换"]
  133. x = list(range(len(name_list)))
  134. total_width, n = 0.6, 2
  135. width = total_width / n
  136. plt.bar(x, num_list, width=width, label=u"设备总数量", fc="b")
  137. for a, b in zip(x, num_list): # 柱子上的数字显示
  138. plt.text(a, b, '%.3f' % b, ha='center', va='bottom', fontsize=10)
  139. for i in range(len(x)):
  140. x[i] = x[i] + width
  141. plt.bar(x, num_list1, width=width, label=u"霍珀里歌", tick_label=name_list, fc="r")
  142. plt.xlabel(u"类型", fontsize=10)
  143. plt.ylabel(u"设备数量", fontsize=10)
  144. plt.title(u"霍珀里歌", fontsize=15)
  145. for a, b in zip(x, num_list1): # 柱子上的数字显示
  146. plt.text(a, b, '%.3f' % b, ha='center', va='bottom', fontsize=10)
  147. plt.legend(fontsize=8)
  148. plt.show()
  149. def parse_data5():
  150. """
  151. 最后登录
  152. """
  153. # 读取数据
  154. df = pd.read_csv("dealerMerchantStatus1.csv", header=0)
  155. # 读取所有的里歌经销商ID
  156. with open("lgdid") as f:
  157. lg = f.read().split()
  158. with open('hpdid') as f:
  159. hp = f.read().split()
  160. ids = lg + hp
  161. # 标准化画布
  162. # plt.axes(aspect='equal')
  163. # 分种类经销商
  164. df0 = df[df.merStatus == 0]
  165. df1 = df[df.merStatus == 1]
  166. df2 = df[df.merStatus == 2]
  167. df3 = df[df.merStatus == 3]
  168. df4 = df[df.merStatus == 4]
  169. num_list = [
  170. df0.onlineCount.count(),
  171. df1.onlineCount.count(),
  172. df2.onlineCount.count(),
  173. df3.onlineCount.count(),
  174. df4.onlineCount.count(),
  175. ]
  176. num_list1 = [
  177. df0[df0.partnerId == "[]"].onlineCount.count(),
  178. df1[df1.partnerId == "[]"].onlineCount.count(),
  179. df2[df2.partnerId == "[]"].onlineCount.count(),
  180. df3[df3.partnerId == "[]"].onlineCount.count(),
  181. df4[df4.partnerId == "[]"].onlineCount.count(),
  182. ]
  183. # 比较登录日期
  184. name_list = [u"未提交", u"入驻中", u"设备失败", u"入驻成功(微信申请)", u"已切换"]
  185. x = list(range(len(name_list)))
  186. total_width, n = 0.6, 2
  187. width = total_width / n
  188. plt.bar(x, num_list, width=width, label=u"申请数量", fc="b")
  189. for a, b in zip(x, num_list): # 柱子上的数字显示
  190. plt.text(a, b, '%d' % b, ha='center', va='bottom', fontsize=10)
  191. for i in range(len(x)):
  192. x[i] = x[i] + width
  193. plt.bar(x, num_list1, width=width, label=u"没有合伙人", tick_label=name_list, fc="r")
  194. plt.xlabel(u"类型", fontsize=10)
  195. plt.ylabel(u"设备数量", fontsize=10)
  196. plt.title(u"没有合伙人情况", fontsize=15)
  197. for a, b in zip(x, num_list1): # 柱子上的数字显示
  198. plt.text(a, b, '%d' % b, ha='center', va='bottom', fontsize=10)
  199. plt.legend(fontsize=8)
  200. plt.show()
  201. def aa():
  202. """
  203. """
  204. from apps.web.dealer.models import TodoMessage, Dealer
  205. from apps.web.device.models import Device
  206. num = 0
  207. for t in TodoMessage.objects.filter(title=u"商户开通提醒"):
  208. if num >= 1:
  209. break
  210. if Device.objects.filter(ownerId=t.ownerId).count() >= 10:
  211. continue
  212. dealer = Dealer.objects.get(id=t.ownerId) # type: Dealer
  213. if "forceMerchant" in dealer.features:
  214. continue
  215. dealer.features.append("forceMerchant")
  216. dealer.save()
  217. print("dealerId = {}".format(dealer.id))
  218. num += 1
  219. if __name__ == '__main__':
  220. parse_data3()