Представленные пиксельные данные ширины для каждого символа в шрифте браузера

Вы должны применять 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)
6
задан Devon 2 October 2008 в 14:49
поделиться

12 ответов

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

Используя фиксированные ширины обычно плохая идея.

2
ответ дан 10 December 2019 в 00:46
поделиться

Так как размер шрифта может быть легко изменен на стороне браузера, Ваше вычисление серверной стороны сделано недопустимым очень легко.

Быстрая клиентская фиксация должна была бы разработать Ваши ячейки с водосливным атрибутом:

td
{
    overflow: scroll; /* or overflow: hidden;  etc. */
}

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

0
ответ дан 10 December 2019 в 00:46
поделиться

У некоторых пользователей есть большие или меньшие настройки стандартного шрифта. Вы не можете сделать этого на сервере. Можно только измерить его, после того как браузер представил страницу.

0
ответ дан 10 December 2019 в 00:46
поделиться

Вы могли поместить текст в невидимый промежуток и считать, что ширина промежутков, но 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]

0
ответ дан 10 December 2019 в 00:46
поделиться
http://www.css3.info/preview/text-overflow/

Это - новая функция css3.

0
ответ дан 10 December 2019 в 00:46
поделиться

Если Вы соглашаетесь с этим не работающим на FireFox, почему не только используют CSS? Имейте таблицу с таблицей-layout:fixed, имейте рассматриваемый столбец, имеют overflow:hidden; текст-overflow:ellipsis; белый-space:nowrap.

0
ответ дан 10 December 2019 в 00:46
поделиться

Это чрезвычайно невозможно сделать на стороне сервера. В дополнение к проблеме людей, устанавливающих различные шрифты, у Вас также есть кернинг (буква "f" поднимет другую сумму пространства в зависимости от того, что рядом с ним), и опции рендеринга шрифта (cleartype на? "большие шрифты"?).

0
ответ дан 10 December 2019 в 00:46
поделиться

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

Это работает немного более быстро, чем я ожидал. И это предполагает, что содержание ячеек является текстом только - любой 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();
      }

    }
  });

}
1
ответ дан 10 December 2019 в 00:46
поделиться

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

Попробуйте это вместо этого:

table-layout: fixed;

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

1
ответ дан 10 December 2019 в 00:46
поделиться

Расширение JS имеет модуль, чтобы сделать просто это

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

Я уверен, что существуют другие библиотеки, доступные там, которые делают это также.

3
ответ дан 10 December 2019 в 00:46
поделиться

Как насчет переполнения: прокрутить?

3
ответ дан 10 December 2019 в 00:46
поделиться

Нет ничего, что можно сделать серверную сторону для вычисления его. Все, с чем необходимо работать, является идентификационной строкой браузера, которая может или не может сказать Вам операционную систему и браузер пользователя точно. Можно также "спросить" (через тег шрифта или CSS), чтобы определенный шрифт использовался для отображения текста, но нет никакой гарантии, что пользователю установили тот шрифт. Кроме того пользователь мог иметь другую установку DPI на уровне операционной системы, или, возможно, сделал текст больше или меньшим с функцией масштабирования браузера, или мог использовать их собственную таблицу стилей в целом.

0
ответ дан 10 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: