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 pd
import matplotlib
import matplotlib.pyplot as plt
import 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, shared
from docx.enum.text import WD_ALIGN_PARAGRAPH
class DocTools:
def __init__(self, filename):
self.document_name = f'{filename}.docx'
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 = 2020
df = 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"即可!
文章就分享到这儿,喜欢就点个赞吧!