如何用Python在导出的表格基础上进行数据统计-框架思路分享

12 篇文章 0 订阅
3 篇文章 0 订阅

在某台账管理软件中需要不定期的导出表格,并进行不同类别的筛选统计,为了方便理解,我需要加入不同维度的统计,如果某维度数据3组以上,我想进行绘制柱状图进行直观的理解。

现在东西已经做好了,现在把思路大纲记录一下,以及用到的非常有用的代码片段分享一下。

库汇总,这个需求下用到以下python库

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from datetime import date
import warnings
import re
from IPython.display import display
warnings.filterwarnings('ignore')

plt.style.use('seaborn-white') # 用来选择图的配色风格
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
#sns.set_style('darkgrid',{'font.sans-seif':['SimHei','Arial']})
print(plt.style.available)

这些库很直观,pd用来读取这个表格,sns或者plt用来画图,warning用来声明不报错,display用来展示表格。

上述代码的下边四行控制绘图字体等。print(plt.style.available)展示了有哪些风格,也就是对应use中’seaborn-white’这个内容的可选择内容。

思路框架

比如表中某关键分类列有几种内容,如果用excel则是数据透视。在不会python的时候,每次这种需求我都需要重新进行透视分析,现在我想做的就是下载表格覆盖存到固定位置,然后python直接进行分析。也就是变成下载、运行程序,两步。剩下的时间可以写个文档记录哈哈。

因此需要有路径记录,路径包括两个:1读文件,2存文件

path= 'F:\XX文件\XX汇总\XXX\abcdefg.xls'

# 输出有两种,写死的,写活的,比如此处用types和日期进行分着存
out_path= 'F:\XX文件\XX导出\XXX\abcdefg.xls'
out_path_different = f"F:\XX文件\XX导出\XXX\abcdefg+{types}+{today}.xlsx"

# 存表语法
need_save_df.to_excel(out_path,encoding='utf8')
need_save_df.to_excel(out_path_different,encoding='utf8')

毕竟是别人处导出的表格,可能列标题不顶在第一行,也或者一共40列,存在合并单元格导致了列标题不再一行上,下边两行代码解释见注释

df.loc[2][0:22]=df.loc[1][0:22]  # 把第一行的0-22列内容如知道第二行
names = df.loc[2].tolist() # 第二行每列变成表格,准备作为新的列标题

dfnew = df.loc[3::]  #把表格从第三行切出去,此时列标题还是原来默认的,需要改掉
dfnew.columns =names   # 把刚刚的names变成新的列标题

dfnotnull=dfnew.loc[dfnew['某某编号'].isnull()==False] # 选取编号非空行,并变成了新表格

刚才说过“某关键分类列有几种内容”,因此设置参数为types来识别这几种内容,

def get_answer(types=""):
    # 选取编号含JC的合同
    print('='*80+'\n'*3)
    print(f'★以下统计{types}类的合同内容:')
    # 用来识别这列中,是不是包含这个types
    df_jc=dfnotnull.loc[dfnotnull['某关键分类列'].str.contains(types)]
    # 后续操作省略
    
# 调用函数,按不同的types分别执行
for i in ['A','B','C']:
    get_answer(types=i)

刚才又说过,还需要画图,但假如某条件不满足则不绘制,那么可以在设置坐标的时候判断一下。比如年份为横坐标,统计出来的多于2年的数据,才画图

x=need_show_df['年份']  # 横坐标存为x中

if len(x.tolist())>=2:   # 如果x的年份有2年以上,才画后边的柱状图
    print('有数据,画图如下:')
    y1=need_show_df['赚钱']
    y2=need_show_df['花费']
    plt.rcParams['savefig.dpi'] = 400
    plt.figure(figsize=(15,5))
    plt.bar(x, y1,width=0.7,color='orange')
    plt.bar(x, y2,width=0.6,color='gray')
    for x, y,z in zip(x, y1,y2):
        plt.text(x, y+60, str(y), ha='center', va='bottom', fontsize=11.5,color='black')
        plt.text(x, z+3, str(z), ha='center', va='bottom', fontsize=11.5,color='gray')

        plt.title(u'赚钱花钱对比(万)',size=20)
        plt.xticks(size=15)
        plt.yticks(size=13)
        plt.ylim(0,2900)
        plt.legend(["赚钱总计","花钱总计"])

        plt.savefig(f'F:\XXXXX文件夹\{types}-统计图.jpg',dpi=400)
        plt.show()

代码片段记录

(1)数据中遇到科学计数法,如1.23E8,代表1.23*10^8这么个东西,因此这样的没办法直接进行数值计算,需要转换,转换函数如下:

def change_sience_note(list1):
    """改变科学计数法"""
    list2=[]
    for x in list1:
        if str('E') in x: 
            print('消除',x)
            x = x.split('E')
            x = float(x[0])*10**float(x[1])
            list2.append(x)
        else:list2.append(float(x))
    return list2

(2)查看系统有哪些字体的方式

a = sorted([f.name for f in mpl.font_manager.fontManager.ttflist])
fonts = []
for i in a:
    fonts.append(i)
fonts

(3)把某列内容变成行索引,比如是项目编号

#新表 = 旧表某列设为行索引
new_df_re_index = old_df.set_index('合同编号',drop=True,append=False,inplace=False,verify_integrity=False)

(4)单位转换,比如合同金额列合计后,由元转变为万元,并保留两位小数

contract_amount = round(df['合同金额'].sum()/10000,2)

(5)循环中,多次展示不同的表格

# 假设dataframe是个
for i in ['A','B','C']:
    get_answer(types=i)  # get_answer是刚才上文中创建的分析函数
    # 大量省略分析过程,最终生成一个表叫need_show_df
    display(need_show_df)   # 用display展示这次循环中最终生成的表格

本文结束,深入探讨的话,读懂下边代码

# VX rovesoul2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MINUS大大

你的鼓励是我写下去的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值