精华内容
下载资源
问答
  • 数据结构与算法:数据结构概念(已完成迁移)

    千次阅读 多人点赞 2019-01-17 21:23:59
    导论:什么是数据结构:指的是一种外在的数据展示的形式。算法:计算的方法,可以理解为完成某一个过程中的执行思路。 一:基本概念 1.数据结构:对数据的一种存储和组织方式,相互之间存在一种或者多种特定关系的...
    导论:什么是数据结构:指的是一种外在的数据展示的形式。算法:计算的方法,可以理解为完成某一个过程中的执行思路。
    
    一:基本概念
        1.数据结构:对数据的一种存储和组织方式,相互之间存在一种或者多种特定关系的数据的集合。数据就是存储的
        有用的信息 数据元素:数据的基本单位,又称节点、元素
    
        2.数据整体结构:逻辑结构、存储结构、运算 三者构成数据完整结构
    二:数据结构分类:(清晰逻辑如下)

    根据逻辑结构:
    1.线性结构:表中各个节点具有线性关系:有一个开始节点和一个终端节点,所有节点做多只有一个直接前驱节点
    和一个直接后继节点,如:栈、队列、串等都是线性结构线性表:有且仅有一个开始节点,有且仅有一个直接后驱
    结点,有且只有一个终结结点,顺序存储的线性表叫做顺序表,链式存储的叫做链表
    
    2.非线性结构:各个节点之间具有多个对应关系:一个节点与多个直接前驱节点和直接后继节点:如数组、树结构
    数组多行多列,所以显示出非线性结构
    
      根据逻辑结构:
        1.线性结构:表中各个节点具有线性关系:有一个开始节点和一个终端节点,所有节点做多只有一个直接前驱节点
        和一个直接后继节点,如:栈、队列、串等都是线性结构线性表:有且仅有一个开始节点,有且仅有一个直接后驱
        结点,有且只有一个终结结点,顺序存储的线性表叫做顺序表,链式存储的叫做链表
    
        2.非线性结构:各个节点之间具有多个对应关系:一个节点与多个直接前驱节点和直接后继节点:如数组、树结构
        数组多行多列,所以显示出非线性结构
    
        根据存储方式:
        1.顺序存储:就是在一块连续的存储区域一个接一个的存放数据,顺序存储方式把逻辑上相邻的节点存储在物理位置上相邻的存储单元里,节点间的逻辑关系由存储单元的邻接关系体现。也叫作顺序存储结构,一般采用数组或者结构数组来描述。
        2.链式存储:不要求逻辑上相邻的节点在物理位置上相邻,节点间的逻辑关系由附加的引用字段表示,一个节点的引用字段指向下一个节点的存放位置,一般在原数据项中增加引用类型(地址)来表示节点间的位置关系
        3.索引存储:采用附加的索引表的方式来存储结点信息。索引表由索引项组成,一般形式为:(关键字、地址),关键字是能够标识一个结点的数据项。(set采用hash算法直接根据关键字算出存储地址,因此要重写hashcode方法)
        *稠密索引:每个结点在索引表中都有一个索引项,索引项的地址指示结点所在的存储位置
        *稀疏索引:一组结点在索引表中只对应一个索引项,索引项的地址指示一组结点的起始存储位置
        4.散列存储:根据结点的关键字直接计算出该结点的存储地址的一种存储方式(hash表)
    
    三:常用的数据结构
    
        1.数组(Array):是一种聚合数据类型,最基本的数据结构。可以有一维、二维以及多维等表现形式(顺序存储)
        2.栈(Stack):是一种特殊的线性表,遵循先进后出的原则,即只能从顶点进入和删除,用于重要数据现场保护
        3.队列:(Queue):特殊的线性表,只能在队头删除,队尾插入 操作
        4.链表(Linked List):按照链式存储结构进行存储,在物理上存在非连续的特点。链表结构中数据元素的逻辑顺序通过链表中的引用链接次序来实现.由一系列数据结点构成。每个数据结点又包含有数据域和引用域两部分。引用域保存了下一个元素保存的地址。
        5.树(Tree):典型非线性结构。
        6.堆(Heap):特殊的树形结构,二叉堆,特点是根节点的值要么是最大要么是最小,并且根节点的两个字数也是堆结构
        7.散列表(Hash):根据关键字T f(T)算出具体位置
    
    四:顺序表结构
        由于顺序表是一次存放的,只要知道了该顺序表的首地址以及每个数据元素所占用的存储长度,很容易计算出任何
        一个数据元素的位置(一般性,如果所有结点的类型相同,则每个结点所占用的存储空间大小也相同)
        顺序表具体实现:顺序表操作是基于数组实现,增删改查都是在数组上实现的,因为数组是可以看做是最基本的数
        据结构
    
    五:链表结构
        分为数据部分以及地址部分。数据部分保存实际数据,而地址部分保存的是下一个结点的地址,缺点:浪费存储空
        间,因为需要保存额外的引用,其次对于链表的访问只能从表头逐个查找,然后一个个往下找,不能像顺序表一样
        随机访问,链表有单链表、双向链表、单循环链表等
        链表具体表现形式:在类中用类的属性表示,用含有一个nextNode引用用来指向下一个元素,如:一个Node节点里
        面存储了一个对象,Flow(含有字段id,num),而Node{id,Flow(id,num)}就是这种格式
    
    六:栈
        只能在栈顶操作数据,按照“后进先出”的原则处理节点数据
    
    七:队列
        和栈的定义大体一致,只是运算规则有点不同,队列满足先进先出(FIFO),入队列是把数据加到最后一个结点,
        出队列就是取出第一个数据,并且进行删除操作,数据展现形式也是基于数组
    
    八:树
        1.树形用于描述线性结构所不能实现的结构,比如数据簇,以及多个后继结点等数据形式
    
        类型:
        二叉树:每个结点最多只有两个子结点,因为有左右之分,因此是有序树
        满二叉树:除了最下面一层外,其他的都有两个结点
        完全二叉树:除了最下面一层外,其他每个结点都有两个结点,并且最后一个结点按照从左到右的顺序连续存在
        存储方式:也有顺序存储以及链式存储,并且顺序存储也是基于数组实现,而链式存储也是采用引用,但是有两个引用,一个是左结点引用,一个是右
        结点引用。建议采用链式存储
        一般的数据结构都有顺序存储以及链式存储两种存储形式
    展开全文
  • 基于PaddleHelix完成RNA结构预测竞赛的前置基础知识一、化学与遗传学——从孟德尔的豌豆说起显性基因与隐性基因弱化学键弱键和强键决定大分子的结构核酸承载遗传信息——肺炎双球菌的转化实验二、RNA——初识核糖...

    在解决RNA结构预测这个世界级难题之前,首先要做的是搞懂分子生物学相关知识以及RNA的二级结构

    本文内容基于官方提供的RNA二级结构讲义:

    中国大学MOOC上武汉大学的分子生物学课程Molecular Biology:

    以及知网查阅的论文:

    我在以上四篇文献以及中国大学MOOC的课程基础上结合自己的理解对RNA的基础知识做了整理,欢迎各位读者一起交流讨论~

    一、化学与遗传学——从孟德尔的豌豆说起

    显性基因与隐性基因

    孟德尔从豌豆杂交实验结果,得出了相对性状中存在着显性基因和隐性基因的原理。

    基因概念是孟德尔在推想中提出来的,虽然当时他并没有提出“基因”这个科学名词。孟德尔认为遗传单位(基因)具有高度的稳定性,一个显性基因和它相对的隐性基因在一起的时候,彼此都具有稳定性,不会改变性质。

    弱化学键

    弱化学键对生物体至关重要,部分原因是因为弱化学键能在细胞的生理条件下形成和断裂,一个最简单的例子是DNA的复制,DNA的复制过程中,其两条链是要分开的,分开以后才能作为模板进行DNA复制,分开过程其实就是弱化学键氢键的断裂过程,在子代DNA合成过程中,氢键又会形成。

    弱键和强键决定大分子的结构

    • 分子间和分子内相互作用决定大分子高级结构
    • 氢键的排列方式决定蛋白质的特定构象
    • 大多数蛋白质由两个或三个结构域装配而成(不同的组合方式一不同的功能)
    • 弱化学键把蛋白质放在DNA和RNA的正确位置(序列或构象特异性)
    • 变构:通过改变蛋白质的形状调控其功能(通过结合配体或相互作用)
    • 不是所有蛋白质功能的调控都是通过变构进行的(募集作用)

    核酸承载遗传信息——肺炎双球菌的转化实验

    20世纪30年代,遗传学家就开始推测什么样的分子可能具有基因所需要的稳定性,同时又有为进化提供基础的长久的、突发的突变形式

    该实验证明了S型细菌中含有一种转化因子,将R型细菌转化成了S型细菌,当时得出的实验结论是DNA可能是关键的遗传物质。实际上,转化因子就是DNA,但是当时并没有提出DNA这个名词

    二、RNA——初识核糖核酸

    RNA的结构特征

    RNA和DNA一样,也是由各种核苷酸通过3′,5′-磷酸二酯键连接构成的多核苷酸链,但与DNA有一些差异。

    RNA与DNA的不同之处

    RNADNA
    核糖核糖2’脱氧核糖
    碱基尿嘧啶胸腺嘧啶
    结构多聚核苷酸单链多聚核苷酸双链

    RNA的生物学功能

    • RNA是某些病毒的遗传物质
    • RNA是从基因到蛋白质合成的媒介(mRNA)
    • RNA是mRNA上密码子与氨基酸的接头分子(tRNA)
    • RNA是一种调节分子(regulatory RNA )
    • RNA有结构功能,rRNA是核糖体的组成成分
    • 一些RNA在细胞中催化重要反应-(RNase P ribozyme, large rRNA, self-splicing introns)

    RNA的结构基础——碱基

    RNA的碱基主要有4种,即A(腺嘌呤)、G(鸟嘌呤)、C(胞嘧啶)、U(尿嘧啶),其中,U(尿嘧啶)取代了DNA中的T(胸腺嘧啶)。

    碱基的配对——一个碱基只能与另一个碱基配对

    典型碱基对有:

    • A-U
    • G-C
    • G-U



    RNA的表示结构

    RNA的结构可分为一级结构、二级结构和三级结构:

    • 一级结构:可以理解为遗传碱基对编码
    • 二级结构:RNA的平面表示
    • 三级结构:RNA的立体结构

    三、RNA的二级结构——RNA链自身折叠形成类似A-DNA的局部双螺旋

    RNA通常是单链的,除了双链外,它还具有多种形式的二级结构


    上面列举的是一些比较常见的二级结构,下面是由上面这三种二级结构衍生出来的二级结构

    假结

    假结是由不相邻的RNA片段碱基配对而形成的复杂结构


    Stem Loops (Hairpins)

    茎环一般至少有4个碱基

    Bulge Loops

    当结构一侧的基无法形成碱基对时会形成凸环

    Interior Loops

    当结构两侧的碱基无法形成碱基对时会生成内环

    Junctions (Multiloops)

    两个或两个以上的双绞合区绞合形成闭合结构

    Kissing Hairpins

    两个独立的茎环相互组合

    四、RNA二级结构的表示方法

    平面图形表示法

    平面图形表示法可以直观地看出RNA的结构

    [1]吴建英,王淑琴.RNA二级结构点括号图与CT文件表示法的相互转换算法研究[J].天津师范大学学报(自然科学版),2012,32(04):32-36.

    圆点图表示法

    由圆表示的二级结构的碱基对,为结构中每个碱基对绘制弧,通过索引对(i,j)描述碱基对,表示碱基顶点之间的链接,如果有任何弧交叉,则存在假结


    RNA二级结构平面图

    RNA二级结构平面图是另外一种比较常见的RNA二级结构表示方法,在这种表示方法中RNA 序列中碱基间的配对信息一目了然,各个基本组成构件也表现的十分清楚,常常作为效果图输出。

    螺旋区点阵图

    螺旋区点阵图,是指以数学坐标图的方式显示RNA二级结构的一种方法,设立一个数学坐标图,首先按照 RNA 的序列情况在坐标图中分别标记出横、纵坐标值,然后通过查找构成碱基配对的序列的坐标,就能把该 RNA 结构的碱基对在坐标图上施划出来;再通过一线与横、纵坐标各成 45°角的斜线,串过的全部碱基对,就可标出该 RNA 结构的茎区结构。

    点括号法

    点括号表示法就是用点和成对的括号来表示RNA的二级结构信息:

    • RNA序列中的未产生碱基互补配对的自由碱基用“.”表示
    • 而形成互补碱基对的两个碱基分别用一对“(”和“)”表示
    • 碱基对中相对靠近5’端的碱基用“("进行表示
    • 碱基对中相对靠近3’端的碱基用“)”进行表示

    [1]吴建英,王淑琴.RNA二级结构点括号图与CT文件表示法的相互转换算法研究[J].天津师范大学学报(自然科学版),2012,32(04):32-36.

    CT 文件表示法

    CT文件格式初步由ZuKerl提出,用于定义RNA二级结构和核苷酸序列,包含多个序列的多个子结构信息。在CT文件中,首行中整数N表示核苷酸序列的总长度,N在后面是预测二级结构得到的自由能和RNA分子的描述信息。
    CT文件中包含6列数据:

    • 第1列为索引信息;
    • 第2列表示RNA二级结构中从5 '端开始到3 '端结束的标题(A, U, G和C) ;
    • 第3列是与之相邻的前一个栅极的编号;
    • 第4列是与之相邻的后1个串联的编号;
    • 第5列表示是否存在与该字符串配对的串行,’ 0 ‘表示无配对字符串,非’ 0 '表示存在配对字符串,并且用数字n表示与配对的串联编号;
    • 第6列同第1列。

    [1]吴建英,王淑琴.RNA二级结构点括号图与CT文件表示法的相互转换算法研究[J].天津师范大学学报(自然科学版),2012,32(04):32-36.

    CT文件可以由RNA二级结构预测软件得到,被用于计算RNA之间的相似性及预测其类别

    五、RNA二级结构预测的主要方法

    Energy minimization

    • dynamic programming approach
    • does not require prior sequence alignment
    • require estimation of energy terms contributing to secondary structure

    Comparative sequence analysis

    • Using sequence alignment to find conserved residues and covariant base pairs. and covariant base pairs.
    • most trusted

    六、使用PaddleHelix-螺旋桨生物计算平台完成RNA二级结构预测

    螺旋桨PaddleHelix,是基于百度飞桨深度学习框架开发的生物计算工具和平台。 螺旋桨针对生信&计算机交叉学科的学习者、研究者和合作伙伴,提供一整套开源工具集和计算平台,支持构建针对新药研发、疫苗设计、精准医疗场景的技术方案。

    RNA二级结构预测包括一系列的线性时间RNA二级结构分析算法: LinearFold和LinearPartition

    LinearFold

    LinearFold能够在线性时间内预测RNA二级结构,在长序列RNA上的预测速度远远大于传统算法。其中,LinearFold能够将新冠病毒全基因组序列(约30,000 nt)二级结构预测时间从55分钟降低到27秒,速度提升120倍。

    同时LinearFold在预测精度上相比传统算法也有提升。尤其对于长序列RNA二级结构(如16S和23S rRNA二级结构)和长碱基对(相距500+ nt)预测上,LinearFold预测精度有显著地提升。

    LinearPartition

    2020年,百度再次发表世界最快RNA配分方程和碱基对概率预测算法LinearPartition。

    该算法功能更加强大,可以模拟RNA序列在平衡态时成千上万种不同结构的分布,并预测碱基对概率矩阵。LinearPartition算法同样被ISMB顶会接收并在Bioinformatics杂志上发表,论文链接请见:LinearPartition: linear-time approximation of RNA folding partition function and base-pairing probabilities

    在使用上述两种算法之前,我们需要安装PaddleHelix:

     !pip install paddlehelix
     from IPython.display import clear_output
     clear_output()
     print("安装成功")
    
        安装成功
    

    LinearFold调用

    机器学习模型

    linear_fold_c(rna_sequence, beam_size = 100, use_constraints = False, constraint = “”, no_sharp_turn = True)

    热力学模型

    linear_fold_v(rna_sequence, beam_size = 100, use_constraints = False, constraint = “”, no_sharp_turn = True)

    参数说明

    • rna_sequence: string, 需要预测结构的RNA sequence
    • beam_size: int (optional), 控制beam pruning size的参数,默认值为100。该参数越大,则预测速度越慢,而与精确搜索相比近似效果越好;
    • use_constraints: bool (optional), 在预测二级结构时增加约束条件, 默认值时False。为True时, constraint参数需要提供约束序列;
    • constraint: string (optional), 二级结构预测约束条件, 默认为空。当提供约束序列时, use_constraints参数需要设置为True。该约束须与输入的RNA序列长度相同,每个点位可以指定“? . ( )”四种符号中的一种,其中“?”表示该点位无限制,“.”表示该点位必须是unpaired,“(”与“)”表示该点位必须是paired。注意“(”与“)”必须数量相等,即相互匹配。具体操作请参考运行实例。
    • no_sharp_turn: bool (optional), 不允许在预测的hairpin结构中出现sharp turn, 默认为True。

    返回值

    • tuple(string, double): 返回一个二元组, 第一个位置是结构序列, 第二个位置是结构的folding free energy
    # 二级结构预测(无约束条件)
    import pahelix.toolkit.linear_rna as linear_rna
    input_sequence = "AACUCCGCCAGGCCUGGAAGGGAGCAACGGUAGUGACACUCUCUGUGUGCGUAGGUUGCCUAGCUACCAUUU"
    linear_rna.linear_fold_c(input_sequence)
    
        ('..((((.(((....)))...))))....((((((............................))))))....',
         0.4548597317188978)
    
    # 二级结构预测(有约束条件)
    constraint = "??(???(??????)?(????????)???(??????(???????)?)???????????)??.???????????"
    linear_rna.linear_fold_c(input_sequence, use_constraints = True, constraint = constraint)
    
        ('..(.(((......)((........))(((......(.......).))).....))..)..............',
         -27.328358240425587)
    

    LinearPartition调用

    机器学习模型

    linear_partition_c(rna_sequence, beam_size = 100, bp_cutoff = 0.0, no_sharpe_turn = True)

    热力学模型

    linear_partition_v(rna_sequence, beam_size = 100, bp_cutoff = 0.0, no_sharpe_turn = True)

    参数说明

    • rna_sequence: string, 需要计算配分函数和碱基对概率的RNA sequence
    • beam_size: int (optional), 控制beam pruning size的参数,默认值为100。该参数越大,则预测速度越慢,而与精确搜索相比近似效果越好;
    • bp_cutoff: double (optinal), 只输出概率大于等于bp_cutoff的碱基对及其概率, 0 <= pf_cutoff <= 1, 默认为0.0;
    • no_sharp_turn: bool (optional), 不允许在预测的hairpin结构中出现sharp turn, 默认为True。

    返回值

    • tuple(string, list): 返回一个二元组, 第一个位置是配分函数值, 第二个位置是存有碱基对及其概率的列表
    import pahelix.toolkit.linear_rna as linear_rna
    input_sequence = "UGAGUUCUCGAUCUCUAAAAUCG"
    UAAAAUCG"
    linear_rna.linear_partition_c(input_sequence, bp_cutoff = 0.2)
    
        (0.6399235725402832,
         [(4, 13, 0.2007114291191101),
          (10, 22, 0.24662047624588013),
          (11, 21, 0.24573349952697754),
          (12, 20, 0.2092728614807129)])
    

    如需运行代码,请前往AI Studio:

    七、螺旋桨RNA结构预测竞赛:Unpaired Probability Prediction

    核糖核酸(Ribonucleic Acid),简称RNA,在遗传编码、翻译、调控、基因表达等过程中发挥作用。RNA的核心功能可以分为两类:

    1. 传递遗传信息: 大多数生命体的遗传信息存在于DNA中,DNA通过转录生成RNA,同时也将遗传信息传递给RNA;RNA进一步翻译产生蛋白质,而蛋白质是遗传信息的终极载体。另有一类生命体,如新冠病毒这样的RNA病毒,它们没有DNA,RNA中直接存储了所有的遗传信息。
    2. 调控基因表达: 得益于非编码RNA(non-coding RNA)多种多样的作用,RNA的结构在基因表达的实现过程中发挥着至关重要的作用。

    在这里插入图片描述
    RNA序列由四种碱基组成,分别是腺嘌呤,胞嘧啶,鸟嘌呤和尿嘧啶。这四种碱基组成的序列就是RNA序列,也叫做RNA的一级结构。RNA序列在空间上会折叠、扭曲、形成特定的结构。我们把2D平面上由碱基配对形成的结构称之为RNA的二级结构,而将3D空间上形成的立体结构称之为RNA的三级结构。

    在这里插入图片描述
    2019年7月,百度研究院发表了第一个重磅成果:世界上最快的RNA二级结构预测算法LinearFold,相关论文被领域顶会ISMB 接收,并发表在权威杂志Bioinformatics上。LinearFold算法可将新冠病毒全基因组序列结构预测时间从55分钟缩短到27秒,分析速度提升近120倍。2020年1月31日,百度对外免费开放LinearFold算法平台,助力全球抗疫。

    2020年4月,百度研究院又发布了第二个重磅成果:世界上最快的RNA配分方程算法LinearPartition。相比于LinearFold,LinearPartition功能更强大,可用于更准确的描述RNA结构分布,因而在RNA基础研究和药物设计方面有更广泛的应用。以上两个算法在极大提高结构预测速度的同时,也提高了预测精度。如何在LinearFold和LinearPartition的基础上进一步提高结构预测精度,最终彻底解决RNA结构预测这个世界级难题,是一个值得探索的课题。

    本次竞赛旨在借助百度在RNA生物计算方向上的算法优势,通过百度大脑AI Studio平台,诚邀全球范围内计算生物、人工智能等领域从业者、爱好者和高等院校老师学生报名参赛,推动人工智能技术在生物计算上的技术应用。

    更多比赛说明请前往AI Studio查看:

    个人介绍

    北京联合大学 机器人学院 自动化专业 2018级 本科生 郑博培

    百度飞桨开发者技术专家 PPDE

    百度飞桨官方帮帮团、答疑团成员

    深圳柴火创客空间 认证会员

    百度大脑 智能对话训练师

    来AI Studio互粉吧~ 等你哦~ https://aistudio.baidu.com/aistudio/personalcenter/thirdview/147378

    欢迎大家fork喜欢评论三连,感兴趣的朋友也可互相关注一下啊~

    展开全文
  • 前言 现在越来越多的数据以json的格式进行存储,例如通过网络爬虫,那些异步存储的数据往往都是json类型的;再如企业数据库中的日志数据,也会以json的格式存放。前不久,一位网友就碰到了这个问题,手中Excel...

    前言


          现在越来越多的数据以json的格式进行存储,例如通过网络爬虫时,那些异步存储的数据往往都是json类型的;再如企业数据库中的日志数据,也会以json的格式存放。前不久,一位网友就碰到了这个问题,手中Excel存储的数据并不是标准化的结构数据,而是以json格式存储在Excel的每个单元格。那今天我们就来聊聊如何利用Python将半结构化的json数据转换成结构化数据

    简单的json格式

          其实json的格式与Python中的字典非常类似,数据放在大括号({})内,每一个元素都是键值对,元素之间以逗号隔开。我们都知道,在Python中,是可以将一个字典对象转换成数据框的,接下来我们就通过一个简单的例子慢慢进入复杂的环境。

    # 加载第三方包
    import pandas as pd # 数据处理包
    import numpy as np # 数值计算包
    import json # json文件转换包

    # 一个简单的json格式字符串
    string1 = '{"name":"Sim","gender":"Male","age":28,"province":"江苏"}'
    string2 = '{"name":"Lily","gender":"Feale","age":25,"province":"湖北"}'

    # 查看数据类型
    type(string)

    # 将json格式转换为字典
    dict1 = json.loads(string1) dict2 = json.loads(string2) type(dict1)

          上面构造的json数据实际上是字典型的字符串,可以直接通过json包中的loads函数完成由字符型到字典型的转化。那如何根据这两个字典,组装成一个2行3列的数据框呢?只需借助于pandas模块中的DataFrame函数即可:

    # 将字典数据转换为数据框
    pd.DataFrame([dict1,dict2])



    这里需要注意的是,上面的字典,是一个键仅对应一个值的情况,如果直接将dict1传递给DataFrame函数是会出错的,除非你指定索引值。所以,当你有两个及以上的这种字典时,你是可以传递给DataFrame函数的,但必须以可迭代的形式(如列表、元组、序列等)。还有一种字典,是一个键对应多个值,如果是这样的字典,就可以直接将字典扔给DataFrame函数形成数据框了:

    string =  '{"name":["Sim","Lily"],"gender":["Male","Feale"],\
                "age":[28,25],"province":["江苏","湖北"]}'

    # 转换为数据框            
    pd.DataFrame(json.loads(string))


    尽管这样完成了一个字典到数据框的转换,但千万注意,如果一个字典的键包含多个值,那一定要保证所有键对应的值个数一致!OK,了解了这个基础知识点后,我们来两个案例,加深一下对知识点的理解。

    经典案例一

          先来看一下Excel表中存储的数据格式,现在的问题是,如何将表中UserBasic一列拆解出来,即所有键值对转换成变量名和观测值。


    data1 = pd.read_excel(r'C:\Users\Administrator\Desktop\data1.xlsx')
    data1.head()
    
    data1.UserBasic[0]



    从上面的反馈结果来看,表中UserBasic字段的单元格存储的json字符串都是一个键仅对应一个值,这跟上面介绍的string1和string2是一致的,故如果需要转换成数据框的话,需要将这些转换的字典存放到列表中。具体操作如下:

    # UserBasic列中的信息拆分到各个变量中
    basic = []for i in data1.UserBasic:    basic.append(json.loads(i)) UserBasic = pd.DataFrame(basic) UserBasic.head()



    上面通过循环的方式将UserBasic字段的每一行解析成字典,并保存到列表中,最后通过DataFrame函数完成数据框的转换。接下来需要将拆分出来的这列,与原始表中的Id变量,Mobile变量整合到一起

    # 数据整合到一起
    final_data = pd.concat([data1[['Id','Mobile']],UserBasic], axis = 1) final_data.head()



    效果呈现还是蛮好的,但是有一点不好的是,通过for循环来完成毕竟不是高效的,如果数据量特别大,上百万行的话,那就得循环执行上百万次,会耗很多时间。这里我们借助于apply方法,避免显式的循环:

    # 避免循环的方式
    trans_data = pd.DataFrame(data1.UserBasic.apply(json.loads))
    # 数据整合到一起
    final_data = pd.concat([data1[['Id','Mobile']],trans_data], axis = 1)

    经典案例二

          我们接着看第二个例子,原始数据如下图所示,现在的问题是解析字段CellBehaviorData的同时,还要做一次聚合操作(每个用户ID近3个月的消费平均水平)。


    # 读取数据
    data2 = pd.read_excel(r'C:\Users\Administrator\Desktop\data2.xlsx')

    # 查看字段CellBehaviorData第一行的信息
    data2.CellBehaviorData[0]



    细心的你一定发现了个问题,这个字符串的起始和结尾并不是大括号({}),而是中括号([]),故接下来要做的第一件事就是去除这两个中括号;另一方面,behavior键对应的值是列表,而且列表中还有多个相同的键,如sms_cnt、cell_phone_num等。这样的json最后形成的数据框一定是多行的,即表中一个单元格会就可以转换成多行的数据框。不妨,我们先来看一下变量CellBehaviorData第一行形成是数据框张啥样:

    # 通过切片的方式去除首尾的中括号
    s = data2.CellBehaviorData[0][1:-1]
    # 将字符串转换成字典,并取出behavior键
    d = json.loads(s)['behavior']
    # 将字典转换为数据框
    df = pd.DataFrame(d) df



    这就是一行观测产生的多行数据框,现在的问题是如何将多行的数据框与每一个Id配对上。我们发现字典中除了behavior键,还有phone_num键,而且该键的值是唯一的,正好与上面数据框的cell_phone_num变量匹配。所以,待会做数据关联的时候,就使用phone_num变量和cell_phone_num变量。

    # 取出phone_num
    phone_num = [i['phone_num'] for i in data2.CellBehaviorData.str[1:-1].apply(json.loads)]

    # 取出CellBehaviorData字段,并解析为数据框
    df = pd.concat([pd.DataFrame(j) for j in [i['behavior'] for i in data2.CellBehaviorData.str[1:-1].apply(json.loads)]])# 将Id与手机号捆绑user = pd.concat([pd.Series(phone_num,name = 'phone_num'), data2.Id], axis = 1)

    # 以手机号作为数据的关联关联
    final_data = pd.merge(df, user, left_on = 'cell_phone_num', right_on='phone_num') final_data.head()

    # 查看数据类型
    final_data.dtypes



    为了速度的提升,上面使用了apply技术和列表解析式的技巧将json数据拆解成数据框,同时,发现除Id变量的其他变量类型都是字符串型,需要对数值变量进行转换,因为接下来还要做聚合操作:

    # 挑选需要转换类型的变量名称
    vars = ['call_cnt','call_in_cnt','call_in_time','call_out_cnt','call_out_time','net_flow','sms_cnt','total_amount']

    # 对以上变量进行数据类型转换
    df_convert = final_data[vars].apply(lambda x: x.astype('float'))

    # 从新完成数据合并
    final_data2 = pd.concat([df_convert, final_data.loc[:,~final_data.columns.isin(vars)]], axis = 1)

    # 对每个id计算近三个月的平均指标值
    stats = final_data2.loc[final_data2.cell_mth.isin(['2017-08','2017-07','2017-06']),:].groupby('Id').aggregate(np.mean) stats


     

    大功告成,这种类型的数据我们就可以游刃有余的完成转换。但如果CellBehaviorData字段不含有phone_num(键)变量的话如何实现数据关联呢?这里把解决方案的代码呈现出来:

    # 构造空列表,存放CellBehaviorData变量每一行形成的数据框
    final_data = []

    # 使用zip函数捆绑两列,并使用for循环
    for Id,CellBehaviorData in zip(data2.Id, data2.CellBehaviorData):    
       # 组装数据框    mydf = pd.DataFrame(json.loads(CellBehaviorData[1:-1])['behavior'])
       # 将数据框与变量Id组装起来    final_data.append(pd.concat([pd.Series(np.repeat(Id,mydf.shape[0]), name = 'Id'),mydf], axis = 1))
    #这个地方写点自己看作者文档遇到的一些困难, 主要是repeat函数的用法np.repeat(Id,mydf.shape[0])表示的就是取Id的值然后复制mydf.shape[0]次
    # 构造最终的数据框    
    final_data = pd.concat(final_data)# 数据类型转换

    # 挑选需要转换类型的变量名称
    vars = ['call_cnt','call_in_cnt','call_in_time','call_out_cnt','call_out_time','net_flow','sms_cnt','total_amount']
    # 对以上变量进行数据类型转换
    df_convert = final_data[vars].apply(lambda x: x.astype('float'))

    # 从新完成数据合并
    final_data2 = pd.concat([df_convert, final_data.loc[:,~final_data.columns.isin(vars)]], axis = 1) final_data2

    # 对每个id计算近三个月的平均指标值
    stats = final_data2.loc[final_data2.cell_mth.isin(['2017-08','2017-07','2017-06']),:].groupby('Id').aggregate(np.mean) stats

          虽然通过上面的方法可以实现数据的关联和匹配,但个人觉得并不是很理想,因为这里毕竟使用了for循环,一旦数据量大的话,执行起来会比较缓慢,如果高人,还请指点。

    结语


          OK,今天关于半结构化的json数据转数据框的分享就介绍到到这里,希望本篇文章对各位网友有一定的帮助。如果你有任何问题,欢迎在公众号的留言区域表达你的疑问。欢迎各位朋友继续转发与分享文中的内容,让更多的朋友学习和进步。有关文中的脚本和数据可至下方的链接获取,再次感谢网友对我的关注和支持。

    关注“每天进步一点点2015

    相关材料下载链接

    链接: https://pan.baidu.com/s/1kVzNnFp 密码: tdkm

    展开全文
  • 现在完成时

    千次阅读 2006-07-18 08:46:00
    现在完成时结构和句式 学习现在完成时,先从结构和句式开始: 构成:主语 + have/has + 过去分词 + 其他。(当主语是第三人称单数用has,其余人称用have。过去分词:规则动词的过去分词构成与动词过去式相同;不...

      现在完成时表示过去发生或已经完成的动作对现在造成的影响或结果,也可表示过去已经开始,一直延续到现在的动作或状态。

    现在完成时的结构和句式

          学习现在完成时,先从结构和句式开始:
      构成:主语 + have/has + 过去分词 + 其他。(当主语是第三人称单数时用has,其余人称用have。过去分词:规则动词的过去分词构成与动词过去式相同;不规则动词需要特殊记忆。)
      否定式:主语 + haven't/hasn't + 过去分词 + 其他。
      疑问式: Have /Has + 主语 + 过去分词 + 其他?
      简略答语: Yes,主语 + have/has.(肯定)
           No,主语 + haven't/hasn't.(否定)

    以already, just和yet为标志

      already,just和yet 表示到现在为止动作或状态已经、刚刚或还没有发生。
         
    He has already got her help. 他已得到她的帮助。
          He has just seen the film. 他刚刚看过这场电影。
          He hasn't come back yet. 他还没有回来。

    以ever和never为标志

      ever和never 表示到现在为止动作或状态曾经或从来没有发生过。

         This is the best film I have ever seen. 这是我曾经看过的最好的一部电影。

         He has never been to Beijing. 他从没有到过北京。

    以动作发生的次数为标志

      若某一动作到现在为止已经发生了若干次,则要使用现在完成时。

          He says he has been to the USA three times. 他说他已经去过美国三次了。

    以so far为标志

      so far往往表示到目前为止动作或状态已经发生。

         He has got to Beijing so far. 到目前为止他已到了北京。

         She has passed the examso far. 到目前为止她已经通过了考试。
         过去已经开始的动作一直延续到现在,甚至有可能继续延续下去,我们可以从动作“延续”的特性和“时间”点段的区分入手,进一步学习现在完成时。

    “终止”、“延续”要转换

      英语中的动词从词义上可以分为延续性和非延续性两种,在现在完成时态中一定要注意动词这一特性,应将这类非延续性动词转换为延续性动词。如:
        
    “The cat play” has been on for half an hour. 《猫》已经开演半个小时了。
          How long have you had this dictionary? 这本字典你买了多久了?

      初中阶段常见的有:come-be,go out -be out,leave-be away (from),begin-be on,buy-have,borrow-keep,join-be a member / 介词短语,die-be dead,become-be,open(v.)-be open(adj.) 等。

    时间“点”、“段”须分清

      过去开始的动作可以延续到某一点结束,也可能继续延续,这时就要根据时间“点”、“段”选择相应的介词for或since。如:
         
    He has been away for two years. 他已走了两年。(for+时间段)
         
    He has been an English teacher since 1992. 自从1992年以来他一直当英语教师。(since+过去某一时刻)

    动词的过去分词形式

    通常一个动词的过去分词和他的过去式是一样的,在动词后面加ed构成过去分词,但是有一些动词的过去分词有不规则的形式。
    be--been go--gone come--come run--run swim--swum fly--flown see--seen  speak--spoken do--done give--given ide--hidden become--beco****ke--taken get--gotten / got break--broken shake--shaken wake--waken awake--awaken rise--risen lay--lain fall--fallen begin--begun know--known forget--forgotten write--written choose--chosen drink--drunk eat--eaten bite--bitten show--shown 
     
    She has forgotten her name. She has amnesia.
    她已经忘记了自己的名字。她有健忘症。
    I have already drunk the coffee.
    我已经喝过咖啡了。
    They have gone to see the President.
    他们已经去见校长了。
    She has come to see you.
    她来看过你了。

    现在完成时用的否定式和疑问式

    现在完成时用not来表达否定形式。当有not出现的时候,have可以和not组成缩写,但是此时不能和前面的代名词组成缩写。She hasn't spoken to him. 她还没和他说过话。

    提问的时候,have需要被提到句首。
    Have you seen Matthew? 你见过马休了么?

    简单过去时和现在完成时

          简单过去时和现在完成时在一定程度上有共同之处,当然事实上两者之间有本质区别。当需要指明过去一个特定的时刻发生的事情时,需要使用简单过去式。 He finished three days ago. 他三天前做完了工作。They finished a long time ago. 他们老早就完成工作了。

    现在完成时和一般过去时

          当没有特定指明的时间,现在完成时和一般过去时都可以使用。 I have already finished. 我早就完工了。 I already finished. 我早就完工了。

          一般过去时比现在完成时更能表达事情的结果。 John has taught math for twenty years. 约翰已经教了20年的数学。 John taught math for twenty years. 约翰教了20年数学。
      在上面的句子中,第一句保留了约翰继续教数学的可能性。第二句表明约翰已经不再教数学了,他可能退休了,换工作了,或者去世了。
          Steve and Carol have eaten at that restaurant twice. They really like it.史蒂文和卡洛尔已经在那家饭店吃过两次饭了。他们真的喜欢那里。
          Steve and Carol ate at that restaurant twice. 史蒂文和卡洛尔两次在那家饭店吃饭。
    果一件事情发生在过去并且延续到说话的这个时刻,就需要使用现在完成时。
    They have lived here for a long time.
    他们在这里已经生活了很长一段时间。
    She has been in Australia for two years.
    她到澳大利亚已经两年了。 
    We have studied for 5 hours straight.
    我们已经连续学习了5个小时。 
    Tim has waited for 30 minutes.
    蒂姆已经等了30分钟了。
    下面的句子包含了“动作在过去发生并且已经结束”的含义。     

       They lived here for a long time.
      他们在这里住了很长一段时间 
      Melissa waited for 30 minutes.
      梅丽莎等了30分钟。
      通常当句子里有since时我们使用现在完成时。
      We have lived here since June.
      我们从六月份开始就住在这里。
      She has been in China since last month.
      她从上个月起就在中国了。
    当现在完成时前有might时,就算主格是第三人称单数形式,我们还是使用have的动词原型形式。 She might have forgotten to lock the door. 她可能忘记了关门。He might have given the painting to someone. 他可能已经把画给别人了。
    Should、could、must没有简单过去时.他们用现在完成时来表达过去的状态。
    He should have told you earlier.
    他应该早点告诉你的。
    I should have tried harder.
    我应该更努力的。 
    She could have been nicer.
    她可以做得更好的。 
    You must have seen him.
    你一定已经见过他了。
      

    现在完成时和一般过去时的区别

    一、现在完成时一般不与表示过去某具体时间的词语搭配使用;一般过去时常常与过去的某个具体时间搭配使用。
    如:I went home at 10:00 yesterday.
           I have got home now.

    二、现在完成时--ever和never
      ever和never常用于现在完成时,放在过去分词前面;表示“经历”。ever表示“曾经”,never表示“从不”;not ever=never。现在完成时--ever和never。ever多用于疑问句,never一般用于否定句;
    例句:Have you ever been to Japan?(你去过日本吗?)I have never been to Japan.(我从未去过日本。)

    三、现在完成时一般疑问句的回答
      现在完成时的结构是:“have/has + 过去分词”,这里have是助动词,因此,现在完成时的一般疑问句的结构是:Have/Has +主语+过去分词?

    四、现在完成时一般疑问句的回答
      简要回答这类疑问句时结构为:Yes, 主语+have/has. No, 主语+haven’t/ hasn’t.
    为了进一步说明,常常再加一句一般过去时的句子,如:A:Have you been to Shanghai?
        B: Yes, I have. I went there last year.
    have been / have gone
    have been to…表示“去过某地”(表示过去的经历,现在已经回来)
    have gone to…表示“去了某地”(表示出去了,还没有回来)

    展开全文
  • 利用栈完成数制转换,能够完成十进制向八进制的转换 C++ 这里我采用栈的顺序存储结构 Source Code #include <stdio.h> #include <malloc.h> #define MaxSize 100 typedef int ElemType; ...
  • //设置树样式 $(".treeFatherK").css({"margin-left":"30px","border-bottom":"0px solid #D0D0D0"}); $(".treeFatherV").css({"margin-left":"30px","display":"none"}); $("#topicpanel div").css({...
  • 章四 软件体系结构形式化描述

    千次阅读 2007-01-05 01:37:00
    章四 软件体系结构形式化描述一、软件体系结构形式化描述的方法1、随着软件系统规模和复杂性的不断增大,软件设计的核心已从“算法+数据结构=程序”的传统计算模式转向系统的总体结构,即软件体系结构的设计和...
  • 最近在做相关的作业,看到三种组织结构形式,就记录一下。 首先,组织的定义是什么? 美国的管理学家巴纳德认为,由于生理上的、心理上的、物质的、社会的限制,人们为了达到个人的和共同的目标就必须合作,于是...
  • 数据结构 - 逻辑结构和存储结构

    万次阅读 2017-10-15 22:18:18
    程序=算法+数据结构 N.沃思(Niklaus Wirth)教授提出:  程序=算法+数据结构  以上公式说明了如下两个问题:  (1)算法决定如何构造和组织数据(算法→数据结构)。  (2)算法的选择依赖于作为基础的...
  • 结构 非常得类似我们之前讲到过的树结构,但前者没有很多的从属关系,更多的是各个数据之间的相关联系。在数学的概念中,后者是前者的一种,不过在数据结构中我们还是认为两者有所区别,尽管如此,我们在学习图...
  • 所谓结构样式分离,是指在实现网页,不要将html与CSS外观混在一起考虑,而是先考虑html结构完成,再用CSS进行布局。例如要实现如下一个微博发言框, 如果先从CSS进行考虑的话,我们第一直觉是将发言框分为...
  • 最近学习了python语言的循环结构,与其他语言不同...为了练习理解这两种循环结构,试着完成4种九九乘法表的制作,是哪4种? 算法并不复杂,普通九九乘法表需要套用两次循环,一层循环控制行,另一层循环来控制列,
  • 数据结构分别为逻辑结构、(存储)物理结构和数据的运算三个部分。 为什么要学数据结构? 首先,因为数据结构作为计算机专业的专业基础课程,是计算机考研的必考科目之一,如果打算报考计算机专业的研究生,你...
  • 什么是拓扑结构_拓扑结构

    万次阅读 多人点赞 2018-09-09 09:17:01
     首先我们来解释一下拓扑的含义,所谓“拓扑”就是把实体抽象成与其大小、形状无关的“点”,而把连接实体的线路抽象成“线”,进而以图的形式来表示这些点与线之间关系的方法,其目的在于研究这些点、线之间的相连...
  • 存储方式上:链表形式,数组, 数据结构分别为逻辑结构、存储结构(物理结构) 逻辑结构又分为四类基本结构: 集合、线性结构、树形结构、图状结构(网状结构) 集合、线性结构??这两项有何区别?? ...
  • 数据结构与算法必知基础知识

    千次阅读 多人点赞 2021-01-06 22:58:12
    数据结构与算法是程序员内功体现的重要标准之一,且数据结构也应用在各个方面,业界更有程序=数据结构+算法这个等式存在。各个中间件开发者,架构师他们都在努力的优化中间件、项目结构以及算法提高运行效率和降低...
  • IO子系统的层次结构

    千次阅读 多人点赞 2016-10-22 14:30:54
    将IO需要完成的功能组织成一系列的层次结构,每一层利用下一层提供的服务。每层完成的是一个子功能,并向上层提供服务接口。这些特征基本上都是层次系统通用的特性,不必多说。IO系统分类的层次通常是5层。列举如下...
  • 结构化设计

    千次阅读 2018-06-19 15:12:28
    1、结构化设计是将结构化分析得到的数据流图映射成软件结构的一种设计方法 强调模块化、自顶向下逐步求精、信息隐蔽、高内聚低耦合等设计准则 2、结构化设计的内容 结构设计—概要设计 结构图(Structure Chart) ...
  • 初识数据结构

    千次阅读 2017-08-18 18:01:56
    一、 基本概念 1、数据: 描述客观事物的符号,是计算机中可以操作的对象,能被计算机识别,并输入给计算机处理的符号集合...二、数据结构形式 数据结构是相互之间存在的一种或多种特定关系的数据元素的集合。数据结
  • 本文是[数据结构基础系列(7):图]中第4课时[图的邻接矩阵存储结构及算法]和第5课时[图的邻接表存储结构及算法],并为后续内容的实践提供支持。 图的存储结构主要包括邻接矩阵和邻接表,本算法库提供存储结构的定义...
  • Angular项目目录结构详解

    万次阅读 多人点赞 2017-05-05 11:34:39
    在上一篇博客中我们已经通过Angular CLI命令行工具创建出来一个全新的Angular项目,要想写项目,首先我们要先搞清楚项目的目录结构是怎样的,每个文件又有什么意义,文件中的代码又起到什么作用。
  • Oracle数据库的体系结构包括四个方面:数据库的物理结构、逻辑结构、内存结构及进程。  1. 物理结构   物理数据库结构是由构成数据库的操作系统文件所决定,Oracle数据库文件包括:  1.1.数据文件(Data File) ...
  • 软件体系结构基础

    千次阅读 2020-12-27 12:57:33
    体系结构的模式选择设计模式做阐述,风格选择典型的三种体系结构风格做阐述,框架选择MVC、J2EE、PCMEF与PCBMER框架做阐述,同时也对特定领域的软件体系结构的类属模型、参考模型,分布式系统结构的多处理机结构、...
  • 计算机系统结构总复习

    万次阅读 多人点赞 2019-01-08 08:27:31
    计算机系统结构基础及并行性的开发 计算机系统的层次结构 通用计算机系统可以被可以被看出是按机器级划分的多层机器级组成的层次结构。 语言应用机器级 高级语言 汇编 操作系统 传统机器语言 微程序机器级 机器:...
  • 常见结构化存储系统架构

    千次阅读 2019-03-01 22:39:24
    结构化数据:一般结构化数据以外的数据,这些数据不存储在数据库中,而是以各种类型的文本形式存放,其中Web上的一些数据(内嵌于HTML或XML标记中)又具有一定的逻辑结构和物理结构,被称为半结构数据。...
  • 结构是一种非常常见的数据结构,并且在很多场景下也被用到。其实栈结构跟数组结构很像,只是在数组的基础上,对栈结构做了一些限制,本文我们将对其进行详细的介绍。 先点赞,再看博客,顺手可以点个关注。 微信...
  • 常用数据结构--线性结构

    万次阅读 多人点赞 2012-04-27 00:20:14
    数据结构是计算机存储、组织数据的方式。常见的数据结构分类方式如下图: 常用的线性结构有:线性表,栈,队列,循环队列,数组。线性表中包括顺序表、链表等,其中,栈和队列只是属于逻辑上的概念,实际中不...
  • 冯诺依曼结构概述

    千次阅读 多人点赞 2019-10-10 17:08:40
    冯诺依曼体系结构概述1.冯诺依曼结构简介2.冯诺依曼结构的特点3.冯诺依曼结构的组成5.冯诺依曼结构的作用 1.冯诺依曼结构简介 冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的...
  • 冯诺依曼计算机体系结构

    万次阅读 2019-02-22 14:30:52
    当前计算机主要是基于冯诺依曼体系结构设计的,下面就简单分析一下冯诺依曼体系结构的计算机是如何工作的,首先下面的图就是冯诺依曼体系结构图。 主要由五大部件组成: 1.存储器用来存放数据和程序 2.运算器主要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 843,478
精华内容 337,391
关键字:

一般完成时的结构形式