admin管理员组

文章数量:1645532

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

仪表板 101 —第 1 部分:仪表板布局介绍

原文:https://towardsdatascience/dash101-part-1-introduction-to-dash-layout-810ec449ad43

数据可视化

学习用 Python 创建漂亮的定制仪表板

在处理数据时,我们经常需要交流和总结数据,以直观的方式呈现给自己和他人。Dash 是一个开源库,用于构建强大而灵活的仪表板。在三篇系列文章中,我们将构建下面的示例仪表板,以学习使用 Dash 创建仪表板的基础知识。在本系列中,我们将关注以下三个方面:

  1. **仪表板布局:**决定仪表板的结构(这个博客)
  2. **使用 CSS 的仪表板样式:**自定义仪表板的外观
  3. **Dash 回调:**添加交互性以增强仪表板

示例仪表板|按作者分类的图像

在本系列结束时,您将能够开始为任何定制需求制作您的定制仪表板。

🏡家政

常见的做法是将 Dash 应用程序代码保存在一个名为app.py的模块中。我们将遵循这一惯例。以下是遵循本系列文章的三个简单步骤:

  1. 将代码保存在app.py
  2. 在您首选的 IDE 中运行该模块:python app.py
  3. 在您的浏览器中访问 http://127.0.0.1:8050/ 查看开发中的仪表板。

📦数据

我们将使用易于访问的 titanic 数据集作为我们的样本数据(该数据可通过 Seaborn 获得,并获得 BSD-3 许可)。让我们

  • 导入必要的库,并加载和格式化数据集
  • 划分数据并训练一个简单的机器学习管道来获得测试数据的预测概率
  • 为下拉菜单和滑块定义辅助函数

我们将使用test数据作为仪表板的底层数据。

📝布局

让我们了解一下我们的示例仪表板的布局是如何构建的。布局中使用了三种组件:

  • Html 组件 : from dash import html
  • 仪表板核心部件 : from dash import dcc
  • Daq 组件 : import dash_daq as daq

我们现在将慢慢分解布局组件。在最外层,仪表板分为左窗格和右窗格:

作者图片

app = dash.Dash(__name__)
app.layout = html.Div([
    html.Div(),
    html.Div()
])if __name__ == '__main__':
    app.run_server(debug=True)

我们使用html.Div()来创建部分。如果我们运行这段代码,仪表板将是一个空白页,因为我们还没有提供任何内容。

现在,让我们更仔细地看看左侧窗格的组件。

左侧图像显示为补充,因为右侧图像中的注释阻挡了作者的内容|图像

app = dash.Dash(__name__)
app.layout = html.Div([
    html.Div([
        html.H1(),
        html.P(),
        html.Img(),
        html.Label(), 
        dcc.Dropdown(),
        html.Br(),
        html.Label(), 
        dcc.Dropdown(),
        html.Button()
    ]),
    html.Div()
])if __name__ == '__main__':
    app.run_server(debug=True)

现在,让我们看看右侧窗格:

作者图片

app = dash.Dash(__name__)
app.layout = html.Div([
    html.Div([
        html.H1(),
        html.P(),
        html.Img(),
        html.Label(), 
        dcc.Dropdown(),
        html.Label(), 
        dcc.Dropdown(),
        html.Button()
    ]),
    html.Div([
        html.Div([
            dcc.Graph(),
            dcc.Graph()
        ]),
        html.Div([
            dcc.Graph(),
            html.Div([
                html.Label(), 
                daq.BooleanSwitch(),
                html.Label(),
                daq.BooleanSwitch(),
                html.Label(), 
                dcc.Slider(),
            ]),
        ])
    ])
])if __name__ == '__main__':
    app.run_server(debug=True)

太棒了,我们已经完成了布局的所有组件的定义。然而,代码还不完整。我们现在将定义每个组件的参数:

# Graphs
histogram = px.histogram(test, x='Probability', color=TARGET, 
                         marginal="box", nbins=30)
barplot = px.bar(test.groupby('Binned probability', 
                              as_index=False)['Target'].mean(), 
                 x='Binned probability', y='Target')
columns = ['Age', 'Gender', 'Class', 'Embark town', TARGET, 
           'Probability']
table = go.Figure(data=[go.Table(
    header=dict(values=columns),
    cells=dict(values=[test[c] for c in columns])
)])# ********************* Dash app *********************
app = dash.Dash(__name__)
app.layout = html.Div([
    html.Div([
        html.H1("Titanic predictions"),
        html.P("Summary of predicted probabilities for Titanic test dataset."),
        html.Img(src="assets/left_pane.png"),
        html.Label("Passenger class"), 
        dcc.Dropdown(multi=True,
                     options=create_dropdown_options(
                         test['Class']
                     ),
                     value=create_dropdown_value(
                         test['Class']
                     )),
        html.Label("Gender", className='dropdown-labels'), 
        dcc.Dropdown(multi=True,
                     options=create_dropdown_options(
                         test['Gender']
                     ),
                     value=create_dropdown_value(
                         test['Gender']
                     )),
        html.Button("Update"),
        ]),
    html.Div([
        html.Div([
            dcc.Graph(figure=histogram),
            dcc.Graph(figure=barplot)
        ]),
        html.Div([
            dcc.Graph(figure=table),
            html.Div([
                html.Label("Survival status"), 
                daq.BooleanSwitch(on=True),
                html.Label("Sort probability in an ascending order"),
                daq.BooleanSwitch(on=True),
                html.Label("Number of records"), 
                dcc.Slider(min=5, max=20, step=1, value=10, 
                           marks=create_slider_marks([5, 10, 
                                                      15, 20])),
            ]),
        ])
    ])
])if __name__ == '__main__':
    app.run_server(debug=True)

让我们更仔细地看看每个组件:
◼️ [html.H1()](https://dash.plotly/dash-html-components/h1):传递了一个头字符串。
◼️ [html.P()](https://dash.plotly/dash-html-components/p):传递了一个段落字符串。
◼️ [html.Img()](https://dash.plotly/dash-html-components/img):在与 app 相同的目录下创建了 assets 文件夹,并将[left_pane.png](https://github/zluvsand/dash_dashboard/blob/main/titanic_dashboard/assets/left_pane.png)保存在 assets 文件夹中,传递了图片的路径。

titanic_dashboard
│   app.py
└───assets
│   │   left_pane.png

◼️ [html.Label()](https://dash.plotly/dash-html-components/label):传递了一个标签字符串。
◼️ [dcc.Dropdown()](https://dash.plotly/dash-core-components/dropdown):选择multi=True可以多选。使用自定义函数以编程方式准备optionsvalue
◼️ [html.Button()](https://dash.plotly/dash-html-components/button):按钮串被传递。
◼️ [dcc.Graph()](https://dash.plotly/dash-core-components/graph):提供了交互绘图。
◼️ [daq.BooleanSwitch()](https://dash.plotly/dash-daq/booleanswitch):设置on=True使开关从 on 开始关闭。
◼️ [dcc.Slider()](https://dash.plotly/dash-core-components/slider):使用minmaxstep(从minmax的数字序列,增量为step)为滑块创建可能的值范围。滑块上的起始值由value参数决定。沿着间隔的点由marks定义。

id和/或className用于组件允许我们在设计样式和构建交互性时引用单个或一组组件。现在我们将给出主要部件id和/或className:

该应用程序目前如下所示:

仅部分输出|作者图片

虽然这个无样式的静态仪表板有必要的组件,但我们仍然需要做更多的工作来实现它的最终外观。向仪表板添加交互性将使其更加有用。我们将在接下来的两篇系列文章中学习如何做到这些:
DASH101 —第 2 部分:用 CSS 和 Python 美化 DASH dashboard dash 101—第 3 部分:添加与 dash 回调 的交互性】

使用 Dash 时,了解一些 HTML 和 CSS 会非常有用。如果你想学习 HTML 和 CSS 的基础知识,请查看由 Udacity 提供的这个简短的免费课程。

Pierre chtel-Innocenti 在 Unsplash 上的照片

您想访问更多这样的内容吗?媒体会员可以无限制地访问媒体上的任何文章。如果您使用 我的推荐链接成为会员,您的一部分会费将直接用于支持我。

谢谢你看我的帖子。如果你感兴趣,这里有我的一些帖子的链接:
◼️️ 用这些技巧丰富你的 GitHub 个人资料
◼️️ 用这些技巧丰富你的 Jupyter 笔记本
◼️ 用这些技巧组织你的 Jupyter 笔记本
◼️ 用 Python 实现简单的数据可视化,你会发现有用的
◼️ 6 个简单的技巧,让你在 Seaborn (Python)中有更漂亮和定制的情节

再见🏃💨

DASH101 —第 2 部分:用 CSS 和 Python 美化 DASH 仪表板

原文:https://towardsdatascience/dash101-part-2-prettify-dash-dashboard-with-css-and-python-3866c069a3b6

数据可视化

学习用 Python 设计漂亮的仪表盘

级联样式表,通常称为 CSS,用于格式化和样式化网页。Dash 应用程序完全可以用 CSS 定制,因为 dashboard 是一个 web 应用程序。在这篇文章中,我们将学习熟悉 CSS 的基本知识,以及如何使用它来设计 Dash dashboard。此外,我们将简要地看一下用 Python 定制 Plotly 图形。

照片由丹-克里斯蒂安·pădureț在 Unsplash 拍摄

在上一篇中,我们完成了布局的结构。在这篇文章中,我们将继续上一篇文章的内容,并设计出最终的布局。

📌请注意,本文中显示的代码不是独立的。参考前一篇文章的代码片段是这篇文章的先决条件。为了避免重复,这些片段被省略了。

🔤造型基础

现在让我们学习造型的基础知识。我们将从布局中选取更新按钮作为示例,并将其样式化为如下所示:

如果我们将样式表(即.css文件)保存在与app.py相同目录下的一个名为assets的文件夹中,Dash (v0.22 及以上版本)会自动获取它们。我们将把 CSS 代码保存在一个名为style.css的样式表中,这是样式表的一个常见命名约定。该目录将如下所示:

titanic_dashboard
│   app.py
└───assets
│   │   left_pane.png
│   │   style.css

现在,简单介绍一下 CSS。下面是 CSS 语法的基本结构:

selector {
  property: value;
  property: value;
}

选择器决定选择哪个组件进行样式设计。我们将使用三种类型的选择器:
◼ ️ 类型选择器由 HTML 标签的名称给出,例如[button](https://developer.mozilla/en-US/docs/Web/HTML/Element/button)。它适用于该类型的所有 HTML 组件。如果我们希望所有按钮的样式一致,使用类型选择器会很有帮助。
类选择器由以.为前缀的类的名称给出,例如.dropdown。在 Dash 中,您可以使用名为className的参数为任何组件指定类名。这允许我们有选择地将特定的组件组合在一起,以便我们可以一起设计它们的样式。
Id 选择器由 Id 名称加上前缀#给出,例如#update-button。使用 Dash 时,可以使用id参数指定组件的 id 名称。与className不同,id在整个应用程序的所有组件中必须是唯一的。

{}中的语法称为声明块,它定义了我们想要的样式。如果你想学习更多关于 CSS 的知识,这个和这个对初学者来说是很棒的额外资源。

让我们把我们刚刚学到的东西付诸实践,并设计按钮。通过在style.css中包含下面的代码,button 将得到它的 after look。

button {
  width: 240px;
  height: 40px;
  cursor: pointer;
  border: 0px;
  border-radius: 5px;
  background-color: black;
  color: white;
  text-transform: uppercase;
  font-size: 15px
}

这里,我们使用了类型选择器。让我们来分解一下代码:
widthheight调整按钮的大小
cursor: pointer;当光标悬停在
上时将光标变为指针◼ border: 0px;移除边框线
border-radius: 5px;圆角
background-colorcolor改变背景和文本颜色
text-transform将文本转换为大写
font-size增加文本的字体大小

由于按钮有id,如果我们想:

#update-button {
  width: 240px;
  height: 40px;
  cursor: pointer;
  border: 0px;
  border-radius: 5px;
  background-color: black;
  color: white;
  text-transform: uppercase;
  font-size: 15px
}

除了使用单独的样式表,CSS 样式也可以通过 Python 脚本中的style属性进行内联。当在 Python 中以内联方式指定 CSS 语法时,每个属性和值都需要用引号括起来,并在字典中提供。下面是我们的代码如何适应这种格式:

html.Button(id='update-button', children="Update", 
            style={'width': '240px', 'height': '40px', 
                   'cursor': 'pointer', 'border': '0px', 
                   'border-radius': '5px', 'background-color': 
                   'black', 'color': 'white', 'text-transform': 
                   'uppercase', 'font-size': '15px'})

将字典键转换为 camel case 也是可行的:

html.Button(id='update-button', children="Update", 
            style={'width': '240px', 'height': '40px', 
                   'cursor': 'pointer', 'border': '0px', 
                   'borderRadius': '5px', 'backgroundColor': 
                   'black', 'color': 'white', 'textTransform': 
                   'uppercase', 'fontSize': '15px'})

我们不会在这篇文章中使用这种格式,但是如果你愿意,你知道如何使用这种格式。

🎨用 CSS 设计仪表板样式

学习了基础知识后,我们现在要给我们的布局改头换面。让我们从调整区域大小和设置背景颜色开始。我们将从style.css中删除之前的练习语法,并添加以下内容:

body {
  background-color:#FFF2CC;
  margin: 0;
  padding: 0;
}
img {
  width: 320px;
  margin-bottom: 30px;
}
#container {
  width: 100%; 
  overflow: hidden;
}
#left-container {
  height: 937px;
  width: 320px;
  background-color:#3BA27A;  
  float: left;
  margin: 0;
}
#right-container {
  margin-left: 340px;
}
#visualisation {
  margin-top: 30px;
  width: 100%; 
  overflow: hidden;
  height: 430px;
}
#histogram {
  width: 700px; 
  height: 430px;
  margin-left: 35px;
  float: left; 
}
#barplot {
  width: 700px; 
  height: 430px;
  margin-left: 800px;
  margin-right: 20px;
}
#data-extract {
  margin-top: 30px;
  width: 100%; 
  overflow: hidden;
  height: 400px;
}
#table {
  height: 420px;
  width: 800px; 
  float: left;
  margin-left: 35px;
  margin-top: 15px;
}
#table-side {
  width: 400px;
  margin-left: 900px;
  margin-top: 60px;
  background-color: white;
  border-radius: 10px;
  padding: 20px;
}

