DrugDesign Data Analysis
https://gitlab.com/UmbrellaLeaf5/drugdesign_parsing
Loading...
Searching...
No Matches
functions Namespace Reference

Functions

pd.DataFrame AddedIC50andGI50ToCellLinesDF (pd.DataFrame data, bool get_activities=True, str raw_csv_folder_name="raw/cell_lines_activities", str activities_results_folder_name="results/activities", bool download_compounds_sdf=True, bool print_to_console=False, bool skip_gotten_activities=False)
 
pd.DataFrame AddedIC50andKiToTargetsDF (pd.DataFrame data, bool download_activities=True, str activities_results_folder_name="results/activities", bool download_compounds_sdf=True, bool print_to_console=False, bool skip_downloaded_activities=False)
 
pd.DataFrame CleanedCellLineActivitiesDF (pd.DataFrame data, str cell_id, str activities_type, bool print_to_console=False)
 
pd.DataFrame CleanedTargetActivitiesDF (pd.DataFrame data, str target_id, str activities_type, bool print_to_console=False)
 
int CountCellLineActivitiesByFile (str file_name)
 
int CountTargetActivitiesByIC50 (str target_id)
 
int CountTargetActivitiesByKi (str target_id)
 
None DownloadCellLinesFromIdList (list[str] cell_line_chembl_id_list=[], str results_folder_name="results/cell_lines", str primary_analysis_folder_name="primary_analysis", bool need_primary_analysis=False, bool get_activities=True, str activities_results_folder_name="results/activities", bool print_to_console=False, bool skip_gotten_activities=False)
 
 DownloadCompoundsByMWRange (int less_limit=0, int greater_limit=12_546_42, str results_folder_name="results/compounds", str primary_analysis_folder_name="primary_analysis", bool need_primary_analysis=False, bool print_to_console=False)
 
None DownloadTargetsFromIdList (list[str] target_chembl_id_list=[], str results_folder_name="results/targets", str primary_analysis_folder_name="primary_analysis", bool need_primary_analysis=False, bool download_activities=True, str activities_results_folder_name="results/activities", bool print_to_console=False, bool skip_downloaded_activities=False)
 
pd.DataFrame ExpandedFromDictionariesCompoundsDF (pd.DataFrame data)
 
pd.DataFrame ExpandedFromDictionariesTargetsDF (pd.DataFrame data)
 
QuerySet QuerySetActivitiesByIC50 (str target_id)
 
QuerySet QuerySetActivitiesByKi (str target_id)
 
QuerySet QuerySetAllCellLines ()
 
QuerySet QuerySetAllTargets ()
 
QuerySet QuerySetCellLinesFromIdList (list[str] cell_line_chembl_id_list)
 
QuerySet QuerySetCompoundsByMWRange (int less_limit=0, int greater_limit=12_546_42)
 
QuerySet QuerySetTargetsFromIdList (list[str] target_chembl_id_list)
 
None SaveMolfilesToSDFByIdList (list[str] molecule_chembl_id_list, str file_name, pd.DataFrame extra_data=pd.DataFrame(), bool print_to_console=False)
 

Function Documentation

◆ AddedIC50andGI50ToCellLinesDF()

pd.DataFrame functions.AddedIC50andGI50ToCellLinesDF ( pd.DataFrame data,
bool get_activities = True,
str raw_csv_folder_name = "raw/cell_lines_activities",
str activities_results_folder_name = "results/activities",
bool download_compounds_sdf = True,
bool print_to_console = False,
bool skip_gotten_activities = False )
Добавляет в pd.DataFrame два столбца: IC50 и GI50

Args:
    data (pd.DataFrame): исходный pd.DataFrame
    need_to_download_activities (bool, optional): нужно ли получать activities отдельно. Defaults to True.
    raw_csv_folder_name (str, optional): название папки, откуда необходимо получить activities. Defaults to "raw/cell_lines_activities".
    activities_results_folder_name (str, optional): название папки для полученных activities. Defaults to "results/activities".
    download_compounds_sdf (bool, optional): нужно ли скачивать .sdf файл с molfile для каждой молекулы. Defaults to True.
    print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.
    skip_gotten_activities (bool, optional): пропускать ли уже скачанные файлы activities. Defaults to False.

Returns:
    pd.DataFrame: расширенный pd.DataFrame
46 skip_gotten_activities: bool = False) -> pd.DataFrame:
47 """
48 Добавляет в pd.DataFrame два столбца: IC50 и GI50
49
50 Args:
51 data (pd.DataFrame): исходный pd.DataFrame
52 need_to_download_activities (bool, optional): нужно ли получать activities отдельно. Defaults to True.
53 raw_csv_folder_name (str, optional): название папки, откуда необходимо получить activities. Defaults to "raw/cell_lines_activities".
54 activities_results_folder_name (str, optional): название папки для полученных activities. Defaults to "results/activities".
55 download_compounds_sdf (bool, optional): нужно ли скачивать .sdf файл с molfile для каждой молекулы. Defaults to True.
56 print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.
57 skip_gotten_activities (bool, optional): пропускать ли уже скачанные файлы activities. Defaults to False.
58
59 Returns:
60 pd.DataFrame: расширенный pd.DataFrame
61 """
62
63 logger.info(
64 f"Adding 'IC50' and 'GI50' columns to pandas.DataFrame()...".ljust(77))
65
66 try:
67 data["IC50"] = data.apply(
68 lambda value: CountCellLineActivitiesByFile(
69 f"{raw_csv_folder_name}/{value["cell_chembl_id"]}_IC50_activities.csv"), axis=1)
70 data["GI50"] = data.apply(
71 lambda value: CountCellLineActivitiesByFile(
72 f"{raw_csv_folder_name}/{value["cell_chembl_id"]}_GI50_activities.csv"), axis=1)
73
74 logger.success(
75 f"Adding 'IC50' and 'GI50' columns to pandas.DataFrame(): SUCCESS".ljust(77))
76
77 if get_activities:
78 GetCellLineChEMBLActivitiesFromCSV(data,
79 raw_csv_folder_name=raw_csv_folder_name,
80 results_folder_name=activities_results_folder_name,
81 download_compounds_sdf=download_compounds_sdf,
82 print_to_console=print_to_console,
83 skip_gotten_activities=skip_gotten_activities)
84 try:
85 data["IC50_new"] = data["IC50_new"].astype(int)
86 data["GI50_new"] = data["GI50_new"].astype(int)
87
88 except Exception as exception: # это исключение может возникнуть, если колонки нет
89 if not skip_gotten_activities: # новых activities не скачалось, т.е. значение пересчитывать не надо
90 raise exception
91
92 else:
93 pass
94
95 except Exception as exception:
96 PrintException(exception, "ChEMBL____cells", "fg #CB507C")
97
98 return data
99
100
Here is the caller graph for this function:

