123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- # coding=utf-8
- import datetime
- import pandas as pd
- import matplotlib.pyplot as plt
- from matplotlib.font_manager import FontProperties
- from pylab import mpl
- from apps.web.core.bridge.wechat.v3api import WechatApiProxy
- from apps.web.core.models import WechatServiceProvider
- from apps.web.core.networking import MessageSender
- from apps.web.device.models import DeviceDict
- from apps.web.merchant.models import MerchantSourceInfo
- def make_autopct(total):
- def my_autopct(pct):
- val = int(round(pct*total/100.0))
- # 同时显示数值和占比的饼图
- return '{p:.2f}% ({v:d})'.format(p=pct,v=val)
- return my_autopct
- def parse_data1():
- """
- 解析数据
- """
- # 读取数据
- df = pd.read_csv("dealerMerchantStatus1.csv", header=0)
- # 标准化画布
- plt.axes(aspect='equal')
- allCount = df.id.count()
- #
- 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))
- # df.set_index('merStatus', inplace=True)
- plt.title(u'商户开通整体情况', fontsize=16, fontweight='bold')
- plt.ylabel(u"发出邀请总人数 {}".format(df["merStatus"].count()), fontsize=16, fontweight='bold')
- plt.show()
- def parse_data2():
- """
- 解析数据
- """
- # 读取数据
- df = pd.read_csv("dealerMerchantStatus1.csv", header=0)
- # 标准化画布
- plt.axes(aspect='equal')
- # 条件筛选出未开通商户的
- online4 = df[df["merStatus"] == 4].onlineCount.sum()
- online3 = df[df["merStatus"] == 3].onlineCount.sum()
- online2= df[df["merStatus"] == 2].onlineCount.sum()
- online1 = df[df["merStatus"] == 1].onlineCount.sum()
- online0 = df[df["merStatus"] == 0].onlineCount.sum()
- allOnline = df.onlineCount.sum()
- s = pd.Series([
- online0,
- online1,
- online2,
- online3,
- online4,
- ],[
- u"未提交资料",
- u"京东入驻中",
- u"申请失败",
- u"申请成功(微信审核)",
- u"已经切换"
- ]
- )
- s.sort_values().plot.pie(autopct=make_autopct(allOnline), fontsize=10, counterclock=False, explode=(0.3,0,0,0,0))
- plt.title(u"设备分布图", fontsize=16, fontweight='bold')
- plt.ylabel(u"设备总数{}".format(allOnline), fontsize=16, fontweight='bold')
- #
- plt.show()
- def parse_data3():
- """
- 最后登录
- """
- # 读取数据
- df = pd.read_csv("dealerMerchantStatus1.csv", header=0)
- # 标准化画布
- plt.axes(aspect='equal')
- # 找出所有没有提交资料的经销商
- df = df[df["merStatus"] == 0]
- # 比较登录日期
- now = datetime.datetime.now()
- login14 = df[df.lastLogin.astype('datetime64') >= now - datetime.timedelta(days=14)].onlineCount.sum()
- login15_30 = df[(df.lastLogin.astype('datetime64') < now - datetime.timedelta(days=14)) & (df.lastLogin.astype('datetime64') >= now - datetime.timedelta(days=30))].onlineCount.sum()
- login30_90 = df[(df.lastLogin.astype('datetime64') < now - datetime.timedelta(days=30)) & (df.lastLogin.astype('datetime64') >= now - datetime.timedelta(days=90))].onlineCount.sum()
- login90 = df[(df.lastLogin.astype('datetime64') < now - datetime.timedelta(days=90))].onlineCount.sum()
- allCount = df.onlineCount.sum()
- s = pd.Series([
- login14,
- login15_30,
- login30_90,
- login90,
- ], [
- u"14天以内",
- u"14天到30天",
- u"30天到90天",
- u"3个月以上"
- ])
- s.sort_values().plot.pie(autopct=make_autopct(allCount), fontsize=10, counterclock=False, explode=(0.3,0.3,0.3,0))
- plt.title(u"最后登录分布图(设备)", fontsize=16, fontweight='bold')
- plt.ylabel(u"总数{}".format(allCount), fontsize=16, fontweight='bold')
- #
- plt.show()
- def parse_data4():
- # 读取数据
- df = pd.read_csv("dealerMerchantStatus1.csv", header=0)
- # 读取所有的里歌经销商ID
- with open("lgdid") as f:
- lg = f.read().split()
- with open('hpdid') as f:
- hp = f.read().split()
- ids = lg + hp
- # 标准化画布
- # plt.axes(aspect='equal')
- # 分种类经销商
- df0 = df[df.merStatus == 0]
- df1 = df[df.merStatus == 1]
- df2 = df[df.merStatus == 2]
- df3 = df[df.merStatus == 3]
- df4 = df[df.merStatus == 4]
- num_list = [
- df0.onlineCount.sum(),
- df1.onlineCount.sum(),
- df2.onlineCount.sum(),
- df3.onlineCount.sum(),
- df4.onlineCount.sum(),
- ]
- num_list1 = [
- df0[df0.id.isin(ids)].onlineCount.sum(),
- df1[df1.id.isin(ids)].onlineCount.sum(),
- df2[df2.id.isin(ids)].onlineCount.sum(),
- df3[df3.id.isin(ids)].onlineCount.sum(),
- df4[df4.id.isin(ids)].onlineCount.sum(),
- ]
- # 比较登录日期
- name_list = [u"未提交", u"入驻中", u"设备失败", u"入驻成功(微信申请)", u"已切换"]
- x = list(range(len(name_list)))
- total_width, n = 0.6, 2
- width = total_width / n
- plt.bar(x, num_list, width=width, label=u"设备总数量", fc="b")
- for a, b in zip(x, num_list): # 柱子上的数字显示
- plt.text(a, b, '%.3f' % b, ha='center', va='bottom', fontsize=10)
- for i in range(len(x)):
- x[i] = x[i] + width
- plt.bar(x, num_list1, width=width, label=u"霍珀里歌", tick_label=name_list, fc="r")
- plt.xlabel(u"类型", fontsize=10)
- plt.ylabel(u"设备数量", fontsize=10)
- plt.title(u"霍珀里歌", fontsize=15)
- for a, b in zip(x, num_list1): # 柱子上的数字显示
- plt.text(a, b, '%.3f' % b, ha='center', va='bottom', fontsize=10)
- plt.legend(fontsize=8)
- plt.show()
- def parse_data5():
- """
- 最后登录
- """
- # 读取数据
- df = pd.read_csv("dealerMerchantStatus1.csv", header=0)
- # 读取所有的里歌经销商ID
- with open("lgdid") as f:
- lg = f.read().split()
- with open('hpdid') as f:
- hp = f.read().split()
- ids = lg + hp
- # 标准化画布
- # plt.axes(aspect='equal')
- # 分种类经销商
- df0 = df[df.merStatus == 0]
- df1 = df[df.merStatus == 1]
- df2 = df[df.merStatus == 2]
- df3 = df[df.merStatus == 3]
- df4 = df[df.merStatus == 4]
- num_list = [
- df0.onlineCount.count(),
- df1.onlineCount.count(),
- df2.onlineCount.count(),
- df3.onlineCount.count(),
- df4.onlineCount.count(),
- ]
- num_list1 = [
- df0[df0.partnerId == "[]"].onlineCount.count(),
- df1[df1.partnerId == "[]"].onlineCount.count(),
- df2[df2.partnerId == "[]"].onlineCount.count(),
- df3[df3.partnerId == "[]"].onlineCount.count(),
- df4[df4.partnerId == "[]"].onlineCount.count(),
- ]
- # 比较登录日期
- name_list = [u"未提交", u"入驻中", u"设备失败", u"入驻成功(微信申请)", u"已切换"]
- x = list(range(len(name_list)))
- total_width, n = 0.6, 2
- width = total_width / n
- plt.bar(x, num_list, width=width, label=u"申请数量", fc="b")
- for a, b in zip(x, num_list): # 柱子上的数字显示
- plt.text(a, b, '%d' % b, ha='center', va='bottom', fontsize=10)
- for i in range(len(x)):
- x[i] = x[i] + width
- plt.bar(x, num_list1, width=width, label=u"没有合伙人", tick_label=name_list, fc="r")
- plt.xlabel(u"类型", fontsize=10)
- plt.ylabel(u"设备数量", fontsize=10)
- plt.title(u"没有合伙人情况", fontsize=15)
- for a, b in zip(x, num_list1): # 柱子上的数字显示
- plt.text(a, b, '%d' % b, ha='center', va='bottom', fontsize=10)
- plt.legend(fontsize=8)
- plt.show()
- def aa():
- """
- """
- from apps.web.dealer.models import TodoMessage, Dealer
- from apps.web.device.models import Device
- num = 0
- for t in TodoMessage.objects.filter(title=u"商户开通提醒"):
- if num >= 1:
- break
- if Device.objects.filter(ownerId=t.ownerId).count() >= 10:
- continue
- dealer = Dealer.objects.get(id=t.ownerId) # type: Dealer
- if "forceMerchant" in dealer.features:
- continue
- dealer.features.append("forceMerchant")
- dealer.save()
- print("dealerId = {}".format(dealer.id))
- num += 1
- if __name__ == '__main__':
- parse_data3()
|