Вы должны применять FunctionTransformer
последовательно. Попробуйте это!
def create_pipeline(df):
all_but_recency = ['monetary', 'frequency1','frequency2']
# Preprocess
# Preprocess
preprocessor1 = ColumnTransformer([('log', FunctionTransformer(np.log), all_but_recency)],'passthrough')
preprocessor2 = ColumnTransformer([('standardize', preprocessing.StandardScaler(), all_but_recency)],'passthrough' )
# Pipeline
estimators = [('preprocess1', preprocessor1),('standardize', preprocessor2)]
pipe = Pipeline(steps=estimators)
print(pipe.set_params().fit_transform(df).shape)
рабочий пример
from sklearn.datasets import load_iris
import pandas as pd
import numpy as np
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import Normalizer
from sklearn.preprocessing import FunctionTransformer
from sklearn.pipeline import Pipeline
from sklearn import preprocessing
iris = load_iris()
X, y = iris.data, iris.target
df= pd.DataFrame(X,columns = iris.feature_names)
all_but_one = [0,1,2]
# Preprocess
preprocessor1 = ColumnTransformer([('log', FunctionTransformer(np.log), all_but_one)],'passthrough')
preprocessor2 = ColumnTransformer([('standardize', preprocessing.StandardScaler(), all_but_one)],'passthrough' )
# Pipeline
estimators = [('preprocess1', preprocessor1),('scalling', preprocessor2)]
pipe = Pipeline(steps=estimators,)
pipe.fit_transform(df)
Это не только было бы невозможно сделать серверную сторону, она не будет также иметь смысла. Вы не делаете, какой браузер Ваш клиент будет использовать, и Вы не знаете, какие параметры шрифта на стороне клиента переопределят любую информацию о форматировании, которую Вы присваиваете части HTML. Вы могли бы думать, что используете абсолютные пиксели расположения в своих свойствах стиля, но клиент мог просто игнорировать их или использовать некоторый плагин для изменения масштаба всего, потому что клиент использует экран высоких точек на дюйм.
Используя фиксированные ширины обычно плохая идея.
Так как размер шрифта может быть легко изменен на стороне браузера, Ваше вычисление серверной стороны сделано недопустимым очень легко.
Быстрая клиентская фиксация должна была бы разработать Ваши ячейки с водосливным атрибутом:
td
{
overflow: scroll; /* or overflow: hidden; etc. */
}
Лучшая альтернатива должна усечь Вашу строковую сторону сервера и предоставить простую подсказку JavaScript, которая может отобразить более длительную версию. "Расширять" кнопка может также помочь, который мог отобразить результат в отделении наложения.
У некоторых пользователей есть большие или меньшие настройки стандартного шрифта. Вы не можете сделать этого на сервере. Можно только измерить его, после того как браузер представил страницу.
Вы могли поместить текст в невидимый промежуток и считать, что ширина промежутков, но basicly это похоже на кого-то пытающегося саботировать Ваш сайт и поэтому я рекомендовал бы запретить сообщения со словами дольше, чем определенный lenth, например, 30 символов без пробелов (позволяющий ссылки быть длиннее!-)
- но простой подход должен поместить элемент блока в ячейке таблицы:
<td><div style="width:100px;overflow:hidden">a_really_long_string_of_text_like_this_with_no_line_breaks_makes_the_ta ... </div></td>
Это эффективно остановит создание помех таблицы! o]
http://www.css3.info/preview/text-overflow/
Это - новая функция css3.
Если Вы соглашаетесь с этим не работающим на FireFox, почему не только используют CSS? Имейте таблицу с таблицей-layout:fixed, имейте рассматриваемый столбец, имеют overflow:hidden; текст-overflow:ellipsis; белый-space:nowrap.
Это чрезвычайно невозможно сделать на стороне сервера. В дополнение к проблеме людей, устанавливающих различные шрифты, у Вас также есть кернинг (буква "f" поднимет другую сумму пространства в зависимости от того, что рядом с ним), и опции рендеринга шрифта (cleartype на? "большие шрифты"?).
Вот мое клиентское решение, которое я предложил. Это довольно характерно для моего приложения, но я совместно использую его здесь в случае, если кто-то еще сталкивается с той же проблемой.
Это работает немного более быстро, чем я ожидал. И это предполагает, что содержание ячеек является текстом только - любой HTML будет, форматируя быть стертым в процессе сокращения.
Это требует jQuery.
function fixFatColumns() {
$('table#MyTable td').each(function() {
var defined_width = $(this).attr('width');
if (defined_width) {
var actual_width = $(this).width();
var contents = $(this).html();
if (contents.length) {
var working_div = $('#ATempDiv');
if (working_div.is('*')) {
working_div.html(contents);
} else {
$('body').append('<div id="ATempDiv" style="position:absolute;top:-100px;left:-500px;font-size:13px;font-family:Arial">'+contents+'</div>');
working_div = $('#ATempDiv');
}
if (working_div.width() > defined_width) {
contents = working_div.text();
working_div.text(contents);
while (working_div.width() + 8 > defined_width) {
// shorten the contents of the columns
var working_text = working_div.text();
if (working_text.length > 1) working_text = working_text.substr(0,working_text.length-1);
working_div.text(working_text);
}
$(this).html(working_text+'...')
}
working_div.empty();
}
}
});
}
Очень очень трудно сделать серверную сторону. Вы никогда не можете знать то, что установили пользователи шрифтов, и существует много вещей, которые влияют на дисплей текста.
Попробуйте это вместо этого:
table-layout: fixed;
Это удостоверится, что таблица никогда не больше, чем размер, который Вы указали.
Расширение JS имеет модуль, чтобы сделать просто это
TextMetrics Обеспечивает точные пиксельные измерения для блоков текста так, чтобы можно было определить точно, насколько высокий и широкий, в пикселях, данный блок текста будет.
Я уверен, что существуют другие библиотеки, доступные там, которые делают это также.
Нет ничего, что можно сделать серверную сторону для вычисления его. Все, с чем необходимо работать, является идентификационной строкой браузера, которая может или не может сказать Вам операционную систему и браузер пользователя точно. Можно также "спросить" (через тег шрифта или CSS), чтобы определенный шрифт использовался для отображения текста, но нет никакой гарантии, что пользователю установили тот шрифт. Кроме того пользователь мог иметь другую установку DPI на уровне операционной системы, или, возможно, сделал текст больше или меньшим с функцией масштабирования браузера, или мог использовать их собственную таблицу стилей в целом.