SyntaxHighlighter.all();

1. 소스코드 (일부)

1) jinja 변수 사용 부분

server.py에서 가져온 jinja2 데이터를 for문을 통해 보여줌 (소스코드 4, 6, 8)

 

jinja2 : 변수로 사용시 {{ data명 }}

          for문 사용시 시작지점 - {% for문 입력 %}, 마지막지점 - {% endfor %}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
                  <div class="v_left">
                    <div class="front">
                      <div class="fadeOut owl-carousel">
                        {% for i in range(1,len_s-1) %}
                        <div class="item">
                          <h6>{{ s_data[i-1][0] }}<br></h6>
                        </div>
                        {% endfor %}
                      
                      </div>
                    </div>
                  </div>                  
 
                <div class="v_center">
                    <div class="realcenter">
                      <div class="fadeOut owl-carousel" id="block-2">
                        {% for i in range(1,len_s-1) %}
                        <div class="item">
                          <h3 style="color: black;">{{ s_data[i][0] }}</h3>
                          <h6 style="color: black;">{{ s_data[i][1] }}<br></h6>
                          <h6 style="color: black;">{{ s_data[i][2] }}<br></h6>
                          <h6 style="color: black;">{{ s_data[i][3] }}<br></h6>
                        </div>
                        {% endfor %}
                      
                      </div>
                    </div>
                  </div>
cs

 

2) owl carousel 플러그인 사용 (JQuery)

웹 화면은 슬라이드 형태로 넘어가기 위해 owl carousel 플러그인을 활용하여 개발
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script>
      jQuery(document).ready(function($) {
              $('.fadeOut').owlCarousel({
                items: 1,
                loop: true,
                autoplay: true,
                autoplayTimeout: 8000,
                smartSpeed: 0,
                animateOut: 'fadeOut',
                animateIn: 'fadeIn',
                nav: false,
                dots: false
              });
      });
      
    </script>
cs

 

3) 스케줄링을 위한 refresh

crontab으로 시스템 업데이트 후에 웹에 적용하기 위하여 refresh해줌

content는 86400S를 의미함 (하루에 한번 refresh함)

1
   <meta http-equiv="refresh" content="86400">
cs

 

 

1. 소스코드 (일부)

서울데이터 - s_data

그 밖 데이터 - etc_date

etc_data는 2차원 배열로 etc_data[0] - 충북세종, etc_data[1] - 충남세종대전 .. 으로 구성함

수집한 데이터는 jinja2 템플릿을 활용하여 html에 전달 (소스코드 118, 122)

* API 데이터는 XML형태로만 제공됨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
app = Flask(__name__, static_url_path='')
 
req_url = 'http://openapi.work.go.kr/opi/opi/opia/wantedApi.do'
s_parameters = {
    'authKey':'API KEY 입력',
    'callTp':'L',
    'returnType':'XML',
    'startPage':1,
    'display':100,
    'career':'N',
    'education':'04',
    'region':'11000'
}
 
s_req = requests.get(req_url, params=s_parameters)
s_f_req = requests.get(req_url, params=s_f_parameters)
s_content = s_req.text
s_f_content = s_f_req.text
s_root = ET.fromstring(s_content)
s_f_root = ET.fromstring(s_f_content)
s_wanted = s_root.findall('.//wanted')
s_f_wanted = s_f_root.findall('.//wanted')
 
