TowardsDataScience 博客中文翻译 2021(七百二十四)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Python 中的可视化-可视化地理空间数据

原文:https://towardsdatascience.com/visualization-in-python-visualizing-geospatial-data-122bf85d128f?source=collection_archive---------6-----------------------

了解如何使用 Learn 轻松显示地图和标记

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 T.H. ChiaUnsplash 上拍摄

可视化地理空间数据是您可以对数据做的最有趣的事情之一,尤其是当您的数据已经包含可以直接映射到地图上的位置的列时。对于 Python 开发人员来说,并不缺少可以完成这项工作的库。在本文中,我将向您展示一种在地图上快速显示地理空间数据的简单方法。具体来说,我们将使用叶子库。

什么是叶?

leaveleaflet.js 库的 Python 包装器——一个用于绘制交互式地图的 JavaScript 库。使用 lyum,您现在可以直接在 Jupyter Notebook 中轻松地将地理空间可视化添加到您的 Python 项目中。

要安装 lyum,您可以在 Jupyter Notebook 中使用以下命令:

!pip install folium

显示地图

使用 leav 首先要做的是显示地图。所以让我们使用下面的代码片段:

import foliummymap = folium.Map(location = [1.366623, 103.821285], 
                   width = 950, 
                   height = 550,
                   zoom_start = 12, 
                   tiles = 'openstreetmap')
mymap

当您运行上面的代码片段时,您将看到下面的交互式地图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从上面可以看到,位置是新加坡的经纬度(1.366623,103.821285),我还设置了地图的宽度和高度。zoom_start参数设置地图的初始缩放级别——数字越大,地图的缩放程度越大。下图显示了缩放级别为 15 的地图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下图显示了缩放级别为 5 的地图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

地图显示后,您可以使用鼠标上的滚轮来放大或缩小地图。您也可以使用地图上的+或-按钮来执行相同的操作。

tiles参数指定要使用的 tileset 。要使用的默认 tileset 是openstreetmap。下一节将更详细地讨论 tilesets。

一个 tileset 是一个由栅格或矢量数据组成的集合,这些数据被分割成一个统一的方格网格。

在 Tilesets 之间切换

不同的图块集提供了不同的地图显示方式。您可以在 leav 中使用以下 tilesets:

  • 雄蕊地形
  • 雄蕊调色剂
  • 雄蕊水色
  • 卡通正电子
  • 黑暗物质

您可以使用TileLayer类向地图添加不同的 tileset,而不是通过tiles参数来固定地图以使用特定的 tileset。以下粗体语句将五个切片集添加到当前地图中:

import folium
mymap = folium.Map(location = [1.366623, 103.821285], 
                   width = 950, 
                   height = 550,
                   zoom_start = 12, 
                   tiles = 'openstreetmap')**folium.TileLayer('Stamen Terrain').add_to(mymap)
folium.TileLayer('Stamen Toner').add_to(mymap)
folium.TileLayer('Stamen Water Color').add_to(mymap)
folium.TileLayer('cartodbpositron').add_to(mymap)
folium.TileLayer('cartodbdark_matter').add_to(mymap)****folium.LayerControl().add_to(mymap)**mymap

LayerControl类在地图上显示图块图标:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

单击图块图标会显示可用于地图的各种图块集:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

以下部分显示了每个 tileset 的外观。

雄蕊地形

雄蕊地形地图显示了地形、山丘阴影和天然植物的颜色。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

雄蕊调色剂

雄蕊调色剂地图对于可视化河流蜿蜒和沿海地带等特征非常有用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

雄蕊水色

雄蕊水彩贴图,顾名思义,使用水彩效果渲染贴图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

如果你对《雄蕊水彩》的创作感兴趣,可以去 https://hi.stamen.com/watercolor-process-3dd5135861fe看看。

Stamen 是一个位于加州旧金山的数据可视化设计工作室。它的客户包括国家地理、脸书和达赖喇嘛。来源:https://en.wikipedia.org 维基雄蕊 _ 设计

卡通正电子

CartoDB 正地图是 CARTO 的底图(以前称为 CartoDB )。CARTO 是一个软件即服务云计算平台,提供 GIS、web 制图和空间数据科学工具。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

黑暗物质

在黑暗模式下, cartodbdark_matter 贴图相当于cartodbposient贴图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

注释地图

地图之所以有用,是因为它能够让我们给地图添加注释。例如,我想显示代表新加坡各种捷运站位置的标记。因此,在这一节中,你将学习如何添加标记到叶子地图。

首先,你需要得到新加坡各个捷运站的位置。为此,我将使用来自 https://data.world/hxchua/train-stations-in-singapore 的数据。

该数据集对公众开放。但是,您需要作为成员加入 data.world 才能下载此数据集。

以下粗体语句将 CSV 文件作为 Pandas 数据帧加载:

import folium
mymap = folium.Map(location = [1.366623, 103.821285], 
                   width = 950, 
                   height = 550,
                   zoom_start = 12, 
                   tiles = 'openstreetmap')folium.TileLayer('Stamen Terrain').add_to(mymap)
folium.TileLayer('Stamen Toner').add_to(mymap)
folium.TileLayer('Stamen Water Color').add_to(mymap)
folium.TileLayer('cartodbpositron').add_to(mymap)
folium.TileLayer('cartodbdark_matter').add_to(mymap)folium.LayerControl().add_to(mymap)**import pandas as pd
df = pd.read_csv('mrtsg.csv')
display(df)**mymap

数据帧看起来像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们将在本文中使用三个专栏:

  • 工位名称(工位名称)
  • 纬度
  • 经度

显示标记

我们要添加到地图上的第一个标记是一个圆形标记。这可以通过使用CircleMarker类来完成。以下粗体语句基本上使用zip()函数组合了LatitudeLongitude列,然后遍历位置集合并添加代表每个 MRT 站的圆形标记:

import folium
mymap = folium.Map(location = [1.366623, 103.821285], 
                   width = 950, 
                   height = 550,
                   zoom_start = 12, 
                   tiles = 'openstreetmap')folium.TileLayer('Stamen Terrain').add_to(mymap)
folium.TileLayer('Stamen Toner').add_to(mymap)
folium.TileLayer('Stamen Water Color').add_to(mymap)
folium.TileLayer('cartodbpositron').add_to(mymap)
folium.TileLayer('cartodbdark_matter').add_to(mymap)folium.LayerControl().add_to(mymap)import pandas as pd
df = pd.read_csv('mrtsg.csv')
display(df)**for lat, lng in zip(df['Latitude'], df['Longitude']):    
    station = folium.CircleMarker(
            location=[lat, lng],
            radius=8,
            color='red',
            fill=True,
            fill_color='yellow',
            fill_opacity=0.5)**  **# add the circle marker to the map
    station.add_to(mymap)**mymap

这是地图上的所有标记,每个标记代表一个捷运站:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可以放大以定位每个电台:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用弹出窗口显示标记

有时候,显示一个当用户点击时显示更多信息的标记更有意义。在这种情况下,您只需要添加popup属性。让我用另一种标记类型Marker来展示一下。Marker类在地图上显示一个简单的股票传单标记。

以下粗体语句将Marker对象添加到贴图中:

for lat, lng, name in \
    zip(df['Latitude'], df['Longitude'], df['STN_NAME']): **#** station = folium.CircleMarker(
    **#**         location=[lat, lng],
    **#**         radius=8,
    **#**         color='red',
    **#**         fill=True,
    **#**         fill_color='yellow',
    **#**         fill_opacity=0.5)   
    **#** station.add_to(mymap)

 **station_name = folium.Marker(
            location=[lat, lng],
            popup = name,            
        )   
    station_name.add_to(mymap)**mymap

请注意,popup参数也适用于CircleMarker类。

您可以在这里看到标记,而不是我们之前使用的圆形标记:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当您点击制造商时,您将看到一个弹出窗口,显示 MRT 站的名称:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

摘要

我希望这篇文章能为您更详细地探索 leav 库提供素材。我几乎没有触及到叶子能做什么的皮毛。如果您在现实世界的项目中使用了 real,请务必通过评论窗口与我们的读者分享。玩得开心!

https://weimenglee.medium.com/membership

赫尔辛基的自行车共享系统运动:用交互式流程图进行聚合和可视化

原文:https://towardsdatascience.com/visualization-of-bike-sharing-system-movements-in-helsinki-with-an-interactive-flow-map-451d897104fe?source=collection_archive---------21-----------------------

基于赫尔辛基自行车出行 OD 矩阵汇总出行量的 KeplerGL 流程图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供。赫尔辛基自行车站之间的合计自行车出行地图

赫尔辛基是一个由巨大的自行车道网络提供的城市,这使得替代交通(即自行车、踏板车、步行)变得高效。在某些情况下,骑自行车去目的地比乘坐公共交通工具更舒服。就我个人而言,它发生在我身上是由于三个主要方面:1)我省钱,2)我节省时间,3)精神健康。如果你想了解更多关于赫尔辛基不同交通方式的可达性,你可以查看文章:在赫尔辛基使用 accessviz-mapper 工具绘制旅行时间(可达性)地图

芬兰城市自行车致力于为赫尔辛基市民提供服务,是全球最先进的自行车共享系统之一。该服务包括 1.500 辆自行车和大都市地区(赫尔辛基和埃斯波,万塔)周围的 457 个车站,它是在当地城市规划部门的支持下开发的。BSS 在 2017 年春天完全运行,当时所有的自行车和车站都开始可用。自那以后,城市自行车作为交通工具的选择大大增加,它被认为是一种可持续(绿色)的交通工具选择。用户数量已超过 34.100 人,每周骑行约 68.000 次,平均每天骑行 7 次,16.4 分钟,3.2 公里。这些统计数据是在上面提到的芬兰城市自行车网页上找到的。此外,还可以在 赫尔辛基 自行车共享地图中实时查看自行车的供应情况。

最终图 这里
回购这里!

自行车共享系统(BSS)的局限性始于这样的讨论,即该系统可能只对特定的市民群体有利。得益于赫尔辛基市的开放数据,可以分析车站之间的运动数据集,以提供与社会群体和最常用/最少使用的自行车站相关的见解。来自赫尔辛基大学地理系的数字地理实验室 (DGL)一直在从不同的角度研究自行车共享系统(BSS)。2021 年 2 月,Elias Willberg可持续发展的专用研究员&活跃的城市流动性和可达性在DGL发表关于自行车共享系统用户的出行数据揭示了什么? ”展示了 BSS 行程数据对于了解 BSS 服务的用户特征和使用概况的重要性。BSS 的总体目标是为大多数公民创建一个包容和高效的结构。[1]**

自行车共享系统数据

BSS 发布的数据对应于服务的可用季节:从 4 月到 10 月。对于本练习,我们将使用 2019 年 7 月的月度数据集。出行数据[2]是开放访问以及城市周围 自行车站的位置由知识共享署名 4.0 许可。它被认为是一种出行数据,OD 矩阵是根据自行车站点的位置生成的。这意味着每次行程都是从起始自行车站点(起点)到终点自行车站点(终点)生成的。

本练习的目的是使用交互式流程图来可视化自行车共享系统出行数据的聚合移动,以了解赫尔辛基的自行车使用动态

这个可视化实践分为两个部分:1)数据生成,和 2)数据可视化。第一部分创建一个具有适当结构的数据集,可以在 KeplerGL 中使用,这个过程是在 Python 中完成的。第二部分使用 KeplerGL 实现流图的可视化。

1)数据生成

首先,我们读取存储库中名为geodata 的地理数据框架中的bike-stations.shp图层。我们会注意到总共有 457 个自行车站,它们看起来像这样:

******import pandas as pd
import geopandas as gpd
from shapely.geometry import Point
from keplergl import KeplerGl
from pyproj import CRSfp = r'data/bike-stations.shp'
geodata = gpd.read_file(fp)geodata.plot(markersize=1);******

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供。赫尔辛基地区的自行车站

然后,我们阅读自行车出行的 OD 矩阵,它可以在名为data的数据框架中的存储库中找到。

******bikefp = r'data/2019-07.csv'
data = pd.read_csv(bikefp)******

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供。自行车站点之间的移动(无汇总数据)

您可能会注意到,我们在一个数据集中有起点和终点,在另一个数据集中有位置(坐标)。因此,我们在这一步将数据合并到行程中,这样我们就可以获得 OD 矩阵和坐标。接下来是:

******# some details for origins
geodata['ID'] = geodata[‘ID’].astype(int)
geodata_origin = geodata.add_suffix(‘_origin’)# merging data with no aggregation
coor_data = data.merge(geodata_origin, left_on='Departure station id', right_on='ID_origin', how='outer')# some details for destinations
geodata_destin = geodata.add_suffix('_destin')# creating a data with no aggregation
coor_data = coor_data.merge(geodata_destin, left_on='Return station id', right_on='ID_destin', how='outer')# obtaining the needed columns
coor_data = coor_data[['Departure','Return', 'Departure station id', 'Departure station name' , 'Return station id',
                      'Return station name', 'x_origin', 'y_origin', 'x_destin',  'y_destin', 'geometry_origin']]coor_data.head()******

现在我们已经获得了一个包含个人出行的数据集。可视化很难理解,因为它包含大量信息。但是 KeplerGL 可以做出很好的东西,这里你可以看到粉红色是整个数据集的起点,蓝色是终点。总共 666.586 行(行程):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供。自行车站点之间的个性化出行。

现在,我们将汇总自行车站点之间的行程。我们要做的是为车站之间的旅行创建唯一的 id,并将它们算作搬运工。代码如下所示:

******agg_data = coor_data.copy()# aggregating data
# creating pairs
# if 457 station, then we make a lot of pairs.
origins = geodata['ID'].to_list()
destins = geodata['ID'].to_list()# creating pairs of trips
pairs_list=[]for origin in origins:
    for destin in destins:
        stat_pair = (int(origin), int(destin))

        pairs_list.append(stat_pair)routes_list = list(range(len(pairs_list)))# dictionary with pairs and ID
routes_dict = dict(zip(pairs_list, routes_list))agg_data = agg_data.dropna()# adding a columns with station pairs
agg_data['pairs'] = [(int(orID), int(deID)) for orID, deID in zip(agg_data['Departure station id'].to_list(),
                                                                  agg_data['Return station id'].to_list())]agg_data = agg_data.reset_index(drop=True)# add route id through dictionary