哇,太久了!但是如果我们仔细观察,我们只使用了少数属性。◼ background-color:改变背景颜色。我们可以使用颜色名称(如black)、RGB 颜色(如rgb(0,0,0))或十六进制颜色(#000#000000)。这个是生成调色板的绝佳工具。
margin及其变化,padding:改变截面间距。本帖解释了marginpadding的区别。
height & width:调整小节大小。
overflow:决定一个元素被溢出时如何处理。
float:决定如何定位截面。◼把边缘弄圆。

大多数属性名称可能是不言自明的,但如果不是,或者只是想了解更多,可以在 MDN Web Docs 上查找。例如,如果你查找[overflow](https://developer.mozilla/en-US/docs/Web/CSS/overflow)作为例子,你可以看到不同的overflow行为,比如visiblehidden如何处理样本文本上的溢出元素。或者,你可以尝试在谷歌中搜索“CSS <属性名>”。

当您在样式表中进行更改并保存它们时,Dash 会自动刷新您的 web 应用程序。这叫热重装。理解 CSS 代码的一个好方法是观察添加或删除(注释掉)CSS 代码的小部分如何影响应用程序的外观。

你已经学习了一些不同的方法来理解 CSS 代码片段做什么,为了保持这篇文章的简洁,我们将不会详细讨论 CSS 语法的其余部分。

现在让我们格式化文本。我们将从上面开始向车身类型选择器(即body {})添加以下内容:

font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;

此外,我们将把这些额外的 CSS 语法添加到style.css:

h1 {
  margin-top: 50px;
  text-transform: uppercase;
  font-size: 40px;
  color: white;
  text-align: center;
}
p {
  margin-left: 20px;
  color: white;
}
.dropdown-labels {
  margin-left: 20px;
  color: white;
  font-weight: bold;
}
.other-labels {
  margin-left: 20px;
  color: #FFBD59;
  font-weight: bold;
}

是时候设计按钮了。这一次我们将全面展示它的风格:

#update-button {
  width: 240px;
  height: 40px;
  border-radius: 5px;
  margin-left: 38px;
  margin-top: 30px;
  border: 0px;
  cursor: pointer;
  background-color: black;
  color: white;
  font-weight: bold;
  font-family: inherit;
  text-transform: uppercase;
  font-size: 15px;
}
#update-button:hover {
  background-color: #FFBD59;
  color: white;
}

有两件事值得强调:
◼️首先是价值:[inherit](https://developer.mozilla/en-US/docs/Web/CSS/inherit)。当我们使用这个值时,我们让选择器从它的父元素继承属性值。◼ ️Another 是第二个选择者。看起来和我们目前看到的选择器略有不同:#update-button:hover。这些被称为伪类,只在指定的状态下设计选择器。在这个例子中,它只在鼠标悬停在按钮上时设置样式。

我们将设计下拉菜单,让它们看起来与整体色调更加协调:

.dropdown {
  margin-left: 20px;
  margin-right: 20px;
  margin-top: 5px;
}
.dropdown .Select-control{
  background-color: white;
}
.dropdown .Select-menu-outer{
  background-color: white;
}
.dropdown .Select-value{
  background-color: #3BA27A;
  color: white;
  font-size: 14px;  
}
.dropdown .VirtualizedSelectFocusedOption {
  background-color: #a5ecd1;
  color: black;
}
.dropdown .VirtualizedSelectOption  {
  font-size: 14px;
}

在这里,我们看到选择器后面跟着另一个选择器。这是为了样式化元素的某些部分。如果您想知道如何首先找到这些选择器值,答案是搜索。如果你搜索下拉样式资源,你会找到有用的资源,比如这个堆栈溢出答案和这个 Plotly 社区帖子。

现在,我们将格式化切换:

.toggle {
  margin-top: 8px;
}

app.py中使用颜色参数更容易改变切换的颜色。我们将不得不对另一个开关重复这一过程。

daq.BooleanSwitch(id='target_toggle', className='toggle', on=True,
                  color="#FFBD59")

最后,让我们来设计滑块的样式:

#n-slider {
  margin-top: 8px;
}
#n-slider .rc-slider-handle  {
  background-color: #FFBD59;
  border: 0px;
}
#n-slider .rc-slider-track {
  background-color: #E6E6E6;
}
#n-slider .rc-slider-dot-active {  
  border-color: #E6E6E6;
}

我们在这篇文章中所做的设计仅仅触及了 CSS 的皮毛,但是希望它能帮助你建立基本的直觉,让你知道如何使用它来定制和美化你的仪表盘。

下面是我们最终的定制样式表内容:

📊绘制图形的样式

现在,我们将致力于定制 Plotly 图形的外观。用 Python 比用 CSS 更容易设计 Plotly 图形的样式。我们将从直方图开始,改变不透明度,并在app.py中应用调色板:

histogram = px.histogram(test, x='Probability', color=TARGET, 
                         marginal="box", nbins=30, opacity=0.6, 
                         color_discrete_sequence=['#FFBD59', 
                                                  '#3BA27A'])

接下来,我们将添加标题,更改字体和背景颜色:

histogram.update_layout(title_text=f'Distribution of probabilities by class (n={len(test)})', font_family='Tahoma', plot_bgcolor='rgba(255,242,204,100)')

我们还将更新 y 轴的标签:

histogram.update_yaxes(title_text="Count")

同样,让我们美化柱状图:

barplot = px.bar(test.groupby('Binned probability', as_index=False)['Target'].mean(), x='Binned probability', y='Target', color_discrete_sequence=['#3BA27A'])barplot.update_layout(title_text=f'Survival rate by binned probabilities (n={len(test)})', font_family='Tahoma', xaxis = {'categoryarray': labels}, plot_bgcolor='rgba(255,242,204,100)')barplot.update_yaxes(title_text="Percentage survived")

最后,让我们修饰一下桌子:

table = go.Figure(data=[go.Table(
    header=dict(values=columns, fill_color='#FFBD59', 
                line_color='white', align='center',
                font=dict(color='white', size=13)),
    cells=dict(values=[test[c] for c in columns], 
               format=["d", "", "", "", "", ".2%"],
               fill_color=[['white', '#FFF2CC']*(len(test)-1)], 
               align='center'))
])
table.update_layout(title_text=f'Sample records (n={len(test)})', 
                    font_family='Tahoma')

我们使用 d3 格式格式化带有格式参数的列。我们用fill_color添加了交替的行颜色。

这是帖子修改后的最终布局:

当查找定制 Plotly 图形外观的不同方法时,您可能会发现 Python 图形参考很有帮助。

希望这篇文章向你展示了 CSS 的威力,以及它在设计 dashboard 时的高度灵活性。完成了仪表板的前端,现在是时候学习添加交互性来为我们的仪表板增压了:◼*DASH 101—第三部分:添加与 dash 回调的交互性*

使用 Dash 时,了解一些 HTML 和 CSS 会非常有用。如果你想学习 HTML 和 CSS 的基础知识,请查看由 Udacity 提供的这个简短的免费课程。

佛罗里达州本土民间艺术家朗达克在 Unsplash 上拍摄的照片

您想要访问更多这样的内容吗?媒体会员可以无限制地访问媒体上的任何文章。如果你使用 我的推荐链接成为会员,你的一部分会费会直接去支持我。

谢谢你看我的帖子。如果你感兴趣,这里有我的一些帖子的链接:
◼️️ 用这些技巧丰富你的 GitHub 个人资料
◼️️ 用这些技巧丰富你的 Jupyter 笔记本
◼️ 用这些技巧组织你的 Jupyter 笔记本
◼️ 用 Python 实现简单的数据可视化,你会发现有用的
◼️ 6 个简单的技巧,让你在 Seaborn (Python)中有更漂亮和定制的情节

再见🏃💨

DASH101 —第 3 部分:通过 DASH 回调增加交互性

原文:https://towardsdatascience/dash101-part-3-add-interactivity-with-dash-callback-420f564ad622

数据可视化

学习在 Python 中嵌入仪表板的交互性

向 dashboard 添加交互性增强了它的可用性,并帮助用户轻松地更深入地探索和分析数据。在这篇文章中,我们将学习 Dash 回调的基础知识,并为我们之前构建的示例仪表板添加交互性。

照片由莎伦·皮特韦在 Unsplash 上拍摄

我们将从上一篇文章中停止的地方继续。如果你想赶上我们在系列中学到的东西,这里有链接:
DASH101 —第 1 部分:DASH 布局介绍dash 101—第 2 部分:用 CSS 和 Python 美化 dash dash 仪表板

📌请注意,本文中显示的代码不是独立的。参考前一篇文章的代码片段是这篇文章的先决条件。为了避免重复,这些片段被省略了。

🔧回拨基础

在 Dash 中,我们使用@app.callback decorator 来增加仪表板的交互性。语法结构如下所示:

