R 메시지 끄기

 콘솔에서 나오는 메시지를 끌 수 있다. 세 가지 경우에 있어서.

첫째, 라이브러리 메시지를 끄기 위해서는 suppressMessages() 함수를 사용한다. 둘째, 경고를 끄려면 suppressWarnings()를 사용한다. 마지막으로 결과를 감추는 invisible()이 있다. 

예를 들어 다음과 같이 {}로 묶은 내용은 결과로 보이지 않는다.

suppressMessages(library(dplyr))

suppressMessages(

{

    library(purrr)

    library(foreach)

})

purrr의 map함수를 사용할 때 나오는 귀찮은 결과 화면을 보고 싶지 않다면 invisible()을 사용할 수도 있다. 참고하길.

비즈니스데이터분석 배웠다면?

 저는 비즈니스데이터분석 클래스에서 tidyverse와 R을 가르쳐요. 지난 학기에는 Open Refine도 했어요. 열심히 tidyverse를 배웠다면 이제 뭘 해야 할까요?


R의 tidyverse 기반으로 business intelligence를 수행하는 도구가 Exploratory.io에요. 여러분이 학생이면 무료로 받아서 사용할 수가 있어요.

가입방법:

https://exploratory.io/plan?plan=Community

여기로 가서 학교 이메일로 가입하세요. 이메일 인증을 받고 나면 다운로드 링크를 볼 수 있어요. 설치하고 Exploratory.io 가입할 때 사용한 인증 정보로 인증하면 되요.

Exploratory는 GUI 도구에요. 아주 강력하고 편리해서 Tableau Desktop과 함께 데이터과학 실무에서 널리 활용되고 있어요. 특히! R을 공부한 사용자들은 Exploratory를 더 좋아한다는 사실. 상대적으로 저렴하기 때문에 회사에 가서, 혹은 연구실에서도 잘 사용할 수 있으니 다운로드 받아서 사용해보세요.

방학 중이나 다음 학기 초에 BDA 수업을 들었던 학생들을 모아 Exploratory 워크숍을 진행할까 생각하고 있어요. 혼자하기 싫으면 다른 교수님이나 연구원들도 동참시킬 예정. 

PyR 블로그를 계속 주목하시길.

PyR Python 스터디 교재가 나왔습니다.

 광운대학교 앞에 있는 조은문화사에 가셔서 "PyR스터디교본"달라고 하시면 됩니다. 

조은문화사의 위치:

http://naver.me/5oQvhSul

서명부를 꼭 작성하고 가져가세요. 기한은 2020년 12월 31일까지입니다. 권수가 한정되어 있으므로 조기에 소진될 수도 있습니다.






회장님 수고 많았습니다.

감사합니다.


클래스와 매쏘드

 Method, 매쏘드는 객체의 행동을 말한다. 아래 명제를 생각해보자.

"계산기는 계산을 한다."

너무 단순하지 않은가? 계산기는 계산을 하는 물건이다. 이때 계산기는 '객체', 계산을 하다는 '매쏘드'다. 계산을 하는 주체가 계산기고 계산은 계산기의 '행동'이다. 이외에도 무슨 행동을 할까?

1. 더한다.

2. 뺀다.

3. 곱한다.

4. 나눈다.

5. =로 계산을 끝낸다.

이들 행동은 개별 객체가 모두 독립적으로 수행한다. 즉, 어떤 계산기의 행동이 다른 계산기의 행동과는 무관하다. 이제 파이썬으로 매쏘드를 '설계'하자. 프로그래밍을 잘 못해도, 알고리즘을 몰라도 매쏘드는 설계할 수 있다. 

class Calculator:

    def equal(self):

        pass

    def add(self):

        pass

    def subtract(self):

        pass

    def times(self):

        pass

    def divide(self):

        pass

        

아직 알고리즘을 정하지 않았으니 전부 pass로 처리했다. 오브젝트를 생성해서 매쏘드를 불러보자. 아직 아무런 결과가 안나올 것이다.

> cal = Calculator() #object

> cal.add()

> cal.times()

> cal.calculate()

보통 계산기를 쓸 때 어떻게 하더라? 숫자를 누르고 계산 마지막에 "="을 눌러서 끝낸다. 그럼 다음 계산은 어떻게 되어야 할까?

(10+20-5)*2=?

아마 이렇지 않을까?

> cal = Calculator()

> cal.add(10) #10 누르고 +

> cal.subtract(20) #20 누르고 -

> cal.times(5) #5 누르고 *

> cal.equal(2) #2 누르고 =

뭔가 복잡하다. 행동을 보다 단순하게 디자인을 해보자. 매쏘드를 새로 생각해서 다음과 같이 되었다고 하자.

1. 숫자 버튼의 값을 기억한다.

2. 연산 버튼의 내용을 처리한다.

3. =을 누르면 이전 결과를 모두 정리한다.

새로 디자인한 클래스는 다음과 같다.


class Calculator:

    def start(self):

        pass

    def exec(self):

        pass

    def end(self):

        pass


행동이라서 매쏘드는 거의 동사로 시작한다: start, exec, end, ... 이제 작동 시나리오를 보자.

> cal=Calculator()

> cal.start(10)

> cal.exec("+",20)

