Как умножить DataFrame pandas на массив numpy

Вопрос или проблема

У меня есть простая программа для выполнения PCA-анализа на наборе данных. Цель состоит в том, чтобы умножить набор данных на вектор признаков в конце программы.

import pandas as pd
import numpy as np
from numpy import linalg as LA

def main():
    s = pd.read_csv('A1-dm.csv')
    s = pca(s)

def pca(s):
    # Нормализовать каждый s
    A1 = s[['A1']].to_numpy()
    A2 = s[['A2']].to_numpy()

    print(A1.ndim)
    if 'A3' in s:
        A3 = s[['A3']].to_numpy()
        A3_norm = A3/np.linalg.norm(A3)

    A1_norm = A1/np.linalg.norm(A1)
    A2_norm = A2/np.linalg.norm(A2)

    data = np.array([A1_norm,A2_norm])
    if 'A3' in s:
        data = np.array([A1_norm,A2_norm,A3_norm]).squeeze()

    # определение ковариации
    covMatrix = np.cov(data,bias=True)
    print(covMatrix)

    # вычисление собственных векторов и собственных значений
    w, v = LA.eig(covMatrix)
    print("собственные векторы")
    print(v)

    print("собственные значения")
    print(w)

    varianceV = np.empty(3)

    # вычисление дисперсий
    varianceV[0] = w[0]/(w[0]+w[1]+w[2])
    varianceV[1] = w[1]/(w[0]+w[1]+w[2])
    varianceV[2] = w[2]/(w[0]+w[1]+w[2])

    print(f' дисперсия v1 : {varianceV[0]}')
    print(f' дисперсия v2 : {varianceV[1]}')
    print(f' дисперсия v3 : {varianceV[2]}')

    # вычисление вектора признаков
    v_initial = 0
    featureVector = np.empty(3)
    for i in range(0,3):
        if varianceV[i] > v_initial:
            featureVector = v[i]

    print(f'вектор признаков: {featureVector}')
    resolved_dataset = np.concatenate(featureVector,s.to_numpy())
    print(f'набор данных = {resolved_dataset}')

main()

Ожидается:
3×3 матрица, состоящая из столбцов A1, A2, A3, должна быть умножена на 3×1 вектор так, чтобы возвращенный набор данных был преобразован через главные компоненты.

Фактический:

2
[[ 2.22742836e-03 -1.08176619e-04  1.28813346e-03]
 [-1.08176619e-04  2.37308545e-03 -5.81124131e-05]
 [ 1.28813346e-03 -5.81124131e-05  7.48662113e-04]]
собственные векторы
[[-0.50114911 -0.84926886  0.16610832]
 [-0.0016557   0.19289331  0.98121834]
 [ 0.86535936 -0.49146168  0.09807444]]
собственные значения
[2.78617954e-06 2.99742571e-03 2.34896403e-03]
 дисперсия v1 : 0.0005208614522544459
 дисперсия v2 : 0.5603528012046752
 дисперсия v3 : 0.4391263373430704
вектор признаков: [ 0.86535936 -0.49146168  0.09807444]
Ошибка трассировки (последний вызов был выполнен):
  Файл ".\cov.py", строка 62, в <module>
    main()
  Файл ".\cov.py", строка 8, в main
    s = pca(s)
  Файл ".\cov.py", строка 59, в pca
    resolved_dataset = np.concatenate(featureVector,s.to_numpy())
TypeError: только целочисленные массивы с масштабами могут быть преобразованы в скалярный индекс

Вот пример набора данных

A1,A2,A3,Class
2,0.4631338,1.5,3
8,0.7460648,3.0,3
6,0.264391038,2.5,2
5,0.4406713,2.3,1
2,0.410438159,1.5,3
2,0.302901816,1.5,2
6,0.275869396,2.5,3
8,0.084782428,3.0,3
2,0.53226533,1.5,2
8,0.070034818,2.9,1
2,0.668631847,1.5,2
2,0.215622639,1.5,2
2,0.148916231,1.5,3
2,0.51335434,1.5,3

Любая помощь в выяснении, как выполнить эту операцию, будет очень признательна. Спасибо.

Если я правильно понимаю, вы просто хотите умножить вектор признаков на каждый из столбцов вашего набора данных, т.е. 0.865 * 2, -0.491 * 0.463 и 0.098 * 1.5. Это можно просто сделать, используя знак *:

import pandas as pd

df = pd.read_csv("data.csv")
feature_vector = [0.8653593, -0.49146168, 0.09807444]

df[["A1", "A2", "A3"]] = df[["A1", "A2", "A3"]] * feature_vector

Что возвращает следующий dataframe:

A1 A2 A3 Class
1.73072 -0.227613 0.147112 3
6.92287 -0.366662 0.294223 3
5.19216 -0.129938 0.245186 2
4.3268 -0.216573 0.225571 1
1.73072 -0.201715 0.147112 3

Ответ или решение

Для выполнения умножения DataFrame Pandas на вектор NumPy, в данном контексте, который вы описали в процессе анализа главных компонент (PCA), необходимо уточнить несколько аспектов вашего кода и воплотить правильный подход к операции.

1. Общее описание задачи

Вы хотите преобразовать ваш набор данных, представленный в виде DataFrame, с использованием вектора признаков, полученного из анализа PCA. Это преобразование позволит вам помочь в визуализации данных и в дальнейшем анализе.

2. Умножение DataFrame на вектор

Первым делом, ниже представлен корректный метод использования операции умножения для преобразования ваших данных:

import pandas as pd
import numpy as np

def main():
    # Загрузка данных
    df = pd.read_csv('A1-dm.csv')
    feature_vector = np.array([0.86535936, -0.49146168, 0.09807444])

    # Умножение DataFrame на вектор
    df[['A1', 'A2', 'A3']] = df[['A1', 'A2', 'A3']].values * feature_vector

    print(df)

main()

3. Пошаговое объяснение

Шаг 1: Загрузка данных

Здесь вы загружаете данные из CSV-файла, в котором находятся ваши показатели A1, A2 и A3, которые вы будете умножать на вектор признаков.

Шаг 2: Определение вектора признаков

Вектор признаков — это массив NumPy, который вы получили из анализа PCA. Убедитесь, что он имеет ту же размерность, что и колонки, которые вы хотите умножать.

Шаг 3: Умножение DataFrame на вектор

Используйте метод .values, чтобы извлечь ваши данные в виде массива NumPy для выполнения операции умножения. Важно выделить только те колонки, с которыми вы хотите работать, и назначить результат обратно в соответствующие колонки DataFrame.

4. Решение возникшей ошибки

Вы сталкивались с ошибкой TypeError: only integer scalar arrays can be converted to a scalar index, что указывает на неверное использование np.concatenate. Для выполнения этого действия используется просто операция умножения, как показано выше.

5. Пример результата

При правильном выполнении этих шагов вы получите новый DataFrame, в котором значения колонок A1, A2 и A3 будут умножены на соответствующий элемент вектора признаков. Это позволит вам проверить, как преобразуются ваши данные во времени PCA.

Заключение

Суммируя, умножение DataFrame Pandas на вектор NumPy простое и эффективное. Главное – убедиться, что размеры ваших массивов совместимы и правильно обработать данные после загрузки. Это основа для успешного выполнения анализа PCA и дальнейшей работы с данными.

Оцените материал
Добавить комментарий

Капча загружается...