生物大数据分析

2 . 分析平台和编程语言介绍




  • 2.1 Linux操作系统简介

  • 2.2 编程语言基础概览





生物大数据分析

2.1 Linux操作系统简介




桂松涛 Blog
songtaogui@163.com



基本的计算/存储单元概念

CPU <=> 缓存 <=> 内存 <=> 硬盘

  • CPU: 核心计算资源;

  • L123缓存: 位于CPU与内存之间的临时存储器,容量小, 但交换速度却比内存要快得多;

  • RAM: 内存, 断电后数据丢失;

  • DISK: 硬盘, 物理存储, 断电后数据不丢失, 但是读写速度很慢;


计算过程基本数据流方向:

DISK -> RAM -> Cache -> CPU

-延伸阅读-
What Scientists must know about hardware to write fast code – by Jakob Nybo Nissen


Linux操作系统简介


Linux-Unix历史

  • 1970年, Unix诞生(贝尔实验室)并开源;

  • 1979年, Unix V7开始, 贝尔实验室禁止Unix的源码用于教学;

  • 1987年, Tanenbaum发布了从头开发的Minix(兼容Unix V7), 用于教学;

  • 1991年, Linus借鉴Minix开发了Linux内核;

  • 1983年, Stallman发起了GNU(GNU is not Unix)计划, 为了创建一个完全自由的操作系统, 其与Linux内核结合, 形成现代Linux生态环境;

  • 2017年11月份开始, 世界Top500的超级计算机全部使用Linux系统;


Linux的优势和发行版

  • Linux的优势:

    • 良好的可移植性和灵活性

    • 应用广泛: 大型服务器, 小型计算机, 嵌入式设备 ...

    • 完全开源, 免费使用

    • 稳定高效, 开发和维护成本低;

  • Linux常见发行版:

    • Ubuntu, Debian, RHEL, CentOS, Fedora, Arch Linux, Kali Linux, Deepin ...

    • 生信Linux推荐: 服务器用CentOS, 个人PC用Ubuntu;

    • 目前CentOS不再维护新版本, 可以使用Rocky Linux 替换;


Linux系统结构


Linux哲学: 一切皆文件

  • Linux中目录, 进程, 磁盘等都被抽象成了文件;

  • 只需要一套API就可以调用Linux中大部分资源;

  • 任何硬件设备都需要挂载到根目录下才能使用;



/────
    ├── bin     # binaries(二进制文件),存放着最常用的程序和指令
    ├── boot    # 系统启动相关文件,如内核,initrd,以及grub(BootLoader)
    ├── dev     # device,设备文件 — 体现了LInux的“一切皆文件”思想
    ├── etc     # 配置文件。大多数为纯文本文件
    ├── home    # 用户的家目录
    ├── lib     # library,公共库文件(不能单独执行, 只能被调用)
    ├── media   # 挂载点目录,挂载移动设备(如U盘)
    ├── mnt     # 挂载额外的临时文件(如第二块硬盘)
    ├── opt     # optional,存放额外安装软件
    ├── proc    # processes,伪文件系统,内存映射文件,系统启动后才出现文件, 关机就空
    ├── root    # 管理员的家目录
    ├── sbin    # superuser binaries,存放系统管理所需要的命令
    ├── tmp     # temporary,临时文件,所有用户都可以操作,但只能删自己的,不能删别人的
    ├── usr     # unix shared resources,存放只能读的命令和其他文件
    └── var     # variable,存放运行时需要改变数据的文件,如日志等

Linux系统结构:

Linux基本概念


用户和用户组

  • 每个用户有独立的ID和密码;

  • 多个用户可同时登录同一个Linux系统, 互不影响;

  • root用户拥有系统最高权限;

  • 用户组: 具有相同特征用户的集合, 分组可以简化管理工作;

  • 用户和用户组的关系: N vs N;


