【数据挖掘】如何为可视化准备数据

一、说明

        想要开始您的下一个数据可视化项目吗?首先与数据清理友好。数据清理是任何数据管道中的重要步骤,可将原始的“脏”数据输入转换为更可靠、相关和简洁的数据输入。诸如Tableau Prep或Alteryx之类的数据准备工具就是为此目的而创建的,但是当您可以使用Python等开源编程语言完成任务时,为什么要在这些服务上花钱呢?本文将指导您完成使用 Python 脚本为可视化准备数据的过程,为数据准备工具提供更具成本效益的替代方案。

摄影:Robert Katzki on Unsplash

二、数据清洗概说

注意:在本文中,我们将重点介绍如何让 Tableau 为数据可视化做好准备,但主要概念同样适用于其他商业智能工具。

        我明白了。数据清理似乎是将可视化或仪表板变为现实的漫长过程中的又一步。但这是至关重要的,而且可以令人愉快。这是您通过深入了解您拥有和没有的数据以及为实现最终分析目标而必须采取的相应决策来适应数据集的方式。

        虽然 Tableau 是一种多功能的数据可视化工具,但有时获得答案的途径并不明确。在这里,在将数据集加载到 Tableau 之前对其进行处理可能是您最大的秘密帮手。让我们探讨一下为什么在将数据清理与 Tableau 集成之前,数据清理是有益的一些关键原因:

  • 消除不相关的信息: 原始数据通常包含不必要或重复的信息,这些信息可能会使您的分析混乱。通过清理数据,您可以消除浪费,并将可视化集中在最相关的数据功能上。
  • 简化数据转换:如果您对要生成的可视化有清晰的认识,那么在将数据加载到 Tableau 之前执行这些预转换可以简化流程。
  • 团队内部更易于转移:定期更新数据源时,新增数据源可能会带来不一致,并可能破坏 Tableau。借助 Python 脚本和代码描述(更正式地称为 markdown 文档),您可以有效地共享和授权其他人理解您的代码并解决可能出现的任何编程问题。
  • 节省数据刷新时间: 需要定期刷新的数据可以从利用 Hyper API 中受益,Hyper API 是一个生成特定于 Tableau 的 Hyper 文件格式的应用程序,允许自动上传数据提取,同时提高数据刷新过程的效率。

现在我们已经介绍了准备数据的一些优点,让我们通过创建一个简单的数据管道来将其付诸实践。我们将探讨如何将数据清理和处理集成到工作流中,并帮助简化可视化效果的管理。

三、使用 Python 脚本创建数据管道

图片来源:作者

我们的数据过程非常简单:数据清理、视觉对象数据处理,并将其转换为 Tableau 就绪的超级文件以实现无缝集成。

在深入研究我们的工作示例之前,最后一点是,对于 Hyper 文件转换,您需要下载库。此库简化了将 Pandas 数据帧转换为 Tableau .hyper 数据提取的过程。您可以通过在所选环境的终端中使用以下代码轻松完成此操作(对于那些不太熟悉环境的人来说,这是一篇关于它们是什么以及如何安装某些库的很棒的入门文章):pantab

#run the following line of code to install the pantab library in your environment
pip install pantab

四、教程:使用 Python 进行数据准备(探索加拿大的电动汽车牌照)

        我们将根据加拿大统计局的政府可用数据,专注于不同电动汽车制造商和车型的受欢迎程度。

重要的是要注意,这建立在我之前的文章中使用的数据集之上:使用R进行电动汽车分析。如果您有兴趣了解数据集的初步探索以及所做决策背后的基本原理,请参阅它以获取更多详细信息。本教程重点介绍如何构建 Python 脚本,在初始输入之后的每一步中,我们将每个 Python 脚本的输出保存到各自的文件夹中,如下所述:

图片来源:作者

        文件夹过程可确保管道井井有条,并且我们能够记录项目中每个输出。让我们开始构建我们的第一个 Python 脚本!

4.1 数据清理

        管道中的初始脚本遵循数据清理的基本步骤,对于此数据集,这些步骤包括:保留/重命名相关列、删除 null 和/或重复项,以及使数据值保持一致。

        我们可以从指定输入文件位置和输出文件的目的地开始。此步骤很重要,因为它允许我们在同一位置组织文件的不同版本,在这种情况下,我们每月修改文件输出,因此每个文件输出按月分隔,如文件名末尾所示:2023_04

#import necessary packages
import pandas as pd 
import os.path as pathinputfile = "Data/prep_tableau/input/izev-april-2023.csv" 
outputfile = 'clean_data/clean_data_2023-04.csv'

        以下代码读取原始.csv输入,并定义我们要保留的列。在这种情况下,我们有兴趣保留与所购买车型类型相关的信息,而忽略与汽车经销商或任何其他不相关的列。

# read in the data
df = pd.read_csv(inputfile)# removing certain columns
clean_df = df[df.columns[~df.columns.isin(['Incentive Request Date', 'Government of Canada Fiscal Year (FY)','Dealership Province / Territory ''Dealership Postal Code','BEV/PHEV/FCEV - Battery equal to or greater than 15 kWh or \nElectric range equal to or greater than 50 km','BEV, PHEV  ? 15 kWh or PHEV < 15 kWh (until April 24, 2022) \nand\nPHEV ?  50 km or PHEV < 50 km and  FCEVs ? 50 km or FCEVs < 50 km\n(April 25, 2022 onward)','Individual or Organization \n(Recipient)','Country'])]]

        现在我们可以缩短列名,删除前导或尾随空格,并添加下划线以便于理解。

# shortening longer column names
clean_df = clean_df.rename({"Battery-Electric Vehicle (BEV), Plug-in Hybrid Electric Vehicle (PHEV) or Fuel Cell Electric Vehicle (FCEV)" : "EV_Type","Recipient Province / Territory":"Province.Recipient"},axis="columns")# adding and removing white spaces underscores between column names
clean_df.columns = clean_df.columns.str.strip()
clean_df.columns = clean_df.columns.str.replace(' ', '_')

        接下来,在检查数据集中只有几个空条目后,我们将使用该函数删除空数据。此时,您还希望删除重复项,但对于此特定数据集,我们不会删除。这是因为存在大量重复信息,并且在没有行标识符的情况下,删除重复项将导致数据丢失。.dropna

# removing nulls
clean_df = clean_df.dropna(how="all")

        最后一步是将数据作为.csv文件保存到适当的文件夹位置,该位置将放置在我们共享目录的文件夹中。clean_data

# save to csv
clean_path = path.abspath(path.join(__file__ ,'../', outputfile ))
clean_df.to_csv(clean_path,index=False)

        请注意我们如何使用 引用文件,并使用 bash 命令指定文件目录,其中指示以前的文件夹。我们的数据清理脚本到此结束。现在让我们进入数据处理阶段!__file__../

访问完整的工作代码和组装脚本可以在我的Github存储库中找到。

4.2 可视化的数据处理

        让我们重新审视一下我们试图实现的可视化目标,这些目标旨在突出注册电动汽车普及率的变化。为了有效地展示这一点,我们希望最终的 Tableau 就绪数据集包含以下功能,我们将对这些功能进行编码:

  • 按年份划分的车辆绝对数量
  • 按年份划分的车辆比例
  • 登记车辆增减幅度最大
  • 登记车辆排名
  • 以前注册比较的车辆排名

根据您打算生成的视觉效果,创建理想列可能是一个迭代过程。就我而言,我在构建可视化后包括了最后一列,因为我知道我想为查看者提供排名差异的视觉比较,因此相应地调整了 Python 脚本。

对于以下代码,我们将重点关注模型聚合数据集,因为品牌的其他数据集非常相似。让我们首先定义我们的和:inputfileoutputfile

inputfile = "/Data/prep_tableau/clean_data/clean_data_2023-04.csv"
outputfile = "clean_model/ev_vehicle_models_2023-04.csv" #edit date as needed

        请注意我们如何引用 from 文件夹,这是我们的数据清理脚本的输出。inputfileclean_data

下面的代码读取数据,并创建聚合计数的数据框:Vehicle_Make_and_ModelCalendar_Year