app = dash.Dash(__name__)
app.layout = ...[@app](http://twitter/app).callback(Output(...), [Input(...), Input(...)])
def update_output(input1, input2):
    ...
    return output1if __name__ == '__main__':
    app.run_server(debug=True)

在这个例子中,我们有两个输入和一个输出。装饰器中的输入数量应该与函数的参数数量相同。输出的数量应该与函数返回的输出数量相同。当任何输入发生变化时,Dash 会自动更新输出。

目前,我们的仪表板中的下拉菜单、按钮、滑块和开关仅仅是装饰,因为它们没有功能。在下一节中,我们将使用@app.callback装饰器为这些仪表板元素添加交互性。

🔨向仪表板添加交互性

让我们将图表设置为每次下拉列表值改变时更新:

# ********************* Dash app *********************
app = dash.Dash(__name__)
app.layout = html.Div([
    html.Div([
        html.H1("Titanic predictions"),
        html.P("Summary of predicted probabilities for Titanic test dataset."),
        html.Img(src="assets/left_pane.png"),
        html.Label("Passenger class", className='dropdown-labels'), 
        dcc.Dropdown(
            id='class-dropdown', className='dropdown', multi=True,
            options=create_dropdown_options(test['Class']),
            value=create_dropdown_value(test['Class'])),
        html.Label("Gender", className='dropdown-labels'), 
        dcc.Dropdown(
            id='gender-dropdown', className='dropdown', multi=True,
            options=create_dropdown_options(test['Gender']),
            value=create_dropdown_value(test['Gender'])),
        html.Button(id='update-button', children="Update")
        ], id='left-container'),
    html.Div([
        html.Div([
            dcc.Graph(id="histogram"),
            dcc.Graph(id="barplot")
        ], id='visualisation'),
        html.Div([
            dcc.Graph(id='table'),
            html.Div([
                html.Label("Survival status", 
                           className='other-labels'), 
                daq.BooleanSwitch(id='target_toggle', 
                                  className='toggle', 
                                  on=True, color="#FFBD59"),
                html.Label("Sort probability in ascending order", 
                           className='other-labels'),
                daq.BooleanSwitch(id='sort_toggle', 
                                  className='toggle', 
                                  on=True, color="#FFBD59"),
                html.Label("Number of records", 
                           className='other-labels'), 
                dcc.Slider(id='n-slider', min=5, max=20, 
                           step=1, value=10, 
                           marks=create_slider_marks([5, 10, 
                                                      15, 20])),
            ], id='table-side'),
        ], id='data-extract')
    ], id='right-container')
], id='container')
[@app](http://twitter/app).callback(
    [Output(component_id='histogram', 
            component_property='figure'),
     Output(component_id='barplot', 
            component_property='figure'),
     Output(component_id='table', 
            component_property='figure')],
    [Input(component_id='class-dropdown', 
           component_property='value'),
     Input(component_id='gender-dropdown', 
           component_property='value')]
)
def update_output(class_value, gender_value):
    # Update data to dropdown values without overwriting test
    dff = test.copy()
    dff = dff[dff['Class'].isin(class_value)]
    dff = dff[dff['Gender'].isin(gender_value)]
    # Visual 1: Histogram
    histogram = px.histogram(
        dff, x='Probability', color=TARGET, marginal="box", 
        nbins=30, opacity=0.6,  
        color_discrete_sequence=['#FFBD59', '#3BA27A']
    )
    histogram.update_layout(
        title_text=f'Distribution of probabilities by class (n={len(dff)})',
        font_family='Tahoma', plot_bgcolor='rgba(255,242,204,100)'
    )
    histogram.update_yaxes(title_text="Count")
    # Visual 2: Barplot
    barplot = px.bar(
        dff.groupby('Binned probability', as_index=False)['Target'].mean(), 
        x='Binned probability', y='Target', 
        color_discrete_sequence=['#3BA27A']
    )
    barplot.update_layout(
        title_text=f'Survival rate by binned probabilities (n={len(dff)})', 
        font_family='Tahoma', xaxis = {'categoryarray': labels}, 
        plot_bgcolor='rgba(255,242,204,100)'
    )
    barplot.update_yaxes(title_text="Percentage survived")
    # Visual 3: Table
    columns = ['Age', 'Gender', 'Class', 'Embark town', TARGET, 'Probability']
    table = go.Figure(data=[go.Table(
        header=dict(values=columns, fill_color='#FFBD59', 
                    line_color='white', align='center',
                    font=dict(color='white', size=13)),
        cells=dict(values=[dff[c] for c in columns], 
                   format=["d", "", "", "", "", ".2%"],
                   fill_color=[['white', '#FFF2CC']*(len(dff)-1)], 
                   align='center'))
    ])
    table.update_layout(title_text=f'Sample records (n={len(dff)})', 
    font_family='Tahoma')

    return histogram, barplot, table

if __name__ == '__main__':
    app.run_server(debug=True)

这里,我们定义了 2 个输入:下拉菜单和 3 个输出:图形。使用@app.callback装饰器和update_output()函数,每次下拉列表值改变时,图形都会更新。当在函数中使用选中的下拉值过滤数据时,我们确保没有覆盖原始数据test

下拉列表值的变化现在会触发仪表板的更新。但是,如果我们不希望在选择下拉列表值时更新图表,而只希望在按下按钮时更新图表,那该怎么办呢?让我们调整我们的仪表板,使其以这种方式运行。对于这种行为,State将会派上用场。

# ********************* Dash app *********************
app = dash.Dash(__name__)
app.layout = html.Div([
    html.Div([
        html.H1("Titanic predictions"),
        html.P("Summary of predicted probabilities for Titanic test dataset."),
        html.Img(src="assets/left_pane.png"),
        html.Label("Passenger class", className='dropdown-labels'), 
        dcc.Dropdown(
            id='class-dropdown', className='dropdown', multi=True,
            options=create_dropdown_options(test['Class']),
            value=create_dropdown_value(test['Class'])),
        html.Label("Gender", className='dropdown-labels'), 
        dcc.Dropdown(
            id='gender-dropdown', className='dropdown', multi=True,
            options=create_dropdown_options(test['Gender']),
            value=create_dropdown_value(test['Gender'])),
        html.Button(id='update-button', children="Update", n_clicks=0)
        ], id='left-container'),
    html.Div([
        html.Div([
            dcc.Graph(id="histogram"),
            dcc.Graph(id="barplot")
        ], id='visualisation'),
        html.Div([
            dcc.Graph(id='table'),
            html.Div([
                html.Label("Survival status", 
                           className='other-labels'), 
                daq.BooleanSwitch(id='target_toggle', 
                                  className='toggle', 
                                  on=True, color="#FFBD59"),
                html.Label("Sort probability in ascending order", 
                           className='other-labels'),
                daq.BooleanSwitch(id='sort_toggle', 
                                  className='toggle', 
                                  on=True, color="#FFBD59"),
                html.Label("Number of records", 
                           className='other-labels'), 
                dcc.Slider(id='n-slider', min=5, max=20, 
                           step=1, value=10, 
                           marks=create_slider_marks([5, 10, 
                                                      15, 20])),
            ], id='table-side'),
        ], id='data-extract')
    ], id='right-container')
], id='container')[@app](http://twitter/app).callback(
    [Output(component_id='histogram', 
            component_property='figure'),
     Output(component_id='barplot', 
            component_property='figure'),
     Output(component_id='table', 
            component_property='figure')],
    [State(component_id='class-dropdown', 
           component_property='value'),
     State(component_id='gender-dropdown', 
           component_property='value'),
     Input(component_id='update-button', 
           component_property='n_clicks')])
def update_output(class_value, gender_value, n_clicks):
    # Update data to dropdown values without overwriting test
    dff = test.copy()if n_clicks>0:
        if len(class_value)>0:
            dff = dff[dff['Class'].isin(class_value)]
        elif len(class_value)==0:
            raise dash.exceptions.PreventUpdate

        if len(gender_value)>0:
            dff = dff[dff['Gender'].isin(gender_value)]
        elif len(gender_value)==0:
            raise dash.exceptions.PreventUpdate# Visual 1: Histogram
    histogram = px.histogram(
        dff, x='Probability', color=TARGET, marginal="box", 
        nbins=30, opacity=0.6,  
        color_discrete_sequence=['#FFBD59', '#3BA27A']
    )
    histogram.update_layout(
        title_text=f'Distribution of probabilities by class (n={len(dff)})',
        font_family='Tahoma', plot_bgcolor='rgba(255,242,204,100)'
    )
    histogram.update_yaxes(title_text="Count")# Visual 2: Barplot
    barplot = px.bar(
        dff.groupby('Binned probability', as_index=False)['Target'].mean(), 
        x='Binned probability', y='Target', 
        color_discrete_sequence=['#3BA27A']
    )
    barplot.update_layout(
        title_text=f'Survival rate by binned probabilities (n={len(dff)})', 
        font_family='Tahoma', xaxis = {'categoryarray': labels}, 
        plot_bgcolor='rgba(255,242,204,100)'
    )
    barplot.update_yaxes(title_text="Percentage survived")# Visual 3: Table
    columns = ['Age', 'Gender', 'Class', 'Embark town', TARGET, 'Probability']
    table = go.Figure(data=[go.Table(
        header=dict(values=columns, fill_color='#FFBD59', 
                    line_color='white', align='center',
                    font=dict(color='white', size=13)),
        cells=dict(values=[dff[c] for c in columns], 
                   format=["d", "", "", "", "", ".2%"],
                   fill_color=[['white', '#FFF2CC']*(len(dff)-1)], 
                   align='center'))
    ])
    table.update_layout(title_text=f'Sample records (n={len(dff)})', 
    font_family='Tahoma')

    return histogram, barplot, tableif __name__ == '__main__':
    app.run_server(debug=True)

State保存下拉列表中的信息,但不会触发更新。所以现在当我们改变下拉列表值时,图形保持不变。只有当我们单击“更新”按钮时,图表才会更新为下拉列表中的选定值。此外,我们还以另一种方式改变了下拉列表的行为:当两个下拉列表中没有选择任何值时,我们禁止使用dash.exceptions.PreventUpdate进行更新。

每点击一次按钮,n_clicks递增。这意味着单击按钮会触发图形的刷新。在布局中,我们还将n_clicks初始化为 0,这样 if 条件:if n_clicks>0就不会出错。

最后,让我们为表格的切换和滑块添加交互性:

瞧啊。我们已经完成了向仪表板添加交互性。完整仪表板的代码也可以在这里找到。希望这一系列的三篇文章已经让你尝到了 Dash 的滋味,并激发了你创建自己的仪表板来巩固你的学习的兴趣。

罗纳德·库扬在 Unsplash 上的照片

您想访问更多这样的内容吗?媒体会员可以无限制地访问媒体上的任何文章。如果您使用 我的推荐链接成为会员,您的一部分会费将直接用于支持我。

谢谢你看我的帖子。如果你感兴趣,这里有我的一些帖子的链接:
◼️️ 用这些技巧丰富你的 GitHub 个人资料
◼️️ 用这些技巧丰富你的 Jupyter 笔记本
◼️ 用这些技巧组织你的 Jupyter 笔记本
◼️ 用 Python 实现简单的数据可视化,你会发现有用的
◼️ 6 个简单的技巧,让你在 Seaborn (Python)中有更漂亮和定制的情节

再见🏃💨

动态构建数据科学项目原型的快速方法

原文:https://towardsdatascience/dashboard-from-jupyter-notebook-65d594948d24

将您的 Jupyter 笔记本电脑转变为交互式仪表盘

通过将 Jupyter 笔记本电脑转换为交互式仪表盘,快速创建数据科学项目的原型。来自 Pexels 的 Rodolfo Clix 的照片

当您拥有一个精益技术堆栈时,您的数据科学项目将会进展顺利。

是的,栈越小,项目越好!

Jupyter 笔记本与数据科学家的日常工作密不可分。此外,大多数数据科学项目也需要一个交互式仪表板。

如果您可以将笔记本电脑转换成功能丰富的仪表盘,会怎么样💡。

你可以,现在!

通常,开发仪表板需要 HTML、JavaScript 和 CSS 知识。但是像 Streamlit 和 Dash 这样的工具已经使得在没有它们的情况下创建仪表板成为可能。

然而,您仍然需要手动将笔记本电脑转换为功能性应用程序。这涉及到大量的复制和粘贴。

但是有了水星,你可以立即把你的 Jupyter 笔记本变成一个交互式仪表盘,一个在线幻灯片,或者一个网络服务。您可以从 PyPI 包存储库中安装这个库。

pip install mljar-mercury

如何将笔记本转换成功能性仪表盘?

它只需要一个 YAML 配置!

是的,在笔记本的顶部,您需要定义一个具有 YAML 配置的原始单元格。您将拥有所有的仪表板属性、小部件和行为。

小部件名称将自动映射到您笔记本中的变量。然而,您应该在全局级别定义变量。

有道理,对吧?一个笔记本变成一个仪表盘。它的全局变量是我们需要与之交互的变量。所以为它们定义小部件。

这里有一个例子。

一个用 Jupyter 笔记本创建交互式仪表板的 hello world 示例。—作者图片。

这个笔记本有一个小部件——一个输入你名字的输入框。然后我们的仪表板会跟你打招呼。

请注意,YAML 的 param 部分下的小部件名称与我们的变量名相匹配。

让我们运行这个例子。要启动仪表板服务器,请在终端中执行以下命令。

mercury run dashboard.ipynb # if dashboard.ipynb is your notebook

这个命令将启动一个 Django 服务器和一个 celery 进程。如果是第一次,Mercury 还将运行数据库迁移。但是你现在不用担心他们了。

一个 hello world 将 Jupyter 笔记本转换成交互式仪表板的例子。—作者图片。

答对了。您已经创建了一个仪表板!没有 HTML!没有 JavaScript!没有 CSS!

使用更酷的部件和主题!

在前一个例子中,我们使用了一个小部件。然而,Mercury 有十几个很酷的功能,比如滑块、下拉菜单、复选框等等。

每个都有稍微不同的配置。例如,下面的代码将显示一个范围滑块。

params:
    range_variable:
        input: range
        label: Select the minimum and maximum 
        value: [45,50] 
        min: 30
        max: 65

注意,我们已经通过 value 属性给出了初始值。

这将呈现一个范围滑块如下。

Mercury 中的范围选择器滑块示例—由作者截屏。

查看小部件文档以获得完整的列表及其配置。

此外,如果你正在制作一个在线幻灯片,你可以选择一个主题。要制作演示文稿,您必须将输出类型指定为幻灯片和您偏好的主题。这里有一个例子。

output: slides
format:
    theme: moon

你可以从 11 个可用的主题中选择一个。

安全地与他人共享您的仪表板

这是我所知道的创建仪表板的最直接的方法。这也是让你的想法原型化的最快方法。

而且,这是一个典型的 Django 应用程序。因此,你可以像托管任何其他 web 应用程序一样,在代理服务器 (Nginx 或 Apache)后托管它。

此外,如果您使用开放的主机和端口号启动服务器,如下所示,您可以让本地网络中的其他人实时访问它。

mercury run dashboard.ipynb 0.0.0.0:8000

您网络中的人可以使用http://<Your local IP>:8000/访问它。

与他人共享应用程序时,一个常见的问题是安全性。您可能不希望每个人都看到仪表板。

Mercury 使用了 Django 的认证系统。您可以从管理面板创建用户帐户。

默认情况下,我们创建的所有仪表板都是公共的。通过在 YAML 文件中指定 share: private,您可以将它们设为私有。这将使仪表板可供登录用户使用。

不过,认证是 pro 的特色。因此,除非你有商业许可证,否则分享你的仪表板要小心。

创建交互式机器学习仪表板

如果你能控制一个笔记本的全局变量,你就能处理它里面的任何东西。

如果你在用笔记本建立机器学习模型(谁不是呢?😏)使用这个交互式仪表板,您可以做更多的事情。

您可以调整超参数,在数据集之间交替,等等。

为了说明这一点,我们做了一个简单的 K-Means 聚类和交互式聚类数选择。我在以前的几篇文章中用过这个例子。我喜欢 K-means,因为它简单。

以下笔记本将创建一个仪表板来实时调整集群数量。

一个用 Jupyter 笔记本创建的交互式仪表盘,用于调整机器学习参数——由作者截屏。

您可以调整滑块来改变集群,并点击“运行”按钮进行重新渲染。

将离线报告共享为 pdf 和静态页面

在大多数情况下,您必须使用仪表板作为报告工具。你需要一个强大的导出功能。

Mercury 有一个免费的内置导出功能。您可以下载 pdf 或静态 HTML 文件格式的报告。只需调整小部件,运行报告,然后单击下载按钮。

下次您想要提交报告时,您可以使用此工具,而不是手动复制粘贴您的 matplotlib 图表。

最后的想法

这个我提过好几次了。

开发应用不是数据科学家的超能力。构建 ML 模型是。

但数据科学家的几乎所有工作都以一个应用程序或一个仪表板告终。此外,没有这样的工具,就不可能展示或说明伟大的工作。

在过去的几年中,出现了许多技术来弥合这一差距。如今,数据科学家几乎不需要 HTML、CSS 或 JavaScript 技能来构建生产就绪的应用程序。您可以使用 Streamlit 或 Dash 等工具在几分钟内构建一个应用程序。

然而,Mercury 使动态构建数据科学项目原型变得更加容易。在不离开笔记本环境的情况下构建一个可共享的应用程序确实是一个游戏改变者。

感谢阅读,朋友!在LinkedInTwitterMedium上跟我打招呼。

还不是中等会员?请使用此链接 成为会员 因为,不需要你额外付费,我为你引荐赚取一小笔佣金。

通过 iPhone 健康活动数据进行数据分析的最佳实践

原文:https://towardsdatascience/data-analysis-best-practices-through-iphone-health-activity-data-66a2c48449df

分析自己的数据可以让你成为一名优秀的数据分析师!

优素福·萨尔汗在 Unsplash 上的照片

你的手机就像一个大数据采集器。它收集了大量与你的身体活动相关的数据。将数据分析和数据科学技术应用于数据可以帮助理解和改善健康。

为了写这篇博客,我提取了存储在我的 iPhone 上的身体活动数据,并使用了一些基本的数据分析技术。我很惊讶地看到一个人可以获得强大的洞察力。通过标准的 iPhone 健康应用程序无法获得这样的见解。它还帮助我更好地了解自己,并获得更多体育活动的灵感!

因此,我总结了一些与数据分析相关的最佳实践。

先了解原始数据!

我先解释一下 iPhone 是如何存储身体活动数据的。我曾经研究过苹果的技术规范来理解数据格式。这有助于更好地理解我正在处理的事情。

如果你有一部 iPhone,你的每一个物理步骤都会产生一个数据记录。该数据记录具有指示步数标识符的类型。它有一个日期、活动的开始时间、结束时间和一个值,该值表示所走的步数。这些步骤可以对应于任何运动——行走或跑步。

iPhone 活动数据格式(作者图片)

分析完整的数据可以带来全新的视角

我买 iPhone 已经三年了,我想到了一个问题,这三年我一共走了多少步?所以我开始分析储存在我的 iPhone 健康应用程序中的数据。

此条形图显示了记录类型“步数”三年的总步数。

3 年内的总步数(图片由作者提供)

420 万步——这是这个分析向我展示的。太神奇了!我很惊讶看到这个分析,因为我是第一次看到这个,标准的 iPhone 健康应用程序没有给出这样的分析。

聚合让你丢失信息

你可以做的另一个有趣的分析是获得全年的观点。iPhone 给出了一个年度级别的分析,但它是按月汇总的。

iPhone 年度分析(图片由作者提供)

当你聚合时,你会丢失很多信息。这是 2022 年的年度分析,采用非汇总的方式。

2022 年分析(图片由作者提供)

在这个视图中,您可以看到一年中的实际日期和当天的总步数。我可以观察到有些日子(用黑色三角形标记),我没有做太多的活动。这不是太好,现在激励我做更多的身体活动。

当你汇总数据时,这种激励性的灵感就消失了。因此,这种非汇总的年度视图比标准的 iPhone 分析更具信息量和启发性。

将视觉分析与实际行动联系起来

让我们转到另一个动机分析热图分析,这是我的最爱之一。

活动热图(图片由作者提供)

这里你可以看到 Y 轴是工作日,X 轴是小时。较暗的红色表示高活性。你可以观察到,一般来说,8 小时和 14 小时左右是高活动时间。热图越红,你的身体活动水平越高。

这种分析可以通过试图使其更红来在视觉上激励进行更多的身体活动。

视觉—动作循环

这种“视觉-行动循环”就是数据分析的目的。数据分析不仅仅是制作漂亮的图片,而是将它们与行动联系起来,并看到漂亮的图片得到改善!

关注数据的形状

你也可以更详细地分析你的身体活动。此分析显示了我在 2022 年 6 月 9 日这一天采取的步骤数量。早上 10 点左右可以看到 2783 级台阶的高峰。这对应的是高强度的跑步锻炼。

峰值分析(图片由作者提供)

看到这样一个峰值及其价值是非常有用的,因为它给了你一个要达到的目标。所以我现在可以尝试在下一次高强度跑步锻炼中打破我自己的 2783 步记录。

结论

分析自己的数据可以让你成为一名优秀的数据分析师!原因很明显。您可以更好地连接到自己的数据,进行改进,并查看对数据的影响!

此外,我希望我已经被激励去分析你的健康数据,去进行额外的身体活动。感谢您的阅读!

额外资源

学习数据科学的无代码平台

您可以访问我的平台,以一种非常简单的方式学习数据科学,并在不编码的情况下应用本文中描述的一些技术。https://experiencedatascience

Youtube 频道上的数据科学演示

这是我的 YouTube 频道的链接,我在那里展示了关于数据科学、机器学习和人工智能的各种演示。https://www.youtube/c/DataScienceDemonstrated
T3

订阅,以便在我发布新故事时随时获得通知。

https://pranay-dave9.medium/subscribe

您也可以通过我的推荐链接加入 Medium

https://pranay-dave9.medium/membership

数据分析:使用 Python、Dash 和 Plotly 从数据到仪表板

原文:https://towardsdatascience/data-analysis-from-data-to-dashboard-with-python-dash-and-plotly-cee4367708ab

实践教程

数据分析:使用 Python、Dash 和 Plotly 从数据到仪表板

提升您的分析水平并提供更好结果的数据分析场景

看起来好像有人在这里做重要的事情——来自的福克斯的照片

介绍

早在 1998 年,我在一家成长中的初创公司工作,我的老板交给我一项任务,为我们的一些合作伙伴提供一套客户报告。作为一个几乎没有接受过正规培训的项目经理,这对我来说是全新的,并迫使我走上了努力做得更好的道路。几十年后,我仍然在努力完成它,并试图教我在这个过程中学到的东西。

如果你和我一样,如果你再看到一个涉及股票数据集的项目,你可能会尖叫。Gapminder 很好,但现在它已经过时了。再看到一个基于 Covid 数据构建的仪表板实际上并没有多大价值。

这就是这个项目和文章背后的驱动过程。但是,这还不是全部。

我经常在我的项目中使用经济数据。我之前的文章关注的是商品报告,但是我们也可以使用美国美联储的 FRED 系统提供的其他数据。如果你愿意的话,这里有一个前一篇文章的链接——不过我要说的是,前一篇文章的一些内容可能会影响到这篇文章:

对我来说,这个项目始于对现有代码的重构。我经常使用这些数据,但当我第一次接触这些数据时,我采用了一种非常简单且不直观的方法。我想把它做好,所以它缺少了很多我想要的功能。我决定从头再来,这也给了我一个受教育的机会。

这就是我们今天要创建的,使用 Dash 框架的 100% python:

我们的仪表板/分析项目——由我拍摄

不再赘述,让我们开始吧。

预期

如果你从上到下阅读这篇文章,下面是你可以从这篇文章中得到的信息:

  1. 学习使用 Dash / Plotly 框架,使用非标准数据集,完全用 python 构建专业质量数据分析仪表板。
  2. 获取数据。
  3. 了解数据及其带来的挑战。
  4. 用于以各种形式操作数据的方法。
  5. 构建仪表板框架以查看和分析数据。
  6. 使用 plotly 库开发几种不同的图表类型,以不同的方式可视化数据。

我知道有些人通过搜索找到这些文章,试图解决一个特定的问题。对你来说,你可以获得一些有用的见解和代码,可能会让你在特定的道路上走得更远。

总的来说,我花了大约 30 个小时来组装这个系统。大部分时间都花在了挖掘文档、参考资料和博客上,试图避开关键挑战。自始至终,我将说出其中的许多概念,因为有些概念没有很好地记录下来,或者不容易找到。

要求

要完成这篇文章,你需要几样简单易行的东西:

  • 可以运行 Python 的计算机(至少是版本 3.7,尽管我是用 python 3.9 开发的)
  • “requirements.txt”文件中列出的模块
  • 我的知识库中的代码:

https://github/brad-darksbian/fed_dashboard

使用 pull_fed_data.py 脚本更新数据的一个 Fed API 键是不错的,但不是特别需要。

过去,我写了一整篇关于获取这些数据的文章。如果感兴趣,请查看:

这是我撰写此类文章的风格,我以高度迭代和逻辑的格式编写代码,因此几乎任何技能水平都可以理解。我刻意避免任何微妙的结构或复杂的方法,以保持高度的可接近性。因此,一些代码可能会有点慢,并且会经历额外的步骤,所以有机会自己进行重构,以进行实践和技能开发。

数据讨论

任何分析项目的第一步都是了解和理解您将使用的数据。这没什么不同。事实上,这个数据特别具有挑战性,所以它确实需要对正在发生的事情有所了解。

示例数据文件位于名为 data/fed_data.csv 的存储库目录中:

fed_data.csv 示例

该数据的核心是字段 report_date、data、report_name、hash 和 release_date 的简单排列。但它们确实需要一些解释。

report_date 字段是特定报告的日期。它与 report_name 一起创建可被视为唯一标识符的内容。嗯,理论上是这样,但我很快就会谈到这一点。

数据字段相对来说是不言自明的。这是与报告日期相关联的报告名称的数字数据。

report_name 是 FRED 系统用来引用特定报告的代码。它晦涩难懂,除非你把它们都背下来,否则是不可读的。总共有超过 200,000 份报告,祝你好运。

哈希是从我的数据库输出的函数,为每个不同的数据记录提供唯一的键。在这种应用中它被忽略。

release_date 是数据变得棘手的地方。你看,在常规的基础上,美联储在月内的特定日期发布经济数据,但他们会不时地用更新的信息修订数据。release_date 告诉我们数据的更新。因此,真正的唯一键是 report_date、report_name 和 release_date,它们将具有不同的数据字段。

如果我们只关心最近的数据,我们的模式将会又窄又高,每一行都有不同的记录,覆盖多个报告。这与我们在实践中经常使用的其他分析数据集非常相似。然而,添加 release_date 给了我们一个不同的维度。这让这项练习变得更具挑战性,让我们能够更好地发挥数据分析能力。

第一步

我们知道我们需要读入数据,并可能进行一些格式化。我们还知道,我们将把它输出到一个仪表板上以供使用。我们来设置一下。

与我的商品仪表板(在简介中链接)非常相似,我从一个基本框架开始,该框架全部包含在存储库中:

  • main.py 这是仪表板的布局文件和驱动程序。稍后会详细介绍。
  • business_logic.py —这是由 main.py 调用的文件,它设置了一些全局数据框架和结构。
  • support_functions.py —这是处理和功能逻辑的主力。
  • layout _ configs.py 这是一个容器文件,用于组织图表的各种布局和可视元素。

对于这些初始步骤,我们将关注 support_functions.py 文件。

我们对数据的格式有一个基本的了解,所以我们的第一个任务是以一种我们可以很容易处理的方式把它输入到系统中。为此,我们将整个数据文件读入 Pandas 数据帧。

# Base retrieval function - reads from CSV
def get_fed_data():
    file_path = base_path + "fed_data.csv"
    # file_path = base_path + "fed_dump.csv"
    df = pd.read_csv(file_path, na_values="x")
    df.rename(
        {"data": "report_data", "hash": "report_hash"},
        axis=1,
        inplace=True,
    )
    df["report_date"] = df["report_date"].values.astype("datetime64[D]")
    df["release_date"] = df["release_date"].values.astype("datetime64[D]")

    return df

这个函数非常简单。我们将可配置的 base_path 变量(未示出)拉成 file_path 的格式,该格式被馈入 read_csv pandas 函数以创建数据帧“df”。然后,我们简单地重命名一些列以保持一致性,并确保数据类型对于日期是正确的。然后我们返回处理过的数据帧。

目前为止都很简单。

然而,我们不能只是把这个原始数据框架放进一个图表,让神奇的算法去做它们的事情。我们需要考虑如何单独处理这些数据。

像这样的项目面临着一个挑战。没有人给我一个规格表或说明,我需要得到它。我不得不自己想办法。恐怖…

处理

当面对不明确的需求时,您通常必须用通用术语来思考。这就是我开始这个阶段的地方。

我知道我需要根据各种标准和格式提取数据,所以我开始创建一些助手函数,这些函数可以单独调用,也可以作为一个更大的过程的一部分来过滤和提炼。

我不会一一介绍,但这是通用模板:

# function to pull specific report
def get_report_from_fed_data(df1, report_name):
    df = df1.copy()
    df = df[df["report_name"] == report_name]
    df.sort_values(by=["report_date"], inplace=True)
    df.reset_index(drop=True, inplace=True)
    return df

这个特定的函数被定义为根据传入的报告名称提取输入数据帧的所有行。

我首先复制一份数据帧。我这样做是因为如果你修改一个数据帧切片中的数据,你将会收到熊猫的警告。我讨厌这样的警告。

下一行只是对传入的 dataframe 的副本进行过滤。这一行主要是通过这段代码从一个辅助函数到另一个辅助函数的变化。

最后,我根据函数的设计目的对结果数据帧进行适当的逻辑排序,然后重置索引。最后一步是使返回的数据帧具有一致的索引,只包含返回的行。

我有助手函数,用于过滤到一个精确的报告日期或大于或等于一个传递日期的报告日期,以及类似的发布日期函数。总而言之,这些涵盖了我所能看到的用于创建图表的大多数条件。

现在就花时间计划可能需要的东西,最终会比匆忙去做更有效率。思考底层数据和预测用例可以提供更好的上下文理解,并且通常可以节省时间。

数据标记

当我开始更多地考虑我的最终结果时,我意识到我有一个恼人的缺口,我应该修复它。它又回到了那个讨厌的 report_name 值及其神秘的本质。

为了更加方便用户,我应该提供一个可以引用的长名字。所以,我创建了另一个函数。为了简洁起见,这里对其进行了简化,但其核心是完整的:

def add_report_long_names(df1):
    df = df1.copy()
        if df.loc[index, "report_name"] == "AMDMUO":
            df.loc[
                index, "report_long_name"
            ] = "Manufacturers Unfilled Orders: Durable Goods"
            df.loc[index, "category"] = "Production"

    return df

上面的代码片段与我在数据上提供的标题图像相关。在这种情况下,我只是检查 report_name 字段,如果它等于“AMDMUO”,我将 report_long_name 值设置为“制造商未完成订单:耐用品”。我也借此机会放入一个“生产”的范畴。

当我这么做的时候,我对这个类别没有直接的想法,但我知道我可能想用它做点什么。

正常化

对于处理这类数据的新分析师来说,通常不太明显的事情是找出一种方法来直接比较两个完全不同的值。我们如何使其正常化,以便我们可以直接在图表上绘制比较,并使其有意义?

描述它的一个实用方法是,如何使用股票数据在图表上绘制亚马逊和沃尔玛的比较表现?最简单的方法是根据变化率定义比较。

这里也是同样的过程。而且,我经常对数据类型这样做。

幸运的是,熊猫很快就搞定了:

def period_change(df):
    df["period_change"] = df.report_data.pct_change()
    df["relative_change"] = 1 - df.iloc[0].report_data / df.report_data
    return df

该功能被设计为位于过滤链的末端。它希望输入的数据帧是一个独特的报告,过滤到一个日期,并按该日期排序。

该函数添加了两个字段,一个用于表示周期变化,即相对于前一行的变化率。另一个是基线变化,即相对于数据帧第一行的百分比变化。

但是,要做到这一点,我们需要绝对唯一的、持久的价值:

def get_latest_data(df1):
    df = df1.copy()
    df = df.sort_values("release_date").groupby("report_date").tail(1)
    df.sort_values(by=["report_date"], inplace=True)
    df.reset_index(drop=True, inplace=True)
    return df

同样,这是与其他帮助程序相同的模板,但在这种情况下,过滤器采用原始数据帧,按发布日期排序,按报告日期分组,并提取分组列表中的最新条目。随着新版本的增加,该功能确保使用最新的数据。简单而有效,允许我们轻松地将干净的数据帧输入到周期变化函数中。

种类

当我添加类别字段时,我知道我想使用它。我仍然不确定具体如何,但我确实需要一种从一个类别而不是一个报告中获取所有相关数据的方法。

与其他相互依赖的辅助函数不同,该函数必须处理主数据框。这并没有让我激动,但这是必须的。

def get_category_data_from_fed_data(df1, report_name, report_date):
    df = df1.copy()
    master_list = df["report_name"].unique()
    master_list = pd.DataFrame(master_list, columns=["report_name"])
    master_list = add_report_long_names(master_list)
    filtered_list = master_list[master_list["report_name"] == report_name]
    filtered_list = master_list[
        master_list["category"] == filtered_list.category.iloc[0]
    ]

    df_out = pd.DataFrame()
    for index, row in filtered_list.iterrows():
        temp_df = get_report_from_fed_data(df, row.report_name)
        temp_df = get_report_after_date_fed_data(temp_df, report_date)
        temp_df = get_latest_data(temp_df)
        temp_df = period_change(temp_df)
        temp_df = add_report_long_names(temp_df)
        df_out = df_out.append(
            temp_df,
            ignore_index=True,
        )

    df_out["period_change"] = df_out["period_change"].fillna(0)

    return df_out

这需要一点处理技巧,所以我将一步步来。

对于输入,我们采用主数据框架和特定的目标报告作为确定类别的基础。我们还传入 report_date 作为起点来限制我们的范围。

像其他助手一样,我们创建一个副本来工作。同样,让我们避免这些警告。

我们的第一步是创建一个惟一的报告列表,然后将它从数组转换回数据帧。这允许我们将报告列表输入到 add_report_long_names 函数中,为我们提供每个报告的长名称和类别。

然后,我们创建一个过滤列表,只列出我们感兴趣的报告名称。理想情况下,这应该只有一行,但是我有点多疑,所以我认为可能存在不止一行的情况。这解释了为什么第二级过滤器只获取第一行的类别。

最后,我们创建一个空数据框来保存我们的结果,并针对主数据框遍历 filtered_list 的行。这个循环展示了瀑布过滤的作用。对于每一行,我们获得匹配的报告,然后过滤结果,仅获得开始日期之后的日期,然后获取该结果并提取最新数据,获取该结果并添加周期变化字段,然后通过 add_report_long_names 函数运行该结果以添加额外的描述符。在瀑布的底部,我们将结果添加到输出数据帧中。

这给我们留下了一组与类别描述符匹配的干净的报告数据。

这就是我们程序的数据处理部分。我们现在准备使用这些数据。

仪表盘

像我的商品报告仪表板一样,我从一张白纸开始。我不会在这里详细讨论这个问题,但是如果感兴趣的话,可以看看引言中链接的文章。

经过大量的辩论,并确定了我真正想看到的定期展示,我决定了一个非常简单的安排和设计。

布局是由 dash-bootstrap-components 模块提供的基本网格,应用了 CYBORG bootstrap 主题。我喜欢深色的仪表板。

注意,为了让我的图表匹配,我使用了 plotly 模板。

下面是我如何设置我的布局:

  • 第 1 行:页眉和标题。
  • 第 2 行:带有开始日期选择器的报告选择器。
  • 第 3 行:显示最新报告日期、最新发布日期和最新数据值的信息栏。
  • 第 4 行:原始数据散点图。

第 1–4 行—按作者分类的图像

  • 第 5 行:从上一个值和从基线开始日期开始的周期性变化的折线图。

第 5 行—周期表—作者图片

  • 第 6 行:标题
  • 第 7 行:关于从最后一个值和从基线开始的变化的类别比较的表面图。

第 6 行和第 7 行—曲面图类别比较—按作者分类的图像

这给了我总共五张图表。让我们来建造这些。

原始数据散点图

第 4 行:原始数据散点图——按作者分类的图片

这个图表对我的价值在于,它让我不仅可以看到基于 report_date 的趋势,还可以显示基于 release_date 的修订历史。上图是消费者价格指数,它没有显著的修订,但其他图表有重大的数值修订,这很有趣。

因为这是一个散点图,我应用了内置的 LOWESS 回归线,以获得线性趋势的一般概念。此图表上还有侧边颜色条,它允许图表上的颜色用作数据点年龄的提示。

使用 plotly express,可以构建一个简单的图表:

def basic_chart(df, long_name):
    df["release_int"] = (df.release_date - pd.Timestamp("1970-01-01")) // pd.Timedelta(
        "1s"
    )

    fig = px.scatter(
        df,
        x="report_date",
        y="report_data",
        trendline="lowess",
        color="release_int",
        color_continuous_scale=px.colors.sequential.YlOrRd_r,
        hover_name="report_long_name",
        hover_data={
            "release_int": False,
            "release_date": "| %b %d, %Y",
            "category": True,
        },
    )

    fig.update_layout(
        newshape=dict(line_color="yellow"),
        title=(long_name + " Raw Data"),
        xaxis_title="",
        yaxis_title="",
        coloraxis_colorbar=dict(
            title="Release Date<br> -",
            thicknessmode="pixels",
            thickness=50,
            tickmode="array",
            tickvals=df.release_int,
            ticktext=df.release_date.dt.strftime("%m/%d/%Y"),
            ticks="inside",
        ),
    )
    # fig.show()
    return fig

