(一)无人便利店项目的可视化

(1)需求

  • 新增用户日报表

    • 每日新增用户数
    • 月用户数
  • 销售日报表

    • 每日所有商品的总销售量
    • 每日所有商品的总销售额

(2)代码如下:

  1. from log import LogMangerSys
  2. import datetime
  3. import re
  4. class DataAnalysisSys:
  5. def __init__(self):
  6. #数据分析系统通过日志管理系统操作日志文件,分析数据
  7. self.log_manage = LogMangerSys()
  8. '''
  9. 功能:根据指定时间间隔,获取当前时间前days天的日期
  10. 参数:
  11. days:时间间隔,整数,如果获取当前日期则传入0
  12. format:日期格式化方式,“%Y%m%d”
  13. 返回值:返回指定格式化后的日期
  14. '''
  15. def get_date(self,days,format):
  16. #获取当前日期
  17. today = datetime.datetime.today()
  18. #时间间隔
  19. timedelta = datetime.timedelta(days=days)
  20. #获取指定日期
  21. target_date = today - timedelta
  22. return target_date.strftime(format)
  23. '''
  24. 功能:新增用户日报表
  25. '''
  26. def user_report(self):
  27. #获取统计报表的月份
  28. ym = self.get_date(3,"%Y%m")
  29. #通过日志管理系统读取用户信息csv文件
  30. datas = self.log_manage.read_log_csv("d://user_info.csv")
  31. new_user_dict = {} #格式:{"20180421":5,20180422":3,...}
  32. for data in datas:
  33. dt = data[1]
  34. rs = re.match("{}".format(ym),dt)
  35. if rs != None:
  36. #先从从存储新增用户数的字典中获取指定日期的新增用户数,然后+1
  37. user_num = new_user_dict.get(dt,0) + 1
  38. new_user_dict[dt] = user_num
  39. m_new_user_count = 0 #月新增用户
  40. #m_new_user_dict = {}
  41. for key,value in new_user_dict.items():
  42. m_new_user_count += value
  43. #m_new_user_dict[ym] = m_new_user_count
  44. print("{}月每日新增用户数:{}".format(ym,new_user_dict))
  45. print("{}月新增用户数:{}".format(ym,m_new_user_count))
  46. '''
  47. 功能:销售日报表
  48. '''
  49. def sale_report(self):
  50. # 获取统计报表的月份
  51. ym = self.get_date(3, "%Y%m")
  52. file_dir = "d://buy_log//"
  53. files = self.log_manage.list_dir_file(file_dir)
  54. sale_money_dict = {}
  55. sale_count_dict = {}
  56. for file in files:
  57. if re.match("user_buy_log_{}".format(ym),file):
  58. file_path = file_dir + file
  59. datas = self.log_manage.read_log_csv(file_path)
  60. money = 0 #销售额
  61. count = 0 #销量
  62. for data in datas:
  63. money += float(data[1])#每个订单的金额累加,从文本读取出来的数据是字符串类型,需要转成浮点型
  64. items = data[2].split("|")
  65. count += len(items) #每天的销量 = 每个订单的商品列表数量累加
  66. file_date = file[13:21]
  67. sale_money_dict[file_date] = money
  68. sale_count_dict[file_date] = count
  69. print("{}月每日销量:{}".format(ym,sale_count_dict))
  70. print("{}月每日销售额:{}".format(ym,sale_money_dict))

(二)微信接口itchat

(1)介绍

  • itchat是一个开源的第三方微信
  • 安装方法:
    c:\Users\thomas\PycharmProjects\venv\Scripts\pip3.6.exe install itchat