> cal.exec('-',5)

> cal.exec('*',2)

> cal.end()

이렇게 (10+20-5)*2= 을 처리한다. 보다 실제 행동에 가까운 것 같다. 이제 코드를 짜보자. 이번에는 타입 힌트를 쓰지 않고 간단하게 작성하도록 한다.

 

class Calculator:
    def __init__(self):
        self.memory=0.0 #memroy in calculator
    def start(self,num):
        self.memory=num
    def exec(self,op,screen):
        if op=='+':
            self.memory+=screen
        elif op=='-':
            self.memory-=screen
        elif op=='*':
            self.memory*=screen
        elif op=='/':
            self.memory/=screen
        else:
            pass
    def end(self):
        print("Result: ",self.memory)

cal=Calculator()
cal.start(10)
cal.exec('+',20)
cal.exec('-',5)
cal.exec('*',2)
cal.end()

파일 이름을 test.py로 저장하고 실행하면 다음 화면과 같다.


이번 시간에는 클래스의 매쏘드를 다루었다. 매쏘드를 먼저 설계하고 구체적인 행동을 정의하도록 하자. 이때 중요한 것은 작동 상태를 점검해보면서 점진적으로 접근하는 일이다. 여러분이 Unified Modeling Language를 알고 있다면 이런 작업을 할 때 큰 도움이 된다. 시간이 되면 UML도 찾아보자.




쉽고 간단한 데이터 시각화 해보기

1. Seaborn

Seaborn은 matplotlib의 데이터 시각화를 위한 라이브러리 입니다. seaborn 패키지는 데이터프레임으로 다양한 통계 지표를 낼 수 있는 시각화 차트를 제공해줍니다.

그러므로 데이터 분석에 활발히 사용되고 있고, 연습으로도 유용한 라이브러리입니다.

이 글에서는 seaborn에는 matplotlib은 사용하지 않고 오직 seaborn에서만 제공하는 통계 차트 위주로 설명할 것입니다.


2. 통계 바탕으로 시각화를 제공해주는 Seaborn

seaborn 라이브러리가 좋은 이유는 통계 차트를 제공해주기 때문입니다.

지금부터 데이터를 불러오는 코드를 보여드리겠습니다.


code :

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns

==> import는 모듈을 불러오는 방법입니다. 첫번째 방법은 모듈 전제를 가져옵니다. 두번째 방법은 모듈 내에서 필요한 것만 가져오는 것입니다.

# 한글 폰트 적용

plt.rc('font', family='NanumBarunGothic') 

# 캔버스 사이즈 적용

plt.rcParams["figure.figsize"] = (12, 9)

==> 한글 폰트와 캔버스 사이즈는 시각화로 나타내기 위한 초기 설정으로 보시면 됩니다.

#타이타닉 데이터 불러오기

titanic = sns.load_dataset('titanic')

titanic

타이타닉은 데이터 이름입니다. 이제 여기서 데이터 셋에 나오는 열의 이름들에 설명합니다.


survived: 생존여부 pclass: 좌석등급 sex: 성별 age: 나이 sibsp: 형제자매 숫자

parch: 부모자식 숫자 fare: 요금 embarked: 탑승 항구 class: 좌석등급 (영문)

who: 사람 구분 deck: 데크 embark_town: 탑승 항구 (영문) alive: 생존여부 (영문) 

alone: 혼자인지 여부


다음으로 한가지 더 다른 데이터를 보도록 하겠습니다.

이 데이터는 'tips' 라는 데이터입니다.


code :

#tips 데이터 불러오기

tips = sns.load_dataset('tips')

tips

앞에서 타이타닉 데이터를 불러오는 방법에서 'titanic' 이 부분만 'tips'로 변경해주면 됩니다.

팁은 데이터 이름입니다. 이제 여기서 데이터 셋에 나오는 열의 이름들에 설명합니다.

total_bill: 총 합계 요금표 tip: 팁 sex: 성별 smoker: 흡연자 여부

day: 요일 time: 식사 시간 size: 식사 인원

지금부터는 앞에서 보여준 데이터를 가지고 시각화를 하는 방법을 알려드리겠습니다.

3. Countplot

단어 그대로 항목별 갯수를 세어주는 plot입니다. 이 plot은 알아서 해당 열을 구성하고 value들을 구분하여서 시각화를 보여줍니다.

3.1 세로 그리기

code:

sns.countplot(x="class", hue="who", data=titanic)
plt.show()


                                        First                                  Second                                Third


3.1 가로 그리기

code:

sns.countplot(y="class", hue="who", data=titanic)

plt.show()


여기서 퀴즈 
Q1.어떤 코드로 인해서 가로와 세로가 변경하게 되었는지 댓글로 부탁드립니다!! 


4. distplot

distplot은 matplotlib의 히스토그램의 hist 그래프와 kdeplot을 통합한 그래프라고 생각하면 됩니다.

즉, 분포와 밀도를 확인할 수 있는 그래프입니다.


4.1 기초 distplot

distplot 시각화를 위해 예시를 보여드리겠습니다. 먼저, 샘플 데이터를 만들어야 합니다.

code:

# 샘플데이터 생성

x = np.random.randn(100)

#기본적인 distplot 시각화

