- 개인 과제 2번
- 개인 과제 3번
- 총평
- 알게 된 것들
- 까먹은 것들
2. 클래스 함수 사용
과제 내용
- 이름, 성별, 나이를 입력받고, 이를 출력하는 프로그램을 작성해주세요.
4차 시도
class person: #person 클래스 정의
def __init__(self, name, gender, age):#초기화 메서드
self.name = name #속성정의
self.gender = gender
self.age = age
def display(self): #정보출력함수 적용
print(f"""이름:{self.name},성별: {self.gender}
나이: {self.age}""")
name = input('이름을 입력해주세요') #객체별 input함수 적용
gender = input('male OR female')
age = input(int('나이를 숫자로 입력해주세요'))
whlie True:
if gender == 'male' or gender == 'female': #gender 객체에 조건 추가
break
else:
print('male과 female중 하나만 입력해주세요') #조건에 맞지 않을 때 사용할 문장
whlie True:
if age > 0: #age 객체에 조건 추가
break
else:
print('0보다 큰 숫자만 입력해 주세요') #조건에 맞지 않을 때 사용할 문장
person1 = person({self.name}, {slef.gender}, {self.age})
#팀 회의 때 질문해보고 입력값을 어떻게 넣는지 듣고 다시 display()함수와 조건문을 추가해 써보았다.
그래서 코드 작성을 위와 같이 하였고 결과는
SyntaxError: invalid syntax
가 나왔다.
더 이상 진행이 되지않아 GPT에게 위 코드의 잘못된 부분을 물어 보았다.
- whlie 오타 => while
- input(int('나이를 숫자로 입력해주세요')) => int(input( '나이를 숫자로 입력해주세요' ))
- person1 = person({self.name}, {self.gender}, {self.age}): => person1 = person(name, gender, age) - {}는 문자열 포맷팅을 의미하지만, 여기서는 필요 없습니다. 단순히 변수만 넘기면 됩니다. - self는 인스턴스 메서드에서만 사용하며, 객체 생성 시에는 사용하지 않아야 합니다.
- while조건문으로 객체 조건 걸기
수정 된 코드
class Person: # 클래스 이름은 관례상 첫 글자를 대문자로 시작합니다.
def __init__(self, name, gender, age): # 초기화 메서드
self.name = name # 속성 정의
self.gender = gender
self.age = age
def display(self): # 정보 출력 함수
print(f"이름: {self.name}, 성별: {self.gender}, 나이: {self.age}")
name = input('이름을 입력해주세요: ')
while True:
gender = input('성별을 입력해주세요 (male OR female): ').strip().lower() # 소문자로 변환하여 비교를 용이하게 함
if gender == 'male' or gender == 'female': # gender 조건
break
else:
print('male과 female 중 하나만 입력해주세요.')
while True:
try:
age = int(input('나이를 숫자로 입력해주세요: ')) # 나이 입력을 숫자로 받음
if age > 0: # age 조건
break
else:
print('0보다 큰 숫자만 입력해 주세요.')
except ValueError:
print('유효한 숫자를 입력해주세요.') # 숫자가 아닌 값을 입력했을 때 예외 처리
person1 = Person(name, gender, age)
person1.display()
3. Python 라이브러리로 데이터 분석하기 (필수)
과제 내용
- Python 라이브러리를 활용하여 주어진 데이터(.xlxs)를 분석 Quiz를 수행해주세요.
Quiz
1. Python 라이브러리 함수를 사용하여 엑셀 파일을 불러오고, DataFrame을 출력해주세요.
import pandas as pd
data_df = pd.read_excel("관서별 5대범죄 발생 및 검거.xlsx")
df = pd.DataFrame(data_df)
df
2. 각 경찰서(관서명)를 해당 구 이름으로 매핑하여 '구별'이라는 새로운 column을 생성하고, DataFrame을 출력해주세요.
1차 시도
df['구별'] =
'서대문서': '서대문구', '수서서': '강남구', '강서서': '강서구', '서초서': '서초구',
'서부서': '은평구', '중부서': '중구', '종로서': '종로구', '남대문서': '중구',
'혜화서': '종로구', '용산서': '용산구', '성북서': '성북구', '동대문서': '동대문구',
'마포서': '마포구', '영등포서': '영등포구', '성동서': '성동구', '동작서': '동작구',
'광진서': '광진구', '강북서': '강북구', '금천서': '금천구', '중랑서': '중랑구',
'강남서': '강남구', '관악서': '관악구', '강동서': '강동구', '종암서': '성북구',
'구로서': '구로구', '양천서': '양천구', '송파서': '송파구', '노원서': '노원구',
'방배서': '서초구', '은평서': '은평구', '도봉서': '도봉구'
#SyntaxError(맵핑이라는 단어를 보지 못한채 진행한 결과)
2차 시도
map_df = {'서대문서': '서대문구', '수서서': '강남구', '강서서': '강서구', '서초서': '서초구',
'서부서': '은평구', '중부서': '중구', '종로서': '종로구', '남대문서': '중구',
'혜화서': '종로구', '용산서': '용산구', '성북서': '성북구', '동대문서': '동대문구',
'마포서': '마포구', '영등포서': '영등포구', '성동서': '성동구', '동작서': '동작구',
'광진서': '광진구', '강북서': '강북구', '금천서': '금천구', '중랑서': '중랑구',
'강남서': '강남구', '관악서': '관악구', '강동서': '강동구', '종암서': '성북구',
'구로서': '구로구', '양천서': '양천구', '송파서': '송파구', '노원서': '노원구',
'방배서': '서초구', '은평서': '은평구', '도봉서': '도봉구'}
#맵핑(비교)을 하기 위한 mpa_df 생성
df['구별'] = df['관서명'].map(map_df).fillna('구 없음')
#'구별' 이라는 새로운 열 생성 하며 관서명 열에 .map() 함수를 적용시켜 맵핑 진행
# fillna함수로 결측치에 '구 없음'값 지정
3. pivot_table 을 사용하여 관서별 데이터를 구별 데이터로 변경하고, 같은 구의 경우에는 sum을 적용하여 더해주세요. (index : 관서 이름 -> 구 이름)
1차 시도
pivot = pd.pivot_table(df, index = '구별', values = 소계(발생), 소계(검거), 살인(발생), 살인(검거), 강도(발생), 강도(검거), 강간(발생), 강간(검거), 절도(발생), 절도(검거), 폭력(발생), 폭력(검거), aggfunc = 'sum')
#syntaxError columns을 지정하지 않고 모든 값이 다 나와있는 참고자료를 보고 values에 모든열 추가.
2차 시도
pivot = pd.pivot_table(df, index = '구별', aggfunc = 'sum')
#결과 값에 관서명 열이 사라지지 않음 (colums과 valuse를 지정하지 않고 시도)
pivot_dropped = pivot.drop(columns=['관서명'])
#drop함수를 사용해서 관서명 열 삭제
4. 구 없음 행은 drop 을 활용하여 삭제해주세요.
pivot_dropped.drop(['구 없음'])
5. 각 범죄 별로 검거율을 계산하고, 각 검거율 데이터 column을 DataFrame에 추가해주세요.
pivot_dropped = df #이름이 길어져서 간단하게 바꿈
df['강간검거율'] = df['강간(검거)'] / df['강간(발생)'] * 100
df['강도검거율'] = df['강도(검거)'] / df['강도(발생)'] * 100
df['살인검거율'] = df['살인(검거)'] / df['살인(발생)'] * 100
df['절도검거율'] = df['절도(검거)'] / df['절도(발생)'] * 100
df['폭력검거율'] = df['폭력(검거)'] / df['폭력(발생)'] * 100
#범죄별 검거율 열 생성
1차 시도
df['검거율'] = df.mean(df['강간검거율'], df['강도검거율'], df['살인검거율'], df['절도검거율'], df['폭력검거율'])
#총 검거율을 mean함수로 설정 해보려고 했으나 TypeError
df['강간검거율'] = df['강간검거율'].astype(int)
df['강도검거율'] = df['강도검거율'].astype(int)
df['살인검거율'] = df['살인검거율'].astype(int)
df['절도검거율'] = df['절도검거율'].astype(int)
df['폭력검거율'] = df['폭력검거율'].astype(int)
# float이라 값이 너무 커서 안되나 싶어서 정수 변환시킴
2차시도
df['검거율'] = df[['강간검거율', '강도검거율', '살인검거율', '절도검거율', '폭력검거율']].mean(axis=1)
#검거율 열을 생성하며 df안의 특정 열들을 리스트형식으로 가온다 표시하고 mean(axis=1)으로 평균값을 계산하며 행을 기준으로 계산 지정
6. 필요없는 column을 del 을 사용하여 삭제해주세요.
1차 시도
del.df['소계(발생)', '소계(검거)', '살인(검거)', '강도(검거)', '강간(검거)', '절도(검거)', '폭력(검거)']
# KeyError 인터넷 검색 후
del df['소계(발생)']
# 정상 작동 하는 것을 확인
del df['소계(검거)'], df['살인(검거)'], df['강도(검거)'], df['강간(검거)'], df['절도(검거)'], df['폭력(검거)']
# 정상작동
한번에 적용하는 방법이 있을까?
7. DataFrame의 컬럼명을 rename 을 사용하여 변경해주세요.
df = df.rename(columns = { '강간(발생)' : '강간', '강도(발생)' :'강도', '살인(발생)':'살인', '절도(발생)':'절도', '폭력(발생)':'폭력' })
#검색을 통해 작성법을 보고 적었다.
#정상작동
총평
각 요소의 지칭 단어, 오타, 함수 사용 문법, 코드 작성 순서에 아직 많이 미숙하다.
최대한 GPT도움을 안받고 어떤걸 어떻게 해야하는지 알아가 보면서 스스로 하려했지만 막히는 부분이 많았다.
아직 코드 구조에 대해 정확하게 파악한게 아니니 어쩔 수 없다는 생각을 하지만
그래도 GPT도움없이 익숙해져 나갈 것이고
GPT의 도움을 받았을 땐 코드 하나하나 뜯어 먹어봐야겟다.
새롭게 알게 된 것들
1. try except
- 프로그램 실행 도중 예외(오류)가 발생했을 때 프로그램의 비정상 종료를 막거나 사용자에게 오류 정보를 제공한다.
try:
#오류(예외) 발생 가능성있는 코드 위치
except ValueError: #오류(예외)코드 위치
#오류 발생시 수행 코드 위치
2. .strip() ※ .lstrip() .rstrip()
- 문자의 공백을 제거해 사용자 입력 값을 계산하기 편하게 만든다.
※앞쪽(왼쪽)문자열 제거 / 뒤쪽(오른쪽)문자열 제거
3. .lower()
- 문자열을 모두 소문자로 변환 시킨다.
- 사용자 입력값을 동일하게 만드는 역할
4. .isdigit()
-모두 숫자로 이루어져있는지 확인한다. #age if조건에 추가했다면 try except 구문 없이 else로 끝낼 수 있다.
while True:
나이 = input("나이를 입력하세요: ").strip()
if 나이.isdigit() and int(나이) > 0: # 나이가 양의 정수인지 확인
나이 = int(나이)
break
else:
print("잘못된 입력입니다. 양의 정수를 입력해주세요.")
5. 기존 데이터와 2차 데이터를 맵핑 시키기
- {}중괄호 안에 기존 데이터와 : 을 사용해 새로운 정보를 작성 #{서울 : 서울시, 대구 : 대구시}
-위 정보를 본인이 정한 언어로 데이터화 #map_ing = {서울 : 서울시, 대구 : 대구시}
df['시를 붙임'] = df['시 없음'].map(map_ing)
df['시를 붙임'] # 기존 df에 맵핑의 값을 넣을 '시를붙임' 열 생성
df['시 없음'].map(map_ing) #기존 df의 '시 없음' 열과 map_ing데이터를 map() 함수로 맵핑
6. if __name__ == "__main__"
- 모듈이 직접 실행될 때만 특정 코드를 실행할지 여부를 제어
- 다른 파일에서 임포트하면, if __name__ == "__main__": 아래의 코드는 실행되지 않는다.
7. del 을 활용한 삭제 방법
del df['소계(발생)']
#del과 데이터 사이에는 띄어쓰기만 존재함
#[] 대괄호안에 데이터의 없앨 요소 지정
#여러가지를 삭제시킬 때는 del df['소계(발생)'], df['소계(검거)'] 처럼 하나하나 작성해야함
생각지 나지 않던 것들
1. 클래스의 이름 첫글자는 대문자
2. 클래스란? #Person
- 제품의 설계도
3. 객체란? # person1
- 설계도로 만든 제
- 객체는 클래스의 인스턴스
- 객체는 속성과 메서드를 가질 수 있다.
4. 속성이란? # name, gender, age
- 객체의 데이터를 가리킴
- 클래스안의 변수
5. 메서드란?#def __init__ / def display()
-객체가 어떻게 작동할지 정하는 함수
6. 인스턴스란?#person1 안의 name, gender, age
7. .fillna('구 없음')
-결측치를 처리할 때 사용하며 결측치가있는 nan, none에 '구 없음' 값을 넣을 수 있다.
8. pivot테이블 작성 방법
pivot = pd.pivot_table(df, index='', columns='', values='', aggfunc='')
#df의 데이터중 index(열), columns(행)을 기준으로 valuse의 값들을 aggfunc로 지정한 함수 적용 시킨 pivot이란 테이블 생성
9. drop함수로 행삭제 열삭제
pivot_dropped.drop(['구 없음'])
#행 삭제
pivot_dropped = pivot.drop(columns=['관서명'])
#열 삭제
10. .astype()
문자열 변경 메서드
11. 테이블에 함수 적용 시 행기준 여기준 잡기
.mean(axis=1)
#axis=0은 열기준
#axis=1은 행기준
12. rename작성법
df = df.rename(columns = {'':''})
#rename메서드안에 columns = {'바뀌기 전' : '바뀐 뒤"}
'TIL' 카테고리의 다른 글
내일배움캠프 11일차 TIL + 머신러닝 (1) | 2024.10.14 |
---|---|
내일배움캐프 10일차 TIL + 도전과제 (3) | 2024.10.11 |
내일배움캠프 8일차 TIL + 판다스 심화 (3) | 2024.10.08 |
내일배움캠프 weekend 1일차 TIL + 데이터 활용 (2) | 2024.10.06 |
내일배움캠프 6일차 TIL + python의 확장 기능과 조별 과제 (2) | 2024.10.04 |