Python — матрица с суммой двух переменных в зависимости от третьей

#python #matrix #pivot #heatmap

#python #матрица #сводная #тепловая карта

Вопрос:

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

 list1 = [[0,6,3], [100,6,1], [200,4,1], [300,3,0], [400,3,0], [500,0,0]]
cols = ['threshold', 'var_1', 'var_2']
raw = pd.DataFrame(list1, columns=cols)
raw.head()


threshold   var_1   var_2
     0        6       3
   100        6       1
   200        4       1
   300        3       0
   400        3       0 
 

И цель состоит в том, чтобы представить сумму обоих переменных, зависящих от порога, вот так, для использования в тепловой карте:

             500 3   1   1   0   0   0
            400 5   3   3   2   2   2
    var_1   300 6   4   4   3   3   3
            200 7   5   5   4   4   4
            100 9   7   7   6   6   6
              0 9   7   7   6   6   6
                0   100 200 300 400 500
                          var_2             
 

Я пробовал corrstab и pivot_table, но я не получаю этого результата.

Ответ №1:

После поиска в документации Pandas я также не смог найти какую-либо встроенную функцию, обеспечивающую результат, который вы показали. Существует одно самодельное решение, которое может вам подойти; оно опирается на итератор, сформированный с использованием itertools.product Python для представления всех комбинаций двух переменных.

Это решение не оптимизировано, поскольку для более масштабных данных этот итератор будет работать медленнее, чем встроенные модули от Numpy и Pandas. Однако для матрицы вашего размера она все равно должна быть довольно быстрой.

 list1 = [[0,6,3], [100,6,1], [200,4,1], [300,3,0], [400,3,0], [500,0,0]]
cols = ['threshold', 'var_1', 'var_2']
raw = pd.DataFrame(list1, columns=cols)
nrows = len(raw.index)
combos = itertools.product(range(nrows), range(nrows))
heatmap = np.zeros((nrows   1, nrows   1))
heatmap[:-1, 0] = np.flip(raw['threshold'])
heatmap[-1, 1:] = raw['threshold']
for combo in combos:
  heatmap[heatmap.shape[0] - combo[0] - 2, combo[1]   1] =
    raw['var_1'][combo[0]]   raw['var_2'][combo[1]]
print(heatmap)
 
 [[500.   3.   1.   1.   0.   0.   0.]
 [400.   6.   4.   4.   3.   3.   3.]
 [300.   6.   4.   4.   3.   3.   3.]
 [200.   7.   5.   5.   4.   4.   4.]
 [100.   9.   7.   7.   6.   6.   6.]
 [  0.   9.   7.   7.   6.   6.   6.]
 [  0.   0. 100. 200. 300. 400. 500.]]
 

Комментарии:

1. Спасибо за ваше время, я решил это аналогичным образом, потому что я не могу найти какой-либо встроенный метод. Еще раз большое спасибо!

Ответ №2:

Это лучшее, что я придумал. Кажется, это также эффективно, я пришел к этому soln после изучения шаблона

Код:

 import pandas as pd
import numpy as np

list1 = [[0,6,3], [100,6,1], [200,4,1], [300,3,0], [400,3,0], [500,0,0]]
cols = ['threshold', 'var_1', 'var_2']
raw = pd.DataFrame(list1, columns=cols)

for i, col_name in enumerate(raw['threshold'].values):
    raw[col_name] = raw.iloc[i,2]   raw.iloc[:,1]

print(raw)
 

Вывод:

    threshold  var_1  var_2  0  100  200  300  400  500
0          0      6      3  9    7    7    6    6    6
1        100      6      1  9    7    7    6    6    6
2        200      4      1  7    5    5    4    4    4
3        300      3      0  6    4    4    3    3    3
4        400      3      0  6    4    4    3    3    3
5        500      0      0  3    1    1    0    0    0