agg_data['route_id'] = Nonefor i in list(range(len(agg_data))):
    pair_route = agg_data.at[i, 'pairs']

    route_id =  routes_dict[pair_route]

    agg_data.at[i, 'route_id'] = route_idagg_data.head()******

我们得到一个包含route_id的新表,它看起来必须像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供。具有路线 ID 的单个行程

下一步是通过将 ID 计数为移动者来进行聚合。在分组数据帧中是这样的:

******# aggregating movers
movers = gpd.GeoDataFrame(index = agg_data[‘route_id’].unique())for key, group in agg_data.groupby(‘route_id’):

 movers.at[key, ‘route_id’] = key

 movers.at[key, ‘movers’] = int(len(group))

 movers.at[key, ‘origin_id’] = group[‘Departure station id’].unique()
 movers.at[key, ‘origin_name’] = group[‘Departure station name’].unique()[0]
 movers.at[key, ‘destin_id’] = group[‘Return station id’].unique()
 movers.at[key, ‘destin_name’] = group[‘Return station name’].unique()[0]

 movers.at[key, ‘x_origin’] = group[‘x_origin’].unique()[0]
 movers.at[key, ‘y_origin’] = group[‘y_origin’].unique()[0]
 movers.at[key, ‘x_destin’] = group[‘x_destin’].unique()[0]
 movers.at[key, ‘y_destin’] = group[‘y_destin’].unique()[0]movers['geometry'] = [Point(originx, originy) for originx, originy in zip(movers['x_origin'].to_list(),
                                                                          movers['y_origin'].to_list())]

movers.head()******

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供。自行车站点间自行车运动汇总表

现在我们对桌子做一些安排,使它形象化。

******# defining CRS
movers.crs = CRS.from_epsg(4326)# columns
movers = movers[['route_id', 'movers', 'x_origin', 'y_origin', 'x_destin', 'y_destin', 'geometry' ]]******

如果要将各个运动可视化为上面的地图,可能需要在地理数据框架中定义几何。本练习的目标是关注汇总的信息,所以我在这里只解释这个过程。新的聚合数据集包含 37.403 行(聚合移动)。

2)数据可视化

在这里,我们为 KeplerGL 创建一个实例,配置可视化,并保存地图。您可以在其他文章中找到更多可视化示例,例如: 蓝鲸 GPS 跟踪中的停止检测—移动熊猫 0.6

******# Create KeplerGl instance
m = KeplerGl(height=600)# Add stop duration
m.add_data(movers, 'agg movements')******

然后你调用m,按照你的喜好正确配置地图。我是这样做的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供。赫尔辛基自行车站的汇总自行车运动地图

然后你保存它:

******# Save map as html
m.save_to_html(file_name='index.html')******

结论

自行车共享数据可以通过唯一的路线 ID 进行聚合。通过计算重复路线 id 的数量来定义站之间的移动者。在可视化中,移动器的值可以用作颜色强度(黄色)和内联大小。所以理解自行车运动很容易。

这就是本练习的全部内容,以防您需要帮助或想要使用自己的数据。你可以在我的职业简介LinkedIn上联系我。****

参考文献

[1]威尔伯格,e .,萨洛宁,m .,托伊沃宁,T. (2021)。 “出行数据揭示了自行车共享系统用户的哪些信息?”。 土井:【https://doi.org/10.1016/j.jtrangeo.2021.102971】T21

[2] 城市自行车站点的起止点(OD)数据。数据集的维护者是 Helsingin seudun liikenne HSL,原作者是 City Bike Finland。该数据集已于 2021 年 7 月 18 日使用许可知识共享署名 4.0赫尔辛基地区信息共享服务下载。******

[3] 赫尔辛基地区交通局(HSL)的城市自行车站。 数据集的维护者是 Helsingin seudun liikenne HSL。该数据集已于 2021 年 7 月 18 日使用许可知识共享署名 4.0赫尔辛基地区信息共享服务下载。

用开放数据和开普勒可视化荷兰火车的拥挤

原文:https://towardsdatascience.com/visualization-of-crowdedness-for-dutch-trains-with-kepler-f55057a3ba24?source=collection_archive---------17-----------------------

荷兰公共交通提供的公开数据使人们有可能看到一天中的拥挤情况。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

列车占用的开普勒可视化

荷兰公共交通的最大发展之一是公共可用数据的持续增长。时间表已经推出好几年了,包括实时更新和几个月前增加的拥挤信息。所有这些开放数据使得开发者为大众和利基市场开发应用成为可能。在这篇文章中,我将向你展示如何在荷兰创造一个拥挤的火车美景。

本产品使用的数据来源为 OVInfo 时间表信息和 N DOV 拥挤信息。时间表有 GTFS 格式和专用格式(CSV)的拥挤度。可视化是用开普勒制作的,基于 GeoJSON 文件。

创建这个可视化的原因是我在阅读了由奥赞·卡拉阿卜杜拉·库尔库撰写的关于可视化伊斯坦布尔公交和丹弗公交的文章后感受到的灵感。他们在数据工程和可视化方面做了一些出色的工作。

这篇文章的完整代码可以在 github 上找到。

我们将从 GTFS 规范中指定的时间表开始。也可以使用来自 GTFS 馈送的已实现时刻表信息,但是现在我们将使用计划时刻表,因为可用的拥挤信息是预测。

可视化拥挤时间表所需的数据结构如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这包含以下列:

  • 时间戳— Unix 时间戳,记录旅程中的每一分钟(到达第一站和离开最后一站之间的时间)
  • rit number-trip number,指定从 GTFS 出发的行程
  • 序列—行程由几个部分组成。路段是行程中两个连续停靠站之间的部分,或者是在一个停靠站停留的时间。
  • lat,lon —在时间时间戳时,列车完成行程 ritnumber 的位置
  • 分类——列车在最后一站发车时的拥挤分类。是一个介于 1 和 5 之间的值。
  • 乘客——列车乘客数量的粗略估计

有了这个数据集,我们能够创建一天中所有火车的动画,其中两个车站之间的拥挤程度可以用来给火车位置着色。

获取数据

第一步是导入所需的库(熊猫numpygeojson 是最重要的非标准库)并设置一些参数。

然后我们从 NDOV 导入拥挤度信息。这些数据以压缩的 CSV 文件的形式提供。

如果文件还没有下载,我们下载压缩的 CSV 文件。使用 Panda 数据帧的 CSV 阅读器导入文件。在重命名一些列后,对列车座位数进行了估计。维基百科是寻找火车车厢座位容量的一个很好的来源。由于有不同的亚型,我们可以粗略估计每辆客车的平均座位数。NDOV 数据指定了车厢类型和车厢数量,因此我们可以估计列车中的座位总数。

导入 GTFS 数据需要更多的工作。首先,如果 GTFS 文件不存在,我们就下载它(它的大小超过 200MB,所以防止不必要的下载可以节省时间和带宽)。

然后,我们从下载的 zip 文件中一个接一个地导入 GTFS 文件,并在 operator 上过滤它们。GTFS 文件包含荷兰公共交通所有模式和运营商的时间表。在列车运行人员身上进行过滤大大减少了数据量。在本例中,我们仅使用来自 NS 的数据,该数据运营该国的大部分列车,但也可以通过更换机构来过滤所有列车运营商或一个地区或城市的运输提供商。

从代理处开始,一步一步地,所有东西都是为指定的操作者过滤的数据。首先是代理机构,然后是指定代理机构的路线、这些路线的行程以及这些行程的停留时间。请注意,GTFS 的车站是现实生活中的站台,停车区代表车站。到达和离开时间从 hh:mm 转换为自午夜起的分钟数,因此在路上使用更容易。

数据处理