◆ AddedIC50andKiToTargetsDF()

pd.DataFrame functions.AddedIC50andKiToTargetsDF ( pd.DataFrame data,
bool download_activities = True,
str activities_results_folder_name = "results/activities",
bool download_compounds_sdf = True,
bool print_to_console = False,
bool skip_downloaded_activities = False )
Добавляет в pd.DataFrame два столбца: IC50 и Ki

Args:
    data (pd.DataFrame): исходный pd.DataFrame
    need_to_download_activities (bool, optional): нужно ли скачивать activities отдельно. Defaults to True.
    activities_results_folder_name (str, optional): название папки для скачанных activities. Defaults to "results/activities".
    download_compounds_sdf (bool, optional): нужно ли скачивать .sdf файл с molfile для каждой молекулы. Defaults to True.
    print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.
    skip_downloaded_activities (bool, optional): пропускать ли уже скачанные файлы activities. Defaults to False.

Returns:
    pd.DataFrame: расширенный pd.DataFrame
105 skip_downloaded_activities: bool = False) -> pd.DataFrame:
106 """
107 Добавляет в pd.DataFrame два столбца: IC50 и Ki
108
109 Args:
110 data (pd.DataFrame): исходный pd.DataFrame
111 need_to_download_activities (bool, optional): нужно ли скачивать activities отдельно. Defaults to True.
112 activities_results_folder_name (str, optional): название папки для скачанных activities. Defaults to "results/activities".
113 download_compounds_sdf (bool, optional): нужно ли скачивать .sdf файл с molfile для каждой молекулы. Defaults to True.
114 print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.
115 skip_downloaded_activities (bool, optional): пропускать ли уже скачанные файлы activities. Defaults to False.
116
117 Returns:
118 pd.DataFrame: расширенный pd.DataFrame
119 """
120
121 logger.info(
122 f"Adding 'IC50' and 'Ki' columns to pandas.DataFrame()...".ljust(77))
123
124 try:
125 data["IC50"] = data["target_chembl_id"].apply(
126 CountTargetActivitiesByIC50)
127 data["Ki"] = data["target_chembl_id"].apply(CountTargetActivitiesByKi)
128
129 logger.success(
130 f"Adding 'IC50' and 'Ki' columns to pandas.DataFrame(): SUCCESS".ljust(77))
131
132 if download_activities:
133 DownloadTargetChEMBLActivities(data,
134 results_folder_name=activities_results_folder_name,
135 download_compounds_sdf=download_compounds_sdf,
136 print_to_console=print_to_console,
137 skip_downloaded_activities=skip_downloaded_activities)
138 try:
139 data["IC50_new"] = data["IC50_new"].astype(int)
140 data["Ki_new"] = data["Ki_new"].astype(int)
141
142 except Exception as exception:
143 if not skip_downloaded_activities: # это исключение может возникнуть, если колонки нет
144 raise exception # новых activities не скачалось, т.е. значение пересчитывать не надо
145
146 else:
147 pass
148
149 except Exception as exception:
150 PrintException(exception, "ChEMBL__targets", "fg #CBDD7C")
151
152 return data
153
154
Here is the caller graph for this function:

◆ CleanedCellLineActivitiesDF()

pd.DataFrame functions.CleanedCellLineActivitiesDF ( pd.DataFrame data,
str cell_id,
str activities_type,
bool print_to_console = False )
Производит чистку выборки activities конкретной клеточной линии по IC50 и GI50

Args:
    data (pd.DataFrame): выборка activities
    cell_id (str): идентификатор клеточной линии
    activities_type (str): IC50 или GI50
    print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.

Returns:
    pd.DataFrame: очищенная выборка
183 print_to_console: bool = False) -> pd.DataFrame:
184 """
185 Производит чистку выборки activities конкретной клеточной линии по IC50 и GI50
186
187 Args:
188 data (pd.DataFrame): выборка activities
189 cell_id (str): идентификатор клеточной линии
190 activities_type (str): IC50 или GI50
191 print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.
192
193 Returns:
194 pd.DataFrame: очищенная выборка
195 """
196
197 if print_to_console:
198 logger.info(f"Start cleaning {activities_type} activities DataFrame from {
199 cell_id}...".ljust(77))
200
201 logger.info(f"Deleting useless columns...".ljust(77))
202
203 try:
204 data = data[['Molecule ChEMBL ID', 'Smiles', 'Document ChEMBL ID',
205 'Standard Type', 'Standard Relation', 'Standard Value',
206 'Standard Units', 'Assay ChEMBL ID', 'Assay Description',
207 'Assay Type', 'Assay Variant Accession', 'Assay Variant Mutation',
208 'Action Type', 'Data Validity Comment', 'BAO Format ID', 'BAO Label',
209 'Assay Organism']]
210
211 data.columns = [column_name.lower().replace(' ', '_')
212 for column_name in data.columns]
213
214 if print_to_console:
215 logger.success(f"Deleting useless columns: SUCCESS".ljust(77))
216
217 logger.info(f"Deleting inappropriate elements...".ljust(77))
218
219 data = data[data['standard_relation'] == "'='"]
220 data['standard_relation'] = data['standard_relation'].str.replace(
221 "'='", "=")
222
223 data = data[data['standard_units'] == 'nM']
224 data = data[data['assay_organism'] == "Homo sapiens"]
225 data = data[data['standard_type'].isin(['IC50', 'GI50'])]
226
227 data['standard_value'] = data['standard_value'].astype(float)
228 data = data[data['standard_value'] <= 1000000000]
229
230 data = data.drop(['assay_organism', 'standard_type'], axis=1)
231
232 data = data.rename(columns={'smiles': 'canonical_smiles'})
233
234 if print_to_console:
235 logger.success(
236 f"Deleting inappropriate elements: SUCCESS".ljust(77))
237
238 logger.info(
239 f"Calculating median for 'standard value'...".ljust(77))
240
241 data = MedianDedupedDF(data, "molecule_chembl_id", "standard_value")
242
243 if print_to_console:
244 logger.success(
245 f"Calculating median for 'standard value': SUCCESS".ljust(77))
246
247 logger.info(
248 f"Reindexing columns in logical order...".ljust(77))
249
250 data = data.reindex(columns=["molecule_chembl_id",
251 "canonical_smiles", "document_chembl_id", "standard_relation",
252 "standard_value", "standard_units", 'assay_chembl_id',
253 'assay_description', 'assay_type', 'assay_variant_accession',
254 'assay_variant_mutation', 'action_type',
255 'data_validity_description',
256 'bao_format', 'bao_label'])
257
258 if print_to_console:
259 logger.success(
260 f"Reindexing columns in logical order: SUCCESS".ljust(77))
261
262 logger.success(f"End cleaning activities DataFrame from {
263 cell_id}".ljust(77))
264
265 except Exception as exception:
266 PrintException(exception, "ChEMBL__IC&GI50", "fg #6785C6")
267
268 if print_to_console:
269 logger.info(f"{'-' * 77}")
270
271 return data

