In [2]:
import numpy as np
import pandas as pd
In [3]:
data = pd.read_csv("out.txt", sep=" ", header=None)
data.head()
Out[3]:
0 1 2
0 19 T C
1 20 I E
2 21 E E
3 22 I E
4 23 I E
In [4]:
structure_counts = data.groupby(1)[2].value_counts()
structure_counts
Out[4]:
1  2
A  H    210
   C    187
   E     86
C  C     47
   E     25
   H     15
D  C    214
   H     72
   E     26
E  C    183
   H    168
   E     59
F  E     70
   C     64
   H     53
G  C    297
   E     47
   H     41
H  C     71
   E     36
   H     26
I  E    120
   C     92
   H     84
K  C    173
   H    103
   E     53
L  H    207
   C    170
   E    147
M  C     28
   H     24
   E     14
N  C    123
   E     27
   H     27
P  C    181
   H     32
   E     22
Q  C     96
   H     57
   E     29
R  H    114
   C    110
   E     52
S  C    161
   E     57
   H     37
T  C    134
   E     76
   H     46
V  E    162
   C    121
   H     82
W  H     27
   E     26
   C     20
Y  C     75
   E     61
   H     51
Name: 2, dtype: int64
In [5]:
res_by_structure = data[2].value_counts()
res_by_kind = data[1].value_counts()
In [6]:
res_by_structure
Out[6]:
C    2547
H    1476
E    1195
Name: 2, dtype: int64
In [7]:
res_by_kind
Out[7]:
L    524
A    483
E    410
G    385
V    365
K    329
D    312
I    296
R    276
T    256
S    255
P    235
Y    187
F    187
Q    182
N    177
H    133
C     87
W     73
M     66
Name: 1, dtype: int64
In [8]:
propensities = pd.DataFrame(columns=["H", "E", "C"], index=np.unique(data[1]), dtype=np.float64)
In [10]:
for structure in propensities.columns:
    for res_kind in np.unique(data[1]):
        propensities.loc[res_kind, structure] = (structure_counts[res_kind][structure] / 
                                                     res_by_kind[res_kind]) / \
                                                (res_by_structure[structure] / len(data))
In [11]:
propensities
Out[11]:
H E C
A 1.537057 0.777477 0.793176
C 0.609522 1.254749 1.106761
D 0.815822 0.363877 1.405188
E 1.448582 0.628354 0.914413
F 1.001964 1.634529 0.701154
G 0.376479 0.533057 1.580414
H 0.691098 1.181917 1.093659
I 1.003241 1.770214 0.636753
K 1.106774 0.703422 1.077272
L 1.396551 1.224961 0.664650
M 1.285538 0.926233 0.869139
N 0.539272 0.666080 1.423662
P 0.481393 0.408781 1.577923
Q 1.107188 0.695765 1.080625
R 1.460204 0.822679 0.816505
S 0.512955 0.976047 1.293483
T 0.635237 1.296313 1.072358
V 0.794216 1.938020 0.679153
W 1.307551 1.555201 0.561283
Y 0.964154 1.424375 0.821665

Из таблички можно сделать несколько выводов:

  1. Аланин, глутаминовая кислота, аргинин встречаются сильно чаще в составе альфа-спиралей (при чем у аланина это происходит более чем в два раза чаще).
  2. Глицин сильно чаще участвует в образовании неструктурированных участков. Сюда же можно отнести аспарагиновую кислоту, хотя она в некоторой степени участвует в образовании альфа-спиралей; аспарагин, пролин.
  3. Треонин, валин, тирозин, изолейцин, фенилаланин, в целом, аминокислоты с малозаряженным гидрофобным радикалом склонны к образованию бета-листов.

Также хочу сделать предположение, что анализ всего лишь 30 белковых структур не может дать целостной картины распределения аминокислотных остатков по вторичным структурам. Более того мне кажется, что немало важный аспект в таком разделении играет функциональная роль таких вторичных структур и их окружение. Потому что, например, альфа-спирали которые удерживают белок в мембране или составляют гидрофобное ядро по идеи должны состоять из гидрофобных аминокилот, а бета-листы, боковые радикалы которого участвуют, предположим, в каком-нибудь гидрофильном взаимодействии, будут насыщены гидрофильными остатками.