머신러닝(?) 딥러닝(?) 기계학습(?) 을 직접 수행하기위해 필요한 도구...를 설치해보자

 

1. Anaconda 설치

 

단순히 python과 tensorflow만 설치하여 다양한 교재들과 웹에 있는 다양한 코드의 수행 불가하다.

따라서 다양한 라이브러리를 패키지로 제공해주는 아나콘다(anaconda)를 설치 하는것을 추천한다.

 

https://www.anaconda.com/download/

 

 

 

본인의 환경에 맞는 installer를 선택하여 그냥 Default로 설치하면 끝..

 

 

 

 

2. Tensorflow 설치환경 확인

(Tensorflow는 https://www.tensorflow.org/install/ 를 참고하여 설치 하는것을 추천!!!)

 

(*) 먼저 설치관련 요구사항 및 환경을 확인해야 시간낭비 공간낭비를 덜 한다.

 

다양한 설치방법이 있겠지만, Anaconda prompt 에서 pip를 이용해 설치하고자 한다.

 

따라서 앞서 수행한 아나콘다(Anaconda)의 설치로 기본적인 환경은 구성이 완료 되었다.

 

그런데!!!

현재(2019.01.23.) Tensorflow는 아래와 같이 파이썬 3.4, 3.5, 3.6을 지원한다.

 

 

그러나,

현재(2019.01.23.) Anaconda에 포함되어 있는 파이선은 python 3.7(아래에서 확인)!!!


 

따라서 Python 3.6을 설치하기 위한 가상환경을 구성 한후 Tensorflow를 설치하였다.

 

(*) Anaconda를 구버전으로 설치하여 확용하면 가상환경 설정없이도 Tensorflow의 설치 및 활용이 가능하나, 다양한 이점들 때문에 가상환경을 구성하여 설치하는것을 추천 함

 

 

3. 가상환경구성

 


### 가상환경 생성

$ conda create -n [이름] python=3.6

### 생성된 가상환경 확인

$ conda env list

### 가상환경활성화(사용)

$ conda activate [이름]

### 가상환경비활성화(사용중지)

$ conda deactivate


 

위 명령어들을 차례로 입력한 결과 확인

 

 

 

이로써 Tensorflow를 설치하기 위한 기본적인 환경구성은 마무리 되었다 볼수 있다.

 

 

 

Posted by Roiz
,

여러개의 입력파일(CSV)에 대한 통계 수치 계산

 

다음 예제코드는 여러개의 입력 파일(CSV)에서 열의 합계와 평균을 계산하여 화면 및 파일로 출력

 

 

 

- 코드설명 -


  9 output_header_list = ['file_name','total_chl-a','average_chl-a']

 10

 11 csv_out_file = open(output_file, 'a', newline='')

 12 fwriter = csv.writer(csv_out_file)

 13 fwriter.writerow(output_header_list)


 

 

9행

- 출력파일의 열 헤더정보를 갖는 리스트변수 생성

11행

- 출력파일을 append 형식으로 open

12행

- 출력파일을 작성하기 위한 fwreter객체 생성

13행

- 출력파일에 헤더행(output_header_list)를 작성

 


 18       output_list = []

 19       output_list.append(os.path.basename(input_file))

 20       header = next(freader)

 21       total_chla = 0.0

 22       number_of_chla = 0.0


 

18행

- 결과값을 저장할 빈 리스트 생성

19행

- os모듈을 이용해 입력파일의 이름을 output_list 리스트변수에 추가

20행

- next()함수를 사용하여 각 파일의 헤더 행을 제거

21, 22행

- 각 csv파일에서 chl-a의 개수와 을 저장할 total_chla, number_of_chla

 


 23       for row in freader:

 24          chla_amount = row[-1]

 25          total_chla += float(str(chla_amount).strip().replace(',',''))

 26          #print(os.path.basename(input_file),': ',total_chla)

 27          number_of_chla += 1


 

23행

- 각 입력파일 내에 있는 각각의 행을 반복하는 for문

24행

- 리스트의 인덱스를 사용하여 chl-a 열의 데이터 값을 추출하고 chla_amount변수에 저장

- 'row[-1]'은 행의 맨 마지막 열을 의미

25행

- str함수를 사용해 chla_amount의 값을 문자열로 변환

- 이후, strip() 및 replace() 함수(특정 조건을 충족하는 행의 필터링 참고)를 사용하여 데이터 값에서 쉼표 제거

- 마지막으로 float()함수를 사용하여 문자열을 부동소수점 숫자로 변환하고 chla_amount변수에 할당

27행

- chl-a 열의 개수를 카운팅

 


 28       average_chla = '{0:.2f}'.format(total_chla / number_of_chla)

 29       # total_chla = '{0:.2f}'.format(total_chla)

 30       output_list.append(total_chla)

 31       output_list.append(average_chla)

 32       fwriter.writerow(output_list)

 33       print(output_list)

 34 csv_out_file.close()


 

28행

- chl-a의 총합(total_chla)을 열의 개수(number_of_chla)로 나누어 평균값을 계산

- 계산된 평균값을 소수점 이하 두 자리로 형식화하여 문자열로 변환한뒤 average_chla변수에 저장

30행

- total_chla 값을 output_list의 두번째 값으로 추가

31행

- average_chla 값을 output_list의 세번째 값으로 추가

32, 33행

- output_list의 값을 파일 및 화면에 출력

 

(*) 화면 출력결과

 

(*) 출력파일로 설정한 r_sum_average_from_multiple_CSVs.csv를 통해 결과 확인

(*) 소스코드 및 CSV파일 첨부

 

12_소스코드 및 CSV파일.zip

 

Posted by Roiz
,

동일한 항목의 데이터가 여러 파일로 나누어져 있을때 하나의 파일로 병합

 

다음 에제코드는 [CSV] 여러개의 CSV파일 처리 - 1의 CSV파일의 데이터를 하나의 CSV파일로 병합하는 코드

 

 

 

- 코드설명 -

 


 13       with open(output_file, 'a', newline='') as csv_out_file:


 

13행

- 출력파일을 open하는 with문

- open()함수의 인수로 'w'가 아닌 'a' 사용하여 추가모드(append)로 파일 open

- 쓰기모드('w'): 이전에 처리된 출력 파일의 데이터를 덮어쓰기

- 추가모드('a'): 이전에 처리된 출력파일의 맨 끝라인에 추가하여 쓰기

 


 17          if is_first_file:

               ...

 21          else:

 22             header = next(freader)

               ...


 

17행~25행

- if-else문은 9행에서 생성한 is_first_file 변수를 이용해 첫 번째 입력 파일과 후속 입력파일을 구분

- 헤더 행은 최종 출력 파일에 한번만 기록 되도록 하기 위함

- 17행~20행 if문 블록은 첫 번째 입력 파일을 처리하도록 하여 헤더행 포함

- 21행~25행 else문 블록은 나머지 모든 입력 파일을 처리하도록 하기 위해 출력파일에 기록하기전 22행의 next() 함수를 활용한 header처리 구문 포함

 

(*) 출력파일 r_merge_out_csv_files.csv를 통해 결과 확인

(*) 소스코드 및 csv 파일 첨부

 

 

11_소스코드 및 CSV파일.zip

Posted by Roiz
,

대부분의 프로젝트에서는 하나의 파일이 아닌 여러개의 파일 활용

여러개의 CSV파일로부터 행과 열의 개수 확인

 

다음 예제코드는 현재폴터('./')에 있는 여러개의 CSV파일의 개수와 각 CSV파일의 행, 열의 개수를 세어 화면에 출력해주는 코드

 

 

 

 

 

- 코드설명 -


   3 import glob

   4 import os


 

3행

- glob 모듈 임포트

- glob모듈을 이용해 특정 패턴과 일치하는 모든 경로명을 탐색 가능

- 패턴에는 * 등 유닉스 쉘 스타일의 와일드카드 문자 포함 가능

- 본 예제에서는 8행에 서 '2017*'를 이용, 2017로 시작하는 파일명을 갖는 모든 파일을 검색

- 읽어오는 CSV파일은 파일명이 모두 2017로 시작되는 파일임, 확장자가 csv인 모든파일을 검색하고자 한다면 8행에 '2007*'을 '*.csv'로 변경하면 가능

4행

- os 모듈 임포트

- 경로명을 파싱하는데 유용한 함수 포함

- os.path.basename(path)는 입력받은 경로에서 파일명 반환

 


  9 for input_file in glob.glob(os.path.join(input_path, '2007*')):


 

9행

- 여러개의 입력파일에서 데이터를 처리하기 위한 핵심

- glob 및 os모듈의 함수를 사용하여 처리할 입력파일의 리스트를 생성하고 for문으로 일련의 입력파일을 반복

- os.path.join() 함수는 괄호 안에 있는 두개의 컴포넌트를 결합

- input_path는 입력 파일이 들어있는 폴더의 경로

- '2007*'는 2007 패턴으로 시작하는 파일의 이름을 나타냄

- glob모듈의 glob.glob()함수는 '2007*'의 별표(*)를 실제 파일명으로 확장

- 이 예제에서 glob.glob()과 os.path.join()은 다섯개의 입력파일이 들어있는 리스트 생성

 


 17    print('{0!s}: \t{1:d} rows \t{2:d} columns'.format(\

 18           os.path.basename(input_file), row_counter, len(header)))


 

17,18행

- 각 입력 파일의 파일이름, 파일의 행과 열의 수를 출력하는 print문

- 세개의 열(파일명, 행수, 열수)를 정렬하기 위해 탭 문자(\t) 삽입

- {}문자를 사용해 세개의 값을 print문에 전달

- 첫번째 값: os.path.basename()함수를 이용해 전체 경로명의 마지막요소(파일명)를 추출

- 두번째 값: 변수 row_counter 를 이용해 각 입력 파일에서 행의 개수 추출

- 세번째 값: len()함수를 이용해 각 입력파일의 열 헤더가 들어있는 리스트변수(header)의 원소 개수를 추출

 

 


 19 print('Number of files: {0:d}'.format(file_counter))


 

19행

- file_counter의 값을 사용하여 스크립트에서 처리한 파일의 개수를 출력

 

 

(*) 결과화면

 

(*) 소스코드 및 CSV파일 첨부

 

10_소스코드 및 CSV파일.zip

 

Posted by Roiz
,

[CSV] 헤더 추가하기

Python 2019. 1. 7. 20:45

CSV 파일에 헤더 행이 포함되어있지 않은경우 파이썬 스크립트를 이용해 헤더를 추가

 

다음 예제코드는 헤더가 없는 '200701-200712(NH).csv'를 로드하여 헤더를 입력하고,

이를 'r_add_header_row.csv'에 저장하는 코드

 

 

- 코드명 -

 


 11       header_list = ['','Name','Date','Round','pH','DO',\

 12                      'BOD','COD','SS','TN','T-P','Deg.',\

 13                      'EC','Total DJG','DN','Chl-a']

 14       fwriter.writerow(header_list)

 15       print(header_list)

 16       for row in freader:

 17          fwriter.writerow (row)

 18          print(row)


 

11행, 12행, 13행

- 각 열의 헤더에 해당하는 문자열 값이 들어있는 header_list 리스트 변수 생성

14행

- header_list 리스트변수의 값을 파일로 출력

15행

- header_list 리스트변수의 값을 화면에 출력

16행

- 입력된 csv파일의 모든 값에 대하여 반복작업 수행

17행

- 헤더행 뒤에 입력 csv파일의 모든 값을 파일로 출력

18행

- 헤더행 뒤에 입력 csv파일의 모든 값을 화면에 출력

 

(*) 출력파일 r_add_header_row.csv를 통해 결과확인

(*) 소스코드 및 CSV파일 첨부

 

소스코드 및 CSV(9).zip

 

 

Posted by Roiz
,

[CSV] 행의 연속선택

Python 2018. 12. 12. 16:35

CSV파일에서 분석해야하는 특정행이 있는경우, 필요한 행을 추출하여 활용

 

다음 예제 코드는 row_counter라는 변수를 이용해 행번호를 추적, 필요한 행을 식별하고 선택하여 필터링 수행

 

 

 

- 코드설명 -

 


  7 row_counter = 0

 

            ...

 

 13       for row in freader:

 14          if row_counter >= 24 and row_counter <= 29:

 15             print([value.strip() for value in row])

 16             fwriter.writerow([value.strip() for value in row])

 17          row_counter += 1


 

 

7행

- 행을 판별하기위한 변수(row_counter) 생성

 

...

 

13행

- freader로 읽어드린 CSV파일의 전체행 반복..

14행

- row_counter변수를 통해 24번째 줄 이상이고 39번째 줄 이하인 행을 필터링

15, 16행

- if문을 통해 필터링된 CSV파일의 24번째줄~39번째 줄을 화면 및 파일에 출력

17행

- 매 행마다 1식증가하여 행을 카운팅(현재행 판별을 위해)

 

 

(*) 출력파일 r_select_contiguous_necessary_row.csv를 통해 결과 확인

(*) 소스코드 및 csv파일 첨부

 

소스코드 및 CSV.zip

 

 

Posted by Roiz
,

CSV 파일에 불필요한 열이 포함되어있는 경우, 필요한 열만 필터링하여 활용

- 열의 인덱스 값을 사용하는 방법

- 열의 헤더를 사용하는 방법

 

열의 헤더를 사용해 특정(관심) 열을 필터링

- 관심있는 열 헤더를 쉽게 식별가능

- 여러개의 입력 파일을 처리할 때 열의 헤더는 같지만 열의 위치가 입력 파일에 따라 다를 때

 

다음 예제 코드는 [CSV] 열의 인덱스 값을 사용하여 특정열을 선택 에서와 동일하게 Name 및 BOD, TN, T-P열만 사용하기 위한 필터링을 헤더명을 이용해 수행

 

 

 

 

- 코드설명 -

 


  7 selected_column_name = ['Name', 'BOD', 'T-P', 'TN']

  8 selected_column_index = [ ]


 

7행

- 관심있는 헤더명이 들어있는 리스트변수(selected_column_name) 생성

8행

- 뒤에서 관심열의 인덱스값이 들어갈 리스트변수(selected_column_index) 생성

 

 


 14       next(freader)

 15       header = next(freader)

 16       for index_value in range(len(header)):

 17          if header[index_value] in selected_column_name:

 18             selected_column_index.append(index_value)

 19       print(selected_column_name)

 20       fwriter.writerow(selected_column_name)


 

14행

- freader객체에 next()함수를 사용하여 헤더에서 사용되지 않는 행 삭제

15

- freader객체에 next()함수를 사용하여 헤더에서 사용되는 행을 header 리스트변수로 읽어옴

16행

- header 리스트변수로 읽어온 헤더의 인덱스 값에 대해 반복문 수행

17행

- if문과 리스트 인덱싱을 통해 각 열의 헤더가 관심 헤더명과 동일한 값인지 판별

- header[index_value]가 selected_column_name과 같다면 18행 수행 그렇지 않다면 for문으로...

18행

- 17행에서 판별한 값이 포함되어있는 index_value값을 selected_column_index리스트 변수에 추가

19, 20행

- 관심있는 헤더를 화면과 파일로 출력

 


 21       for row_list in freader: 

 22          row_list_output = []

 23          for index_value in selected_column_index

 24             row_list_output.append(row_list[index_value])

 25          print(row_list_output)

 26          fwriter.writerow(row_list_output)


 

21행

- 헤더를 제외한 CSV파일의 값에 대해 for문 수행

22행

- 포함하려는(관심있는)행의 데이터 값을 저장할 빈 리스트(row_list_output) 생성

23행

- selected_column_index의 값을 반복

24행

- 23행의 인덱스 값에 해당하는 열의 데이터 값을 row_list_output에 추가

25, 26

- row_list_output의 값을 화면 및 파일에 출력

 

(*) 출력파일 로 설정한 r_filtering_by_column_name.csv를 통해 결과 확인

(*) 소스코드 파일 첨부(csv파일은 [CSV] 파일 읽고 쓰기(2) 에...)

 

 

7_filtering_by_column_name.zip

Posted by Roiz
,

CSV 파일에 불필요한 열이 포함되어있는 경우, 필요한 열만 필터링하여 활용

- 열의 인덱스 값을 사용하는 방법

- 열의 헤더를 사용하는 방법

 

열의 인덱스 값을 이용해 특정 열을 필터링

- 열의 인덱스 값을 쉽게 식별가능

- 여러개의 입력 파일 처리 하기 위한 모든 입력 파일에서 열의 위치가 변경되지 않는 경우

 

다음 예제 코드는 Name 및 BOD, TN, T-P 열만 사용하기 위해 인덱스 값을 이용한 필터링 수행

 

 

 

 

- 코드설명 -

 


  8 selected_columns = [1, 6, 9, 10]


 

8행

- CSV에서 추출하려는 4열의 인덱스 값을 갖는 selected_column 리스트변수 생성

 


 14       for row_list in freader:

 15          row_list_output = []

 16          for index_value in selected_column:

 17             row_list_output.append(row_list[index_value])

 18          print(row_list_output)

 19          fwriter.writerow(row_list_output)


 

15

- CSV에서 추출하고자 하는 각 행의 값을 저장하기 위한 row_list_output 리스트변수 생성

16행

- selected_column에 저장되어있는 관심 인덱스 값을 반복하는 for문

17행

- 리스트의 append()함수를 사용해 selected_column에 정의된 특정 인덱스의 데이터 값을 row_list_output에 추가

- fwriter의 writerow()함수는 문자열이나 숫자의 시퀀스 자료형을 받으므로 리스트변수(row_list_output)를 만들어 놓는것이 유용함

18, 19행

- row_list_output의 값을 화면 및 파일에 출력

 

(*) 출력파일 로 설정한 r_filtering_by_column_index.csv를 통해 결과 확인

(*) 소스코드 파일 첨부(csv파일은 [CSV] 파일 읽고 쓰기(2) 에...)

 

6_filtering_by_column_index.zip

 

Posted by Roiz
,

특정한 패턴과 일치하거나 패턴(정규표현식)이 포함되어있는 행에 대한 필터링

 

다음 예제 코드는 어떤 행의 값이 특정 패턴과 일치하는지 판별, 패턴과 일차하는 값을 갖는 행의 데이터셋 출력

- 데이터셋에서 Date열의 데이터 값이 5열이후에 '-04-'를 포함하는 모든행을 필터링

 

 

 

 

 


   3 import re


 

3행

- re모듈(정규 표현식 모듈)의 함수를 사용할 수 있도록 re 모듈 import

 


   8 pattern = re.compile(r'(?P<my_pattern_group>^....-04-.*)', re.I)


 

8행

- re모듈의 compile() 함수를 사용해 정규 표현식 변수(pattern) 생성

- r은 작은 따옴표 사이의 패턴이 원시 문자열임을 나타냄

- 메타문자 ?P<my_pattern_group> 는 <my_pattern_group>그룹에 포함되어있는 하위 문자열 필터링

- 본 예제의 패턴은 ^....-04-.* 임

- 캐럿(^)은 문자열이 시작하는 패턴을 검색

- 마침표(.)는 개행을 제외한 임의 문자 하나를 나타냄

- 별표(*)는 메타 문자 앞에 있는 문자가 0번이상 일치해야함을 나타냄

- 따라서 ^....-04-.* 는 개행문자를 제외한 임의문자 4개로 시작하고 5~8열은 -04- 이고 이후 개행문자를 제외한 모든 문자가 몇번이든 올수 있다는 의미

- 즉, 04월에 해당하는 모든 행을 필터링 하라는 의미

- re.I 인수는 정규 표현식이 대소문자를 구분하지 않음

 


 19          date = row_list[2]

 20          if pattern.search(date):

 21             print(row_list)

 22             fwriter.writerow(row_list)


 

19행

- 리스트 인덱싱을 이용해 csv파일에서 Date열을 추출하고 이를 date변수에 할당

20행

- re 모듈의 search 함수를 이용해 date변수에 할당된 값을 앞서 정의한 패턴으로 필터링

21, 22행

- 필터링된 패턴을 화면과 파일로 출력

 

(*) 출력파일로 설정한 r_filtering_value_match_pattern.csv를 통해 결과확인

(*) 소스코드 첨부(csv 파일은 [CSV]파일 읽고 쓰기(2) 에서 확인가능....)

 

5_filtering_value_match_pattern.zip

Posted by Roiz
,

관심 대상 집합을 포함하는 행을 필터링

- Name열에서 집합 ['kyungan3', 'kyungan5']중 한 값을 포함하는 모든 행

- Date열에서 집합 ['2007-06-04', '2007-11-13']중 한 값을 포함하는 모든 행

 

다음 예제 코드는 행의 데이터 값이 어떤 집합의 원소를 포함하는지 판별하고, 전체 행에서 관심집합의 값을 포함하는 행들(부분집합)을 찾아 화면 및 파일로 출력

 

 

 

 

- 코드설명 -

 


  7 #important_dates = ['2007-06-04', '2007-11-13', '2007-12-12']

  8 important_stations = ['kyungan3', 'kyungan5']


 

8행(7행)

- 관심값에 해당하는 name을 important_stations 변수에 리스트형(type)으로 할당

 


 19          #a_date = row_list[2]

 20          a_name = row_list[1]

 21          #if a_date in important_dates:

 22          if a_name in important_stations:

 23             print(row_list)

 24             fwriter.writerow(row_list)


 

20행(19행)

- freader로 읽은 csv 파일의 각 행에서 name열(row_list[1])을 로드하여 a_name변수에 할당

( - freader로 읽은 csv 파일의각 행에서 date열(row_list[2])을 로드하여 a_date변수에 할당 )

22행(21행)

- if 문을 사용해 a_name 변수에 들어있는 name 열의 데이터 값이 important_stations 에 있는 관심 집합에 포함되는지 판별

( - if 문을 사용해 a_date 변수에 들어있는 date 열의 데이터 값이 important_date에 있는 관심 집합에 포함되는지 판별 )

23행, 24행

- 22행의 판별결과로 a_name가 important_stations에 포함된다면, 화면 및 파일에 출력

 

(*) 주석 처리된 부분을 기존 코드와 대체하면 - 관심값을 name에서 date로 변경하여 필터링

 

 

 

(*) 출력파일로 설정한 r_filtering_value_in_set.csv를 통해 결과 확인

(*) 소스코드 첨부(csv파일은 [CSV]파일 읽고 쓰기(2) 에서 확인가능...)

 

4_filtering_value_in_set.zip

 

Posted by Roiz
,