去年写的一个数据分析小助手。
每个月初补充上月的新增数据,就能实现多期历史数据按季度、月份、周(星期)的不同统计口径、不同的统计区间进行统计分析和自动画图(发展趋势、占比变化等),自动化输出统计报表等,根据不同的维度、统计对象、范围进行组合,拆分,汇总等运算后输出统计结果。
在图形界面上几下点击以后,图表秒出,看看效果:
框架的代码(只是结构,具体的数据需要自己填补进去哦,部分功能的实现在我的其他博文中,欢迎交流。)
import datetime
from datetime import timedelta
import math #季度推算
from dateutil.relativedelta import * #月度推算
import tkinter as tk # 使用Tkinter前需要先导入
from tkinter import *
import os,re,sys
import numpy as np
import pandas as pd #导入pandas库
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
plt.rcParams['axes.unicode_minus']=False # 正常显示负号
import mpl_toolkits.axisartist as axisartist
from mpl_toolkits.axisartist.axislines import SubplotZero
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
from mpl_toolkits.axes_grid1.inset_locator import mark_inset
window = tk.Tk()
window.title('数据分析助手01.03')
window.geometry('1000x700') # 这里的乘是小x
biaoti = tk.Label(window, text="数 据 分 析 助 手", fg='blue',font=('Batang', 20), width=30)
biaoti.place(x=250,y=30) #
# 在图形界面上创建一个标签label用以显示并放置
var1 = tk.StringVar() # 创建变量,用var1用来接收鼠标点击具体选项的内容
l = tk.Label(window, bg='white', fg='red',font=('Arial', 10), width=20, textvariable=var1)
l.place(x=250,y=120)
lweidu = tk.Label(window, text="数据维度(季输1/周输2/年输3)\n(空值默认为月,其他必输):")
lweidu.place(x=50,y=160) #
NUM_weidu = tk.StringVar()
NUM_weidu.set("")
date_weidu =tk.Entry(window,text = "",width=20,textvariable = NUM_weidu)
date_weidu.place(x=50,y=200)
lshu = tk.Label(window, text="请输入要处理几期数据\n(空值默认为2):")
lshu.place(x=50,y=230) #
NUM0 = tk.StringVar()
NUM0.set("")
date_num =tk.Entry(window,text = "",width=20,textvariable = NUM0)
date_num.place(x=50,y=270)
lye = tk.Label(window, text="请输入最后的月/季/周\n(空值默认为上月):")
lye.place(x=50,y=300) #
date_m0 = tk.StringVar()
date_m0.set("")
date_mm =tk.Entry(window,text = "",width=20, textvariable = date_m0)
date_mm.place(x=50,y=340)
lye1 = tk.Label(window, text="是否6类特价商品\n(是输1/空值默认为否):")
lye1.place(x=50,y=370) #
M3_M9 = tk.StringVar()
M3_M9.set("")
M3M9 =tk.Entry(window,text = "",width=20, textvariable = M3_M9)
M3M9.place(x=50,y=410)
v3_list0=['总公司下载数据', '新员工销售统计','老员工销售统计','单个商品进出货数据','库存商品统计','季度分公司分级']#建立一个列表,数据库种类,"非法金融活动模型",'总行下发分行数据'
def print_selection1(): # 创建一个方法用于按钮的点击事件
value = lb.get(lb.curselection()) # 获取当前选中的报表种类
var1.set(value) # 为label设置值
fenghang1 = ['广东', '珠海', '汕头', '潮州', '韶关', '河源', '梅州', '惠州', '汕尾', '东莞',\
'中山', '江门', '佛山', '阳江', '湛江', '茂名', '肇庆', '清远', '揭阳', '云浮']
value1=value # 此时value是报表种类的名称,value1
print("\n下面开始处理:%s" % (value1))
var4 = tk.StringVar()# 创建Listbox并为其添加内容
var4.set(fenghang1) # 为变量var4设置值
var2 = tk.StringVar() # 创建变量,用var2用来接收鼠标点击具体选项的内容
l2 = tk.Label(window, bg='white', fg='red',font=('Arial', 10), width=16, textvariable=var2)
l2.place(x=480,y=120)
def print_selection2(): # 创建一个方法用于按钮的点击事件
value = lb_2.get(lb_2.curselection()) # 获取当前选中的分公司名称
var2.set(value) # 为label设置值
value2=value #这里value2是分公司的名称
#下面导入数据表
var5 = tk.StringVar() # 创建变量,用var5用来接收鼠标点击具体选项的内容,图的种类名称
l3 = tk.Label(window, bg='white', fg='red',font=('Arial', 10), width=26, textvariable=var5)
l3.place(x=680,y=120)
def print_selection3(): # 创建一个方法用于按钮的点击事件
Aa = tk.Label(window, bg='#f4f4f4',fg="blue",font=("Arial",10),width=90,height=10,text ='',wraplength = 656,justify = 'left')#创建一个显示文字分析的窗口
Aa.place(x=120,y=480)# 文字分析窗口
value = lb_3.get(lb_3.curselection()) # 获取当前选中的图的名称
var5.set(value) # 为label设置值
value3=value # 此时value是图的种类名称
def qushitu(num_list1,num_list2,label_list0): #自定义一个函数,画变化趋势图
plt.close() #清除之前的图形
fig = plt.figure(num=1, figsize=(9,5),dpi=90)# 共享坐标轴 方法一
#引入数据(略),具体数据省略了。。。。。。
# 只共享X轴 sharex
ax2 = plt.subplot(212, sharex=ax1)
plt.show()
if value =="销售任务(实际销量)变化趋势图" or value =='新员工销售任务(实际销量)变化趋势图':
#引入数据(略)
qushitu(num_list1,num_list2,label_list0)
if value =="本期出货数量及商品占比图":
plt.close() #清除之前的图形
fig = plt.figure(num=2, figsize=(7, 4))
ax1 = fig.add_subplot(1, 1, 1)
#引入数据(略)
plt.ylim(0,Y_len2_1) # 限定纵轴的范围
plt.legend(loc='upper left', fontsize=9) # 让图例生效
#要添加的子图
axins = inset_axes(ax1,width=2.5, height=1.2, loc='upper right')
# ax1 大图, width height分别为子图的宽和高,loc 为子图在大图ax1中的相对位置 相应的值有lower left,center right,center
axins.bar(x2,dict(data2_3).values(),width=0.4, color=cor,alpha=0.5)
plt.show()
#下面是框架:
lb_3 = tk.Button(window, text='请选择输出图表名称', width=29, height=2, command=print_selection3)# 创建一个按钮并放置,点击按钮调用print_selection函数
lb_3.place(x=680,y=150)
var6 = tk.StringVar()# 创建Listbox并为其添加内容
if value1 == '总公司下载数据':
var6.set(('多期利润分成或本期环比','多期退货统计或本期环比',"按地区统计本期潜在客户数量",'本期出货数量及商品占比图','本期退货原因统计图','机构网点分析','销售任务(实际销量)变化趋势图','多期合并原表')) # 为变量var3设置值
elif value1 == '新员工销售统计':
var6.set(('多期利润分成或本期环比','多期退货统计或本期环比','本期出货数量及商品占比图','本期退货原因统计图','机构网点分析','多期合并原表','按地区统计本期潜在客户数量','销售任务(实际销量)变化趋势图')) # 为变量var3设置值
elif value1 == '老员工销售统计':
var6.set(('多期利润分成或本期环比','多期退货统计或本期环比','本期出货数量及商品占比图','本期退货原因统计图','机构网点分析','多期合并原表','按地区统计本期潜在客户数量','销售任务(实际销量)变化趋势图')) # 为变量var3设置值
elif value1 == '单个商品进出货数据':
var6.set(model) #("趋势图")
elif value1 == '季度分公司分级':
var6.set(('本季清单','本季各类占比统计表','多期合并原表','本季明细',"(内)外加工数量趋势图",'多期拆分与环比')) #结果
elif value1 == '库存商品统计':
var6.set(('多期退货统计或本期环比','多期合并原表','本期退货原因统计图','(内)外加工数量趋势图'))
# 创建Listbox
lb_3 = tk.Listbox(window, listvariable=var6, width=30, height=13) #将var5的值赋给Listbox
if value10==['M3M4M5M7M8M9'] and value1 != '单个商品进出货数据': #设置第三个选择框中图种类的增减
lb_3.insert('end','M3M4M5M7M8M9') # 从最后一个位置开始加入值,本期排名
if value1 == '季度分公司分级' :
if NUM>6:
lb_3.insert('end','连续3期排名前','多期结果','近3季升降前10名') #
if value2 == '广东':
lb_3.insert('end','多期利润分成或本期环比','多期退货统计或本期环比','本期退货原因统计图','新员工销售任务(实际销量)变化趋势图')
lb_3.place(x=680,y=200)
lb_2 = tk.Button(window, text='请选择分公司名称', width=18, height=2, command=print_selection2)# 创建一个按钮并放置,点击按钮调用print_selection函数
lb_2.place(x=480,y=150)
# 创建Listbox
lb_2 = tk.Listbox(window, listvariable=var4, width=19, height=13) #将var3的值赋给Listbox,第二个选择菜单的内容,分行或模型名称
lb_2.place(x=480,y=200)
b1 = tk.Button(window, text='请选择数据种类', width=22, height=2, command=print_selection1)# 创建一个按钮并放置,点击按钮调用print_selection函数
b1.place(x=250,y=150)
v3_list = list(set(v3_list0))# 数据库文件夹中所有报表名称的列表,转换为集合再转换为列表,set是列表剔重
var3 = tk.StringVar()# 创建Listbox并为其添加内容
var3.set(v3_list) # 为变量var3设置值,所有报表名称
# 创建Listbox
lb = tk.Listbox(window, listvariable=var3, width=23, height=13) #将var3的值赋给Listbox
lb.place(x=250,y=200)
lm = tk.Label(window,fg="#3066cc",text='维护日期:2021-01-27 如是我闻') # 在图形界面下方创建一个标签label用以放置制作人
lm.pack(side="bottom")
# 主窗口循环显示
window.mainloop()
回顾近两年来的学习,70后的我,快奔五的人眼睛既近视,又开始老花,记忆力也慢慢下降了,学起来确实是困难重重,最主要的是没有参加培训班,完全靠自学,碰到难题的时候经常花费大量的时间去研究。
下面是我个人的一点学习体会:
1。通过CSDN手机app平台,极大方便了我学习和查找资料,一碰到难题就在平台上搜索,通常可以找到解决办法。同时可以利用零散的时间进行学习,不论是坐车、看电视、接送小孩等,随时随地都可以看上一二篇文章可代码。
2。从简单的做起,再逐渐细化,不断修改和完善。想一开始就弄个高大尚的程序,对于我这种无编程基础的人来说,是很容易放弃的。
3。结合工作实际,边学边用。因为不是码农出身,没有编写代码的经验,所以不追求什么专业性的东西。但是,正因为自己并非程序员,工作上对编程没什么要求,只要稍微学一点,在公司内部就比他人多了一项技能,这样可以建立起信心,慢慢地学下去。一步一个脚印,一年后,终于结合工作中的数据分析,编写出一些简单的代码,大大提升了工作效率。