# Read in the data
auto_df = pd.read_csv(inputfile)# Defining the Dataframe and renaming columns
processed_auto = pd.DataFrame(auto_df.groupby(["Vehicle_Make_and_Model", "Calendar_Year"])["Calendar_Year"].count())
processed_auto = processed_auto.rename(columns={"Calendar_Year": "count"}).reset_index()

        该函数的执行类似于 Excel 中的数据透视表函数,其中它将每个值作为列输入。pivotCalendar_Year

# Pivoting the data based on Vehicle Make and Year with their respective counts
processed_auto_pivot = processed_auto.pivot(index='Vehicle_Make_and_Model', columns='Calendar_Year', values='count').reset_index()

        然后,脚本使用 For 循环来创建输入。这将计算每个模型的比例,以便能够在同一比例上比较每个模型,并为每年创建一个列:per_1K

# Defining column list required for the For Loop
col_list = range(2019, 2024)# Looking at magnitude every 1000 cars - For loop
for year in col_list:column_name = f"per_1K_{year}"total_column = yearprocessed_auto_pivot[column_name] = round(processed_auto_pivot[total_column] / processed_auto_pivot[total_column].sum(), 4) * 1000
        

        通过按年计算比例,我们可以计算出从 2019 年数据集开始到 2022 年最后一个全年数据的最大增减。

#Calculating prop_num_change
processed_auto_pivot["prop_num_change"] = processed_auto_pivot["per_1K_2022"] - processed_auto_pivot["per_1K_2019"]

        在这里,该函数用于将按年份分隔的列重新透视回行,因此我们只有一列及其关联值。meltper_1Kper_1K