需要执行的主要功能是为颜色栏添加一列。Plotly 要求颜色数据为数字格式。因为我试图基于 release_date 应用它,所以它只是使用内置的 pandas time 函数将日期字段转换为 unix 时间。现在我们有一个参考列来定义颜色条和标记。

之后,图表本身的格式几乎完全是股票。我面临的困难是修改颜色条以使用标签的日期,而不是使用整数值。这在 update_layout 函数的 ticktext 行中进行了布局。

注意,因为我将大多数图表定义为回调函数,所以我在代码中保留了 fig.show()行的注释。这使我能够在没有整个 Dash 应用程序开销的情况下进行故障排除和设计。运行它就像在文件底部添加一个函数调用并运行文件一样简单。

由于我们早期的工作,回调同样容易破译。

@app.callback(
    dash.dependencies.Output("basic-chart", "figure"),
    [
        dash.dependencies.Input("report", "value"),
        dash.dependencies.Input("start-date", "date"),
    ],
)
def basic_report(report, init_date):
    # set the date from the picker
    if init_date is not None:
        date_object = date.fromisoformat(init_date)
        date_string = date_object.strftime("%Y-%m-%d")

    # Filter to the report level
    df = sf.get_report_from_fed_data(bl.fed_df, report)
    df1 = sf.get_report_after_date_fed_data(df, date_string)
    # Filter again to the release
    df2 = sf.get_release_after_date_fed_data(df1, date_string)

    # Assign long names
    df2 = sf.add_report_long_names(df2)
    long_name = df2.report_long_name.iloc[0]

    fig = sf.basic_chart(df2, long_name)
    return fig