权限

  • 多用户通过权限实现资源隔离, 保障系统和数据安全;

  • 权限的主体为用户, 对象为文件;

  • 基本权限: 可读(r), 可写(w), 可执行(x);

  • 用户对自己的文件有绝对的权限, 本用户的文件默认禁止其他用户访问;

  • root用户对所有文件拥有访问和修改权限;

命令
命令(command): 终端上运行的程序;

  • 命令提示符(prompt): 登陆终端后显示的符号, 可以通过PS1变量配置;

  • 命令格式: 命令 -选项 参数, 如grep -m 1

    • 命令: shell传递给内核执行的指令;

    • 选项: 命令预设的控制选项, 可以是短选项, 如: -c -v -m, 或 -cvm, 或是长选项, 如: –version;

    • 参数: 指向命令的目标, 多个参数要用空格隔开;

    • 命令类型: 内置命令/外部命令;

    • 命令补全: 使用TAB键;

    • 命令历史: ↑, ↓, ctrl+r, history, ~/.bash_history;

    • 命令帮助: man CMD; CMD -h; README;

    • 命令路径: 命令存放在PATH路径中, 按照路径搜索并执行第一个搜到的命令;


Linux终端基本操作: 文件/目录操作


文件/目录操作

  • 权限设置: chmod,setfacl,chown, chgrp

  • 查看目录/文档信息: ls, pwd, file,

  • 改变目录: cd

  • 创建文件目录: touch, mktemp, mkdir

  • 软连接: ln

  • 删除文件/目录: rm

  • 复制文件/目录: cp

  • 移动/重命名 文件/目录: mv

  • 查看目录大小: df, du

  • 查找文件: find, which, whereis, locate

通配符
a1.txt a2.txt a3.txt ac1.txt b.txt.gz

  • *: 匹配0或多个字符:

    • ls *.txt a1.txt a2.txt a3.txt ac1.txt

  • ?: 有且只有一个字符:

    • ls a?.txt a1.txt a2.txt a3.txt

  • [ ]: 字符组合, 匹配其中任意一个字符:[abc]/[!abc]/[0-9]/[a-z]

    • ls a[12].txt a1.txt a2.txt

  • { }: 集合, 匹配其中任意一个元素: {abc,def,123}

    • ls {a1,a2,ac1}.txt a1.txt a2.txt ac1.txt


Linux终端基本操作: 文本文件处理


  • 编辑器: vim, emacs, nano, vscode...

  • 查看文件: cat, less, more, head, tail

  • 文件操作三剑客

  • 统计文件: wc

  • 内容操作: sort, uniq, cut, split ...

  • 字符串操作: tr, col, join, paste, expand ...

  • 压缩/打包文件: tar, gzip, bzip2, bgzip ...


缅怀Bram: Vim的前世今生

Linux终端基本操作: IO, PIPE, FIFO


输入输出(IO)
Linux标准IO: stdin, stdout, stderr

  • stdin: 标准输入, 对应管道id0;

  • stdout: 标准输出, 对应管道id1;

  • stderr: 标准错误, 对应管道id2;

  • 黑洞设备: /dev/null, 用来当垃圾桶


IO重定向:<, >, <<, >>

cat <file # stdin重定向到file
cat file > abc # stdout 重定向到abc, 覆盖abc原有内容, 等价于:
cat file 1> abc
cat file >> abc # stdout 重定向到abc, 追加在abc原有内容之后
command 1>log.txt 2>error.txt # stderr 重定向到 error.txt
command 1>/dev/null 2>&1 # 丢弃stdout, 同时把stderr重定向到stdout(屏幕打印)


stdout和stderr的区别

  • stdout是行缓冲的数据流: 逐行输出(遇到\n或者缓冲区满才输出);

  • stderr是无缓冲的数据流: 实时输出;


Linux终端基本操作: IO, PIPE, FIFO


管道PIPE

# 对一个文件取第一列, 然后排序, 然后去重:
cut -f 1 file.txt > tmp1.txt
sort tmp1.txt > tmp2.txt
uniq tmp2.txt > final.txt
rm -f tmp1.txt tmp2.txt