sns.distplot(x)

plt.show()



4.2 rugplot

rug는 rugplot이라고도 합니다. 데이터 위치를 x축 위에 작은 선으로 나타내어 데이터들의 위치가 어디 있는지 분포를 보여주는 시각화 방법입니다.

code:

sns.distplot(x, rug=True, hist=False)

plt.show()


4.2 kde (kernel density)

kde는 히스토그램보다 더 부드러운 형태의 분포 곡선을 보여주는 시각화 방법입니다.

code:

sns.distplot(x, rug=False, hist=False, kde=True)

plt.show()


여기서 2Q입니다.

2Q. rugplot의 코드와 kde의 코드에서 rug=True, kde=True은 어떤 의미를 가져다 주는 코드인지 적어주세요!



이제 마무리를 하겠습니다. 이 글을 보신다면 각 개인마다 느끼는 감정이 다를 것이라고 생각합니다. 전혀 파이썬을 모르신 분들은 여전히 무슨 말인지 모를 수도 있고, 파이썬을 아시는 분들은 너무 쉽다라는 생각을 할 수 도 있습니다. 하지만, 이렇게 쉬운 내용이어도 기본을 잘 알아야 코드를 작성하거나 시각화하는데 있어서 전혀 손해볼 것 같지는 않습니다. 많은 댓글을 환영합니다!! 꼭 부탁드립니다! 





파이썬 공식 문서 한글 번역본

 파이썬 공식 문서의 한글 번역판 사이트입니다.

출처: https://python.flowdas.com/index.html

파이썬의 가장 좋은 교과서는 공식 문서입니다. 한번 둘러들 보시기를.

Introduction to Python [DataCamp]

 DataCamp에서 제공하는 무료 파이썬 코스입니다.

빠르게 파이썬을 배우고 싶다면 DataCamp에서 포인트도 쌓고 무료 강의도 들어보세요.

바로가기: https://www.datacamp.com/courses/intro-to-python-for-data-science

Google Python Class

 구글에서 제공하는 무료 온라인 파이썬 강좌 사이트입니다.

쉬운 영어로 혼자서도 파이썬을 배울 수 있습니다.

바로가기: https://developers.google.com/edu/python/

[퍼옴] A Brief Tour of the Trees and Forests

A Brief Tour of the Trees and Forests 

출처: R-blogger

https://www.r-bloggers.com/2013/04/a-brief-tour-of-the-trees-and-forests/

  • 데이터 마이닝의 기본 중의 기본인 의사결정나무 방법입니다.
  • 데이터의 패턴을 추출하는 ‘지식 발견’ 기법 중 하나입니다.
  • 패턴을 바탕으로 업무의 효율을 올리는 행동 관리 방법으로도 사용합니다.
  • 실제 사용 빈도가 높으니 참고하세요.

블로그 기고자를 모집합니다

파이썬, 알 관련 글을 기고할 분들을 모십니다.

1. 어떠한 종류의 글이든 관계 없습니다. 공부 노트도 좋고, 최근 소식도 좋고, 여러 요령도 좋습니다. 

2. 초보자도 환영


관심이 있는 사람은 카카오 오픈톡방에서 개인톡으로 알려주세요. 지메일 아이디만 있으면 됩니다.

지금 신청하세요. 

Python으로 할 수 있는 파일 관련 작업들

 파이썬으로 뭘 하면 좋을까? 데이터 분석? 그것도 좋다. 시각화? 최고지. 

하지만, 현실적으로 나를 가장 편하게 해주는 기능은 바로 ‘스크립트’ 짜기다. 리눅스 시스템이나 맥을 쓰는 사람들이 가장 자랑하는 것이 아마 쉘스크립트(* 파일처리 등을 자동으로 해주는 작은 프로그래밍) 사용이 아닐까. 파이썬으로도 훌륭하게 비슷한 기능을 수행한다.

1. 파일 복사

2. 파일 삭제

3. 이름 바꾸기

4. 파일 이동

간단하다. 늘상 하는 일이다. 파일 몇 개를 가지고는 손쉽다. 하지만 온라인에서 파일을 수십개 수백개를 받고(PDF 논문 같은 것) 이들을 어떤 규칙에 따라 파일 이름을 바꾸고 여러 폴더에 분산해서 저장해야 한다면? 마우스랑 키보드 사용하느라 엄청 피곤해진다. 그리고 시간도 많이 걸린다. 수작업이 쉽지만 능률적이지는 않다.

하지만 파이썬을 쓰면 파일이 몇 개든, 얼마나 많은 폴더에 나눠 담아야 하든, 얼마나 많이 복사를 해야 하든 문제가 되지 않는다. 

앞으로 Python의 모듈 os와 os.path, glob, shutil을 써서 어떻게 파이썬으로 훌륭히 컴퓨터 파일들을 관리할 수 있는지 알아보자.

앞으로...

Python을 써서 파일을 관리해보자

 파이썬은 스크립트 언어다. 즉, 편리하게 빨리 필요한 컴퓨터 도구를 만들 수 있도록 도와준다. 오늘은 파일을 다루는 일을 해보자. 


아래와 같은 폴더가 있다고 하자. JPG로 끝나는 사진 파일을 카카오부터 받았다. 이제 이 파일의 이름을 한번에 바꾸는 스크립트를 짜보려 한다.