◆ CleanedTargetActivitiesDF()

pd.DataFrame functions.CleanedTargetActivitiesDF ( pd.DataFrame data,
str target_id,
str activities_type,
bool print_to_console = False )
Производит чистку выборки activities конкретной цели по IC50 и Ki

Args:
    data (pd.DataFrame): выборка activities
    target_id (str): идентификатор цели
    activities_type (str): IC50 или Ki
    print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.

Returns:
    pd.DataFrame: очищенная выборка
90 print_to_console: bool = False) -> pd.DataFrame:
91 """
92 Производит чистку выборки activities конкретной цели по IC50 и Ki
93
94 Args:
95 data (pd.DataFrame): выборка activities
96 target_id (str): идентификатор цели
97 activities_type (str): IC50 или Ki
98 print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.
99
100 Returns:
101 pd.DataFrame: очищенная выборка
102 """
103
104 if print_to_console:
105 logger.info(f"Start cleaning {activities_type} activities DataFrame from {
106 target_id}...".ljust(77))
107
108 logger.info(f"Deleting useless columns...".ljust(77))
109
110 try:
111
112 data = data.drop(['activity_id', 'activity_properties',
113 'document_journal', 'document_year',
114 'molecule_pref_name', 'pchembl_value',
115 'potential_duplicate', 'qudt_units',
116 'record_id', 'src_id', 'standard_flag',
117 'standard_text_value', 'standard_upper_value',
118 'target_chembl_id', 'target_pref_name',
119 'target_tax_id', 'text_value', 'toid',
120 'type', 'units', 'uo_units', 'upper_value',
121 'value', 'ligand_efficiency', 'relation'], axis=1)
122
123 if print_to_console:
124 logger.success(f"Deleting useless columns: SUCCESS".ljust(77))
125
126 logger.info(f"Deleting inappropriate elements...".ljust(77))
127
128 data = data[data['standard_relation'] == '=']
129 data = data[data['standard_units'] == 'nM']
130 data = data[data['target_organism'] == "Homo sapiens"]
131 data = data[data['standard_type'].isin(['IC50', 'Ki'])]
132 data = data[data['assay_type'] == 'B']
133
134 data['standard_value'] = data['standard_value'].astype(float)
135 data = data[data['standard_value'] <= 1000000000]
136
137 data['activity_comment'] = data['activity_comment'].replace(
138 "Not Determined", None)
139
140 data = data.drop(['target_organism', 'standard_type'], axis=1)
141
142 if print_to_console:
143 logger.success(
144 f"Deleting inappropriate elements: SUCCESS".ljust(77))
145
146 logger.info(
147 f"Calculating median for 'standard value'...".ljust(77))
148
149 data = MedianDedupedDF(data, "molecule_chembl_id", "standard_value")
150
151 if print_to_console:
152 logger.success(
153 f"Calculating median for 'standard value': SUCCESS".ljust(77))
154
155 logger.info(
156 f"Reindexing columns in logical order...".ljust(77))
157
158 data = data.reindex(columns=["molecule_chembl_id", "parent_molecule_chembl_id",
159 "canonical_smiles", "document_chembl_id", "standard_relation",
160 "standard_value", "standard_units", 'assay_chembl_id',
161 'assay_description', 'assay_type', 'assay_variant_accession',
162 'assay_variant_mutation', 'action_type', 'activity_comment',
163 'data_validity_comment', 'data_validity_description',
164 'bao_endpoint', 'bao_format', 'bao_label'])
165
166 if print_to_console:
167 logger.success(
168 f"Reindexing columns in logical order: SUCCESS".ljust(77))
169
170 logger.success(f"End cleaning activities DataFrame from {
171 target_id}".ljust(77))
172
173 except Exception as exception:
174 PrintException(exception, "ChEMBL__IC50&Ki", "fg #61B78C")
175
176 if print_to_console:
177 logger.info(f"{'-' * 77}")
178
179 return data
180
181

◆ CountCellLineActivitiesByFile()

int functions.CountCellLineActivitiesByFile ( str file_name)
Подсчитывает кол-во активностей клеточных линий по .csv файлу, в котором они находятся

Args:
    file_name (str): _description_

Returns:
    int: _description_
75def CountCellLineActivitiesByFile(file_name: str) -> int:
76 """
77 Подсчитывает кол-во активностей клеточных линий по .csv файлу, в котором они находятся
78
79 Args:
80 file_name (str): _description_
81
82 Returns:
83 int: _description_
84 """
85
86 return sum(1 for _ in open(file_name, 'r'))
87
88

◆ CountTargetActivitiesByIC50()

int functions.CountTargetActivitiesByIC50 ( str target_id)
Подсчитывает кол-во активностей по target_id по IC50
(иначе говоря, численное значение IC50 для конкретной цели)

Args:
    target_id (str): идентификатор цели из базы ChEMBL

Returns:
    int: количество
45def CountTargetActivitiesByIC50(target_id: str) -> int:
46 """
47 Подсчитывает кол-во активностей по target_id по IC50
48 (иначе говоря, численное значение IC50 для конкретной цели)
49
50 Args:
51 target_id (str): идентификатор цели из базы ChEMBL
52
53 Returns:
54 int: количество
55 """
56
57 return len(QuerySetActivitiesByIC50(target_id))
58
59
Here is the call graph for this function:

◆ CountTargetActivitiesByKi()

int functions.CountTargetActivitiesByKi ( str target_id)
Подсчитывает кол-во активностей по target_id по Ki
(иначе говоря, численное значение Ki для конкретной цели)

Args:
    target_id (str): идентификатор цели из базы ChEMBL

Returns:
    int: количество
60def CountTargetActivitiesByKi(target_id: str) -> int:
61 """
62 Подсчитывает кол-во активностей по target_id по Ki
63 (иначе говоря, численное значение Ki для конкретной цели)
64
65 Args:
66 target_id (str): идентификатор цели из базы ChEMBL
67
68 Returns:
69 int: количество
70 """
71
72 return len(QuerySetActivitiesByKi(target_id))
73
74
Here is the call graph for this function:

◆ DownloadCellLinesFromIdList()

