Data Analysis with Python Projects => Medical Data Visualizer

发布于 2021-04-29 08:09

更多精彩,请点击上方蓝字关注我们!
赵晨唏_-_绿洲[1].mp3 来自Feel Life 03:48

Introduction

In this project, you will visualize and make calculations from medical examination data using matplotlib, seaborn, and pandas.

FreeCodeCamp[1]

Code

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# Import data
df = pd.read_csv('medical_examination.csv')

# Add 'overweight' column
df['overweight'] = (df['weight'] / ((df['height'] / 100) ** 2) > 25).astype(int)

# Normalize data by making 0 always good and 1 always bad. If the value of 'cholesterol' or 'gluc' is 1, make the value 0. If the value is more than 1, make the value 1.
df['cholesterol'] = (df['cholesterol'] > 1).astype(int)
df['gluc'] = (df['gluc'] > 1).astype(int)


# Draw Categorical Plot
def draw_cat_plot():
    # Create DataFrame for cat plot using `pd.melt` using just the values from 'cholesterol', 'gluc', 'smoke', 'alco', 'active', and 'overweight'.
    df_cat = pd.melt(df, id_vars=['cardio'], value_vars=['cholesterol''gluc''smoke''alco''active''overweight'])

    # Group and reformat the data to split it by 'cardio'. Show the counts of each feature. You will have to rename one of the columns for the catplot to work correctly.
    df_cat = pd.DataFrame(df_cat.groupby(['cardio''variable''value'])['value'].count()).rename(columns={'value''total'}).reset_index()

    # Draw the catplot with 'sns.catplot()'

    g = sns.catplot(x="variable", y="total", col="cardio", data=df_cat, kind='bar', hue="value")

    fig = g.fig
    # Do not modify the next two lines
    fig.savefig('catplot.png')
    return fig


# Draw Heat Map
def draw_heat_map():
    # Clean the data
    df_heat = df[(df['ap_lo'] <= df['ap_hi']) 
      & (df['height'] >= df['height'].quantile(0.025))
      & (df['weight'] >= df['weight'].quantile(0.025))
      & (df['height'] <= df['height'].quantile(0.975))
      & (df['weight'] <= df['weight'].quantile(0.975))
    ]

    # Calculate the correlation matrix
    corr = df_heat.corr()

    # Generate a mask for the upper triangle
    mask = np.zeros_like(corr, dtype=bool)
    mask[np.triu_indices_from(mask)] = True

    # Set up the matplotlib figure
    fig, ax = plt.subplots(figsize=(1212))

    # Draw the heatmap with 'sns.heatmap()'
    ax = sns.heatmap(corr, mask=mask, annot=True, fmt='.1f', center=0,
      vmin=-0.1, vmax=0.32, linewidths=.5, cbar_kws={'shrink'.45'format''%.2f'})

    # Do not modify the next two lines
    fig.savefig('heatmap.png')
    return fig

Result

Last

pandas

原以为经过上个任务Demographic Data Analyzer,pandas已经有深刻理解了。然而到这里第一步就卡了。

  1. df中列与列的操作,得到的结果是一个Series,如:df['weight'] / ((df['height'] / 100) ** 2) > 25得到一个bool类型的Series。
  2. astype可以转换pandas的数据类型,bool的True=>1,False=>0
  3. df操作后的Series赋值到df的列里就达到更新的结果,如:df['gluc'] = (df['gluc'] > 1).astype(int),先判断是否大于1,其结果是bool类型,而后转为int类型。
draw cat plot
  1. 这里还是pandas的方法:melt。是传入dataframe,需要保留的列id,和需要转换的value列参数。可以看成宽数据转为长数据,或者是把value参数的列合并成两列(variable和value),这里原来的数据是70000,转换后变成了420000(70000 * 6).
  1. 这里的多个列的分组统计很难搞,统计后的转换令人头大,就是明明已经看到需要的数据了,但是就是用不了。原因是count得到的是一个Series类型的数据,其中'variable', 'value', 'cardio'都作为了count后的值的索引了。后面才知道是pandas的多重(MultiIndex)索引,需要reset_index重新设置索引。但是也没弄出来,报ValueError: cannot insert value, already exists已经存在,然而确实是存在了,再后面看了别人的代码才猛然发现,上面的注释内容就有提示了!现在仔细想想当时怎么没想到既然你已经存在了,那我可以改你的列名啊,从example的图里的total和注释的提示就应该想到了啊,唉傻了。最后的处理是先用count做统计,这时的数据是Series,然后转为Dataframe,再rename修改已存在的列名value为total,注意columns是字典格式的参数,最后reset_index重设为RangeIndex索引。

3. catplot[2] 绘图,感觉很分格子一样,不同的数据绘制在不同的格子中。

    • data:传入的是dataframe,其他的参数可以根据列名来选取
    • kind:绘图类型bar、box、point等
    • x: x轴数据和名称
    • y: y轴数据和名称
    • col: 绘制的位置
    • hue: 色调
heat map
  1. 热力图是一个相关系数的矩阵,df的corr方法可以直接获取。
  2. 绘制三角矩阵,首先是绘制一个和corr一样形状的bool矩阵,再把上三角的值设成True,最后绘图时不显示。
  3. heatmap[3] 绘图,都是seaborn的模块,都差不多。
    • data: 也是行列格式的数据
    • vmin:映射的最小值
    • vmax:映射的最大值
    • mask:隐藏为True的区域
    • annot:注释,这里是值
    • fmt:格式化数据
    • center:居中
    • linewidths:间距
    • cbar_kws:条形映射标注图的选项

End

参考资料

[1]

FreeCodeCamp: https://chinese.freecodecamp.org/learn/data-analysis-with-python/data-analysis-with-python-projects/medical-data-visualizer

[2]

catplot: https://seaborn.pydata.org/generated/seaborn.catplot.html

[3]

heatmap: http://seaborn.pydata.org/generated/seaborn.heatmap.html


公众号ID和密码一样


欢迎登录公众号发表、分享你的成长收获





扫码关注

有趣的灵魂在等你

我就知道你“在看”