2020년 6월 16일 화요일

람다 표현식 (Lambda expression)

람다 표현식(Lambda expression) 


람다 표현식으로 함수를 정의하고, 이를 변수에 할당하여 변수를 함수처럼 사용한다.


(1) 람다 표현식


     lambda <매개변수> : 수식

     ※ 람다식을 실행하면 함수 객체가 만들어진다. 이런 함수를 익명 함수(anonymous
         function)이라고 한다.
   
     (예) lambda x : 2 * x + 1


(2) 변수에 람다 식을 할당하여 사용하는 방법

 
     >>> linear_eq = lambda x : 2 * x + 1
     >>> linear_eq(3)
     7


(3) 함수와 람다식 비교    






2020년 6월 11일 목요일

Miniconda3 + Tensorflow 2 + PyCharm

Mac에 Tensorflow2 사용 환경 설치!! 


설치과정은 https://www.youtube.com/watch?v=MpUvdLD932c 를 참고하였음. 동영상은 2020년 1월에 업로드 되었으며, 아래는 동영상 내용을 요약한 것임


  1. Miniconda3 다운로드 : 구글에서 검색 (https://docs.conda.io/en/latest/miniconda.html)

  2. Miniconda3 설치 : 설치 후 터미널을 실행시키면 (base)라는 가상환경이 동작하는 것을 확인할 수 있다.

  3. Jupyter 설치 : 터미널에서 conda install jupyter 입력하면 (base) 환경에 jupyter가 설치된다.

  4. Environment Setup Script 파일 다운로드 : https://github.com/jeffheaton/t81_558_deep_learning에서 아래로 스크롤 다운하면, tensorflow.yml이라는 파일이 보이며, 이 파일을 다운로드하여 홈디렉토리에 tensorflow.yml로 저장한다.

    <파일내용>

    name: tensorflow

    dependencies:
          - python=3.7
          - pip>=19.0
          - jupyter
          - tensorflow=2.0
          - scikit-learn
          - scipy
          - pandas
          - pandas-datareader
          - matplotlib
          - pillow
          - tqdm
          - requests
          - h5py
          - pyyaml
          - flask
          - boto3
          - pip:
                - bayesian-optimization
                - gym
                - kaggle

  5. Environment Setup Script 파일 실행 :  conda env create -v -f tensorflow.yml를 실행시키면 위 파일 내용이 설치된다. 시간이 조금 걸린다.
    conda activate tensorflow로 (tensorflow) 가상환경을 활성화 시킨다.
    conda deactivate로 (tensorflow) 가상환경을 비활성화 시킬 수 있다.

  6. (tensorflow) 가상환경에 jupyter 커널 설치 : (tensorflow) 가상환경 상태에서 python -m ipykernel install --user --name tensorflow --display-name "Python3.7 (tensorflow)"을 입력한다.

  7. jupyter notebook 실행 : 커널에서 Python3.7 (tensorflow)를 선택하면 tensorflow를 사용할 수 있다.


Mac 터미널에서 가상환경 설정 변경!! 


이렇게 Miniconda와 Tensorflow를 성공적으로 설치하고 나니, 터미널을 켤 때마다 (base) 환경이 기본적으로 설정되는 문제가 발생하였다. 

===> 해결방법 :  (base) 프롬프트 상태에서 conda config --set auto_activate_base False 를 입력하고, 터미널을 재실행 시켜주면 해결된다.



PyCharm에서 project interpreter에 tensorflow 연결하기!! 


Miniconda와 Tensorflow를 설치하고, 터미널도 이전처럼 사용할 수 있도록 만들고나니 실제 개발환경인 PyCharm에서 tensorflow 환경을 연결할 일이 남았다.


  1. PyCharm 메뉴에서 Preferences를 누르면 창이 뜨는데,

  2. 왼쪽 메뉴 중 Project 서브 메뉴인 Project Interpreter를 선택하고,

  3. 오른쪽에 Project Interpreter 선택 창 옆 [톱니바퀴 모양] 버튼을 눌러 [Add...]를 선택하면 새 창이 뜨는데,

  4. 왼쪽 메뉴에서 Virtualenv Environment를 선택하고,

  5. 오른쪽 메뉴에서 Existing Environment 라디오 버튼을 선택하고, Interpreter 선택 창의 옆 [...] 버튼을 눌러 경로를 찾는 창이 나타나면, .../miniconda3/envs/tensorflow/bin/를 찾아 python을 선택한다.
    내 맥의 경우 /Users/sangjincho/opt/miniconda3/envs/tensorflow/bin/python 으로 선택되었고, Miniconda설치 환경에 따라 경로가 바뀔 수 있다.

  6. Interpreter를 선택한 후 아래의 Make available to all projects 체크박스를 선택하여 나중에 다른 프로젝트에서도 동일한 환경을 선택할 수 있도록 한다.

  7. [OK] 버튼을 누르면 창이 닫히고, Preferences 창에 사용할 수 있는 패키지 리스트가 나타난다. 마지막으로 [OK] 버튼을 누르면 PyCharm에서 tensorflow 환경이 갖춰진다.

5번 항목에서 Miniconda 설치 위치를 확인하려면, Finder에서 홈을 선택하고 숨김파일 보기(command+shift+.)로 전환하면 .conda라는 폴더가 보이고, 그 안에  environments.txt 파일이 있는데, 거기에 내가 설치한 가상환경, 여기서는 tensorflow에 해당하는 위치가 기록되어 있다.
















2020년 5월 28일 목요일

파이썬에서 데이터베이스(MySQL) 연동하기

파이썬 + MySQL


0. MySQL 설치

     https://bitnami.com/stack/wamp/installer


I. PyMySQL 모듈 설치

     $ pip install PyMySQL


II. MySQL사용법

  1. PyMySql 모듈을 import 한다.

  2. pymysql.connect() 메소드를 사용하여 MySQL에 Connect 한다. 호스트명, 로그인, 암호, 접속할 DB 등을 파라미터로 지정한다.

  3. DB 접속이 성공하면, Connection 객체로부터 cursor() 메서드를 호출하여 Cursor 객체를 가져온다. DB 커서는 Fetch 동작을 관리하는데 사용되는데, 만약 DB 자체가 커서를 지원하지 않으면, Python DB API에서 이 커서 동작을 Emulation 하게 된다.

  4. Cursor 객체의 execute() 메서드를 사용하여 SQL 문장을 DB 서버에 보낸다.

  5. SQL 쿼리의 경우 Cursor 객체의 fetchall(), fetchone(), fetchmany() 등의 메서드를 사용하여 데이타를 서버로부터 가져온 후, Fetch 된 데이터를 사용한다.

    fetchall() : 모든 데이터를 한 번에 클라이언트로 가져온다.
    fetchone() : 한 번에 하나의  row만 가져온다.
    fetchmany(n) : n개의 데이터를 한 번에 가져온다.

  6. 삽입, 갱신, 삭제 등의 DML(Data Manipulation Language) 문장을 실행하는 경우, INSERT/UPDATE/DELETE 후 Connection 객체의 commit() 메서드를 사용하여 데이터를 확정 갱신한다.

  7. Connection 객체의 close() 메서드를 사용하여 DB 연결을 닫는다.

    (예제코드) 

id
name
age
1526
Doldori
125
1533
Haechi
332
1577
Nari
498


1     import pymysql

2     connection = pymysql.connect( host='localhost',
                                                user='admin',
                                                password='',
                                                db='testdb',
                                                charset='utf8' )

3     cursor = connection.cursor()  # Array based cursor
      # cursor = connection.cursor(pymysql.cursors.DictCursor)  # Dictionary based cursor

     sql = "select * from My_Table"
4   cursor.excute(sql)

5    rows = cursor.fetchall()  # Tuple로 반환
     # rows = cursor.fetchall()   # Dictionary로 반환

     for row in rows:
         print(row)
     # Tuple인 경우 : row --> (1526, 'Doldori', 125)
     # Dictionary인 경우 :  row --> {'id': 1526, 'name': 'Doldori', 'age': 125}

     sql = "insert into My_Table(id, name, age) values('1000', 'Gildong', '525')"
6   connection.commit()

     동적 SQL문을 구성하기 위해서 파라미터값이 들어가는 위치에 
     # Parameter Placeholder인 %s (MySql의 경우)를 넣고, execute() 메서드의 
     # 두번째 파라미터에 실제 파라미터값들의 Tuple을 넣어 주면 된다.
     sql = "select * from My_Table where name=%s and age=%s"
     cursor.excute(sql, ('Doldori', 125))

7    connection.close()



출처 : http://pythonstudy.xyz/python/article/202-MySQL-%EC%BF%BC%EB%A6%AC

2020년 5월 21일 목요일

zero-crossing 찾기

영교차점(zero-crossing) 찾기 (파이썬)

a = [1, 2, 1, 1, -3, -4, 7, 8, 9, 10, -2, 1, -3, 5, 6, 7, -10]

일 때,

In[61]: z = np.where(np.diff(np.sign(a)))[0]

In[61]: z

Out[62]: array([ 3,  5,  9, 10, 11, 12, 15], dtype=int64)

-------------------------------------------------------------------------------------------
a                  :  [ 1,  2,  1,  1, -3, -4,  7,  8,  9,10, -2,  1, -3,  5,  6,  7, -10]
k = np.sign(a)  :  [ 1,  1,  1,  1, -1, -1,  1,  1,  1,  1, -1,  1, -1,  1,  1,  1, -1]
d = np.diff(k)   :  [ 0,  0,  0, -2,  0,  2,  0,  0,  0, -2,  2, -2,  2,  0,  0, -2]
np.where(d)    : (array([ 3,  5,  9, 10, 11, 12, 15], dtype=int64),)
np.where(d)[0] : [ 3,  5,  9, 10, 11, 12, 15]
-------------------------------------------------------------------------------------------

np.diff()의 결과음수이면 데이터가 양수에서 음수로 바뀐 것이고,
np.diff()의 결과가 양수이면 데이터가 음수에서 양수로 바뀐 것이다.

np.where(d)라고 사용하면 d가 영이 아닌 모든 위치를 알려주며, 튜플로 반환된다.
따라서 결과만 얻고자 한다면 np.where(d)[0]로 사용한다.

np.where(d)[0]의 결과는 데이터에서 zero-crossing이 발생하는 시작점을 의미한다.
위의 예에서 "3"은 데이터가 4번째 샘플에서 5번째 샘플로 바뀌는 시점에서 zero-crossing이 발생함을 뜻한다.

람다 표현식 (Lambda expression)

람다 표현식(Lambda expression)  람다 표현식으로 함수를 정의하고, 이를 변수에 할당하여 변수를 함수처럼 사용한다. (1) 람다 표현식       lambda <매개변수> : 수식      ※ 람다식을 실행하...