# Pivoting for totals
cars_per1K = pd.melt(processed_auto_pivot,id_vars=["Vehicle_Make_and_Model", "prop_num_change"],value_vars=["per_1K_2019", "per_1K_2020", "per_1K_2021", "per_1K_2022", "per_1K_2023"],var_name="year",value_name="per_1K"
).loc[:, ["Vehicle_Make_and_Model", "year", "per_1K", "prop_num_change"]

下面的代码允许我们联接绝对计数和我们刚刚创建的其他计算。

# Making year names consistent with processed_auto
cars_per1K["year"]= cars_per1K["year"].str.replace("per_1K_", "")#joining the total counts with 1K totals
ev_totals = processed_auto.merge(cars_per1K, left_on=["Vehicle_Make_and_Model", "Calendar_Year"], right_on=["Vehicle_Make_and_Model", "year"], how="left")
#dropping irrevelant column
ev_totals = ev_totals.drop("year", axis=1)

现在,我们可以使用许可证计数创建列,并按 和 对这些值进行排序。rankVehicle_Make_and_ModelCalendar_Year

#ranking model by counts
ev_totals['rank'] = ev_totals.groupby('Calendar_Year')['count'].rank(ascending=False, method="min")
ev_totals = ev_totals.sort_values(['Vehicle_Make_and_Model', 'Calendar_Year'])

要创建的最后一列是使用该函数创建的列。previous_rankshift

#creating previous rank, lag by rank
ev_totals['previous_rank'] = ev_totals.groupby('Vehicle_Make_and_Model')['rank'].shift()

最后,我们能够将输出保存到管道中的文件夹路径,为我们提供一个可视化就绪数据集。clean_model

# save to csv
model_path = path.abspath(path.join(__file__ ,'../', outputfile ))
ev_totals.to_csv(model_path,index=False)

作为友情提醒,完整的 python 脚本代码,包括已处理数据集的代码,可以在我的 GitHub 存储库中找到。clean_brand

4.3 将最终数据文件转换为 .hyper 文件格式

        管道的最后一步相对简单,因为我们剩下要做的就是将我们创建.csv处理的文件转换为 .hyper 文件格式。只要您下载了前面提到的库,这应该相对容易。pantab

        值得一提的是,在 Tableau 中,连接的数据既可以实时连接,也可以提取。实时连接可确保数据流持续,来自源的更新几乎立即反映在 Tableau 中。提取的数据涉及 Tableau 创建一个文件扩展名为 .hyper 的本地文件,其中包含数据的副本(可在此处找到数据源的详细说明)。它的主要优点是其快速加载功能,Tableau 可以更有效地访问和呈现信息,这对于大型数据集特别有用。

        超级文件转换脚本的代码从加载和包开始,然后读取 Tableau 所需的数据集。pandaspantabcleaned_model

import pandas as pd
import pantab#read in files
model_df = pd.read_csv('Data/prep_tableau/clean_model/ev_vehicle_models_2023-04.csv')  

        最后一行代码使用生成 .hyper 文件并将其保存到文件夹中的函数。frame_to_hyper hyper

#save to hyper file
pantab.frame_to_hyper(model_df, "hyper/ev_vehicle_models.hyper", table="rank_vehicle_models")

        最后一步,我们可以通过打开新工作簿轻松地将 .hyper 文件格式加载到 Tableau 中,在该部分中,您可以通过选择 .当我们加载文件时,它应该显示为 Tableau 数据提取,如下面的屏幕截图所示,您的数据已准备好在其上构建视觉对象!select a filemoreev_vehicle_models.hyper

五、结语

        通过将深思熟虑的规划纳入可视化效果,您可以通过创建简单的数据管道来简化仪表板的维护。如果您缺乏资源,请不要担心;像Python这样的开源编码程序提供了强大的功能。最后,作为友好的提醒,要访问Python脚本,请在此处查看我的GitHub存储库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/2325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络虚拟化相关的Linux接口介绍

Linux拥有丰富的网络虚拟化功能&#xff0c;能被虚拟机&#xff0c;容器还有云网络使用。在这篇文章中&#xff0c;我会给出所有通用网络虚拟化接口的简要介绍。没有代码分析&#xff0c;只有简短的接口介绍和在Linux上的使用操作。这系列接口都可以使用ip link命令实现。 这篇…

微信原生实现一个简易的图片上传功能

一、实现原理 wx.showActionSheet()&#xff1a;显示操作菜单&#xff0c;选择是从相册选择还是相机拍摄照片wx.chooseImage()&#xff1a;从本地相册选择图片或使用相机拍照。wx.uploadFile()&#xff1a;将本地资源上传到服务器。客户端发起一个 HTTPS POST 请求&#xff0c…

项目实战Qt网盘系统

背景&#xff1a;随着时代的发展&#xff0c;业务数据量的剧增及移动办公需求&#xff0c;人们对内存的需求越来越强&#xff0c;传统的存储产品&#xff0c;在容量及携带型日益不能满足人工的工作需求&#xff0c;网盘再此背景下应运而生。网盘是能够提供文件同步&#xff0c;…

回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出(不调用工具箱函数)

回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出(不调用工具箱函数) 文章目录 回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出(不调用工具箱函数)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 GRU神经网络是LSTM神经网络的一种变体&#xff0c;LSTM 神经网 …

Ubuntu 考虑采用新的 “统一默认安装 (unified default install)”

导读Ubuntu安装程序中的 “最小化安装” (Minimal installation) 是该发行版多年来最受欢迎的功能之一。 当用户选择 Ubuntu 的 “最小化安装” 选项时&#xff0c;可以在安装更少的预装应用程序情况下&#xff0c;获得完整、功能齐全的 Ubuntu 系统。 但这个功能可能要被砍掉…

个人博客系统(二)

该博客系统共有八个页面,即注册页面、登录页面、添加文章页面、修改文章页面、我的博客列表页面、主页、查看文章详情页面、个人中心页面。 1 注册页面 该页面如图所示: 首先,要先判断注册的用户名、密码、确认密码以及验证码是否为空,若有一个为空,点击提交,则会提醒 …

文献阅读:MathPrompter: Mathematical Reasoning using Large Language Models

文献阅读&#xff1a;MathPrompter: Mathematical Reasoning using Large Language Models 1. 内容简介2. 方法细节3. 实验内容4. 结论&思考 文献链接&#xff1a;https://arxiv.org/abs/2303.05398 1. 内容简介 这篇文章是今年3月份的时候微软提出的一篇工作&#xff0…

【云原生】k8s安全机制

前言 Kubernetes 作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介&#xff0c; 也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 API Server 来设计的。 比如 kubectl 如果想向 API…

工欲善其事,必先利其器之—react-native-debugger调试react native应用

调试react应用通常利用chrome的inspector的功能和两个最常用的扩展 1、React Developer Tools &#xff08;主要用于debug组件结构) 2、Redux DevTools &#xff08;主要用于debug redux store的数据&#xff09; 对于react native应用&#xff0c;我们一般就使用react-nativ…

Java项目查询统计表中各状态数量

框架&#xff1a;SpringBoot&#xff0c;Mybatis&#xff1b;数据库&#xff1a;MySQL 表中设计2个状态字段&#xff0c;每个字段有3种状态&#xff0c;统计这6个状态各自的数量 sql查询语句及结果如图 SQL&#xff1a; SELECT SUM(CASE WHEN A0 THEN 1 ELSE 0 END) AS A0…

数据分析的iloc和loc功能

大家好&#xff0c;在处理大型数据集时&#xff0c;使用有效的数据操作和提取技术是必要的。Pandas数据分析库提供了强大的工具&#xff0c;用于处理结构化数据&#xff0c;包括使用iloc和loc函数访问和修改DataFrame元素的能力。在本文中&#xff0c;我们将探讨iloc和loc之间的…

论文笔记--OpenPrompt: An Open-source Framework for Prompt-learning

论文笔记--OpenPrompt: An Open-source Framework for Prompt-learning 1. 文章简介2. 文章概括3 文章重点技术4. 文章亮点5. 原文传送门 1. 文章简介 标题&#xff1a;OpenPrompt: An Open-source Framework for Prompt-learning作者&#xff1a;Ning Ding, Shengding Hu, We…

短视频seo矩阵系统源码开发部署

目录 短视频矩阵源码部署步骤简单易懂&#xff0c;开发者只需按照以下几个步骤进行操作&#xff1a; 代码展示---seo关键词分析 开发要点&#xff1a; 代码展示如下&#xff1a; 开发部署注意事项&#xff1a; 说明&#xff1a;本开发文档适用于短视频seo矩阵系统源码开发…

PostgreSQL考试难不难 ?

当涉及到PostgreSQL考试的详细难度&#xff0c;以下是一些可能涉及的主题和考点&#xff0c;这些主题在不同的考试中可能有所不同&#xff1a; 1.数据库基础知识&#xff1a;数据库的基本概念、关系型数据库模型、表、字段、主键、外键等。 2.SQL语言&#xff1a;对SQL语言的掌…

ACME申请SSL证书

1.开放443端口 firewall-cmd --permanent --add-port443/tcp # 开放443端口 firewall-cmd --reload # 重启防火墙(修改配置后要重启防火墙)2.安装ACME # 安装acme curl https://get.acme.sh | sh -s email你的邮箱地址 # 别名 alias acme.sh~/.acme.sh/acme.sh3.使用ACME申请…

攻防世界-web-easytornado

题目描述&#xff1a;Tornado 框架。打开链接是一个简单的界面 1. 思路分析 看到有个/flag.txt&#xff0c;我们点击进去看下 发现传入了两个参数&#xff0c;一个是filename&#xff0c;还有一个是filehash 看到里面的内容&#xff0c;提示我们真正的flag在 /flllllllllllla…

【自监督预训练 2023】MCL

【自监督预训练 2023】MCL 论文题目&#xff1a;Multi-Level Contrastive Learning for Dense Prediction Task 中文题目&#xff1a;稠密预测任务的多级对比学习 论文链接&#xff1a;https://arxiv.org/abs/2304.02010 论文代码&#xff1a;https://github.com/GuoQiushan/MC…

Unity视角拉近时物体缺失的问题处理

在Unity的开发过程中&#xff0c;我们可能会遇到以下情况&#xff1a; 就是在场景的不断编辑中&#xff0c;突然又一次打开场景&#xff0c;再拉近或拉远场景视角时&#xff0c;会出现场景中的对象会显示不全的问题。 出现了这样的情况会让场景的预览很不友好。 出现这个问题的…

rust

文章目录 rustCargoCreating a rust project How to Debug Rust Programs using VSCodebasic debuggingHow to pass arguments in Rust debugging with VS Code. References rust Cargo Cargo is a package management tool used for downloading, compiling, updating, and …

行为型模式 - 命令模式

概述 日常生活中&#xff0c;我们出去吃饭都会遇到下面的场景。 定义&#xff1a; 将一个请求封装为一个对象&#xff0c;使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通&#xff0c;这样方便将命令对象进行存储、传递、调用、增加与管理。 结构 …