파일 이름을 정리하는 일은 참으로 번거롭다. 하지만 파이썬을 쓰면 일도 아니다.


우선 배워야 할 것들이 있으니 살펴보자.


from os.path import isfile

from os import listdir

모듈 os.path로부터 isfile과 listdir 함수를 가져온다.

isfile()은 파일인지 체크하고, listdir은 폴더 내에 있는 여러 오브젝트의 이름을 list로 돌려준다.


어떻게 작동되냐면..



이렇게 보인다. 현재 작업 폴더가 사진/sample_pic인데 그 안에 들어 있는 파일과 폴더를 모두 보여준다. 우리가 관심이 있는 것은 .jpg로 끝나는 것들이다.

fromFile=[i for i in listdir() if isfile(i) and i.endswith('.jpg')]

파일인지 확인하고 jpg로 끝나면 그 이름을 저장하자. 결과는?


깔끔하게 우리가 원하는 파일만 저장했다.

이제 파일 이름을 바꿀 차례다. 필요한 함수는 os 모듈의 rename()이다. 가져오자.


from os import rename


새로 만들 이름을 정의한다.


newFile=["pic{:03d}.jpg".format(i) for i in range(len(fromFile))]


이제 반복문으로 처리하면 된다.

for i in range(len(fromFile)):

     rename(fromFile[i],newFile[i])



파일 이름이 pic000.jpg부터 pic003.jpg까지 바뀌었다.


이제 어떻게 작동되는지 알게되었으니,

실행 코드를 rename.py 파일로 만들어서 한번에 처리하도록 하자.

다음은 rename.py의 내용이다.


from os.path import isfile

from os import rename,listdir


class ReName:

    def __init__(self):

        self.target=[]

    def get_file_only(self,ext):

        self.target=[i for i in listdir() if isfile(i) and i.endswith(ext)]

    def run(self,code='pic'):

        for i in range(len(self.target)):

            rename(self.target[i],"{}{:03d}.jpg".format(code,i))

#PROGRAM START

if __name__=="__main__":

    tool=ReName()

    tool.get_file_only(".jpg")

    tool.run('pic')

    #

    tool.get_file_only(".jpg")

    tool.run('mypic')

    


이제 Aanaconda 콘솔에서 실행해보자.


같은 경로에 rename.py 파일이 포함되어 있다.


파일 이름이 pic000.jpg로 바뀌었다가 다시 mypic000.jpg로 바뀌었다.


    tool=ReName()

    tool.get_file_only(".jpg")

    tool.run('pic')

이 세줄의 코드로 파일 이름을 제어한다. 여러분도 각자에게 적합한 코드를 작성해서 그림 파일을 한번에 바꾸는 도구를 제작해보자.

문자열 뒤집기

 입력 받은 문자열을 뒤집어 출력하는 알고리즘을 생각하자.

예를 들어 ABCD라고 입력하면 DCBA라고 출력한다.

코드는 다음과 같다.


def reverseString(s):
  left=0
  right=len(s)-1
  letters=[c for c in s]
  while left < right:
    letters[left],letters[right]=letters[right],letters[left]
    left+=1
    right-=1
  return "".join(letters)


결과를 보자.


보다 객체 지향적인 스타일은 다음과 같다.


class Tool:
  def __init__(self,string_data):
    self.string_data=string_data
  def reverseString(self):
    s=self.string_data
    left=0
    right=len(s)-1
    letters=[c for c in s]
    while left < right:
      letters[left],letters[right]=letters[right],letters[left]
      left+=1
      right-=1
    self.string_data="".join(letters)



결과는











파이썬 클래스 정의와 활용

 클래스를 이전에 설명했다.


이전 글 참고


이번에는 클래스를 만드는 방법을 설명한다.

실습을 위해 Google Colab을 사용하기 바란다.

클래스 이름 Student를 만들어보자.


class Student:
  pass


클래스가 다 만들어졌다. 실로 간단하다. 키워드 class에 클래스의 이름을 붙이고 코드블록을 만들기 위해 콜론을 썼다. 그리고 아무일도 안할 것이라서 pass를 썼다.

이제 클래스로 오브젝트를 생성하자. 


kim01=Student()
lee01=Student()
kim02=Student()


학생 세 명을 만들었다. 오브젝트 kim01, lee01, kim02이다. 주의할 점. 파이썬 프로그램에서 여러분이 다루는 것은 '클래스'가 아닌 '오브젝트'다. 일을 시키거나 데이터를 저장하거나 다 오브젝트를 통한다. 클래스는 오브젝트를 만들기 위한 도구에 불과하다.

한편, 클래스를 오브젝트처럼 사용할 수도 있다. 이 부분은 나중에 따로 설명한다. 원칙은 오브젝트(객체)를 사용한다는 것이다.

속성(혹은 멤버) 사용하기

이제 클래스를 확장해보자. 이미 Student라는 클래스가 있다고 가정하고 이를 확장하여 KWUStudent라고 하는 클래스를 만든다. 그리고 학교 이름으로 '광운대'라고 하자. 멤버에 이름과 학번, 그리고 전화번호를 할당한다.


