Альтернатива множеству для циклов и медленных функций - PullRequest
0 голосов
/ 14 апреля 2020

Мне нужно вычислить комбинацию различных сценариев ios (обозначено как столбцы DF1, DF2 и D3) и передать их через функцию в 3 для циклов ниже. Функция не получает массив в качестве входных данных, поэтому мне приходится перебирать строки для передачи параметров один за другим.

Однако, это становится действительно медленным и занимает очень много времени (индекс увеличивается до 3000, умножается на 6 * 3 * 3 для i, j, k). Есть ли способ упростить это? Буду признателен за вашу помощь, так как я не нашел такой пример, который должен проходить через строки и циклы.

 count=0
  for index, row in DF.iterrows():
    print(index)
    for i in range(0,6):
      for j in range(0,3):
        for k in range(0,3):
          OUT.loc[index,count]=FUNCTION(DF1[index,k],DF2[index,i],DF3[index,j],row[col])
          count += 1 

Правка

Функция взята отсюда set_tmp (которая не берет столбец кадра данных, поэтому я должен пропустить строку данных за строкой): pythermalcomfort https://github.com/CenterForTheBuiltEnvironment/pythermalcomfort/blob/master/examples/calc_set_tmp.py

DF1.head(3) 
    Temp    T10p    T90p
1   303.04935   302.04935   304.04935
236 303.57208   302.57208   304.57208
471 301.36523   300.36523   302.36523

DF2.head(3)
    Tmrt_1     Tmrt_2      Tmrt_3      Tmrt_4      Tmrt_5       Tmrt_6
1   25.80   23.52   21.91   25.63   23.51   21.97088
236 25.61   23.38   21.81   25.50   23.42   21.92352
471 24.91   22.76   21.23   24.81   22.78   21.31014

DF3.head(3)
WindSpeed   V10p    V90p
1   2.26    1.134   3.4030
236 1.66    0.831   2.4958
471 1.83    0.915   2.7475

Tnx за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Может быть, вам нужно переосмыслить свой подход. Иногда нестандартное мышление приводит нас к решению с O(1) сложностью по времени. Если вы зададите свой первоначальный вопрос, например, зачем вам нужна комбинация, тогда я могу вам помочь. Может быть, вам вообще не нужна комбинация.

0 голосов
/ 16 апреля 2020
import pandas as pd
import random
import time
import numpy as np
import itertools as it

def f(a,b,c,d):
    return int(a+b+c+d)

df1 = pd.DataFrame(np.random.rand(100,3))
df2 = pd.DataFrame(np.random.rand(100,6))
df3 = pd.DataFrame(np.random.rand(100,3))
df = pd.DataFrame(np.random.rand(100,1))
out = pd.DataFrame()
#till here we created the random data frames
start = time.time()
count = 0
for index,row in df.iterrows():
    for i in range(6):
        for j in range(3):
            for k in range(3):
                out.loc[index, count] = f(df1.at[index,k], df2.at[index,i], df3.at[index,j], row[0])
                count+=1
print(time.time()-start)
# for 100 rows time is +- 11 seconds
start1 = time.time()

out1 = pd.DataFrame()
for i,r in df.iterrows():
    tmp = []
    tmp.append(list(df1.loc[i])) #add each row as a list to tmp
    tmp.append(list(df2.loc[i]))
    tmp.append(list(df3.loc[i]))
    tmp.append([r[0]])
    all_comb = list(it.product(*tmp)) # create a list of all possible combinations from tmp
    count = 0
    for comb in all_comb:
        out1.loc[i,count] = f(*comb) #send combinations to same function
        count+=1

print(time.time()-start1)
#for 100 rows time is 0.8 seconds

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