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 <매개변수> : 수식      ※ 람다식을 실행하...