(2)代码

  1. import itchat
  2. '''
  3. 功能:微信好友性别分析报表
  4. 功能:微信好友地域分布分析报表
  5. '''
  6. itchat.auto_login()
  7. friends = itchat.get_friends()
  8. male_count = 0
  9. female_count = 0
  10. other_count = 0
  11. province_dict = {}
  12. for friend in friends[1:]:
  13. gender = friend['Sex']
  14. province = friend["Province"]
  15. if gender == 1:
  16. male_count += 1
  17. elif gender == 2:
  18. female_count += 1
  19. else:
  20. other_count += 1
  21. if province == "":
  22. province = "Unknown"
  23. else:
  24. #使用get方法,如果province对应的键在列表中不存在,则创建,并赋给对应的value初值0,然后结果加1.如果存在,则直接key对应的value值加1.
  25. province_dict[province] = province_dict.get(province, 0) + 1
  26. total = len(friends[1:]) #含有总数
  27. print("------------*微信好友分析报告*----------------")
  28. print("好友总数:{}".format(total))
  29. print("男性好友数:%d,占比:%.2f%%"%(male_count,float(male_count)/total*100))
  30. print("女性好友数:%d,占比:%.2f%%"%(female_count,float(female_count)/total*100))
  31. print("未知性别好友数:%d,占比:%.2f%%" % (other_count, float(other_count) / total * 100))
  32. data_list = []
  33. for item in province_dict.items():
  34. data_list.append(item)
  35. data_list.sort(key=lambda item:item[1], reverse=True)
  36. list_final = data_list[:3]
  37. for item in list_final:
  38. print("好友最多的前三个省份的数据-{}:{}人".format(item[0],item[1]))

运行结果为:

  1. ------------*微信好友分析报告*----------------
  2. 好友总数:254
  3. 男性好友数:135,占比:53.15%
  4. 女性好友数:96,占比:37.80%
  5. 未知性别好友数:23,占比:9.06%
  6. 好友最多的前三个省份的数据-上海:130
  7. 好友最多的前三个省份的数据-江苏:11
  8. 好友最多的前三个省份的数据-浙江:10

(三)绘图库matplotlib

(1)简介

  • 绘图库matplotlib是一个Python的2D绘图库,可以绘制常用的直方图、折线图、散点图等
  • 安装方法:
  1. c:\Users\thomas\PycharmProjects\venv\Scripts>pip3.6.exe install matplotlib
  2. Collecting matplotlib
  3. Downloading https://files.pythonhosted.org/packages/bf/b9/485032835e979ee11d514bb3b9b0543a928b8b96c099c178aeab1d2ba861/matplotlib-2.2.2-cp36-cp36m-win_amd64.whl (8.7MB)
  4. 100% |████████████████████████████████| 8.7MB 55kB/s
  5. Collecting cycler>=0.10 (from matplotlib)
  6. Downloading https://files.pythonhosted.org/packages/f7/d2/e07d3ebb2bd7af696440ce7e754c59dd546ffe1bbe732c8ab68b9c834e61/cycler-0.10.0-py2.py3-none-any.whl
  7. Collecting pytz (from matplotlib)
  8. Downloading https://files.pythonhosted.org/packages/dc/83/15f7833b70d3e067ca91467ca245bae0f6fe56ddc7451aa0dc5606b120f2/pytz-2018.4-py2.py3-none-any.whl (510kB)
  9. 100% |████████████████████████████████| 512kB 129kB/s
  10. Collecting pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 (from matplotlib)
  11. Downloading https://files.pythonhosted.org/packages/6a/8a/718fd7d3458f9fab8e67186b00abdd345b639976bc7fb3ae722e1b026a50/pyparsing-2.2.0-py2.py3-none-any.whl (56kB)
  12. 100% |████████████████████████████████| 61kB 142kB/s
  13. Collecting python-dateutil>=2.1 (from matplotlib)
  14. Downloading https://files.pythonhosted.org/packages/0c/57/19f3a65bcf6d5be570ee8c35a5398496e10a0ddcbc95393b2d17f86aaaf8/python_dateutil-2.7.2-py2.py3-none-any.whl (212kB)
  15. 100% |████████████████████████████████| 215kB 85kB/s
  16. Collecting numpy>=1.7.1 (from matplotlib)
  17. Downloading https://files.pythonhosted.org/packages/af/e4/7d7107bdfb5c33f6cf33cdafea8c27d1209cf0068a6e3e3d3342be6f3578/numpy-1.14.3-cp36-none-win_amd64.whl (13.4MB)
  18. 100% |████████████████████████████████| 13.4MB 35kB/s
  19. Collecting kiwisolver>=1.0.1 (from matplotlib)
  20. Downloading https://files.pythonhosted.org/packages/44/72/16630c3392eba03788ad87949390516bbc488e8e118047a3b824631d21a6/kiwisolver-1.0.1-cp36-none-win_amd64.whl (57kB)
  21. 100% |████████████████████████████████| 61kB 120kB/s
  22. Collecting six>=1.10 (from matplotlib)
  23. Downloading https://files.pythonhosted.org/packages/67/4b/141a581104b1f6397bfa78ac9d43d8ad29a7ca43ea90a2d863fe3056e86a/six-1.11.0-py2.py3-none-any.whl
  24. Requirement already satisfied: setuptools in c:\users\thomas\pycharmprojects\venv\lib\site-packages\setuptools-28.8.0-py3.6.egg (from kiwisolver>=1.0.1->matplotlib)
  25. Installing collected packages: six, cycler, pytz, pyparsing, python-dateutil, numpy, kiwisolver, matplotlib
  26. Successfully installed cycler-0.10.0 kiwisolver-1.0.1 matplotlib-2.2.2 numpy-1.14.3 pyparsing-2.2.0 python-dateutil-2.7.2 pytz-2018.4 six-1.11.0