class KWUStudent(Student):
  def __init__(self):
    self.school='광운대학교'
    self.name=""
    self.student_id=""
    self.phone=""


KWUStudent의 괄호 안에 Student가 있다. 즉, Student를 입력 받아 KWUStudent를 만들었다. 이렇게 입력받는 행위를 '상속'이라고 부른다. KWUStudent는 Student를 상속한다. 그리고 __init__(self)는 매쏘드다. 클래스의 매쏘드는 일반적으로 '매쏘드이름(self)'로 구성된다. 키워드 self 오브젝트 자신을 가리킨다. 즉, self.school은 자신이 가진 school이라는 변수, 즉 속성 혹은 멤버다. 이때 멤버의 이름이 school이다. name이나 student_id, phone 모두 멤버에 해당한다. 특히 __init__(self)를 constructor라고 한다. 객체를 생성할 때 자동으로 실행되는 매쏘드다. 우리는 클래스가 객체를 만들 때 __init__(self) 즉 초기화(initialization)하여 4개의 속성을 만든다.

이제 오브젝트를 찍어보자.


kim03=KWUStudent()
lee03=KWUStudent()


다음 그림은 Colab의 결과다.


클래스에서 어떤 오브젝트가 나올 지 몰라서 self.school이라고 했는데 구체적인 오브젝트가 만들어졌으니 이제 kim03.school 등으로 부를 수 있다. kim03.name="Gildong"이라고 하자. 그러면 kim03의 이름이 바뀌지만 lee03.name은 아무런 영향을 받지 않는다. 서로 다른 오브젝트라서 데이터가 독립적이다.





이름으로 Gildong만 출력되고 lee03.name은 "" 즉 공백으로 출력된다. 위에서 KWUStudent를 만들었던 방식을 생각해보자.

데이터 클래스로 멤버 결정하기

새로운 파이썬은 타입 힌트 기능을 사용한다. 그리고 데이터 클래스를 정의하여 멤버를 정해줄 수도 있다. 다음 코드를 보자.


from dataclasses import dataclass

@dataclass
class Business(KWUStudent):
  subject:str="Data Science"
  grade:float=4.3
  year:int=3


모듈 dataclasses에서 dataclass 클래스를 가져왔다. 이 클래스는 @기호를 써서 사용한다. 이렇게 다른 클래스 앞에 기능을 덧붙여주는 특수한 클래스를 장식자(decorator)라고 부른다. 우리는 Business 클래스를 KWUStudent를 상속하여 만들고 장식자로 dataclass를 붙였다.

이제 클래스를 선언하자마자 멤버를 지정할 수 있다. 타입 힌트로 subject에 str을, grade에 float을 year에 int를 주었다. 타입 힌트를 주는 방법은 이름:타입 형태를 취하면 된다.

이제 오브젝트를 찍어보자.



결과를 보면 AttributeError가 떴다. 뭐가 잘못되었나? 메시지를 읽어보면 school이 없다고 한다. 상속을 했는데도 왜 school이 없을까? 원래 school은 KWUStudent에 포함되어 있고 상속을 했으므로 Business 클래스로 찍은 park01에서도 보여야 한다.

장식자를 Business에 썼는데 KWUStudent에는 사용하지 않아서 생기는 문제다. 이를 고치려면 다음과 같이 KWUStudent를 수정하여 다시 실행한다.


@dataclass
class KWUStudent(Student):
  school:str='광운대학교'
  name:str=""
  student_id:str=""
  phone:str=""


이제 실행결과를 다시 보자.



오브젝트를 만들 때 디폴트 값을 수정했다. dataclass 장식자와 타입 힌트를 사용하지 않는 경우를 아래에 적어두었다. 


class KWUStudent(Student):
  def __init__(self,school='광운대학교',name='',student_id='',phone=''):
    self.school=school
    self.name=name
    self.student_id=student_id
    self.phone=phone
class Business(KWUStudent):
  def __init__(self,subject='Data Science',grade=4.3,year=3):
    super().__init__()
    self.subject=subject
    self.grade=grade
    self.year=year
park01=Business()
print(park01.school)
print(park01.subject)
print(park01.year)
park01.name="Yooshin"
print(park01.name)


새롭게 super().__init__()가 보인다. KWUStudent의 속성을 생성하기 위해서 사용한다. park01=Business()는 Business에서만 생성하기 때문에 일일이 Business 생성 시에 KWUStudent도 생성하라고 알려줘야 한다. super()를 사용하지 않는 또 다른 방법은 다음과 같다.


class KWUStudent(Student):
  def __init__(self,school='광운대학교',name='',student_id='',phone=''):
    self.school=school
    self.name=name
    self.student_id=student_id
    self.phone=phone
class Business(KWUStudent):
  def __init__(self,subject='Data Science',grade=4.3,year=3):
    KWUStudent.__init__(self)
    self.subject=subject
    self.grade=grade
    self.year=year
park01=Business()
print(park01.school)
print(park01.subject)
print(park01.year)
park01.name="Yooshin"
print(park01.name)


결과를 보자.



이번 시간에는 클래스의 기초적인 사용법, 멤버에 대해 살펴봤다. 다음 시간에는 매쏘드와 다른 주제들을 알아보자.

