Чтобы найти максимальное значение корреляции из файла CSV 20000 строк эффективно в python - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть CSV-файл с 12 столбцами и 20000 строками и 12 изображениями формы 100 * 100, т. Е. 10000 пикселей. Мне нужно провести каждый пиксель через 20000 точек данных в файле CSV, чтобы найти максимальную корреляцию. Вот моя функция:

def Corrlate(pixels):
  max_value = -1
  max_roc = 0
  max_val = 0
  if(len(pixels[pixels != 0]) == 0):
        max_soc = 0
  else: 
      for index, row in data.iterrows():

        val = [row['B2'], row['B3'], row['B4'],
               row['B5'], row['B6'], row['B7'], 
               row['B8'], row['B11'], row['B12']]
        corr = np.corrcoef(pixels, val)
        if (corr > max_value).any(): 
          max_value = corr
          max_soc = row['SOC']
          max_val = val

  return max_soc
pixel = [0.1459019176,0.209071098,0.2940336262,0.3246242805,0.349758679,0.375791541,0.3990873849,0.5312103156,0.4791704195]
data = pd.read_csv("test.csv")
Corrlate(pixel)

test.csv

Or.,B2,B3,B4,B5,B6,B7,B8,B11,B12,SOC
0,0.09985147853,0.1279325334,0.1735545485,0.1963891543,0.2143978866,0.2315615778,0.2477941219,0.3175400435,0.3072681177,91.1
1,0.1353946488,0.1938304482,0.2661696295,0.2920155645,0.3128841044,0.3351216611,0.3539684059,0.4850393799,0.4505173283,21.4
2,0.1307552092,0.2112897844,0.3084664959,0.3367929562,0.3613391345,0.3852476516,0.4031711988,0.5193408686,0.4661771688,15.6
.
.
.
.
.
20000,0.1307552092,0.2112897844,0.3084664959,0.3367929562,0.3613391345,0.3852476516,0.4031711988,0.5193408686,0.4661771688,15855.6

Приведенную выше функцию необходимо запустить 10000 раз для изображения формы 100 * 100. В моей машине это заняло 2,5 часа, чтобы завершить процесс. Есть ли какое-либо эффективное решение для запуска этого процесса с меньшими затратами времени.

1 Ответ

1 голос
/ 07 апреля 2020

Я думаю, что вы могли бы использовать apply вместо итерации по строкам, это всегда довольно неэффективно.

Похоже, вы уже используете pandas, я бы также рекомендовал использовать библиотеку pandarallel для распространения метода apply.

def func_to_apply(row) :
      val = [row['B2'],row['B3'],row['B4'],
             row['B5'],row['B6'],row['B7'],
             row['B8'],row['B11'],row['B12']]

      corr = np.corrcoef(randompixels,val)
      return corr

data["corr"] = data.apply(func_to_apply,axis=1)
data[data["corr"].max()==data["corr"]]["SOC"]

Это было бы нераспределенным способом.

Использование pandarallel:

from pandarallel import pandarallel
pandarallel.initialize()

data["corr"] = data.parallel_apply(func_to_apply,axis=1)
data[data["corr"].max()==data["corr"]]["SOC"]

Написал код без тестирования, но он должен работать, дайте мне знать, если что-то не так или это помогло.

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