None functions.DownloadCellLinesFromIdList ( list[str] cell_line_chembl_id_list = [],
str results_folder_name = "results/cell_lines",
str primary_analysis_folder_name = "primary_analysis",
bool need_primary_analysis = False,
bool get_activities = True,
str activities_results_folder_name = "results/activities",
bool print_to_console = False,
bool skip_gotten_activities = False )
Скачивает клеточные линии по списку id из базы ChEMBL, сохраняя их в .csv файл

Args:
    cell_line_chembl_id_list (list[str], optional): список id. Defaults to []: для скачивания всех клеточных линий.
    results_folder_name (str, optional): имя папки для закачки. Defaults to "results/cell_lines".
    primary_analysis_folder_name (str, optional): имя папки для сохранения данных о первичном анализе. Defaults to "primary_analysis".
    need_primary_analysis (bool, optional): нужно ли проводить первичный анализ. Defaults to False.
    get_activities (bool, optional): нужно ли получать активности к клеточным линиям по IC50 и GI50. Defaults to True.
    activities_results_folder_name (str, optional): имя папки для закачки activities. Defaults to "results/activities".
    print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.
    skip_gotten_activities (bool, optional): пропускать ли уже скачанные файлы activities. Defaults to False.
108 skip_gotten_activities: bool = False) -> None:
109 """
110 Скачивает клеточные линии по списку id из базы ChEMBL, сохраняя их в .csv файл
111
112 Args:
113 cell_line_chembl_id_list (list[str], optional): список id. Defaults to []: для скачивания всех клеточных линий.
114 results_folder_name (str, optional): имя папки для закачки. Defaults to "results/cell_lines".
115 primary_analysis_folder_name (str, optional): имя папки для сохранения данных о первичном анализе. Defaults to "primary_analysis".
116 need_primary_analysis (bool, optional): нужно ли проводить первичный анализ. Defaults to False.
117 get_activities (bool, optional): нужно ли получать активности к клеточным линиям по IC50 и GI50. Defaults to True.
118 activities_results_folder_name (str, optional): имя папки для закачки activities. Defaults to "results/activities".
119 print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.
120 skip_gotten_activities (bool, optional): пропускать ли уже скачанные файлы activities. Defaults to False.
121 """
122
123 try:
124 logger.info(
125 f"Downloading cell lines...".ljust(77))
126 cell_lines_with_ids: QuerySet = QuerySetCellLinesFromIdList(
127 cell_line_chembl_id_list)
128
129 if cell_line_chembl_id_list == []:
130 cell_lines_with_ids = QuerySetAllCellLines()
131
132 logger.info(f"Amount: {len(cell_lines_with_ids)}".ljust(77))
133 logger.success(f"Downloading cell lines: SUCCESS".ljust(77))
134
135 try:
136 logger.info(
137 "Collecting cell lines to pandas.DataFrame()...".ljust(77))
138
139 data_frame = AddedIC50andGI50ToCellLinesDF(
140 pd.DataFrame(cell_lines_with_ids),
141 get_activities=get_activities,
142 activities_results_folder_name=activities_results_folder_name,
143 print_to_console=print_to_console,
144 skip_gotten_activities=skip_gotten_activities)
145
146 UpdateLoggerFormat("ChEMBL____cells", "fg #CB507C")
147
148 logger.success(
149 "Collecting cell lines to pandas.DataFrame(): SUCCESS".ljust(77))
150
151 logger.info(
152 f"Collecting cell lines to .csv file in '{results_folder_name}'...".ljust(77))
153
154 if need_primary_analysis:
155 PrimaryAnalysisByColumns(data_frame=data_frame,
156 data_name=f"cell_lines_data_from_ChEMBL",
157 folder_name=f"{
158 results_folder_name}/{primary_analysis_folder_name}",
159 print_to_console=print_to_console)
160
161 UpdateLoggerFormat("ChEMBL____cells", "fg #CB507C")
162
163 file_name: str = f"{
164 results_folder_name}/cell_lines_data_from_ChEMBL.csv"
165
166 data_frame.to_csv(file_name, sep=';', index=False)
167 logger.success(
168 f"Collecting cell lines to .csv file in '{results_folder_name}': SUCCESS".ljust(77))
169
170 except Exception as exception:
171 PrintException(exception, "ChEMBL____cells", "fg #CB507C")
172
173 except Exception as exception:
174 PrintException(exception, "ChEMBL____cells", "fg #CB507C")
Here is the call graph for this function:

◆ DownloadCompoundsByMWRange()

functions.DownloadCompoundsByMWRange ( int less_limit = 0,
int greater_limit = 12_546_42,
str results_folder_name = "results/compounds",
str primary_analysis_folder_name = "primary_analysis",
bool need_primary_analysis = False,
bool print_to_console = False )
Возвращает молекулы в диапазоне молекулярной массы [less_limit; greater_limit) из базы ChEMBL,
сохраняя их в .csv файл

Args:
    less_limit (int, optional): нижняя граница. Defaults to 0.
    greater_limit (int, optional): верхняя граница. Defaults to 12_546_42.
    results_folder_name (str, optional): имя папки для закачки. Defaults to "results/compounds".
    primary_analysis_folder_name (str, optional): имя папки для сохранения данных о первичном анализе. Defaults to "primary_analysis".
    need_primary_analysis (bool, optional): нужно ли проводить первичный анализ. Defaults to False.
    print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.