对于输入,应用程序将报告名称和开始日期发送给回调函数。现在我们将这些值输入回调函数的主体。

第一个 if 语句确保日期不为空(它不应该为空),并将其格式化为一个字符串,我们可以在助手函数中使用它。

然后,该函数调用 get_report 函数,在主数据帧中输入数据,对其进行过滤以获得相关日期,然后过滤以获得开始日期之后的发布。最后,它添加了长名称,因为这些名称在图表的标题中使用,并为一个变量获取一个名称,以输入到上面显示的 basic_chart 函数中。

该函数创建图表,并将其作为 figure 对象返回给应用程序第 4 行中保存的 basic-chart id。

basic_data = dbc.Row(
    [
        dbc.Col(
            dcc.Graph(
                id="basic-chart",
                style={"height": "70vh"},
                config=lc.tool_config,
            ),
            md=12,
        ),
    ]
)

当然,这是基本的行布局。这里我们可以看到 config 参数引用了 layout_config.py 文件,并应用 tool_config 参数来添加我喜欢的绘图工具。值“md-12”是 bootstrap 中主题的配置,它将图表设置为占据整行。

周期图表

周期图本质上彼此相似,并以类似于基本散点图的方式被称为周期图。我不会在这里花太多时间,但是和往常一样,如果你有问题,请联系我。

def baseline_change_chart(df, long_name):
    fig = go.Figure(layout=lc.layout)
    fig.add_traces(
        go.Scatter(
            x=df.report_date,
            y=df.relative_change,
            name="Baseline",
            line_width=2,
            fill="tozeroy",
        )
    )

    fig.add_hline(y=0, line_color="white")
    fig.update_layout(
        newshape=dict(line_color="yellow"),
        title=(long_name + " Change from Baseline"),
        xaxis_title="",
        yaxis_title="",
    )
    # fig.show()
    return fig

上面是基线图表的代码,是用 plotly go 构建的。数字方法。我选择这个而不是 plotly express 函数,因为即使在这个阶段,我也不完全确定我想如何构建我的图表。

然而,这种图表类型提供了一个额外的例子,所以它工作得很好。

与其他图表类型一样,这几乎是一本完美的教科书。这里的主要变化是应用了 layout_configs 文件中的样式,添加了一条水平线和 filltozeroy 参数。

在 Main.py 文件中,回调进行类似的链式过滤,以获得正确的最终数据帧。因为数据只使用不同的最近日期,所以又使用了一个辅助函数。

曲面图

在过去的几个月里,我开始喜欢上了一些东西的表面图。我发现,虽然较长时期的折线图可以充分显示变化,但看到它以三维地形表面的形式展示出来,不仅会强化变化,还会强化不同类别之间的相互作用。

不利的一面是,这些图表需要一点思考才能算出来。如果我正在设计一个一次性的或者带有定义好的打包数据的图表,那么这个图表可以很容易地构建。这是我在向商品报告数据添加曲面图时发现的情况。这里,我们有一个不同的情况。

曲面图旨在比较一个类别中 n+1 个报告的相对移动。这使得创建灵活的模板变得更加有趣。

如果你坚持这篇文章这么久了,这里有一个很大的收获。在我的互联网之旅中,我还没有在其他地方看到过这方面的内容。

与其他示例一样,我们将定义一个函数来基于处理后的数据帧生成图表:

def category_chart_baseline(df1, report_name, report_date):
    df = get_category_data_from_fed_data(df1, report_name, report_date)

    x_data = df["report_date"].unique()
    y_data = df["report_long_name"].unique()
    z_data = []
    for i in y_data:
        z_data.append(df[df["report_long_name"] == i]["relative_change"] * 100)

    fig = go.Figure(
        go.Surface(
            contours={
                "z": {
                    "show": True,
                    "start": -0.01,
                    "end": 0.01,
                    "size": 0.05,
                    "width": 1,
                    "color": "black",
                },
            },
            x=x_data,
            y=y_data,
            z=z_data,
        )
    )

    category = df.category.iloc[0]
    begin_date = np.datetime_as_string(x_data.min(), unit="D")
    end_date = np.datetime_as_string(x_data.max(), unit="D")

    fig.update_layout(
        title=category
        + " Report Baseline Comparison (% Change): <br>"
        + begin_date
        + " - "
        + end_date,
        scene={
            "xaxis_title": "",
            "yaxis_title": "",
            "zaxis_title": "",
            "camera_eye": {"x": 1, "y": -1, "z": 0.75},
            "aspectratio": {"x": 0.75, "y": 0.75, "z": 0.5},
        },
        margin=dict(
            b=10,
            l=10,
            r=10,
        ),
    )
    # fig.show()
    return fig

因为我们使用 get_category_data 函数,所以传入的数据帧必须是主数据帧。但是,除此之外,我们还会传入报告和开始日期——两者都是由应用程序确定的回调提供的。这使得第一部分很简单。

接下来,我们为 x 轴生成一个唯一的日期数组,并为 y 轴生成一个使用 long_report_name 的唯一的报告列表。对于 z 轴,我们通过长报告名称遍历数据框,并将 report_data 值输入到百分比值数组中。

因为所有东西都保持相同的排序顺序,所以 Y 轴和 Z 轴会对齐。

该功能的其余部分只是设置布局和定义方面和相机角度的偏好。还设置了标题部分的变量,但是现在这些应该是非常明显和过时的了。

还记得我说过回调很简单吗?

# Period Chart
@app.callback(
    dash.dependencies.Output("category-baseline-chart", "figure"),
    [
        dash.dependencies.Input("report", "value"),
        dash.dependencies.Input("start-date", "date"),
    ],
)
def category_baseline_report(report, init_date):
    if init_date is not None:
        date_object = date.fromisoformat(init_date)
        date_string = date_object.strftime("%Y-%m-%d")

    fig = sf.category_chart_baseline(bl.fed_df, report, date_string)

    return fig

因为我们经历了预先从功能上定义逻辑的麻烦,这个复杂的图表实际上只剩下样板文件中的一行。

可能最酷的图表类型变成了最容易实现的图表类型之一。

多方面的

困难的事情已经完成了。到目前为止,您已经有了一个很好的想法,可以使用一个具有一定挑战性的数据集和一个可以运行它来分析各种经济数据的应用程序。这是一个很大的成就。但是,有几件事我想说一下。

在存储库中,我包含了一个包含我的样式表的资产目录。这将设置下拉选择器和日期选择器的样式。其中一些需要一段时间来寻找和解决(再次强调,我不是一个真正的前端家伙)。这是一个很好的资源来弄清楚这个应用程序如何布局。

