Маскируемый пандой массив данных назначает 2D массив - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь разгадать загадку с массивом данных и замаскированным массивом.

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

Задача Это функция, которая использует то, что я назвал моделью, и может выполнять преобразование из данных.Затем я хочу установить эти новые данные на новый или существующий столбец.Я не использую функцию применения, потому что, если я делаю это, я теряю возможность извлекать несколько данных одновременно с паррализмом (поэтому я сначала извлекаю, а затем применяю «функции».

Здесьэто загадка, я хочу работать с маской, потому что без этой маски я не могу изменить исходный фрейм данных. Если вы удалите эту маску, если фрейм данных и функции имеют одинаковое количество строк, все в порядке. Теперь, если я добавлю эту маску,Кажется, что он принимается построчно и несоответствие размеров .... РЕДАКТИРОВАТЬ: я забыл сказать, что «особенности» соответствуют 2d массив Numpy.

Ошибка

ValueError: Должны иметь равные len ключи и значение при установке с помощью ndarray

Код

def transform(dataframe, tags, out, model, mask=None):
    # Check mandatory fields
    mandatory = ['datum']
    if not isinstance(tags, dict) or not all(elem in mandatory for elem in tags.keys()):
        raise Exception(f'Not a dict or missing tag: {mandatory}.')

    # Mask creation (see pandas view / copy mechanism)
    if mask is None:
        mask = [True] * len(dataframe.index)

    features = model.transform(dataframe.loc[mask, tags['datum']].to_numpy())
    dataframe.loc[mask, out] = features.tolist()
    return dataframe

Пример Данные могут быть примерно такими:

строка; данные; метка

0; [61953.017837947686, 9.505037089204054, 74,585 ...]; 0

1; [80832.69302693632, 9,524642547991316, 83,9228 ...]; 1

Модель может быть PCA от skучиться.Метод может быть примерно таким:

transform(dataframe, {'datum': 'Data'}, 'PCA', PCA(), mask=dataframe[dataframe['Label']==1)

Тогда вывод будет:

Row;Данные ;Этикетка ;PCA

0;[61953.017837947686, 9.505037089204054, 74,585 ...]; 0;[74,585 ...]

1;[80832.69302693632, 9.524642547991316, 83.9228 ...]; 1;[92.578 ...]

Текущее решение

mask = inputs[condition]
inputs['PCA'] = np.nan
inputs[mask] = Classification.transform(inputs[mask], {'datum': 'Data'}, wavelet, 'PCA')

def transform(dataframe, tags, model, out):
    # Check mandatory fields
    mandatory = ['datum']
    if not isinstance(tags, dict) or not all(elem in mandatory for elem in tags.keys()):
        raise Exception(f'Not a dict or missing tag: {mandatory}.')

    features = model.transform(dataframe[tags['datum']].to_numpy())
    dataframe[out] = features.tolist()
    return dataframe

Спасибо за ответы!С наилучшими пожеланиями

1 Ответ

0 голосов
/ 24 сентября 2019

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

Итак, я изменяю свое первое предложение.Вот окончательная версия:

def transform(dataframe, tags, model, out, mask=None):
    # Check mandatory fields
    mandatory = ['datum']
    if not isinstance(tags, dict) or not all(elem in mandatory for elem in tags.keys()):
        raise Exception(f'Not a dict or missing tag: {mandatory}.')

    # Mask creation (see pandas view / copy mechanism)
    if mask is None:
        mask = [True] * len(dataframe.index)

    # dataframe[out] = np.nan
    features = model.transform(dataframe.loc[mask, tags['datum']].to_numpy())
    dataframe.loc[mask, out] = pd.Series(features.tolist())
    return dataframe

Вместо того, чтобы делать dataframe.loc [mask, out] = features.tolist (), я переключаюсь на: dataframe.loc [mask, out] = pd.Series (features.tolist ()).Проходя серию, она без проблем подходит.

Спасибо, Кен Сайм, за участие в моей проблеме.

...