121 print_to_console: bool = False):
122 """
123 Возвращает молекулы в диапазоне молекулярной массы [less_limit; greater_limit) из базы ChEMBL,
124 сохраняя их в .csv файл
125
126 Args:
127 less_limit (int, optional): нижняя граница. Defaults to 0.
128 greater_limit (int, optional): верхняя граница. Defaults to 12_546_42.
129 results_folder_name (str, optional): имя папки для закачки. Defaults to "results/compounds".
130 primary_analysis_folder_name (str, optional): имя папки для сохранения данных о первичном анализе. Defaults to "primary_analysis".
131 need_primary_analysis (bool, optional): нужно ли проводить первичный анализ. Defaults to False.
132 print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.
133 """
134
135 try:
136 logger.info(
137 f"Downloading molecules with mw in range [{less_limit}, {greater_limit})...".ljust(77))
138 mols_in_mw_range: QuerySet = QuerySetCompoundsByMWRange(
139 less_limit, greater_limit)
140
141 logger.info(
142 ("Amount:" + f"{len(mols_in_mw_range)}").ljust(77))
143 logger.success(
144 f"Downloading molecules with mw in range [{less_limit}, {greater_limit}): SUCCESS".ljust(77))
145
146 try:
147 logger.info(
148 "Collecting molecules to pandas.DataFrame()...".ljust(77))
149 data_frame = ExpandedFromDictionariesCompoundsDF(pd.DataFrame(
150 mols_in_mw_range))
151 logger.success(
152 "Collecting molecules to pandas.DataFrame(): SUCCESS".ljust(77))
153
154 logger.info(
155 f"Collecting molecules to .csv file in '{results_folder_name}'...".ljust(77))
156
157 if need_primary_analysis:
158 PrimaryAnalysisByColumns(data_frame=data_frame,
159 data_name=f"mols_in_mw_range_{
160 less_limit}_{greater_limit}",
161 folder_name=f"{
162 results_folder_name}/{primary_analysis_folder_name}",
163 print_to_console=print_to_console)
164 UpdateLoggerFormat("ChEMBL_compound", "fg #CCA87A")
165
166 file_name: str = f"{results_folder_name}/range_{
167 less_limit}_{greater_limit}_mw_mols.csv"
168
169 data_frame.to_csv(file_name, sep=';', index=False)
170 logger.success(
171 f"Collecting molecules to .csv file in '{results_folder_name}': SUCCESS".ljust(77))
172
173 except Exception as exception:
174 PrintException(exception, "ChEMBL_compound", "fg #CCA87A")
175
176 except Exception as exception:
177 PrintException(exception, "ChEMBL_compound", "fg #CCA87A")
178
179
Here is the call graph for this function:

◆ DownloadTargetsFromIdList()

None functions.DownloadTargetsFromIdList ( list[str] target_chembl_id_list = [],
str results_folder_name = "results/targets",
str primary_analysis_folder_name = "primary_analysis",
bool need_primary_analysis = False,
bool download_activities = True,
str activities_results_folder_name = "results/activities",
bool print_to_console = False,
bool skip_downloaded_activities = False )
Скачивает цели по списку id из базы ChEMBL, сохраняя их в .csv файл

Args:
    target_chembl_id_list (list[str], optional): список id. Defaults to []: для скачивания всех целей.
    results_folder_name (str, optional): имя папки для закачки. Defaults to "results/targets".
    primary_analysis_folder_name (str, optional): имя папки для сохранения данных о первичном анализе. Defaults to "primary_analysis".
    need_primary_analysis (bool, optional): нужно ли проводить первичный анализ. Defaults to False.
    download_activities (bool, optional): нужно ли скачивать активности к целям по IC50 и Ki. Defaults to True.
    activities_results_folder_name (str, optional): имя папки для закачки activities. Defaults to "results/activities". 
    print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.
    skip_downloaded_activities (bool, optional): пропускать ли уже скачанные файлы activities. Defaults to False.
162 skip_downloaded_activities: bool = False) -> None:
163 """
164 Скачивает цели по списку id из базы ChEMBL, сохраняя их в .csv файл
165
166 Args:
167 target_chembl_id_list (list[str], optional): список id. Defaults to []: для скачивания всех целей.
168 results_folder_name (str, optional): имя папки для закачки. Defaults to "results/targets".
169 primary_analysis_folder_name (str, optional): имя папки для сохранения данных о первичном анализе. Defaults to "primary_analysis".
170 need_primary_analysis (bool, optional): нужно ли проводить первичный анализ. Defaults to False.
171 download_activities (bool, optional): нужно ли скачивать активности к целям по IC50 и Ki. Defaults to True.
172 activities_results_folder_name (str, optional): имя папки для закачки activities. Defaults to "results/activities".
173 print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.
174 skip_downloaded_activities (bool, optional): пропускать ли уже скачанные файлы activities. Defaults to False.
175 """
176
177 try:
178 logger.info(
179 f"Downloading targets...".ljust(77))
180 targets_with_ids: QuerySet = QuerySetTargetsFromIdList(
181 target_chembl_id_list)
182
183 if target_chembl_id_list == []:
184 targets_with_ids = QuerySetAllTargets()
185
186 logger.info(f"Amount: {len(targets_with_ids)}".ljust(77))
187 logger.success(f"Downloading targets: SUCCESS".ljust(77))
188
189 try:
190 logger.info(
191 "Collecting targets to pandas.DataFrame()...".ljust(77))
192
193 data_frame = AddedIC50andKiToTargetsDF(
194 ExpandedFromDictionariesTargetsDF(
195 pd.DataFrame(targets_with_ids)),
196 download_activities=download_activities,
197 activities_results_folder_name=activities_results_folder_name,
198 print_to_console=print_to_console,
199 skip_downloaded_activities=skip_downloaded_activities)
200
201 UpdateLoggerFormat("ChEMBL__targets", "fg #CBDD7C")
202
203 logger.success(
204 "Collecting targets to pandas.DataFrame(): SUCCESS".ljust(77))
205
206 logger.info(
207 f"Collecting targets to .csv file in '{results_folder_name}'...".ljust(77))
208
209 if need_primary_analysis:
210 PrimaryAnalysisByColumns(data_frame=data_frame,
211 data_name=f"targets_data_from_ChEMBL",
212 folder_name=f"{
213 results_folder_name}/{primary_analysis_folder_name}",
214 print_to_console=print_to_console)
215
216 UpdateLoggerFormat("ChEMBL__targets", "fg #CBDD7C")
217
218 file_name: str = f"{
219 results_folder_name}/targets_data_from_ChEMBL.csv"
220
221 data_frame.to_csv(file_name, sep=';', index=False)
222 logger.success(
223 f"Collecting targets to .csv file in '{results_folder_name}': SUCCESS".ljust(77))
224
225 except Exception as exception:
226 PrintException(exception, "ChEMBL__targets", "fg #CBDD7C")
227
228 except Exception as exception:
229 PrintException(exception, "ChEMBL__targets", "fg #CBDD7C")
Here is the call graph for this function:

◆ ExpandedFromDictionariesCompoundsDF()

pd.DataFrame functions.ExpandedFromDictionariesCompoundsDF ( pd.DataFrame data)
Избавляет pd.DataFrame от словарей и списков словарей в столбцах, разбивая их на подстолбцы

Args:
    data (pd.DataFrame): исходный pd.DataFrame

Returns:
    pd.DataFrame: "раскрытый" pd.DataFrame
