如何从文件中读取两行并在 for-loop 中创建动态键?
How to read two lines from a file and create dynamics keys in a for-loop?
在下面的数据中,我试图运行一个简单的马尔可夫模型。
假设我有一个具有以下结构的数据:
pos M1 M2 M3 M4 M5 M6 M7 M8 hybrid_block S1 S2 S3 S4 S5 S6 S7 S8
1 A T T A A G A C A|C C G C T T A G A
2 T G C T G T T G T|A A T A T C A A T
3 C A A C A G T C C|G G A C G C G C G
4 G T G T A T C T G|T C T T T A T C T
块 M 表示来自一组类别的数据,块 S.
也是如此
数据为strings
,由字母沿位置线连接而成。因此,M1 的 字符串值为 A-T-C-G,其他每个块也是如此。
还有一个hybrid block
有两个以相同方式读取的字符串。 问题是我想找出混合块中的哪个字符串最有可能来自哪个块(M 与 S)?
我正在尝试构建一个马尔可夫模型,它可以帮助我识别 hybrid block
中的哪个字符串来自哪个块。在这个例子中,我可以看出 混合块 ATCG
来自 block M
而 CAGT
来自 block S
.
我将问题分解成不同的部分来读取和挖掘数据:
问题级别 01:
- 首先,我阅读了第一行(header)并为所有列创建了
unique keys
。
- 然后我读取第二行(
pos
的值为 1)并创建另一个密钥。在同一行中,我从 hybrid_block
中读取值并读取其中的字符串值。 pipe |
只是一个分隔符,所以 index 0 and 2
中有两个字符串 A
和 C
。所以,我想要的只是
defaultdict(<class 'dict'>, {'M1': ['A'], 'M2': ['T'], 'M3': ['T']...., 'hybrid_block': ['A'], ['C']...}
因为,我正在阅读该行,我想附加每列的字符串值并最终创建。
defaultdict(<class 'dict'>, {'M1': ['A', 'T', 'C', 'G'], 'M2': ['T', 'G', 'A', 'T'], 'M3': ['T', 'C', 'A', 'G']...., 'hybrid_block': ['A', 'T', 'C', 'G'], ['C', 'A', 'G', 'T']...}
问题级别 02:
我读取了 hybrid_block
中的数据,第一行是 A and C
。
现在,我要创建 keys' but unlike fixed keys, these key will be generated while reading the data from
hybrid_blocks.
For the first line since there are no preceding line the
keyswill simply be
AgAand
CgCwhich means (A given A, and C given C), and for the values I count the number of
A in
块 Mand
块 S`。因此,数据将存储为:
defaultdict(<class 'dict'>, {'M': {'AgA': [4], 'CgC': [1]}, 'S': {'AgA': 2, 'CgC': 2}}
因为,我通读了其他行,我想根据 hybrid block
中的字符串创建新键,并在给定字符串的情况下计算该字符串在 M vs S
块中出现的次数在前一行。这意味着阅读 line 2
时的 keys
在这一行中将是 TgA' which means (T given A) and AgC. For the values inside this key I count the number of times I found
T,在上一行中的 A 之后 and same for
AcG`.
阅读 3 行后的 defaultdict
将是。
defaultdict(<class 'dict'>, {'M': {'AgA': 4, 'TgA':3, 'CgT':2}, {'CgC': [1], 'AgC':0, 'GgA':0}, 'S': {'AgA': 2, 'TgA':1, 'CgT':0}, {'CgC': 2, 'AgC':2, 'GgA':2}}
我明白这看起来太复杂了。我浏览了几个 dictionary
和 defaultdict
教程,但找不到这样做的方法。
任何部分的解决方案,如果不是两者都非常感谢。
pandas
设置
from io import StringIO
import pandas as pd
import numpy as np
txt = """pos M1 M2 M3 M4 M5 M6 M7 M8 hybrid_block S1 S2 S3 S4 S5 S6 S7 S8
1 A T T A A G A C A|C C G C T T A G A
2 T G C T G T T G T|A A T A T C A A T
3 C A A C A G T C C|G G A C G C G C G
4 G T G T A T C T G|T C T T T A T C T """
df = pd.read_csv(StringIO(txt), delim_whitespace=True, index_col='pos')
df
解决方案
大部分 pandas
和一些 numpy
- 拆分混合列
- 前置相同的第一行
- 添加 self 的转换版本以获得
'AgA'
类型的字符串
d1 = pd.concat([df.loc[[1]].rename(index={1: 0}), df])
d1 = pd.concat([
df.filter(like='M'),
df.hybrid_block.str.split('|', expand=True).rename(columns='H{}'.format),
df.filter(like='S')
], axis=1)
d1 = pd.concat([d1.loc[[1]].rename(index={1: 0}), d1])
d1 = d1.add('g').add(d1.shift()).dropna()
d1
将方便的块分配给它们自己的变量名
m = d1.filter(like='M')
s = d1.filter(like='S')
h = d1.filter(like='H')
计算每个块中有多少个并连接
mcounts = pd.DataFrame(
(m.values[:, :, None] == h.values[:, None, :]).sum(1),
h.index, h.columns
)
scounts = pd.DataFrame(
(s.values[:, :, None] == h.values[:, None, :]).sum(1),
h.index, h.columns
)
counts = pd.concat([mcounts, scounts], axis=1, keys=['M', 'S'])
counts
如果你真的想要一本字典
d = defaultdict(lambda:defaultdict(list))
dict_df = counts.stack().join(h.stack().rename('condition')).unstack()
for pos, row in dict_df.iterrows():
d['M']['H0'].append((row.loc[('condition', 'H0')], row.loc[('M', 'H0')]))
d['S']['H0'].append((row.loc[('condition', 'H0')], row.loc[('S', 'H0')]))
d['M']['H1'].append((row.loc[('condition', 'H1')], row.loc[('M', 'H1')]))
d['S']['H1'].append((row.loc[('condition', 'H1')], row.loc[('S', 'H1')]))
dict(d)
{'M': defaultdict(list,
{'H0': [('AgA', 4), ('TgA', 3), ('CgT', 2), ('GgC', 1)],
'H1': [('CgC', 1), ('AgC', 0), ('GgA', 0), ('TgG', 1)]}),
'S': defaultdict(list,
{'H0': [('AgA', 2), ('TgA', 1), ('CgT', 0), ('GgC', 0)],
'H1': [('CgC', 2), ('AgC', 2), ('GgA', 2), ('TgG', 3)]})}
在下面的数据中,我试图运行一个简单的马尔可夫模型。
假设我有一个具有以下结构的数据:
pos M1 M2 M3 M4 M5 M6 M7 M8 hybrid_block S1 S2 S3 S4 S5 S6 S7 S8
1 A T T A A G A C A|C C G C T T A G A
2 T G C T G T T G T|A A T A T C A A T
3 C A A C A G T C C|G G A C G C G C G
4 G T G T A T C T G|T C T T T A T C T
块 M 表示来自一组类别的数据,块 S.
也是如此数据为strings
,由字母沿位置线连接而成。因此,M1 的 字符串值为 A-T-C-G,其他每个块也是如此。
还有一个hybrid block
有两个以相同方式读取的字符串。 问题是我想找出混合块中的哪个字符串最有可能来自哪个块(M 与 S)?
我正在尝试构建一个马尔可夫模型,它可以帮助我识别 hybrid block
中的哪个字符串来自哪个块。在这个例子中,我可以看出 混合块 ATCG
来自 block M
而 CAGT
来自 block S
.
我将问题分解成不同的部分来读取和挖掘数据:
问题级别 01:
- 首先,我阅读了第一行(header)并为所有列创建了
unique keys
。 - 然后我读取第二行(
pos
的值为 1)并创建另一个密钥。在同一行中,我从hybrid_block
中读取值并读取其中的字符串值。pipe |
只是一个分隔符,所以index 0 and 2
中有两个字符串A
和C
。所以,我想要的只是
defaultdict(<class 'dict'>, {'M1': ['A'], 'M2': ['T'], 'M3': ['T']...., 'hybrid_block': ['A'], ['C']...}
因为,我正在阅读该行,我想附加每列的字符串值并最终创建。
defaultdict(<class 'dict'>, {'M1': ['A', 'T', 'C', 'G'], 'M2': ['T', 'G', 'A', 'T'], 'M3': ['T', 'C', 'A', 'G']...., 'hybrid_block': ['A', 'T', 'C', 'G'], ['C', 'A', 'G', 'T']...}
问题级别 02:
我读取了
hybrid_block
中的数据,第一行是A and C
。现在,我要创建
keys' but unlike fixed keys, these key will be generated while reading the data from
hybrid_blocks. For the first line since there are no preceding line the
keyswill simply be
AgAand
CgCwhich means (A given A, and C given C), and for the values I count the number of
Ain
块 Mand
块 S`。因此,数据将存储为:
defaultdict(<class 'dict'>, {'M': {'AgA': [4], 'CgC': [1]}, 'S': {'AgA': 2, 'CgC': 2}}
因为,我通读了其他行,我想根据 hybrid block
中的字符串创建新键,并在给定字符串的情况下计算该字符串在 M vs S
块中出现的次数在前一行。这意味着阅读 line 2
时的 keys
在这一行中将是 TgA' which means (T given A) and AgC. For the values inside this key I count the number of times I found
T,在上一行中的 A 之后 and same for
AcG`.
阅读 3 行后的 defaultdict
将是。
defaultdict(<class 'dict'>, {'M': {'AgA': 4, 'TgA':3, 'CgT':2}, {'CgC': [1], 'AgC':0, 'GgA':0}, 'S': {'AgA': 2, 'TgA':1, 'CgT':0}, {'CgC': 2, 'AgC':2, 'GgA':2}}
我明白这看起来太复杂了。我浏览了几个 dictionary
和 defaultdict
教程,但找不到这样做的方法。
任何部分的解决方案,如果不是两者都非常感谢。
pandas
设置
from io import StringIO
import pandas as pd
import numpy as np
txt = """pos M1 M2 M3 M4 M5 M6 M7 M8 hybrid_block S1 S2 S3 S4 S5 S6 S7 S8
1 A T T A A G A C A|C C G C T T A G A
2 T G C T G T T G T|A A T A T C A A T
3 C A A C A G T C C|G G A C G C G C G
4 G T G T A T C T G|T C T T T A T C T """
df = pd.read_csv(StringIO(txt), delim_whitespace=True, index_col='pos')
df
解决方案
大部分 pandas
和一些 numpy
- 拆分混合列
- 前置相同的第一行
- 添加 self 的转换版本以获得
'AgA'
类型的字符串
d1 = pd.concat([df.loc[[1]].rename(index={1: 0}), df])
d1 = pd.concat([
df.filter(like='M'),
df.hybrid_block.str.split('|', expand=True).rename(columns='H{}'.format),
df.filter(like='S')
], axis=1)
d1 = pd.concat([d1.loc[[1]].rename(index={1: 0}), d1])
d1 = d1.add('g').add(d1.shift()).dropna()
d1
将方便的块分配给它们自己的变量名
m = d1.filter(like='M')
s = d1.filter(like='S')
h = d1.filter(like='H')
计算每个块中有多少个并连接
mcounts = pd.DataFrame(
(m.values[:, :, None] == h.values[:, None, :]).sum(1),
h.index, h.columns
)
scounts = pd.DataFrame(
(s.values[:, :, None] == h.values[:, None, :]).sum(1),
h.index, h.columns
)
counts = pd.concat([mcounts, scounts], axis=1, keys=['M', 'S'])
counts
如果你真的想要一本字典
d = defaultdict(lambda:defaultdict(list))
dict_df = counts.stack().join(h.stack().rename('condition')).unstack()
for pos, row in dict_df.iterrows():
d['M']['H0'].append((row.loc[('condition', 'H0')], row.loc[('M', 'H0')]))
d['S']['H0'].append((row.loc[('condition', 'H0')], row.loc[('S', 'H0')]))
d['M']['H1'].append((row.loc[('condition', 'H1')], row.loc[('M', 'H1')]))
d['S']['H1'].append((row.loc[('condition', 'H1')], row.loc[('S', 'H1')]))
dict(d)
{'M': defaultdict(list,
{'H0': [('AgA', 4), ('TgA', 3), ('CgT', 2), ('GgC', 1)],
'H1': [('CgC', 1), ('AgC', 0), ('GgA', 0), ('TgG', 1)]}),
'S': defaultdict(list,
{'H0': [('AgA', 2), ('TgA', 1), ('CgT', 0), ('GgC', 0)],
'H1': [('CgC', 2), ('AgC', 2), ('GgA', 2), ('TgG', 3)]})}