从离散数据中找到相等的频率

Finding equal frequency from discrete data

我必须从时间序列数据中找到相等的宽度。

到目前为止,我可以通过手动选择每一列,然后应用条件来完成。但我需要一种更快的方法。

时序数据:

Time    ulaR    trxA

0       0.6457325   0.4040438
50      0.4594477   0.4172161
100     0.4244469   0.3878299
150     0.391452    0.49735
200     0.3570379   0.4930038
250     0.3730624   0.4221448
300     0.3676819   0.3796647
350     0.3688949   0.4228213
400     0.4018654   0.439482
450     0.3934677   0.4039933
500     0.3571651   0.3264575
550     0.5451287   0.3471816
600     0.6520524   0.3710635
650     0.6776012   0.4173777
700     0.684412    0.3812378
750     0.7298819   0.3735065
800     0.739083    0.3195176
850     0.6394782   0.213515
900     0.6483277   0.3721211
950     0.7003584   0.3528451
1000    0.6926971   0.3867717

我的代码:

import numpy as np
import pandas as pd
import csv
import array as ar

infile="Ecoli-1_dream4_timeseries.tsv"
outfile="tempecoli.csv"
df=pd.read_csv(infile,delimiter="\t",dtype=float)

a1=np.array(df['ulaR'])
s=df.sort_values(['ulaR'])
s1=np.array(s['ulaR'])
gr=list()

for i in range(len(s1)):
  for j in range(len(a1)):
    if s1[i]==a1[j]:
        if j<=7:
            gr.append(0)
        elif j>7 and j<=14:
            gr.append(1)
        else:
            gr.append(2)


##########

a1=np.array(df['trxA'])
s=df.sort_values(['trxA'])
s1=np.array(s['trxA'])
gr1=list()

for i in range(len(s1)):
  for j in range(len(a1)):
     if s1[i]==a1[j]:
         if j<=7:
            gr1.append(0)
         elif j>7 and j<=14:
            gr1.append(1)
         else:
            gr1.append(2)

#############


group1=pd.Series(gr,name="ulaR")
group2=pd.Series(gr1,name="trxA")
df2=pd.concat([group1,group2],axis=1)
df2.to_csv("ecoli1.csv")
print("Completed")

如果你运行这个代码,你会得到结果。我不想要任何新结果,我只希望它是一个更省时的代码来获得所需的结果。因为,编写每个代码的名称然后应用条件需要花费大量时间。 一点帮助将不胜感激。提前致谢。

你抱怨这个算法在时间序列长度上是二次的:

for i in range(len(s1)):
  for j in range(len(a1)):
    if s1[i]==a1[j]:
        if j<=7:
            gr.append(0)
        elif j>7 and j<=14:
            gr.append(1)
        else:
            gr.append(2)

与人类交流

从文档的角度来看,您的实施存在几个问题。

  1. 首先,您没有命名感兴趣的算法。请 def 一个具有信息名称和 docstring 的函数,然后调用该函数。
  2. 您有一个包含 magic numbers7 < j <= 14 的表达式。请为这些数字命名。如果名称的描述性不够,这也将使您有机会为数字添加注释行。此外,应该有一条评论来描述您要附加的三个类别的含义,可能使用 LOMEDHI.
  3. 等名称
  4. (gr, group1) 与 (gr1, group2) 的不一致,嗯,有点刺耳。

正在与机器通信

  1. 通常,当您关心速度时,将循环从 python 推入 pandas / numpy 是可行的方法。您已经在 .sort_values() 调用中完成了此操作。编写有关您的数据属性的英文描述将帮助您根据 documented primitives.
  2. 制定您的算法
  3. 您进行了排序,然后反常地进行 N^2 相等性测试以查看排序后的值在哪里结束。你不想跟踪他们去了哪里吗?我不知道您的算法在高层次上做了什么,但在低层次上,您似乎将每个示例归类为三个 quantiles 之一。即使不使用 pandas 显式分位数支持,您也可以添加顺序 index 列(或修改现有的 Time 列,见下文)以便在排序期间索引序号伴随您的数据值.然后您的线性扫描可以轻松查看当前数据值是来自系列的开头还是结尾附近。底线:给机器它很快需要的东西,不要剥离序数只是为了以后重建它们。

排序数据

$ sort -nk2 < ecoli.tsv
200     0.3570379   0.4930038
500     0.3571651   0.3264575
300     0.3676819   0.3796647
350     0.3688949   0.4228213
250     0.3730624   0.4221448
150     0.391452    0.49735
450     0.3934677   0.4039933
400     0.4018654   0.439482
100     0.4244469   0.3878299
50      0.4594477   0.4172161
550     0.5451287   0.3471816
850     0.6394782   0.213515
0       0.6457325   0.4040438
900     0.6483277   0.3721211
600     0.6520524   0.3710635
650     0.6776012   0.4173777
700     0.684412    0.3812378
1000    0.6926971   0.3867717
950     0.7003584   0.3528451
750     0.7298819   0.3735065
800     0.739083    0.3195176

您可以使用 argsort on axis=0 to get the position of the value in each column if sorted, then digitize 和不同的分箱条件来获得三个值 0、1 或 2,如您的情况:

l_col = ['ulaR', 'trxA']
bins = [-1., 7., 14., np.inf] # I use -1 as first bound to ensure 0 is in the same bin than 1 to 7
df2 = pd.DataFrame(np.digitize(df[l_col].values.argsort(axis=0), bins, right=True)-1,
                       columns=l_col)
# the -1 after digitize is because it starts at 1 not 0