코딩을 공부하는 바른 방법

코딩은 습관이다.

매일 매일 적당한 시간을 코딩을 하면서 보내야 실력이 올라간다. 


절대로 머리로만 접근하지 마라.

그냥 메모장을 열어두고 생각나는 알고리즘 문제를 풀어보면 된다. 머리로 생각하지 않아도 풀릴 때까지 손을 숙달시키면 된다.


배우기 전에 실행하자.

뭘 다 배우고 코딩을 하려면 안된다. 그냥 따라하고 다 외우고 나면 그때야 무슨 뜻인지 파악하자. 좋은 코딩 습관은 그림을 보듯이 코드를 감상할 수 있도록 노력할 때 생겨난다.

Pallindrome 문제

 Pallindrome은 앞뒤가 똑같은 단어다. 회문이라고도 한다. 주어진 글자가 팰린드롬인지 확인하는 파이썬 코드를 작성하자. 


오직, 영어 소문자 그리고 숫자만으로 고려한다고 가정한다.


이번 시간에는 3.7 버전의 파이썬에 추가된 타입 힌트(type hint) 기능을 사용한다.


타입 힌트란?

파이썬 데이터에 int, float, str, bool 등의 데이터 타입을 빠르게 유추할 수 있도록 도와준다.


풀이

def isPallindromeByList(s:str) -> bool:
  strs=[]
  for char in s:
    if char.isalnum():
      strs.append(char.lower())
  while len(strs)>1:
    if strs.pop(0) != strs.pop():
      return False
  return True

일반적인 리스트(list)를 이용한 풀이다. 우선 strs=[]로 리스트를 정의했다. 함수 isPallindromeByList()는 s라는 이름으로 파라미터를 입력받는다. 이때 타입 힌트로 str을 줬다. 해당 함수는 bool로 return 될 것임을 타입 힌트로 할당했다(->). 이제 strs를 어떻게 다루는지 보자.

먼저 입력값 s가 문자다. 문자는 list로 처리되므로 각 문자를 처음부터 뽑아 char로 저장하고 살펴본다. 이때 char.lower()로 문자를 모두 소문자로 처리한다. 그리고 strs에 하나씩 붙여 넣자. 각 문자가 strs에 한 자씩 들어간다.

다음이 진짜다. strs의 문자가 하나도 남지 않을 때까지 앞에서부터 뽑아낸다. list의 pop()에 아무런 입력이 없으면 맨 뒤의 것을 뽑는다. 그런데 pop(0)이면 제일 앞의 것을 뽑는다. pop(0) != pop()이면 제일 뒤와 앞이 서로 다른 것이므로 회문이 아니다. 단 하나라도 이런 경우가 있으면 팰린드롬 문제에서 False를 받아야 한다. 따라서 그냥 발견되면 return False로 함수가 종료된다. 끈질긴 테스트에서도 아무런 문제가 없다면 while은 종료되고 return True로 회문임이 증명된다.

결과를 돌려보면 다음과 같다.
> test="A man, a plan, a canal: Panama"
> isPallindromeByList(test)
True

다른 풀이들:

이외에도 deque를 이용하는 방법과 순서를 뒤집어 비교하는 방법 등 다양한 알고리즘이 존재한다. 자기만의 알고리즘을 생각해보자.

import collections
import re
def isPallindromeByDeque(s:str) -> bool:
  strs:Deque=collections.deque()
  for char in s:
    if char.isalnum():
      strs.append(char.lower())
  while len(strs)>1:
    if strs.popleft() != strs.pop():
      return False
  return True
def isPallindromeBySlice(s:str)->bool:
  s=s.lower()
  s=re.sub('[^a-z0-9]','',s)
  return s==s[::-1]

결과를 보자.
> isPallindromeByDeque(test)
True
> isPallindromeBySlice(test)
True

파이썬 상식 10분만에 끝내기

 Python 101 in 10 Minutes