真正重要的下一步是确定一天中所有行程的火车位置,从到达第一站到离开最后一站。行程的路线被指定为一个 GTFS 形状,该形状由一系列纬度坐标和从第一站开始的行驶距离组成。以下函数根据行驶距离在两个 LatLon 位置之间插入位置。在找到前一/最后一站( ps 和下一站( ns )后,我们可以使用简单的直线插值,因为不需要高精度并且距离相对较短。

参数 tripshape 是 GTFS 形状文件中指定旅行路线的点集,而距离是沿着 tripshape 行进的距离。找到指定距离的周围两个纬度位置后,根据距离在这两个纬度位置之间进行插值(见下图)。两个台阶之间的行进速度在这里是恒定的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以下函数对一天中一次行程的每一分钟的位置进行插值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在确定这个行程的停靠点之后( tripstops ),我们迭代所有这些停靠点并执行两个动作。首先,对从最后一个停车点出发到到达该停车点之间的所有分钟进行插值。然后创建列车位于停车位置的所有分钟。这些由停止位置的到达和离开时间决定。每组插值点被分配给一个序列供以后使用。

该函数返回一个数据帧,其中包含该行程每分钟的停靠位置,包括列车最后一次停靠位置的信息。然后,通过迭代我们可视化的当天的所有行程,可以直接获得包含所有行程信息的数据帧:

当我们通过将该数据帧与 NDOV 数据合并来添加所有拥挤信息时,我们就有了一天中所有列车位置的数据集以及拥挤信息:

乘客数量是根据座位数量和分类来估算的。这也是对乘客数量的一个非常粗略的估计,但是根据现有的数据,不可能得到更好的指示。geoJSON 文件需要一个 UNIX 时间戳,因此需要对其进行计算并添加高程列,因为 geoJSON 文件需要该列。

数据导出和可视化

创建的数据集包含简介中描述的所有信息(以及更多)。有了这个数据集,我们就可以创建 GeoJSON 文件供开普勒使用。为了显示点跟随路径的动画,开普勒需要以下 GeoJSON 结构:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

线串的坐标包含 4 个元素*【经度、纬度、海拔、时间戳】*。特征的数字属性可用于给形状着色。由于拥挤仅在停止位置发生变化,因此会为两个站点之间的每条路径创建一个要素。这些路径由上一步中添加的序列号指定。

通过迭代所有行程和行程中的所有序列,构建要素的总位置,这些要素作为要素集合存储在 GEOJSON 文件中。

为了提高地图的可用性,还在网络布局中创建了 GeoJSON。只需将每条路线的一个行程添加到 GeoJSON 文件中,即可创建此布局。

最后,是开普勒进行可视化的时候了。导航到开普勒网站,并按下开始。在下一页拖放两个创建的文件,开普勒将准备适当的层。一个静态层是网络布局,另一个是火车动画。

通过调整线宽和颜色,可以很好地展示一天中的列车运行情况。我们在白天看到所有的火车,包括早高峰的爆发。列车根据预计乘客数量进行着色:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

链接到 Github 上制作的视频,展示了 NS 火车旅行的一天。

最终想法

给出的代码没有针对速度进行优化。在普通机器上运行它需要 30 分钟,因此改进是受欢迎的,但对于本演示来说,这不是必需的。

开普勒是一个非常强大的可视化地理空间数据的工具,包括随时间推移的动画。添加越来越多的公开可用数据,通过令人惊叹的图表和动画打开了公共交通领域奇妙见解的大门。我希望这个例子能激发你对公共交通产生新的视觉化和洞察力。

免责声明:本文包含的观点和看法仅归作者所有。

基于 OTP 和 QGis 的旅行时间可视化

原文:https://towardsdatascience.com/visualization-of-travel-times-with-otp-and-qgis-3947d3698042?source=collection_archive---------15-----------------------

使用开源产品和开放数据创建荷兰公共交通出行时间的惊人可视化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片(由 QGIS 创建)

荷兰公共交通的最大发展之一是公共可用数据的持续增长。结合 OpenStreetMap,这为多模式出行规划者提供了充足的信息。 OpenTripPlanner 是一个非常完整的 TripPlanner 实现的例子。本文将向您展示如何使用 OTP 和 QGis 来可视化从一个起点到荷兰所有地区的旅行时间。

时代在变,在家工作正成为新的标准,而且很可能会持续下去。2 或 3 天到办公室将成为标准,减少从家到工作的旅行天数。在过去的几十年里,通勤时间保持不变,对于大多数人来说,每天大约一个小时的单程旅行是最长的。未来几十年,我预计每周通勤时间将保持稳定,增加每天可接受的旅行时间,这将允许人们离开城市,进入内陆地区(“乌得勒支以外”)。

这将提出一个问题:在一定的旅行时间内可以到达该国的哪些地区?本文将向您展示从一个位于乌得勒支市中心的虚构工作地点到荷兰所有邮政编码的旅行时间。所有的旅行都使用公共交通工具。

该项目的数据来源是 GeoFabrik 的 OpenStreetMap 和 GTFS 格式OVapi 用于时间表。基于 GeoJSON 文件,用 OpenTripPlanner 2.0 进行行程时间计算,用 QGis 3 进行可视化。

这篇文章的完整代码可以在 G ithub 上找到。

计算行程时间

第一步是计算旅行时间。从我们的出发点到这个国家的一系列地点。如前所述,计算是用 OTP 执行的。OTP 需要一个 OpenStreetMap PBF 文件,其中包含您感兴趣区域的街道和步行时间,以及 GTFS 的公共交通时刻表。OTP jar 是从 Maven 下载的。阴影部分是为了简单起见,因为它包括了所有的依赖项。OSM PBF 从 GeoFabrik 获得,命名为‘荷兰-最新-osm . pbf’。GTFS 从 OVapi 下载,并以 zip ('gtfs-nl.zip ')格式下载。这三个文件都存储在同一个位置。

OTP 从命令行启动:

它将在当前目录中找到 OSM 和 GTFS 文件,并开始构建网络图。由于规模(我们正在创建一个整个国家的地图,而不是一个单一的城市)这将需要一些时间,但最终 OTP 服务器启动。需要 12G 的堆大小才能在内存中加载网络图。要测试服务器,请尝试 URLhttp://localhost:8080

除了 web 接口,还有一个 REST API 用于使用 OTP 服务器。旧版本的 OTP 提供了一个 REST-API,用于从单个位置请求带有旅行时间的等时线地图,但不幸的是,这个 API 在最新版本中不再可用。

GTFS 停靠点规范是为行程时间计算定义一组目的地的一个很好的切入点。对于所有已定义的公共交通站点,我们采用 LatLon 坐标,并将其四舍五入到圆点后面的三个数字。1 度大约是。111 千米,所以 xx.xxx 给出 100 米的分辨率。在移除重复的位置之后,获得将被使用的集合。通过对 LatLon 位置进行舍入,可以防止重复计算,例如,在同一条道路的相对侧有两个公共汽车站。

此示例显示了输入集的创建,其中使用了乌得勒支市中心的一个位置,旅行将发生在 2021 年 3 月 17 日 16:00。相同的文件格式可用于计算在不同时间和日期具有不同起点的一组起点-目的地,但目前,旅行的起始位置和日期时间是恒定的。

OTP 通过其 REST API 支持计划者请求。请求具有以下形式:

http://localhost:8080/OTP/routers/2015/plan?<参数

除其他外,这些参数规定了日期、时间、起点、终点和使用的方式。通过为创建的文件中的每个起点/目的地线路调用该端点,创建了到该国公共交通可到达的所有位置的旅行时间的概览:

生成的数据集:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

可视化行程时间

将这些点添加到 QGis 中的地图可以合理地概述行驶时间。首先安装来自 https://qgis.org的 QGis 3,并按照本页的说明添加来自 https://www.openbasiskaart.nl/qgis.html的国家底图。我们为可视化添加了 ESP-28992 地图 als 底图。

通过添加“文本交付图层”并将 are script 的输出文件指定为源,在底图的顶部添加了包含行驶时间的图层。确保使用 EndLon、EndLat 作为位置列(否则仅绘制起点)。现在,它将所有计算出的旅行时间显示为地图上的点:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片(由 QGIS 创建)

由于公共交通点是目的地位置的基础,点的分布很好地概括了公共交通密度。我们可以给点添加一种颜色,通过将它指定为“分级”来指示旅行时间:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

QGIS 图层属性屏幕(来源:QGis)

深绿色圆点在 30 分钟内,浅绿色圆点在 60 分钟内,黄色圆点在 2 小时内,橙色圆点在 4 小时内,红色圆点超过 4 小时:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片(由 QGIS 创建)

虽然这是一个好的开始,但地图并没有给出完整的、易于理解的旅行时间概览。这是一大堆点。为了改进地图,我们想制作一个类似等时线的总览图。我们需要将地图划分为覆盖整个国家的区域,并根据旅行时间对这些区域进行着色。这些区域的来源将是邮政编码地图。所有邮区的形状都可以从 ArcGIS Hub 中获得。到达一个邮政编码的行驶时间计算为到达上图中所有可用点的平均行驶时间:

GeoPandas 包对地理计算有很好的支持,包括在给定区域内选择点(gdf.within(…))。对于所有的邮政编码,添加一列行程时间(“travel time”)。

看上面的地图,你会怀疑不是所有的邮政编码都包括在内。执行上述代码后,超过 10%的邮政编码没有旅行时间。这些邮政编码被赋予到周围(接触)邮政编码的平均行程时间,加上所需时间的 15 分钟(用于从邮政编码到邮政编码的通勤)。如果这仍然不能产生时间,则使用完整组中的最大时间(以在以后保持带内着色)。

最后将 GeoPanda 数据帧保存为 GeoJSON 文件:

导出此数据框后,可将其作为图层添加到 QGis(例如,将 geojson 文件拖放到 QGis 的图层窗口):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片(由 QGIS 创建)

邮政编码区域覆盖整个国家,对于我们的目的有足够的细节。如果需要更多细节,可以使用 PC6 数据集。

最后一步是给形状添加颜色:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

QGIS 图层属性屏幕(来源:QGis)

颜色随着 15 分钟而增加,并逐渐从绿色变为红色,从而显示出全国范围内到达乌得勒支市中心的旅行时间概况:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片(由 QGIS 创建)

如果给出了可接受的行驶时间,例如 90 分钟,颜色方案可以被调整为:
绿色:0 至 60 分钟
浅绿色:60 至 90 分钟
黄色:90 至 120 分钟
红色:120 分钟及更长时间

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片(由 QGIS 创建)

结束语

Open Trip Planner 2 是一款成熟的开源多模型旅行规划工具。通过它的 API,很容易集成到任何脚本或应用程序中。由于 GeoPandas 支持地理计算,因此创建地理编码数据集相对容易。QGis 是一个开源地理信息系统,可以从界面使用,如本例所示,但也配备了 Python 接口,使其更容易集成到脚本和应用程序中。创建视觉效果既简单又有帮助,因为图形概览使数据解释更容易。

免责声明:本文包含的观点和意见仅归作者所有。

可视化 BERT 序列嵌入:一种看不见的方式

原文:https://towardsdatascience.com/visualize-bert-sequence-embeddings-an-unseen-way-1d6a351e4568?source=collection_archive---------13-----------------------

实践教程

探索一种看不见的方式来可视化通过 BERT 的编码器层生成的序列嵌入。Python 笔记本包括完整的代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

菲利贝托·桑蒂兰在 Unsplash 上拍摄的照片

关于

像 BERT [1]这样的基于转换器-编码器的语言模型已经席卷了 NLP 社区,研究和开发阶层都大量使用这些架构来解决他们的任务。它们通过显示文本分类、下一句预测等各种语言任务的最新成果而变得无处不在。

BERT- base 架构堆叠了 12 个编码器层,这使得它拥有高达 1 亿个可调参数!BERT- large 架构更上一层楼,拥有 24 个编码器层和大约 3.5 亿个参数!🤯

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

插图选自http://jalammar.github.io/illustrated-bert/

为什么这么多层?

在输入文本序列的前向传递中,来自这些编码器块中的每一个的输出可以被视为上下文化嵌入的序列。然后,将每个上下文化嵌入序列作为输入提供给下一层。

编码器层的这种重复应用实现了:

  • 当输入通过它们时,提取输入的不同特征
  • 每个连续的层建立在前一层突出显示的图案上

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

插图选自http://jalammar.github.io/illustrated-bert/

众所周知,在使用这些深度架构时,非常容易陷入过度拟合的陷阱。

查看每个编码器层如何为输入提供自己的嵌入,一个有趣的问题可能会出现在人们的脑海中:
“当我训练我的模型时,每个层的嵌入对看不见的数据进行概括的效率如何?”
简而言之,我们感兴趣的是看看 BERT 的每一层能够在多大程度上发现数据中的模式,这些模式保存着看不见的数据。

在本教程中,我们将讨论一种非常酷的方式来可视化每一层在为分类任务寻找模式时的效率。

把手放在某物或者某人身上💪

有了动机,让我们看看我们将要做什么。

目标

为多个时期训练一个 BERT 模型,并可视化每一层在这些时期分离数据的效果。我们将为序列分类任务训练 BERT(使用BertForSequenceClassification类)。通过对实现细节进行一些调整,同样的练习可以扩展到其他任务。比如语言建模(使用 BertForMaskedLM 类)。在您自己的数据集上重新训练语言模型,并检查每个集群的特征或嵌入的分布!

使用的资源/库

训练:

  1. 🤗变压器:BertForSequenceClassification模型,但是你也可以插入其他的变压器-编码器分类器架构,比如RobertaForSequenceClassificationDistilBertForSequenceClassification等等。
  2. PyTorch

可视化:

  1. 海生的
  2. Matplotlib

数据集:

HatEval [2],一个将推文标记为仇恨/中性的数据集。

然而,你可以随意在配套的 Jupyter 笔记本中加载你自己的数据集。

同伴 Jupyter 笔记本

我把数据加载、模型训练和嵌入可视化的完整代码放在这个笔记本里。本教程中的代码仅用于解释目的。完整的工作代码请参考笔记本。

⚠️我们不会报道的

由于本文只关注层嵌入的可视化,我们将只遍历代码的相关部分。其余的代码超出了本教程的范围。我假设你事先知道🤗变压器 BERT 基本工作流程(数据准备、培训/评估循环等)。

我们开始吧

提取每个 BERT 编码器层的隐藏状态:

  1. 这🤗变形金刚为我们提供了一个BertForSequenceClassification模型,它由:
    (1 xbertendedgings层)→ (12 x BertLayer 层)→ (1 x BertPooler 层在嵌入 for*‘【CLS】’*token)→(tanh激活)→(脱落层)
    注意分类头(从池层开始)是我们将可视化直接来自 12 x BertLayer 层的嵌入。
  2. sent _ id掩码在 a 中准备🤗变压器 BERT 兼容格式
  3. 数据集的标签需要对可视化进行颜色编码
  4. 当将output _ hidden _ States = True参数提供给模型的前向传递时,这 1 个Bert embeddeds层和 12 个 BertLayer 层中的每一个都可以返回它们的输出(也称为 hidden_states )。因此,模型输出隐藏状态的维数是(13,数据点数,最大序列长度,嵌入维数)
  5. 由于我们只对来自 12 个 BertLayer 层的嵌入感兴趣,我们切掉不需要的bertlembedding层嵌入,留给我们维度的隐藏状态(12,数据点数,最大序列长度,嵌入维度)

接下来,我们定义一个函数,该函数可以在一个时期后为我们的数据集(例如- train/val/test)的分割绘制层的嵌入:

  1. dim _ reducer:scikit-learn 的 t-SNE 降维实现,将我们的嵌入从 BERT 默认的 768 维减少到 2 维。您也可以使用 PCA ,这取决于哪个更适合您的数据集。
  2. visualize _ layer wise _ embeddings:定义一个函数,该函数可以在每个时期后为我们的数据集(train/val/test)的分割绘制层的嵌入
  3. 在每个层上循环计算:
    • layer_embeds :由层输出的嵌入,一个形状张量(number_of_data_points,max_sequence_length,embedding _ dimension)
      -layer _ averaged _ hidden _ States:通过对序列的所有非屏蔽记号上的嵌入取平均值,为每个数据点创建单个嵌入,产生一个形状张量(number_of_data_points,embedding _ dimension)

这些计算值最终使用 Seaborn 库绘制在新图上。

最后,将我们到目前为止在训练循环中看到的内容整合在一起:

在这里,我们在每个历元调用一次visualize _ layer wise _ embeddings函数,用于我们想要单独可视化的数据集的每个分割。

我选择可视化前 4 层和后 4 层的嵌入。

可视化🔬👨‍⚕️

我们已经准备好了我们的可视化!
我更进一步,把不同的图片拼接成 gif,让事情变得更方便!代码再次出现在笔记本中。
挺审美的吧?🤩

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

跨 BERT 模型层的训练数据的可视化

花点时间了解一下每一层的输出。试着从中得出一些有趣的推论!

我将给出一些例子:
-你能评论一下每一层在每个连续时期的表现吗?
-分类器的训练精度从时段 4 下降到时段 5!你能从上面的 gif 中验证这个事实吗?**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

BERT 模型各层验证数据的可视化

最后,我们更感兴趣的是知道我们的嵌入是否有助于我们概括。我们可以通过上面的验证分割可视化来判断。

我想到的一些有趣的问题是:
-哪一层比其他层概括得更好?
-最后一层能在多大程度上区分职业?
-您认为训练和验证分割的嵌入之间的可分性有什么不同吗?
-对序列中所有非屏蔽标记的嵌入取平均值是否比仅对“【CLS】”标记进行嵌入产生更好的结果?(要回答这个问题,你可能需要稍微调整一下笔记本😉)

更进一步🙇‍♂️

不要仅仅停留在这里!
在所提供的笔记本中进行试验,尝试混合搭配不同层的输出嵌入,看看哪种组合有助于产生最佳的下游性能!

**回答:与时段 5 相比,时段 4 的第 12 层的嵌入更整齐地聚集在一起!这清楚地表明分类器在损失函数空间中击中然后超过了最小值。

参考

[1]: BERT:用于语言理解的深度双向变压器的预训练,Delvin 等人,2019
[2]: SemEval-2019 任务 Twitter 中针对移民和女性的仇恨言论的多语言检测,Basile 等人,2019

使用 PandasTutor 可视化您的熊猫数据转换

原文:https://towardsdatascience.com/visualize-data-transformation-using-pandastutor-6126627dd225?source=collection_archive---------23-----------------------

工具

在浏览器中可视化您的 Python 熊猫代码,并查看您的数据如何逐步转换

Pandas 是一个强大的 Python 库,可用于任何探索性数据分析。有时,您可能难以可视化数据转换。PandasTutor 来了,这是一个网络应用程序,可以让你看到你的 pandas 代码如何一步一步地转换数据。

如果您有复杂的转换,并且想要可视化您的步骤或者向其他人解释它,这可能会很方便。

PandasTutor 可以让你可视化不同的熊猫变换,从排序按多列分组,甚至按列分组和执行多重聚合 [1]。

PandasTutor 创建者

熊猫导师是由加州大学圣地亚哥分校的 Sam Lau 和 Philip Guo 创建的。该工具主要用于教学目的,正如其创建者在此处所述。这解释了这个工具的一些局限性(我将在后面的文章中讨论这些局限性)。

Sean Kross 和 Philip Guo 为 R 用户开发了一个类似的工具,叫做 Tidy Data Tutor。

个案研究

在本文中,我们将研究一个示例,其中我们对一些值进行排序,然后按多个列进行分组,最后我们将对多个列执行不同的聚合!

资料组

让我们使用来自 Kaggle 数据集【2】的心力衰竭预测数据集。你可以在下面找到数据。数据在开放数据库(ODbl)许可下可用,允许用户自由共享、修改和使用该数据库,同时为其他人保持同样的自由。【3】

https://www.kaggle.com/fedesoriano/heart-failure-prediction

由于熊猫导师只对小数据起作用,我就取前 50 行红心数据)。

密码

下面是这篇文章中用于可视化的代码。您可能会注意到,CSV 数据在这里被编码,这是该工具的当前限制。

所以我们的转换只是最后几行(第 63–69 行)。

结果

步骤 1:对数据帧进行排序

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

sort_values()结果的可视化(步骤 1)(使用 PandasTutor 生成)

第二步:可视化熊猫分组操作

对步骤 1 中的结果进行排序并可视化后,我们可以可视化 groupby()操作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

groupby()结果的可视化(步骤 1 和 2)(使用 PandasTutor 生成)

步骤 3:计算多个列的不同聚合

在这里,我将计算“RestingBP”和“胆固醇”两列的平均值和标准差,并提供每个组的计数(这里我使用“性别”列来获得该信息。)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最终结果的可视化,即聚合(步骤 1-3)(使用 PandasTutor 生成)

有趣的分享功能