自我测试

对我来说,这是一项正在进行的工作。我故意遗漏了一些东西,我认为这些东西会对试图实践其中一些概念的人构成一个很酷的挑战。

  1. 向图表添加范围滑块以查看时间窗口。
  2. 将一些逻辑重构为基于类的方法。
  3. 将布局配置添加到 layout_configs 文件中,以设置曲面图的样式。
  4. 配置期间折线图以添加任意第二个或第三个报告。
  5. 链接应用程序,以拥有一个数据库后端,而不是一个 CSV 文件。

还有其他的,但是尝试寻找新的方法来挑战你的技能。学习和成长从来都不是白费力气。

结论

这篇文章大概就是这么做的。我希望你能发现它的知识性、教育性,或者至少有点价值。

我鼓励你想办法测试你的分析能力。深入挖掘 Dash 和 Plotly 更多。这些开发人员所投入的工作的深度和能力不断让我感到惊讶。

虽然我以前说过,但它值得重复。我喜欢教学和解释。如果你通读了整篇文章,但有不明白的地方,或者只是想要一个不同的例子,请联系我们。我非常乐意尽我所能给予回应和帮助。

下一次晋升所需的数据分析师技能

原文:https://towardsdatascience/data-analyst-skills-you-need-for-your-next-promotion-479275b80bad

“老”一代的建议

西蒙·艾布拉姆斯在 Unsplash 上拍摄的照片

介绍

首先,我要承认,这个主题已经在许多不同的平台上被反复讨论过。那么,我能提供什么还没说的呢?

好吧,事实证明,我比一般的媒介作者老多了。尽管有些人礼貌地称我为“成熟的”或“有经验的”,但事实是,我的观点是由这样一个事实形成的,即我已经存在了足够长的时间,足以记得条形图上的霓虹灯颜色和渐变是很酷的。因此,我能给你的是经得起时间考验的建议。

数据可视化

作为一名分析师,你可能要花至少 10 倍的时间来分析数据,因为你必须把信息呈现给你的观众。因此,图形和其他可视化表示非常重要,因为它可以帮助您更好地理解,即使对于那些没有受过数据集分析培训的人也是如此。通过构建可视化,您可以帮助公司的决策者一眼就理解复杂的想法。

那么如何提高这个技能呢?嗯,有很多在线课程形式的培训选项和大量专门研究可视化的工具。然而,我不太愿意推荐具体的技术或课程,因为世界变化太快,我想提供经得起时间考验的建议。

因此,养成探究他人作品的习惯。建立一个名为“灵感”的书签文件夹,里面放满博客链接。每周花 15 分钟浏览博客,让你的大脑充满各种可能性。

我也建议买几本书。FlowingData 大学的爱德华·塔夫特是数据可视化的鼻祖,我也是内森·尤的粉丝,在那里你可以找到书籍、博客、课程和教程。我把他的两本书数据点和*想象出来,*放在书架上寻找灵感。

你将如何实际创建可视化的机制将随着实践而来。你们有的人会爱上 R 或者 python,有的人会爱上 Excel 或者 Tableau。关键是让你的大脑充满各种可能性,这样你就可以在建立它之前想象你想要什么。

数据清理

数据科学家因其声称“构建机器学习模型的 80%是准备和清理数据”而闻名。然而,对于数据分析师来说也是如此。无论实际百分比是多少,事实是,总体而言,花在数据上的大部分时间都花在了清理数据上。

清理数据很重要,因为未清理的数据会产生误导模式,并导致错误的结论。在我职业生涯的早期,我的任务是提供第一次尝试就解决的支持电话的百分比。当我和我的管理人员讨论结果时,他们中的一个坚持说这些数字“没有意义”当我做更多的研究时,我发现 calls 数据有一个名为“status”的列,它有时会填充一个“X”。显然,系统会记录一个“X”作为测试记录,这应该被忽略。

数据清理技能随着实践和业务专业知识的增长而增长。这使得加速变得困难。一般来说,像kaggle或津迪这样的网站并不是实践数据清理的最佳场所,因为它们专注于数据科学,而且数据集通常已经相当干净了。另一方面,像 https://data.ca.gov/的或 https://data.gov/的这样的政府网站是寻找杂乱数据集的好地方。即使你不是 R 用户,你也可以跟随 TidyTuesday 项目,寻找有趣的数据集,熟悉在野外发生的清洁步骤的类型。

结构化查询语言

正如我提到的,我不太愿意推荐特定的工具或技术,因为环境变化太快了。可以肯定地说,python 和 R 将继续存在,但是 SQL 在另一个层次上。SQL 是数据库的语言;因此,学习 SQL 将永远是您操作和研究数据集以进行分析的最直接的方式。

如果你在一家允许你下载 excel 表格摘录的公司工作,问问周围的人,看看是否有可能用 SQL 直接访问数据库。一旦您熟悉了数据库结构并编写 SQL 以您想要的方式表示数据,您的效率将随着工作质量的提高而提高。

有许多资源可以帮助你改进 SQL 游戏, CodeAcademy 、 Udemy 和 Udacity 是寻找实践课程的很好的免费资源。 SQL 生成器和 SQL 美化器是很好的链接,可以帮助你学习。 Stack Overflow 有一个很棒的社区,可以回答你遇到的技术性 SQL 问题。

在 Rasgo,我们一直在大力投资回报数据社区。我们最近的项目是推出免费的 SQL 生成器,它可以生成特定数据转换所需的 SQL 语法。我们发现人们在 Google 和 Stack Overflow 上搜索所需的 SQL 语法,浪费了大量可以用于数据分析的时间。SQL 生成器是一个 SQL 查询的模板,它允许您定制列名和表结构,选择想要执行的操作,然后它为您构造各种不同“风格”的 SQL 语法。不要再强调 DATEDIFF()和 DATE_DIFF()之间的细微差别了!阅读本月早些时候的这篇文章,获得一些其他有用的在线工具。

批判性思维

批判性思维是最难掌握的事情之一,因为没有太多的课程或一刀切的方法来掌握这项技能。批判性思维是一种有意识的努力,挑战统治我们的自动心理过程。

批判性思维不是你与生俱来的,也不是你一旦拥有了它,它就会一直存在。相反,批判性思维是每当你有一个重要的决定或分析时,你有意识地激活的东西。这是一种有目的的挑战、质疑和证实假说的努力。

虽然有许多不同的资源可以帮助你提高批判性思维技能,但我想重点介绍的是提问。如果你养成了写下大量问题的习惯,你就会进行批判性思考。

让我们假设您被要求查看客户流失情况,以及最近是否有所改善。停下来问自己一些问题,比如:

  • 流失是如何计算的?为什么那样?还有其他方法吗?
  • 从客户的角度来看,什么是流失
  • 永远是顾客的选择吗?
  • 哪些因素可能很重要?我能测量一下吗?
  • 这个任务的目标是什么?证明,反驳,论证,支持?
  • 我可能忽略了什么?是否有我无法验证/证明的已知假设?

请注意这一系列问题是如何层层叠加的。回答一个问题可能会引出更多的问题。这完全没问题。这才是重点!

例如,当我在一家电信公司担任分析师时,我被要求调查上个月客户流失突然增加的潜在原因。(当时是 4 月)。我用批判性思维写下了一个类似上面的问题列表。

当我谈到如何计算客户流失的问题时,我挑战自己,考虑是否有其他方法来衡量客户流失。长话短说,我发现:

  • 该公司使用“月末”数字来计算流失率
  • 三月份实际上是一个涵盖二月份的“财政”月份
  • 二月是一年中最短的一个月
  • 使用另一个计算流失率的公式显示,三月份的流失率没有上升

基本上,流失的公式是这样的,它会在一年中最短的一个月,也就是所谓的三月,出现“高峰”,这仅仅是因为数学是如何工作的。

这个故事的寓意是,批判性思维有时会带你得出你意想不到的结论。这也是你今天可以决定改进的事情;这不是你需要与生俱来的某种神话般的软技能!

通讯

另一方面,是一种软技能。你可能是这个世界上有史以来最有才华、最有洞察力的数据分析师,但如果你不能与他人交流,那就没有任何好处。不幸的是,我说的其他人是指非技术人员。

作为一名分析师,你跨越两个不同的世界。在一个世界中,您必须与您的同行和其他数据专家一起解决技术问题。在另一个世界里,你是以商业为中心的决策者的翻译。你需要以一种支持性的而不是混乱的方式提供清晰的、高水平的解释。

开始锻炼这种软技能的一个方法是加入一个社区。有许多在线社区、网站和论坛可供数据分析师参与。我非常喜欢 slack 和 discord 频道作为与他人互动的方式,但众所周知,这些频道很快就会消失。我发现当地乐观和数据会谈。俱乐部是分析师们经常去的地方。你也应该通过开博客来练习你的沟通技巧。 Medium 是一个入门的好地方,在这里你可以锻炼你的创造力,练习,练习,再练习。

结论

跟随最新的趋势和技能来提升你的市场价值仍然很重要。例如,20 年前,VBA、宏、DAX 和 ASP 是提升你的优势的好技能。如今,这些技能已经不那么重要了。希望我已经给了你一些有用的建议,关于那些在过去 20 年里没有改变的技能,这样你就可以避免迷失在茫茫人海中。如果你想联系我,讨论过去的时光,你可以在本地乐观和数据会谈中找到我。俱乐部,你随时可以在 Rasgo 直接 ping 我。

处理大量数据特别请求的数据分析师指南

原文:https://towardsdatascience/data-analysts-guide-in-handling-flooding-data-ad-hoc-requests-257ea61e38e1

由 pikisuperstar 创建的生产性载体—www.freepik

管理临时请求并让您专注于重要项目的技巧

作为一名数据分析师,尤其是在团队还不了解数据的组织中,我们经常需要处理来自不同利益相关者的大量特定数据请求

这些请求一个接一个地看起来很小,所以你可以很快地从你的项目中抽出时间来处理它们。但是,当您将它们组合起来并计算处理它们所花费的时间时,可能会占用您大量的工作时间。

这些要求,虽然看起来不多, 可以让你远离其他重要的项目——你的具有技术敏锐度或产品特性的长期分析项目。这来自于花费在这些工作上的时间和资源(包括占用您的深度工作时间),更不用说在交付数据请求时来自涉众的额外问题/确认。

这些是我多年来学到的处理这些特别请求的技巧,在某种程度上“更聪明地工作”。

提示 1:提前几步做好准备

由故事集创建的进度向量—www.freepik

1.1 了解数据流以及您的交付成果的走向

保持好奇,弄清楚数据是从哪里来的。你可以从尝试理解整个产品/业务流程开始——每个步骤的目标,以及每个步骤的输入/输出。接下来,您可以考虑与这些步骤相关的数据点。然后跟进产品经理或工程团队,检查这些数据是否已经被跟踪,如果是,它们存储在哪里**。**

理解这种数据流将有助于在指标或者甚至产品/系统出现问题时进行调试。这也有助于识别追踪中遗漏的潜在重要数据点。

💡不仅要理解数据流入,理解数据流出也很重要。询问利益相关者将如何使用数据(例如,用于什么业务决策,或者用于哪个系统的输入,等等),这样你就可以为他们找出合适的交付格式——防止他们回来找你修改格式!

1.2 保存主要查询,并放在手边

让您的关键查询易于访问。这里的关键查询是在实现特定请求时经常使用的语法。当您实际上可以重用它们来缩短处理时间时,一次又一次地重写相同的简单查询是没有意义的。

同样,对于一些有重复请求的查询,你可以把它们变成一个由一些定义变量组成的查询模板(即用于查询的“where”子句)。这可以为下一次查询节省时间,同时防止重复操作导致任何语法错误。

💡如果您想更进一步,您还可以创建一个带有交互参数的简单仪表板。然后,您可以与利益相关方分享这些信息,根据他们的数据需求进行调整,防止他们向您提出普通而简单的请求。

1.3 使您的分析具有可重复性

通常——尤其是对于初创企业——我们使用由多次迭代组成的敏捷方法。通常需要这样的迭代来评估动态市场并随之调整。一段时间后重新运行一些分析并不少见,无论是为了更新检查,还是为了其他相关的涉众。

继续上一篇技巧文章,除了保存主要查询之外,您还可以通过使您的分析具有可重复性来提升它。这包括保存所有数据(或数据源参考,如果有数据保留限制)、源代码和脚本以及重现所需结果所需的工具文档

💡我通常在 Python 笔记本上做分析,上面有章节、数据源注释和结果。这样,如果我需要再次重新运行分析,我可以更新变量(如果有的话)并重新运行整个笔记本来获得结果,而不是重新编写所有的脚本。

技巧 2:项目任务的优先级排序

由 jcomp 创建的剪切板矢量—www.freepik

2.1 启动数据项目的票务系统

为项目团队中的临时请求和数据项目队列设置一个标签系统。这将有助于管理工作量,并防止风险承担者直接发送电子邮件或向团队成员发送请求的压力。此外,拥有一个票务系统将允许您收集更多关于请求的详细信息,以便进行优先级排序。

💡可以包含在票证表格中的一些详细信息如下:

  • 申请人团队
  • 请求的细节:需要哪些数据?采用哪种格式(即电子表格、仪表板、分析文档、数据库表格等)?数据将用于什么/如何使用?
  • 需要数据时的优先级/时间

通过这种方式,可以收到更多详细信息的请求,从而减少与请求者之间的来回沟通。并且可以针对团队带宽的优先级和分配来评估项目列表。

2.2 批处理、时间限制和临时花名册

我个人认为临时请求的主要问题是它的不可预测性。有时可以安静,有时可以泛滥。当它泛滥的时候,人们倾向于盲目地处理它——从一张票跳到另一张票,直到它们都完成。

