# 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()