Pandas Tutor 还为您提供了一个可共享的 URL,其中甚至包括转换中使用的 CSV 数据。例如,你可以在这里或者通过下面的链接查看我的转换代码和结果

优点:

  • 逐步可视化
  • 交互式绘图(您可以跟踪转换前后的数据行)
  • 可共享的 URL

缺点(当前限制):

  • 仅适用于小代码(代码应为 5000 字节)。由于数据也是编码的,而不是从文件中读取的,因此,您只能可视化小型数据集。
  • 如前一步所述,您必须将数据和代码一起编码,因为不支持从外部资源(文件或链接)读取。
  • 有限的熊猫方法支持。
  • 你只能在最后一行想象熊猫的表情。您可能需要将多个步骤放在一起,或者单独运行可视化。

关于不支持的功能或其他常见问题的完整列表,您可以在这里 查看

结论

在本文中,我们检查了一个很好的工具,它可以一步一步地可视化 Pandas 数据转换,生成交互式图表来比较每次转换前后的数据。这对于那些想要巩固自己对熊猫转型的理解,或者想要与他人分享那些转型的人(熊猫导师甚至提供了一个可分享的网址)来说,非常有用。

感谢阅读🙏

加入我的邮件列表,接收类似的帖子。也可以在LinkedInTwitter 关注我。

👉如果你喜欢阅读这样的故事(以及媒体上的其他故事),并且也想支持我成为一名作家,可以考虑注册【https://medium.ealizadeh.com/membership】来获得所有故事的全部信息(免责声明:如果你使用我的链接注册,我将免费为你赚取一小笔佣金。)

https://medium.ealizadeh.com/membership

参考

[1]https://pandastutor.com/

https://www.kaggle.com/fedesoriano/heart-failure-prediction

[3]https://opendatacommons.org/licenses/odbl/1-0/

原载于【https://ealizadeh.com】

可视化新冠肺炎期间各国的超额死亡率

原文:https://towardsdatascience.com/visualize-excess-mortality-across-countries-during-the-covid-19-5630413b7368?source=collection_archive---------58-----------------------

对我的孩子们来说,最令人兴奋的事情,尤其是在新冠肺炎时间,就是打开几乎每天都送到我们家门口的投递箱。尽管大多数送货都是食品杂货,但孩子们总是对这次他们将在盒子里找到什么宝贝充满热情和兴奋。

这也是我在发现一个新的新冠肺炎数据集时的感受。它采用了一种有趣但简单的方法:该数据集只是统计了每个国家的所有死亡人数,并与前几年进行比较,而不是关注死亡原因和对每个记录的潜在偏差进行无休止的辩论。主要假设是,新冠肺炎相关的死亡率效应只是今年独特的死亡病例与前几年之间的差异。

这个数据集的作者查阅了世界各地可靠的死亡率记录,并让数据集可供我们所有人探索

这篇博客文章将重点复制存档论文中的一些分析,使用简单的可视化工具,没有花哨的数学符号,或其他流行病学标度/转换/相对比率等。

我们先来看看今年的死亡病例和往年有什么不同。虽然数据集包括全球 79 个国家的数据,但我将只关注其中几个国家,每个国家都有独特的模式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图一。来源:作者

查看该图可以看到 2020 年**(蓝线)与前几年相比的独特分布:2015–2018(灰线),以及 2019 ( 红线)。Lichtenstein 是一个特殊的案例研究,前几年每周的案例相对很少,很难从视觉上发现多年来的任何差异。**

接下来,让我们决定什么是最好的(或至少足够好的)参考非 covid 年份。一种方法是取所有/最近/前几年子集的平均值。为了简单起见,也为了避免多年来无关的年度趋势影响,让我们只使用 2019 年作为参考年。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图二。来源:作者

接下来,让我们用带状图来可视化 2020 年至 2019 年间的超额死亡率案例。当 2020 年的病例数高于 2019 年时,两条线之间的红色区域是每周增加的病例数。但是,如果 2019 年的病例数多于 2020 年,则会用蓝色区域表示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3。来源:作者

红色蓝色之间的每周波动表明没有恒定的趋势,因此, covid-year 的影响较小。请注意,每个图都有自己的 Y 轴刻度。查看论文,了解评估这种影响的更多量化方法。**

另一个让上述形象化的尝试是用烛台情节:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4。来源:作者

这里是另一个烛台图,带有一个嵌入了 HTML 滑动条的 Java 脚本,用于 x 轴周,通过 plotly 包允许更多用户友好的交互。(尽管我不知道如何用区域命名轨迹,以及如何将 HTML 文件作为动态图像/动画加载到 Medium 中)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5。来源:作者

后记:

希望您受到了启发,可以自己处理这些数据,并尝试一下。

在这个博客上,我学到了一些新的实践,比如在每个面(国家)上添加旗帜图标作为网格对象,绑定/分面情节支线剧情,以及其他技巧。

我也希望在世界地图上把这些地方作为贫民窟添加进去,但是可能在另一个帖子上。

我用过的 R 包有:ggplot2,patchwork,ggflags,plotly,tidyverse,
lubridate,magrittr,gghighlight,ggtext,tidyquant,ISOweek。

将很高兴应要求分享 R 代码。

我差点忘了交叉引用我之前关于新冠肺炎可视化的博文:

如何在单个长管道 R 代码行中创建一个种族栏动画情节

新冠肺炎死亡可视化:美国各州的种族条形图

新冠肺炎第一波后美国各州排名恢复,使用谷歌移动数据

可视化萨克斯图并测量移动趋势

查看我的其他博客文章和我的 GitHub 页面获得更多有趣的阅读。领英

用 PyGraphistry 可视化 GitHub 社交网络

原文:https://towardsdatascience.com/visualize-github-social-network-with-pygraphistry-dfc23a38ec8d?source=collection_archive---------6-----------------------

实践教程

分析机器学习开发者和 Web 开发者之间的联系

动机

你有没有想过不同角色的 GitHub 开发者是如何连接的?例如,如果一个人是机器学习开发人员,他/她关注的人中有百分之多少是 web 开发人员?如果一个人是 web 开发人员,他/她关注的人中有百分之多少是机器学习开发人员?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在本文中,我们将使用由 GitHub 开发人员的大型社交网络组成的数据来回答这个问题。我们还将使用 PyGraphistry 来可视化不同类型的开发人员是如何相互联系的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GIF by Author——在这里与剧情互动。

加载数据集

我们将使用 Kaggle 中的 GitHub 社交网络来分析 GitHub 开发者的大型社交网络。节点是至少有 10 个存储库的开发人员。如果一个人是机器学习开发者,ml_target=1,否则ml_target=0

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

边缘是这些开发者之间的相互追随关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

分析每种开发人员类型的联系

ML 开发人员和 Web 开发人员的百分比

