C#: Печать всех свойств объекта [дубликат]

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

df = pd.DataFrame({
        'Country': ['AB', 'CD', 'EF', 'FG']*20,
        'ColumnA' : [1]*20*4,'ColumnB' : [10]*20*4, 'Label': [1,0,1,0]*20
    })

df['Country_Code'] = df['Country'].astype('category').cat.codes

X = df.loc[:, df.columns.drop(['Label','Country'])]
y = df['Label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=df.Country_Code)
lm = LinearRegression()
lm.fit(X_train,y_train)
lm_predictions = lm.predict(X_test)
  • Преобразовать строковые значения в country в числа и сохранить их как новый столбец
  • При создании x отбрасывание данных поезда label (y), а также строка country столбцов

Метод 2

Если ваши тестовые данные, по которым вы будете делать прогнозы, появятся позже, вам понадобится механизм для преобразования их country в [ 118], прежде чем делать прогнозы. В таких случаях рекомендуется использовать метод LabelEncoder, для которого можно использовать метод fit для кодирования строк в метках, а затем использовать transform для кодирования страны тестовых данных.

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn import preprocessing

df = pd.DataFrame({
        'Country': ['AB', 'CD', 'EF', 'FG']*20,
        'ColumnA' : [1]*20*4,'ColumnB' : [10]*20*4, 'Label': [1,0,1,0]*20
    })

# Train-Validation 
le = preprocessing.LabelEncoder()
df['Country_Code'] = le.fit_transform(df['Country'])
X = df.loc[:, df.columns.drop(['Label','Country'])]
y = df['Label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=df.Country_Code)
lm = LinearRegression()
lm.fit(X_train,y_train)

# Test
test_df = pd.DataFrame({'Country': ['AB'], 'ColumnA' : [1],'ColumnB' : [10] })
test_df['Country_Code'] = le.transform(test_df['Country'])
print (lm.predict(test_df.loc[:, test_df.columns.drop(['Country'])]))
171
задан Svish 12 May 2009 в 10:53
поделиться

8 ответов

Класс ObjectDumper, как известно, делает это. Я никогда не подтверждал, но я всегда подозревал, что немедленное окно использует это.

РЕДАКТИРОВАТЬ: Я только что понял, что код ObjectDumper находится на вашем компьютере. Перейдите по адресу:

c: / Program Files / Microsoft Visual Studio 9.0 / Samples / 1033 / CSharpSamples.zip

Это будет распаковано в папку с именем LinqSamples. Там есть проект ObjectDumper. Используйте это.

(Это также порадует Дэвида в комментариях :))

64
ответ дан 23 November 2019 в 20:41
поделиться

Для этого можно использовать класс TypeDescriptor :

foreach(PropertyDescriptor descriptor in TypeDescriptor.GetProperties(obj))
{
    string name=descriptor.Name;
    object value=descriptor.GetValue(obj);
    Console.WriteLine("{0}={1}",name,value);
}

TypeDescriptor находится в пространстве имен System.ComponentModel и является API-интерфейсом Visual Studio использует для отображения вашего объекта в его обозревателе свойств. В конечном итоге он основан на отражении (как и любое другое решение), но обеспечивает довольно хороший уровень абстракции от API отражения.

299
ответ дан 23 November 2019 в 20:41
поделиться

Может быть, через JavaScriptSerializer.Serialize ?

25
ответ дан 23 November 2019 в 20:41
поделиться

Что касается TypeDescriptor из ответа Шона (я не могу комментировать, потому что у меня плохая репутация) ... одним из преимуществ использования TypeDescriptor над GetProperties () является то, что TypeDescriptor имеет механизм для динамического присоединения свойств к объектам во время выполнения и нормального отражения будут их пропускать.

Например, при работе с PowerShell PSObject, свойства и методы которого могут быть добавлены во время выполнения, они реализовали настраиваемый TypeDescriptor, который объединяет эти элементы со стандартным набором элементов. Используя TypeDescriptor, ваш код не должен знать об этом факте.

Компоненты, элементы управления и, я думаю, возможно, DataSets также используют этот API.

6
ответ дан 23 November 2019 в 20:41
поделиться

Именно для этого и нужно отражение. Я не думаю, что есть более простое решение, но рефлексия в любом случае не требует большого количества кода.

1
ответ дан 23 November 2019 в 20:41
поделиться

Любое другое решение / библиотека в конечном итоге будет использовать отражение для анализа типа ...

0
ответ дан 23 November 2019 в 20:41
поделиться

Следующий фрагмент выполнит желаемую функцию:

Type t = obj.GetType(); // Where obj is object whose properties you need.
PropertyInfo [] pi = t.GetProperties();
foreach (PropertyInfo p in pi)
{
    System.Console.WriteLine(p.Name + " : " + p.GetType());
}

Я думаю, если вы напишете это как метод расширения, вы сможете использовать его для всех типов объектов.

5
ответ дан 23 November 2019 в 20:41
поделиться

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

РЕДАКТИРОВАТЬ:
Проверьте это . Я исследовал некоторую отладку на длинных графах объектов и заметил это, когда я добавил Watches, VS выдает в этом классе: Mscorlib_CollectionDebugView <> . Это внутренний тип для удобного отображения коллекций для просмотра в окнах просмотра / режимах отладки кода. Теперь, потому что он внутренний, вы можете ссылаться на него, но вы можете использовать Reflector, чтобы скопировать (из mscorlib) код и получить свой собственный (ссылка выше содержит пример копирования / вставки). Выглядит действительно полезно.

0
ответ дан 23 November 2019 в 20:41
поделиться
Другие вопросы по тегам:

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