批处理是我一直用来解决这个问题的策略。它将一些相似的任务(或者在这种情况下,临时请求)组合在一起一次完成,减少了上下文切换(即分析不同的表)或在工具之间移动的时间和精力。这对于处理大量可以组合在一起的简单任务非常有用。

为了确保我有时间做重要的长期项目(而不只是停留在一堆临时的请求上),我做时间限制。就是预先计划好自己的日程,分配一个固定的时间段去做计划好的任务,并真正做到。到了项目时间,我会继续做项目,推迟任何临时工作,除非是在 P0。

💡如果你想更进一步,你可以在你的团队里有一个“特别花名册”。它的工作方式是每周(或者 3 天,或者 2 周,等等——由你决定),一个团队成员负责处理那一周的临时请求。这可以确保你在你的值班周只处理临时的请求,并且在你不值班的时候可以专注于其他项目。

技巧 3:启动“数据自助服务”

pch.vector 创建的满意度调查向量—www.freepik

3.1 记录关键指标、仪表板和分析项目

文档是关键。它服务于多种目的,包括理解的一致性(例如,这个“活跃用户”指标实际上意味着什么),对指标值的快速访问(通过仪表板),以及随着时间的推移对分析项目的迭代或改进。

对于指标文档,您将需要以下内容

  • 指标名称(即活动用户)
  • 指标描述—指标是关于什么的(例如,在过去 28 天内登录并进行积极互动的用户数量—在网站中点击/添加到购物车/交易)
  • 指标计算—计算公式(如果有)(例如,接洽率、订单成功率等)
  • 数据源/查询—用于提取指标的查询或表格

对于仪表板,您需要列出仪表板名称、描述和指标。最好也有度量文档的链接。

对于分析项目,文档可能因每个分析需求而异,但通常情况下,您会有背景、目标、假设、数据探索和结论。确保为创建的查询或脚本准备一个附录部分。

💡有了这些文档,当下一个特别的数据请求到来时,您可能能够通过共享这些文档链接为您的涉众启动一个“自助服务”机制,而不是直接为他们重新运行查询:)

3.2 教育你的利益相关者

我一直与不同类型的利益相关者合作,从技术产品经理到非技术项目经理和运营助理。不管他们的技术技能如何,我发现大多数时候人都愿意学习。我们可以利用这种“求知欲”来利用组织中的数据工具,建立“数据自助服务”文化来减少组织中简单的特别请求。

我们的主要角色是提供一种方法来帮助利益相关者尽快获得所需的数据。我们可以通过创建仪表板、查询模板和文档的存储库来促进这一点;然后将它们发布给涉众使用。

💡对利益相关者的教育可以从一个关于浏览存储库的视频开始。然后,转到简单利用仪表板,利用过滤器和交互参数获取他们需要的数据。更多的高级教育可以是关于数据源和 SQL/查询课程的研讨会,但这不是强制性的。

拥有这种设置将有助于我们作为数据团队以及利益相关者本身。作为数据团队,我们可以看到简单的临时请求数量减少,让我们专注于长期项目。作为涉众,他们学习新的技能,并且能够更快地获得所请求的数据(不依赖于数据团队和排队的特别请求)。

结束语

数据请求,包括特别的请求,总是会到达数据团队(确切地说,是数据分析师)。在某种程度上,这是一种感激,因为利益相关者信任你来帮助他们获取数据,所以很高兴看到他们的到来。我们只需要有效地管理它们,这样就不会干扰我们更有附加值的长期工作。

我上面分享的技巧是一些帮助你在请求和项目之间导航的更具战略性的技巧。我的一些其他战术行为技巧包括:

当需要时,不要害怕说不或拖延工作。这适用于涉众的需求或可用性不明确的情况,或者当它不是真正的优先事项时。

我希望这些技巧可以帮助你管理大量的分析特别请求。祝你好运!

供应链可持续发展的数据分析

原文:https://towardsdatascience/data-analytics-for-supply-chain-sustainability-c6066de41609

使用数据分析,通过诊断和战略决策减少端到端供应链运营对环境的影响

(图片由作者提供)

多年来,投资者对可持续发展透明度的要求越来越高,2030 年成为第一个重要里程碑。

通过 ESG 得分,组织的可持续性越来越受到重视。

因此,各公司现在都在争先恐后地实施二氧化碳减排路线图。

国际供应链网络的前一个例子—(图片由作者提供)

在之前的出版物中,我将供应链分析作为一套工具,为一家国际时装零售商提高 运营绩效降低成本

在本文中,我们将重点介绍如何使用相同的工具方法减少端到端供应链的环境影响

💌新文章直接免费放入你的收件箱:时事通讯

如何利用数据分析实现供应链可持续发展?

供应链分析是一套使用信息流来回答问题和支持决策的工具和方法。

可持续发展的四种供应链分析——(图片由作者提供)

每种类型都可以回答特定的问题,并通过使用方法、数学概念和分析工具来支持您的运营实现绿色转型。

描述性分析:二氧化碳排放报告

一套工具,提供可见性和整个供应链的单一事实来源,以跟踪您的货件、检测事故并衡量您的运营绩效。

**❓ QUESTION**
How many tons of CO2 are emitted by my distribution network?

这是你绿色转型的第一步:你需要衡量你的运营对环境的影响。

一套工具,提供供应链中测量二氧化碳排放的可见性和单一事实来源:

按国家

报告示例—(图片由作者提供)

按项目

报告示例—(图片由作者提供)

这个想法是测量沿着价值链的二氧化碳排放量,并建立报告,以了解你的分销网络的每一个环节的影响。

**💡 INSIGHTS** It looks like the easiest type from a mathematical point of view.However, it may be the main bottleneck of your green transformation as it requires harmonizing data from different systems.

如果您想要构建一个强大的基础来创建报告并为预测、诊断或说明性分析提供高级模型,这是非常必要的。

工作流程示例—(图片由作者提供)

📈 **ANALYTICS** - Data extraction, transformation and processing with SQL, Python
- Visualizations using matplotlib and PowerBI**🚀 RESULTS**
The measure of the emissions by scope and market to build your baseline of your transformation roadmap.

更多细节,你可以看看这个视频

(作者视频)

诊断分析:产品生命周期管理

这可以概括为事件或问题根本原因分析。

**❓ QUESTION**
What is the most polluting mode of transportation in France?

这一步非常接近描述性分析。建立了单一的统一数据源后,我们可以沿着价值链追踪排放情况。

分布排放—(图片由作者提供)

**💡 INSIGHTS** If your colleague from the sustainability team is asking you why emissions doubled last year.1\. Have a look at the historical data 
2\. Split the emissions by transportation mode (road, air, sea)

这将有助于您理解,这是因为运输团队在面临生产延迟后,用空运取代了海运。

**🚀 RESULTS** This kind of diagnostic can help your management to spot the biggest sources of emissions and put its focus on them.📊 **ADDITIONAL KPIS**
You can implement additional KPIs such as % of air freight (high emissions), % of electric last mile delivery to bring a more proactive approach and trigger alerts if needed.

规定性分析:更新你的目标函数

协助运营部门解决问题,优化资源以实现二氧化碳排放目标。

**❓ QUESTION**
Where should we locate our factories to minimize the CO2 emissions of our Supply Chain Network?

在上一篇文章中,我介绍了帮助运营部门解决问题和优化资源以达到最佳效率的解决方案。

供应链网络设计文章(链接)

对于您的绿色转型,工具和方法将是相似的。唯一的区别是,现在你的目标函数将支持减少二氧化碳排放量。

布尔图显示结果—(图片由作者提供)

在的上一篇文章中,我用方法论设计了一个最佳的工厂网络,来制造产品并交付给特定的市场。

初始线性规划问题—(图片由作者提供)

这个想法是使用一个线性规划模型来选择决策变量(工厂位置),以最低的成本生产和交付产品。

**💡 INSIGHTS** In this kind of exercises usually markets are very far from cheap production locations. Therefore, you'll have high levels of CO2 emissions due to transportation.

如果我们现在改变目标函数呢?

考虑可持续性的新问题—(图片由作者提供)

现在让我们要求模型在考虑运输和生产的同时,考虑到市场最小供应量的约束,使二氧化碳排放量最小化。

桑基图表示例——(图片由作者提供)

🚀 **RESULTS** You may need to completely transform your network to get plants close to your markets.The impact on the cost will be not negligible as you'll have to produce in countries with high labor costs.**💡 GO BEYOND**
Improve your model by including several types of transportation mode (electric, low emissions cargo fuels) that may increase the costs but reduce your CO2 footprint.Thus, you may find alternative solutions and keep some of your facilities in competitive countries.

结论

在 medium 上关注我,获取更多与数据分析和供应链管理相关的文章

为什么重要?

作为供应链经理,您的职责范围包括

  1. 了解并最小化风险
  2. 优化运营以降低成本和二氧化碳排放
  3. 提供资源规划的可见性
  4. 为未来场景做准备

同样的方法,同样的工具

对于描述性分析,没有什么变化,只是现在你需要更加重视数据质量。

至于其他的,调整你的关注点,在你的目标函数中包含二氧化碳减排。

在这段短片中,我们将详细介绍不同类型的供应链分析,

混合方法

这里的一切都应该考虑到你生产和交付的商品的价值。

如果您想保持适当的盈利水平,只关注二氧化碳减排可能是不合理的。

因此,您需要创新,并在数据驱动的见解的支持下使用替代解决方案。

用数码相机模拟不同的场景

数字孪生是物理对象或系统的数字复制品。

供应链数字模型是一种计算机模型,代表供应链中涉及的各种组件和流程,如仓库、运输网络和生产设施。

使用 Python 的数字孪生示例—(图片由作者提供)

模拟几个绿色计划的场景

场景 1:您想要建立一个本地仓库来缩短最后一英里的配送距离

  • 对服务水平会有什么影响?
  • 仓储成本会有什么影响(地点越多)?
  • 我们能减排多少二氧化碳?

场景 2:您希望停止空运以减少二氧化碳排放

  • 对商店的补货周期会有什么影响?
  • 分销计划员需要提前多长时间创建补货订单?
  • 对二氧化碳减排会有什么影响?

场景 3:您想要建立更多的工厂,为所有市场进行本地生产

  • 对生产成本会有什么影响?
  • 运输成本会有什么影响(工厂靠近仓库)?
  • 我们能减少多少二氧化碳排放量?

对于每个场景,您可以操作与计划相关联的参数,并查看您的整体性能会降低多少。

然后,您可以调整其他指标(仓库容量和位置、补货提前期等),直到您重新达到初始目标。

这将向您展示供应链的改进,以获得适应这些新的绿色倡议的稳健性水平。

https://www.samirsaci/what-is-a-supply-chain-digital-twin/

数字孪生模型的例子:绿色库存管理

(图片由作者提供)

绿色库存管理可以定义为以环境可持续的方式管理库存。

对于分销网络而言,这可能涉及一系列旨在减少订单传输、准备和交付的环境影响的流程和规则。

(图片由作者提供)

如果我们降低商场补货频率,会对二氧化碳排放量产生什么影响?

使用数据分析来模拟商店补货频率的变化,并衡量对整体环境影响的影响。

https://www.samirsaci/green-inventory-management-case-study/

数字孪生模型的范例:时尚循环经济

(图片由作者提供)

循环经济是一种经济模式,旨在最大限度地减少浪费和提高资源效率。

它包括设计注重寿命、重复使用和回收的产品和工艺。

(图片由作者提供)

一些公司已经实施了一种订阅模式,在这种模式下,客户支付一定的费用就可以在特定的时间段内获得的产品或服务。

使用数据分析来模拟循环订阅模式的几种情况对快速时尚零售商的减排和用水的影响。

https://www.samirsaci/how-sustainable-is-your-circular-economy/

考虑当地的倡议

管理浪费和减少消耗品的使用也是减少仓库运营对商店交付的影响的好方法。

减少包装薄膜的使用量—(图片由作者提供)

数据分析还可以帮助您估计这些小举措对整个网络的影响(如果应用于所有仓库)。

  1. 使用实际运行数据计算电流消耗
  2. 将这些参数包含在您的数字孪生兄弟中
  3. 概念验证后,估计节约目标
  4. 推断整个网络(每个仓库)的节约

所有这些举措都与降低成本和优化运营的努力相一致。

您可以调整您的持续改进方法,以跟踪耗材使用情况,并找到不会影响您工作效率的替代方案。

首先,从测量运营的当前消耗和环境影响开始。

数据分析可以帮助您自动化这一过程。

https://www.samirsaci/sustainable-logistics-reduce-packing-and-consummables-consumption/

关于我

让我们在 Linkedin 和 Twitter 上连线,我是一名供应链工程师使用数据分析来改善物流运作和降低成本。

如果你对数据分析和供应链感兴趣,可以看看我的网站

https://samirsaci

参考

  • 什么是供应链分析,Samir Saci,走向数据科学
  • 蒙特卡洛模拟的稳健供应链网络,Samir Saci