让我们从找出网络中 web 开发者(𝑃(Web 开发者)和机器学习开发者(𝑃(ML 开发者)的百分比开始。

这个网络中 74%的开发者是 web 开发者。

混合连接的百分比

网络中混合连接(一个 web 开发者和一个机器学习开发者之间的连接)的百分比是多少?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

从连接edges工作台和nodes工作台开始:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

接下来,计算网络中混合连接的百分比— 𝑃(ML 开发人员与 web 开发人员连接)。

0.1546558340224842

相同连接的百分比几乎比混合连接的百分比高 5.5 倍。

网络开发者的联系

另一个需要分析的有趣问题是:如果一个人是 web 开发人员,他/她的人脉中有百分之几是 web 开发人员,他/她的人脉中有百分之几是机器学习开发人员?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

让我们用贝叶斯定理来回答这个问题。

根据贝叶斯定理,我们知道:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从前面的计算中我们已经知道𝑃(ML 开发者与网络开发者)和𝑃(Web 开发者)连接。让我们用这些百分比来找出 ML 开发者|Web 开发者的𝑃(Connect):

0.20852347708049263

现在,找到𝑃(Connect 对一个网页开发者来说是很容易的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这意味着如果一个人是 web 开发人员:

  • 他的人脉是网络开发者的比例是 71.95%
  • 他的关系是 ML 开发者的百分比是 28.05%。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

这些百分比与网络中 ML 开发者和 web 开发者的百分比非常相似(0.258 和 0.741)。

ML 开发人员的联系

同样,我们可以找到𝑃(Connect 对一个 Web 开发者|ML 开发者):

0.5986779897985065

和𝑃(Connect 对一个 ML 开发者|ML 开发者):

0.4103

现在,我们知道如果一个人是 ML 开发者:

  • 他/她的联系人是 web 开发人员的比例为 59.87%
  • 他/她的关系是 ML 开发者的百分比是 41.03%。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

由于 ML 开发者在网络中的百分比只有 25.8%,所以看到一个 ML 开发者的人脉中有 41.03%是 ML 开发者就很惊讶了。这意味着 ML 开发者更有可能跟随其他人而不是 web 开发者。

使用 PyGraphistry 可视化网络

让我们通过使用 PyGraphistry 可视化 GitHub 网络来尝试确认上一节的结论。

什么是 PyGraphistry?

PyGraphistry 是一个可视化大型图形的 Python 库。由于我们将在本文中使用大型图表,PyGraphistry 是一个完美的工具。

要安装 PyGraphistry,请键入:

pip install pygraphistry

开始

要使用 PyGraphistry,首先在graphistry.com创建一个免费账户,然后注册新账户:

接下来,指定图形的节点和边。我们还使用encode_point_icon来显示不同角色的不同图标:

绘制图表:

现在你应该在你的笔记本上看到类似下面的东西!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GIF by Author —在这里与剧情互动。

这里可以和上面的剧情互动。节点越大,它连接的节点就越多。

将鼠标悬停在特定节点上会显示它所连接的节点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GIF by Author —在这里与剧情互动。

单击一个节点将为您提供关于该节点的信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

编码点颜色

目前的情节很美,但信息量不大。因为我们想知道不同角色的开发人员是如何相互联系的,所以让我们根据每个开发人员的角色给节点涂上颜色。

机器学习开发者是银色的,web 开发者是栗色的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片—与剧情互动此处

你可以在这里和上面的剧情互动。如果颜色没有按预期显示,您可能需要刷新。

我们可以看到相同角色的开发人员倾向于聚集在一起。

确定影响者

谁是获得最多连接节点数的开发人员?我们可以通过点击屏幕顶部的数据表图标找到答案。

表格打开后,按度数(一个节点连接了多少个节点)对表格进行排序,然后单击您感兴趣的点,该点将在下图中突出显示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GIF by Author —在这里与情节互动

从表中我们可以看出,大部分热门的开发者都是 web 开发者。这并不奇怪,因为 web 开发人员比 ML 开发人员多得多。

检测社区

社区是彼此紧密连接的节点的子集,并且松散地连接到同一图中的其他社区中的节点。

让我们尝试使用 Louvain 方法来检测图中的社区。由于我们正在处理一个大图,我们将使用 cuGraph 来加速代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在上表中,partition是节点(或vertex)所属的社区。

让我们看看有多少个社区:

array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], dtype=int32)

总共有 22 个社区。让我们想象一下这些社区是什么样子的。从连接nodes表和parts表开始,获取节点及其分区的名称。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

然后我们用 faker 自动为不同的分区创建不同的颜色。

您应该会看到类似下面的内容!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Gif by Author —在这里与情节互动

你可以在这里与上图互动。我们可以看到,同一个社区中的节点(具有相同的颜色)倾向于聚集在一起。

每种类型开发人员的社区

大多数 web 开发人员属于什么社区?我们可以通过只选择 web 开发人员的节点来解决这个问题。要过滤节点,请单击屏幕顶部的过滤器按钮。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

您应该只看到 web 开发人员的节点:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

似乎 web 开发人员属于不同的社区。让我们看看 ML 开发者属于哪些社区:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

该图仅包含 ML 开发人员:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

有意思!大部分 ML 开发者属于粉色社区。这意味着,与 web 开发人员不同,ML 开发人员倾向于在同一个社区中。换句话说,ML 开发者之间的联系更加紧密。

每个社区中 ML 开发者的百分比

每个社区中 ML 开发者的比例是多少?让我们用一个分组条形图来说明这一点:

看起来在大多数社区中有一小部分 ML 开发者。这意味着大多数社区都相当多样化。

结论

恭喜你!你刚刚学习了如何使用贝叶斯统计和 PyGraphistry 分析社交网络。希望这篇文章能给你分析身边网络所需的动力和知识。你可能会对你从图表中发现的东西感到惊讶。

在这个 GitHub repo 中随意发挥和分叉本文的源代码:

https://github.com/khuyentran1401/Data-science/blob/master/visualization/visualize_github_network/github_explore.ipynb

我喜欢写一些基本的数据科学概念,并尝试不同的数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。

如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:

https://pub.towardsai.net/visualize-gender-specific-tweets-with-scattertext-5167e4600025 https://khuyentran1476.medium.com/visualize-similarities-between-companies-with-graph-database-212af872fbf6

引用

FEMI·K·j .(2021 年 7 月 25 日)。GitHub 社交网络,
第 1 版。从https://www.kaggle.com/femikj/github-social-network取回 2021–11–22。公共许可证。

使用 Plotly 和 Datapane 可视化分层数据

原文:https://towardsdatascience.com/visualize-hierarchical-data-using-plotly-and-datapane-7e5abe2686e1?source=collection_archive---------5-----------------------

实践教程

使用交互式图表探索嵌套很深的通货膨胀数据集

按类别显示数据很容易——只要用一个不起眼的条形图或饼图就行了(尽管 T2 有一个关于哪个最好的 100 年历史的争论)。

但是如果每个类别都有子类别呢?而那些子类别又有子子类别?这是许多领域中常见的数据模式,包括文件系统、生物学和经济学。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 niko photosUnsplash 上拍摄

在本文中,我们将介绍几种交互式显示嵌套数据的方法,并讨论每种方法的优缺点。

数据:美国消费者价格指数(CPI)权重

想知道通货膨胀是如何计算的吗?从本质上讲,政府将每月收集数千种普通商品的价格数据,根据重要性进行加权,并将它们组合成一个“篮子”,广泛代表普通家庭的支出。然后,他们跟踪这些项目的价格变化,以计算出经济的整体通胀水平。

这个篮子可以用来粗略衡量每个人是如何花钱的。这是一个有趣的数据集,因为数据自然是分层的:从最高层的类别如“食品”一直到单个产品如“多力多滋”。

[警告:通货膨胀方法论是一门深奥的学问——要小心,否则你可能会在晦涩的政府统计网站上浪费掉几天的时间!]

为了进行这种探索,我们将根据美国劳工统计局的公开数据来研究美国消费者价格指数的不同类别和权重。数据来自 Excel 文件,具有以下特征:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该数据包含 295 个不同的类别,分布在 8 个不同的“缩进级别”,从 1—“食品和饮料”( 15.16%重量),到 8 —“生牛肉末”(0.17%重量)。请注意,它并没有深入到单个产品。这些项目按层次排列,因此每个项目的权重将等于其子项权重的总和。

我们首先将数据加载到 Pandas 中,并做一些预处理。特别是,我们需要使用行索引和缩进级别来获取每一行的“父级”,因为许多图形库都需要这些信息。我们最终得到以下数据框架:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们开始一些可视化!我们将使用 Plotly 创建交互式图表,并使用 Datapane 使我们的图表具有交互性,因此用户可以自己探索数据。当您有复杂的数据,而这些数据又不容易用静态图表示时,这一点尤其重要。

1。旭日图

我们将从 Sunburst 图表开始:一种高级类型的饼图,其中不同级别的数据表示为同心圆。

使用 Plotly 制作旭日图非常简单:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它在我的浏览器上交互显示,但当我试图将其复制到 Medium 时,它显示为静态图。不过不用担心,我们可以使用 Datapane 将图表上传到 Datapane.com,然后共享或嵌入交互式报告:

运行这段代码后,Datapane 生成一个报告,我们可以通过 URL 查看我们的绘图:https://data pane . com/u/johnmicahreid/reports/visualizing-deep-nested-data/

此时,我们可以共享报告,或者直接嵌入报告,如下所示:

回到分析,这个图表看起来很有趣,但很混乱,很难阅读深度嵌套的小权重类别。将它限制在两个级别看起来更好:

通过简化图表,你遗漏了信息,但这可能是一件好事。有效的数据可视化是向你的受众传达一个清晰的信息,你的图表越明显+简单,他们就越有可能理解。

对于这张图表,我希望有人理解的故事如下:“哇,看起来住房成本是通货膨胀的最大因素!”

2.树形图

树状图类似于旭日图,只是它们以矩形形式表示数据。它们比旭日图有优势,因为图上每个矩形的面积与你要展示的数量成正比。

构建树状图使用的 Plotly 语法与 sunburst 完全相同:

这要清楚得多,但是区域并不完全准确,因为一些空间被边界框和文本占据了。此外,一些嵌套很深的层次被切断,难以阅读。如果我们把情节限制在前两层,我们会得到一个更整洁的画面:

3.桑基图

另一种选择是桑基图,它最初被发明用来显示能量在系统中的传递。如果您想要显示经过几个不同阶段的数据,请使用它—唯一的建议是进入系统的“流量”应该等于流出系统的“流量”。

Plotly 中的代码要复杂得多,因为我们需要将数据转换成不同的格式:

与前两种情况相比,我们在这里看到了一个类似的信息密度问题——有太多的信息需要一目了然,较小的类别被极度压缩。Sankey 图和 sunburst/treemap 之间的一个有趣的区别是在图的最右端显示所有没有子节点的节点的方式,即使它们有不同的缩进级别。

让我们再来看看前两个级别:

这更清楚,但我个人建议不要使用桑基图,除非你有真正令人信服的理由这样做,因为它们相当不直观,数据通常可以用更好的方式表示。

4.图表

从第一原理思考问题,我们的数据本质上是一个树形结构,树是一种图形。所以让我们试着把数据形象化为图表。

这里的代码要复杂得多,因为我们需要将数据帧转换成一系列的边和节点。我们将使用 networkx 来转换和存储数据,并 Plotly 将其可视化。不再有高级 API,所以我们将手动绘制每个节点和边。

正如你从这个 viz 中看到的,图很好地表现了不同量之间的关系,并且可以轻松地适应许多不同的节点。唯一的缺点是,您需要将鼠标悬停在每个节点上才能读取该点的值。我们还可以尝试各种技巧,如使节点的大小与权重成比例,以及不同的节点定位算法,但结果开始看起来很奇怪。

5.其他选择

冰柱图是另一种可视化嵌套数据的好方法,基本上是一组堆叠的垂直条形图。我们可以在 D3.js 可视化库中看到一个很好的例子:

Mike Bostock 的 D3.js 文档中的 Icicle embed

火焰图是一个类似的概念,但是旋转了。它们是由 Brandon Gregg 发明的,作为一种分析软件性能的方法。这里 X 轴是时间,Y 轴代表函数调用深度,每个矩形代表一个不同的函数调用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自维基共享资源的火焰图示例

这两种方法似乎都比以前的方法在显示多层次嵌套方面做得更好,但不幸的是,我还没有找到任何优秀的 Python 库来制作它们!如果你有任何想法,请在评论中告诉我。

最后

  • 嵌套数据很难很好地可视化,如果可能的话,您应该尝试一次只显示两个级别。
  • 除非您的数据非常符合目的和/或您的点数相对较少,否则不要使用桑基图。
  • 决定是显示每个类别的比例更重要,还是显示类别之间的关系更重要。如果是后者,那么图表可能是一个不错的选择。
  • 如果你有 JS 技能,冰柱图是一个很好的选择

如果你有兴趣自己试验一下,这里有一些数据:

使用 3D 360 度动画散点图可视化高维网络数据

原文:https://towardsdatascience.com/visualize-high-dimensional-network-data-with-3d-360-degree-animated-scatter-plot-d583932d3693?source=collection_archive---------29-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

介绍

在网络分析的环境中,我们经常会遇到极其复杂的数据,这些数据是不可读或无法解释的。虽然一些算法框架(例如 node2vec)可以将网络数据合并到统计机器学习中,但产生的数据仍然是高维的,并且在可视化方面难以管理。在这篇博客中,我将与你分享我用来降低复杂性和解决这个问题的方法之一。

数据

出于演示目的,使用了来自斯坦福大学 SNAP 的数据集“电子邮件-欧盟-核心网络”。你可以在这里找到原始数据集:https://snap.stanford.edu/data/email-Eu-core.html。我认为,如果我用真实世界的复杂数据集向您展示代码,会更有意义。因此,我使用这个数据集,而不是模拟数据。在 SNAP 上可用的网络数据中,这个网络可能具有最简单的结构。

图的阶(节点数)是 1005,图的大小(边数)是 25571。该数据集还带有每个顶点/节点的地面实况标签。当我们生成可视化时,我们将使用地面真实标签来注释顶点。解决这个问题的方法之一(如果没有标签)是使用 k-means 聚类来获得标签。

注意:我在 Google Colab 中完成了这个代码演示。如果您在本地 ide 中工作,可能需要以不同的方式配置路径。但是作品的逻辑应该是一样的。

密码

第一步:加载所有必需的包

生成图嵌入所需的核心包是 networkx 和 node2vec。应用详情可以参考本文:利用 NetworkX、Gephi、Node2Vec 分析疾病共现。其余的包用于为我们的网络数据生成 3D-360 度散点图。

第二步:读取数据

因为这是一个未加权的图,所以我将图中所有边的权重设置为 1。我将标签的顶点列的数据类型转换为“string ”,因为稍后将对其进行索引以进行注释。

第三步:将数据导入图表并绘图

如果我们不执行降维,并找到一种方法使图形更稀疏,那么您将得到图 1 中的图形,它根本不可读。此外,node2vec 算法需要一个 networkx 图作为输入。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图一。原始图表

第四步:使用 node2vec 获取嵌入

您可以注意到,在代码中,我手动计算了 vector_size (dimensions)的起点和图的顺序。这种做法受到了谷歌机器学习速成班的启发。而经验法则是, 维数的大小等于可能值的四次方根(维数=可能值的个数 0.25)** 。

第五步:用 3D 360 度动画散点图可视化

执行***three dplot(model)***命令后,我们得到的就是图 2。来自同一个部门的人,比如第 21 部门(黄色点)和第 14 部门(绿色点),更喜欢呆在一起(更频繁地联系)。部门 4、5 和 7-分别是紫色、深蓝和淡蓝色点-也可以被识别为彼此保持接近的部门。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图二。三维 360 度散点图

对于高分辨率的图形,请访问此链接获取原始 gif。

要复制结果,请访问笔记本的链接

结论

在这篇博客中,我们使用了***【node 2 vec】****,networkxtsne(PCA)seaborn,*matlibplot等。制作 3D 360 度动画散点图,以可视化高维复杂的网络数据。

欢迎随时联系我上LinkedIn

相关阅读

使用 NetworkX、Gephi 和 Node2Vec 分析疾病共现

网络分析与 R |操纵网络数据

NetworkX:操纵子图的代码演示

什么是嵌入,你能用它做什么

如何像专业人士一样可视化机器学习结果

原文:https://towardsdatascience.com/visualize-machine-learning-metrics-like-a-pro-b0d5d7815065?source=collection_archive---------13-----------------------

只用一行代码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由米哈伊尔·尼洛夫佩克斯拍摄

动机

评估机器学习模型是机器学习工作流程中的一个重要步骤。在本文中,我们研究了如何使用 Scikit-plot 轻松可视化各种常见的机器学习指标。虽然它的名字可能表明它只与 Scikit-learn 模型兼容,但 Scikit-plot 可用于任何机器学习框架。在幕后,Scikit-plot 使用 matplotlib 作为它的图形库。

Scikit-plot 最好的部分是它只需要一行代码来可视化每个指标。

设置

安装软件包

pip install scikit-plot==0.3.7

导入必要的包

import pandas as pd
import numpy as np
from sklearn import datasets
from sklearn.ensemble import GradientBoostingClassifier, RandomForestClassifier
from sklearn.model_selection import cross_val_predict, train_test_splitimport scikitplot as skplt

为了演示 Scikit-plot,我们将使用乳腺癌数据集训练一个简单的随机森林和梯度增强分类器。

X,y = datasets.load_breast_cancer(return_X_y = True)
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.3, stratify = y)gbc = GradientBoostingClassifier()
gbc_model = gbc.fit(X_train, y_train)
y_gbc_proba = gbc_model.predict_proba(X_test)
y_gbc_pred = np.where(y_gbc_proba[:,1] > 0.5, 1, 0)rfc = RandomForestClassifier()
rfc_model = rfc.fit(X_train, y_train)
y_rfc_proba = rfc_model.predict_proba(X_test)
y_rfc_pred = np.where(y_rfc_proba[:,1] > 0.5, 1, 0)

让我们看看如何使用 Scikit-plot 来可视化各种指标。

混淆矩阵

混淆矩阵将基础事实与预测标签进行比较,并将结果分为真阳性、真阴性、假阳性和假阴性。为了绘制混淆矩阵,我们简单地调用plot_confusion_matrix方法。

skplt.metrics.plot_confusion_matrix(y_test, y_gbc_pred, normalize=False, title = 'Confusion Matrix for GBC')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

要显示 0 到 1 之间的标准化值,只需将normalize参数设置为True

skplt.metrics.plot_confusion_matrix(y_test, y_gbc_pred, normalize=True, title = 'Confusion Matrix for GBC')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

受试者工作特性曲线

ROC 曲线显示了分类器在所有分类阈值下相对于随机基线分类器的性能(真阳性率,也称为召回率和假阳性率)。

skplt.metrics.plot_roc(y_test, y_gbc_proba, title = 'ROC Plot for GBC')

默认情况下,ROC 图带有宏观和微观平均值。我们可以通过将plot_microplot_macro参数设置为False来隐藏这些情节线。plot_roc方法显示所有类别的所有 roc 曲线,并且图表在多类别绘图中可能会变得混乱,因此我们可以通过传递classes_to_plot参数来选择绘制特定类别的 roc 曲线。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

精确召回曲线(PR 曲线)

精确度和召回率曲线显示所有分类阈值的精确度和召回率值。它总结了精确度和召回率之间的权衡。

skplt.metrics.plot_precision_recall(y_test, y_gbc_proba, title = 'PR Curve for GBC')

默认情况下,精确召回曲线带有宏观和微观平均值。我们可以通过将plot_microplot_macro参数设置为False来隐藏这些情节线。plot_precision_recall显示所有类别的 PR 曲线,在多类别图中图表可能会变得混乱,因此我们可以通过传递classes_to_plot参数来选择绘制特定类别的 PR 曲线。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

校准图

校准图也称为概率校准曲线,是一种检查预测值是否可以直接解释为置信水平的诊断方法。例如,校准良好的二进制分类器应该对样本进行分类,使得对于概率约为 0.8 的样本,大约 80%的样本来自正类。该函数仅适用于二元分类任务。

probas_list = [y_gbc_proba, y_rfc_proba]
clf_names = ['GBC', 'RF']
skplt.metrics.plot_calibration_curve(y_test, probas_list = probas_list, clf_names = clf_names)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

累积增益曲线

累积增益曲线显示模型的性能,并与随机基线分类器进行比较。它显示了在考虑概率最高的一部分人口时实现目标的百分比。该功能仅适用于二元分类。

skplt.metrics.plot_cumulative_gain(y_test, y_gbc_proba, title = 'Cumulative Gains Chart for GBC')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

升力曲线

提升曲线显示了当考虑具有最高概率的人群的一部分时,与随机基线分类器相比,每个类别的响应率。

skplt.metrics.plot_lift_curve(y_test, y_gbc_proba, title = 'Lift Curve for GBC')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

调整图表属性

Scikit-plot 允许用户分别使用figsizetitle_fontsizetext_fontsize参数调整基本属性,如图形大小、标题字体大小和文本字体大小。

skplt.metrics.plot_lift_curve(y_test, y_gbc_proba, title = 'Lift Curve for GBC', figsize = (10,10), title_fontsize = 20, text_fontsize = 20)

此外,这些方法还通过ax参数接受matplotlib.axes.Axes对象。这很有用,因为我们可以定义要绘制的轴。例如,我们希望在同一个子图上并排绘制累积收益图和提升曲线。我们可以首先创建一个 1x2 子图网格,并使用ax参数在子图的不同网格中绘制每个图表。

fig, ax = plt.subplots(1,2)
skplt.metrics.plot_cumulative_gain(y_test, y_gbc_proba, ax = ax[0], title = 'Cumulative Gains Chart for GBC')
skplt.metrics.plot_lift_curve(y_test, y_gbc_proba, ax = ax[1],  title = 'Lift Curve for GBC')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

