안녕하세요. EDA 단계에서 수치형컬럼들의 기초통계량을 해보니 SeniorCitizen이 0과 1로 나뉘어있는거 같아 변수 확인 후, 해당 컬럼을 범주형으로 변환 후, 작업하였는데 이렇게 변경하여 작업해도 괜찮을까요 ? 범주형으로 변경 후, 작업하였을 때 # 원핫인코딩 : 946.3475544795037 946.7024808036148 # 레이블인코딩 : 951.0960435538027 952.7925407798712 다음과 같이 결과 값이 나왔습니다. 감사합니다 :)
# your code import pandas as pd df = pd.read_csv("https://raw.githubusercontent.com/lovedlim/inf/main/p1/members.csv") cols1 = df.columns[df.isnull().sum() >= len(df) * 0.3] df = df.dropna(subset=cols1) cols2 = df.columns[(df.isnull().sum() < len(df) * 0.3) & (df.isnull().sum() >= len(df) * 0.2)] for col in cols2: df[col] = df[col].fillna(df[col].mode()[0]) print(sum(df['f3'] == 'gold')) 문제에서 결측치가 30% 이상인 컬럼을 찾으라 했는데, 저는 이렇게 조건에 해당하는 컬럼들을 리스트 형태로 구해서 subset에 넘겨주었는데, 선생님 풀이를 보니 subset=['f1'] 이런 식으로 조건에 해당하는 컬럼의 이름을 직접 명시하셨더라구요..! 이런 문제를 풀 때 조건문을 이용해서 조건에 해당하는 컬럼들을 일괄적으로 선택할 필요는 없나요? 제가 아직 이 시험의 문제 유형을 잘 파악하지 못했는데, 이 시험이 혹시 코딩테스트를 예로 들면 "2+3의 값을 출력하시오" 라는 문제의 답을 print(2+3)이 아닌 print(5)로 써도 답은 맞으니 정답 처리가 되는 방식인가요? 감사합니다.
안녕하세요. Child()에 명시적으로 부모 생성자를 호출하는 문구가 있어서 [Parent: 5 [Parent default 가 호출되는 것 이해했습니다. 그럼 Child(){ 안에 super()가 없고, this.display()부터 시작하는 상태라도 출력값은 동일한가요? 자식 생성자 생성 전에 부모 생성자 먼저 생성돼야 하고, 부모 클래스에 기본 생성자가 정의되어 있으니까요. 감사합니다.
2유형 개념 강의 중 classification(분류) 문제 질문있습니다. label 인코딩 할 때 범주형 자료를 선택하기 위해 cols = train.select _dtypes(include='object')를 사용한다고 했습니다. 그 후 Min-Max 스케일링을 진행할 때 강의에서는 리스트 형태로 cols 변수에 직접 수치형 컬럼을 입력했지만 cols = train. select _dtypes (exclude= 'object' ) 또는 include=['int','float'] 으로도 선택할 수 있을 것을 것이라 생각해서 실행했더니 에러가 발생합니다. ValueError : Boolean array expected for the condition, not int64 제 방법대로 진행했을 때 cols에 선택된 데이터를 보면 강의에서 직접 리스트 형태로 입력한 컬럼에 추가로 'id' 컬럼이 더 선택된 것으로 보입니다. 이렇게 진행했을 때 왜 에러가 발생하는지, 에러가 발생하지 않아도 id 컬럼이 추가로 선택된 상태로 진행했을 때 문제가 있는지 질문 드립니다! 강의 내용 cols = ['age', 'fnlwgt', 'education.num', 'capital.gain', 'capital.loss', 'hours.per.week'] def get_data(): train_copy = train.copy() test_copy = test.copy() return train_copy, test_copy train_copy, test_copy = get_data() from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() display(train_copy[cols].head(2)) train_copy[cols] = scaler.fit_transform(train_copy[cols]) test_copy[cols] = scaler.transform(test_copy[cols]) display(train_copy[cols].head(2)) 제 코딩 내용은 위 코드에서 cols = ['age', 'fnlwgt', 'education.num', 'capital.gain', 'capital.loss', 'hours.per.week'] 부분을 cols = train.select_dtypes(include=['int','float']) 또는 cols = train.select_dtypes(exclude='object') 이렇게 바꿨습니다
안녕하세요. 직전 강의에서 객체 생성 시 가장 먼저 생성자를 실행해야 한다고 설명해 주셨습니다. 그런데 본 강의 예제에서는 생성자 메서드를 실행하지 않네요. 업캐스팅인 경우에는 생성자를 실행하지 않는건가요? 감사합니다. 수정: 다른 질문을 보니 생성자를 실행하는 것 같네요. 4:00 예제의 경우 Car 생성자: Tesla Model 3 2021 ElectricCar 생성자: 75 kWh (이하생략) 부모, 자식 생성자가 각각 이렇게 출력된다고 답변해 주셨는데, 이건 둘다 기본 생성자가 없어서 그런거 맞나요? 만약 Car 클래스에 파라미터 없는 기본 생성자가 있었으면 부모 클래스에는 기본 생성자 실행, 자식 클래스에는 파라미터 있는 생성자 실행이 되는게 맞나요?
태현님 안녕하세요! 해당 강의를 듣던 중 의문점이 있어서 질문을 드릴려고 합니다. public class Person { private final String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } // getter, setter 생략... } 위와 같은 예제 코드가 있다고 하면 위와 같은 코드를 코틀린으로 변경하면 강의에서는 아래와 같다고 하셨습니다. class Person( val name: String, val age: Int, ) 이러면 자동으로 getter/setter를 자동으로 만들어주신다고 하셨는데요. 저는 이것이 자동으로 만들어주는게 아니라 당연하다고 생각합니다. 왜냐하면 프로퍼티 접근 제어자가 public이니까요! 자바도 public으로 변경하면 코틀린처럼 필드에 접근해서 사용이 가능하다고 생각이 드는데요. 이런 케이스에 대해서 태현님의 의견을 좀 더 듣고 싶습니다. 또한, 당연히 코틀린에서는 getter를 호출하겠지만 필드 자체를 private으로 두지 않으면 객체지향 원칙중에 하나로 캡슐화가 좋지 못하다는 판단이 들더라구요! 또한 코틀린에서는 접근제어자를 private으로 두면 당현한 이야기지만 강의에서 설명주신 것처럼 접근이 안되서 강제 getter/setter를 만들어야 하는데 이것에 대해도 듣고 싶습니다. 다음 질문으로는 생성자 관련 질문입니다. 자바는 아래처럼 생성자를 여러개 만들 수 있습니다. public class Person { private String name; private int age; public Person(String name) { this.name = name; } public Person(String name, int age) { this.name = name; this.age = age; } // getter, setter 생략... } 논리적으로 도메인 흐름상 하나의 파라미터만 있는 생성자는 사용되지를 않겠지만 이런 케이스에서 코틀린은 어떻게 처리가 가능할까요? 코틀린에서는 설명해주시기로 부생성자로 만들지만 부생성자는 주생성자를 호출해야 하는 꼴로 가야한다고 답변을 주셔서요! 이에 대해 궁금합니다!
이미지와 같이 Runtime Error 발생하여, 검토 요청드립니다. import java.util.*; public class Main { private int solution (int i1, int[][] i2) { int r = 0; int rt = 0; for (int i = 0; i < i1; i++) { int t = 0; boolean[] s = new boolean[i1]; for (int j = 0; j < 5; j++) { for (int k = 0; k < i1; k++) { if (i2[i][j] == i2[k][j]) { s[k] = true; } } } for (boolean a: s) { if (a) { t++; } } if (t > rt) { r = i; rt = t; } } return r + 1; } public static void main(String[] args){ Scanner in = new Scanner(System.in); int input1 = in.nextInt(); int [][] input2 = new int[input1][input1]; for (int i = 0; i < input1; i++) { for (int j = 0; j < 5; j++) { input2[i][j] = in.nextInt(); } } System.out.println(new Main().solution(input1, input2)); } }
DataInitializer 와 관련하여, EntityManager 를 @Autowired 가 아닌, @PersistenceContent 로 가져온 까닭이 궁금합니다. 제가 이해한 바에 따르면, initialize 메서드에서 정의된 ExecutorService 의 스레드 풀은 트랜잭션 전파가 이뤄지지 않으니, TransactionTemplate 을 사용하여 명시적으로 트랜잭션 블록을 지정해주고, 영속화를 위한 과정에서, entityManager 의 프록시 객체가 트랜잭션 내부에서 적절한 객체를 가져와 수행한다고 알고 있습니다. 이 과정에서, EntityManager 의 프록시 객체를 위해 @PersistenceContext 를 사용하여 선언함은 알겠으나, @Autowired 를 사용하여 스프링에서 관리하는 것 역시도 SharedEntityManager 에서 파생된, 동일한 프록시 객체를 반환하는 걸로 알고 있습니다. PersistenceContext 로 em 을 가져온 이유가 있나요? 아니면 선호하시는 방식이라 채택한 방법인가요? 물론 제가 이해한 바에서 틀린 부분이 있을 수도 있으니 잘못 이해한 바가 있으면 정정도 부탁드립니다. 강의 잘 보고 있습니다~