У меня есть искровой фрейм данных с 3 столбцами, которые указывают положения атомов. I-e Положение X, Y и Z. Теперь, чтобы найти расстояние между каждыми 2 атомами, для которого мне нужно применить формулу расстояния.
Формула расстояния имеет вид d = sqrt ((x2 − x1) ^ 2 + (y2 − y1) ^ 2 + (z2-z1) ^ 2)
так, чтобы применить приведенную выше формулу, мне нужно вычесть каждую строку в x из каждой другой строки в x, каждую строку в y из любой другой строки в y и т. Д. и затем примените вышеуказанную формулу для каждых двух атомов.
Я пытался создать пользовательскую функцию (udf), но я не могу передать в нее весь фрейм искровых данных, я могу передать только каждый столбец отдельно, а не весь фрейм данных. Из-за чего я не мог перебрать весь фрейм данных, я должен подать заявку на циклы в каждом столбце. В приведенном ниже фрагменте кода показана итерация, которую я выполняю только для Position_X.
@udf
def Distance(Position_X,Position_Y, Position_Z):
try:
for x,z in enumerate(Position_X) :
firstAtom = z
for y, a in enumerate(Position_X):
if (x!=y):
diff = firstAtom - a
return diff
except:
return None
newDF1 = atomsDF.withColumn("Distance", Distance(*atomsDF.columns))
My atomDF spark dataframe look like this, each row shows the x,y,z coordinates of one atom in space. Right now we are taking only 10 atoms.
Position_X|Position_Y|Position_Z|
+----------+----------+----------+
| 27.545| 6.743| 12.111|
| 27.708| 7.543| 13.332|
| 27.640| 9.039| 12.970|
| 26.991| 9.793| 13.693|
| 29.016| 7.166| 14.106|
| 29.286| 8.104| 15.273|
| 28.977| 5.725| 14.603|
| 28.267| 9.456| 11.844|
| 28.290| 10.849| 11.372|
| 26.869| 11.393| 11.161|
+----------+----------+----------+
Как мне решить вышеуказанную проблему в pyspark i-e. Как вычесть каждый ряд из каждого другого ряда? Как передать весь искровой фрейм данных в udf, а не в его столбцы? И как избежать использования слишком много для циклов?
Ожидаемый результат для каждых двух атомов (рядов) будет расстоянием между двумя строками, рассчитанным по приведенной выше формуле расстояния. Мне не нужно сохранять это расстояние, потому что я буду использовать другую формулу Потенциальной энергии. Или, если это можно сохранить в отдельном кадре данных, я не против.