这些方法的输出是matplotlib.axes._subplots.AxesSubplot对象,我们可以使用 matplotlib 方法进一步操作这些对象。例如,我们可以执行以下操作来调整垂直轴的范围。

import matplotlib.pyplot as plt
ax = skplt.metrics.plot_lift_curve(y_test, y_gbc_proba, title = 'Lift Curve for GBC')
ax.set_ylim(0,3)

结论

我们研究了如何使用一行代码绘制各种常见的机器学习指标,以及如何使用 matplotlib 调整图表属性以满足我们的需求。Scikit-plot 中还有很多我们在本文中没有涉及到的功能,比如为聚类问题绘制肘图和剪影图。查看 Scikit-plot 文档了解更多详情。

借助 Power BI 可视化 SQLite 数据

原文:https://towardsdatascience.com/visualize-sqlite-data-with-power-bi-734856383643?source=collection_archive---------12-----------------------

使用 SQL 和 Power BI 进行实际数据分析

将 SQLite 数据库与 Power BI 相连接并将数据快速转化为洞察力的分步指南

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由艾萨克·史密斯Unsplash 拍摄

power bi⚡️
power bi desktop 支持多种数据源,包括 Excel、SQL Server、IBM Db2 数据库等等。虽然 Power BI 提供了 Azure SQL 数据库和 SQL 数据仓库的连接器,但是你不会找到任何 SQLite 数据库的连接器。但好消息是,您仍然可以在 Power BI 中可视化这些数据。⚡️

💡这篇文章末尾的指导项目将是展示您的数据科学作品集的绝佳素材。

几天前,我创建了一个 SQLite 数据库来练习 SQL 查询。但是,我更好奇的是,如何在 Power BI 中可视化这些数据。然后,我按照下面的过程来达到我的目标。

关于 SQLite 数据库及其创建方式的更深入的见解可以在我之前的文章中找到。

https://medium.com/analytics-vidhya/sql-database-with-python-5dda6c9a0c8d

在开始这个过程之前,让我告诉你更多关于这个英雄的事情😎我们的故事— SQLite ODBC 驱动

驱动程序是促进两个应用程序之间通信的接口

SQLite ODBC 驱动程序

ODBC 代表开放式数据库连接。

它是微软开发和维护的界面。我们将使用 ODBC 驱动程序来访问 SQLite 数据库中的数据。

ODBC 驱动程序允许我们将 SQLite 数据库添加到它的数据源列表中,然后这个数据源可以连接到任何应用程序进行进一步的分析和可视化。当然,这些数据库可以通过 Python 或任何其他编程来访问。但是,通过 ODBC 驱动程序访问它要方便得多。

我们开始吧!

让我们来看看继续这个故事所需要的所有东西。

  1. 一个 SQLite 数据库 :我正在赠送我自己创建的 SQLite 数据库📚作为一个很好的外卖。你可以在这里找到https://github.com/17rsuraj/data-curious/tree/master/TowardsDataScience。数据库文件的名称是tds.sqlite
  2. SQLite ODBC 驱动 :我发现我一些同事的电脑上已经安装了。不过你可以随时从这里 下载。根据您的操作系统,选择 32 位或 64 位版本。
  3. Power BI Desktop 版 :如果你是在职专业人士,可以使用你的工作邮箱访问 Power BI Desktop。如果您是学生,将需要您的学校电子邮件地址才能访问。威力 BI 桌面可以从 这里 下载。

检查 SQLite ODBC 驱动程序

这简单明了。只需在开始菜单中查找 ODBC 数据源并打开它。

你需要这三个驱动中的任何一个-
1。SQLite ODBC 驱动程序
2。SQLite3 ODBC 驱动程序
3。SQLite ODBC (UTF-8)驱动程序

如下图所示,您可以在“驱动程序”选项卡下检查这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

检查 ODBC 驱动程序(作者图片)

如果您看到上面列出的任何驱动程序,您可以跳过 SQLite ODBC 驱动程序的安装。

安装 SQLite ODBC 驱动程序

SQLite ODBC 驱动可以在 这里 下载。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下载并安装 SQLite ODBC 驱动程序(图片由作者提供)

一旦安装了这个驱动程序,然后再次检查它现在是否在 ODBC 数据源管理器中可见,如上图所示。

分配数据源名称(DSN)

至此,您将拥有 SQLite ODBC 驱动程序和 Power BI Desktop。让我们开始通过 ODBC 驱动程序将 SQLite 数据库与 Power BI 连接起来。
下一步是为所需的数据源创建一个
名称*。使用这个名称,我们可以在使用 Power BI 时识别所需的数据源。*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 ODBC 数据源管理器中设置数据源名称(图片由作者提供)

上图中的 DSN 代表数据源名称*。在“开始”菜单中搜索 ODBC 数据源管理器,然后按照此图片快速设置 DSN。要完成该过程,请在步骤 8 之后,在 ODBC 数据源管理器窗口中单击 OK。*

📌上图中需要记住的要点是:

*1\. Select the correct ODBC driver as shown in step 3
2\. Type in a meaningful Data Source Name as shown in step 5
3\. Browse for the sqlite3 database file which you want to visualize in step 6\. For this particular example, you can download my self-created database [file](https://github.com/17rsuraj/data-curious/blob/master/TowardsDataScience/tds.sqlite).
4\. After step 7, you must see your DSN in the ODBC Data Source Administrator window as shown in step 8.*

将数据导入 Power BI

离目标又近了一步🎯现在,让我们用 Power BI 连接数据源。只需打开 Power BI 桌面,按照下面的一系列图片进行操作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从 ODBC 获取数据(图片由作者提供)

如上图所示,您必须为在上一步中创建的数据源选择 DSN。一旦您在步骤 7 中单击 OK,您将被提示输入连接凭证*。*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据库连接凭据(作者图片)

只需选择默认或自定义选项,然后点击连接。接下来,您将在数据源导航器窗口中看到所有可用的表。在这里,您还会在顶部看到 DSN(如下面蓝色虚线矩形所示)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据源导航器(图片由作者提供)

如上图所示,选择要可视化的表并加载数据。如果您对任何数据操作感兴趣,也可以选择转换数据选项。

如果数据库有多个表,并且您希望可视化多个表中的数据,请选择所有表并加载数据。必须在 Power BI 的 模型 视图中手动创建表之间的关系。

行动的时间到了!!!🎭

电力商业智能中的数据可视化

由于来自 SQL 数据库的数据现在被导入到 Power BI 中,因此可以根据可用的数据创建各种可视化。这是我创造的视觉效果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

电力 BI 中的数据可视化(图片由作者提供)

您肯定可以利用 Power BI 可视化的强大功能进行创造性的可视化。我已经开始把我的工作从 Excel 转移到这个磁盘数据库,你也可以跟着做。

💡项目创意!!

使用Web Scraping创建您自己的数据集,通过练习 数据争论 技术对其进行评估和清理,并将其存储在 SQL 数据库 中,以最终在 Power BI 中将其可视化,这不失为一个好主意。

长话短说,

我向您展示了使用 Power BI 可视化 SQLite 数据的过程。有适当图片支持的一步一步的方法一定会帮助你更好地理解。

如果你想直接开始而不创建任何数据库,没问题!现成的 SQLite 数据库文件📚正在我的 Github repo 上等你。

此外,项目构想可以用其中给出的资源来实现。正如我常说的,我乐于接受建设性的反馈和通过 LinkedIn 分享知识。

感谢您的阅读和宝贵时间!

希望对你在任何数据集上练习 DataViz 有所帮助。

可视化不可见的量子位相位

原文:https://towardsdatascience.com/visualize-the-invisible-qubit-phase-e65c04f14969?source=collection_archive---------21-----------------------

并学习如何区分相对相位和全局相位

本帖是本书的一部分: 用 Python 动手做量子机器学习

当我们处理振幅时,量子位的相位是决定性因素。即使我们不能直接测量相位,它也不是不可见的。一旦,我们可以使用我们的模拟器来可视化它。第二,我们可以用数学来精确描述。

当我们观察布洛赫球时,具有正振幅的态位于 X 轴和 Z 轴的前侧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

相比之下,具有负振幅的态位于布洛赫球的背面。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

首先,让我们考虑一些简单的状态。如果我们将量子位状态向量绕 Y 轴旋转角度θ,我们得到以下状态。对于 0

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

该图示出了这些状态位于 X 轴和 Z 轴跨越的平面上。向量θ指定绕 Y 轴的旋转。因此,我们把相应的门称为 RY-gate。

在 Z 轴上相互镜像的两个向量具有相同的测量概率,例如图中所示的两个向量。它们共享相同的测量概率,但是它们的相位不同。

Z 门

Z 门反映了 Z 轴上量子位的状态。它具有类似于 X 门的效果,反映 X 轴上的状态。x 轴上的反射会影响最终的测量概率,因为它会改变到 z 轴端点(|0⟩和|1⟩).)的邻近度但是它没有触及这个阶段。相反,Z 轴上的反射会翻转相位,但不会影响测量概率。

以下等式表示 Z 门的变换矩阵。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Z-gate 将|+⟩态的量子位转变为|−⟩.态|+⟩和|−⟩位于 x 轴上。数学上,下面的等式描述了这种转换。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们通过编程来看看 Z 门的效果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

Qiskit 让我们很容易地展示量子位状态向量。我们照常定义和准备量子电路(第 4-11 行)。在这种情况下,我们在量子位 0(第 7 行)上应用一个单一的 Hadamard 门,在量子位 1(第 10-11 行)上应用一个附加的 Z 门。

我们使用'statevector_simulator'-后端执行电路。但是我们没有从执行结果中获取计数,而是调用了get_statevector()-函数(第 13 行)。输出是状态向量的数组,就像array([ 0.5+0.j, 0.5+0.j, -0.5+0.j, -0.5+0.j])

我们可以将这个数组输入从qiskit.visualization(第 2 行)导入的函数plot_bloch_multivector(第 14 行)。结果,我们得到了每个量子位的布洛赫球表示。

我们可以看到两个向量都在 Y 轴上。它们的振幅产生相同的测量概率,每个概率为 0.5。|+⟩状态向量指向 x 轴的正方向(正面),而|−⟩状态向量指向负方向(背面)。

让我们看另一个例子。在应用 Z 门之前,让我们围绕 Y 轴将状态旋转一个小θ。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

第二个例子强调了轴上的反射。它不是坐标系中心的反射。

Z 门有一个显著的特性。它对|0⟩和|1⟩.的量子位没有影响显然不是,因为这两个状态位于 Z 轴上。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

从数学角度来看,|0⟩.的情况很简单

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们得到了可视化的确认。但是|1⟩.怎么样

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个等式的结果是不明确的。得到的状态向量不同于原始向量|1⟩.

相移似乎有所不同。但是可视化显示这两个向量是相同的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

负号似乎无关紧要。但是如果我们把这个状态叠加会怎么样呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

同样,可视化告诉我们,这些状态之间没有区别。那么,让我们再来看看数学。如果我们将哈达玛门应用于|1⟩,就会得到|−⟩.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们首先应用 z 门,符号从|0⟩的幅度跳到|1⟩.的幅度

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你还记得帖子中的量子数学——你准备好接受红色药丸了吗,在那里阐述了无法区分

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如我们刚刚看到的,当我们在任一态上应用其他量子门时,结果态没有区别。α|0⟩态和β|1⟩态构成了一个共享的量子态。对于得到的量子位状态向量,α或β是否包含相位并不重要。

不过还是再细致一点吧。Qiskit 提供了另一种可视化,量子状态的“qsphere”表示。在这种表示中,点的大小与状态中相应项的概率成比例,颜色表示相位。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

上图显示了|0⟩−|1⟩/sqrt(2).状态下的量子位在应用 Z 门(第 6 行)之前,我们首先应用 Hadamard 门(第 5 行)。相位适用于状态|1⟩.的振幅因此,我们只能看到绿松石色的|1⟩。|0⟩仍然是红色的。两个圆具有相同的大小,因为两个状态具有相同的测量概率。

现在,让我们像以前一样在|1⟩态的量子位上应用 z 门和哈达玛门。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

这个电路导致−|0⟩+|1⟩/sqrt(2).状态这些颜色表明我们对|0⟩.进行了相移

因此,我们可以将相位应用于两个幅度之一,α或β。重要的是,我们不能将它应用于两个幅度,因为这将有效地再次恢复整体相位。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

多量子位相位

如果我们有多个量子比特呢?下面的等式表示两个量子位系统的状态。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

两量子位系统可以处于四种不同的状态。每个状态也有一个振幅。

事实上,我们已经在上面指定了一个两量子位系统来并排显示两个布洛赫球。量子位 0 处于|0⟩−|1⟩/sqrt(2 状态)而量子位 1 处于−|0⟩+|1⟩/sqrt(2).状态

让我们看看这个系统的四个状态的总体阶段。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

我们看到|00⟩和|11⟩.这两个国家的相位发生了变化在这种记法中,我们从右边(位置 0 的量子位)到左边(位置 1 的量子位)读取量子位。|11⟩获得量子位 0 相移的状态具有|1⟩振幅中的相位(如在|0⟩−|1⟩/sqrt(2)).因此,状态|00⟩得到量子位 1 的相移,它的相位在|0⟩ (−|0⟩+|1⟩/sqrt(2)).)的振幅中

尽管这很有道理,但这并不是全部事实。让我们看看如果两个量子位都处于|0⟩−|1⟩/sqrt(2).态会发生什么我们期望看到|01⟩和|10⟩.阶段的转变

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

与我们的预期不同,我们在|00⟩和|11⟩.看到了相位的变化原因很简单,相位是相对的。我们有两个相似但偏移的波。但是你怎么知道这两个波中哪一个是原始的呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

因此,我们需要接受这样一个事实:我们无法区分

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们使用单个量子位时,区分这两种状态的能力是虚假的。当我们加入第二个量子位元时,它已经消失了。