45def ExpandedFromDictionariesCompoundsDF(data: pd.DataFrame) -> pd.DataFrame:
46 """
47 Избавляет pd.DataFrame от словарей и списков словарей в столбцах, разбивая их на подстолбцы
48
49 Args:
50 data (pd.DataFrame): исходный pd.DataFrame
51
52 Returns:
53 pd.DataFrame: "раскрытый" pd.DataFrame
54 """
55
56 def ExtractedValuesFromColumn(df: pd.DataFrame, column_name: str,
57 key: str, is_list: bool = True) -> pd.Series:
58 if is_list:
59 return df[column_name].apply(lambda x: [d[key] for d in x] if x else [])
60 return [item[key] if isinstance(item, dict) else None for item in df[column_name]]
61
62 # cSpell:disable
63
64 exposed_data = pd.DataFrame({
65 #! cross_references
66 'xref_id': ExtractedValuesFromColumn(data, 'cross_references', 'xref_id'),
67 'xref_name': ExtractedValuesFromColumn(data, 'cross_references', 'xref_name'),
68 'xref_src': ExtractedValuesFromColumn(data, 'cross_references', 'xref_src'),
69 #! molecule_hierarchy
70 'active_chembl_id': ExtractedValuesFromColumn(data, 'molecule_hierarchy', 'active_chembl_id', is_list=False),
71 'molecule_chembl_id': ExtractedValuesFromColumn(data, 'molecule_hierarchy', 'molecule_chembl_id', is_list=False),
72 'parent_chembl_id': ExtractedValuesFromColumn(data, 'molecule_hierarchy', 'parent_chembl_id', is_list=False),
73 #! molecule_properties
74 'alogp': ExtractedValuesFromColumn(data, 'molecule_properties', 'alogp', is_list=False),
75 'aromatic_rings': ExtractedValuesFromColumn(data, 'molecule_properties', 'aromatic_rings', is_list=False),
76 'cx_logd': ExtractedValuesFromColumn(data, 'molecule_properties', 'cx_logd', is_list=False),
77 'cx_logp': ExtractedValuesFromColumn(data, 'molecule_properties', 'cx_logp', is_list=False),
78 'cx_most_apka': ExtractedValuesFromColumn(data, 'molecule_properties', 'cx_most_apka', is_list=False),
79 'cx_most_bpka': ExtractedValuesFromColumn(data, 'molecule_properties', 'cx_most_bpka', is_list=False),
80 'full_molformula': ExtractedValuesFromColumn(data, 'molecule_properties', 'full_molformula', is_list=False),
81 'full_mwt': ExtractedValuesFromColumn(data, 'molecule_properties', 'full_mwt', is_list=False),
82 'hba': ExtractedValuesFromColumn(data, 'molecule_properties', 'hba', is_list=False),
83 'hba_lipinski': ExtractedValuesFromColumn(data, 'molecule_properties', 'hba_lipinski', is_list=False),
84 'hbd': ExtractedValuesFromColumn(data, 'molecule_properties', 'hbd', is_list=False),
85 'hbd_lipinski': ExtractedValuesFromColumn(data, 'molecule_properties', 'hbd_lipinski', is_list=False),
86 'heavy_atoms': ExtractedValuesFromColumn(data, 'molecule_properties', 'heavy_atoms', is_list=False),
87 'molecular_species': ExtractedValuesFromColumn(data, 'molecule_properties', 'molecular_species', is_list=False),
88 'mw_freebase': ExtractedValuesFromColumn(data, 'molecule_properties', 'mw_freebase', is_list=False),
89 'mw_monoisotopic': ExtractedValuesFromColumn(data, 'molecule_properties', 'mw_monoisotopic', is_list=False),
90 'np_likeness_score': ExtractedValuesFromColumn(data, 'molecule_properties', 'np_likeness_score', is_list=False),
91 'num_lipinski_ro5_violations': ExtractedValuesFromColumn(data, 'molecule_properties', 'num_lipinski_ro5_violations', is_list=False),
92 'num_ro5_violations': ExtractedValuesFromColumn(data, 'molecule_properties', 'num_ro5_violations', is_list=False),
93 'psa': ExtractedValuesFromColumn(data, 'molecule_properties', 'psa', is_list=False),
94 'qed_weighted': ExtractedValuesFromColumn(data, 'molecule_properties', 'qed_weighted', is_list=False),
95 'ro3_pass': ExtractedValuesFromColumn(data, 'molecule_properties', 'ro3_pass', is_list=False),
96 'rtb': ExtractedValuesFromColumn(data, 'molecule_properties', 'rtb', is_list=False),
97 #! molecule_structures
98 'canonical_smiles': ExtractedValuesFromColumn(data, 'molecule_structures', 'canonical_smiles', is_list=False),
99 'molfile': ExtractedValuesFromColumn(data, 'molecule_structures', 'molfile', is_list=False),
100 'standard_inchi': ExtractedValuesFromColumn(data, 'molecule_structures', 'standard_inchi', is_list=False),
101 'standard_inchi_key': ExtractedValuesFromColumn(data, 'molecule_structures', 'standard_inchi_key', is_list=False),
102 #! molecule_synonyms
103 'molecule_synonym': ExtractedValuesFromColumn(data, 'molecule_synonyms', 'molecule_synonym'),
104 'syn_type': ExtractedValuesFromColumn(data, 'molecule_synonyms', 'syn_type'),
105 'synonyms': ExtractedValuesFromColumn(data, 'molecule_synonyms', 'synonyms'),
106 })
107
108 data = data.drop(['cross_references', 'molecule_hierarchy',
109 'molecule_properties', 'molecule_structures', 'molecule_synonyms'], axis=1)
110
111 # cSpell:enable
112
113 return pd.concat([data, exposed_data], axis=1)
114
115
Here is the caller graph for this function:

◆ ExpandedFromDictionariesTargetsDF()

pd.DataFrame functions.ExpandedFromDictionariesTargetsDF ( pd.DataFrame data)
Избавляет pd.DataFrame от словарей и списков словарей в столбцах, разбивая их на подстолбцы

Args:
    data (pd.DataFrame): исходный pd.DataFrame

Returns:
    pd.DataFrame: "раскрытый" pd.DataFrame