临时文件, IO负载 → 管道操作符|

cut -f 1 file.txt | sort | uniq > fianl.txt


进阶知识: 具名管道FIFO

  • FIFO是一个文件,一端写,一端读,会阻塞

  • mkfifo创建FIFO

  • FIFO中的内容存放在内存

  • 可以通过创建FIFO在linux中实现并行计算

自学资料:

  • FIFO简单理解
  • FIFO详细介绍
  • 利用FIFO实现多线程脚本


  • Linux终端基本操作: 资源管理器


    系统状态/资源占用

    ## 查看系统版本信息
    cat /proc/version
    uname -a
    lsb_release -a
    cat /etc/issue
    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数
    # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
    ## 查看物理CPU个数
    cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
    ## 查看每个物理CPU中core的个数(即核数)
    cat /proc/cpuinfo| grep "cpu cores"| uniq
    ## 查看逻辑CPU的个数
    cat /proc/cpuinfo| grep "processor"| wc -l
    ## 查看CPU信息(型号)
    cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
    ## 查看磁盘分区和使用情况
    df -h
    ## 查看内存信息
    cat /proc/meminfo
    free



    任务监控top/htop

    作业管理ps/kill ps + kill: linux中ps配合kill结束进程的N种方法

    作业提交到后台


    Linux中的危险操作


    慎用rm命令的`-f`指令

    # boom!
    rm -rf /
    
    # 你意识不到的错误
    export dirtoremove="/path/to/my/unused/dir"
    rm -rf /path/to/some/parent/$Dirtoremove 
    # will remove all parent things!



    慎用mv命令

    mv fileA fileB


    慎用tar命令

    #压缩
    tar zcvf 新产生的文件.tgz 要压缩的文件
    #解压指定文件
    tar zxvf 待解压的文件.tgz /指定/目录/子文件.txt



    一些安全配置

    # 在bash配置文件中添加别名
    alias cp='cp -i'
    alias mv='mv -i'
    alias rm='rm -i'




    生物大数据分析

    2.2 编程语言基础概览




    桂松涛 Blog
    songtaogui@163.com



    适用于生物数据分析的编程语言

    两语言问题

    适用于生物数据分析的编程语言

    两语言问题

    适用于生物数据分析的编程语言


    生信常用语言

    • Shell(Bash): 批处理, 简单流程管理, 作业调度;

    • Perl: 文本操作, 随写随用, 曾经的生信天花板, 现今老年人象征;

    • R: 生态强悍, 统计分析, 原型开发, 数据可视化;

    • Python: 大型应用开发, 生态强悍, Perl/R能做的都能做, 调包侠;

    • Rust/C/C++/GO/Java...: 系统编程、开发性能优化的工具;

    • Julia: 理念先进, 两语言问题的现行解决方案, 但没有金主, 用爱发电, 生态不够, 中文资料等于没有😔;


    新入坑推荐路线

    • Shell(Bash) + R <- 新手强推

    • Shell(Bash) + Python <- 新手普通推(带偏见)

    • Shell(Bash) + Perl + R <- Here I am

    • Shell(Bash) + Julia <- My future


    编程语言通用概念概览



    基础概念

    • 入门概念

    • 变量

    • 数据类型

    • 运算符

    • 函数

    • 流程控制

    • 包/模块

    • ...

    进阶概念

    • 变量作用域

    • 模式匹配: 正则表达式

    • 元编程

    • 并行编程, 异步编程

    • 网络和流

    • 编程范式

    • 设计模式

    • ...


    编程语言通用基础: 入门概念




    • 交互式会话(REPL)

    • 命令行工具

    • 脚本

    • 包/项目


    编程语言通用基础: 变量


    变量: 与某个值相关联的名字, 保存一个值, 以供后续代码使用。

    # 将 10 赋值给变量x
    x = 10
    
    # 使用x进行计算
    x + 1
    
    # 重新赋值x
    x = 1 + 1
    x = "Hello SDAU"
    
    # 变量名
    # - 变量名必须以字母、数字、下划线_和句点.组成
    # - 变量名的第一个字符不能为数字或者特殊符号
    # - 大小写敏感
    x=1
    X=2
    1y=3 # oops!


    编程语言通用基础: 数据类型


    # 整数Int (Integer)
    10, -1, 0
    
    # 浮点数Float
    1.2, 0.3, 5.5
    
    # 字符串
    "abc", "123", "登高必自"
    
    # 数组 (array), 向量 (vector), 列表(list)
    [1,2,3,4]
    ["a", "b", "c", "d"]
    # 混合元素的数组(嵌套数组)
    [
        1,
        "a",
        [3, 4],
        "b"
    ] # 在R中是 列表(list)
    
    
    # 字典, 哈希表 (在R语言中, 是具名数组, 或具名列表)
    dd = Dict(
        # Key => Value, 键 => 值,
        "name"   => "ST.Gui",
        "age"    => 18,
        "height" => 185
    )
    dd["name"]
    
    # 多维数组, 矩阵
    julia> [1 2 3; 4 5 6; 7 8 9]
    3×3 Matrix{Int64}:
     1  2  3
     4  5  6
     7  8  9


    编程语言通用基础: 运算符


    # 基础数学运算: +, -, *, /, ÷, %, ^
    2 + 1
    2 - 1
    2 * 3
    3 / 2
    3 ÷ 2
    3 % 2
    2 ^ 3
    
    # 数值比较: ==, !=, <, >, <=, >=
    
    2 == 2
    2 >= 1
    
    # 布尔运算(逻辑运算): !, &&, ||
    
    2 > 1 && 2 > 3
    2 > 1 || 2 > 3
    ! (2 > 1)
    
    # 位运算(超纲了, 略过):
    # ~, &, |, \xor, \nand, \nor, >>>, >>, <<


    编程语言通用基础: 函数


    # 编程语言中的函数跟数学中的函数概念类似, y = f(x)
    function my_add(x, y)
        x + y
    end
    
    my_add(1, 2)
    
    # 可选参数和默认值
    using Dates
    function Date(y::Int64, m::Int64=1, d::Int64=1)
        err = validargs(Date, y, m, d)
        err === nothing || throw(err)
        return Date(UTD(totaldays(y, m, d)))
    end
    
    Date(2023, 10, 26)
    Date(2023, 10)
    Date(2023)
    
    # 关键字参数
    function plot(x, y; style="solid", width=1, color="black", delim=" <=> ")
        return join( [x, y, style, width, color], delim )
    end
    
    plot(1, 2)
    plot(2, 1)
    plot(1, 2, width=2)
    plot(1, 2, color="red")


    编程语言通用基础: 流程控制


    # 判断: if-elseif-else; ?:(三元操作符)
    
    if height > 190
        println("今天就到这吧, 我脖子疼")
    elseif height > 170
        println("加个微信吧?")
    else
        println("抱一丝, 我有对象了。")
    end
    
    score >= 60 ? println("及格了!") : println("不及格!")
    
    # 循环: while; for
    i = 1
    while i <= 5
        println(i)
        i = i + 1
    end
    
    for j in ["a", "b", "c"]
        println(j)
    end
    
    # 超纲内容: 
    ## 异常处理(throw, try/catch)
    ## 循环结束后操作(finally)
    ## 提前退出(break, continue)


    编程语言通用基础: 模块/包


    # 加载别人已经写好的代码集合: 白嫖真香
    
    # julia
    using CSV
    import CSV
    
    # R
    library(ggplot2)
    
    # python
    import os
    from Branch import m3
    
    # bash
    source something.sh
    
    # Perl
    use List::Util


    数据挖掘的基本数据类型


    矩阵?     列表?     字典?     数据框(DataFrame)!

        

    SepalLengthSepalWidthPetalLengthPetalWidthSpecies
    5.13.51.40.2setosa
    4.93.01.40.2setosa
    4.73.21.30.2setosa
    4.63.11.50.2setosa
    5.03.61.40.2setosa
    5.43.91.70.4setosa
    4.63.41.40.3setosa
    5.03.41.50.2setosa
    4.42.91.40.2setosa
    4.93.11.50.1setosa
    5.43.71.50.2setosa
    4.83.41.60.2setosa
    4.83.01.40.1setosa
    4.33.01.10.1setosa
    5.84.01.20.2setosa
    5.74.41.50.4setosa
    5.43.91.30.4setosa
    5.13.51.40.3setosa
    5.73.81.70.3setosa
    5.13.81.50.3setosa
    5.43.41.70.2setosa
    5.13.71.50.4setosa
    4.63.61.00.2setosa
    5.13.31.70.5setosa
    4.83.41.90.2setosa
    5.03.01.60.2setosa
    5.03.41.60.4setosa
    5.23.51.50.2setosa
    5.23.41.40.2setosa
    4.73.21.60.2setosa
    4.83.11.60.2setosa
    5.43.41.50.4setosa
    5.24.11.50.1setosa
    5.54.21.40.2setosa
    4.93.11.50.2setosa
    5.03.21.20.2setosa
    5.53.51.30.2setosa
    4.93.61.40.1setosa
    4.43.01.30.2setosa
    5.13.41.50.2setosa
    5.03.51.30.3setosa
    4.52.31.30.3setosa
    4.43.21.30.2setosa
    5.03.51.60.6setosa
    5.13.81.90.4setosa
    4.83.01.40.3setosa
    5.13.81.60.2setosa
    4.63.21.40.2setosa
    5.33.71.50.2setosa
    5.03.31.40.2setosa
    7.03.24.71.4versicolor
    6.43.24.51.5versicolor
    6.93.14.91.5versicolor
    5.52.34.01.3versicolor
    6.52.84.61.5versicolor
    5.72.84.51.3versicolor
    6.33.34.71.6versicolor
    4.92.43.31.0versicolor
    6.62.94.61.3versicolor
    5.22.73.91.4versicolor
    5.02.03.51.0versicolor
    5.93.04.21.5versicolor
    6.02.24.01.0versicolor
    6.12.94.71.4versicolor
    5.62.93.61.3versicolor
    6.73.14.41.4versicolor
    5.63.04.51.5versicolor
    5.82.74.11.0versicolor
    6.22.24.51.5versicolor
    5.62.53.91.1versicolor
    5.93.24.81.8versicolor
    6.12.84.01.3versicolor
    6.32.54.91.5versicolor
    6.12.84.71.2versicolor
    6.42.94.31.3versicolor
    6.63.04.41.4versicolor
    6.82.84.81.4versicolor
    6.73.05.01.7versicolor
    6.02.94.51.5versicolor
    5.72.63.51.0versicolor
    5.52.43.81.1versicolor
    5.52.43.71.0versicolor
    5.82.73.91.2versicolor
    6.02.75.11.6versicolor
    5.43.04.51.5versicolor
    6.03.44.51.6versicolor
    6.73.14.71.5versicolor
    6.32.34.41.3versicolor
    5.63.04.11.3versicolor
    5.52.54.01.3versicolor
    5.52.64.41.2versicolor
    6.13.04.61.4versicolor
    5.82.64.01.2versicolor
    5.02.33.31.0versicolor
    5.62.74.21.3versicolor
    5.73.04.21.2versicolor
    5.72.94.21.3versicolor
    6.22.94.31.3versicolor
    5.12.53.01.1versicolor
    5.72.84.11.3versicolor
    6.33.36.02.5virginica
    5.82.75.11.9virginica
    7.13.05.92.1virginica
    6.32.95.61.8virginica
    6.53.05.82.2virginica
    7.63.06.62.1virginica
    4.92.54.51.7virginica
    7.32.96.31.8virginica
    6.72.55.81.8virginica
    7.23.66.12.5virginica
    6.53.25.12.0virginica
    6.42.75.31.9virginica
    6.83.05.52.1virginica
    5.72.55.02.0virginica
    5.82.85.12.4virginica
    6.43.25.32.3virginica
    6.53.05.51.8virginica
    7.73.86.72.2virginica
    7.72.66.92.3virginica
    6.02.25.01.5virginica
    6.93.25.72.3virginica
    5.62.84.92.0virginica
    7.72.86.72.0virginica
    6.32.74.91.8virginica
    6.73.35.72.1virginica
    7.23.26.01.8virginica
    6.22.84.81.8virginica
    6.13.04.91.8virginica
    6.42.85.62.1virginica
    7.23.05.81.6virginica
    7.42.86.11.9virginica
    7.93.86.42.0virginica
    6.42.85.62.2virginica
    6.32.85.11.5virginica
    6.12.65.61.4virginica
    7.73.06.12.3virginica
    6.33.45.62.4virginica
    6.43.15.51.8virginica
    6.03.04.81.8virginica
    6.93.15.42.1virginica
    6.73.15.62.4virginica
    6.93.15.12.3virginica
    5.82.75.11.9virginica
    6.83.25.92.3virginica
    6.73.35.72.5virginica
    6.73.05.22.3virginica
    6.32.55.01.9virginica
    6.53.05.22.0virginica
    6.23.45.42.3virginica
    5.93.05.11.8virginica



    数据挖掘的基本数据类型


    # DataFrame概览
    julia> iris
    150×5 DataFrame
     Row │ SepalLength  SepalWidth  PetalLength  PetalWidth  Species   
         │ Float64      Float64     Float64      Float64     Cat…
    ─────┼─────────────────────────────────────────────────────────────
       1 │  5.1         3.5          1.4         0.2         setosa
       2 │  4.9         3.0          1.4         0.2         setosa
      ⋮ │  ⋮           ⋮           ⋮          ⋮           ⋮  
     149 │  6.2         3.4          5.4         2.3         virginica
     150 │  5.9         3.0          5.1         1.8         virginica
    
    # DataFrame基本操作
    
    iris[1, 2]       # df[row, col]
    iris[1, 2] = 0   # 赋值单元格
    iris.TEST = collect(repeat('A', nrow(iris))) # 添加新列
    iris[1:10, ["SepalLength", "Species"]]
    iris.Species     # df.ColName
    iris."Species"
    iris[:, "Species"]
    names(iris)
    size(iris)
    nrow(iris)
    ncol(iris)
    iris[iris.SepalLength .> 4, :]


    数据挖掘的基本思路

    "Split-Apply-Combine"策略

    数据挖掘的基本思路

    "Split-Apply-Combine"策略

    # DataFrame概览
    
    julia> iris
    150×5 DataFrame
     Row │ SepalLength  SepalWidth  PetalLength  PetalWidth  Species   
         │ Float64      Float64     Float64      Float64     Cat…
    ─────┼─────────────────────────────────────────────────────────────
       1 │  5.1         3.5          1.4         0.2         setosa
       2 │  4.9         3.0          1.4         0.2         setosa
      ⋮ │  ⋮           ⋮           ⋮          ⋮           ⋮  
     149 │  6.2         3.4          5.4         2.3         virginica
     150 │  5.9         3.0          5.1         1.8         virginica
    
    
    # 统计每个物种中PetalWidth平均值, 以及PetalLength的中位数
    
    using DataFrames, DataFramesMeta, Chain
    
    @chain iris begin
        groupby(:Species)
        @combine(
            :PetalWidthMean = mean(:PetalWidth),
            :PetalLengthMedian = median(:PetalLength))
    end
    
    # >>> Result:
    3×3 DataFrame
     Row │ Species     PetalWidthMean  PetalLengthMedian 
         │ Cat…        Float64         Float64
    ─────┼───────────────────────────────────────────────
       1 │ setosa      0.246           1.5
       2 │ versicolor  1.326           4.35
       3 │ virginica   2.026           5.55


    拓展学习资料推荐