下面的电路在单个量子位上产生|0⟩−|1⟩/sqrt(2 状态。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

我们在|1⟩.看到了这个阶段看看当我们将电路定义为两个量子位的电路时会发生什么。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

在两个量子位的电路中,我们看到了|00⟩.态的相位因此,当我们对两个量子位中的一个施加相移时,我们看到它处于|1⟩.态

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者弗兰克·齐克特的图片

在这种情况下,我们通过应用哈达玛门(第 4-5 行)将两个量子位置于叠加态。我们在位置 0 移动量子位的相位。因此,我们看到这个量子位(右手边)的不同状态具有不同的相位。|1⟩状态中量子位为 0 的状态与|0⟩.状态中量子位为 0 的状态具有不同的相位同样,Qiskit 仅对相对相位有意义,并指示量子位 0 处于|0⟩.状态时的状态偏移全局相位不可观测。

结论

全局相位是我们使用的数学框架的人工制品。它们没有物理意义。如果两个状态只有一个全局相位不同,那么它们实际上代表的是同一个物理系统。

相比之下,相对相位是量子力学的核心,因此是量子计算中最令人感兴趣的部分。如果两个状态相差一个相对相位,它们就是以不同方式演化的不同系统。即使分开测量它们看起来是一样的,但当它们干扰其他量子系统时,会有不同的效果。

本帖是本书的一部分: 用 Python 动手做量子机器学习

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里免费获得前三章。

使用 Google Colab 用旭日图可视化你的投资组合

原文:https://towardsdatascience.com/visualize-your-investment-portfolio-with-sunburst-plots-using-google-colab-b8c1cdef25cf?source=collection_archive---------23-----------------------

旭日图是形象化你的投资组合的一种有见地的方式。Google Colab 使在浏览器中创建动态图变得很容易。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图一。展示投资组合的旭日图示例。图片由作者提供。

旭日图是可视化分层数据的一种有见地的方式。投资组合是此类数据的一个很好的例子,因为它可以细分为几个资产类别,每个资产类别可以进一步细分为单个资产,如上例所示。在这个小故事中,我分享了使用 google colab 创建如上图所示的情节的简单步骤。

运行代码以获得您自己的绘图

如果您只想运行代码并获得投资组合的绘图,您可以简单地替换以下 google colab 笔记本中的值:

https://colab.research.google.com/drive/1r2j8NzPL8HaC3O2f74XMabOiYVJ1nIxc?usp=sharing

该图是基于一个简单的表生成的,该表有 3 列:资产、名称和值。下图显示了如何逐行构建表格(左图)以及生成的格式化数据帧(右图)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图二。用于在笔记本中创建数据帧(左图)和数据帧渲染(右图)的代码示例。图片由作者提供。

绘图功能如何工作

对于情节,我使用的是 Plotly 库。从数据帧生成绘图的代码如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3。用于生成图 1 中的绘图的代码。图片由作者提供。

代码非常简洁,所以让我一步一步地解释它。

  • 每个标签必须有一个父标签和值。例如,您可以看到第一个标签是“Portfolio ”,有一个父项" "(空-无父项),其值是表中所有资产的总和。这将创建中心圆(图 1 中的白色区域)。
  • 下一步是图的第一个环,对应于资产类别。在第 6 行和第 14 行,数据帧按资产分组,并对值求和。然后在第 6 行,选择index,对应于唯一资产的列表。在第 14 行选择了Value,对应于每项资产的总价值。资产类别的父项总是“投资组合”标签,因此在第 10 行“投资组合”被添加了 n 次,其中 n 是可以通过df.Asset.nunique()获得的独特资产的数量。另外,注意列表前的*被用来使值“离开列表”,否则结果将是列表中的列表,这不是我们在这里想要的。
  • 最后,对于图的第二个环,所有单独的名称(第 7 行)和相应的值(第 15 行)被添加到标签和值列表中。在这种情况下,父资产是表中每一行对应的资产(第 11 行)。
  • 在第 17 行中,设置branchvalues='total'确保分支跨越父节点上方的所有空间,因为分支中值的总和等于父节点值。
  • 在第 19 行中,update_layout可以用来添加或删除图形周围的边距。
  • 在第 20 行,update_traces可以用来设置在绘图中显示哪些信息。在这种情况下,选项labels+percent parent确保绘图显示标签名称和相对于父标签的百分比。根据功能描述,text_info的选项可以是用“+”字符连接的[‘标签’,‘文本’,‘值’,‘当前路径’,‘根百分比’,‘条目百分比’,‘父百分比’]的任意组合。

仅此而已!我希望你觉得这个故事有用,并享受创造情节的乐趣!

免责声明:本故事的内容仅供参考。图、表或文本中提及的资产仅用于说明目的,并不代表任何类型的投资建议或认可。

用基本的 Viz 包可视化你的地图数据

原文:https://towardsdatascience.com/visualize-your-map-data-with-basic-viz-packages-448ef703ffc2?source=collection_archive---------35-----------------------

仅使用基本工具创建信息丰富的地图可视化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

美国宇航局在 Unsplash 拍摄的照片

当我处理房地产数据时,我经常在打开数据集时做一件事情,就是制作数据的地理可视化。我这样做没有使用任何复杂的包或形状文件。这不仅是一个很好的方式来形象化我的住房所在的物理空间,而且我可以用这个形象化来看到可能通知我的目标的其他元素。我所需要的是 Seaborn 和一个带有一些经度/纬度信息的数据集。

我首先加载我的相关包并加载我的数据集。在本例中,我使用的是国王郡住宅数据集。

# data processing tools
import pandas as pd
import numpy as np# Visualization tools
import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline# load and look at our king county housing data
df = pd.read_csv(‘kc_house_data.csv’)
df

这只适用于具有 lat/long 的数据集,但效果惊人。请看我获取数据集并生成国王县区域的地图:

# plotting latitude and longitude as a visual scatter plot to look for location outliersplt.figure(figsize=(25,25))ax = sns.scatterplot(data=df, x=”long”, y=”lat”, palette=”magma_r”)plt.show();

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

只用了几行代码,我就制作出了所有数据点的地图。我能做的第一件事是轻松识别基于位置的异常值。例如,对于 King County 数据集,在经度-121.65 以东只有几个属性不在我们想要建模的大都市区附近。我可以删除这些属性,而不用担心删除了有用的数据。

# drop the properties east of the metropolitan area
df.drop(df[df[‘long’] > -121.65].index, inplace=True)

不过,我可以用这张地图展示更多。我们都知道位置是房地产的一切,所以让我们在地图上展示一下,只需多几行代码。

我们将使用每个邮政编码的房屋价值中值对 70 个邮政编码从低到高进行价格排序。为此,我们将为我们的邮政编码制作一个等级查找表,然后将其应用于数据帧。

 # we’re using the median house value for a zip code to determine the zip code’s sort, so we can visualize the zip code importance# group our dataframe by zipcode on median home price, sorted ascending. 
zipsorted = pd.DataFrame(df.groupby(‘zipcode’)[‘price’].median().sort_values(ascending=True))# rank each zip code and assign rank to new column
zipsorted[‘rank’] = np.divmod(np.arange(len(zipsorted)), 1)[0]+1# function that looks up a segment that a data entry belongs to
def make_group(x, frame, column):
 ‘’’Takes in a line, a lookup table, and a lookup column
 returns value of target column
 PARAMETERS:
 line from dataframe x
 lookup table frame
 column to return rank’’’
 y = frame.loc[(frame.index == x)][column]
 z = np.array(y)
 z[0]
 return z[0]# make a new column on our dataframe. Look up each zip entry’s group, and append to the column.
df[‘zip_rank’] = df[‘zipcode’].apply(lambda x: make_group(x, zipsorted, ‘rank’))

顺便说一下,不要在你的模型中使用这些等级,至少在你分割和使用正确的目标编码之前不要使用。这会将您的拒绝数据泄露到您的模型中。我们现在只是把它作为一个可视化工具。

现在我们将制作和以前一样的地图,但是这一次我们将使用我们的 zip 等级给地图着色。

plt.figure(figsize=(25,25))ax = sns.scatterplot(data=df, x="long", y="lat", hue='zip_rank', palette="magma_r")# Add title to legend
ax.legend(title='Zip Rank', title_fontsize=30, fontsize=24)plt.show();

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,我们不仅制作了我们所在地区的地图,还展示了一些重要信息——即位置对价格的重要性。

如果我们尝试,我们可以在地图上显示更多信息,尽管在这个比例下,可能很难看到太多。但这是同样的地图,又是另一个维度,使用我们的“等级”属性来确定我们的散点大小。

 plt.figure(figsize=(25,25))ax = sns.scatterplot(data=df, x=”long”, y=”lat”, hue=’zip_rank’, size=’grade’, palette=”magma_r”)
# Add title to legend
ax.legend(title=’Zip Rank’, title_fontsize=24, fontsize=20)plt.show();

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就像那样,我们已经为一个住宅集制作了一个有用的和信息丰富的可视化,所有这些都没有使用任何额外的包或 shapefiles!我们需要的只是熊猫、numpy、matplotlib 和 seaborn 的基本套装。

使用 GA4、BigQuery 和 Tableau 可视化您的产品健康状态指标

原文:https://towardsdatascience.com/visualize-your-product-health-status-metrics-using-ga4-bigquery-and-tableau-9cc91cf9b6d3?source=collection_archive---------30-----------------------

了解热图表的强大功能!

在这篇文章中,我将分享一个我最喜欢的监控数码产品健康状态的可视化工具。我将关注这三个指标:1 .用法,2。成功率& 3。完成率。我还将分享如何从 BigQuery 查询提到的度量数据。

GA4 允许所有用户将原始数据导出到 Google cloud & BigQuery。这个特性非常棒,因为对于数据专业人员来说,原始数据就像是好厨师的新鲜有机食材。两者都是伟大食谱的必备!此外,Google Cloud 拥有广泛的分析工具来转换数据、分析数据、在其上应用 ML &构建数据产品,等等。

对于数据专业人员来说,原始数据就像是好厨师的新鲜有机食材。两者都是伟大食谱的必备!

让我们首先通过在 BigQuery 中查询来获取这些指标的数据。下面的查询应该可以帮助我们实现这一点。

-- Standard SQL, BigQuery
select parse_date('%Y%m%d',t.event_date) as date, platform, event_name, p.value.int_value as success, p2.value.string_value as flow_name,count(event_name) as events_count,if(p.value.int_value=1,count(event_name),0) as success_count,if(p.value.int_value=0,count(event_name),0) as fail_countfrom `[gcp_ptoject_name].[dataset_name].events_*` t, t.event_params p, t.event_params p2where p.key = 'success' and _table_suffix between '20210101' and '20211231' and p2.key = 'flow_name'group by 1,2,3,4,5order by date desc

我们得到了按日期、平台、流名称、事件名称和成功状态计数的事件&然后我们做一些计算来计数成功和失败事件的数量。

上述查询的结果应该类似于下表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,在获得我们需要的数据之后,是时候将它可视化了。我将使用热图表来可视化这三个指标。

热图表是我最喜欢的可视化数据的图表之一。这是一个任何人都能理解的简单图表(只是一个表格)。它可以在一个图像中封装多个维度,并使您能够轻松地发现趋势,如果您愿意,还可以检查绝对数字。

现在,让我们来看看每个指标的热图。

1-用法:

使用是指人们尝试进行某项活动的总次数。您也可以通过尝试参加活动的用户数量来计算。

这个指标不需要预先计算,我们从 BigQuery 获得的数据中明确显示了这一点。

下面的热图表是一个可视化所有事件和流的每个平台的使用趋势的示例。每个单元格包括两个值(事件数和与上一个值的差异%)。天)。颜色代码用于表示与前一天的百分比差异,以显示每个事件的使用趋势如何变化。例如,在 8 月 8 日,所有平台的 song_end 事件都有一个使用高峰。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

热图表—所有平台的每个事件和流量的使用趋势。

— — — —

2-成功率:

成功率是指成功完成一项活动的人占所有尝试完成这项活动的人的百分比。

要计算成功率,需要将成功的事件除以所有事件。以下是如何在 Tableau 中对上述数据进行操作。

sum([Success Count])/SUM([Events Count]) 

下面的热图是一个示例,直观显示了每个平台所有事件和流的成功率随时间的变化情况。颜色代码用于显示某些功能的成功率是否下降。例如,在下图中,8 月 9 日 iOS 应用程序的 song_play_start 事件的成功率显著下降。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

热图表—所有平台的每个事件和流程的成功率。

— — — —

3-完成率:

完成率是完成流程的用户与开始流程的用户之间的差异。即,完成收听音轨的人/开始音轨的所有人。

为了计算完成率,您可以使用 Tableau LOD 特性来创建指标。例如,下面是为上面的数据创建的代码。

{include [Flow Name],DAY([Date]),[Platform]: sum(if(CONTAINS([Event Name],"end")) then [Events Count] else 0 END)/
sum(if(CONTAINS([Event Name],"start")) then [Events Count] else 0 END)}

下面的热图是一个示例,显示了一个流程在每个平台上的完成率。颜色代码用于完成率,以显示它是否在某些日期或平台下降。例如,在下面的图表中,play_track 流增加了所有平台在 8 月 8 日和 9 日之间的完成率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论:

在这篇文章中,我试图分享我最喜欢的图表之一,热图表,以及如何可视化健康状态指标。我还讨论了如何在 BigQuery 中查询数据。

你有其他可视化健康状态指标的想法吗?如果有,请在评论区与我们分享!😃

— — — -

你可以在下面查看我以前的帖子:

用这个框架简化你的 GA4 追踪&分析——以 Spotify App 为例。

确保您的应用为用户提供最佳体验的 3 项指标。

— — —

注:本帖所有数据均为虚拟数据,并非真实数据。

使用 Python 在交互式地图上可视化您的 Strava 数据

原文:https://towardsdatascience.com/visualize-your-strava-data-on-an-interactive-map-with-python-92c1ce69e91d?source=collection_archive---------9-----------------------

使用 Strava API 和 Python 下载您的活动数据、创建高程剖面并在交互式地图上绘制您的活动详细信息,只需几个简单的步骤。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

D 下载你的 Strava 数据并不复杂。但首先,您必须通过一个一次性的手动过程,授权您的应用程序访问您的所有活动数据。首先,我建议你按照 Matt Ambrogi 在他精彩的故事中解释的步骤。之后,你就可以走了。

首先:导入一些重要的 Python 包。还建议禁用特定的urllib3警告。

# import modules
import os
import requests
import urllib3
import pandas as pd
import numpy as np
import time
import matplotlib.pyplot as plt
import folium
import polyline
import base64
from tqdm import tqdm# disable warnings
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

