pandas和numpy库进行数据整理

背景:每日从分行提取数据,进行汇总和计算。这个步骤在excel操作大概需要花20分钟,不过写好代码,一秒即可得出结果。

整理这份代码,主要是以这背景为案列,记录pandas和numpy的一些基本操作。

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
daily=pd.read_csv(r' ',encoding='utf-8')#读取csv文件数据

#将金额转成万
daily['放款金额']=daily['放款金额']/10000

#筛选时间范围,只需要近一个月的汇总数据
day_31='2018-01-03'
daily=daily[daily['申请日期']>day_31]

#创建list新的列名
days=[]
for i in np.arange(31):
    d='D'+str(i)+'处理百分比'
    days.append(d)

#将处理百分比转化成处理单数
for i in np.arange(31):
    D=pd.DataFrame(daily[days[i]]*daily['申请单数'])
    daily.insert(int(i),str(i),D)

#将D处理单数求和
v1=['申请单数']
for i in np.arange(31):
    v2=str(i)
    v1.append(v2)

precent_pivot=pd.pivot_table(daily,index=['申请日期'],values=v1,aggfunc=sum)#excel数据透视表功能

#将求和了的处理单数转化成百分比并形成新的表
finish=pd.pivot_table(daily,index=['申请日期'],values=['申请单数'],aggfunc=sum)
for i in np.arange(31):
    precent_D=pd.DataFrame(precent_pivot[str(i)]/precent_pivot['申请单数'])
    finish.insert(int(i),str(days[i]),precent_D)

#求全公司的基本数据
daily_pivot=pd.pivot_table(daily,index=['申请日期'],values=['申请单数','已处理单数','通过件数','签约数','放款金额','待签约数','待处理单数'],aggfunc=sum)
#求全公司基本率
process=pd.DataFrame(daily_pivot['已处理单数']/daily_pivot['申请单数'])
rate=pd.DataFrame(daily_pivot['通过件数']/daily_pivot['已处理单数'])
signing=pd.DataFrame(daily_pivot['签约数']/daily_pivot['通过件数'])
#插入率
daily_pivot.insert(0,'已处理进度',process)
daily_pivot.insert(1,'通过率',rate)
daily_pivot.insert(2,'签约率',signing)

#将处理情况插入百分比
daily_pivot_list=list(daily_pivot.columns)
daily_pivot_list.remove('申请单数')
for i in np.arange(9):
    finish.insert(int(i),str(daily_pivot_list[i]),daily_pivot[str(daily_pivot_list[i])])

#给列排序
columns=['申请单数','已处理单数','已处理进度','通过件数','通过率','签约数','签约率','放款金额', '待签约数','待处理单数','D0处理百分比', 'D1处理百分比', 'D2处理百分比', 'D3处理百分比', 'D4处理百分比', 'D5处理百分比','D6处理百分比', 'D7处理百分比', 'D8处理百分比', 'D9处理百分比', 'D10处理百分比', 'D11处理百分比','D12处理百分比', 'D13处理百分比', 'D14处理百分比', 'D15处理百分比', 'D16处理百分比', 'D17处理百分比','D18处理百分比', 'D19处理百分比', 'D20处理百分比', 'D21处理百分比', 'D22处理百分比', 'D23处理百分比','D24处理百分比', 'D25处理百分比', 'D26处理百分比', 'D27处理百分比', 'D28处理百分比', 'D29处理百分比','D30处理百分比']

#插入一行总计
#finish.loc['总计']=finish.apply(lambda x:x.sum())
#finish.loc['参考平均值']=finish.apply(lambda x:x.mean())

#插入一行总计
finish.loc['总计']=0
finish.loc['总计','已处理进度']=finish['已处理单数'].sum()/finish['申请单数'].sum()
finish.loc['总计','通过率']=finish['通过件数'].sum()/finish['已处理单数'].sum()
finish.loc['总计','签约率']=finish['签约数'].sum()/finish['通过件数'].sum()

add_base=['申请单数','已处理单数','通过件数','签约数','放款金额','待签约数','待处理单数']
average_p=['D0处理百分比', 'D1处理百分比', 'D2处理百分比', 'D3处理百分比', 'D4处理百分比', 'D5处理百分比','D6处理百分比', 'D7处理百分比', 'D8处理百分比', 'D9处理百分比', 'D10处理百分比', 'D11处理百分比','D12处理百分比', 'D13处理百分比', 'D14处理百分比', 'D15处理百分比', 'D16处理百分比', 'D17处理百分比','D18处理百分比', 'D19处理百分比', 'D20处理百分比', 'D21处理百分比', 'D22处理百分比', 'D23处理百分比','D24处理百分比', 'D25处理百分比', 'D26处理百分比', 'D27处理百分比', 'D28处理百分比', 'D29处理百分比','D30处理百分比']


for i in np.arange(finish.shape[1]):
    if finish.columns[i] in add_base:
        finish.loc['总计',finish.columns[i]]=finish[finish.columns[i]].sum()
    elif finish.columns[i] in average_p:
        a=finish.columns[i]
        d=a[1:3]
        if d.endswith('处')==True:
            day=int(d[0])
        else:
            day=int(d)
        finish.loc['总计',finish.columns[i]]=finish[finish.columns[i]].sum()/(31-day)
        
#将float转成百分比
for i in np.arange(finish.shape[1]):
    if finish.columns[i] not in add_base:
        for k in np.arange(finish.shape[0]):
            if finish.loc[finish.index[k],finish.columns[i]]>=0:
                finish.loc[finish.index[k],finish.columns[i]]='%.2f%%'%(finish.loc[finish.index[k],finish.columns[i]]*100)

#写出
path=r' '#输出路径
finish.to_csv(path,encoding='gbk',index=True,columns=columns)
print('ok')
#另外根据需求可绘制一份热力图,直观发现数据变化
#绘制热力图
data_add=pd.read_csv(path,encoding='gbk')

pression_map=pd.pivot_table(data_add,index=['申请日期'],values=average_p)
f, ax = plt.subplots(figsize=(40, 15))
pal=sns.light_palette('red')
ax=sns.heatmap(pression_map,vmin=0,vmax=1,cbar=False,annot=True,linewidth=.5,cmap=pal)
plt.yticks([])
plt.xticks([])
plt.axis('off')

print('ok')

热力图制作的并不是很完美,行、竖列也没有添加,最左部分的基础数据(如申请单到签约单)是不需要做热力图的,那么是否需要图片输出后与热力图合并呢,这些也需要后期的探讨。笔记就先记录到这里。

这片文章是完整代码,后期根据情况是否需要整理pandas要点。


猜你喜欢

转载自blog.csdn.net/weixin_41712808/article/details/79638949
今日推荐