Как рассчитать уравнение, используя значения столбцов и сохранить выходные значения один под другим, используя python? - PullRequest
0 голосов
/ 25 октября 2019

У меня есть набор данных, значения столбцов которого должны использоваться в уравнении. Max angle определяется пользователем, а угловые приращения Ang будут угловыми шагами.

Предположим, что максимальный угол = 30, угловой прирост = 10, поэтому я хочу 4 выходных строки для каждой входной строки. Только угол должен измениться с 0,10,20,30 в уравнении.

1-й столбец - это мой индекс 'ID'. Мой набор данных состоит из 300 строк. Таким образом, мой окончательный вывод должен содержать 300 * 4 (угловые шаги) строк.

Пример набора данных:

enter image description here

Отредактированный набор данных:

data ='''
ID,1,2,3
23,0.88905321,0.500807892,0.499545029
105,0.334209544,0.24077062,0.345252261
47,0.020669404,0.154582048,0.044395524
28,0.07913145,0.987645061,0.421184162
23,0.5654544,0.879541062,0.456556261
105,0.45678404,0.789546214,0.456217524
import pandas as pd
import numpy as np
from math import *

data ='''
ID,1,2,3
23,0.88905321,0.500807892,0.499545029
105,0.334209544,0.24077062,0.345252261
47,0.020669404,0.154582048,0.044395524
28,0.07913145,0.987645061,0.421184162
'''
df = pd.read_csv(io.StringIO(data),index_col=0)
M = df.iloc[:,:]

#suppose
Max_ang = 30
Ang = 10

#Equation:
solution = 0.88905321*cos(Ang*(pi/180)) + 0.500807892*sin(Ang*(pi/180)) + 0.499545029 * sin(Ang*(pi/180))*cos(Ang*(pi/180))

Уравнение:

решение = Column1_val x cos (Ang x (pi / 180)) + Column2_val x sin (Ang x (pi / 180)) + Column3_val x sin (Ang x (pi / 180)) x cos (Ang x (pi / 180))

Ожидаемый результат:

enter image description here

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Нет необходимости в for loop с iterrows, что будет довольно медленно.

Вот векторизованное решение, использующее numpy broadcasting.

Сначала мы получим ваш кадр данных в правильном формате с reindex и index.repeat:

import numpy as np

Max_ang = 30
Ang = 10
Angels = np.arange(0,Max_ang+Ang,step=Ang).tolist()

df = df.reindex(df.index.repeat(len(Angels)))
df['Ang'] = Angels * df.index.nunique()

pi_div_180 = np.pi/180

df['new'] = \
df['1'] * np.cos(df['Ang'] * pi_div_180) + \
df['2'] * np.sin(df['Ang'] * pi_div_180) + \
df['3'] * np.sin(df['Ang'] * pi_div_180) * np.cos(df['Ang']*pi_div_180)

Вывод

            1         2         3  Ang       new
ID                                              
23   0.889053  0.500808  0.499545    0  0.889053
23   0.889053  0.500808  0.499545   10  1.047938
23   0.889053  0.500808  0.499545   20  1.167274
23   0.889053  0.500808  0.499545   30  1.236656
105  0.334210  0.240771  0.345252    0  0.334210
105  0.334210  0.240771  0.345252   10  0.429983
105  0.334210  0.240771  0.345252   20  0.507365
105  0.334210  0.240771  0.345252   30  0.559318
47   0.020669  0.154582  0.044396    0  0.020669
47   0.020669  0.154582  0.044396   10  0.054790
47   0.020669  0.154582  0.044396   20  0.086562
47   0.020669  0.154582  0.044396   30  0.114415
28   0.079131  0.987645  0.421184    0  0.079131
28   0.079131  0.987645  0.421184   10  0.321459
28   0.079131  0.987645  0.421184   20  0.547520
28   0.079131  0.987645  0.421184   30  0.744730

Кудалите ненужные столбцы, используйте df.filter:

df = df.filter(regex='\D')

     Ang       new
ID                
23     0  0.889053
23    10  1.047938
23    20  1.167274
23    30  1.236656
105    0  0.334210
105   10  0.429983
105   20  0.507365
105   30  0.559318
47     0  0.020669
47    10  0.054790
47    20  0.086562
47    30  0.114415
28     0  0.079131
28    10  0.321459
28    20  0.547520
28    30  0.744730
1 голос
/ 25 октября 2019
def equation(ang,a,b,c):
    return a*cos(ang*(pi/180)) + b*sin(ang*(pi/180)) + c* sin(ang*(pi/180))*cos(ang*(pi/180))

res = pd.DataFrame(columns=["ID","Ang","Result"])
for idx, row in df.iterrows():
    for ang in [0,10,20,30]:
        result = equation(ang,row[0],row[1],row[2])
        res = res.append({'ID':idx,'Ang':ang,'Result':result}, ignore_index=True)

Это должно быть достаточно просто для отслеживания, я создал функцию для вашего уравнения, затем я создал пустой фрейм данных со столбцами в качестве ожидаемого результата. Далее я перебираю строки исходного кадра данных, используя индекс исходного кадра данных для столбца ID в новом кадре данных. Затем я перебираю углы, которые вы упомянули выше, и сохраняю соответствующие ID, ang и «Result», вызывая функцию уравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...