要下载您的 Strava 数据,需要设置一些变量。当您在线登录到您的 Strava count 时,您可以查找所需的值。进入“设置”,然后进入“我的 API 应用程序”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

您将需要您的客户端 ID客户端密码刷新令牌。在下面的代码块中,将文本在此插入您的值替换为您的个人值。

# set strava variables
client_id = ‘insert your value here‘
client_secret = ‘insert your value here’
refresh_token = ‘insert your value here'

基于您刚刚声明的变量,您可以获得一个新的访问令牌。

# define function to get a new access token
def get_access_token(client_id, client_secret, refresh_token):

   oauth_url = ‘[https://www.strava.com/oauth/token'](https://www.strava.com/oauth/token')

   payload = {
       ‘client_id’: client_id, 
       ‘client_secret’: client_secret, 
       ‘refresh_token’: refresh_token, 
       ‘grant_type’: ‘refresh_token’, 
       ‘f’: ‘json’, 
   }

   r = requests.post(oauth_url, data=payload, verify=False)

   access_token = r.json()[‘access_token’] return access_token# get new access token
access_token = get_access_token(client_id, client_secret, refresh_token)

现在您有了一个新的访问令牌,您可以下载您的 Strava 数据。一页数据包含 200 个活动(默认值)。因此,平均每周 4 次活动大约是每年 1 页 Strava 数据(4 次活动×50 周)。我们将设置一个初始值,最大获取 10 页。然而,当发现一个空页面时,控制循环将停止。

# define function to get your strava data
def get_data(access_token, per_page=200, page=1):

   activities_url = ‘[https://www.strava.com/api/v3/athlete/activities'](https://www.strava.com/api/v3/athlete/activities')
   headers = {‘Authorization’: ‘Bearer ‘ + access_token}
   params = {‘per_page’: per_page, ‘page’: page}

   data = requests.get(
       activities_url, 
       headers=headers, 
       params=params
   ).json()

   return data# get you strava data
max_number_of_pages = 10
data = list()
for page_number in tqdm(range(1, max_number_of_pages + 1)):
    page_data = get_data(access_token, page=page_number)
    if page_data == []:
        break
    data.append(page_data)

现在我们有了一个带有页面结果的列表中的数据,我们将把它们放在一个字典中,并打印下载的活动数量。

# data dictionaries
data_dictionaries = []
for page in data:
    data_dictionaries.extend(page)# print number of activities
print(‘Number of activities downloaded: {}’.format(len(data_dictionaries)))

最后一步是将数据标准化为熊猫数据框架,并对一些数据进行采样以获得第一印象。

# normalize data
activities = pd.json_normalize(data_dictionaries)# sample activities
activities[['name', 'distance', 'average_speed', 'moving_time']]\
.sample(5)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

map.summary_polyline是 Google 格式的,我们需要先解码,然后才能在地图上绘制路线(折线)。

# add decoded summary polylines
activities[‘map.polyline’] = activities[‘map.summary_polyline’].apply(polyline.decode)

新创建的列map.polyline将用于使用开放高程 API 向数据帧添加高程数据。注意:根据活动的数量和距离(折线中的坐标数),下载高程数据可能需要相当长的时间。

# define function to get elevation data using the open-elevation API
def get_elevation(latitude, longitude):
    base_url = ‘[https://api.open-elevation.com/api/v1/lookup'](https://api.open-elevation.com/api/v1/lookup')
    payload = {‘locations’: f’{latitude},{longitude}’}
    r = requests.get(base_url, params=payload).json()[‘results’][0]
    return r[‘elevation’]# get elevation data
elevation_data = list()
for idx in tqdm(activities.index):
    activity = activities.loc[idx, :]
    elevation = [get_elevation(coord[0], coord[1]) for coord in activity['map.polyline']]
    elevation_data.append(elevation)# add elevation data to dataframe
activities['map.elevation'] = elevation_data

在我们的数据框架中还有一些工作要做。日期没有日期时间格式,距离以米为单位,速度以米每秒为单位。设置一个索引列并删除我们不使用的列也是一个很好的做法。

# convert data types
activities.loc[:, ‘start_date’] = pd.to_datetime(activities[‘start_date’]).dt.tz_localize(None)
activities.loc[:, ‘start_date_local’] = pd.to_datetime(activities[‘start_date_local’]).dt.tz_localize(None)# convert values
activities.loc[:, ‘distance’] /= 1000 # convert from m to km
activities.loc[:, ‘average_speed’] *= 3.6 # convert from m/s to km/h
activities.loc[:, ‘max_speed’] *= 3.6 # convert from m/s to km/h# set index
activities.set_index(‘start_date_local’, inplace=True)# drop columns
activities.drop(
    [
        ‘map.summary_polyline’, 
        ‘resource_state’,
        ‘external_id’, 
        ‘upload_id’, 
        ‘location_city’, 
        ‘location_state’, 
        ‘has_kudoed’, 
        ‘start_date’, 
        ‘athlete.resource_state’, 
        ‘utc_offset’, 
        ‘map.resource_state’, 
        ‘athlete.id’, 
        ‘visibility’, 
        ‘heartrate_opt_out’, 
        ‘upload_id_str’, 
        ‘from_accepted_tag’, 
        ‘map.id’, 
        ‘manual’, 
        ‘private’, 
        ‘flagged’, 
    ], 
    axis=1, 
    inplace=True
)

我们的第一个情节开始了!我们将从在地图上绘制一条活动路线开始。为了正确地使地图居中,我们计算质心或“折线中心”。

# select one activity
my_ride = activities.iloc[0, :] # first activity (most recent)# plot ride on map
centroid = [
    np.mean([coord[0] for coord in my_ride['map.polyline'][0]]), 
    np.mean([coord[1] for coord in my_ride['map.polyline'][0]])
]
m = folium.Map(location=centroid, zoom_start=10)
folium.PolyLine(my_ride['map.polyline'], color='red').add_to(m)
display(m)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

让我们画出这次乘坐的高度剖面图。

# plot elevation profilefig, ax = plt.subplots(figsize=(10, 4))
ax = pd.Series(my_ride[‘map.elevation’][0]).rolling(3).mean().plot(
    ax=ax, 
    color=’steelblue’, 
    legend=False
)
ax.set_ylabel(‘Elevation’)
ax.axes.xaxis.set_visible(False)
ax.spines[‘top’].set_visible(False)
ax.spines[‘right’].set_visible(False)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

现在,我们准备在一张地图上绘制所有活动,每条路线(中途)都有一个标记,还有一个包含所有活动详细信息的交互式弹出窗口。对于每种类型的活动(骑行、跑步、步行),我们将使用不同的颜色。我们将分两步进行。在步骤 1 中,我们创建弹出窗口所需的所有高程剖面。在步骤 2 中,创建并保存了实际的地图。

步骤 1:立面图

# color scheme
color = {'Ride':'red', 'Run':'blue', 'Walk':'purple'}# create dictionary with elevation profiles
elevation_profile = dict()for row in activities.iterrows():
    row_values = row[1]

    # figure
    fig, ax = plt.subplots(figsize=(6, 2))
    ax = pd.Series(row_values[‘map.elevation’]).rolling(3).mean().plot(
        ax=ax, 
        color=color[row_values[‘type’]],
        legend=False, 
    )
    ax.set_ylabel(‘Elevation’)
    ax.axes.xaxis.set_visible(False)
    ax.spines[‘top’].set_visible(False)
    ax.spines[‘right’].set_visible(False)
    png = ‘elevation_profile_{}.png’.format(row_values[‘id’])
    fig.savefig(png, dpi=75)
    plt.close()

    # read png file
    elevation_profile[row_values[‘id’]] = base64.b64encode(open(png, ‘rb’).read()).decode()

    # delete file
    os.remove(png)

第二步:绘制交互式地图

# plot all activities on map
resolution, width, height = 75, 6, 6.5def centroid(polylines):
    x, y = [], []
    for polyline in polylines:
        for coord in polyline:
            x.append(coord[0])
            y.append(coord[1])
    return [(min(x)+max(x))/2, (min(y)+max(y))/2]m = folium.Map(location=centroid(activities['map.polyline']), zoom_start=4)for row in activities.iterrows():
    row_index = row[0]
    row_values = row[1]
    folium.PolyLine(row_values['map.polyline'], color=color[row_values['type']]).add_to(m)

    halfway_coord = row_values['map.polyline'][int(len(row_values['map.polyline'])/2)]# popup text
    html = """
    <h3>{}</h3>
        <p>
            <code>
            Date : {} <br>
            Time : {}
            </code>
        </p>
    <h4>{}</h4>
        <p> 
            <code>
                Distance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp: {:.2f} km <br>
                Elevation Gain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp: {:.0f} m <br>
                Moving Time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp: {} <br>
                Average Speed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp: {:.2f} km/h (maximum: {:.2f} km/h) <br>
                Average Cadence&nbsp;&nbsp;&nbsp;&nbsp;&nbsp: {:.1f} rpm <br>
                Average Heart Rate&nbsp;&nbsp: {:.0f} bpm (maximum: {:.0f} bpm) <br>
                Average Watts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp: {:.1f} W <br>
                Average Temperature&nbsp: {:.1f} <br>
                Kilojoules&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp: {:.1f} <br>
                Relative Effort&nbsp;&nbsp;&nbsp;&nbsp;&nbsp: {:.0f} <br>
                Athletes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp: {:.0f} <br>
                Kudos&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp: {:.0f} <br>
            </code>
        </p>
    <img src="data:image/png;base64,{}">
    """.format(
        row_values['name'], 
        row_index.date(), 
        row_index.time(),  
        row_values['type'], 
        row_values['distance'], 
        row_values['total_elevation_gain'], 
        time.strftime('%H:%M:%S', time.gmtime(row_values['moving_time'])), 
        row_values['average_speed'], row_values['max_speed'], 
        row_values['average_cadence'],  
        row_values['average_heartrate'], row_values['max_heartrate'], 
        row_values['average_watts'], 
        row_values['average_temp'], 
        row_values['kilojoules'], 
        row_values['suffer_score'], 
        row_values['athlete_count'], 
        row_values['kudos_count'], 
        elevation_profile[row_values['id']], 
    )

    # add marker to map
    iframe = folium.IFrame(html, width=(width*resolution)+20, height=(height*resolution)+20)
    popup = folium.Popup(iframe, max_width=2650)
    icon = folium.Icon(color=color[row_values['type']], icon='info-sign')
    marker = folium.Marker(location=halfway_coord, popup=popup, icon=icon)
    marker.add_to(m)m.save('mymap.html')
display(m)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

您的互动地图另存为mymap.html,可以分享!你只需要一个网络浏览器来查看你的(本地)文件。

最后的想法

Python 是一种功能强大的语言,拥有惊人的库来可视化您的数据。你最喜欢的可视化地理数据的语言和包是什么?让我知道你的想法。

https://medium.datadriveninvestor.com/create-thematic-maps-using-shapefiles-in-julia-135ea67e9628 </5-amazing-pandas-features-you-probably-dont-know-about-5533498aac88>

使用 Python 甘特图可视化您团队的项目

原文:https://towardsdatascience.com/visualize-your-teams-projects-using-python-gantt-chart-5a1c1c98ea35?source=collection_archive---------7-----------------------

利用您的 Python 技能来帮助您的团队管理他们的任务

动机

如果您在团队中工作,团队中可能会有多个项目。每个项目还有一些有截止日期的子任务。每个子任务被分配给不同的团队成员。

如果每个成员都有不同的休假日期,日程安排就更复杂了。有没有一种方法可以让你用 Python 可视化所有这些细节,如下图?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

是的,你可以用 python-gantt。

什么是甘特图?

甘特图是一种条形图,它提供了一段时间内任务计划的可视化视图。x 轴代表时间线,y 轴代表任务。

Python 中有多个库可以让你创建甘特图,但我发现的图形最漂亮的是 python-gantt。

要安装 python-gantt ,请使用

pip install python-gantt

入门指南

我们将从一个简单的例子中学习如何使用 python-gantt。假设你的公司只有两名员工:Ben 和 Alex。您希望在一个项目中为不同的员工分配不同的任务。

创建员工

从使用gantt.Resource()方法创建雇员开始。

创建一些任务

接下来,我们使用gantt.Tasks方法为您的员工创建一些任务

gantt.Tasks方法内部参数说明:

  • start:开始日期
  • duration:任务的持续时间
  • resources(可选):任务会分配给谁
  • color(可选):任务栏的颜色

创建项目

一个项目可能有不同的任务。例如,“清理数据”项目可以包括较小的任务,如“研究数据”、“选择最佳特征”等。

可能有多个项目,例如“清理数据”、“构建模型”和“测试模型性能”。在这个例子中,我们将只创建一个包含上面创建的所有任务的项目。

创建假期(可选)

您也可以使用add_vacation方法将自定义假期添加到甘特图中

现在我们已经准备好可视化我们的甘特图了!

用甘特图可视化

要可视化甘特图,请使用make_svg_for_tasks方法

这将创建一个 SVG 图像,如下所示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

点击此处查看图表。在上图中,灰色单元格表示休息日(周末和假期),蓝色竖线表示今天。我们还可以看到每个任务的持续时间以及每个任务分配给了谁。

多个项目和里程碑

在现实生活中,甘特图可能看起来比上面更复杂,因为可能有多个项目。在一个项目中,可能有多个里程碑。

里程碑标志着工作主要阶段的完成。每个里程碑可以有不同的任务。

这些细节听起来很复杂。好消息是,使用 python-gantt 可以很容易地将所有这些细节包含在甘特图中。

创建项目 2、里程碑和任务

要创建一个里程碑,使用gantt.Milestone方法。参数depends_of指定每个里程碑依赖于哪些任务。

酷!现在我们向项目 2 添加任务和里程碑

可视化所有项目

为了合并我们创建的所有项目,我们将创建一个包含项目 1 和项目 2 的父项目

然后可视化所有项目

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

点击这里查看上面的甘特图。

结论

恭喜你!您刚刚学习了如何用 Python 创建甘特图。创建一个,并展示给你的队友和经理。他们会很高兴能够在一个地方可视化所有项目和任务。

Github repo中,您可以随意使用本文的代码。

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。

https://medium.com/towards-artificial-intelligence/visualize-gender-specific-tweets-with-scattertext-5167e4600025

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值