독립변수들의 값을 찾고 싶은데 중첩for문, dataframe 활용 등을 통해서도 값이 출력되지 않습니다.

조회수 320회

주어진 데이터는 day1, day2, day3, cash, 그리고 종속변수인 NAV이며

NAV = 10071696173
day1 = 1+np.array([-0.01086,-0.01052,-0.01402,-0.01738,0.00554,0.00700,-0.00767,-0.00156,-0.00124,-0.00080,-0.04595,0.01138,0.01195,-0.01243,0.00010])
day2 = 1+np.array([0.00556,-0.00433,0.01961,0.01846,0.00910,0.01639,0.00159,-0.00005,-0.00332,0.00925,0.02452,-0.00562,0.00762,0.00787,0.00015])
day3 = 1+np.array([-0.01858,-0.02611,-0.01913,-0.00038,0.00792,0.01221,-0.01090,-0.00220,0.00000,-0.01474,0.02564,0.01810,0.01190,-0.01197,-0.00015])
cash = 10000000000
sum1 = np.ones(15)
sum1 = sum1.T

독립변수 a1~g1을 활용해서 NAV을 구하는 식은 다음과 같습니다.

X= np.array([a1,a2,b1,b2,b3,b4,c1,c2,c3,d1,d2,e1,f1,f2,g1])
day3_NAV=([int(round(x,6)) for x in ([int(round(x,6)) for x in (0.01*cash*X*day1*day2)]*day3)]@sum1)+int(round(cash*(1-0.0100015*X@sum1),6))
if day3_NAV==NAV:
    print(X)

이때 독립변수들의 값을 찾을려고 하는데 중첩 for문과 dataframe으로 변환해서 만든 알고리즘의 경우는 N값이 너무 커서 작동하지 않습니다.

import numpy as np
NAV = 10071696173
day1 = 1+np.array([-0.01086,-0.01052,-0.01402,-0.01738,0.00554,0.00700,-0.00767,-0.00156,-0.00124,-0.00080,-0.04595,0.01138,0.01195,-0.01243,0.00010])
day2 = 1+np.array([0.00556,-0.00433,0.01961,0.01846,0.00910,0.01639,0.00159,-0.00005,-0.00332,0.00925,0.02452,-0.00562,0.00762,0.00787,0.00015])
day3 = 1+np.array([-0.01858,-0.02611,-0.01913,-0.00038,0.00792,0.01221,-0.01090,-0.00220,0.00000,-0.01474,0.02564,0.01810,0.01190,-0.01197,-0.00015])
cash = 10000000000
sum1 = np.ones(15)
sum1 = sum1.T

for a1 in range(41):
    for a2 in range(21):
        if a1+a2>=10 and a1+a2<=40:
            for b1 in range(21):
                for b2 in range(21):
                    for b3 in range(21):
                        for b4 in range(21):
                            if b1+b2+b3+b4>=10 and b1+b2+b3+b4<=40:
                                for c1 in range(51):
                                    for c2 in range(41):
                                        for c3 in range(5,41):
                                            if c1+c2+c3<=60 and c1+c2+c3>=20:
                                                for d1 in range(16):
                                                    for d2 in range(16):
                                                        if d1+d2>=5 and d1+d2<=20:
                                                            for e1 in range(21):
                                                                for f1 in range(21):
                                                                    for f2 in range(21):
                                                                        for g1 in range(51):
                                                                            X= np.array([a1,a2,b1,b2,b3,b4,c1,c2,c3,d1,d2,e1,f1,f2,g1])
                                                                            day3_NAV=([int(round(x,6)) for x in ([int(round(x,6)) for x in (0.01*cash*X*day1*day2)]*day3)]@sum1)+int(round(cash*(1-0.0100015*X@sum1),6))
                                                                            if day3_NAV==NAV:
                                                                                print(X)
                                                                                exit(0)
import pandas as pd
from functools import reduce
import numpy as np
NAV = 10071696173
day1 = 1+np.array([-0.01086,-0.01052,-0.01402,-0.01738,0.00554,0.00700,-0.00767,-0.00156,-0.00124,-0.00080,-0.04595,0.01138,0.01195,-0.01243,0.00010])
day2 = 1+np.array([0.00556,-0.00433,0.01961,0.01846,0.00910,0.01639,0.00159,-0.00005,-0.00332,0.00925,0.02452,-0.00562,0.00762,0.00787,0.00015])
day3 = 1+np.array([-0.01858,-0.02611,-0.01913,-0.00038,0.00792,0.01221,-0.01090,-0.00220,0.00000,-0.01474,0.02564,0.01810,0.01190,-0.01197,-0.00015])
cash = 10000000000
sum1 = np.ones(15)
sum1 = sum1.T
a1df = pd.DataFrame({'a1': range(41), 'key': 1})
a2df = pd.DataFrame({'a2': range(21), 'key': 1})
b1df = pd.DataFrame({'b1': range(21), 'key': 1})
b2df = pd.DataFrame({'b2': range(21), 'key': 1})
b3df = pd.DataFrame({'b3': range(21), 'key': 1})
b4df = pd.DataFrame({'b4': range(21), 'key': 1})
c1df = pd.DataFrame({'c1': range(51), 'key': 1})
c2df = pd.DataFrame({'c2': range(41), 'key': 1})
c3df = pd.DataFrame({'c3': range(5,41), 'key': 1})
d1df = pd.DataFrame({'d1': range(16), 'key': 1})
d2df = pd.DataFrame({'d2': range(16), 'key': 1})
e1df = pd.DataFrame({'e1': range(21), 'key': 1})
f1df = pd.DataFrame({'f1': range(21), 'key': 1})
f2df = pd.DataFrame({'f2': range(21), 'key': 1})
g1df = pd.DataFrame({'g1': range(51), 'key': 1})

dfs = [a1df,a2df,b1df,b2df,b3df,b4df,c1df,c2df,c3df,d1df,d2df,e1df,f1df,f2df,g1df]

df = reduce(lambda left,right: pd.merge(left,right, on=['key']),dfs)[['a1','a2','b1','b2','b3','b4','c1','c2','c3','d1','d2','e1','f1','f2','g1']]
for a in range(11163200):
    X=df.values[a]
    day3_NAV=([int(round(x,6)) for x in ([int(round(x,6)) for x in (0.01*cash*X*day1*day2)]*day3)]@sum1)+int(round(cash*(1-0.0100015*X@sum1),6))
    if day3_NAV==NAV:
        print(X)
        break

혹시 다른 방법이 있을까요?

  • scipy solve , sympy solve 같은거? (잘 모름) 탐색공간이 너무 넓어서 루프 돌아서는 안 될 것 같아요. nowp 2022.6.29 17:37

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)