Procesamiento integral de datos (visualización de porcentajes en dibujo en perspectiva)

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

 Principales puntos de conocimiento:

  1. La conexión de unión entre excel y csv.
  2. Procesamiento de nuevas columnas de datos
  3. Dibujo de tabla dinámica e inserción en Excel
  4. Porcentaje de cambio de número, Número de cambio de porcentaje
  5. Trazar dibujo pantalla china
  6. Procesamiento de visualización de notación científica de identificación larga

Supongo que te gusta

Origin blog.csdn.net/Darin2017/article/details/131922360
Recomendado
Clasificación