10분에 파이썬에서 알아야 할 모든 것을 배워보자.


  1. 변수(variable)은 값을 저장하는 곳이다.
  2. 변수에 값을 저장할 때는 변수이름 = 값으로 한다.
  3. 변수는 숫자, 문자, 논리, 객체
  4. 흔히 쓰는 자료형 객체에는 리스트(list)와 딕셔너리(dictionary), 집합(set), 튜플(tuple)이 있다.
  5. 계산은 더하기(+), 빼기(-), 곱하기(*), 제곱(**), 나누기(/), 나머지(%), 몫(//)으로 한다.
  6. 들여쓰기(indent)를 지키지 않으면 실행되지 않는다.
  7. 코드블록(code block)은 여러 코드를 하나의 그룹으로 묶은 것을 말한다.
  8. 코드블록은 들여쓰기로 구분한다.
  9. 코드블록을 시작하려면 콜론(:)을 써야 한다.
  10. 코드블록을 사용할 수 있는 키워드는 def, class, if, elif, else, for, while, try, except이다.
  11. TrueFalse는 논리값을 나타낸다. 대소문자는 반드시 구분
  12. and는 논리곱, or은 논리합, not은 논리값을 뒤집는다.
  13. 빈 값은 None으로 표기한다
  14. as는 별명(alias)를 만든다.
  15. assert는 디버깅할 때 쓰는 검사용 구문을 만든다.
  16. break는 루프를 중단시킨다.
  17. class는 클래스를 정의한다.
  18. continue는 루프의 처음으로 돌아간다.
  19. def는 함수를 정의한다.
  20. del은 객체를 제거한다.
  21. try는 예외처리에 사용한다.
  22. except는 예외처리에 사용한다.
  23. finally는 예외처리에 사용한다.
  24. with는 예외처리를 간단하게 할 때 사용한다.
  25. for는 루프를 생성한다.
  26. while은 루프를 생성한다.
  27. import는 모듈을 가져올 때 쓴다.
  28. from은 모듈을 가져올 때 쓴다.
  29. global은 글로벌 변수를 선언한다.
  30. nonlocal은 지역변수가 아닌 변수를 생성한다.
  31. if는 조건문을 만든다.
  32. elif는 if와 else를 합쳐 조건문을 처리할 때 쓴다.
  33. else는 if나 elif에 해당되지 않는 경우의 코드 블록을 만든다.
  34. in은 현재 값이 list, tuple, dictionary 등에 있는 지 확인할 때 쓴다.
  35. is는 두 값이 같은지를 비교한다.
  36. lambda는 간단한 함수를 만든다.
  37. pass는 아무것도 하지 않는다 (자리만 채워준다).
  38. raise는 강제로 예외(에러)를 발생시킨다.
  39. return은 함수의 결과값을 돌려준다.
  40. yield는 제너레이터(generator)를 사용할 때 return 대신 쓴다.
이것이 전부다.

객체(Object)와 파이썬

 Object-oriented programming, 객체 지향 프로그래밍은 뭘까?


객체란?

객체는 함수+데이터의 집합이다.

함수와 함께 함수에 필요한 데이터를 꾸러미로 묶었다고 보면 된다.

현실 세계를 흉내내기

객체는 현실 세계를 흉내낼 수 있어 프로그래밍할 때 유리하다. 현실에서 '행동'은 함수로, 특성은 '데이터'로 흉내낸다. 이렇게 흉내낸 함수를 method (매쏘드), 데이터를 속성(attribute) 혹은 멤버(member)라고 한다.

객체의 사용법

객체는 각자 '이름'을 가지고, 이름은 고유(unique)하다. 이름을 부르고 함수와 데이터를 사용하는 방식을 취한다.

너의 이름은 무엇인고?

my_ball = Ball() #객체 생성 my_ball.color #색, 속성 my_ball.size #크기, 속성 my_ball.bounce() #튕기기, 매쏘드



위의 예를 보면  my_ball이라는 객체를 정의한다. 객체는 클래스라는 것으로부터 정의된다. 클래스는 객체를 생성하는 생성자(constructor)의 역할을 한다. 생성자란 '도장(stamp)'와 같다. 즉, 같은 종류의 객체를 찍어낸다. 하지만 같은 종류라고 개별 객체는 다르다. 우리가 '인간'이지만 모두 다른 것처럼.

속성

속성은 데이터다. 객체를 나타내거나 객체의 행동에 필요한 자료다. 속성은 '할당'과 '호출'로 사용한다. 

할당

할당은 데이터를 넣는 것을 말한다.

my_ball.color='red'


데이터를 불러오면 호출이다. 할당 연산자(=)를 사용하지 않으면 호출이다.

my_ball.color


당연하지만, 호출값은 다른 곳에 저장할 수도 있다.

his_ball_color=my_ball.color


his_ball_color라는 변수에 my_ball의 color 속성이 전달된다.

매쏘드

매쏘드는 행동이다. 행동은 함수다. 직관적으로 기억하면 좋다. 함수는 입력과 출력을 전제로 한다. 입력이 없을 수도 출력이 없을 수도 있지만, 완전한 형태는 입력과 출력을 모두 정의한다. 

my_ball.bounce() my_ball.status 'down' my_ball.bounce() my_ball.status 'up' my_ball.touch_count '3'






매쏘드는 함수라서 괄호가 붙는다. 괄호는 입력값이 있음을 의미한다. bounce() 매쏘드를 호출하기 위해 먼저 이름 my_ball을 불렀다. 그리고 마침표로 bounce()를 호출했다. 이 함수는 공을 내리거나 올리는 함수라고 하자. 함수의 실행 결과로 down이나 up이 표시된다. 이 결과를 my_ball의 속성인 status에 저장한다고 하자. 그리고 터치를 한 횟수를 touch_count에 저장한다. 이제 bounce() 매쏘드를 실행할 때마다 my_all의 멤버 혹은 속성은 변화한다.

왜 객체?

객체는 프로그램 내에서 자기의 영역을 확고히 가지고 있는 독립된 프로그램으로 간주된다. 즉, 함수와 데이터를 다 묶어서 '소유'하므로 (프로그래밍의 본질은 함수와 데이터) 한 파이썬 프로그램 내에서도 독립된 '부품'과 같은 프로그래밍 코드의 지위를 획득한다. 

부품을 제작하여 붙이는 방식으로 프로그래밍하면 다음과 같은 장점이 있다.

첫째, 프로그래밍의 구조를 설계하기 쉽다.

둘째, 남의 부품을 가져다가 쓰기 좋다.

셋째, 이미 개발한 부품을 계량하여 사용하기 좋다.

넷째, 뭔가 잘못되었을 때 빨리 고칠 수 있다.


YGPA 공공데이터 활용 비즈니스 공모전(~2021.01.15)

 YGPA 공공데이터 활용 비즈니스 공모전


[바로가기]

1. 접수기간: 2020.11.23.(월) ∼ 2021.01.15.(금) 18:00(54일)

 

2. 접수방법

 ① 여수광양항만공사 홈페이지(http://www.ygpa.or.kr)접속

 ② (공모제안) 열린항만→국민제안→YGPA 공공데이터 활용 비즈니스 아이디어 공모전
      [붙임1]기획서 양식, [붙임2]개인정보 수집·이용동의서, [붙임3]저작권 관련 사항 작성

 

3. 제출 방법(홈페이지/이메일 중 택 1)

 ① 대표 홈페이지를 통한 제출
   - www.ygpa.or.kr→열린항만→국민제안 내 [붙임1]∼[붙임3] 업로드

 ② 이메일(ygpadata@ygpa.or.kr) 제출

   -  공모전 담당자 이메일(ygpadata@ygpa.or.kr)로 [붙임1]∼[붙임3] 송부

    ※ 개인정보 수집ㆍ이용 동의서 및 제안 시 유의사항은 서명란에 반드시 서명 후 스캔본을 제출(팀/기업 참가일 경우 전체 참가인원 제출)

 

4. 공모전 내용

 □ 공 모 명: YGPA 공공데이터 활용 비즈니스 아이디어 공모전

 □ 공모분야

공모 분야

 세부 주제

YGPA 공공데이터
비즈니스 사업화

 YGPA가 제공하는 데이터를 활용하여 항만물류 관련 신규사업 제안

  * 광양항 물류지도 구축사업 산출 데이터

 데이터명

내용

형태 

컨테이너터미널 차량 출입정보

 차량번호, 게이트정보, In/Out 구분, 통과시간 등

 파일
데이터
(API 제공)

항만도로 차량 출입정보

 차량번호, 인식기 위치정보, In/Out 구분, 통과시간 등

배후단지 차량 출입정보

 차량번호, 인식기 위치정보, In/Out 구분, 통과시간 등

차량-화물 융합정보

 차량번호, 거점정보, 통과시간, In/Out, 화물명,
수ㆍ출입 구분, 수출입 국가

 

* Port-MIS 항만운영데이터

테이터명

내용 

형태 

 선박입출항 정보

 선박정보(선박명, 총톤수 등), 입출항일, 전항지, 차항지 등

 파일
데이터
(API 제공)

 화물 입출항 정보

 BL번호, 양ㆍ적하 일자, 수출입 구분, 화물, 중량, 양ㆍ적하 시설정보 등

 선석사용 정보

 선박정보(선박명, 총톤수 등), 시설제원, 사용목적ㆍ시간 등

 컨테이너화물정보

 컨테이너번호, 규격, BL번호 등

 

데이터 발굴
아이디어

 4차 산업혁명 기술(AI, IoT, 클라우드 등)과 결합하여 해운·항만·물류 분야의 신규 사업발굴을 위한 새로운 데이터 발굴 아이디어 기획

 

□ 시상내역 

구분

시상 점수

 상금 

YGPA 공공데이터
비즈니스 사업화 

 대상

 1

300만원 

 최우수상

 1

 200만원

 우수상

 2

 150만원

 신규 데이터 발굴

 아이디어상

 4

 50만원

총 상금

 1,000만원

※ 심사위원 종합평가 의견에 따라 수상작이 적합하지 않을 경우 시상규모를 축소 또는 변경 가능

 

□ 심사방법

 ㅇ (1차 서류심사) 아이템 중복 여부 및 창의성, 우수성, 활용(분석) 적정성 등을 심사하여 수상작의 1.5배수 내외 선정

 ㅇ (2차 발표평가) 서비스 완성도, 사업성, 효과성 등 제안자의 발표, 질의응답 후 발표 현장에서 심사하여 고득점 순으로 순위 결정
   - 코로나19 상황에 따라 발표심사 취소 및 추가 설명자료 제출을 통한 2차 서류심사로 대체 가능

 ㅇ (부적격 제안) 디지털정보실 자체검토 및 필요시 타 기관 의견조회 등을 통해 부적격 여부판단

부적격 제안

  ㅇ 타 공공기관 공공데이터 관련 공모전 수상작
  ㅇ 일반 통념상 그 적용이 불가능하다고 판단된 경우
  ㅇ 특정 개인ㆍ단체ㆍ기업 등의 수익사업과 그 홍보에 관한 사항
  ㅇ 제안서 양식상 요구된 내용 미기재 등 객관적 충실성이 결여된 제안

 

5. (문의처) 여수광양항만공사 디지털정보실 담당자(061-797-4471)

 

6. (결과발표) 2021. 1월 말(예정)/홈페이지 공고 및 개별통보

 

붙임  1. 기획서 1부
        2. 개인정보 수집·이용 동의서 1부
        3. 저작권 관련 사항 1부
        4. 심사 평가표 1부.  끝.

PyR Intro - 신입생OT학기제