(2)代码

  1. import itchat
  2. import matplotlib.pyplot as plt
  3. itchat.auto_login()
  4. friends = itchat.get_friends()
  5. male_count = 0
  6. female_count = 0
  7. other_count = 0
  8. province_dict = {}
  9. '''
  10. 功能:根据数据生成饼图
  11. 参数说明:
  12. datas:展示的数据列表
  13. labels:展示的数据标签
  14. '''
  15. def get_pie(datas, labels):
  16. # 设置字符集
  17. plt.rcParams["font.sans-serif"] = ["SimHei"]
  18. plt.figure(figsize=(8, 6), dpi=80)
  19. plt.axes(aspect=1)
  20. plt.pie(datas, labels=labels, autopct="%.2f%%", shadow=False)
  21. plt.title("微信好友性别分析图")
  22. plt.show()
  23. def get_bar(datas, labels):
  24. # 设置字符集
  25. plt.rcParams["font.sans-serif"] = ["SimHei"]
  26. plt.xlabel("province")
  27. plt.ylabel("count")
  28. plt.xticks(range(len(datas)), labels)
  29. plt.bar(range(len(datas)), datas, color="rgb")
  30. plt.title("微信好友地域分布图")
  31. plt.show()
  32. '''
  33. 功能:微信好友性别分析报表
  34. 功能:微信好友地域分布分析报表
  35. '''
  36. for friend in friends[1:]:
  37. gender = friend['Sex']
  38. province = friend["Province"]
  39. if gender == 1:
  40. male_count += 1
  41. elif gender == 2:
  42. female_count += 1
  43. else:
  44. other_count += 1
  45. if province == "":
  46. province = "Unknown"
  47. else:
  48. province_dict[province] = province_dict.get(province, 0) + 1
  49. total = len(friends[1:]) #含有总数
  50. print("------------*微信好友分析报告*----------------")
  51. print("好友总数:{}".format(total))
  52. print("男性好友数:%d,占比:%.2f%%" % (male_count,float(male_count)/total*100))
  53. print("女性好友数:%d,占比:%.2f%%" % (female_count,float(female_count)/total*100))
  54. print("未知性别好友数:%d,占比:%.2f%%" % (other_count, float(other_count) / total * 100))
  55. # 初始化饼图绘图参数,包括数据和标签
  56. datas = [male_count, female_count, other_count]
  57. labels = ["男性", "女性", "未知"]
  58. # 初始化柱状图绘图参数,包括数据和标签
  59. data_list = []
  60. # 针对各省人数降序排序
  61. for item in province_dict.items():
  62. data_list.append(item)
  63. data_list.sort(key=lambda item:item[1], reverse=True)
  64. #取人数前十名的省份
  65. list_final = data_list[:10]
  66. datas_list = []
  67. labels_list = []
  68. #将人数前十名的省份和人数,分别放入labels_list和datas_list中
  69. for item in list_final:
  70. datas_list.append(item[1])
  71. labels_list.append(item[0])
  72. #调用get_pie画饼图
  73. get_pie(datas, labels)
  74. #调用get_par画柱状图
  75. get_bar(datas_list, labels_list)

运行结果为:

  1. Getting uuid of QR code.
  2. Downloading QR code.
  3. Please scan the QR code to log in.
  4. Please press confirm on your phone.
  5. Loading the contact, this may take a little while.
  6. Login successfully as 青峰
  7. ------------*微信好友分析报告*----------------
  8. 好友总数:254
  9. 男性好友数:135,占比:53.15%
  10. 女性好友数:96,占比:37.80%
  11. 未知性别好友数:23,占比:9.06%
  12. LOG OUT!

以及生成的饼图以及柱状图