Pandas数据分析并生成图文一体的分析报告

文摘   科技   2023-12-24 13:38   北京  


ISEE小语


当遇到不如意的时候,请记着王阳明的这句话:“此心光明,亦复何言




回顾上篇



Python对Sqlite数据库的增、删、改、查操作,独立封装版

ISEE小栈,公众号:ISEE小栈Python对Sqlite数据库的增、删、改、查操作,独立封装版


开始本篇


    Pandas是一个开源的Python数据分析库,提供了高效的数据结构和数据分析工具,使得数据处理变得简单快捷。

    本次主要进行一个数据分析实例,并生成一个Word报告文档,是一个办公自动化的小实例。Pandas的简介与使用前面文章有分享,Word文档操作前面文章也有分享



环境:

  • Python 3.9.16


  • PyCharm



安装:

  • pip install pandas==2.0.3

  • pip install matplotlib==3.7.1

  • pip install seaborn==0.13.0

  • pip install python-docx==1.1.0




导入:

import pandas as pdimport matplotlibimport matplotlib.pyplot as pltimport matplotlib.patches as mpatches




源数据:

https://www.kaggle.com/datasets/henryshan/2023-data-scientists-salary

如果无法下载,文章后也会附源数据csv文件。




第一:查看源数据

读取ds_salaries.csv中的数据,验证数据以确认读取无误

# 读取CSV文件df = pd.read_csv('ds_salaries.csv')# 显示数据以确认读取无误print(df)

(左右滑动查看完整代码)



第二:数据统计

统计方式:

    统计2020年至2023年的数据,根据经验水平分别统计每年每个水平级别的薪资总额和计数。

涉及字段:

    • work_year:年份
    • experience_level:经验水平级别
    • salary:薪资


我们以2020年的数据为例。

首先,筛选出2020年的数据

df_ = df[df['work_year'] == 2020]

(左右滑动查看完整代码)


根据experience_level分组,并计算薪资总额和计数

result_df = df_.groupby(['experience_level']).agg(    salary=('salary', 'sum'),    count=('salary', 'count')).reset_index()
result_df['work_year'] = 2020
# 重新排序列以符合所需的输出格式result_df = result_df[['work_year', 'experience_level', 'salary', 'count']]
print(result_df)

(左右滑动查看完整代码)


第三:生成分析图

按水平级别和薪资总额生成柱状图

# 设置风格plt.style.use('ggplot')
# 使用plot()方法绘制块形图ax = result_df.plot(x='experience_level', y='salary', kind='bar', color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728'], edgecolor='black', figsize=(9, 6))
# 显示数据标签for p in ax.patches: ax.annotate(f"{p.get_height():,.0f}", (p.get_x() + p.get_width() / 2., p.get_height()), ha='center', va='center', xytext=(0, 5), textcoords='offset points')
# 设置图形标题和坐标轴标签ax.set_title('2020年的数据统计工资总额', fontsize=16, fontweight='bold')ax.set_xlabel('工作经验水平', fontsize=12, fontweight='bold')ax.set_ylabel('薪资总额(美元)', fontsize=12, fontweight='bold')
# 设置坐标轴的刻度标签的字体大小ax.tick_params(axis='both', which='major', labelsize=10)
# 添加网格ax.grid(True, which='both', axis='y', linestyle='--', linewidth=0.5)# 确保网格在条形后面ax.set_axisbelow(True)
# 旋转x轴刻度标签plt.xticks(rotation=45)
legend_colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728']legend_labels = result_df['experience_level'].values.tolist()patches = [mpatches.Patch(color=legend_colors[i], label=legend_labels[i]) for i in range(len(legend_labels))]ax.legend(handles=patches, fontsize=10)
# 调整布局以适应图形plt.tight_layout()# 显示图形plt.show()

(左右滑动查看完整代码)

结果:


按水平级别和其计数生成饼状图

# 动态创建explode数组explode = (0.1,) + (0,) * (len(result_df['experience_level']) - 1)  # 凸显第一块
# 定义颜色数组colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
# 使用matplotlib生成饼图plt.figure(figsize=(8, 6))plt.pie( result_df['count'], labels=result_df['experience_level'], autopct='%1.1f%%', startangle=140, colors=colors, explode=explode, shadow=True, wedgeprops={'edgecolor': 'black'})plt.legend(result_df.experience_level, loc='best')plt.title(f'2020年经验水平级别占比')# 确保饼图是圆形plt.axis('equal')plt.show()

