- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是一名试图验证实验的生物学家。在我的实验中,我在特定治疗后发现了 71 个突变。为了确定这些突变是否真的由我的治疗引起,我想将它们与一组随机生成的突变进行比较。有人向我建议我可能会尝试生成一百万组 71 个随机突变以进行统计比较。
首先,我有一个数据框,其中包含感兴趣的基因组中的 7000 个基因。我知道他们的开始和结束位置。数据框的前五行如下所示:
transcript_id protein_id start end kogClass
0 g2.t1 695054 1 1999 Replication, recombination and repair
1 g3.t1 630170 2000 3056 General function prediction only
2 g5.t1 695056 3057 4087 Signal transduction mechanisms
3 g6.t1 671982 4088 5183 N/A
4 g7.t1 671985 5184 8001 Chromatin structure and dynamics
现在关于 71 个随机突变的百万组:我编写了一个调用了一百万次的函数,它似乎不是很有效,因为 4 小时后它只完成了 1/10。这是我的代码。如果有人可以提出加快速度的方法,我会欠你一杯啤酒!还有我的感激之情。
def get_71_random_genes(df, outfile):
# how many nucleotides are there in all transcripts?
end_pos_last_gene = df.iloc[-1,3]
# this loop will go 71 times
for i in range(71):
# generate a number from 1 to the end of all transcripts
random_number = randint(1, end_pos_last_gene)
# this is the boolean condition - checks which gene a random number falls within
mask = (df['start'] <= random_number) & (df['end'] >= random_number)
# collect the rows that match
data = df.loc[mask]
# write data to file.
data.to_csv(outfile, sep='\t', index=False, header=False)
最佳答案
我很确定以下所有内容:
for i in range(71):
# generate a number from 1 to the end of all transcripts
random_number = randint(1, end_pos_last_gene)
# this is the boolean condition - checks which gene a random number falls within
mask = (df['start'] <= random_number) & (df['end'] >= random_number)
# collect the rows that match
data = df.loc[mask]
# write data to file.
data.to_csv(outfile, sep='\t', index=False, header=False)
是从数据框中随机选择 71 行而不进行替换。请注意,这会花费永远,因为每次您这样做
(df['start'] <= random_number) & (df['end'] >= random_number)
您遍历整个数据帧三次,然后再迭代一次:
data = df.loc[mask]
这是一种极其低效的行采样方式。您可以通过随机抽取 71 个索引,然后直接在数据框上使用这些索引(这甚至不需要对数据框进行一次完整传递)来更有效地做到这一点。但是您不需要这样做,pd.DataFrame
对象已经实现了一个高效的示例方法,因此请注意:
In [12]: df = pd.DataFrame(np.random.randint(0, 20, (10, 10)), columns=["c%d"%d for d in range(10)])
In [13]: df
Out[13]:
c0 c1 c2 c3 c4 c5 c6 c7 c8 c9
0 13 0 19 5 6 17 5 14 5 15
1 2 4 0 16 19 11 16 3 11 1
2 18 3 1 18 12 9 13 2 18 12
3 2 6 14 12 1 2 19 16 0 14
4 17 5 6 13 7 15 10 18 13 8
5 7 19 18 3 1 11 14 6 13 16
6 13 5 11 0 2 15 7 11 0 2
7 0 19 11 3 19 3 3 9 8 10
8 6 8 9 3 12 18 19 8 11 2
9 8 17 16 0 8 7 17 11 11 0
In [14]: df.sample(3, replace=True)
Out[14]:
c0 c1 c2 c3 c4 c5 c6 c7 c8 c9
0 13 0 19 5 6 17 5 14 5 15
3 2 6 14 12 1 2 19 16 0 14
3 2 6 14 12 1 2 19 16 0 14
In [15]: df.sample(3, replace=True)
Out[15]:
c0 c1 c2 c3 c4 c5 c6 c7 c8 c9
9 8 17 16 0 8 7 17 11 11 0
4 17 5 6 13 7 15 10 18 13 8
2 18 3 1 18 12 9 13 2 18 12
In [16]: df.sample(3, replace=True)
Out[16]:
c0 c1 c2 c3 c4 c5 c6 c7 c8 c9
3 2 6 14 12 1 2 19 16 0 14
8 6 8 9 3 12 18 19 8 11 2
4 17 5 6 13 7 15 10 18 13 8
所以只需将循环替换为:
df.sample(71, replace=True).to_csv(outfile, sep='\t', index=False, header=False)
请注意,这还减少了 I/O 开销!
所以,做一个快速测试:
In [4]: import time
...: start = time.time()
...: with open('test.csv', 'w') as f:
...: for _ in range(1000):
...: df.sample(71, replace=True).to_csv(f, header=None, index=False)
...: stop = time.time()
...:
In [5]: stop - start
Out[5]: 0.789172887802124
因此,根据线性推断,我估计 1,000,000 次大约需要:
In [8]: (stop - start) * 1000
Out[8]: 789.172887802124
秒,所以 10 分钟多一点
In [10]: !wc -l test.csv
71000 test.csv
因此,创建一个映射到数据框中的索引的数组:
size = df.end.max()
nucleotide_array = np.zeros(size, dtype=np.int) # this could get out of hand without being careful of our size
for row in df.itertuples(): # might be alittle slow, but its a one-time upfront cost
i = row.start - 1
j = row.end
nucleotide_array[i:j] = row.Index
# sampling scheme:
with open('test.csv', 'w') as f:
for _ in range(1000): # how ever many experiments
snps = np.random.choice(nucleotide_array, 71, replace=True)
df.loc[snps].to_csv(f, header=None, index=False)
请注意,以上是草图,还没有真正测试过。它做出了假设,但我认为它们是成立的,而且无论如何,您可以轻松修改您的 df 以使其起作用。
关于python - 访问pandas数据百万次——需要提高效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49019716/
第一个 .on 函数比第二个更有效吗? $( "div.container" ).on( "click", "p", function(){ }); $( "body" ).on( "click",
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 7 年前。 Improve
我有这样的查询: $('#tabContainer li'); JetBrains WebStorm IDE 将其突出显示为低效查询。它建议我改用这个: $('#tabContainer').find
我刚刚在 coursera ( https://www.coursera.org/saas/) 上听了一个讲座,教授说 Ruby 中的一切都是对象,每个方法调用都是在对象上调用发送方法,将一些参数传递
这可能是用户“不喜欢”的另一个问题,因为它更多的是与建议相关而不是与问题相关。 我有一个在保存和工作簿打开时触发的代码。 它在 f(白天与夜晚,日期与实际日期)中选择正确的工作表。 周一到周三我的情况
这只是我的好奇心,但是更有效的是递归还是循环? 给定两个功能(使用通用lisp): (defun factorial_recursion (x) (if (> x 0) (*
这可能是一个愚蠢的问题,但是while循环的效率与for循环的效率相比如何?我一直被教导,如果可以使用for循环,那我应该这样做。但是,实际上之间的区别是什么: $i = 0; while($i <
我有一个Elasticsearch索引,其中包含几百万条记录。 (基于时间戳的日志记录) 我需要首先显示最新记录(即,按时间戳降序排列的记录) 在时间戳上排序desc是否比使用时间戳的函数计分功能更有
使用Point2D而不是double x和y值时,效率有很大差异吗? 我正在开发一个程序,该程序有许多圆圈在屏幕上移动。他们各自从一个点出发,并越来越接近目的地(最后,他们停下来)。 使用 .getC
我正在编写一个游戏,并且有一个名为 GameObject 的抽象类和三个扩展它的类(Player、Wall 和 Enemy)。 我有一个定义为包含游戏中所有对象的列表。 List objects; 当
我是 Backbone 的初学者,想知道两者中哪一个更有效以及预期的做事方式。 A 型:创建一个新集合,接受先前操作的结果并从新集合中提取 key result = new Backbone.Coll
最近,关于使用 LIKE 和通配符搜索 MS SQL 数据库的最有效方法存在争论。我们正在使用 %abc%、%abc 和 abc% 进行比较。有人说过,术语末尾应该始终有通配符 (abc%)。因此,根
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我想知道,这样做会更有效率吗: setVisible(false) // if the component is invisible 或者像这样: if(isVisible()){
我有一个静态方法可以打开到 SQL Server 的连接、写入日志消息并关闭连接。我在整个代码中多次调用此方法(平均每 2 秒一次)。 问题是 - 它有效率吗?我想也许积累一些日志并用一个连接插入它们
这个问题在这里已经有了答案: Best practice to avoid memory or performance issues related to binding a large numbe
我为我的 CS 课(高中四年级)制作了一个石头剪刀布游戏,我的老师给我的 shell 文件指出我必须将 do while 循环放入运行者中,但我不明白为什么?我的代码可以工作,但她说最好把它写在运行者
我正在编写一个需要通用列表的 Java 应用程序。该列表需要能够经常动态地调整大小,对此的明显答案是通用的Linkedlist。不幸的是,它还需要像通过调用索引添加/删除值一样频繁地获取/设置值。 A
我的 Mysql 语句遇到了真正的问题,我需要将几个表连接在一起,查询它们并按另一个表中值的平均值进行排序。这就是我所拥有的... SELECT ROUND(avg(re.rating
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Is there a difference between i==0 and 0==i? 以下编码风格有什么
我是一名优秀的程序员,十分优秀!