增强分析可读性-Pandas教程

2021-04-21 10:37:16 浏览数 (1)

磐创AI分享

作者 | Pathairush Seeda 编译 | VK 来源 | Towards Data Science

你的日常生活数据分析

作为一名数据科学家/分析师,你的工作是制作一份包含许多商业决策见解的报告。报表可以由几个有用的工具(如microsoftexcel、SAP)生成,也可以使用编程语言(如SAS、R或Python)进行定制。结果可以通过内部电子邮件发送给其他人,也可以通过仪表板发布。

和其他人一样,我也是一名数据分析师,在日常生活中使用python制作报告或演示文稿。我通常的任务是在2-3小时内进行分析,并提交给管理团队。

为了得到我想要的结果,我必须启动我的Jupiter笔记本内核并快速编写代码来生成数字。在那之后,我可以把结果放在微软的PowerPoint上,并在一天结束前附上一些基本的脚注,然后把它们发给我的主管,让他们演示并做出重要的决定。

一个痛点是,由于时间限制,我必须消化信息,编写代码生成结果,并将其以一种漂亮的格式放入Microsoft PowerPoint中呈现。

不幸的是,我使用的编程语言可能不适合管理团队的阅读,例如,在数字中添加逗号或不使用科学符号来显示大数字。

如果你提交报告时没有注意到这些方面,管理团队可能会对你的报告有很多抱怨,有时,他们会把报告扔到垃圾堆里,一眼也不看。那会让你非常恼火,因为你需要时间和精力。

要解决这个问题,你可以将编程语言的结果放入microsoftexcel,然后根据需要手动更改格式。Excel是一个很好的工具。不好的地方是你必须手工做。如果我们能在编程过程中实现自动化呢。那太好了,不是吗?

As-is

下面让我们看一下我为这个示例生成的数据帧。这是公司需要的收入额。如你所见,这是pandas数据帧返回的默认结果。没有任何配置。

我经常从我的主管或首席执行官那里得到的一个评论是。

你能让它更易读,更容易比较吗?”

解决办法可能是把这个数字除以一百万,然后把单位放在表的上方。你要记住的一点是,在你的演讲中应该保持一致。如果有100张表需要复制呢?很难,对吧。

我发现你可以用编程的方式解决它。我花了很多时间从网上收集以下代码片段。非常感谢Stack overflow!

我认为和你们分享这些会让任何像我一样发现这些问题的人受益。你会减少花在这上面的时间,然后把注意力放在内容的有效性上。

如何改进?

可读格式

我收到的最常见的评论是,你能把数字四舍五入,并使用符号,如M表示百万或K表示千?这将使你的表看起来更好,并减少不必要的信息。很多时候,我们不需要这么精确。

下面是一个函数,用于将数据框中的数字转换为所需的格式。

代码语言:javascript复制
def human_readable_format(value, pos=None):

    '''
    将数据帧中的数字转换为可读格式
    `pos` 参数与matplotlib ticker格式化程序一起使用。
    '''

    assign_unit = 0
    units = ['', 'K', 'M', 'B']
    while value >= 1_000:
        value /= 1_000
        assign_unit  = 1

    return f"{value:.2f} {units[assign_unit]}"

这是你将得到的结果。读起来容易多了,对吧?

此函数的缺点是将数字转换为字符串,这意味着你将失去数据帧的排序能力。这个问题可以通过先排序所需的值,然后再应用它们来解决。

你可以将结果保存到excel或CSV文件,并将其放入PowerPoint中。我的方法通常是截图,然后直接放到演示文稿中。

这个代码片段节省了我大量的时间来重新生成多个表,因为当你从你的主管那里得到注释时,你必须刷新所有的表。假设演示文稿中有100个表。对于那些一个一个手工修改的人来说,这是一场噩梦。

同样,格式化后,我们也可以在matplotlib图中使用它。如果你使用pandas库进行数据分析,我认为matplotlib将是你绘制图形的首选。

你可以使用与表格类似的可读格式设置此图形的y轴

代码语言:javascript复制
import matplotlib.ticker as mticker
import matplotlib.pyplot as plt

fig , ax = plt.subplots();
df['value_9'].plot(ax=ax);
ax.yaxis.set_major_formatter(
    mticker.FuncFormatter(human_readable_format)
)

看起来更有说服力。

突出显示单元格

有时你需要指出表中的重要数字、趋势或信息。你脑子里有一个逻辑规则,比如用收款金额的最大值突出显示月份。数字可以根据数据中的底层事务而变化。如果你想动态地突出显示它,就必须以编程的方式进行。

这是我用来使我的表格看起来更好的第二件事。它能帮助你传达信息,提高你讲故事的能力。从其余部分中强调什么是重要的。

代码语言:javascript复制
def highlight_max_value(series):

    # 获取序列中每个值的真或假状态
    boolean_mask = series == series.max()

    # 当布尔掩码为真时,返回颜色为橙色
    res = [f"color : orange" if max_val else '' for max_val in boolean_mask]

    return res

df.style.apply(highlight_max_value)

有时,你会更容易发现数据内部的潜在趋势。如果不对大量数据进行适当的重新排列,你是不可能从这些数据中发现这些模式的

少就是多

最后一个不是向数据框/图中添加一些有趣的内容,而是将其删除。有时少就是多。数据帧或图形中的组件越少,消息传递就越好。读者或接受者只能吸收他们必须吸收的东西。

你可以在这方面改变很多事情,例如。

代码语言:javascript复制
# 准备数据集

revenue = df[['value_9']].copy()
revenue['pct'] = revenue['value_9'] * 100 / revenue['value_9'].sum()
revenue = revenue.sort_values('pct', ascending=False).reset_index(drop=True)
revenue['cumsum_pct'] = revenue['pct'].cumsum()

import matplotlib.ticker as mticker
import matplotlib.pyplot as plt
import seaborn as sns

# 绘制条形图以显示收入金额

sns.set_context('talk')

# 放大图形的字体大小

fig , ax = plt.subplots(figsize=(9,6));
revenue['value_9'].plot.bar(ax=ax);
ax.yaxis.set_major_formatter(mticker.FuncFormatter(human_readable_format))
plt.title('Revenue generated');

# 以百分比绘制累计收入
# 展示前三位客户的影响

ax2 = plt.twinx(ax)
revenue['cumsum_pct'].plot(ax=ax2, color='orange');
ax2.yaxis.set_major_formatter(mticker.PercentFormatter())
sns.despine();

通过排列数据并向其中添加一些信息,可以使用更直观的图表进行决策。例如,我们知道只有前三位客户占我们收入的80%以上。因此,让他们保持良好的关系比其他任何事情都有必要。

摘要

在一个新的时代,数据分析员使用编程语言来生成报告或表示。它减少了很多手动任务的时间,但是还有更复杂的事情要处理,如上所述。这是一种权衡。

我想我今天和你们分享的技巧和窍门在某种程度上会有所帮助。

本文中的所有代码都可以在这里找到:https://colab.research.google.com/drive/1AZQ3kBGmpoherJxOP8yIwUZzyid-1i70?usp=sharing

0 人点赞