(左右滑动查看完整代码)

结果:



    以上2020年统计分析就完成了,那么就按部就班的将2021-2023年的统计分析也做出来。代码一样这里不再重复描述了。

    接下来就将分析内容写入Word!


第四:生成报告

    报告生成是以Word的形式,将2020-2023年的统计写入Word中。由于以前文章分享过【python对Word文档内容的增、删、改、查操作】,现在我们将直接调用写入的方法即可。

python对Word文档内容的增、删、改、查操作,独立封装版

九月de云,公众号:九月de云python对Word文档内容的增、删、改、查操作,独立封装版


写入Word的方法:

# -*- coding: utf-8 -*-
from docx import Document, sharedfrom docx.enum.text import WD_ALIGN_PARAGRAPH
class DocTools: def __init__(self, filename): self.document_name = f'{filename}.docx'
@property def open_document(self): document = Document(self.document_name) return document
def save_document(self, document): document.save(self.document_name)
def create(self): """ 创建一个新的Word空文档 :return: """ document = Document() document.styles['Normal'].font.name = 'SimSun' self.save_document(document) return f"Word文档{self.document_name}创建成功!"
    def insert_title(self, title, level=1, size=18): document = self.open_document title_ = document.add_heading(title, level=level) # 设置样式 title_.style.font.size = shared.Pt(size) title_.style.font.bold = True title_.style.font.shadow = True # 将标题居中 title_.alignment = WD_ALIGN_PARAGRAPH.CENTER self.save_document(document) return f"标题【{title}】添加成功"
    def insert(self, content): document = self.open_document paragraph = document.add_paragraph() paragraph.add_run(content) # 首行缩进两个字符 paragraph_format = paragraph.paragraph_format paragraph_format.first_line_indent = shared.Inches(0.2) # 设置行间距为1.5 paragraph_format.line_spacing = 1.5 self.save_document(document) return "段落内容插入成功"
    def insert_blank_line(self): document = self.open_document document.add_paragraph() self.save_document(document)
    def insert_img(self, image): from docx.shared import Inches document = self.open_document document.add_picture(image, width=Inches(5), height=Inches(3)) last_ = document.paragraphs[-1] last_.alignment = WD_ALIGN_PARAGRAPH.CENTER self.save_document(document) return f"图片{image}插入成功"

(左右滑动查看完整代码)

最后生成报告:

work_year = 2020df = get_data(work_year)bar_plot(df, work_year)pie_plot(df, work_year)dtl = DocTools('report')dtl.create()dtl.insert_title('数据科学家工资报告')dtl.insert_blank_line()dtl.insert(    '2020年各经验水平级别的总薪资')dtl.insert_img(f'{work_year}_bar.png')dtl.insert_blank_line()dtl.insert(    '2020年各经验水平总数占比')dtl.insert_img(f'{work_year}_pie.png')dtl.insert_blank_line()print('生成完成')

(左右滑动查看完整代码)

效果如下:



第五:优化扩展

    以上只是将2020年度的数据分析及生成报告,我们最终需要的是将2020年-2023年这四个年度的都统计出来。

     将生成的柱状图和饼状图的方法进行封装一下,避免做重复的工作,再分别统计出各年度的数据,这样能更高效率的工作。

    一键操作,最终生成一份较完整的报告。

    代码较多,就不贴了,有兴趣可以看源码。最终效果如下:

    这里举例了两种分析图的样式,在实际使用中可以加以丰富,前期分享的【Pandas数据分析,生成10种必备的可视化分析图】方便参考!

Pandas数据分析,生成10种必备的可视化分析图

ISEE小栈,公众号:ISEE小栈Pandas数据分析,生成10种必备的可视化分析图,详细独立版



第六:总结

    数据分析自动化办公事倍功半,能有效的提高效率。这里分享的只是冰山一角,数据领域大千世界,需要坚持不懈的探索。

    小栈整理源码,方便使用:


有需求的朋友可自取哟

获取:后台回复"report_to_word"即可!


     

文章就分享到这儿,喜欢就点个吧!



推荐阅读  点击标题可跳转


ISEE小栈
没有花里胡哨,简单才是王道。
 最新文章