40def ExpandedFromDictionariesTargetsDF(data: pd.DataFrame) -> pd.DataFrame:
41 """
42 Избавляет pd.DataFrame от словарей и списков словарей в столбцах, разбивая их на подстолбцы
43
44 Args:
45 data (pd.DataFrame): исходный pd.DataFrame
46
47 Returns:
48 pd.DataFrame: "раскрытый" pd.DataFrame
49 """
50
51 logger.info(f"Expanding pandas.DataFrame() from dictionaries...".ljust(77))
52
53 def ExtractedValuesFromColumn(df: pd.DataFrame, column_name: str, key: str) -> pd.Series:
54 return df[column_name].apply(lambda x: [d[key] for d in x] if x else [])
55
56 exposed_data = pd.DataFrame({
57 #! cross_references
58 'xref_id': ExtractedValuesFromColumn(data, 'cross_references', 'xref_id'),
59 'xref_name': ExtractedValuesFromColumn(data, 'cross_references', 'xref_name'),
60 'xref_src': ExtractedValuesFromColumn(data, 'cross_references', 'xref_src'),
61 })
62
63 # избавлюсь от списков, так как в них находятся одиночные словари
64 data['target_components'] = data['target_components'].apply(
65 lambda x: x[0] if x else {'accession': None,
66 'component_description': None,
67 'component_id': None,
68 'component_type': None,
69 'relationship': None,
70 'target_component_synonyms': [],
71 'target_component_xrefs': []})
72
73 target_components_data = pd.DataFrame(
74 data['target_components'].values.tolist())
75
76 exposed_target_components_data = pd.DataFrame({
77 #! target_component_synonyms
78 'component_synonym': ExtractedValuesFromColumn(target_components_data, 'target_component_synonyms', 'component_synonym'),
79 'syn_type': ExtractedValuesFromColumn(target_components_data, 'target_component_synonyms', 'syn_type'),
80 #! target_component_xrefs
81 'xref_id_target_component_xrefs': ExtractedValuesFromColumn(target_components_data, 'target_component_xrefs', 'xref_id'),
82 'xref_name_target_component_xrefs': ExtractedValuesFromColumn(target_components_data, 'target_component_xrefs', 'xref_name'),
83 'xref_src_db_target_component_xrefs': ExtractedValuesFromColumn(target_components_data, 'target_component_xrefs', 'xref_src_db'),
84 })
85
86 target_components_data = target_components_data.drop(
87 ['target_component_synonyms', 'target_component_xrefs'], axis=1)
88 target_components_data = pd.concat(
89 [target_components_data, exposed_target_components_data], axis=1)
90
91 data = data.drop(['cross_references', 'target_components'], axis=1)
92 data = pd.concat([data, exposed_data, target_components_data], axis=1)
93
94 logger.success(
95 f"Expanding pandas.DataFrame() from dictionaries: SUCCESS".ljust(77))
96
97 return data
98
99
Here is the caller graph for this function:

◆ QuerySetActivitiesByIC50()

QuerySet functions.QuerySetActivitiesByIC50 ( str target_id)
Возвращает активности по target_id по IC50

Args:
    target_id (str): идентификатор цели из базы ChEMBL

Returns:
    QuerySet: набор активностей
16def QuerySetActivitiesByIC50(target_id: str) -> QuerySet:
17 """
18 Возвращает активности по target_id по IC50
19
20 Args:
21 target_id (str): идентификатор цели из базы ChEMBL
22
23 Returns:
24 QuerySet: набор активностей
25 """
26
27 return new_client.activity.filter(target_chembl_id=target_id).filter(standard_type="IC50")
28
29
30@Retry()
Here is the caller graph for this function:

◆ QuerySetActivitiesByKi()

QuerySet functions.QuerySetActivitiesByKi ( str target_id)
Возвращает активности по target_id по Ki

Args:
    target_id (str): идентификатор цели из базы ChEMBL

Returns:
    QuerySet: набор активностей
31def QuerySetActivitiesByKi(target_id: str) -> QuerySet:
32 """
33 Возвращает активности по target_id по Ki
34
35 Args:
36 target_id (str): идентификатор цели из базы ChEMBL
37
38 Returns:
39 QuerySet: набор активностей
40 """
41
42 return new_client.activity.filter(target_chembl_id=target_id).filter(standard_type="Ki")
43
44
Here is the caller graph for this function:

◆ QuerySetAllCellLines()

QuerySet functions.QuerySetAllCellLines ( )
Возвращает все цели из базы ChEMBL

Returns:
    QuerySet: набор всех целей
14def QuerySetAllCellLines() -> QuerySet:
15 """
16 Возвращает все цели из базы ChEMBL
17
18 Returns:
19 QuerySet: набор всех целей
20 """
21
22 return new_client.cell_line.filter()
23
24
25@Retry()
Here is the caller graph for this function:

◆ QuerySetAllTargets()

QuerySet functions.QuerySetAllTargets ( )
Возвращает все цели из базы ChEMBL

Returns:
    QuerySet: набор всех целей
14def QuerySetAllTargets() -> QuerySet:
15 """
16 Возвращает все цели из базы ChEMBL
17
18 Returns:
19 QuerySet: набор всех целей
20 """
21
22 return new_client.target.filter()
23
24
25@Retry()
Here is the caller graph for this function:

◆ QuerySetCellLinesFromIdList()

QuerySet functions.QuerySetCellLinesFromIdList ( list[str] cell_line_chembl_id_list)
Возвращает цели по списку id из базы ChEMBL

Args:
    cell_line_chembl_id_list (list[str]): список id

Returns:
    QuerySet: набор целей по списку id
26def QuerySetCellLinesFromIdList(cell_line_chembl_id_list: list[str]) -> QuerySet:
27 """
28 Возвращает цели по списку id из базы ChEMBL
29
30 Args:
31 cell_line_chembl_id_list (list[str]): список id
32
33 Returns:
34 QuerySet: набор целей по списку id
35 """
36
37 return new_client.cell_line.filter(cell_chembl_id__in=cell_line_chembl_id_list)
38
39
Here is the caller graph for this function:

◆ QuerySetCompoundsByMWRange()

QuerySet functions.QuerySetCompoundsByMWRange ( int less_limit = 0,
int greater_limit = 12_546_42 )
Возвращает молекулы в диапазоне молекулярной массы [less_limit; greater_limit) из базы ChEMBL

Args:
    less_limit (int, optional): нижняя граница. Defaults to 0.
    greater_limit (int, optional): верхняя граница. Defaults to 12_546_42.

Raises:
    ValueError: границы должны быть больше нуля
    ValueError: greater_limit должен быть больше less_limit

Returns:
    QuerySet: набор молекул в диапазоне
17def QuerySetCompoundsByMWRange(less_limit: int = 0, greater_limit: int = 12_546_42) -> QuerySet:
18 """
19 Возвращает молекулы в диапазоне молекулярной массы [less_limit; greater_limit) из базы ChEMBL
20
21 Args:
22 less_limit (int, optional): нижняя граница. Defaults to 0.
23 greater_limit (int, optional): верхняя граница. Defaults to 12_546_42.
24
25 Raises:
26 ValueError: границы должны быть больше нуля
27 ValueError: greater_limit должен быть больше less_limit
28
29 Returns:
30 QuerySet: набор молекул в диапазоне
31 """
32
33 if greater_limit < 0 or less_limit < 0:
34 raise ValueError(
35 "QuerySetMWRangeFilter: limits should be greater zero")
36
37 if greater_limit < less_limit:
38 raise ValueError(
39 "QuerySetMWRangeFilter: greater_limit should be greater than less_limit")
40
41 return new_client.molecule.filter(molecule_properties__mw_freebase__lt=greater_limit,
42 molecule_properties__mw_freebase__gte=less_limit)
43
44
Here is the caller graph for this function:

