综合数据处理(透视作图百分比显示)

import datetime

import pandas as pd
import numpy as np
import os
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
font=FontProperties(fname='/System/Library/Fonts/Supplemental/Arial Unicode.ttf',size=10)

from openpyxl.drawing.image import Image
from datetime import date
today=date.today().strftime('%Y%m%d')
print(today)

downpath='/Users/kangyongqing/Downloads/'
filepath='/Users/kangyongqing/Documents/kangyq/202306/续费目标修正/续费率跟盯/'
fenzu='分组续费率20230724.xlsx'
downfile='20230725_105033.csv'

dt0=pd.read_excel(filepath+fenzu,engine='openpyxl',sheet_name=1)
dt=dt0.iloc[:,:14]
print(dt.head(2).T)

dd=pd.read_csv(downpath+downfile)
dd.rename(columns={'student_user_id':'学生id'},inplace=True)

#使两个数据集条件列名一致,便于join
print(dd.head(2).T)

data=pd.merge(dt,dd,on='学生id',how='left')
#左连接



#创建新的列并赋值
# data['学生续费']=''
# data.loc[data['total_amount'].values>0,'学生续费']='1'
# data.loc[data['total_amount'].isnull() ,'学生续费']='0'

#np.where()简单赋值,相当于excel中的if函数
data['学生续费']=np.where(data['total_amount'].values>0,1,0)
data['续费日期']=data['付费时间']
data['组别']=np.where(data['分组'].values=='D组','实验组','对照组')
# data['续费日期1']=data['续费日期'].astype('datetime64')
# data['续费日期']=pd.to_datetime(data['续费日期'])
#两种转换日期的方法

data['周数']=data['续费日期'].apply(lambda x:pd.to_datetime(x).week)
#日期转换为周数
print(data.info())

pv1=pd.pivot_table(data,index='分组',aggfunc={'学生续费':np.sum,'学生id':'count'})
pv1.rename(columns={'学生id':'学生数量','学生续费':'续费人数'},inplace=True)
pv1['续费率']=pv1['续费人数']/pv1['学生数量']
# pv1['续费率']=pv1['续费率'].round(4)
#保留四位有效数据
pv1['续费率']=pv1['续费率'].apply(lambda x:format(x,'.2%'))
#设置百分比格式
print(pv1)

figure=plt.figure(10)
x1=pv1.index
y1=pv1['续费率'].str.strip("%").astype(float)/100
#百分比转换为浮点数
tupian=plt.bar(x1,y1)
plt.xticks(x1,fontproperties=font)

plt.title('分组续费率',fontproperties=font)
#标题汉字显示异常处理,注意fontproperties必须全部是小写,否则报错
plt.bar_label(tupian,y1.apply(lambda y1:format(y1,'.2%')),padding=0.2)

plt.savefig(filepath+'分组'+str(today)+'.png')
plt.close()
image1=Image(filepath+'分组'+str(today)+'.png')

pv2=data.pivot_table(index='组别',aggfunc={'学生续费':np.sum,'学生id':'count'})
pv2.rename(columns={'学生id':'学生数量','学生续费':'续费人数'},inplace=True)
pv2['续费率']=pv2['续费人数']/pv2['学生数量']
pv2['续费率']=pv2['续费率'].apply(lambda x:format(x,'.2%'))

x2=pv2.index
y2=pv2['续费率'].str.strip("%").astype(float)/100
#百分比转换为浮点数
tupian2=plt.bar(x2,y2)
plt.xticks(x2,fontproperties=font)

plt.title('组别续费率',fontproperties=font)
#标题汉字显示异常处理,注意fontproperties必须全部是小写,否则报错
plt.bar_label(tupian2,y2.apply(lambda y2:format(y2,'.2%')),padding=0.2)

plt.savefig(filepath+'组别'+str(today)+'.png')
plt.close()
image2=Image(filepath+'组别'+str(today)+'.png')

pv3=data.pivot_table(index='分组',values='学生续费',aggfunc=np.sum,columns='周数',margins=True,margins_name='总计')

dd['parent_user_id']=dd['parent_user_id'].astype(np.int64).astype(str)
dd['学生id']=dd['学生id'].astype(np.int64).astype(str)
#长id转换为字符串保存
writer=pd.ExcelWriter(filepath+'分组续费率'+str(today)+'.xlsx',engine='openpyxl')

dd.to_excel(writer,sheet_name='续费明细',index=False)


data['家长id']=data['家长id'].astype(np.int64).astype(str)
data['学生id']=data['学生id'].astype(np.int64).astype(str)
data['教师id']=data['教师id'].astype(np.int64).astype(str)
data.iloc[:,[0,1,2,3,4,5,6,7,8,9,10,11,12,13,-4,-3,-2,-1]].to_excel(writer,sheet_name='分组明细',index=False)

pv1.to_excel(writer,sheet_name='分组透视')
pv2.to_excel(writer,sheet_name='组别透视')
pv3.to_excel(writer,sheet_name='每周续费')


writer.sheets['分组透视'].add_image(image1,'F5')
writer.sheets['组别透视'].add_image(image2,'F5')
writer.save()

# writer.close()

 主要知识点:

  1. excel和csv的join连接
  2. 新增数据列的加工
  3. 透视表作图并插入excel
  4. 数字切换百分比,百分比切换数字
  5. plot作图中文显示
  6. 长id科学计数法显示的处理

猜你喜欢

转载自blog.csdn.net/Darin2017/article/details/131922360