时尚数据分析:Excel 系列(# 1)-概述

原文:https://towardsdatascience/data-analytics-in-fashion-excel-series-1-f1a6eed57393

Microsoft Excel 数据分析入门综合蓝图

Timur Saglambilek 以像素拍摄的照片

本文讨论的原则适用于时尚以外的其他行业。换句话说,无论您是数据爱好者、研究人员、时尚爱好者、学生还是专业人士,讨论的 Excel 概念都与您的领域相关并适用。

时尚品牌和零售商正在寻找最大化数据分析的方法,主要是通过针对目标受众的个性化来改善产品供应。

根据麦肯锡的研究,将数据整合到规划、销售和供应链中的时尚和奢侈品公司已经收到了显著的效果,在库存和商店优化中实施数据驱动的决策,销售额增加了 10%,库存成本降低了约 15%。

一般来说,那些优化了数据能力以建立以客户为中心的业务的品牌,其数字销售额增长了 30-50%。

总而言之,随着每天发布的数据越来越多,时尚品牌越早学会利用数据,他们在这个时代的生存机会就越大——数据领先者和后来者之间的差距已经扩大。

和我在一起……

https://medium/data4fashion/fashion-and-big-data-application-cb946dd76844

虽然许多时尚品牌尚未利用数据的力量,但一些品牌正在探索员工技能提升选项和人才搜寻,一些品牌甚至愿意培训新的数据专业人员,如数据工程师、数据分析师、数据科学家、云工程师等。

换句话说,无论你是核心设计师、插画师、跟单员、技术设计师等,你都需要知道如何从你公司的数据中解读见解- 掌握数据分析。

也就是说,本文将重点关注数据分析的关键步骤之一,即**“数据清理”、**,但在探索这一步骤之前,让我带您了解一下数据分析生命周期的各个阶段。

数据分析生命周期的 6 个阶段

作者图片

每天大约产生 2.5 万亿字节的数据,随着技术的不断发展,我们产生的数据量也将不断增加。随着数据的创建,也需要对其进行处理和重用。因此,数据经历了一个围绕 6 个阶段的循环运动,每个阶段都有一个规定的目标、任务、功能和相关性。

以上各阶段依次进行,但是,流程可以是向前或向后移动- 这是一个迭代过程。

#1。数据发现:

照片由 Pavel Danilyuk 以像素拍摄

以下是数据发现阶段发生的一些活动:

  1. 数据团队和主要利益相关者检查业务趋势。
  2. 定义目标和成功标准。
  3. 创建业务案例研究,即确定一个业务问题,团队想出一个策略来处理它。
  4. 数据需求、数据来源和数据预期讲述的故事。
  5. 所需资源的评估和评价。
  6. 根据业务问题制定假设。

#2 数据准备:

焦点从业务需求转移到数据需求。

此时,数据团队执行以下任务:

  • 识别数据源
  • 确定在指定的时间范围内可以从每个来源获得多少数据。
  • 整理数据收集、处理和清理。
  • 这个阶段可能会执行多次。

#3 模型规划:

  • 团队探索来自前一阶段的数据。
  • 处理和存储数据需要分析沙盒。它还在整个项目时间框架内提供网络功能。
  • 团队了解变量并选择适合业务案例的变量- 特征选择用于模型构建。
  • 接下来,确定技术、要构建的模型和工作流。

# 4。模型构建:

  • 数据集是为测试、培训和生产而开发的
  • 模型是使用模型规划阶段确定的不同算法构建的。
  • 执行模型的试运行,以基于业务问题测试模型的有效性。

#5。沟通结果:

罗德尼制作公司在像素上拍摄的一张张照片

  • 该团队确定关键结果,衡量与业务问题相关的价值,并生成数据故事,以将结果传达给风险承担者。
  • 主要利益相关方将获得的结果与在数据交付阶段设定的目标和成功标准进行比较。
  • 这个阶段决定了项目的成败。

#6。操作化:

  • 最后,团队运行一个试点项目来部署模型和测试实时环境。
  • 这种方法有助于了解小规模生产环境中的模型性能和相关约束,并在全面部署之前进行调整。
  • 团队准备完整的报告、简报、源代码和相关文档。

然而,如果结果与阶段 1 中的成功标准相反,团队可以在数据分析生命周期中向后移动到之前的任何阶段,以修改任何输入,从而获得不同的结果。

数据分析周期确实是一个迭代过程。

阅读时间很长,但我很高兴我们已经涵盖了数据分析生命周期的基础知识。

***QUICK QUESTION:******Remember the focus of this article is on data cleaning, what phase of the data analytics life cycle do you think data cleaning belongs to?***

如果你做到了这一步,给自己竖起大拇指。你做得很好!

Gif by Giphy

但是,我还有一个理论概念要讲,然后直接进入 Excel 中的数据清理!

很简短,我保证!

为了更好地理解我们想要在 Excel 中做什么,强调数据清理的一些好处是很重要的。

拿起你的咖啡,让我们开始吧!!!

什么是数据清洗?

照片由阿德利·瓦希德在 Unsplash 上拍摄

数据清理是数据需求阶段的一个关键步骤,您可能要在这个阶段花费大约 80%的时间。换句话说,这个阶段的其余部分很大程度上取决于您的数据有多干净。因此,建议你尽最大努力完成这项工作。

为什么要清洗数据?

清理数据的主要原因是为了在构建模型时获得准确的结果。例如,当您构建一个模型来预测销售额或用户是否会点击广告时,重复的条目会改变您的结果。更重要的是,干净的数据更容易阅读、理解,也更容易展示。

说到这里,让我们进入你期待已久的时刻。

告诉过你我会长话短说的!

挤眉弄眼

Excel 用于数据分析

作者图片

Microsoft Excel 是一种已经存在了一段时间的电子表格应用程序。它不仅用于存储结构化数据,还可以执行计算、可视化、构建模型等。尽管它已经存在了 30 多年,但它在行业中仍然有很大的相关性,因此是学习数据分析的一个很好的工具。

为什么要用 Excel 开始分析?为什么不是 Python?SQL?

除了 Excel 价格合理、处理能力要求较低(设备类型)之外,它还为数据分析中使用的其他工具奠定了坚实的基础。换句话说,更容易学习,在其中建立基础将加深你对分析过程的了解。

简单地说,当你知道 Excel 的时候,学习其他复杂的工具,比如 SQL,就会变得很容易。这将确保你有一个更好的过渡。

关于这一点,整个系列将涵盖 12 种用于清理 excel 中数据的技术和公式。

准备好潜水了吗??

拿些饼干,让我们开始吧!!!

由 Tamas Pap 在 Unsplash 上拍摄的照片

Two things to do before performing data cleaning;#1.Make a copy of your dataset.
#2.Spend some time to understand your data-is it a sales data? customer data? what features does it have?the features, datatypes.Doing the #2 will guide you into what to look out for when performing data cleaning.

以下是本系列教程将要讨论的 12 种技术:

  1. 调整列的大小
  2. 去掉前导和尾随空格。
  3. 删除单元格中的换行符
  4. 删除重复项
  5. 处理空白行和单元格
  6. 规范判决案例
  7. 数字格式
  8. 突出显示错误
  9. 将文本拆分成列
  10. 合并两列或更多列
  11. 查找和替换
  12. 表格格式

既然您已经了解了数据清理的概念和一些清理数据的 excel 技术,请直接跳到这里的,您将直接进入使用上述 15 种技术中的每一种的逐步过程。

The next two tutorials in this series will be structured below;**Tutorial 2: Techniques 1–6****Tutorial 3: Techniques 7–12****Tutorial 4: A complete Data Cleaning Project in Microsoft Excel.**

每个教程都有截图、视频短片、练习题来强化你的学习。

点击 这里 开始!!!!

希望你喜欢读这篇文章,就像我喜欢写这篇文章一样。

不要犹豫,在评论区提出你的问题和意见。

在 LinkedIn 上和我联系。

干杯!

** [## 数据可视化实用指南

towardsdatascience](/practical-guide-to-data-visualization-83e375b0037)**

时尚的数据分析:Excel 系列(# 2)-数据清理

原文:https://towardsdatascience/data-analytics-in-fashion-excel-series-2-8e29be44a306

Microsoft Excel 数据分析入门综合蓝图

照片由UX在 Unsplash 上拍摄

欢迎来到 Excel 系列教程 2。点击 此处 阅读教程#1。否则,继续下面的教程#2。

本教程中涉及的数据清理技术有:

  1. 调整列的大小
  2. 去掉前导和尾随空格。
  3. 删除单元格中的换行符
  4. 删除重复项
  5. 处理空白行和单元格
  6. 规范判决案例

使用的数据集是 Kaggle 的时尚数据集,您可以在这里访问它们> > >数据集 1 和数据集 2

我们开始吧!

#1。调整列的大小:

有时,当您将数据集导入 Excel 时,一些列看起来被压缩了,因此很难看到每个单元格中的完整值。下面的图 1 给出了一个例子。

作者图片:图 1

有不同的方法来解决这个问题,但更快的方法包括两个步骤。

**STEPS:**1.Select the **'all button'**(to the left of column 'A').
2.Double click on any of the boundary lines between the columns.

作者图片:图 2

作者图片:图 3

这将自动调整所有列的大小,如图 4 所示。

视频 1:调整列的大小

图 4 中显示了相同的数据,但现在看起来更具可读性。

作者图片:图 4

#2.去掉前导和尾随空格:

前导空格和尾随空格是出现在数据输入的开头、中间或结尾的不必要的空白,它们可能很难被发现。图 5 的 A 列中示出了一个例子。

要去掉这些空格,请使用修剪功能。

作者图片:图 5

语法:

=修剪(文本)

**STEPS:**1\. Place your cursor on the column (**ProductID**) you wish to clean, hit **Ctrl shift +** at the same time.
2\. Select**'Entire column**'as illustrated in Fig. 6a
3\. Click ok.(This will create a new column to the left of ProductID).

作者图片图 6a

4\. In the new column(column A),Type **=TRIM(B2)**;where B2 is the cell reference for ProductID. See Fig. 6b
5\. Press **ENTER** 6\. The result will be a cell with '1001743' and without the unwanted spaces as shown in Fig.7 and Video 2.

作者图片:图 6b

作者图片:图 7

如您所见,单元格 A2 中的值现在更靠近行,并且没有任何前导空格。接下来的几个步骤将指导您如何在 A2 列的其余行中复制结果。

7\. Select cell A2 (10017413),hover your cursur towards the the tiny square on the right side of the green triangle.
8\. Double click to automatically fill the rest of the row so that your result will look like Fig. 8

作者图片:图 8

现在我们已经清理了不需要的空间,我们需要删除其中一列,因为重复是不正确的。

按照以下步骤完成该过程。

**STEPS:**9\. Place your cursor on cell A2, press **Ctrl Shift Down arrow key** simultaneously to select the entire column.
10.Ctrl C to copy the values.
11.**Ctrl Shift Up arrow key** to go back up.
12.Select cell B2
13.Navigate to **Paste** in the Home Tab.
14\. Click the drop down arrow and select 'value' under the **paste values** session.**This will copy the values in column A into column B seamlessly.
See video 2 for a demo.**

在这之后,右键单击 A 列并选择删除。

视频 2:删除不需要的空间

PS:不要犯普通复制粘贴方法的错误,因为它不会给你预期的结果。

#3.移除单元格中的换行符:

手动换行符和非打印字符有时会出现在数据集中。要消除这种情况,请使用清洁功能。在某些情况下,CLEAN 和 TRIM 函数会一起使用,特别是当数据集很大并且不可能发现所有换行符和额外字符时。

例如,在本教程示例数据集中,看起来没有任何可见的换行符,但建议在处理不需要的空间时使用 CLEAN with TRIM,如上面第 2 条所述。

参考视频#3,了解如何组合两种功能。

视频 3:结合修剪和清洁功能

要复制和粘贴数值,请参考#3 中的步骤 9–14

#4.删除重复项:

数据集中有多个条目会影响分析和模型构建的准确性。因此你需要处理它。你要么先突出显示它,要么直接删除它。

删除重复数据:

Excel 允许您定义什么是重复项,还可以选择要删除重复项的列。

**STEPS:***Select Data > Remove Duplicates > Check the data has header > check columns to remove duplicates from > Click OK*

作者图片:图 9

作者图片:图 10

如果您的数据有标题,请确保选中标题框。

作者图片:图 11

视频 4:删除重复项

#5.处理空白行和单元格:

缺失的值会对结果产生重大影响,并且总是会影响您从中得出的结论。虽然有不同的方法来处理缺失的价值观,但最重要的是不要忽视它们。

您可以决定用“无”、“0”或任何其他单词来填充缺少的单元格。使用以下步骤高亮显示并填充空白单元格。

**STEPS:**1.Select the entire dataset.
2.Hit the F5 key to open the **'Go To'** dialogue box**.** 3**.Click Special >select blank> click ok** 4.Type what you want to fillin the blank cells
5.Press CNTRL ENTER to automatically fill the word in all the blank cells.

作者图片:图 12

作者图片:图 13

PS:输入‘缺失值’后,记得按 Ctrl ENTER。如果您单独按 ENTER 键,您键入的单词将只出现在一个单元格中,其他空白单元格仍将保持空白。

视频 5:填补空白

作者图片:图 14

#6 标准化判决案例

使用数据集的另一个常见情况是不一致的句子情况。例如,一个列可能有大写、小写和大写的组合。您可以使用三个函数将整列转换为最合适的句子大小写。

=LOWER()—将所有文本转换为小写。
=UPPER() —将所有文本转换为大写。
=正确—将所有文本转换成正确的大小写。

**STEPS:** 1.Create a new column next to the ProductBand.
2.Type =PROPER(C2)-Where C2 is the cell reference of 'DKNY' in column C.(Fig.15)
3.Press Enter and you should have 'DKNY' converted to 'Dkny'.
4.Follow the procedure in the video to replicate the result in the rest of the rows.

作者图片:图 15

作者图片:图 16

同样,我们不能有重复的列,所以决定你喜欢的句子大小写,并参考#2 关于如何复制和粘贴值。然后删除不需要的列。

Follow the steps used in =PROPER()to apply the =LOWER()and =UPPER()functions.Refer to video 6 for a demo of the three functions.

视频 6:改变句子大小写

结论

很好的完成了总结部分。如果你有任何问题、反馈或特殊要求,请不要犹豫,在评论区提出,或者通过 LinkedIn 联系我。如果你还没有阅读第一篇文章,点击这里开始阅读。

此外,这些只是 Excel 中使用的一些数据清理技术。在下一个教程中,我将讨论更多的 6,然后做一个完整的数据清理项目。

听起来不错?

回头见!

希望你喜欢读这篇文章,就像我喜欢写它一样。

不要犹豫,在评论区提出你的问题和贡献。

在 LinkedIn 上与我联系。

干杯!

[## 数据可视化实用指南

towardsdatascience](/practical-guide-to-data-visualization-83e375b0037)

本文标签: 中文翻译一百一十博客TowardsDataScience