◆ QuerySetTargetsFromIdList()

QuerySet functions.QuerySetTargetsFromIdList ( list[str] target_chembl_id_list)
Возвращает цели по списку id из базы ChEMBL

Args:
    target_chembl_id_list (list[str]): список id

Returns:
    QuerySet: набор целей по списку id
26def QuerySetTargetsFromIdList(target_chembl_id_list: list[str]) -> QuerySet:
27 """
28 Возвращает цели по списку id из базы ChEMBL
29
30 Args:
31 target_chembl_id_list (list[str]): список id
32
33 Returns:
34 QuerySet: набор целей по списку id
35 """
36
37 return new_client.target.filter(target_chembl_id__in=target_chembl_id_list)
38
39
Here is the caller graph for this function:

◆ SaveMolfilesToSDFByIdList()

None functions.SaveMolfilesToSDFByIdList ( list[str] molecule_chembl_id_list,
str file_name,
pd.DataFrame extra_data = pd.DataFrame(),
bool print_to_console = False )
Сохраняет molfiles из списка id в .sdf файл

Args:
    molecule_chembl_id_list (list[str]): список id
    file_name (str): имя файла (без .sdf)
    extra_data (pd.DataFrame, optional): дополнительная информация. Defaults to pd.DataFrame().
    print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.

Returns:
    _type_: _description_
182 print_to_console: bool = False) -> None:
183 """
184 Сохраняет molfiles из списка id в .sdf файл
185
186 Args:
187 molecule_chembl_id_list (list[str]): список id
188 file_name (str): имя файла (без .sdf)
189 extra_data (pd.DataFrame, optional): дополнительная информация. Defaults to pd.DataFrame().
190 print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.
191
192 Returns:
193 _type_: _description_
194 """
195
196 if not molecule_chembl_id_list:
197 logger.warning(
198 "Molecules list is empty, nothing to save to .sdf!".ljust(77))
199 return
200
201 @Retry()
202 def DataFrameMolfilesFromIdList(molecule_chembl_id_list: list[str]) -> pd.DataFrame:
203 """
204 Возвращает pd.DataFrame из molfile по каждой молекуле из списка molecule_chembl_id
205
206 Args:
207 molecule_chembl_id_list (list[str]): список id
208
209 Returns:
210 pd.DataFrame: DataFrame, который содержит molecule_chembl_id и соотв. molfile
211 """
212
213 qs_data: QuerySet = new_client.molecule.filter(
214 molecule_chembl_id__in=molecule_chembl_id_list).only([
215 'molecule_chembl_id', 'molecule_structures'])
216
217 data = pd.DataFrame(qs_data)
218
219 data['molfile'] = data['molecule_structures'].apply(
220 lambda x: x['molfile'] if isinstance(x, dict) else None)
221
222 data = data.drop(['molecule_structures'], axis=1)
223
224 return data
225
226 def SaveMolfilesToSDF(data: pd.DataFrame, file_name: str,
227 extra_data: pd.DataFrame = pd.DataFrame(),
228 print_to_console: bool = False) -> None:
229 """
230 Сохраняет molfiles из pd.DataFrame в .sdf файл
231
232 Args:
233 data (pd.DataFrame): DataFrame с molfile и molecule_chembl_id
234 file_name (str): имя файла (без .sdf)
235 extra_data (pd.DataFrame, optional): дополнительная информация. Defaults to pd.DataFrame().
236 print_to_console (bool, optional): нужно ли выводить логирование в консоль. Defaults to False.
237 """
238
239 def WriteColumnAndValueToSDF(file: TextIOWrapper, value, column: str = "") -> None:
240 """
241 Записывает столбец и значение в .sdf файл
242
243 Args:
244 file (TextIOWrapper): открытый файл для записи.
245 value: значение, которое нужно записать.
246 column (str, optional): имя столбца. Defaults to "".
247 """
248
249 if isinstance(value, list):
250 if column:
251 file.write(f"> <{column}>\n")
252
253 for elem in value:
254 # если value - это список словарей
255 if isinstance(elem, dict):
256 WriteColumnAndValueToSDF(file, elem)
257
258 else:
259 elem = str(elem)
260
261 if elem != "nan" and elem != "None":
262 file.write(f"{elem}\n")
263
264 if column:
265 file.write("\n")
266
267 elif isinstance(value, dict):
268 if column:
269 file.write(f"> <{column}>\n")
270
271 for key, elem in value.items():
272 elem = str(elem)
273
274 if elem != "nan" and elem != "None":
275 file.write(f"{key}: {elem}\n")
276
277 if column:
278 file.write("\n")
279
280 else:
281 value = str(value)
282
283 if value != "nan" and value != "None":
284 if column:
285 file.write(f"> <{column}>\n")
286
287 file.write(f"{value}\n\n")
288
289 if print_to_console:
290 logger.info(f"Opening {file_name}...".ljust(77))
291
292 with open(f"{file_name}.sdf", 'w', encoding='utf-8') as f:
293 if print_to_console:
294 logger.success(f"Opening {file_name}".ljust(77))
295
296 for value in data.values:
297 try:
298 molecule_chembl_id, molfile = value
299
300 f.write(f"{molecule_chembl_id}{molfile}\n\n")
301
302 if not extra_data.empty:
303 df = extra_data.set_index("molecule_chembl_id")
304
305 for column in df.columns:
306 try:
307 WriteColumnAndValueToSDF(
308 f, df.loc[molecule_chembl_id, column], column)
309
310 except Exception as exception:
311 PrintException(
312 exception, "ChEMBL_compound", "fg #CCA87A")
313
314 f.write("$$$$\n")
315
316 if print_to_console:
317 logger.info(
318 f"Writing {molecule_chembl_id} data to .sdf file...".ljust(77))
319
320 except Exception as exception:
321 PrintException(exception, "ChEMBL_compound", "fg #CCA87A")
322
323 if print_to_console:
324 logger.info("Collecting molfiles to pandas.DataFrame()...".ljust(77))
325
326 data = DataFrameMolfilesFromIdList(molecule_chembl_id_list)
327
328 if print_to_console:
329 logger.success("Collecting molfiles to pandas.DataFrame()".ljust(77))
330
331 SaveMolfilesToSDF(data=data, file_name=file_name, extra_data=extra_data,
332 print_to_console=print_to_console)