s_data = []
 
 
for s_want in s_wanted:
    company = s_want.find('company').text
    if company[0:5].count('('and len(company) > 9:
            company = company[0:8]+ ".."
    elif company[0:8].count(' 'and len(company) > 9:
            company = company[0:8]+ ".."
    elif len(company) > 8:
        company = company[0:7]+ ".."
    title = s_want.find('title').text
    if len(title) > 12:
        title = title[0:11]+ ".."
    career = s_want.find('career').text + ' / ' + '대졸(2~3년)'
    closeDt = s_want.find('closeDt').text
    s_data.append([company+datetime.datetime.now().strftime("%H:%M:%S"), title, career, closeDt])
 
 
 
# '충북세종','충남세종대전','경기','인천','경남부산울산','경북대구','전남광주','전북','강원','제주'
etc=['43000||36110','44000||36110||30000','41000','28000','48000||26000||31000','47000||27000','46000||29000','45000','42000','50000']
 
#배열선언-2년제
etc_parameters = [0 for i in range(10)]
etc_req = [0 for i in range(10)]
etc_content = [0 for i in range(10)]
etc_root = [0 for i in range(10)]
etc_wanted = [0 for i in range(10)]
etc_data=[[] for _ in range(10)]
stack_data = []
 
for i in range(10):
    etc_parameters[i] = {
        'authKey':'API KEY 입력',
        'callTp':'L',
        'returnType':'XML',
        'startPage':1,
        'display':100,
        'career':'N',
        'education':'04',
        'region': etc[i]
    }
        
 
    etc_req[i] = requests.get(req_url, params=etc_parameters[i])
    etc_f_req[i] = requests.get(req_url, params=etc_f_parameters[i])
    etc_content[i] = etc_req[i].text
    etc_f_content[i] = etc_f_req[i].text
    etc_root[i] = ET.fromstring(etc_content[i])
    etc_f_root[i] = ET.fromstring(etc_f_content[i])
    etc_wanted[i] = etc_root[i].findall('.//wanted')
    etc_f_wanted[i] = etc_f_root[i].findall('.//wanted')
 
 
    #지역별 크롤링 -2년제
    for etc_want in etc_wanted[i]:
        company = etc_want.find('company').text
        if company[0:5].count('('and len(company) > 9:
                company = company[0:8]+ ".."
        elif company[0:8].count(' 'and len(company) > 9:
                company = company[0:8]+ ".."
        elif len(company) > 8:
            company = company[0:7]+ ".."
 
        title = etc_want.find('title').text
        if len(title) > 12:
            title = title[0:11]+ ".."
        career = etc_want.find('career').text + ' / '  + '대졸(2~3년)'
        closeDt = etc_want.find('closeDt').text
        stack_data.append([company, title, career, closeDt])
 
 
    etc_data[i] = stack_data
    stack_data = []
 
 
 
############################################
# s_data = 서울 (2-3),  s_f_data = 서울(4)
#'충북세종' CB
#'충남세종대전' CN 
#'경기' GG
#'인천' INC
#'경남부산울산' GN
#'경북대구' GB
#'전남광주' JN
#'전북' JB
#'강원' GW
#'제주' JJ
###########################################
 
@app.route('/CB'
def indexCB():
    return render_template('index.html',s_data=s_data, len_s=len(s_data), etc_data=etc_data[0], len_etc=len(etc_data[0]), local_code=43000
 
@app.route('/CN'
def indexCN():
    return render_template('index.html',s_data=s_data, len_s=len(s_data), etc_data=etc_data[1], len_etc=len(etc_data[1]), local_code=44000
 
 
 
 
cs

취업 API를 연동한 취업공고 모니터링 서비스

 

1. 사용 프로그래밍 언어 및 기타

Python, Flask, html, js, css, jinja, crontab, nginx, aws

 

2. 데이터

워크넷에서 제공하는 채용정보 API

지역과 학력을 기준으로 나누어 웹 구성

지역 : 서울, 경기, 인천, 충북, 세종, 충남, 대전, 경남, 부산, 울산, 경북, 대구, 전남, 광주, 전북, 강원, 제주

학력 : 대졸(2~3년), 대졸(4년)

 

3. 시스템 구성도

 

4. 시스템 설명

목표 : 1. 워크넷 API로 데이터를 가져와서 웹으로 보여주기

        2. 웹 디자인은 '5.결과화면'과 같으며 슬라이드형태로 채용데이터가 바뀜

        3. 지역과 학교에 따라 다른 채용데이터를 가져옴

            ex) 충북대 (서울지역, 충북지역, 대졸4년) / 경북전문대 (서울지역, 경북지역, 대졸2~3년) 

        4. 외부에서 접속하기 위해 AWS EC2, 웹호스팅 사용

        5. 매일 업데이트되는 데이터 가져오기 (스케줄링) 

                                                                              

 

 

5. 결과 화면

          -> 슬라이드 형태로 바뀜                   

                      첫번째 회사명   <   두번째 회사명   >   세번째 회사명

                                                   채용설명

                                            경력코드 / 학력코드

                                                   채용날짜

ppt 참고

Part 1. 데이터의 저장

Part 2. 데이터 조작

Part 3. 운영체제

새 창에서 열기

'컴퓨터 과학 > 자료구조' 카테고리의 다른 글

[자료구조] 6. 동적 메모리 할당  (3) 2018.12.12
[자료구조] 5.포인터  (1) 2018.12.12
[자료구조] 4.구조체  (0) 2018.12.11
[자료구조] 3.배열  (0) 2018.12.11
[자료구조] 2. 순환  (1) 2018.11.29

ppt참고

 

 

새 창에서 열기

'컴퓨터 과학 > github' 카테고리의 다른 글

[git] github 기본 개념 및 사용법  (0) 2021.03.12

1. Git과 GitHub 

  Git :  컴퓨터에 로컬로 설치하여 버전 제어를 처리하는 소프트웨어

          -> 소스 코드 관리를 위한 분산 버전 관리 시스템

 

  GitHub :  Git을 호스팅해주는 웹 서비스 (개발자들의 페이스북)

               Git 데이터를 저장하는 서버 -> Git 저장소 서버를 대신 유지 및 관리 해줌

                (Git 저장소를 직접 설치하지 않고 GitHub를 통해 Git 사용가능)

 

2. Git 명령어

ppt 참고 

새 창에서 열기

'컴퓨터 과학 > github' 카테고리의 다른 글

[git] git으로 협업하기 - 시나리오  (0) 2021.03.12

1. DataGrip 이란?

JetBrains에서 제공하는 데이터베이스 및 SQL용 크로스 플랫폼 IDE이다.

 

2. 설치 방법

   1) JetBrains에 들어가서 회원가입을 한다.

www.jetbrains.com/ko-kr/

 

JetBrains: Essential tools for software developers and teams

JetBrains is a cutting-edge software vendor specializing in the creation of intelligent development tools, including IntelliJ IDEA – the leading Java IDE, and the Kotlin programming language.

www.jetbrains.com

    

   2) 회원가입 후 학교 이메일을 입력하여 무료 라이센스를 받는다.

 

 

   3) DataGrip을 다운 받는다.

www.jetbrains.com/ko-kr/datagrip/download/#section=windows

 

다운로드 DataGrip: 데이터베이스 및 SQL용 크로스 플랫폼 IDE

최신 버전 다운로드: DataGrip (Windows, macOS, Linux)

www.jetbrains.com

 

4) 설치하기~~~

 

5) JB id/pw 입력

 

 

 

 

설치 끝!

  • 이 블로그 내의 Flask 내용 일부분은 YouTube 동빈나, '선형회귀를 활용한 배추 가격 예측 AI 개발' 강의를 요약 및 참고한 것입니다. 
  • 제가 이해한 대로 정리한 내용이기에 본문의 내용과 상이할 수 있습니다. 

기상청 데이터를 활용한 양파가격 예측

 

1. 사용 프로그래밍 언어

       분석 - Python ( tensorflow v 2.3.1)

       웹 - Flask html js css ...

 

2. 데이터

      기간 : 2010.01.01 ~ 2017.12.31

      기상청 데이터 - 평균 풍속, 최저 기온, 최고 기온, 강수량

      양파가격 데이터 - 양파 평균 가격 데이터 (크롤링)

 

3. 시스템 구성도

유튜브(동빈나)를 참조하여 다시 그려서 틀릴 수도 있습니다........................................................................

 

4. 파일 구조

 

5. 소스코드

(1) 처음 모델 만들기 위한 python 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import tensorflow.compat.v1 as tf
import numpy as np
import pandas as pd
from pandas.io.parsers import read_csv
 
#모델 초기화
model = tf.compat.v1.global_variables_initializer()
 
# 데이터 불러오기
data = pd.read_csv('data.csv', sep =',', encoding='latin1')
 
# 행렬 형태로 데이터 담기
xy = np.array(data, dtype=np.float32)
 
x_data= xy[:, 1:-1#오른쪽 빼고 다 가져오기
y_data= xy[:, [-1]] #가장 오른쪽만 가져오기
 
tf.__version__ #tensorflow 버전 확인
 
tf.compat.v1.disable_eager_execution()
# (version1)session 정의 후 run 수행하는 과정 -> (version2)바로 실행 
 
= tf.compat.v1.placeholder(tf.float32, shape=[None4])
= tf.compat.v1.placeholder(tf.float32, shape=[None1])
= tf.Variable(tf.random_normal([4,1]),name="weight"#가중치
= tf.Variable(tf.random_normal([1]),name="bias"#bias 값
 
# 선형회귀 (행렬의 곱)
hypothesis = tf.matmul(X, W) + b 
 
# 비용 함수 정의
cost = tf.reduce_mean(tf.square(hypothesis - Y))
 
# 최적화 함수 사용 , 학습률 0.000005 ( 학습률을 적절히 정하는게 중요)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.000005)
train = optimizer.minimize(cost) #train 시작
 
sess = tf.Session()
sess.run(tf.global_variables_initializer()) 
 
 
# 학습 시작
for step in range(100001):
    cost_, hypo_, _ = sess.run([cost, hypothesis, train], feed_dict={X: x_data, Y: y_data})
 
 
#학습 모델 저장
saver = tf.train.Saver()
save_path = saver.save(sess, "./save.cpkt")
print("학습 모델 저장")
 
# 학습 모델 저장하는 이유 ? 요청때마다 하면 리소스가 너무 낭비
 
 
cs

 

(2) html 소스코드 (일부분)

빨간색 박스 변수를 통하여 Flask에 연결된다.

 

(3) Flask가 포함되어있는 Python 분석 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#utf-8
from flask import Flask, render_template, request
import tensorflow.compat.v1 as tf
import numpy as np
import datetime
 
#app이라는 플라스크 객체
app = Flask(__name__)
 
tf.compat.v1.disable_eager_execution()
 
= tf.compat.v1.placeholder(tf.float32, shape=[None4])
= tf.compat.v1.placeholder(tf.float32, shape=[None1])
= tf.Variable(tf.random_normal([4,1]),name="weight")
= tf.Variable(tf.random_normal([1]),name="bias")
 
hypothesis = tf.matmul(X, W) + b #가설부분
 
#저장된 모델 가져오기
saver = tf.train.Saver() 
model = tf.compat.v1.global_variables_initializer()
 
sess = tf.Session()
sess.run(model)
 
save_path = "./model/save.cpkt"
saver.restore(sess, save_path)
 
#기본 경로 설정
@app.route("/", methods=['GET','POST']) #기본 경로에 접속시 get, post 메소드 사용 가능하도록
def index():
    if request.method == 'GET':
        return render_template('index.html'#get 시 index.html 보여주기
    if request.method == 'POST':
        avg_temp = float(request.form['avg_temp'])
        min_temp = float(request.form['min_temp'])
        max_temp = float(request.form['max_temp'])
        rain_fall = float(request.form['rain_fall'])
    
    price=0
    
    #사용자가 가져온 데이터 2차원으로 만들고
    data = ((avg_temp, min_temp, max_temp, rain_fall), )
    arr = np.array(data, dtype=np.float32)
    
    x_data = arr[0:4]
    dict = sess.run(hypothesis, feed_dict={X: x_data}) #가설에다가 적용 후 
 
    price = dict[0#결과값을 출력
    return render_template('index.html',price=price) #price라는 변수에 값 부여
 
 
if __name__ == '__main__'#메인 함수로 지정함으로써 웹서버 구동
    app.run(debug=True)
cs

Flask 소스코드 : 7-8, 29-38, 50-54

Flask 소스코드를 제외한 다른 Python 소스는 위의 '(1) python 소스'와 비슷하다.

 

6. 결과 화면 (웹)

 

 

7. 결론

사용자가 접속할 때마다 처음부터 분석이 아닌 체크포인트 이후만 분석을 하기 때문에 시간 절약 됨

→ Flask를 처음 접하는 사람이 단 기간에 공부하기에 너무 좋음 : )

 

+ Recent posts