Anaconda Jupyter 笔记本中的虚拟环境—简易指南
数据科学
在您的笔记本电脑中创建第一个 virtualenv 的简单步骤
为什么需要虚拟环境?
Python 有自己独特的下载、存储和解析包(或模块)的方式。虽然这有它的优点,但是有一些有趣的关于包存储和解决的决定,这导致了一些问题,特别是关于包如何和在哪里存储。
什么是虚拟环境?
Python 虚拟环境的主要目的是为 Python 项目创建一个隔离的环境。这意味着每个项目都可以有自己的依赖项,而不管其他项目有什么依赖项。
最棒的是,您可以拥有的环境数量没有限制,因为它们只是包含几个脚本的目录。另外,它们很容易创建。
让我们直接进入您的 Jupyter 笔记本主页,转到新的下拉菜单,然后选择终端
开始编写以下命令
conda create -n myenv python=3.7
欢迎您更改您想要的 python 版本和环境名称。
然后按回车键。
Python 将要求安装如下默认包:
将下载以下软件包:
包|构建
—————|———
certificate-2020 . 4 . 5 . 1 | py37 _ 0 155 KB
python-3 . 7 . 7 | HC 70 fcce _ 0 _ cpython 19.8 MB
setup tools-46 . 1 . 3 | py37 _ 0 520 KB
———————将安装以下新软件包:
ca-certificates pkgs/main/OS x-64::ca-certificates-2020 . 1 . 1–0
certify pkgs/main/OS x-64::certify-2020 . 4 . 5 . 1-py37 _ 0
libc xx pkgs/main/OS x-64::libc xx-4 . 0 . 1-hcfea 43d _ 1
libcxxabi pkgs/main/OS x-64::libc xxabi-4 .继续吗?
点击“y”
Python 会告诉你如何在需要的时候激活你的环境。
#要激活此环境,请使用
$ conda activate myenv
#要停用活动环境,请使用
$ conda deactivate
让我们从编码开始
conda activate myenv
您会注意到环境的名称将出现在下一行代码的旁边,如(myenv)
现在,让我们来看看在这种环境下我们需要一个特定的内核。
我们希望能够在 Jupyter 笔记本主页的下拉菜单中点击并选择我们的环境。
让我们从安装 ipykernel 库开始
pip install ipykernel
下一步,我们将编写以下代码:
ipython kernel install — user — name=myenv
您应该会收到一条消息
将 kernelspec myenv 安装在/Users/yasserimam/Library/Jupyter/kernels/myenv 中
现在你可以回到你的 Jupyter 笔记本主页,你会发现内核。
快乐编码:)
使用 JavaScript 和 PoseNet 的虚拟方向盘
的力量深度学习 架构和方便的tensor flow . js*库允许我们创建有趣的应用程序,改变我们与计算机的交互方式。在这种情况下,我们使用姿势估计神经网络来基于手腕的位置创建一个 虚拟方向盘 。*
XR Expo 在 Unsplash 上拍摄的照片
介绍
在这个项目中,我将展示一个 web 应用程序和深度学习模型之间的集成示例,以将应用程序控制从鼠标和键盘转移到人体。
在这种情况下,我创建了一个虚拟方向盘来在高速公路上驾驶车辆。
视频截图来自 Github 自述 |作者 gif
它是如何工作的
摘要
利用手腕的坐标,我们可以计算它们之间的线段,然后计算它与水平轴形成的角度,如果这个角度大于 25°或小于-25°,那么车辆将分别向左或向右转弯。
利用 PoseNet CNN 检测手的位置
PoseNet 包包含一个独立的机器学习模型,用于使用 TensorFlow.js 在浏览器中运行实时姿态估计。
PoseNet 可以用于估计单个姿态或多个姿态,这意味着有一个版本的算法只能检测图像/视频中的一个人,还有一个版本可以检测图像/视频中的多人。在这种情况下,我们将使用单人算法。
图片由 Dan 在浏览器中用 TensorFlow.js 从实时人体姿态估计中移除
该模型接收来自摄像机的图像,并因此返回身体每个部分的位置及其坐标的数组。
在我们的例子中,我们只需要手腕的位置来驾驶汽车和绘制“方向盘”。
正如我们在代码中看到的,结果给了我们坐标与手在**【x,y】**变量中的位置。
更多关于波森特的信息。
用代数来模拟方向盘
让我们开始思考,如果车辆应该向左、向右转向或保持直线行驶,需要考虑哪些条件。
当我们想到方向盘时,很容易想象在每种情况下方向盘的位置是什么样子。
三种可能状态的表示|作者图片
一旦我们看到图像,我们可以看到手与水平轴之间的线段所形成的角度是检测实际状态的一个很好的方法,例如,如果右手在左手上方(形成一个正角度),那么车辆应该左转。
我们也可以使用垂直距离,但这不是最通用的,因为它与人相对于摄像机的位置成比例。
其中α (alpha)是作者用手形成的线段和横轴|图像之间的角度
改变状态的角度限制
一旦我们确定改变状态的条件是基于角度,我们必须确定从一个状态改变到另一个状态的极限。
经过一些实验后,我发现(-25,25)是一个很好的范围,可以确定车辆是左转、右转还是保持直线行驶。
状态变化的角度限制,avobe 25 左转,25°以下右转,在[-25,25 ]范围内保持直线|图片由作者提供
计算角度
使用一些代数,我们可以很容易地获得手形成的线段和横轴之间的角度,如下所示。
一旦我们有了角度,我们就可以更新应用程序状态来改变汽车控制的方向。
这段代码可能不是最理想的,但是这里的想法是展示它是如何工作的
结论
这只是一个简单的例子,说明我们可以在浏览器中使用这些机器学习库做什么,但它增加了各种各样新的酷功能和与网页交互的方式。
如果您对这项技术的其他好的用途有想法,我邀请您开发并展示它们。
我们建造的一切我们认为有价值的东西都值得展示😉
基于视觉的月球跟踪器
帮助你基于Mask-RCNN创建月球追踪器(图片&视频)的完整指南。改变数据集,标记你选择的物体,你就可以创建你自己的物体跟踪器了!没有必要为你的第一个定制的追踪器四处游荡。
一帧一帧的月球追踪器(图片作者)
(追踪器的)为什么部分
我们都或多或少地被月亮的美丽所吸引。夜空中最大最亮的物体。
有很多app可以追踪月球的运动。关于月亮,没有什么是不可预测的。从这个角度来看,月球是简易追踪器的理想选择。
但是,现在从更广泛的意义上来说,一个智能物体追踪器可以安装在一个固定的位置,或者安装在一个移动的车辆甚至是卫星上。您相机的视野可能不同。如果物体移动,那么理想情况下,您的算法应该向摄像设备发出准确的 PTZ 命令(方向和移动速率)来跟踪感兴趣的物体。很复杂。
现在让我们简化一下。
从算法的角度来看,有两件事很重要:
- (运动)物体随时间(实时)检测和定位的精度。
- 速度/帧率处理。否则,当你发现的时候,物体可能已经到达了你(相机)够不到的地方。
我们要做什么部分
由于这更多的是一篇技术文章,我只是分享这个项目的关键,来帮助你一步一步地创建一个月球追踪器(或者你选择的任何定制对象)。假设你有 mask-RCNN 的基础知识,即使你没有,你仍然可以遵循这个。
基于 Mask-RCNN 的简单 月球跟踪器 。
现在,怎么做的部分
第一步:设置环境并加载必要的软件包。
使用 Google colab 是可选的。这是一个很好的选择:
- 如果数据不敏感
- 如果你有很多数据
- 如果你没有本地 GPU
**from** **google.colab** **import** drive
drive.mount('/content/drive/')**import** **os**
os.chdir("drive/My Drive/Colab Notebooks/moon-tracker/")---------------------------------------------------------**from** **mrcnn.config** **import** Config
**from** **mrcnn** **import** model **as** modellib
**from** **mrcnn** **import** visualize
**import** **mrcnn**
**from** **mrcnn.utils** **import** Dataset
**from** **mrcnn.model** **import** MaskRCNN
**import** **numpy** **as** **np**
**from** **numpy** **import** zeros
**from** **numpy** **import** asarray
**import** **colorsys**
**import** **argparse**
**import** **imutils**
**import** **random**
**import** **cv2**
**import** **os**
**import** **time**
**from** **matplotlib** **import** pyplot
**from** **matplotlib.patches** **import** Rectangle
**from** **keras.models** **import** load_model
%matplotlib inline
**from** **os** **import** listdir
**from** **xml.etree** **import** ElementTree
您可以选择将数据保存在驱动器上,然后像上面一样装载到您的环境中。此外,您可以选择在会议期间直接上传,但只有在会议结束后才能上传。
第二步:准备好你的训练和测试数据集。
即您的图像和相应的对象遮罩。
好吧,如果你没有,为了创建掩码并把它作为一个 XML 文件,你可以使用 Labellmg。
(图片作者)
(图片作者)
训练和测试集的读取是基于你保存和生成 XML 文件的方式。参考代码,如果你喜欢下面的结构。
月球追踪器
— — — —月亮 _ 面具 _ 完整
— — — — — —图片(所有图片 jpg/png 等)
— — — — — —注释(图像遮罩的 XML 文件)
**class** **MoonDataset**(Dataset):
*# load the dataset definitions*
**def** load_dataset(self, dataset_dir, is_train=**True**):
*# Add classes. We have only one class to add.*
self.add_class("dataset", 1, "moon")
*####################################################################*
*# define data locations for images and annotations*
images_dir = 'moon_mask_full/images/'
annotations_dir = 'moon_mask_full/annotations/'
*####################################################################*
annot_list = []
**for** annot **in** listdir(annotations_dir):
annot_list.append(annot.split('.')[0])
*# Iterate through all files in the folder to*
*#add class, images and annotaions*
**for** filename **in** listdir(images_dir):
*# extract image id for all formats like jpg / png / jpeg*
image_id = filename.split('.')[0]
*#print(image_id)*
*# There can be a chance that you don't created xml file for all the images.*
*# To filter images which have corresponding mask XML file.*
**if** image_id != '' **and** image_id **in** annot_list:
*# setting image file*
img_path = images_dir + filename
*#print(img_path)*
*# setting annotations file*
ann_path = annotations_dir + image_id + '.xml'
*#print(ann_path)*
*# adding images and annotations to dataset*
self.add_image('dataset', image_id=image_id, path=img_path, annotation=ann_path)
*# extract bounding boxes from an annotation file*
**def** extract_boxes(self, filename):
*# load and parse the file*
tree = ElementTree.parse(filename)
*# get the root of the document*
root = tree.getroot()
*# extract each bounding box*
boxes = list()
**for** box **in** root.findall('.//bndbox'):
xmin = int(box.find('xmin').text)
ymin = int(box.find('ymin').text)
xmax = int(box.find('xmax').text)
ymax = int(box.find('ymax').text)
coors = [xmin, ymin, xmax, ymax]
boxes.append(coors)
*# extract image dimensions*
width = int(root.find('.//size/width').text)
height = int(root.find('.//size/height').text)
*#print(boxes, width, height)*
**return** boxes, width, height
*# load the masks for an image*
*"""Generate instance masks for an image.*
*Returns:*
*masks: A bool array of shape [height, width, instance count] with*
*one mask per instance.*
*class_ids: a 1D array of class IDs of the instance masks.*
*"""*
**def** load_mask(self, image_id):
*# get details of image*
info = self.image_info[image_id]
*#print(info)*
*# define anntation file location*
path = info['annotation']
*# load XML*
boxes, w, h = self.extract_boxes(path)
*# create one array for all masks, each on a different channel*
masks = zeros([h, w, len(boxes)], dtype='uint8')
*# create masks*
class_ids = list()
**for** i **in** range(len(boxes)):
box = boxes[i]
row_s, row_e = box[1], box[3]
col_s, col_e = box[0], box[2]
masks[row_s:row_e, col_s:col_e, i] = 1
class_ids.append(self.class_names.index('moon'))
**return** masks, asarray(class_ids, dtype='int32')
*# load an image reference*
*"""Return the path of the image."""*
**def** image_reference(self, image_id):
info = self.image_info[image_id]
*#print(info)*
**return** info['path']
第三步:下载 COCO weights 'mask _ rcnn _ COCO . H5’并保存在主文件夹中。
链接:https://github.com/matterport/Mask_RCNN/releases
*#load the weights for COCO*
model.load_weights('mask_rcnn_coco.h5',
by_name=**True**,
exclude=["mrcnn_class_logits", "mrcnn_bbox_fc", "mrcnn_bbox", "mrcnn_mask"])
步骤 4:调整训练和学习参数,以微调模型。
使用配置、learning_rate、epoch 和 layers (‘all ‘、’ 3+’、’ 4+‘、’ heads ')来获得更好的准确性。
**class** **moon_detector_Config**(Config):
*# give the configuration a recognizable name*
NAME = "moon_detector_Config"
*# set the number of GPUs to use along with the number of images*
*# per GPU*
GPU_COUNT = 1
IMAGES_PER_GPU = 1
*# number of classes (we would normally add +1 for the background)*
*# moon + BG*
NUM_CLASSES = 1+1
*# Number of training steps per epoch*
STEPS_PER_EPOCH = 50
*# Learning rate*
LEARNING_RATE=0.001
*# Skip detections with < 90% confidence*
DETECTION_MIN_CONFIDENCE = 0.95
*# setting Max ground truth instances*
MAX_GT_INSTANCES=1
*# Maximum instances in a frame. Only one moon possible.*
*# But can have different number based on the object example cat, dog, bus, car etc.*
DETECTION_MAX_INSTANCES = 1config = moon_detector_Config()config.display()
--------------------------------------------------------------------Configurations:
BACKBONE resnet101
BACKBONE_STRIDES [4, 8, 16, 32, 64]
BATCH_SIZE 1
BBOX_STD_DEV [0.1 0.1 0.2 0.2]
COMPUTE_BACKBONE_SHAPE None
DETECTION_MAX_INSTANCES 1
DETECTION_MIN_CONFIDENCE 0.95
DETECTION_NMS_THRESHOLD 0.3
FPN_CLASSIF_FC_LAYERS_SIZE 1024
GPU_COUNT 1
GRADIENT_CLIP_NORM 5.0
IMAGES_PER_GPU 1
IMAGE_CHANNEL_COUNT 3
IMAGE_MAX_DIM 1024
IMAGE_META_SIZE 14
IMAGE_MIN_DIM 800
IMAGE_MIN_SCALE 0
IMAGE_RESIZE_MODE square
IMAGE_SHAPE [1024 1024 3]
LEARNING_MOMENTUM 0.9
LEARNING_RATE 0.001
LOSS_WEIGHTS {'rpn_class_loss': 1.0, 'mrcnn_class_loss': 1.0, 'mrcnn_mask_loss': 1.0, 'mrcnn_bbox_loss': 1.0, 'rpn_bbox_loss': 1.0}
MASK_POOL_SIZE 14
MASK_SHAPE [28, 28]
MAX_GT_INSTANCES 1
MEAN_PIXEL [123.7 116.8 103.9]
MINI_MASK_SHAPE (56, 56)
NAME moon_detector_Config
NUM_CLASSES 2
POOL_SIZE 7
POST_NMS_ROIS_INFERENCE 1000
POST_NMS_ROIS_TRAINING 2000
PRE_NMS_LIMIT 6000
ROI_POSITIVE_RATIO 0.33
RPN_ANCHOR_RATIOS [0.5, 1, 2]
RPN_ANCHOR_SCALES (32, 64, 128, 256, 512)
RPN_ANCHOR_STRIDE 1
RPN_BBOX_STD_DEV [0.1 0.1 0.2 0.2]
RPN_NMS_THRESHOLD 0.7
RPN_TRAIN_ANCHORS_PER_IMAGE 256
STEPS_PER_EPOCH 50
TOP_DOWN_PYRAMID_SIZE 256
TRAIN_BN False
TRAIN_ROIS_PER_IMAGE 200
USE_MINI_MASK True
USE_RPN_ROIS True
VALIDATION_STEPS 50
WEIGHT_DECAY 0.0001
加载数据集
*# prepare train set*
train_set = MoonDataset()
train_set.load_dataset( 'train_data_path/')
train_set.prepare()
print('Train: **%d**' % len(train_set.image_ids))
*# prepare test/val set*
test_set = MoonDataset()
test_set.load_dataset('test_data_path/')
test_set.prepare()
print('Test: **%d**' % len(test_set.image_ids))
加载基础模型
print("Loading Mask R-CNN model...")
model = modellib.MaskRCNN(mode="training", config=config, model_dir='./')
调整 learning_rate、epoch 和 layers 并训练
层从[‘全部’,’ 3+‘,’ 4+',‘头’]中选择
范围[5–50]内的纪元
*## train heads with higher lr to speedup the learning*
model.train(train_set, test_set, learning_rate=config.LEARNING_RATE, epochs=50, layers='3+' )
history = model.keras_model.history.history
为将来保存模型
model_path = ' path to your model' + 'name' + '.h5'
model.keras_model.save_weights(model_path)
5。测试新的一组图像
*# Load pretrained moon mask*
model_path = 'moon_model/moon_mask_rcnn_125.h5' # the model you created**from** **keras.preprocessing.image** **import** load_img
**from** **keras.preprocessing.image** **import** img_to_array*#Loading the model in the inference mode*
model = modellib.MaskRCNN(mode="inference", config=config, model_dir='./')
*# loading the trained weights o the custom dataset*
model.load_weights(model_path, by_name=**True**)input_path = "test_images/"
**for** i **in** os.listdir(input_path):
img = load_img(input_path + i)
img = img_to_array(img)
*# detecting objects in the image*
result= model.detect([img])
*# Run object detection*
results = model.detect([img], verbose=1)
*# Display results*
r = results[0]
visualize.display_instances(img, r['rois'], r['masks'], r['class_ids'],
test_set.class_names, r['scores'],
title="Predictions")
输出。(图片作者)
步骤 6:通过添加更多相关的掩模图像来微调模型,调整步骤 4 中的参数。
第七步:视频月亮追踪器
为了在视频中做同样的事情,在 Opencv 中使用视频的逐帧提取,并在每一帧中应用模型。
**import** **cv2**
**import** **numpy** **as** **np**
**def** random_colors(N):
np.random.seed(1)
colors = [tuple(255 * np.random.rand(3)) **for** _ **in** range(N)]
**return** colors
**def** apply_mask(image, mask, color, alpha=0.5):
*"""apply mask to image"""*
**for** n, c **in** enumerate(color):
image[:, :, n] = np.where(
mask == 1,
image[:, :, n] * (1 - alpha) + alpha * c,
image[:, :, n]
)
**return** image
**def** display_instances(image, boxes, masks, ids, names, scores):
*"""*
*take the image and results and apply the mask, box, and Label*
*"""*
n_instances = boxes.shape[0]
colors = random_colors(n_instances)
**if** **not** n_instances:
print('NO INSTANCES TO DISPLAY')
**else**:
**assert** boxes.shape[0] == masks.shape[-1] == ids.shape[0]
**for** i, color **in** enumerate(colors):
**if** **not** np.any(boxes[i]):
**continue**
y1, x1, y2, x2 = boxes[i]
label = names[ids[i]]
score = scores[i] **if** scores **is** **not** **None** **else** **None**
caption = '**{}** **{:.2f}**'.format(label, score) **if** score **else** label
mask = masks[:, :, i]
image = apply_mask(image, mask, color)
image = cv2.rectangle(image, (x1, y1), (x2, y2), color, 2)
image = cv2.putText(
image, caption, (x1, y1), cv2.FONT_HERSHEY_COMPLEX, 0.7, color, 2
)
**return** image
设置路径和文件夹名称。
**import** **os**
**import** **sys**
batch_size = 1
ROOT_DIR = os.getcwd()
MODEL_DIR = os.path.join(ROOT_DIR, "logs")
VIDEO_DIR = os.path.join(ROOT_DIR, "video_moon/")
VIDEO_SAVE_DIR = os.path.join(VIDEO_DIR, "frames_object_detection/")
MODEL_PATH = os.path.join(ROOT_DIR, "moon_model/moon_mask_rcnn_125.h5")
model.load_weights(MODEL_PATH, by_name=**True**)
class_names = 'moon'
获取视频并使用我们的模型逐帧分析。
capture = cv2.VideoCapture(os.path.join(VIDEO_DIR, 'moon_zoom.mp4'))
**try**:
**if** **not** os.path.exists(VIDEO_SAVE_DIR):
os.makedirs(VIDEO_SAVE_DIR)
**except** **OSError**:
print ('Error: Creating directory of data')
frames = []
frame_count = 0
*# these 2 lines can be removed if you dont have a 1080p camera.*
capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
**while** **True**:
ret, frame = capture.read()
*# Bail out when the video file ends*
**if** **not** ret:
**break**
*# Save each frame of the video to a list*
frame_count += 1
frames.append(frame)
print('frame_count :**{0}**'.format(frame_count))
**if** len(frames) == batch_size:
results = model.detect(frames, verbose=0)
print('Predicted')
**for** i, item **in** enumerate(zip(frames, results)):
frame = item[0]
r = item[1]
frame = display_instances(
frame, r['rois'], r['masks'], r['class_ids'], class_names, r['scores']
)
name = '**{0}**.jpg'.format(frame_count + i - batch_size)
name = os.path.join(VIDEO_SAVE_DIR, name)
cv2.imwrite(name, frame)
print('writing to file:**{0}**'.format(name))
*# Clear the frames array to start the next batch*
frames = []
capture.release()
这是我们首尾相连的月球追踪器整装待发。请试验代码并创建自己版本的 对象跟踪器 。
放大。(图片作者)
干杯!!!
在下面的链接中可以找到月球追踪器的整个进化过程。
但是这个小家伙帮助我塑造了我的职业生涯。带我探索图像处理领域,让我进入了一个顶级的…
medium.com](https://medium.com/@praveenkottayi/i-had-a-dream-not-as-big-as-martin-luther-king-jr-but-a-little-one-34dc2cdbb1d9)
参考:
这是 Mask R-CNN 在 Python 3、Keras 和 TensorFlow 上的实现。该模型生成边界框和…
github.com](https://github.com/matterport/Mask_RCNN) [## Tony607/colab-mask-rcnn
permalink dissolve GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码,管理…
github.com](https://github.com/Tony607/colab-mask-rcnn/blob/master/Colab_Mask_R_CNN_Demo.ipynb) [## 在定制数据集上使用掩模 R-CNN 的对象检测
在本文中,我们将实现 Mask R-CNN 来检测自定义数据集中的对象
towardsdatascience.com](/object-detection-using-mask-r-cnn-on-a-custom-dataset-4f79ab692f6d)
奥运数据的可视化分析
赢得奥运奖牌的不同因素是如何发挥作用的?
奥运会是全世界公认的著名体育平台,与 19 世纪后期有所区别。然而,它的起源可以追溯到大约 3000 年前的希腊帝国,当时只有短跑比赛,在希腊的奥林匹亚城举行,只有自由出生的希腊人才能参加(Young & Abraham,2020)。从那时起,它就一直在发展,现在已经成为全世界所有运动员在超过 28 个单项体育比赛中展示自己能力的中心。目前,它每两年在不同的国家举行,名称为夏季奥运会和冬季奥运会,都有自己的一套游戏(杨和亚伯拉罕,2020)。它已经成为一个反映个人选手力量的地方,并成为他们所代表的国家的骄傲。
动机和研究问题
奥运会有着丰富的历史,从 1896 年跨越到 2018 年,已经成为历史的一部分。因此,这是一个有趣的话题,看看历史事件是如何影响奥运会的细节,以及它是如何改变至今。因此,本报告试图围绕以下问题展开,并酌情与历史事件联系起来:
1.主办国对奥运会获得的奖牌有什么影响?
2.各国在奥运会上的表现受本国经济因素影响吗?
3.奥运夺冠的年龄在变吗?
文献评论
主办国在任何体育活动中的优势是众所周知的,因为参与者将熟悉该领域,并且也有来自主场观众的巨大支持。主办国预计将赢得 3 倍于他们在客场比赛时赢得的奖牌(Clarke,2000)。主办国和共产主义背景也会对奖牌数产生积极影响(卞,2005)。
研究发现,一个国家的社会经济变量,如 GDP,在很大程度上影响着该国在奥运会上的表现。一个国家的人口和国内生产总值与奥运会奖牌数有一定的相关性(卞,2005)。
年龄因素也是体育运动中的一个重要因素,即使在相同年龄的运动员中,相对年龄效应(RAE)也是决定谁获胜的因素(Fletcher & Sarkar,2012)。RAE 指出,在成熟度、经验和早期专业化方面,一名运动员比另一名年轻近一岁的运动员更有优势(Neill,Cotton,Cuadros & Connor,2016)。
奥林匹克已经成为历史的一部分,影响着历史,也受到历史的影响。奥林匹克运动会在历史上产生了重大的社会和政治影响,如让妇女参加体育运动,反对种族问题,促进民权,统一国家,甚至成为不同国家展示权力的工具(奥康奈尔)。同样,种族隔离、恐怖主义、世界大战和冷战等国家的政治也在历史的不同时期影响了奥林匹克运动(Dwyer & McMaster,2018)。
方法
为了回答这些问题,使用了三个数据集,即“120 年奥林匹克历史:运动员和成绩[1]”,“Gapminder 人均国内生产总值,不变购买力平价美元- v25[2]”和“Gapminder 总人口 v6[3]”。奥运会数据集包括参与者的姓名、人口统计数据、他们参加了哪项运动以及参加了哪届奥运会。Gapminder 的人均国内生产总值数据集包括从 1960 年到 2040 年预测的各国国内生产总值,其人口数据集包括从 1800 年到 2019 年以及从那时起到 2100 年预测的世界所有国家的人口。还创建了一个自定义数据集,将奥运会数据集中提到的城市映射到国家名称。
可视化是用 Tableau 和 Python 创建的。最初的数据清理是在 Excel 上完成的,可视化特定数据操作是根据需要在 Tableau 和 Python 上进行的。
调查结果和讨论
东道国效应
图 1 显示了一个国家举办奥运会的次数。美国是举办次数最多的国家,共举办了 8 次,其次是法国,共举办了 5 次。
*图 1-举办过奥运会的国家,*作者图片
图 2 显示了举办奥运会的国家赢得的奖牌总数,显示美国赢得了最多的奖牌,然后是德国,接下来是法国。这意味着举办奥运会次数越多的国家获得的奖牌越多。主办国赢得更多奖牌的原因是由于主场优势,群众支持和更容易的资格标准,因此更多的参与(Clarke,2000)。
图 2 显示了举办奥运会的国家赢得的奖牌总数,显示美国赢得了最多的奖牌,然后是德国,接下来是法国。这意味着举办奥运会次数越多的国家获得的奖牌越多。主办国赢得更多奖牌的原因是由于主场优势,群众支持和更容易的资格标准,因此更多的参与(Clarke,2000)。
*图 2-主办国获得的奖牌,*作者提供的图片
现在让我们来看看不同主办国获得的奖牌数是如何变化的。首先,看看美国获得的奖牌(图 3-4),我们可以看到它在举办奥运会时获得的奖牌数一直在增加。注意图表中从 1976 年到 1984 年的急剧增长。美国曾通过抵制 1980 年在俄罗斯举行的奥运会来抗议俄罗斯入侵阿富汗,因此那一年的数据无法获得。紧接着在 1984 年,俄罗斯抵制了 1984 年在美国举行的奥运会,因此美国赢得了更多的奖牌。
*图 3-美国夏季奥运会奖牌数,*作者图片
*图 4-美国冬奥会奖牌数,*作者图片
在某些情况下,主办国在主办后的历届奥运会中都占据优势,如西班牙(图 5),该国在 1992 年主办夏季奥运会时奖牌数大幅增加(从 5 枚增至 69 枚),并在随后几年赢得了更多奖牌。
*图 5-西班牙夏季奥运会奖牌数,*作者图片
日本(1964 年)、韩国(1998 年)、墨西哥(1968 年)和挪威(1994 年)等其他国家也表现出类似的趋势,它们在举办奥运会后平均奖牌数都有所增加。而芬兰(1952 年)、加拿大(1976 年)、俄罗斯(1980 年)等国,虽然在举办时获得了较多的奖牌,但却无法在连年增加奖牌(参见附录一)。
图 6-奥运会举办前、举办时和举办后的中奖百分比(举办时为 100%),作者提供的图片
澳大利亚(2000 年)、中国(2008 年)和希腊(2004 年)、英国(2012 年)和美国(1996 年)等国家在主办国时赢得的奖牌数比主办国多 10-20%(图 6)。只有巴西(2016 年)在举办奥运会时没有获得更多奖牌(比英国 2012 年奥运会时少了 20%),而希腊在 2008 年希腊奥运会后只获得了 20%的奖牌。
经济效益
最基本和最重要的经济预测指标,国内生产总值(GDP)可以用来评价一个国家在奥运会上的表现(Bernard & Busse,2000)。GDP 的一个衍生指标是人均 GDP,这个指标也可以用来衡量一个国家的个人收入。GDP 和人均 GDP 绘制在图 7-8 中,以查看它们与奖金的关系。观察到该图在人均国内生产总值图中更为分散(图 7),相关系数仅为 0.1,而总国内生产总值的相关系数为 0.17(图 8),这意味着对于 2004 年奥运会(和其他奥运会-附录二),获得的奖牌数是国内生产总值的一个因素。
*图 7-2004 年奥运会赢得的奖牌与人均 GDP 的对比,*作者提供的图片
*图 8-2004 年奥运会赢得的奖牌与国内生产总值的对比,*作者提供的图片
分析总人口、GDP 和总 GDP 的相关性,以了解它们与奖牌数的关系(图 9),GDP 总是与奖牌数有更好的相关性。这并不奇怪,因为仅仅拥有更好的经济并不能保证获得奥运奖牌。它还需要一个大的群体池,从中可以选择最佳的参与者,就像从一个大的样本空间中选择一样。
*图 9-国内生产总值、人均国内生产总值和人口与年份的关系,*图片由作者提供
图 9 还显示了人口和人均国内生产总值的相关值逐年上升和下降。从 1896 年到 1936 年的早期阶段表明,人均 GDP 最高的国家赢得奖牌的机会更大。这可能是因为富裕国家只参加奥运会。这种情况在第二次世界大战后一直到 1988 年都有所改变,相比之下,人口与奖牌数的相关性更强。这一时期,美苏冷战,共产主义崛起。在中国),以及运动员使用药物的普遍程度。奥运会是各国展示实力的好舞台。那些能够从更多的人口中选拔出优秀运动员、保持运动员工资和训练的国家赢得了更多的奖牌。给奥运选手发工资的概念也是那个时候开始的。1991 年苏联解体和德国统一后不久,展示实力的竞争就平息了。所以,在最近几年里,人口的作用与人均 GDP 的相关性已经非常小了(小于 0.1)。
图 10-11 显示了中国和图瓦卢获得的奖牌数量和 GDP 总量。
*图 10-中国获得的奖牌(GDP 最高),*作者图片
*图 11-图瓦卢获得奖牌(GDP 最低),*作者图片
如果我们看看 GDP 排名前几名和后几名的国家(附录二),我们会发现 GDP 最低的国家没有奖牌,而排名前几名的国家都获得了 50 多枚奖牌,最高的是美国,获得了 264 枚奖牌。所有这些都暗示了奖牌总数与一个国家在奥运会上的 GDP 总量有关。
奥运夺冠的年龄在变吗?
图 12 显示了奥运会开始以来奖牌获得者的平均年龄。平均年龄在 20 世纪初很高(大约 27-28 岁),直到 1948 年有一些波动。到 90 年代,这个数字下降到 24-25,到 2016 年奥运会,这个数字上升到 26-27。
*图 12-奥运会奖牌获得者的平均年龄,*作者图片
现在,让我们来看看自现代奥运会开始以来一直延续的运动的年龄是如何变化的。
*图 13-1896 年至 1948 年间获奖者的年龄,*作者图片
*图 14-1948 年至 1984 年获奖者年龄,*作者图片
*图 15-1988 年至 2016 年获奖者年龄,*作者图片
图 13 显示,获奖者的年龄在不稳定时期有很大的变化,在下降时期略有下降(图 14),最后在现代时期(图 15),它已经变得最少。赢得某项运动的最佳年龄似乎在变窄。附录三显示了从 1988 年到 2016 年所有运动项目的变化。
结论
很明显,主办国总是有更好的机会在奥运会上赢得奖牌;他们至少可以多赢得 10-20%的奖牌。从经济效应来看,尽管一个国家的人口和人均 GDP 影响了过去赢得的奖牌数,但该国的 GDP 总量对决定近年来的奖牌数更为重要。由于年龄因素,赢得奖牌的运动员的年龄范围逐年缩小,每项运动的最佳年龄可以在最近几年确定。因此,来自高 GDP 主办国的运动员很有可能在奥运会上赢得奖牌,因为他们的年龄范围处于这项运动的最佳年龄范围内。
推荐
这项研究是对在奥运会中发挥作用的因素的高层次分析。有许多领域可以对每个因素进行更深入的分析。可以考虑的一些问题如下:
1.东道国效应 -东道国的一名参赛选手能获得奖牌的概率有多大?有什么类型的运动是主办国更有机会获胜的?
2.经济效应 -有什么运动是 GDP 低的国家赢得最多的吗?经济的上升/下降会影响一个国家的奥运奖金吗?如果会,这种影响会在几年后显现?
3.年龄效应——相对年龄效应会影响奥运奖金吗?每项运动的最佳年龄是多少岁?随着时间的推移,每个运动员的表现如何提高/降低?
此外,查看奥运会官方网站[4]中的奖牌数,并与本报告中使用的奥运会历史数据集进行比较,存在差异,因此数据集需要修改。
参考
Mahtani,K.R .,Protheroe,j .,Slight,S.P .,Demarzo,M.M.P .,Blakeman,t .,Barton,C. A .,Brijnath,b .,Roberts,N. (2012)。2012 年伦敦奥运会能“激励一代人”去做更多的体育运动吗?系统综述概述。检索自https://bmjopen.bmj.com/content/3/1/e002058.full
克拉克(2000 年 6 月)。奥运会主场优势*。第五届澳大利亚体育数学和计算机会议论文集。澳大利亚悉尼科技大学*(第 76–85 页)。检索自 https://research bank . swinburne . edu . au/file/3 bbcf 005-ec1e-4d ef-9602-f 7 DD 18 d0a 711/1/PDF % 20% 28 published % 20 version % 29 . PDF
弗莱彻博士和萨卡尔博士(2012 年)。奥运冠军心理弹性的基础理论。运动与锻炼心理学, 13(5),669–678 页。检索自
https://www . science direct . com/science/article/ABS/pii/s 1469029212000544
卞,x(2005)。预测奥运奖牌数:经济发展对奥运表现的影响。 The park place economist, 13(1),37–44*。*检索自https://www . research gate . net/profile/Xun _ Bian/publication/28328103 _ Predicting _ Olympic _ Medal _ Counts _ the _ Effects _ of _ Economic _ Development _ on _ Olympic _ Performance/links/5525 b 9850 cf 24 b 822 b 4058 f 9/Predicting-Olympic-Medal-Counts-the-the-Effects-of-of-Economic-Development-on-Olympic-Performance . pdf
改变历史的 13 个奥运时刻。检索自https://www . rd . com/culture/13-Olympic-moments-that-changed-history/
Dwyer,B. B .,& McMaster,A. (2018)。奥运史上有 18 次政治压倒了体育。检索自https://www . global citizen . org/en/content/history-political-activism-Olympics-Rio/
伯纳德和布塞(2000 年)。谁赢得了奥运会:经济发展和奖牌总数(编号 w7998)。美国国家经济研究局。从 https://www.nber.org/papers/w7998.pdf取回
K. S .奥尼尔,Cotton,W. G .,Cuadros,J. P .,& O’Connor,D. (2016)。奥林匹克运动员相对年龄效应的调查。人才发展&卓越,8(1),27–39。检索自https://www . research gate . net/profile/Juan _ cuadros 2/publication/317582562 _ An _ Investigation _ of _ the _ Relative _ Age _ Effect _ inter _ Olympic _ Athletes/links/5cb4a 254299 BF 12097682856/An-Investigation-of-the-Relative-Age-Effect-inter-Olympic-Athletes . pdf
杨,哥伦比亚特区,亚伯拉罕,H. M. (2020)。奥运会。从 https://www.britannica.com/sports/Olympic-Games取回
奥林匹克运动——高峰年龄如何变化?。检索自https://www . the stats zone . com/archive/Olympic-sports-how-peak-age-vary-13812
金钱能买到奖牌吗?GDP 对奥运成功的影响分析。检索自 https://www . yellow finbi . com/blog/2012/08/YF community news-does-money-buy-metals-analyzing-the-affect-of-GDP-on-Olympic-success-117473
d .托什科夫(2016)。奥运奖牌,经济实力,人口规模。从 http://re-design.dimiter.eu/?p=868取回
使用的数据集:
[1]https://www . ka ggle . com/hee soo 37/120 年奥运历史-运动员-成绩
https://www.gapminder.org/data/documentation/gd001/
Github 回购:
这份报告包括我最近做的奥运数据可视化项目的项目文件和报告…
github.com](https://github.com/abhi1gautam/Olympics-Data-Visualization)
印度创业融资数据集的可视化探索
对印度启动资金数据集进行可视化探索性数据分析,以发现令人兴奋的趋势并回答预期的问题
印度拥有世界上最大的创业生态系统之一,预计年增长率为 10-12%。印度有大约 20,000 家初创公司,其中大约 4,750 家是技术领先的初创公司。仅在 2016 年就有 1,400 家新的科技初创公司诞生,这意味着每天都有 3-4 家科技初创公司诞生(根据 given 来源)。考虑到所有这些因素,分析启动资金变得很有趣。
数据取自 Kaggle ,拥有 2015 年至 2019 年印度创业公司的融资信息。它包括投资日期、创业所在城市、投资者姓名和投资额(美元)等栏目。
- 年度明智分析
图一
一项精确的观察表明,这些年来投资数量急剧下降。
图 2
与之前的图表(图 1)相比,投资总额反而以更随机的方式变化
现在,通过比较两个图(图 1 和图 2)进一步深入投资,我们可以观察到每笔投资的金额有所增加。
图 3
这可能表明,投资者在过去几年里变得更加专一,并试图更多地投资于表现出更强竞争力的公司
2.城市
图 4
初创公司和投资者最青睐的只是少数几个城市
班加罗尔、孟买、新德里、古尔冈、诺伊达、浦那和钦奈是最受青睐的城市。该名单包括印度的主要大都市,这可能是一个迹象,表明重要的城市为创业公司提供了更好的生态系统和设施。此外,这个数字也证实了班加罗尔是印度主要创业中心的事实。
3。行业垂直
图 5
图表显示了根据投资总额排名的前 5 个行业
就投资而言,消费互联网、电子商务、交通、技术和金融是五个最受青睐的行业。
4。投资类型
所做的投资可以分为不同的类别,如 A 轮、B 轮、C 轮、种子基金、股权等。
图 6
作为私募股权的投资远远高于所有其他形式的投资
5。投资额最高的创业公司
图 7
获得最高资助的创业公司
Flipkart、Rapido 和 Paytm 是特定时期内获得资金最多的初创公司。
现在,我们已经对数据做了一些分析,是时候回答一些可能的问题了。
资金生态系统如何随时间变化?
每笔投资的金额逐年递增,这表明投资者有兴趣为有望表现更好或过去有良好记录的初创企业提供更多支持(图 1、2 和 3)。
城市在资助中扮演重要角色吗?
是的。毫无疑问,它扮演着重要的角色(图 4)。由于设施和更好的创业生态系统,大都市最受青睐。班加罗尔似乎拥有印度最好的创业生态系统。
哪些行业最受投资人资金青睐?
就投资而言,消费互联网、电子商务、交通、技术和金融是五个最受青睐的行业(图 5)。
结论
至此,我们已经做了一些基本分析,并试图回答几个问题。我们还发现了印度创业行业在城市、行业垂直等方面的一些有趣的模式和趋势。通过将这些数据与关于印度创业生态系统的外部知识相结合,可以进行进一步的分析,从而获得更好的见解和趋势。
注 :所有的视觉效果都是用 tableau 制作的。文档的链接
新冠肺炎:新加坡首批 100 名完全康复患者的视觉笔记
确定你感染了新冠肺炎病毒需要多长时间?如果真的感染了,你需要多长时间才能摆脱这种新型冠状病毒?这些都是很难回答的问题,但下面是新加坡首批 100 例完全康复的病例可以告诉我们的。
已经创建了几个优秀的仪表板来跟踪新加坡新冠肺炎疫情的进展(点击此处、此处、此处和此处),试图复制这些资源更好的团队所做的事情是没有意义的。
在这篇文章中,我将着重探讨每个人心中的两个问题:
- Q1:如果我的新冠肺炎病毒检测呈阳性,完全康复需要多长时间?
在这一点上没有全球标准,受影响的国家对新冠肺炎患者何时获准出院采取了不同的指导方针。
在新加坡,新冠肺炎患者只有在至少相隔 24 小时的两次拭子检测 结果均为阴性 后,才被视为完全康复。只有到那时,他们才能出院。这样做是为了确保病人回到社区后不会传染给其他人。
换句话说,仅从新冠肺炎症状中康复并不能被视为完全康复,也不能证明你有资格从新加坡医院出院。
到目前为止,这个城市国家的第一批 100 名完全康复的新冠肺炎病例中的患者需要 1 到 31 天才能出院,如果我们从他们被正式确认感染的那一天开始计算的话。该确认出院窗口的中位天数为 11 天。
- Q2:如果我有症状,我要等多久才能确定是新冠肺炎病毒?
这是两个问题中较难回答的一个,因为我们对新冠肺炎的知识存在空白,而且病例复杂,要么没有症状,要么与 14 天潜伏期的标准不符。在新加坡,首批 100 例完全康复病例中的绝大多数患者在报告出现发烧、喉咙痛和呼吸困难等症状的 14 天内得到确诊。
但是 8 名患者没有症状,8 例患者在确诊前花了 15 天或更长时间。对于这些不寻常的病例,以及世界各地报道的类似病例,目前还没有结论性的解释。
显然,这不是医学研究,我也不是流行病学家。但是我特别注意使用清晰、明确、非危言耸听的标签/定义。
我在这里的目标是试图以一种清晰易懂的方式呈现公共数据中的潜在趋势,同时坦率地承认数据集的局限性和我缺乏该领域的专业知识。
新加坡因其对新冠肺炎疫情的早期处理而赢得赞誉,但有迹象表明,这种早期的成功无意中在一些居民中滋生了自满情绪。在疫情已经全球化的时候,考虑到新加坡的高人口密度,这种自满情绪将被证明是代价高昂的。
从我过去做记者的经验来看,当你试图让他们参与到“大局”的解释中时,大多数人都不理会。但如果对他们个人福祉的影响说得更清楚,他们可能会更关注一点。
这就是我希望通过这篇文章达到的目的。
1.数据、定义和说明
在我们进入图表之前,重要的是首先要了解公共数据集的局限性,避免匆忙得出结论。新加坡当局发布的信息虽然详细,但主要是为了让公众每天了解情况。该数据集不包含关于患者的详细医疗信息,这些信息将为全面的研究提供信息。
因此,我避开了像“潜伏期”和“恢复期”这样的标签,它们在医学研究中有特定的含义,最好留给专家来处理。
1.1 数据来源
我从新加坡卫生部发布的每日新闻稿中手动收集了第一批 100 例完全康复病例的数据集。你可以在这里下载数据集的副本,或者通过 Github repo 下载这篇文章。
根据记录,新加坡前 100 名完全康复的患者是:病例 01–34、36–40、43–81、83–89、91–93、95–96、98、102、106–107、110–112、138、148 和 151。
新加坡第一个完全康复的患者是病例 07,一名 35 岁的中国大陆公民,于 2 月 04 日出院,他于 2020 年 1 月 27 日被确认为新冠肺炎阳性。
加入样本的第 100 例出院患者是病例 102,一名 41 岁的菲律宾妇女,于 2020 年 3 月 14 日出院。据新加坡卫生部称,包括 102 号病例在内的八名无关患者于 3 月 14 日出院。恢复的患者 103、135、146、150 和 160 未被添加到该数据集。
出于实际原因,我选择了前 100 个恢复的案例。显然,新加坡的新冠肺炎病例总数仍在增长,而且趋势会随着数字的变化而变化。所以请记住,这只是初步的探索。我会在适当的时候更新或写一篇新帖。
非新加坡读者注意:CSV 文件中的日期是按照新加坡的标准以日/月/年格式记录的。
1.2 定义
不幸的是,这篇文章中使用的两个定义都很笨拙,但我选择尽可能明确,以便我们专注于有限的公开数据实际上说了什么,而不是走上过度解释我们认为数据在说什么的道路。
例证:公开数据不包含患者首次接触病毒的时间,也不包含他们在医院期间的日常状况。新加坡当局也没有透露患者在医院从症状中恢复需要多长时间,以及他或她等待拭子检测结果的时间。
因此,在这篇文章中采用“潜伏期”和“恢复期”这样的短语是很有问题的,因为它们有特定的医学定义,而新加坡的公共数据不一定涉及这些定义。
定义#1:确认-卸货窗口
在本帖中,我将使用“确认-出院窗口”一词来简写新加坡卫生部宣布的患者新冠肺炎感染确认日期和他/她的正式出院日期之间的天数。这些日期是公开记录的,没有争议。
从确认日期开始计时为我们在快速变化的环境中进行比较提供了一致的基线。在疫情爆发的早期,你会预计到患者入院和新冠肺炎检测结果之间会有明显的差距。但是随着更新的检测试剂盒的出现,这个等待时间将会大大缩短。
定义#2:症状-确认窗口
鉴于全球在获得医疗设施和新冠肺炎检测试剂盒方面的差异,预确认阶段是一个棘手的领域。在新加坡,卫生部还发布了每个新冠肺炎病例的一些关键日期,包括抵达新加坡的日期(对于输入病例),以及自行前往诊所或医院的日期(如果适用)。
因此,从接触新冠肺炎病毒到官方确认感染之间的不确定期可以用多种方式来定义,这取决于如何组合可用的日期。
为了避免问题过于复杂,我将使用一个简单的预确认阶段定义为“症状-确认窗口”,即从报告症状开始到正式确认新冠肺炎感染之间的天数。
可以肯定的是,人们对患者报告的症状发作日期的真实性存在一些怀疑,尤其是在压力和社会耻辱的时期。但这是新加坡数据中最可靠的“开始日期”。我选择不使用住院和自行就诊的日期,因为这些情况下的诊断尚未披露。
2.新加坡首批 100 名完全康复患者的人口统计分析
我不打算复制已经存在的优秀的新冠肺炎仪表板。但是一些按人口统计分类的图表对本文的分析仍然有用。为此,我在 fluore 上创建了一个交互式图表,可以快速完成工作。你可以在这里访问它。
在这 100 个样本中,我们有 23 个输入病例和 77 个本地传播病例。康复的病人中有 40 名是女性,其余的是男性。
就国籍而言,如果我们单独考虑新加坡永久居民,我们有八个群体。有:
- 67 名新加坡人
- 19 名中国大陆公民
- 6 新加坡减贫战略
- 4 名孟加拉人
- 印度尼西亚、日本、马来西亚和菲律宾国民各 1 名
就年龄而言,首批 100 名完全康复的患者(75 名)年龄在 30 至 59 岁之间。拥有最多新冠肺炎患者的单一年龄范围是 30-39 岁,有 28 人(18 名男性和 10 名女性)。
3。如果你的新冠肺炎病毒检测呈阳性,完全康复需要多长时间?
3 月 12 日,在 T2 一次罕见的电视讲话中,新加坡总理李显龙表示,新加坡 80%的新冠肺炎患者“只有轻微症状”。他没有解释他所说的“温和”具体指的是什么。
但是如果你已经感染了新冠肺炎病毒,从症状中恢复只是痛苦的一部分。
在新加坡首批 100 例完全康复的病例中,大多数患者,无论老少,都需要长期住院,因为需要额外的时间来确保他们停止传播高传染性的新冠肺炎病毒。
Average number of days between hospital discharge and Covid-19 confirmation: 12.29
Median number of days between hospital discharge and Covid-19 confirmation: 11.0
Minimum number of days between hospital discharge and Covid-19 confirmation: 1
Maximum number of days between hospital discharge and Covid-19 confirmation: 31
这是一个很重要的区别,因为错误地认为新冠肺炎“只是一场重感冒”(i t 不是)可以很快康复,是新加坡和其他地方许多人自满的核心。
新加坡前 100 例恢复病例的数据显示**确认出院窗口的中位天数为 11 天。**三分之一(33)的患者从确诊感染时起需要 15 天或更长时间才能出院。只有 8 名患者在确诊感染后 3 天或更短时间内出院。
上图还显示了卫生当局为何对新冠肺炎新增病例数量的大幅上升感到担忧。如果新感染病例激增,确保大量患者安全返回社区所需的大量时间和资源可能会让一个国家的医疗系统不堪重负。
**简而言之,这不仅仅关乎你个人从新冠肺炎感染中康复的能力。**这种担忧本质上是更广泛和系统性的,也就是说,是对医疗系统处理可能持续数周具有传染性的患者突然激增的能力的担忧。
3.1 确认-卸货窗口:甘特图可视化
甘特图通常用于说明项目进度。但在这种情况下,它在显示每个病人的确认出院窗口方面工作得很好。你可以在这里下载一份互动图(是 html 文件;中不允许交互式图表的直接嵌入)。只需将鼠标悬停在每个条形上,即可查看特定案例的元数据,以及他/她从确认到完全恢复所用的天数。
这里下载互动版
甘特图有助于概览,并允许您快速挑选出不寻常的情况:
3.1.1 哪些案例完全恢复所需的时间最少?
第 151 号案件,在官方确认和释放之间只有一天的时间,这可能是最不寻常的。
新加坡卫生部的官方新闻稿似乎暗示,这名 51 岁的新加坡男子在 2 月 4 日首次报告出现症状后,已自行从新冠肺炎康复。3 月 8 日,一项血清测试的结果证实他有“早期新冠肺炎感染”。一天后,他于 3 月 9 日出院。
病例 76、83 和 84 在被正式确认感染后仅用了两天就出院了。案例 83 和 84 是美奂大道群的一部分,而美奂大道群又与另外两个教堂群相关联。
患者 76 是 2 月 9 日从疫情中心武汉撤离的新加坡人之一。他在登机前没有表现出任何症状,并在抵达新加坡时被隔离,作为这个城市国家遏制措施的一部分。他仅在 2 月 16 日的新冠肺炎病毒检测中呈阳性。
尚不清楚为什么这些病例在如此短的时间内就完全康复了。
3.1.2 哪种情况需要最长时间才能完全恢复?
病例 53 保持着迄今为止的记录,从确认感染到最终出院用了 31 天。这名 54 岁的新加坡男子是新冠肺炎一个教会的成员,该教会与当地的一个教会“上帝恩典会”有联系。他于 2 月 10 日首次报告出现症状,两天后被检测出新冠肺炎病毒阳性。
然而,尚不清楚他从新冠肺炎症状中恢复的天数与他完成拭子检测所需的时间之间的差距。新加坡的公开数据不包含新冠肺炎治疗期间患者状况的详细信息。
4。不同性别和年龄的患者恢复速度不同吗?
一项针对中国 1000 名新冠肺炎患者的 T4 研究发现,女性更有可能存活。谢天谢地,新加坡还没有出现与新冠肺炎相关的死亡病例。但在新加坡首批 100 名完全康复的患者中,男性和女性完全康复的速度是否不同?
4.1 男性和女性的确认-恢复窗口有何不同
在新加坡首批 100 名完全康复的新冠肺炎患者中,有 60 名男性和 40 名女性。但是下面的箱线图显示,两种性别完全康复的平均天数相同——11 天。
样本量小可能是一个因素,当我们有大量完全康复的患者时,观察事情如何变化将是有趣的。如果你对箱线图不熟悉,看看这个解释者这里。
4.2 不同年龄组的确认-恢复窗口有何不同
我们大多数人可能会认为年龄会影响完全康复所需的时间,但来自新加坡前 100 例新冠肺炎病例的数据带来了一些惊喜:
除了年龄最小的 9 岁以下的患者,他们的确认出院窗口中位数为 4 天,我们没有看到年轻患者完全康复的速度明显快于年长患者。
事实上,10-19 岁、20-29 岁和 40-49 岁年龄组完全康复所需的中位天数比所有 100 名康复患者 11 天的总中位天数要长。
乍一看这很令人惊讶,但当你回到完全康复的定义时就不那么令人惊讶了——这是指患者必须证明他们已经停止传播病毒,而不仅仅是从症状中恢复过来。换句话说,即使年轻患者从症状中恢复得更快,不同年龄组之间脱离新冠肺炎所需的中位时间可能不会有太大差异。当然,这需要专家在一项更大的研究中进行验证。
60-69 岁年龄组的数据极不寻常。该年龄段的中位确诊-出院窗口为 5 天,有一个异常值,即病例 01,在确诊感染和出院之间用了 27 天(总中位值的 2.5 倍)。考虑到这次初步探索的样本量很小,我将暂时避免对此进行过度解读。
盒子情节的互动版本可以在这里获得。将鼠标悬停在数据点上可查看每个病例的详细元数据,或将鼠标悬停在方框上可查看特定年龄范围内患者恢复期的四分位数分布。
此图表的互动版本可在此处获得
5.确定我是否感染了新冠肺炎病毒需要多长时间?
鉴于全球在获得医疗设施和新冠肺炎检测试剂盒方面的差异,这是一个棘手的领域。新加坡卫生部网站上的官方常见问题称“潜伏期长达 14 天”,引用了中国新冠肺炎病例的数据。
这与新加坡前 100 例完全康复病例的数据分析相吻合,在新加坡,只有 8 名患者从出现症状起超过 14 天才检测出新冠肺炎阳性:
8 名患者没有症状,92 名有症状的患者中有一半以上在 7 天或更短时间内被确认为新冠肺炎阳性。总体而言,从出现症状到确认感染的中间天数为 6 天。
Average number of days between symptoms and confirmation: 7.434782608695652
Median number of days between symptoms and confirmation: 6.0
Minimum number of between symptoms and confirmation: 1.0
Maximum number of days between symptoms and confirmation: 33.0
5.1 症状的甘特图可视化-确认窗口
重复使用甘特图,我们可以再次判断出哪些病例花费了异常长的时间来确认感染。案例 151、91 和 83 立即成为非常复杂的案例。你可以在这里下载一份互动图表。
点击下载互动图表
我们之前简要讨论过的病例 151,从出现症状到确认感染之间名义上有 33 天的间隔。但是现实要复杂得多,正如我们在 3 月 9 日卫生部的新闻发布会上看到的。
他于 2 月 4 日开始出现症状,但在 3 月 8 日进行了血清学测试,以确认他患有早期的新冠肺炎感染。当局没有说明他被感染的确切时间,也没有说明血清学检测是否能辨别出之前感染的日期。151 号病例一天后于 3 月 9 日出院。
病例 151 不是报告症状的患者中唯一的异常值。在我们的 100 例康复病例样本中,其他 7 例患者——病例 30、66、68、83、84、89 和 91——从出现症状到确诊新冠肺炎病毒超过 14 天。它们都是本地传播的病例:
根据2 月 25 日卫生部发布的日期为【2 月 1 日、6 日和 10 日】的新闻稿,91 号病例在报告症状出现和确诊之间间隔了 30 天,于 1 月 23 日首次报告身体不适,并在三个不同的时间到诊所寻求治疗。
卫生部当时没有说这位 58 岁妇女的诊断是什么。她于 2 月 18 日被转介到国家传染病中心(NCID ),此前她被确定为病例 66 的接触者,该病例是上帝教会恩典大会群集的主要病例。2 月 22 日下午,91 号病例的新冠肺炎病毒检测结果呈阳性。
圣保罗卫生官员解释说,91 号病例之所以被遗漏,是因为她的病情和旅行史当时不符合他们对疑似病例的定义,并补充说,他们此后收紧了对没有去过新冠肺炎热带地区旅行史的疑似病例的标准。
这些异常病例出现在数据集中反映了新加坡积极的接触者追踪制度。在其他资源更紧张的国家,或者政府采取更宽松措施的国家,他们可能没有被发现。
尚不清楚这些不寻常病例在未被发现时的传染性有多大。在遏制疫情的努力中,它们无疑是最复杂的挑战之一。
5.2 无症状的新冠肺炎患者人数
另一方面,在首批 100 名康复患者中,有 8 名患者(6 名男性,2 名女性)在新冠肺炎病毒检测呈阳性之前没有任何症状。它们是:第 22、23、28、65、75、76、87 和 138 号案件。
其中四名患者——病例 22、23、76 和 87——是新加坡人,分别于 1 月 30 日和 2 月 9 日乘坐两个航班从武汉撤离。他们登机时没有报告任何症状,但在抵达时被隔离,然后作为额外的预防措施进行了新冠肺炎测试。他们随后的冠状病毒检测呈阳性。
这四例本地传播病例没有症状出现的详细信息,是新加坡已知新冠肺炎聚集性病例的一部分。但卫生部的新闻稿没有解释为什么这些患者在确认感染前没有任何症状。
第 138 号患者是另一个高度复杂的病例——他于3 月 6 日检测呈阳性,此前他已经接受了为期三周的隔离,并被允许离开家。这名 26 岁的男子与新加坡当地教会的两个群体有关联,在阳性检测后,他不得不被召回接受进一步调查。他于 3 月 9 日被解除警报并出院。关于这个案子的更多信息可以在媒体报道中找到这里和这里。
我不会进一步细分症状确认期的数据,因为我不清楚在这种情况下性别和年龄会比一个人最近的社会活动更重要。可能有更科学的方法来研究这个棘手的感染前确认阶段,这最好留给专家来做。
本帖中图表的笔记本和数据在我的 Github repo 中。如果你发现了错误或者对这个来自新加坡的小数据集做了一些有趣的事情,请告诉我。在以下时间 Ping 我:
推特:蔡展鸿
领英:www.linkedin.com/in/chuachinhon
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
视知觉
数据可视化基础
我们为什么要可视化数据?
它帮助我们理解巨大的数据量,把它压缩成一个简单的,容易理解的可视化。它帮助我们找到隐藏的模式或看到数据本身的潜在问题,如果没有好的图表,这些问题可能不会很明显。
我们的大脑专门尽可能高效地感知我们周围的物质世界。证据还表明,不管我们的环境或文化如何,我们都发展了相同的视觉系统。这表明视觉系统的发展不仅仅基于我们的环境,而是数百万年进化的结果。这与白板理论(Ware 2021)相矛盾。抱歉,约翰·洛克。我们的视觉系统分割任务,因此有专门的区域负责分割(早期快速处理)、边缘方向检测或颜色和光感知。我们能够轻松地提取特征并找到模式。
有趣的是,在更高层次的视觉感知(视觉认知)上,我们的大脑能够突出颜色和形状,以专注于某些方面。如果我们在一张公路地图上搜索红色的公路,我们可以利用我们的视觉认知来突出红色的公路,并将其他颜色放在背景中。(Ware 2021)
我们可以说两种类型的视觉化。感官或任意。感官表征无需训练就能理解,而且通常理解得很快,跨文化。任意可视化不是那么容易理解的,需要学习。例如,一个任意的可视化系统是一个电路图、一张地图或一个建筑的蓝图。为了理解这些可视化的信息,你需要接受某种形式的培训。尽可能集中在一个感觉系统上是有意义的,只有在必要的时候才使用任意的系统。这样你就有最好的机会让你的听众理解你。只要确保你所使用的系统在目标受众中已经建立。(Ware 2021)
Colin Ware 在他的书《信息可视化,设计感知》中写下了很多指导方针。以下是我认为重要的几个:
- 考虑人类的感官能力,以帮助重要的数据元素
- 重要的数据应该用视觉上更加清晰的图形元素来表示
- 更大的数字量应该用更明显的图形元素来表示。
- 图形符号系统应该标准化
视觉变量
法国制图师 Jacques Bertin(1918–2010)是第一个在他的书“ Sémiologie graphique ”中描述视觉变量的人。他认为视觉变量有七个主要类别:位置、大小、形状、价值、颜色、方向和纹理。(罗斯 2017)
一个物体的大小可以用来传达一个特征的重要性。描述某物有多大或多小。在 3D 中,它表达了亲密感。请记住,较大的物体会吸引更多的注意力。
大小,作者图片
一个对象的形状可用于将其与其他对象分开,或者将多个具有相同分类属性的对象组合在一起。
形状,作者的图像
颜色值,分别表示颜色的深浅程度,反映了特征的重要性。它可以用来可视化连续变量。请注意,较深的颜色被理解为“更多的…”。
颜色值,按作者分类的图像
符号的方向可用于显示方向或对对象进行分组。
方向,作者的图像
纹理可用于区分类别或替代颜色。在地图中,纹理用于分隔不同的区域。例如森林和田野。
纹理,作者提供的图像
色调用于分类数据或突出重要的东西。某些颜色更占主导地位,会吸引人们的注意力。此外,确保在可视化中使用色盲友好的颜色。(蓝黄色是好的)
颜色色调,作者提供的图像
物体的位置也很重要。更高或更靠近观察者可以传达这个物体更重要,更值得你注意。
颜色
对我来说,在我的图形中摆弄颜色是最有趣的。它们只是用一些漂亮的颜色看起来更令人愉快。有几件事要记住:
- 颜色传达一种感觉(情绪)
- 色盲:考虑一组黄蓝方向的颜色
- 连续变量的颜色值(颜色的明度或暗度)和离散变量的单独颜色(分类数据)。
连续变量(上图)和离散变量(下图)的颜色,按作者分类
格式塔理论原则
整体不同于部分之和~库尔特·科夫卡
格式塔原理描述了人类对相似物体进行分组、寻找模式以及从缺失部分进行简化或推断的能力。访问这里了解更多格式塔心理学。该理论由五个定律组成,下面简要介绍:
相似度
彼此相似的项目往往被视为一组或单个对象。下图中的正方形和圆形不被视为单一对象,而是被视为行。
相似性,作者图片
prgnanz
…论点是 Wertheimer 对组织中的普拉南斯(“精确”)的概念;当事物被整体把握时,最少的能量被用于思考。对韦特海默来说,真理是由经验的整体结构决定的,而不是由个人的感觉或知觉决定的。(心理学杂志)
视觉效果越简洁,观察者就能越快、越少地捕捉到其中显示的信息。
接近度
距离较近的物体被视为一个整体,而不是单个的。下面的方块被认为是 4 个垂直的行。
邻近定律,作者图像
连续性
眼睛沿着它能找到的最平滑的路径前进。你注意到眼睛是如何更好地跟随亮点的吗?
连续性,作者的图像
关闭
组合在一起的物体被视为一个整体。我们忽略线条,填充缺失的部分。你看到白色三角形了吗?
闭合定律,作者的图像
应用
我应用了一些讨论过的理论来可视化来自 tidytuesday 的化身数据集的信息。这些图形是用 r 中的 ggplot2 制作的,你可以在我的 GitHub 上找到代码。
这种堆积百分比条形图和散点图使用可视变量“色调”,以便可以清楚地识别字符。“色值”是用来强调主角的。通过对行进行排序,也可以使用“位置”。
堆积百分比条形图
在这个散点图中,垂直网格被移除。这些点现在清楚地分配给一集,并显示为行。这里使用了格式塔理论的邻近定律。
散点图
大小可以用来引起对某个数据点的注意。这有助于更快地检测出具有最高值(深蓝色)的行。如果不突出显示该值,将很难找到最高值。
棒棒糖图表
来源
“格式塔心理学|定义、创始人、原则和例子”。大英百科全书。https://www.britannica.com/science/Gestalt-psychology(7。2020 年啤酒节)。
“心理学”。大英百科全书。【https://www.britannica.com/science/Pragnanz】T2(7。2020 年啤酒节)。
罗思罗伯特。2017.“视觉变量”。在,1–11。
罗纳德·萨尤尼。“格式塔原则(视频)”。可汗学院。https://www . khanacademy . org/test-prep/mcat/processing-the-environment/sensory-perception/v/gestalt-principles(6 .2020 年啤酒节)。
威尔科林。2021.“信息可视化”。在信息可视化中,Elsevier,I .https://linking hub . Elsevier . com/retrieve/pii/b 978012812875601001 x(7。2020 年啤酒节)。
Wilke,Claus O. 数据可视化基础。https://clauswilke.com/dataviz/color-basics.html(6。2020 年啤酒节)。
具有深度学习的视觉问答
本博客包含在 Keras/Tensorflow 中实现“面向视觉问答的分层问题-图像共同关注”论文。
查尔斯·德鲁维奥在 Unsplash 上拍摄的照片
目录:
1.简介:
视觉问答是一个关于建立一个人工智能系统来回答用自然语言提出的关于图像的问题的研究领域。
解决这一任务的系统展示了对图像的更一般的理解:它必须能够回答关于图像的完全不同的问题,有时甚至可以处理图像的不同部分。
让我们看几个例子:
来源:原文 VQA 论文
对于所有的图像,我们的人工智能系统应该能够定位问题中提到的主题并检测到它,并且应该有一些常识来回答它。
例如,在第一张图片中,对于问题“胡子是由什么组成的?“我们的人工智能系统应该能够判断出所指的对象是女性的脸,更具体地说是她嘴唇周围的区域,并且应该能够检测到香蕉。
2.业务问题:
作为人类,我们很容易看到一幅图像,并利用我们的常识回答关于它的任何问题。然而,也有这样的情况,例如,视力受损的用户或智力分析师,他们想要主动地引出给定图像的视觉信息。
因此,我们建立了一个人工智能系统,它将图像和关于图像的自由形式、开放式或自然语言问题作为输入,并产生自然语言答案作为输出。
系统会在以下几个方面回答类似人类的问题:
- 它将从输入(分别是图像和问题)中学习视觉和文本知识
- 合并两个数据流
- 使用这些高级知识来得出答案
3.理解数据:
VQA 是一个包含关于图像的开放式问题的数据集。这些问题需要了解视觉、语言和常识知识才能回答。
- 82,783 张图像(可可列车图像)
- 每张图片至少 3 个问题(平均 5.4 个问题)(443,757 个问题)
- 每个问题 10 个真实答案(443,7570 个答案)来自不同的员工
4.将现实世界的问题映射到 ML/DL 问题:
- **机器学习问题的类型:**我们将手头的问题提出为 K 类分类问题;其中 K 是数据集中一组固定答案类型的数量。
- **性能指标:**我们通过正确回答问题的数量来评估我们的人工智能系统。使用以下精度指标:
- **约束:**没有严格的延迟要求。
5.了解模型:
让我们试着去理解《视觉问答的分层问题-图像共同关注》一文中提出的方法。
论文概述:
来源:https://arxiv.org/pdf/1606.00061
在此之前,所有关于 VQA 的论文主要集中在视觉注意力上。本文建议也关注问题注意。具体而言,本文提出了一种新颖的 VQA 多模态注意力模型,该模型具有以下两个独特的特征:
- 共同注意:本文提出了一种新的机制,它联合推理视觉注意和问题注意,称为共同注意。更具体地,图像表示用于引导问题注意力,问题表示用于引导图像注意力。
- **问题层次:**构建一个层次结构,在三个层次上共同关注图像和问题:(a)单词层,(b)短语层,和©问题层。
a) 在单词级,通过嵌入矩阵将单词嵌入到向量空间中。
b) 在短语级,一维卷积神经网络被用于具有不同支持的时间过滤器的单词表示,以捕获包含在单个词、双词和三词中的信息,然后通过将它们汇集成单个短语级表示来组合各种 n 元词响应。
c) 在问题级,使用递归神经网络对整个问题进行编码。
对于这个层次结构中问题表示的每个级别,构建联合问题和图像共同关注图,然后递归地组合这些图以最终预测答案的分布。
方法:
该论文提出了两种共同注意机制,这两种机制在图像和问题注意图的生成顺序上有所不同。第一种机制称为并行共同注意,它同时产生图像和问题注意。第二种机制叫做交替共同注意,它依次在生成图像和问题注意之间交替。这些共同关注机制在问题层级的所有三个级别上执行。
在这篇博客中,我们将讨论并行共同注意模型的实现。
平行共同关注:
来源:https://arxiv.org/pdf/1606.00061
平行共同注意同时注意图像和问题。通过计算所有图像位置和问题位置对处的图像和问题特征之间的相似性来连接图像和问题。具体来说,给定一个图像特征图 V∈ R ^(d×N)和问题表示 Q∈ R^( d×T),我们计算一个叫做亲和矩阵 C∈ R^( T×N)的东西如下:
考虑到这个相似性矩阵 C 作为一个特征,图像和问题注意力图以下面的方式被预测:
基于上述关注权重,图像和问题关注向量被计算为图像特征和问题特征的加权和,即,
并行的共同关注在层次结构的每一层完成,导致 vʳ 和 qʳ 其中 r ∈ {w,p,s} 。
然后,来自所有三个级别的共同参与的图像和问题特征被递归地组合,以最终预测答案。
来源:https://arxiv.org/pdf/1606.00061
6.实施细节:
- 我们不直接使用图像作为模型的输入。将图像缩放到 224× 224,然后提取 VGGNet19 的最后一个 CONV 层的激活。形状[512 x 7 x 7]的这些激活被用作图像的输入特征。
- 我们使用 KERAS 标记器来提取问题特征。
- 最终的输入特征是:a)形状[49,512]的图像特征和 b)形状[22,]的问题特征,其中 22 是预处理后问题的序列长度。
- 我们使用基本学习率为 1e-4 的 ADAM 优化器。
- 我们将批量大小设置为 300,训练 60 个时期。
- 我们在每一层都使用正则化。
7.代码:
建筑:
自定义图层:
一些自定义层用于定义上面的模型。下面是自定义层的代码:
8.结果:
该论文在 VQA 2.0 数据集上的准确率为 54%。我的实现准确率是 49.28%。
下面是工作模型的演示视频:
9.结论和未来工作:
我们仅用了 60 个历元就达到了接近报道的论文精度的精度。为了获得与论文相同的准确性,我们可以尝试为更大的时期训练模型,并具有学习率衰减。
将图像缩放到 448× 448,然后从 VGGNet19 的最后一个 CONV 层中提取[512 x 14 x14]激活作为图像特征,也可以提高性能。
仅此而已。谢谢你阅读我的博客。如果你有任何想法,请留下评论、反馈和建议。
我的 GitHub repo 上的完整代码, 这里 。
你可以在领英上找到我,T5 这里 。
10.参考资料:
- 贾森·卢,,德鲁夫·巴特拉和德维·帕里克,用于视觉问题回答的分层问题-图像共同注意 (2016)
- https://github.com/ritvikshrivastava/ADL_VQA_Tensorflow2
- https://www.appliedaicourse.com/
Visual Studio 代码— Python 编辑器回顾
我想我坠入爱河了😍
Visual Studio 代码 1.50.1。截图由马丁·托马斯拍摄。
Visual Studio Code 是微软编写的免费编辑器。它的第一个版本是在 2015 年,男孩做了一个起飞。它在 StackOverflow 上有超过 28k 个问题,根据 2019 Jetbrains 调查它是第二个最常用的 Python 编辑器,根据 2019 StackOverflow 调查它是最受欢迎的编辑器。VS 代码有自己的 marketplace ,在 Windows 、 Linux 和 Mac 上运行。微软已经创建了一个强大的语言服务器,名为 Pylance ,你肯定也想读一些关于它的东西…但是让我们先从基础开始。
当你第一次启动 VS Code 时,它会提供给你几个可能有用的插件。我直接安装了 Python 集成和 Sublime 文本键绑定。当我写快捷方式时,请特别记住键绑定部分。
速度
VS 代码启动需要一秒多一点的时间。这意味着它比 PyCharm 快得多,但比 Sublime Text 慢。VS 代码存储一切,即使你不打Ctrl+S
。这意味着你可以随时关闭编辑器。下次打开它时,它会告诉您还有未保存的更改😍
用户界面
在上面的截图中,你可以看到我通常打开的内容:
- 在编辑器中你可以阅读代码。当然还有语法高亮和行号。
- 在浏览器中你可以看到工作区的文件。
- 活动栏位于浏览器的左侧。在这里,您可以将浏览器切换到搜索工具、版本控制系统(VCS)集成、调试器等等。这是我一开始不喜欢 VS 代码的主要原因。但是,您可以简单地隐藏它😍
- 在代码的右边,有一个代码的小地图。这有助于跳到奇怪的部分。
命令选项板
命令面板是实现编辑器任何功能的途径。不再在深度嵌套菜单中搜索❤️
您可以使用组合键Ctrl
+ Shift
+ P
打开命令面板。看起来是这样的:
截图由作者拍摄
虽然我不太清楚为什么,但我更喜欢 Sublime Text 的命令面板,而不是 PyCharm 的命令面板。对我来说,感觉崇高文本的模糊搜索是最好的。视觉上,VS 代码做得真的很好。
可定制的快捷方式!
VS 代码有一个默认键绑定的官方备忘单( source ),我已经提到过你可以使用其他编辑器的默认键绑定。这是整洁的,但我希望能够定制它完全符合我的需要。
当然,你可以这样做!VS 代码甚至为你提供了一个非常好的界面,它承认你可能想要不同的动作,这取决于具体的情况/编程语言。
VS 代码的快捷编辑器。截图由作者拍摄。
选项卡交互
你可以用Ctrl+W
关闭标签页,就像在 Chrome 中一样。您可以使用Alt+1
切换到第一个选项卡,使用Alt+2
切换到第二个选项卡,…
你可以用Ctrl+N
打开一个新文件——就像你在 Chrome 中打开一个新窗口一样。
跳转到行
Ctrl+G
跳到一行。这在你调试的时候非常方便。
转到文件
Ctrl+P
转到当前工作区中的任何文件。再次用模糊搜索🎉
查找/全部替换
Ctrl+F
找东西,Ctrl+H
替换。也可以用 regex!绝对是我不想错过的功能。这与多光标结合起来非常酷!(Ctrl+Shift+L
)
禅宗模式
Shift+Shift+P
并搜索“禅”。在这种模式下,你有代码。没有小地图,没有文件浏览器,没有页脚。如果你想向另一个开发者展示一些东西,这是很有帮助的。你可以调整在禅模式下显示什么。比如我还是想看行号。
17 种快捷方式
艾米·j·安德鲁斯写了这篇很棒的文章,里面有 17 条捷径:
[## 17 个有用的 Visual Studio 代码快捷方式来提高您的编码速度
这是世界上最好的代码编辑器中最酷的特性
medium.com](https://medium.com/javascript-in-plain-english/17-useful-visual-studio-code-shortcuts-to-boost-your-coding-speed-68e46705d542)
自动完成
VS Code + pylance 提供了惊人的自动补全功能💘请注意,你需要告诉它一点你在做什么。使用类型注释来帮助 VS 代码来帮助你。对了,型标注很牛逼!
带有 pylance 的 VS 代码的自动完成示例。截图由作者拍摄。
签名提示
我有时想得到一个关于函数签名的提示。在 VS 代码中,你只需将鼠标悬停在名字上就可以得到它。该框包含文档字符串😍
悬停在名称上时的函数签名提示。截图由作者拍摄。
跳到定义
点击您感兴趣的内容,然后按下F11
。就是这样。它工作了。并且运行得非常好,非常流畅!你可以用任何东西做到这一点:函数,变量,第三方的东西,核心库的东西。
排除故障
Visual Studio 代码的调试界面是轻量级的,并且在大多数情况下都有您需要的功能:(1)您可以在想要设置断点的地方单击。(2)您可以通过单击活动栏中的播放按钮来启动调试器。在这里,您还可以看到所有变量的当前值。(3)继续、单步执行、单步进入、单步退出、重启和停止调试器。(4)观察终端中的输出。
截图由作者拍摄
WSL2 集成
这个插件太神奇了,它值得拥有自己的部分:
[## 将 WSL 2 与 Visual Studio 代码一起使用
Matt Hernandez,2019 年 9 月 3 日@ fiveisprime 距离 Windows 的最初测试版已经过去了几个月…
code.visualstudio.com](https://code.visualstudio.com/blogs/2019/09/03/wsl2)
差异工具
Visual Studio 代码集成了一个相当不错的比较工具。您可以从控制台使用
code --diff file1 file2
Windows 用户:你也可以从 WSL2 中的 Ubuntu 控制台执行这个!
单元测试集成
打Ctrl+Shift+P
和Configure Tests
:
作者图片
然后,您将能够在 VS 代码中单击一个测试来运行测试😍
自定义
Visual Studio 代码提供了许多自定义方式。你有数百种设置、颜色主题和插件。
主题
Ctrl+Shift+P
,搜索“主题”:
深色和浅色主题,包括日光化和 Textmate😍截图由作者拍摄。
设置
截图由作者拍摄
你也可以通过一个settings.json
文件定制东西。这里有一些我喜欢的设置,使用的是 Ubuntu Mono 字体:
{
"editor.renderWhitespace": "all",
"editor.fontFamily": "Ubuntu Mono",
"workbench.colorTheme": "textmate",
"python.formatting.provider": "black",
"python.languageServer": "Pylance",
"python.analysis.typeCheckingMode": "basic",
"python.defaultInterpreterPath": "/home/moose/.pyenv/shims/python",
"zenMode.hideLineNumbers": false,
"zenMode.hideStatusBar": false,
"python.analysis.extraPaths": [
"/home/moose/.pyenv/versions/3.8.6/lib/python3.8/site-packages"
],
"workbench.colorCustomizations": {
"terminal.background": "#373633",
"terminal.foreground": "#dfdbd2",
},
"terminal.integrated.fontFamily": "Ubuntu Mono derivative Powerline"
}
工作区
您可以在您的工作区设置中定制忽略哪些文件/文件夹。例如,创建一个.vscode/settings.json
,并为 Python 项目添加以下内容:
{
"files.watcherExclude": {
"**/.pytest_cache/**": true
},
"files.exclude": {
"**/.mypy_cache": true,
"**/.pytest_cache": true,
"**/*.egg-info": true,
"**/mypy-report": true
}
}
插件
最后,是时候谈谈市场了,尤其是 pylance!
挂架
Pylance 是一个 Python 语言的服务器。作为用户,你不用太担心。把它想象成一个插件,它给你自动完成、签名帮助、类型检查等等。如果你使用类型注释,那就更棒了。
作为一个想知道事情如何在引擎盖下工作的开发人员,我必须感谢微软的这个好设计。他们去掉了一个困难的部分,这样一个单独的团队就可以处理它了。理论上,这可以集成到其他编辑器/ide/服务中。实际上,许可证禁止。此外,定义这样一个语言服务器接口允许开发者为其他语言创建语言服务器🌟拥有这个接口是好的软件架构的标志。
我必须在用户设置中启用 pylance 的“基本”类型检查模式(Ctrl+Shift+P)。截图由作者拍摄。
彩虹括号
彩虹括号颜色嵌套括号:
用彩色括号更容易读,不是吗?
路径智能感知
路径智能感知在编辑器中自动完成路径:
截图由作者拍摄
吉特朗斯
GitLens 显示 git 历史信息:
你注意到灰色的文字了吗?这是编辑器(me)的名称,是编辑完成的时间和提交消息的第一行。截图由作者拍摄
如果您将鼠标悬停在消息上,您可以跳转到打开图形比较的提交😍
之前突出显示的提交的图形差异。截图由作者拍摄。
AWS 工具包
AWS 工具包插件将关于 S3 桶、Lambdas、Cloudwatch 日志等信息添加到你的活动栏:
截图由作者拍摄
荣誉奖
对比:vs 代码 VS 崇高文本 vs PyCharm
与 Sublime Text 相比,VS Code 最初给我的感觉更重一些。然而,这可能仅仅是因为我大约从 2010 年开始使用 Sublime Text(我在 2014 年购买了许可证)。在一个工具上有 10 年的经验意味着你已经很习惯这个工具了。除了 Sublime 的速度惊人之外,我看不出它比 VS Code 有什么优势。
相比 PyCharm Professional,VS Code 感觉轻量级多了。速度更快,界面更干净。我不是绝对确定,但是 pylance 也可能比 PyCharm 的自动完成要好。PyCharm 的优势在于边缘情况:数据库工具窗口、SciView,可能还有一些调试特性,当然还有代码检查。
摘要
微软在 VS 代码方面做得非常出色:它速度快,可定制,有必要的功能,一个市场,合理的默认值,干净的界面,支持 Windows/Mac/Linux,并且是免费的。太棒了。我喜欢!💜
下一步是什么
在这个“Python 初学者”系列中,我们已经解释了如何在 Windows 上使用 Python 和 wsl 2,如何在 Windows 上使用 Python 和 Anaconda 。本文将 Visual Studio 代码作为初学者和专业人员的良好 IDE。
接下来,我们应该编写一个 hello world 应用程序。我乐于接受各种想法😁
宝莱坞的数据可视化:第二部分
角。2~使用 Plotly Express 显示数据
Kushagra Kevat 在 Unsplash 上拍摄的照片
这篇文章将是我收集的数据的可视化表示,正如我在的上一篇文章中所写的。
对于这种可视化,我将使用 pandas 和 plotly express 库,它们通过以下方式导入到 Jupyter 笔记本中:
import pandas as pd
import plotly.express as px
然后,使用 pd.read_csv 函数,读取包含所需数据的 csv 文件的组件。
movies = pd.read_csv('Bollywood_movies.csv')
注意:当我将从 BeautifulSoup 收集的数据保存到 excel 表格中后,我在将其导出到 csv 文件之前做了一些清理和排序工作。
当被调用时,表看起来像这样。
由于数据相对较小(9 列和 25 个条目),这在某种程度上限制了我可以进行的可视化,对此我进行了探索:
- 每年发行多少部票房最高的电影?
- 有没有导演过不止一部票房最高的电影?
- 哪种语言更受青睐?
1.世界电影总量比较
如这个柱状图所示,宝莱坞票房最高的电影是在₹2,000·克罗尔(大约 3.11 亿美元)附近上映的摔跤吧!爸爸,紧随其后的是在₹1,800·克罗尔上映的巴胡巴利 2(2.78 亿美元)。丹格尔的收入比票房第三的电影《Bajrangi Bhaijaan》多 50%。
虽然数字很大,但这并不令人惊讶,因为 Dangal 有一个精彩的故事线,对每个人和任何看过它的人都是鼓舞人心的(这没有任何偏见)。
它在 2016 年的发行不仅在印度,而且在世界各地都很受欢迎。那段时间我在中国学习,我记得我的一个密友告诉我,她和她妈妈一起看了这部电影(她妈妈在一个月内看了 3 遍)!
2.年度图表
每年都有令人惊叹的电影问世,但我想确定哪一年票房最高的电影数量最多。
分析图表,很明显 2018 年是一年!5 部票房最高的电影都是在同一年导演和制作的!
3.哪个导演的点击率最高?
为了做到这一点,我制作了一个图表,显示了导演的名字与他们所有电影的总票房。我调整了点的大小,以代表他们从列表中执导的电影数量。
巴胡巴利系列的导演 S.S .拉贾穆利总共有两部电影,总票房最高(₹2460·克罗斯/3.79 亿美元)。可以注意到,尼特什·提瓦瑞只导演了一部电影,但票房却是最高的……你能猜出是哪部电影吗?
你猜对了,丹格尔。
4.语言偏好
在 25 部电影中,大部分是印地语,3 部是泰卢固语,1 部是泰米尔语。
同样,这并不令人惊讶,因为印度电影业(宝莱坞)是迄今为止最大的,其次是泰米尔工业(Kollywood)和泰卢固语工业(Tollywood)。
虽然用其他地区语言制作的电影没有得到应有的认可,但这些电影已经被翻译成尽可能多的流行印度语言。
也许未来几年趋势会改变…让我们看看吧!
5.最后的想法
既然你已经读完了整篇文章,为什么不看一部列出的电影来奖励自己呢?
你值得拥有;)
检查我的 GitHub 的所有代码。
使用 Python、Dash 和 Plotly 可视化新冠肺炎案例数据
立即创建您自己的仪表板 Web 应用程序!
这篇文章不是关于新冠肺炎,而是关于如何使用 Python & Dash 创建一个有用的 web 应用程序。它旨在作为一个简单的指南,帮助&掌握这项技术,并让自己动手!
我写了很多关于如何使用 R & Shiny 执行这个任务的 相同的文章,并有意想要比较这两个软件栈。在这里我用 Python-Dash 的方式解释一下,不过我计划在 的另一篇 中做一个 的专用比较 的解决方案。
要了解最终的应用程序是什么样子,请测试该应用程序:
下面的分步指南解释了如何创建这个 web 应用程序,包括交互情节。软件栈基于 Python & Dash ,并且是开源的。总共只有大约 130 行代码。
顺便说一句,本文底部提供了一个链接,链接到 GitHub 代码库供下载。
目标
目标是创建一个 web 应用程序,它在应用程序启动时更新新冠肺炎案例数据,并在仪表板上显示数据。特点:
- 冠状病毒官方可用数据的下载和解析。
- 下拉菜单选择国家和州。
- 显示所选国家新的和累积的病例统计数据的两个图。可以选择确诊病例、痊愈病例、死亡病例。
任务
- 设置 Python 和 Visual Studio 代码。
- 设置 Python 项目及其文件夹结构。
- 实现加载和预处理数据的逻辑。
- 使用 Dash & Plotly 创建用户界面。
- 添加服务器逻辑。
- [可选]将应用程序上传到云。
设置 Python 和 Visual Studio 代码
首先,从https://www.python.org/downloads/下载 Python 的最新稳定版,启动安装程序并通过。
对于代码编辑器的选择,有很多可能性。 Visual Studio 代码是一个有效选项。要安装它,从https://code.visualstudio.com/download下载安装程序,运行它,完成安装。
设置 Python 项目及其文件夹结构
Python 中的包管理有多种解决方案: pip 、 pipenv 、 (ana)conda 和虚拟环境。如需快速解释,请参见本文中的帖子。我们在这里使用 虚拟环境 。
仍然在命令行上,移动到应用程序应该位于的目录。然后创建一个新的 app 目录和一个虚拟环境:
cd <folder-with-my-apps> # Put here the folder of your choice.
mkdir corona-app # Create a dedicated app directory.
cd corona-app
virtualenv venv # Create the virtual environment 'venv'.
接下来,激活虚拟环境。在 macOS 和 Linux 上,做:
source venv/bin/activate
在 窗口的 上,输入:
venv\Scripts\activate
要将软件包安装到新环境中,请键入:
pip install dash # Installs <plotly>, too.
pip install pandas
现在打开 Visual Studio 代码。在欢迎屏幕的右上角(自定义->工具和语言),您可以选择 Python 来安装对 Python 的语言支持:
仍在欢迎屏幕上,点击左侧的“打开文件夹……”,并选择您之前创建的文件夹( corona-app ):
关于设置和定制 VS 代码的更多细节,请看这个专门的教程。下一步是创建文件 app.py ,其中将包含我们需要的所有 app 代码。点击文件浏览器上的加号按钮,输入文件名。
现在我们可以开始编码了!
实现加载和预处理数据的逻辑
在 Visual Studio 代码中,如果文件尚未打开,请单击文件名“app.py”。键入下面几行来加载我们需要的库:
import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objects as go
from dash.dependencies import Input, Output
import pandas as pd
接下来,定义一个 baseURL ,我们从其中下载国家和地区的冠状病毒病例数据。数据位于约翰霍普金斯系统科学与工程中心(JHU/CSSE) 的服务器上。函数 loadData 处理下载和一些基本的转换,如下所述。
baseURL = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/"def loadData(fileName, columnName):
data = pd.read_csv(baseURL + fileName) \
.drop(['Lat', 'Long'], axis=1) \
.melt(id_vars=['Province/State', 'Country/Region'],
var_name='date', value_name=columnName) \
.astype({'date':'datetime64[ns]', columnName:'Int64'},
errors='ignore')
data['Province/State'].fillna('<all>', inplace=True)
data[columnName].fillna(0, inplace=True)
return data
read_csv 从网上下载文件,转换成 熊猫 数据帧。地理坐标被删除; 熔化将数据帧从宽转换为长格式。然后, astype 确保类型正确。最后,如果没有区域可用,方法 fillna 插入文本 < all > 或者为包含累积案例号的列插入 0。
最后一个转换是将相应的列转换成日期类型。
通过多次调用函数 loadData ,我们加载一个清理过的数据帧****【确诊病例】****【痊愈病例】 和死亡病例。函数 merge 连接这 3 个数据集,得到一个包含所有数据的数据集:
allData =
loadData(
"time_series_covid19_confirmed_global.csv", "CumConfirmed") \
.merge(loadData(
"time_series_covid19_deaths_global.csv", "CumDeaths")) \
.merge(loadData(
"time_series_covid19_recovered_global.csv", "CumRecovered"))
对于用户界面的初始化,我们需要国家名称。我们从大的数据帧中提取它们,使用:
countries = allData['Country/Region'].unique()
countries.sort()
现在我们已经完成了数据加载。让我们转到 UI 部分!
[更新 2020-3-27]:服务器上的文件名在 3 月 23 日更改了,所以我必须在这里也更新它们。
使用 Dash & Plotly 创建用户界面
首先,我们初始化一个外部样式表的路径和一个自定义字体(匹配这个应用程序的 R-Shiny 版本):
external_stylesheets=['https://codepen.io/chriddyp/pen/bWLwgP.css']tickFont = {'size':12, 'color':"rgb(30,30,30)", \
'family':"Courier New, monospace"}
使用上面定义的样式表初始化 Dash 应用程序:
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)app.layout = html.Div(
style={ 'font-family':"Courier New, monospace" }, children=[
## ...
]
])
虽然标题和两个情节遍布整个屏幕宽度,但三个控件仅占三分之一。根据**引导网格系统,**这转化为三个列,每个列的宽度为 4,总计为 12。
我们现在输入以下代码块来定义包含控件的列,而不是三个点(见最后一个代码块):
html.H1('Case History of the Coronavirus (COVID-19)'),
html.Div(className="row", children=[
html.Div(className="four columns", children=
html.H5('Country'),
dcc.Dropdown(
id='country',
options=[{'label':c, 'value':c} \
for c in countries],
value='Italy'
)
]),
html.Div(className="four columns", children=[
html.H5('State / Province'),
dcc.Dropdown(
id='state'
)
]),
html.Div(className="four columns", children=[
html.H5('Selected Metrics'),
dcc.Checklist(
id='metrics',
options=[{'label':m, 'value':m} for m in \
['Confirmed', 'Deaths', 'Recovered']],
value=['Confirmed', 'Deaths']
)
])
]),
我们定义的控件是:
- 国家下拉列表,其中填充了唯一的国家。
- 州/省下拉菜单。至今未初始化。
- 指标清单,填有 3 个指标名称。
对于两个条形图,我们使用交互式版本的 Plotly ( 文档),并更改配置以隐藏大量控件。代码也是子数组的一部分:
dcc.Graph(
id="plot_new_metrics",
config={ 'displayModeBar': False }
),
dcc.Graph(
id="plot_cum_metrics",
config={ 'displayModeBar': False }
)
添加服务器逻辑
与 R-Shiny 软件栈相比,Python-Dash 没有简单的解决方案来生成表达式(=数据!)无功。下一个函数返回指定国家和州的所有数据。该函数将在我们的代码中使用两次(每个图一次),因此如果计算不会发生两次,这将是一个优势:
def nonreactive_data(country, state):
data = allData.loc[allData['Country/Region'] == country] \
.drop('Country/Region', axis=1)
if state == '<all>':
data = data.drop('Province/State', axis=1) \
.groupby("date") \
.sum() \
.reset_index()
else:
data = data.loc[data['Province/State'] == state]
newCases = data.select_dtypes(include='Int64').diff().fillna(0)
newCases.columns = [column.replace('Cum', 'New')
for column in newCases.columns]
data = data.join(newCases)
data['dateStr'] = data['date'].dt.strftime('%b %d, %Y')
return data
除了过滤国家和州的总体数据帧之外,如果用户为有州的国家(如美国)选择 <【全部】> ,该函数还会聚合数据(使用 groupby 和 sum )。进一步的差异从累积的统计数据中计算并保存到新列中,前缀为“New”而不是“Cum”。
下一个块定义了一个函数来创建条形图,它将用于两个图。
colors = { 'Deaths':'rgb(200,30,30)', \
'Recovered':'rgb(30,200,30)', \
'Confirmed':'rgb(100,140,240)' }def barchart(data, metrics, prefix="", yaxisTitle=""):
figure = go.Figure(data=[
go.Bar(
name=metric, x=data.date, y=data[prefix + metric],
marker_line_color='rgb(0,0,0)', marker_line_width=1,
marker_color=colors[metric]
) for metric in metrics
])
figure.update_layout(
barmode='group', legend=dict(x=.05, y=0.95),
plot_bgcolor='#FFFFFF', font=tickFont) \
.update_xaxes(
title="", tickangle=-90, type='category',
showgrid=True, gridcolor='#DDDDDD',
tickfont=tickFont, ticktext=data.dateStr,
tickvals=data.date) \
.update_yaxes(
title=yaxisTitle, showgrid=True, gridcolor='#DDDDDD')
return figure
该函数的顶部循环遍历指标以添加条形。底部设置条形图模式(“组”),并对图例、轴和标签进行一些调整和样式设置。最重要的是,我们想在 x 轴的每个刻度上显示日期。
反应图
虽然到目前为止 Dash 还不支持反应式表达式,但是反应式 UI 元素是支持的。如果输入值之一改变 ( 国家、状态、或指标),则以下回调被触发。在这种情况下,后续函数被调用并更新输出 ( 图)中定义的变量。
为了完成该任务,该函数通过调用适当的函数“条形图”来加载清理后的数据并呈现图表。
[@app](http://twitter.com/app).callback(
Output('plot_new_metrics', 'figure'),
[Input('country', 'value'), Input('state', 'value'),
Input('metrics', 'value')]
)
def update_plot_new_metrics(country, state, metrics):
data = nonreactive_data(country, state)
return barchart(data, metrics, prefix="New",
yaxisTitle="New Cases per Day")[@app](http://twitter.com/app).callback(
Output('plot_cum_metrics', 'figure'),
[Input('country', 'value'), Input('state', 'value'),
Input('metrics', 'value')]
)
def update_plot_cum_metrics(country, state, metrics):
data = nonreactive_data(country, state)
return barchart(data, metrics, prefix="Cum",
yaxisTitle="Cumulated Cases")
反应式下拉菜单
最后但同样重要的是,当用户改变选择的国家时,下拉菜单中显示的州/省必须适应。 update_states 提取唯一状态列表,添加 < all > ,返回整个列表并更新所选值。
[@app](http://twitter.com/app).callback(
[Output('state', 'options'), Output('state', 'value')],
[Input('country', 'value')]
)
def update_states(country):
states = list(allData.loc[allData['Country/Region'] == country]
['Province/State'].unique()
)
states.insert(0, '<all>')
states.sort()
state_options = [{'label':s, 'value':s} for s in states]
state_value = state_options[0]['value']
return state_options, state_value
搞定了。
现在,您只需按下 VS 代码右上角的绿色“运行”按钮,就可以运行该应用程序。玩得开心:)
GitHub 代码
以上所有代码都可以在GitHub:https://github.com/ploner/coronavirus-py上找到
[可选]将应用程序上传到云
在网络服务器上发布应用程序非常容易,尤其是像 Heroku 这样的免费服务。
步骤是:
- 在 app.py 文件中添加下面一行:
server = app.server
- 在 Heroku 上创建一个帐户。
- 安装 Heroku CLI(命令行界面)。
- 遵循 https://dash.plot.ly/deployment——“Heroku 示例”部分的说明。基本上,你通过 pip 安装 gunicorn ,创建*。git 忽略*、 ProcFile 和 requirements.txt ,使用 git 一起提交给 Heroku 。
最后的想法
这是我在 Medium 上的第二篇文章,与我的第一篇高度相关:
用 R,闪亮的& Plotly 在一眨眼的时间内可视化新冠肺炎案例数据
如果你领导着一个数据科学团队,并且你的成员也精通 R 和 Python ,那么比较 Shiny 和 Dash 可能就在你的任务清单上。让我知道你是如何做决定的。
如果你喜欢这个故事,你可能也会喜欢我在《走向数据科学》上发表的关于新冠肺炎、分析和机器学习的两个中型故事之一:
忘记每日统计,遵循正确的 KPI!
towardsdatascience.com](/forget-daily-statistics-of-the-coronavirus-7e9bbb7349bd) [## 哪些国家的反应与新冠肺炎相似?机器学习提供了答案
看看你的国家(或美国的州)和它的同行相比表现如何。了解聚类分析的实际应用——使用 UMAP…
towardsdatascience.com](/which-countries-react-similar-to-covid-19-machine-learning-provides-the-answer-5971ec2f6f31)
可视化装配图
用于宏基因组宁滨分析的可视化装配图
我研究元基因组组装图已经有一段时间了,我遇到了许多有趣的事情。在这篇文章中,我将与您分享我对宏基因组组装图和从这些图中获得的宁滨重叠群的一些观察。假设你对基因组组装有了基本的了解(如果没有你可以看我之前的文章基因组组装——基因组分析的圣杯),让我们开始吧。
什么是装配图?
装配图用于表示一个基因组(或元基因组)的最终装配。简而言之,汇编器根据读数和它们的重叠信息构建这个汇编图。最后,组装器解析组装图中的路径,并输出非分支路径作为重叠群。
下面给出了从名为 绷带 的工具中获得的装配图的可视化部分。
图一。使用绷带显示 ES+metaSPAdes 数据集。
装配图是如何表示的?
用于表示装配图的最常见的文件格式是 GFA(图形片段装配) 格式。GFA 文件由一组序列和制表符分隔的重叠序列对组成。你可以从 http://gfa-spec.github.io/GFA-spec/GFA1.html 了解更多关于这种格式的信息。
图二。GFA 样本文件的一部分
如图 2 所示,序列从“ S 开始表示,序列之间的重叠(或连接)从“ L 开始表示。加号(+)和减号(-)表示重叠中考虑的是原始序列还是其反向互补序列。链环中用字母“ M 表示的数值是指搭接长度。在这个样本文件中,重叠长度是 55 个碱基对。
如何可视化装配图?
由于我们正在讨论的组装图已经是一个“图,我们可以将序列建模为顶点,将重叠/链接建模为边。
- 顶点→序列
- 边缘→序列之间的重叠
现在让我们使用 python-igraph 可视化一个样本装配图。你可以从我的上一篇文章中读到更多关于使用 python-igraph 可视化图形数据的内容。为了便于解释,我不考虑链接信息中的加号和减号。简单地说,我将想象一个无向图。
可视化样本图
我们将考虑由来自两种细菌物种的读数组成的数据集;粪肠球菌和金黄色葡萄球菌。我们将它称为 ES 数据集。我已经使用 metaSPAdes 组装器组装了这个数据集,以获得重叠群。这个重叠群数据集被称为 ES+metaSPAdes ,可以从链接找到这里的为contigs . fasta。装配图文件可以找到assembly _ graph _ with _ scaffolds . GFA。
注: metaSPAdes 将每个重叠群表示为一组片段,组装图文件包含这些片段的详细信息以及这些片段之间的链接。因此,当获得重叠群之间的链接时,您必须扫描 重叠群.路径 文件和assembly _ graph _ with _ scaffolds . GFA文件 中每个重叠群的前缀和后缀,以确定重叠重叠群的前缀或后缀。
ES+metaSPAdes 数据集的可视化如下所示。
图三。装配图的可视化
比对参考基因组
我们可以将重叠群与参考基因组进行比对,以确定每个重叠群属于哪个基因组。为此,我们可以使用 BWA-MEM 。下面给出了一个运行 BWA-MEM 的示例命令。
bwa mem <**path to reference genome**> <**path to contig file**> > <**output path**>alignment.sam
对于每个重叠群,导致最长比对长度的参考基因组可以被认为是重叠群的来源。
在确定重叠群的基本事实后,我们可以标记顶点(重叠群)并将这些数据可视化,如图 4 所示。
图 4。重叠群基础真相物种的可视化。红色重叠群属于粪肠球菌,绿色重叠群属于金黄色葡萄球菌。不考虑白色节点。
从这些集会中我们能得出什么结论?
如图 5 所示,我们可以看到,两个物种的重叠群倾向于在组装图中形成两个独立的区域。
图五。这两个物种的分离可以在装配图中看到。
此外,除了边界情况之外,属于相同物种的重叠群很可能彼此之间有重叠。我们可以在宁滨分析中利用这些数据。
密码
下面是一些用来生成我在本文中展示的图像的代码片段。
构建装配图
import re
from igraph import *
from collections import defaultdictpaths = {}
segment_contigs = {}
node_count = 0# Get contig paths from contigs.paths
with open(<**path to metaSPAdes contigs.paths file**>) as file:
name = file.readline()
path = file.readline()
while name != "" and path != "":
while ";" in path:
path = path[:-2]+","+file.readline()
start = 'NODE_'
end = '_length_'
contig_num = str(int(re.search('%s(.*)%s' % (start, end), name).group(1))-1)
segments = path.rstrip().split(",")
if contig_num not in paths:
node_count += 1
paths[contig_num] = [segments[0], segments[-1]]
for segment in segments:
if segment not in segment_contigs:
segment_contigs[segment] = set([contig_num])
else:
segment_contigs[segment].add(contig_num)
name = file.readline()
path = file.readline() links = []
links_map = defaultdict(set)# Get contig paths from contigs.paths
with open(<**path to metaSPAdes GFA file**>) as file:
line = file.readline()
while line != "":
# Identify lines with link information
if "L" in line:
strings = line.split("\t")
f1, f2 = strings[1]+strings[2], strings[3]+strings[4]
links_map[f1].add(f2)
links_map[f2].add(f1)
links.append(strings[1]+strings[2]+" "+strings[3]+strings[4])
line = file.readline() # Create graph
g = Graph()# Add vertices
g.add_vertices(node_count)for i in range(len(g.vs)):
g.vs[i]["id"]= i
g.vs[i]["label"]= str(i+1)for i in range(len(paths)):
segments = paths[str(i)]
start = segments[0]
start_rev = ""
if start.endswith("+"):
start_rev = start[:-1]+"-"
else:
start_rev = start[:-1]+"+"
end = segments[1]
end_rev = ""
if end.endswith("+"):
end_rev = end[:-1]+"-"
else:
end_rev = end[:-1]+"+"
new_links = []
if start in links_map:
new_links.extend(list(links_map[start]))
if start_rev in links_map:
new_links.extend(list(links_map[start_rev]))
if end in links_map:
new_links.extend(list(links_map[end]))
if end_rev in links_map:
new_links.extend(list(links_map[end_rev]))
for new_link in new_links:
if new_link in segment_contigs:
for contig in segment_contigs[new_link]:
if i!=int(contig):
g.add_edge(i,int(contig))
g.simplify(multiple=True, loops=False, combine_edges=None)
使用 python-igraph 可视化初始装配图
out_fig_name = "assembly_graph.png"visual_style = {}# Set bbox and margin
visual_style["bbox"] = (1500,1500)
visual_style["margin"] = 30# Set vertex colours
visual_style["vertex_color"] = 'white'# Set vertex size
visual_style["vertex_size"] = 35# Set vertex lable size
visual_style["vertex_label_size"] = 15# Don't curve the edges
visual_style["edge_curved"] = False# Set the layout
my_layout = g.layout_fruchterman_reingold()
visual_style["layout"] = my_layout# Plot the graph
plot(g, out_fig_name, **visual_style)
用 python-igraph 可视化彩色装配图
node_colours = []for i in range(node_count):
if i in efaecalis_list:
node_colours.append("red")
elif i in saureus_list:
node_colours.append("green")
else:
node_colours.append("white")out_fig_name = "coloured_assembly_graph.png"g.vs["color"] = node_coloursvisual_style = {}# Set bbox and margin
visual_style["bbox"] = (1500,1500)
visual_style["margin"] = 30# Set vertex size
visual_style["vertex_size"] = 35# Set vertex lable size
visual_style["vertex_label_size"] = 15# Don't curve the edges
visual_style["edge_curved"] = False# Set the layout
visual_style["layout"] = my_layout# Plot the graph
plot(g, out_fig_name, **visual_style)
最后的想法
我和我的实验室开发了一个名为 GraphBin 的工具,通过利用组装图和重叠群之间的连接性信息来细化合并的重叠群。你可以从这里找到 GitHub 回购。
GraphBin 是一个宏基因组重叠群宁滨工具,它利用了来自组装…
github.com](https://github.com/Vini2/GraphBin)
GraphBin 发表在 OUP 生物信息学杂志上。你可以从 DOI:10.1093/bio informatics/btaa 180中查看关于该工具的更多信息。
[## GraphBin:使用集合图的宏基因组重叠群的精细宁滨
抽象动机。宏基因组学领域提供了对结构、多样性和生态学的有价值的见解。
dx.doi.org](http://dx.doi.org/10.1093/bioinformatics/btaa180)
你也可以从下面列出的我以前的文章中读到更多关于基因组组装和宏基因组学的内容。
组装 2019 新型冠状病毒基因组
towardsdatascience.com](/genome-assembly-the-holy-grail-of-genome-analysis-fae8fc9ef09c) [## 宏基因组学——谁在那里,他们在做什么?
深入了解微生物群落的数据
towardsdatascience.com](/metagenomics-who-is-there-and-what-are-they-doing-9f204342eed9)
希望你对我的发现感兴趣。我很想听听你的想法。
感谢您的阅读。
干杯!