Я создал программу, которая создает 100 вариантов из исходной последовательности. Основная цель этой программы - создать 100 вариантов последовательности ДНК, содержащей 100 нуклеотидов. Для создания вариантов у нас есть исходная последовательность (у которой есть клон для дальнейшей модификации). и случайное количество мутаций (от 1 до 5) сохраняется в исходной последовательности. Например, если исходная нить 1,2,3,4, вариант может быть 1,3,3,4 или 1,4,2,3; вы поняли суть. Я также добавил структуру if-elif, которая отключает мутированный нуклеотид, чтобы он был таким же, как исходный. Я предполагаю, что у вас есть некоторые базовые знания о ДНК, поэтому я не буду чрезмерно объяснять. Но с радостью отвечу на вопросы, если они будут.
Я хочу сделать 100 вариантов этого и поместить каждую последовательность вариантов в отдельный столбец фрейма данных pandas. Моя проблема в том, что программа создает один вариант, а остальные 99 вариантов совпадают с этим. Я не мог понять почему. Если вы можете посоветовать некоторые модификации кода, чтобы избежать повторения, я был бы признателен. Ниже приведен код и результат выполнения кода.
Код:
import pandas
import random
import pandas as pd
someshit = [4, 4, 2, 4, 4, 1, 3, 2, 1, 1, 2, 3, 4, 3, 3, 4, 1, 3, 4, 4, 3, 2, 4, 4,
4, 3, 3, 1, 3, 1, 4, 1, 3, 4, 2, 4, 2, 3, 3, 3, 1, 2, 1, 3, 2, 3, 2, 4,
4, 3, 4, 4, 4, 3, 2, 1, 4, 3, 4, 4, 2, 2, 2, 1, 2, 2, 1, 1, 4, 2, 1, 4, 3,
3, 2, 4, 4, 1, 1, 2, 1, 4, 1, 4, 4, 3, 3, 1, 3, 2, 3, 3, 1, 4, 1, 2, 2, 3, 2, 4]
r = 0
nucs = [1,2,3,4]
list2 = []
list3 = []
i = 0
j = 0
n = len(someshit) #LENGTH OF THE SEQUENCE
#RANDOM MUTATION COUNT
result = None
df = pd.DataFrame({ 0 : someshit })
shitass = someshit #shitass = someshit clone
onehundo = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,
38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,
73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99]
hundred = onehundo #hundred = onehundo clone
while i < 99:
x = random.randint(1,5) #RANDOM MUTATION COUNT
while j < x:
y = random.choice(hundred)
if shitass[y] == 4:
nucs.remove(4)
z = random.choice(nucs) #z = the new mutated nucleotide
shitass[y] = z
elif shitass[y] == 3:
nucs.remove(3)
z = random.choice(nucs) #z = the new mutated nucleotide
shitass[y] = z
elif shitass[y] == 2:
nucs.remove(2)
z = random.choice(nucs) #z = the new mutated nucleotide
shitass[y] = z
elif shitass[y] == 1:
nucs.remove(1)
z = random.choice(nucs) #z = the new mutated nucleotide
shitass[y] = z
nucs = [1,2,3,4] #re-establishes the nucs after every mutation.
list2.append(y)
list3.append(z)
hundred.remove(y)
#------------------------------------#------------------------------------#------------------------------------
j = j+1
for r in range(100):
r = r+1
result = shitass
df[r] = result
hundred = onehundo #re-establishment of the clone
shitass = someshit #re-establishment of the clone
r = r+1
i = i+1
print(x)
print(y)
print(list2)
print(list3)
print(shitass)
print(df)
Код действительно запутанный, заранее извините. И вот что у меня получилось:
2
62
[31, 82, 60, 3, 62]
[4, 3, 1, 1, 1]
[4, 4, 2, 1, 4, 1, 3, 2, 1, 1, 2, 3, 4, 3, 3, 4, 1, 3, 4, 4, 3, 2, 4, 4, 4, 3, 3, 1, 3, 1, 4, 4, 3, 4, 2, 4, 2, 3, 3, 3, 1, 2, 1, 3, 2, 3, 2, 4, 4, 3, 4, 4, 4, 3, 2, 1, 4, 3, 4, 4, 1, 2, 1, 1, 2, 2, 1, 1, 4, 2, 1, 4, 3, 3, 2, 4, 4, 1, 1, 2, 1, 4, 3, 4, 4, 3, 3, 1, 3, 2, 3, 3, 1, 4, 1, 2, 2, 3, 2, 4]
0 1 2 3 4 5 6 7 8 9 ... 91 92 93 94 \
0 4 4 4 4 4 4 4 4 4 4 ... 4 4 4 4
1 4 4 4 4 4 4 4 4 4 4 ... 4 4 4 4
2 2 2 2 2 2 2 2 2 2 2 ... 2 2 2 2
3 4 1 1 1 1 1 1 1 1 1 ... 1 1 1 1
4 4 4 4 4 4 4 4 4 4 4 ... 4 4 4 4
.. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
95 2 2 2 2 2 2 2 2 2 2 ... 2 2 2 2
96 2 2 2 2 2 2 2 2 2 2 ... 2 2 2 2
97 3 3 3 3 3 3 3 3 3 3 ... 3 3 3 3
98 2 2 2 2 2 2 2 2 2 2 ... 2 2 2 2
99 4 4 4 4 4 4 4 4 4 4 ... 4 4 4 4
95 96 97 98 99 100
0 4 4 4 4 4 4
1 4 4 4 4 4 4
2 2 2 2 2 2 2
3 1 1 1 1 1 1
4 4 4 4 4 4 4
.. ... ... ... ... ... ...
95 2 2 2 2 2 2
96 2 2 2 2 2 2
97 3 3 3 3 3 3
98 2 2 2 2 2 2
99 4 4 4 4 4 4
[100 rows x 101 columns]






Одна из ваших проблем связана с оператором shitass = someshit #shitass = someshit clone. Этот оператор не создает копию или клон, как вы, кажется, ожидаете. Следующее - иллюстрация того, что я имею в виду.
la = [1,2,3,1,4,5,6]
lb = la
В:
print(f"LA = {la}\nLB= {lb}")
Урожайность:
LA = [1, 2, 3, 1, 4, 5, 6]
LB= [1, 2, 3, 1, 4, 5, 6]
Теперь, если вы измените содержимое lb следующим образом:
lb[2] = 9
и повторите предыдущий оператор печати, вы увидите, что и la, и lb имеют одинаковые значения, потому что lb = la просто присваивает второе имя одному и тому же объекту в python. Это показано ниже:
lb[2] = 9
print(f"LA = {la}\nLB= {lb}")
Урожайность:
LA = [1, 2, 9, 1, 4, 5, 6]
LB= [1, 2, 9, 1, 4, 5, 6]
Чтобы сделать lb клоном la и поддерживать независимые изменения, вы должны использовать функцию копирования следующим образом:
lc = la.copy()
lc[2] = 9
print(f"LA = {la}\nLC= {lc}")
Который дает:
LA = [1, 2, 3, 1, 4, 5, 6]
LC= [1, 2, 9, 1, 4, 5, 6]
Я бы посоветовал вам переименовать свои переменные