python读取fasta序列,

  python读取fasta序列,

  作为一种编程语言,Python在可读性和可维护性方面有其独特的优势。越来越多的人使用Python进行数据分析和处理。Pandas旨在解决数据分析的任务。它包含了大量可以轻松处理数据的函数和方法,是Python成为强大高效的数据分析环境的重要因素之一。

  但是熊猫是内存的类库,处理小数据(放入内存)没有问题,对于大数据(放入内存)不是很方便。在日常工作中,我们经常会遇到这样的大文件(从数据库或者网站下载的数据),但是熊猫却无能为力,只能自己想办法。我们将讨论这个问题。

  本文所指的大数据并不是需要TB或PB分布式处理的大数据,而是普通PC无法加载到内存中,但GB文件数据可以存在于硬盘中。

  因为这些文件无法一次性读入内存,所以在处理数据时,通常需要逐行或逐块读取。虽然Python和熊猫在读取文件时都支持这种方法,但是因为没有光标系统,所以有些函数和方法必须单独使用,或者函数和方法本身必须自己写代码。这里介绍一些常见问题,并写代码示例供读者参考。

  一.聚合

  在简单集约中,只需要遍历一次数据,根据集约目标计算一次集约列。例如,sum包括数据遍历期间读取的数据;在计数和遍历数据的情况下,只需记录遍历次数即可;意思是扫描时,同时记录累计次数和扫描次数,最后除以。以这里的问题为例来介绍一下。

  这些文件包括:数据段如下所示。

  现在你需要计算总销售额。(金额栏))。

  (1)逐行阅读

  总计=0

  withopen(Orders.txt,)r))作为f:

  line=f.readline())

  虽然正确:

  line=f.readline())

  如果不行:

  黑色

  total=float(line.split ) (t)))

  是打印(总计)

  打开文件

  标题行

  逐行阅读

  在你理解内容之前结束。

  累积加法

  (二)熊猫阻断引线

  熊猫可以用来阅读积木。工作逻辑的结构如下图所示。

  进口熊猫作为pd

  chunk _ data=PD . read _ CSV(orders . txt)、sep=\t 、chunksize=100000))

  总计=0

  对于chunk_data中的块:

  total=chunk[金额]。总和(

  是打印(总计)

  一步一步读文件,每一行十万行。

  每个细分市场的累计销售额

  熊猫擅长计算更长的线段。理论上,chunksize越大,计算速度越快,但请注意内存限制。不建议使用熊猫逐行读取文件,因为将“chunksize”设置为1会导致逐行读取,非常慢。

  二。过滤

  过滤器流程图:

  和过滤聚合一样,把一个大文件分成N段,过滤每一段,最后合并每一段的结果。

  以上述数据为例,继续筛选纽约州的销售信息。

  (A)小结果集

  进口熊猫作为pd

  chunk _ data=PD . read _ CSV(orders . txt)、sep=\t 、chunksize=100000))

  chunk_list=[]

  对于chunk_data中的块:

  chunk _ list . append(chunk[chunk . state== new York )

  RES=PD.concat(chunk_list))。

  是,打印(分辨率)

  定义一个空列表来保存结果。

  分段滤波

  结果合并

  (B)大结果集

  进口熊猫作为pd

  chunk _ data=PD . read _ CSV(orders . txt)、sep=\t 、chunksize=100000))

  n=0

  对于chunk_data中的块:

  need _ data=chunk[chunk . state== new York ]

  如果n==0:

  need _ data . to _ CSV(orders _ filter . txt)(index=None))))))))))))))))))).

  n=1

  否则:

  n

  eed _ data . to _ CSV( orders _ filter . txt ,index=None,mode=a ,header=None)

  第一段,写文件,保留头,但不保留索引。

  其他数据段、标题和索引不会通过额外写入来保留。

  大文件聚合和过滤操作的逻辑相对简单,但是因为Python不直接提供游标数据类型,代码要写很多行。

  第三,排序

  顺序流程图:

  排序就麻烦多了,如上图所示:

  1、分段读取数据;

  2.对每个段落进行排序;

  3.将每段的排序结果写出到一个临时文件中;

  4.维护一个k元素的列表(k等于段数),每个临时文件放一行数据到列表中;

  5.对列表中记录的已排序字段进行排序(同第二步,升序为升序,降序为降序);

  6.将列表的最小或最大记录写出到结果文件中(最小按升序,最大按降序);

  7.从写入记录的临时文件中读取另一行,并将其放入列表中;

  8.重复步骤6.7,直到所有记录都写入结果文件。

  以上述数据为例,用Python写一个完整的外存排序算法,将文件中的数据按订单金额升序排序。

  进口熊猫作为pd

  导入操作系统

  导入时间

  导入技能

  导入uuid

  导入追溯

  定义解析类型:

  if s.isdigit():

  返回整数

  尝试:

  res=浮点数

  返回资源

  除了:

  返回s

  定义位置_由(由,主管,部门):

  by_num=0

  对于head.split中的列(sep):

  if col.strip()==by:

  破裂

  否则:

  by_num=1

  退货数量

  def merge_sort(directory,ofile,by,ascending=True,sep=,):

  使用open(ofile, w )作为outfile:

  file_list=os.listdir(目录)

  file _ chunk=[open(directory / file, r )for file _ list]

  k_row=[file_chunk[i]。readline()for I in range(len(file _ chunk))]

  by=pos_by(by,k_row[0],sep)

  outfile.write(k_row[0])

  k_row=[file_chunk[i]。readline()for I in range(len(file _ chunk))]

  k_by=[parse_type(k_row[i])。split(sep)[by]。strip())for I in range(len(file _ chunk))]

  用open(ofile, a )作为outfile:

  虽然正确:

  对于范围内的I(len(k _ by)):

  如果i=len(k_by):

  破裂

  如果升序,sorted_k_by=sorted(k_by ),否则sorted(k_by,reverse=True)

  if k_by[i]==sorted_k_by[0]:

  outfile.write(k_row[i])

  k_row[i]=file_chunk[i]。读取线()

  如果不是k_row[i]:

  file_chunk[i]。关闭()

  del(文件块[i])

  del(k_row[i])

  del(k_by[i])

  否则:

  k_by[i]=parse_type(k_row[i])。split(sep)[by]。strip())

  如果len(k_by)==0:

  破裂

  def external_sort(file_path,by,of file,tmp_dir,ascending=True,chunksize=50000,sep=,,usecols=None,index_col=None):

  os.makedirs(tmp_dir,exist_ok=True)

  尝试:

  data _ chunk=PD . read _ CSV(file _ path,sep=sep,usecols=usecols,index_col=index_col,chunksize=chunksize)

  对于data_chunk中的块:

  chunk=chunk.sort_values(by,ascending=ascending)

  chunk . to _ CSV(tmp _ dir / chunk str(int(time . time()* 10 * * 7))str(uuid . uuid 4())。csv ,索引=无,sep=sep)

  merge_sort(tmp_dir,ofile=ofile,by=by,ascending=ascending,sep=sep)

  例外情况除外:

  print(traceback.format_exc())

  最后:

  shutil.rmtree(tmp_dir,ignore_errors=True)

  if __name__==__main__ :

  infile= D:/python _ question _ data/orders . txt

  ofile= D:/python _ question _ data/extra _ sort _ RES _ py . txt

  tmp= D:/python _ question _ data/tmp

  external_sort(infile, amount ,ofile,tmp,ascending=True,chunksize=1000000,sep=\t )

  功能

  分析字符串的数据类型。

  功能

  计算标题中要排序的列名的位置。

  功能

  外部存储合并排序

  列出临时文件

  打开临时文件

  读取标题

  计算标题中要排序的列的位置。

  写出标题

  读课文的第一行。

  维护k个元素的列表并存储k个排序的列值。

  按升序排序和维护列表,按降序反转。

  写出最小值对应的行。

  阅读文档并处理文档。

  如果您还没有读完文档

  更新列表周期计算

  所有文件看完了。

  功能

  外部存储器分类

  创建一个临时文件目录

  读取要排序的分段文件。

  分段排序

  按顺序写文件。

  外部存储合并排序

  删除临时目录

  主程序

  调用外部存储器排序函数

  在这里,外部存储器排序是通过合并和逐行写入来完成的。因为熊猫逐行读取的效率很低,所以熊猫没有办法逐行合并排序。如果读者有兴趣,可以尝试用熊猫分块合并,比较一下效率。

  相比聚合和过滤,这段代码相当复杂,对于很多非专业程序员来说是不可能完成的任务,运行效率也不高。

  上面的代码只处理标准化的结构化文件和单列排序。如果文件结构不规范,比如没有表头,每行分隔符个数不同,排序列的日期格式不规范或者按多列排序,代码会进一步复杂化。

  四。分组

  大文件分组汇总也很麻烦。一种简单的方法是首先通过对列进行分组来对文件进行排序,然后遍历排序后的文件。如果分组列值与上一行相同,则在同一组中汇总,如果与上一行不同,则创建一个新组继续汇总。如果结果集过大,则视情况而定,及时写出计算出的分组结果。

  这种算法比较简单,但是性能很差,需要经历一个很大的排序过程。一般数据库会使用哈希分组方案,可以有效提高速度,但是代码复杂度要高几倍。一般非专业人士基本不可能写出来。这里就不列举代码了。

  从上面的介绍我们知道Python处理大文件还是很费力的,主要是因为它没有提供大数据服务的游标类型和相关操作,只能自己写代码,不仅繁琐而且效率低下。

  Python不方便,那么还有哪些适合非专业程序员处理大文件的工具呢?

  在这方面,EsProc SPL比Python方便得多。SPL是一种专业的结构化数据处理语言,它提供了比熊猫更丰富的操作。有了内置的游标数据类型,解决大文件的操作就非常简单了。比如上面的例子就可以轻松完成。

  一.聚合

  第二,过滤

  第三,排序

  四。分组

  特别指出SPL的分组汇总是基于数据库常用的哈希算法,效率高。

  并行计算也内置于SPL中。现在多核CPU非常普遍。使用并行计算可以大大提高性能,例如分组和汇总。只加一个@ m就可以变成并行计算。

  而Python,写并行计算程序太难了。网上有各种各样的事情,但是没有简单的方法去做。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: