기초적인 함수 만들어 보기

> sum1ton = function(n){
+   result= sum(1:n)
+   return(result)
+ }
> sum1ton(100)
[1] 5050

for/while(반복)

> i=0
> for (i in 1:10) {
+   print(i)
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
> number =1
> while (number<=10) {
+   print(number)
+   number = number+1
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

 

apply 반복문

반복문이 매우 귀찮은 경우가 존재->apply 사용

> a=matrix(1:12, nrow = 4, byrow = T)
> print(a)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
[4,]   10   11   12
> apply(a,MARGIN=1,FUN=sum)#margin 1은 rwo방향으로 더하라/ fun은 사용자 지정 함수수
[1]  6 15 24 33
> apply(a, 2, FUN=sum)#2는 col방향으로 다 더하라
[1] 22 26 30

 
array

> b=array(1:18, dim =c(3,3,2))#3*3배열열 2개
> b
, , 1

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2

     [,1] [,2] [,3]
[1,]   10   13   16
[2,]   11   14   17
[3,]   12   15   18

> apply(b,3,diag)#3차원/diag 함수는 주어진 행렬의 주 대각선 요소를 반환하는 함수입니다
     [,1] [,2]
[1,]    1   10
[2,]    5   14
[3,]    9   18

 
if/else(조건문)

> for (i in 1:10) {
+   if(i%%2==0){
+     print("짝수")
+   }
+   else{
+     print("홀수")
+   }
+ }
[1] "홀수"
[1] "짝수"
[1] "홀수"
[1] "짝수"
[1] "홀수"
[1] "짝수"
[1] "홀수"
[1] "짝수"
[1] "홀수"
[1] "짝수"
> x=3
> y= -5:5
> ifelse(x>y,1,0)
 [1] 1 1 1 1 1 1 1 1 0 0 0

-%%로 나누고 나머지가 0
-ifelse로 사람 카운팅 할 때 사용 가능
 
범죄현장 함수
-잘 안되네...

> site = c(1:10)
> x=c(2,5,5,5,1,5,7,4,5,6)
> y=c(0,4,1,2,8,9,5,2,4,1)
> 
> name=c("a","b","c")
> axy=c(1,5,5)
> bxy=c(4,7,1)
> cxy=c(8,1,3)
> df=cbind(site,x,y)
> fix(df)
> 
> df2=rbind(axy,bxy,cxy)
> fix(df2)
> site=df
> 
> seller =axy[1:3]
> seller =bxy[1:3]
> seller =cxy[1:3]
> 
> distance = function(seller,site){
+   dist_mat = matrix(0,10,1)
+   for (i in 1:10) {
+     temp = sqrt((seller-site[i,1:2])%*%t(t(seller-site[i,1:2])))
+     dist_mat[i,1] =temp
+   }
+   return(dist_mat)
+ }
> 
> distance(seller,site[,2:3])
           [,1]
 [1,]  6.164414
 [2,]  4.690416
 [3,]  3.605551
 [4,]  3.741657
 [5,] 10.099505
 [6,]  8.774964
 [7,]  5.744563
 [8,]  4.242641
 [9,]  4.690416
[10,]  3.605551
20건의 경고들이 발견되었습니다 (이를 확인하기 위해서는 warnings()를 이용하시길 바랍니다).
> a=distance(seller, site/seller[3])
20건의 경고들이 발견되었습니다 (이를 확인하기 위해서는 warnings()를 이용하시길 바랍니다).
> b=distance(seller, site/seller[3])
20건의 경고들이 발견되었습니다 (이를 확인하기 위해서는 warnings()를 이용하시길 바랍니다).
> c=distance(seller, site/seller[3])
20건의 경고들이 발견되었습니다 (이를 확인하기 위해서는 warnings()를 이용하시길 바랍니다).
> 
> dat = cbind(a,b,c)
> 
> for(i in 1:10){
+   print(which.min(dat[i,]))
+ }
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
> if (identical(seller, axy)) {
+   distance(seller, site[, 2:3] / axy[3])
+ }
> 
> if(seller==axy){
+   distance(seller, site[,2:3]/axy[3])
+ }

-실패인듯

'Language > R' 카테고리의 다른 글

선형회귀  (1) 2024.04.22
선형대수  (0) 2024.04.21
미적분  (1) 2024.04.21
R의 기초  (1) 2024.04.20

R이란?

통계분석, 머신러닝, 인공지능을 위한 언어
 
R vs 파이썬(둘다 데이터를 사용하지만)
R-분석업무
파이썬-IT기술업무
 
*벡터
interger, numeric, character, logical 유형
 
벡터의 선언

> name = c("유비", "관우", "제갈량")
> print(name)
[1] "유비"   "관우"   "제갈량"

 
벡터의 주소

> name[1]
[1] "유비"
> length(name)
[1] 3

 
벡터의 주소 : 논리벡터

> name[c(T,T,F)]
[1] "유비" "관우"

 
seq:순차

> seq(5)
[1] 1 2 3 4 5
> seq(-1,1,by=0.5)
[1] -1.0 -0.5  0.0  0.5  1.0

 
 
*list
벡터와 리스트 차이

> name = c("유비", "관우", "제갈량")
> ability=c(7 , 8 ,9)
> print(c(name[1], ability[1]))
[1] "유비" "7"   
>       
> 관우 = list(
+ name = name[2],
+ ability = ability[2]
+ )
> print(관우)
$name
[1] "관우"

$ability
[1] 8

> 
> 관우$ability
[1] 8

 
-리스트를 활용할 경우, 특정 기준으로 데이터를 모아서 처리/호출 가능
-이름$가져오고싶은해당벡터를 활용하면 가져와진다.
 
*데이터프레임

> name= c("chan", "song", "jam")
> power=c(1,2,3)
> wisdom=c(3,2,3)
> job=c("a","b","c")
> chan=list(
+   name=name[1],
+   power=power[1],
+   wisdom=wisdom[1],
+   job=job[1]
+ )
> chan
$name
[1] "chan"

$power
[1] 1

$wisdom
[1] 3

$job
[1] "a"

> people=data.frame(name, power, wisdom, job)
> people
  name power wisdom job
1 chan     1      3   a
2 song     2      2   b
3  jam     3      3   c

-data.frame함수를 쓰면 fram이 형성된다
-행은 인물들, 열은 인물들의 특징과 직업을 표시하는 구조
 

> people[2:3,1:2]
  name power
2 song     2
3  jam     3

-영역별 호출 가능
 
*메트릭스

> a=matrix(c(1,2,3,4),nrow = 2, ncol = 2)
> a
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> mat= matrix(0,10,2)
> mat
      [,1] [,2]
 [1,]    0    0
 [2,]    0    0
 [3,]    0    0
 [4,]    0    0
 [5,]    0    0
 [6,]    0    0
 [7,]    0    0
 [8,]    0    0
 [9,]    0    0
[10,]    0    0

matrix()
메트릭스 생성
 
메트릭스와 데이터프레임의 차이점
-데이터프레임은 열마다 다른 유형의 데이터를 가질 수 있다.
-메트릭스는 각 열은 같은 데이터 타입을 가지고 있다.
->데이터프레임은 데이터를 정리하고 조작하는데 유용(데이터 분석, 시각화, 전처리)
->메트릭스는 통계분석(숫자형 데이터에 적합)에 유용/수학적 연산을 빠르게(특히 선형대수학)
 
*색인(index)

> sel=seq(10)>5
> df=c("a","b","c","d","e","f","g","h","i","j")
> df[sel]
[1] "f" "g" "h" "i" "j"
> mat = matrix(df,5,2)
> mat
     [,1] [,2]
[1,] "a"  "f" 
[2,] "b"  "g" 
[3,] "c"  "h" 
[4,] "d"  "i" 
[5,] "e"  "j" 
> mat[5,1]
[1] "e"

 
*데이터 유형 확인 및 변환

> class(mat)
[1] "matrix" "array" 
> typeof(mat)
[1] "character"
> as.matrix(mat)
     [,1] [,2]
[1,] "a"  "f" 
[2,] "b"  "g" 
[3,] "c"  "h" 
[4,] "d"  "i" 
[5,] "e"  "j" 
> as.data.frame(mat)
  V1 V2
1  a  f
2  b  g
3  c  h
4  d  i
5  e  j
> a=1.2345
> as.integer(a)
[1] 1
> as.numeric(a)
[1] 1.2345

-class/typeof는 유형 확인
-as.matrix()/as.data.frame()/as.integer()/as.numeric()을 활용하면 변환
 
*데이터 읽기/확인/저장
 
사정상 파일이 없어 코드로만 올린다.

 df=read.csv("c://data/bearing.csv")

-데이터 가져오기=읽기
 

> head(mat,3)
     [,1] [,2]
[1,] "a"  "f" 
[2,] "b"  "g" 
[3,] "c"  "h"

-원하는 row확인 가능
 

> names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species" 

-활용 변수의 종류 확인 가능
 

> str(iris)
'data.frame':	150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
> summary(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500 

-str을 활용하면 데이터의 전체 구조를 볼 수 있음
-summary를 활용하면 전체적인 통계량 가늠 가능

> summary(iris)[1,2]
[1] "Min.   :2.000  "

-필요한 정보도 추출 가능

> fix(df)
> Views(df)

-데이터 전체를 볼 수도 있다

> dim(iris)
[1] 150   5

-데이터의 크기 확인 가능
 

> write.csv(iris, "c:/data/iris.csv")

-저장

'Language > R' 카테고리의 다른 글

선형회귀  (1) 2024.04.22
선형대수  (0) 2024.04.21
미적분  (1) 2024.04.21
함수와 프로그래밍  (1) 2024.04.21

*지능이란

-어려움을 푸는 능력
-합리적
-너무 완벽하지 않다 

지능은
배우고+결정+적응 -> 인간의 합리적 사고
=모델링+의사결정(극대 최소)+업데이드(활용하기) -> AI 

모델링이란
-공통 특성을 뽑아 단순화/일반화와 상세화 그 사이 어딘가를 결정 시키는 것
- 최고의 모델은 최소한의 결정 오류를 줄이고 최소한의 상세화를 시키는 것 

모델링-단순화와 상세화 그 사이 적절한 어딘가를 결정
최적화-최소한의 결정오류와 최소한의 노력으로 일반화 시킨다
업데이트-최소한의 결정오류

*머신러닝의 기본개념

빅데이터를 데베에 넣어 전처리 후 테이블을 만들어 모델링을 한다
데이터 테이블- n*p개 데이터 

머신러닝의 과정: 빅데이터(자연)->데이터베이스->(etl)->데이터 마트->(전처리)->데이터 데이블->모델링 

모델의 종류 

*지도학습(종속 필요)
-분류(범주형):숫자로 표시x/예:성별 숫자
-예측/회귀(연속형): 데이터 자체를 숫자/예: 나이, 연봉.. 

모델을 만들때 데이터셋을 70퍼만 사용하고 30퍼는 만들고 나서 사용한다 

분류: 사전에 소속 그룹을 알고 있는 관측지들을 이용하여, 미래에 그룹이 알려지지 않은 관측지가 어떤 그룹에 분류될 것이가를 예측 

예측: 사전에 종속변수를 알고 있는 관측지들을 이용하여, 독립변수와의 관계를 파악하여 함수를 만들어 미래에 독립이 왔을때 종속을 예측함 

*비지도 학습(종속 필요없음)
-군집분석(clustering)
-연관성탐색(시장바구니분석) 

군집분석: clustering-가까운 거 끼리 묶는다(intra는 최소로 inter는 최대로)/데이터 패턴을 이해하는 도구/요약 가능/y가 없다
연관성분석:대량의 데이터에서 변수들간의 연관 규칙을 찾아내는 데이터마이닝 기법
confidence-높은면 ~한 증세에 주로 사용-anywhere
lift-special한가?


*모델링의 기초

모델이 필요한 이유: 변화를 표현하기 위해

데이터를 분석: 특정 대상으로부터 정보를 추출하고 분석하여 해당 대상이 어떤 구조로 이루어져 있는지, 어떤 규칙으로 움직이는지 객관적으로 이해하고 제어할 수있게 하는 일 

데이터 분석의 대상은 주로 시스템의 형태로 구성=하나의 개체라기보다는 일련의 프로세스

데이터의 관측과 생성
자연의 시스템에서 데이터를 얻어내는과정=관측
추출된 데이터로 시스템을 재구성하는 과정= 생성
데이터를 통해 자연을 이해하기는 어렵다->데이터부족, 변수 부족, 현상이 복잡한 경우 

두가지 접근법
요소환원적 접근
데이터 의존적 접근(최근에 요소에서 이쪽으로 점점 확대 되고 있다) 

데이터 요약 그 이상 미래를 예측하는 분석 즉 수리모델이 필요하다
수리모델: 그 대상이 되는 데이터의 생성 규칙을 수학적 수단을 활용하여 시뮬레이션 하는 것
4칙연산/미적분/선형대수학(다차원)/통계 

모델링의 기본원리: 나누고 묶고 

수학을 활용하여 나머지 정보를 가능한 한 무의미(설명할 여지가 있는 규칙이 없게/오차+규칙을 낮추자)하게 만드는 절차

수리 모델을 구성하는 요소와 종류
변수(x,y)
수리적구조(4칙연산)
매개변수(a,b 파라미터)

미분(변화하는 비율을 계한하여)을 이용하여 미래의 모습을 예측할 수 있음
경계조건(제약조건)
보통 경계조건을 완벽히 파악하기 어렵기 때문에 컴퓨터를 활용, 수치해석을 수행->r사용 

이해 지향형 모델링: 데이터가 생성되는 구조를 이해하는 것을 목표
-대상이 되는 현상에 강하게 영향을 끼치는 요인을 찾거나 발생 원인을 밝히는 것을 목표(공학/사회과학적 응용을 위함) 

응용 지향형 모델링: 데이터를 기반을 미래의 데이터에 관해 예측하고 제어하거나 새로운 데이터를 이용하는 것을 목표(ML적 관점)
-이미지 판별, AI번역, 자율주행(주로 컴공/패턴인식 분야의 응용을 위함)

수리모델의 한계와 적용 범위
만능이 아닌 근사한 것(격차와 불확실성 존재)
최적화=격차를 줄이는 문제
불확실성은 주로 통계라는 방법을 통해 이해하려고 함
모델링은 결국 해당 모델을 활용하여 어떤 일을 수행하는가가 가장 중요한 무제! 
 
 

*기초 수리 모델: 방정식 기반 모델 
선형모델
-변수 사이의 관계를 등식로 표현
-수리적으로 다루기 쉽다
-매개변수 값을 조정해서 모델의 예측하는 값과 실제값이 가까워지도록(무의미해지게) 해야함
-최적화 문제
-매개변수를 조정하는 것도 최적화
-formulation : 식을 정립하는 과정
-solver : 식을 풀어 최대값과 최댓값을 달성하는 x를 구하는 방법


*기초 수리 모델 : 미분방정식 모델
-특정 대상이 시간에 따라 변화하는 모습을 모델링할 때
-시간에 따라 n이 어떻게 변할것인가?(예측)
-미분방정식의 해는 하나의 값이 아니라 또 다른 식
-미분방정식 어디에 쓸까?->미래를 예측하는데(제어)

'Major > Data Analysis' 카테고리의 다른 글

Decision Tree(의사결정나무)  (0) 2024.06.17
KNN  (0) 2024.06.17
Modeling & Validation & Visualization  (1) 2024.06.17
데이터기반의 수요예측 모델링과 의사결정 최적화  (2) 2024.06.17
R을 활용한 데이터 분석  (0) 2024.05.13

 4주차
기술과제
-API 토큰이 필요한 이유
코딩과제
-openai API 계정 생성
-파이썬에서 Openai 모듈 설치
-질문하고 답변 받아온거 print해서 테스트 해보기
-크롤링 한 데이터값을 GPT한테 주고 받은 답변을 Mysql에 저장하기


기술과제
*API 토큰이 필요한 이유
-API 토큰은 API를 사용할 때 인증 및 권한 부여를 위해 사용된다.

-이 토큰은 API를 호출할 때 서버가 클라이언트를 식별하고, 클라이언트가 특정 작업을 수행할 수 있는 권한이 있는지 확인하는 데 사용된다.

-따라서 API 토큰이 없으면 API를 사용할 수 없다.

-또한 API 토큰을 통해 API 사용량을 추적하고 제한할 수도 있다.

-이는 보안과 사용자 경험을 보장하기 위한 조치이다.

코딩과제
*openai API 계정 생성
*파이썬에서 Openai 모듈 설치

결제 안하면 작동 안된다

*질문하고 답변 받아온거 print해서 테스트 해보기

from openai import OpenAI
import re

client = OpenAI(api_key=".....")

# 사용자로부터 질문 입력 받기
user_input = input("질문을 입력하세요: ")

# 질문에 대한 대화 완성 생성
completion = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": user_input}
    ]
)

# 답변 내용 가져오기
answer = completion.choices[0].message.content

# 문장으로 분리
sentences = re.split(r'(?<=[.!?]) +', answer)

# 4~5문장까지 선택하여 출력
print("답변:")
for sentence in sentences[:5]:
    print(sentence)

 

 

 


*크롤링 한 데이터값을 GPT한테 주고 받은 답변을 Mysql에 저장하기

import pymysql
from bs4 import BeautifulSoup
import requests
from openai import OpenAI

# OpenAI API 키 설정
client = OpenAI(api_key="....")

# MySQL 데이터베이스 연결 설정
db_connection = pymysql.connect(host="localhost", user="root", password="....", db="rs", charset="utf8")

# MySQL 커서 생성
cursor = db_connection.cursor()

# 데이터 크롤링
data = requests.get('https://sports.news.naver.com/wfootball/index')
soup = BeautifulSoup(data.text, 'html.parser')
soccer_rank = soup.select('#_team_rank_epl > table > tbody > tr')

# 데이터를 담을 리스트 초기화
team_data = []

for tr in soccer_rank:
    team_name = tr.select_one("td > div > div.info > span")
    if team_name:
        team_name = team_name.text.strip()
        # GPT 모델에 전달하여 팀 설명 얻기
        completion = client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "user", "content": team_name}
            ]
        )
        team_description = completion.choices[0].message.content.strip()
        team_data.append((team_name, team_description))

try:
    # 축구팀 이름과 설명을 MySQL에 저장
    query = "INSERT INTO my_schema.football_content2 (name, content) VALUES (%s, %s)"
    cursor.executemany(query, team_data)

    # 변경사항 저장
    db_connection.commit()

    print("데이터가 성공적으로 저장되었습니다.")

except Exception as e:
    print("데이터 저장 중 오류가 발생하였습니다:", e)

finally:
    # 연결 종료
    cursor.close()
    db_connection.close()
 

웹사이트 구성하는 방법

*mpa

-페이지가 여러개
-스마트폰 나오기 전에 많이 사용
-화면이 깜빡인 후에 로딩이 된다

/list
/detail
/write
/edit
위와 관련된 html을 서버가 준비 해뒀다가 클라이언트가 요청시 보내주는 게 mpa
->서버는 html페이지만 준비하고만 있으면 된다

mpa에 사용되는 언어: node js, pyhon, java, php, asp

*node.js가 무엇인가?

-웹서버 백엔드 구현을 하기 위해서 사용
-자바스크립트 영역이 서버쪽으로 확대되어 클라이언트와 서버 양쪽의 프로그램을 모두 개발이 가능해졌다.

백앤드 언어를 사용하는 이유:
-언어와 데이터베이스를 연동을 시켜논다
-서버에서 필요한 데이터를 데이터베이스에서 가져와 html형식에 맞게 바꿔준다

 

*spa

-페이지가 하나
-페이지를 이동하지 않고 안에있는 컨텐츠만 바뀌어 깜빡임이 없다
-클라이언트가 서버에게 페이지 요청을 하면 빈 html파일을 준다+js소스파일을 준다(버튼을 누르면 js파일에 있는 소스 파일이 실행이되어 컨테츠만 바꿔준다)




*api

-약속
-버튼을 누르면(행동) 어떠한 동작이 되게하는 약속(ex자판기, 컴퓨터 자판...)
-키보드 A누르면 A가 나오는 동작도 api
-어떤 행위를 원할 때 이 버튼을 누르면 서버가 내가 원하는 동작을 해주는 약속
-spa에선 거의 API를 사용한다


-spa는 백앤드와 프로트앤드 서버가 따로 있다
-유지보수 측면에서 편하다
-백앤드는 API만 존재한다
-프론트엔드 서버한테 html과 js코드를 받아온다 그래서 데이터를 백엔드에 요청함
-장점:서버는 API만 제공하고 서버는 다양한 어플리케이션으로 사용할 수 있다.(HTTP만 가능하면)




*코드정리


app.js

const express = require('express');
const mysql = require('mysql');
const app = express();
const port = 4000;

const cors = require('cors');
app.use(cors());


const conn = {
  host : 'localhost',  
  port : '3306',
  user : 'root',
  password : '----',
  database : 'my_schema'
};

let connection = mysql.createConnection(conn);
connection.connect(); // db접속


app.engine('html', require('ejs').renderFile);
app.set('view engine', 'ejs');


app.get('/', (req, res) => {
  res.render('index.html');
});

app.get('/list', (req, res) => {
  connection.query('SELECT * from board', function(error, results, fields) {
    if (error) throw error;
    console.log(results);
    res.render('list',{'data':results})
  });
 });

 app.get('/api/list', (req, res) => {
  connection.query('SELECT * from board', function(error, results, fields) {
    if (error) throw error;
    console.log(results);
    res.send(results)
  });
 });

app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

 
index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=\, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    블로그에 오신 걸 환영<br>
    <a href="/list">게시글 보기</a>
</body>
</html>

 
list.ejs

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <table>
        <tr>
            <td>id</td>
            <td>writer</td>
            <td>title</td>
        </tr>
        <% for (let i=0; i<data.length; i++) { %>
        <tr>
            <td><%=data[i]['id']%></td>
            <td><%=data[i]['writer']%></td>
            <td><%=data[i]['title']%></td>
        </tr>
        <% } %>
    </table>
</body>
</html>

 
index.html-frontend

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
       
    </div>
</body>
</html>

<script src="index.js"></script>

 
index.js-frontend

document.getElementById("app").innerHTML = '<a onclick="ShowList()">리스트로 이동</a>';

const ShowList = () => {
//api요청
fetch('http://localhost:4000/api/list')
  .then((response) => response.json())
  .then((data) => {
    console.log(data);
    document.getElementById("app").innerHTML = `
            <table>
                <tr>
                    <td>
                        id
                    </td>
                    <td>
                        writer
                    </td>
                    <td>
                        title
                    </td>
                </tr>
                <tr>
                    <td>
                        ${data[0]['id']}
                    </td>
                    <td>
                        ${data[0]['writer']}
                    </td>
                    <td>
                        ${data[0]['title']}
                    </td>
                </tr>
                <tr>
                    <td>
                        ${data[1]['id']}
                    </td>
                    <td>
                        ${data[1]['writer']}
                    </td>
                    <td>
                        ${data[1]['title']}
                    </td>
                </tr>
            </table>
            `;
  })
  .catch((error) => console.log("error:", error))

   
}


//</head> spa 쉽게 구형 ->react, vue....

*mysql 이 무엇인지? DB, 테이블, 컬럼


mysql을 알아보기 전 미리 알아야 하는 게 있다.

*데이터베이스(DB):특정 기업이나 조직 또는 개인이 필요에 의해 논리적으로 연관된 데이터를 모아 일정한 형태로 저장해 놓은 것
-->쉽게 말해 데이터(회원정보, 게시판 글 ,사진)들이 모여있는 곳을 데이터베이스(데베)라 부른다

*DBMS(data base management service):데이터베이스 관리 프로그램

특징
-통합된 데이터(공용)
-저장된 데이터
-운영 데이터(업무 목적으로)
-공용데이터(한 사람 한 업무를 위해 사용x)

엑셀과 다른 점
-엑셀은 같이 수정이 안됨=동시에 작업이 안된다
-엑셀은 사이즈의 한계가 있다.

DBMS의 장점
-중복 최소화
-공용
-일관성
-무결성
-보안
-표준화
-전체 데이터 요구 조정

종류
*관계형 데이터베이스-(ex:myspl)
데이터 항목 간에 사전 정의된 관계가 있을 때 데이터 항목들의 모음을 가리킨다. 이 항목들은 열과 행으로 이루어진 "테이블 집합"으로 구성됨. 

*즉 mysql이란?

mysql은 데이터를 저장하고 관리하는데 널리 사용되는 오픈 소스 관계형 데이터베이스 관리시스템이다.

*비관계형 데이터베이스-(ex.mongo db)
유연한 스키마를 갖추고 있는데 데이터 볼륨, 짧은 지연 시간과 "유연한 데이터 모델":이 필요한 애플리케이션에 최적화 되어 있다.

관계형 데이터베이스의 특징
-2차원 테이블로 표현(가로x세로=테이블)
-데이터 무결성
-SQL사용
-한번에 레코드 처리가 아닌 집합을 처리함
 

사진 출처:https://velog.velcdn.com/images/gyrud02/post/e138ba01-198c-4390-848a-419a94e23537/Table.png



*테이블

-실질적으로 자료가 저장되는 곳
-행과 컬럼으로 구성
-특정한 목적과 성격에 의해 생성되는 집합체(ex.고객테이블, 주문테이블)
-사용자의 접근이 가능한 모든 데이터 보유

*행=레코드=튜플

일련의 관련 자료를 나타낸다

*컬럼=항목

해당하는 데이터들의 속성=구조를 나타낸다


*필드
정보의 한 조각으로, 처리의 최소 단위가 되는 것

기본키/외부키(private key/foreign key)
-기본키:유일하게 번호값 구분할 수 있게 주는 값
-외부키:테이블의 연결을 시켜주는 키(참조하는 테이블의 기본키)

*SQL:데이터베이스와 대화하기 위해 디자인된 언어
-관계형 데이터베이스에서 데이터 조작과 데이터 정의를 하기 위해 사용하는 언어
-입력 조회 수정 삭제 하기 위해서  SQL사용
-데이터베이스 쿼리는 데이터베이스에서 데이터를 추출하여 읽을 수있는 형식으로 형식을 지정함.
-쿼리는 데이터베이스에 필요한 언어, 즉 일반적으로 해당 언어 SQL.

특징
-쉽다
-절차적인게 아닌 선억적 언어
-DBMS 종류 얽매이지 않고 사용 가능

작업종류
-데이터 조회
-테이블 행 삽입 갱신 및 삭제
-객체 생성, 변경 및 삭제
-엑세스 제어
-무결성 보장

*select, insert, delete, update 쿼리문에 대해서 이해해보기

-select-데이터 조회
select 컬럼명 from 테이블명

-insert-새 행 입력(ex.새로운 고객 정보를 집어 넣을 때)
insert into 테이블명(칼럼명1,칼럼명2) values(값1,값2)

-delete-행 제거(ex.데이터 지울 때)
delete from 테이블명

-update-기존 행 변경(ex.기존 사원의 주소가 바뀌었을 때)
update 테이블명 set칼럼명=변경할 값

*where 조건문이 무엇인지

-where 조건
oerder by 컬럼명 asc or desc

-selct column1 from table where 조건문 order by column2 asc or desc;
-column1 대신 *을 넣으면 컬럼 전체
--------------------------------------------------------------------------------------------------------------------------------------------

*테이블 생성 - 랭크를 저장하기 위해 테이블 생성 ( rank 테이블)
https://pinetreeday.tistory.com/145

 

DB MySQL WorkBench Tool을 이용한 Table 생성하는 방법

DB MySQL WorkBench Tool을 이용한 간단한 SQL문 작성 -> Mysql WorkBench를 실행 후 왼쪽 상단의 SCHEMA 항목에서 마우스 오른쪽 클릭 후 Create Schema... 을 선택합니다. -> Schma를 생성하게 되면 Name을 설정할 수

pinetreeday.tistory.com

위의 블로그 참고하여 테이블 생성(결과물은 제일 밑에 있다)
 

*파이썬에서 mysql 모듈을 설치하고 연결진행& 파이썬에서 가지고 온 데이터 내용을 테이블에 insert를 해본다.

pymysql 모듈을 설치해주고 가져온다

import pymysql

 
mysql과 연결 시켜주고(연결에 필요한 데이터를 넣어준)
conn은 데이터베이스에 연결할 때 사용되는 객체

# MySQL 연결 설정
conn = pymysql.connect(host="localhost", user="root", password="-----", db="rs", charset="utf8")

 
커서 객체를 생성해준다
cursor: 데이터베이스에서 데이터를 쿼리하고 조작하게 도와주는 것

cursor = conn.cursor()

 
전글에서 크롤링한 데이터를 가져와 data리스트에 넣어준다.

data = requests.get('https://sports.news.naver.com/wfootball/index')
soup = BeautifulSoup(data.text, 'html.parser')

soccer_rank = soup.select('#_team_rank_epl > table > tbody > tr')

# 데이터를 담을 리스트 초기화
data = []

for tr in soccer_rank:
    span = tr.select_one("td > div > div.info > span")

    if span:
        print(span.text)
        data.append(span.text)

    else:
        print("Span not found")

 
앞에서 배운 insert쿼리문으로 데이터베이스에 data의 자료들을 넣어준다.

# 데이터 삽입 쿼리
insert_query ="""
INSERT INTO  rs.rs
(name) 
VALUES 
(%s)"""

# 데이터 삽입
cursor.executemany(insert_query, data)
conn.commit()

 
마무리로 커서와 conn을 종료시켜준다

# 연결 종료
cursor.close()
conn.close()

 
전체

import requests
import pymysql
from bs4 import BeautifulSoup

# MySQL 연결 설정
conn = pymysql.connect(host="localhost", user="root", password="----", db="rs", charset="utf8")

#MySQL 데이터베이스 연결 객체 conn을 사용하여 커서 객체를 생성하는 코드입니다.
#커서는 SQL 쿼리를 실행하고 결과를 가져오는 데 사용되는 객체입니다. 커서를 사용하여 데이터베이스에서 데이터를 쿼리하고 조작할 수 있습니다.

cursor = conn.cursor()
data = requests.get('https://sports.news.naver.com/wfootball/index')
soup = BeautifulSoup(data.text, 'html.parser')

soccer_rank = soup.select('#_team_rank_epl > table > tbody > tr')

# 데이터를 담을 리스트 초기화
data = []

for tr in soccer_rank:
    span = tr.select_one("td > div > div.info > span")

    if span:
        print(span.text)
        data.append(span.text)

    else:
        print("Span not found")

        # _team_rank_epl > table > tbody > tr:nth-child(2) > td:nth-child(2) > div > div.info > span

# 데이터 삽입 쿼리
insert_query ="""
INSERT INTO  rs.rs
(name) 
VALUES 
(%s)"""

# 데이터 삽입
cursor.executemany(insert_query, data)
conn.commit()

# 연결 종료
cursor.close()
conn.close()

 

 
결과





3주차 과제

기술과제
호스팅이 무엇인지 ?
AWS 회원가입, EC2서비스 프리티어(1년공짜) 인스턴스 생성해보기 (OS아무거나, Ubuntu 추천)
SSH가 무엇인지 ?
SSH가지고 생성한 EC2서비스 연결까지 해보기

코드과제
BeautifulSoup4 모듈 (HTML DOM접근을 도와주는 모듈)
requests모듈을 이용을해서 html을 가져온다음
BS모듈에가 html을 준다
내가 원하는 부분을 선택해서 원하는데이터 불러와서 print했을때 잘 찍혀나오게끔 해보기
->>https://eatitstory.tistory.com/m/7 다른 글에 작성

기술과제

*호스팅이 무엇인지?


호스팅이란?
-데이터를 모아두고 있는 서버의 전체 혹은 일부를 이용할 수 있도록 임대해 주는 서비스
-서버를 관리하기위해서는 24시간 내내 안정적으로 전기를 공급,빠르고 안정적인 인터넷 회선을 사용,안전한 보안 시스템이 필요
->개인이 서버를 관리하기보다 전문 업체의 호스팅 서비스를 사용하는 것이 일반적

{웹사이트:집
도메인:집 주소
ip:위도 경도 좌표
서버: 집이 위치한 동네
호스팅: 집 임대 서비스}

호스팅 종류

웹호스팅
-여러 고객이 하나의 서버를 함께 사용하는 형태
-하나의 서버를 나누어 쓰기 때문에 저렴하게 이용
-호스팅 업체의 통합 관리를 받기 편함
-사용할 수 있는 하드웨어가 제한적

서버 호스팅
-단독 서버를 사용하는 형태
-넓은 하드웨어 공간을 사용할 수 있음
-서버 운영/관리에 대한 직접적인 권한을 가질 수 있음
-빠른 데이터 전송 속도
-혼자 사용하니 높은 비용
-대기업이나 대형 포탈  같이 많은 데이터를 사용하는 기업들이 사용하기 좋음

클라우드 서버
-서버 호스팅을 가상화한 것으로, 가상 서버를 단독으로 사용할 수 있는 형태
-고객이 필요할 때마다 서버 자원을 늘리거나 축소하여 유연하게 서버 이용 가능
-서버 자원을 사용하고 나서 사용한 만큼 비용 지불
-하나의 가상 서버에 문제가 생기면 연결된 다른 가상 서버에도 문제가 생길 수 있다

*가상서버:물리서버(컴퓨터 자체)와 다른 컴퓨터 내부의 소프트웨어 서버이며 하나의 물리서버를 나누어 여러개 가상 서버로 사용한다

*AWS 회원가입, EC2서비스 프리티어(1년공짜) 인스턴스 생성해보기 (OS아무거나, Ubuntu 추천)

아래 블로그 글을 참고함
https://m.blog.naver.com/PostView.naver?blogId=jword_&logNo=222976128011&proxyReferer=

[AI스쿨] AWS EC2란? 우분투로 시작하기!

#AI스쿨 #AWSEC2 #AWSEC2우분투 AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성...

blog.naver.com

 



EC2란
-EC2서비스는 AWS에서 비용, 성능, 용량면에서 탄력적인 클라우드 컴퓨터를 제공하는 서비스라고 할 수 있다(가상머신-하드웨어인 컴퓨터의 기능을 소프트웨어로 동작할 수 있도록 구현)

 
인스턴스란
-클라우드 제공업체는 데이터 센터에서 하드웨어를 유지 관리하고 인스턴스라는 형태로 컴퓨팅 리소스에 대한 가상 액세스를 제공합니다->쉽게 말하면 클라우드에서 실행 되는 가상 서버

*ssh란 무엇인가?

ssh
-원격지에 있는 컴퓨터(ssh 서버=호스트)를 안전하게 제어하기 위한 프로토콜.
-ssh 클라이언트와 ssh 서버가 서로 상호작용한다.
-서버와 클라이언트간 암호화 방법을 통해서 연결되어 있기 때문에 보안이좋다.

ssh클라이언트
-윈도우 운영체제에는 ssh클라이언트가 설치되어 있지 않기에 putty라는 클라이언트를 설치해준다

ssh서버
-aws ec2 인스턴스 원격서버(가상서버)

보안!
-ssh는 보안적으로 안전한 채널을 아래 두개의 키를 사용하여 구성한 뒤 정보를 교환한다
-(private key / public key)

public key
-공개되어도 안전한 키다.
-메세지를 전송하기 전 암호화를 하게 된다
-암호화는 가능하지만 복호화(암호화의 반댓말) 는 불가능

private key
-외부 노출 하면 안되므로 본인 컴퓨터 내부에 저장하게 되어 있다
-복호화 가능

ssh의 인증과정
-다른 컴퓨터와 통신하기 위해서는 public key를 통신하고자 하는 컴퓨터에 복사하여 저장
-클라이언트 컴퓨터에서 접속 요청을할 때 응답을 하는 서버 컴퓨터에 복사되어 저장된 public key와 클라이언트 public key가 쌍을 이루는 private key와 비교를 하여 한쌍의 key인지 검사를 한다
-관계를 맺고 있는 key라는 것이 증명이 되면 컴퓨터 사이에 암호화된 채널이 형성이 되어 key를 활용해 메세지를 암호하하고 복호화하여 데이터를 주고 받을 수 있다.


*SSH가지고 생성한 EC2서비스 연결까지 해보기

아래 블로그 보고 참고함

https://velog.io/@heejung/AWS-EC2%EC%97%90-PuTTY%EB%A1%9C-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0

AWS EC2에 PuTTY로 접속하기

spring 기반의 새로운 프로젝트를 위해 aws ec2 인스턴스를 생성하였습니다. 윈도우 환경을 사용하고 있기 때문에 PuTTY를 사용하여 ec2 인스턴스에 접속하겠습니다. 기본값으로 두고 "Install"후 "Finish"

velog.io

 

 

'CS > Basic keyword' 카테고리의 다른 글

IT 기초 중요 키워드  (0) 2024.03.10

3주차 과제

-기술과제
호스팅이 무엇인지 ?
AWS 회원가입, EC2서비스 프리티어(1년공짜) 인스턴스 생성해보기 (OS아무거나, Ubuntu 추천)
SSH가 무엇인지 ?
SSH가지고 생성한 EC2서비스 연결까지 해보기
-->https://eatitstory.tistory.com/m/8 다른 글에 작성

-코드과제
BeautifulSoup4 모듈 (HTML DOM접근을 도와주는 모듈) 
requests모듈을 이용을해서 html을 가져온다음
BS모듈에가 html을 준다
내가 원하는 부분을 선택해서 원하는데이터 불러와서 print했을때 잘 찍혀나오게끔 해보기
 

*코드과제

(1)

import requests
from bs4 import BeautifulSoup

 
저번에 배운 requests 모듈과 같은 방식으로 패키지에서 다운 받아 이번에 사용하게 될 beautifulSoup모듈을 설치해준다.
설치 후 아래와 같이 모듈을 가져온다.
 
 

(2)

해외축구 : 네이버 스포츠 (naver.com)

해외축구 : 네이버 스포츠

스포츠의 시작과 끝!

sports.news.naver.com

 
네이버 해외축구 사이트의 html을 가져온 후 data변수에 집어 넣어준다.
BeautifulSoup함수(BeautifulSoup(html 문자열, parsing 방법))를 활용하여 data를 파싱해준다.
(파싱이란 파이썬이 html을 알아듣기 편하게 바꿔주는 방식)
 

data = requests.get('https://sports.news.naver.com/wfootball/index')
soup = BeautifulSoup(data.text, 'html.parser')

 

(3)

사이트 들어가서 f12 눌러서 개발자도구에서 빨간 동그라미 눌러 아스날에 커서 갔다대면 소스가 보인다.
copy sector로 소스를 복사한다.
 

 
tbody 아래에 tr들이 순위표에 있는 팀들의 소스가 있다.
 

(4)

soccer_rank = soup.select('#_team_rank_epl > table > tbody > tr')

 
우선 soccer_rank에 soup.select()란 함수를 사용하여 requests로 가져온 html 중 해외축구 순위표에 있는 데이터들이 담겨있는  tr class를 찾아온다.
 

(5)

for tr in soccer_rank:
    span = tr.select_one("td > div > div.info > span")

    if span:
        print(span.text)
    else:
        print("Span not found")

tr.select_one(select와 다르게 하나의 class를 찾는다)을 이용하여 다양한 데이터가 담겨있는 tr에서 순위표에 있는 팀들의 이름이 있는 span class 가져와 출력한다.
 

(6)

import requests
from bs4 import BeautifulSoup

data = requests.get('https://sports.news.naver.com/wfootball/index')
soup = BeautifulSoup(data.text, 'html.parser')

soccer_rank = soup.select('#_team_rank_epl > table > tbody > tr')

for tr in soccer_rank:
    span = tr.select_one("td > div > div.info > span")

    if span:
        print(span.text)
    else:
        print("Span not found")

        # _team_rank_epl > table > tbody > tr:nth-child(2) > td:nth-child(2) > div > div.info > span  ->>2위 리버풀 주소
        #각 팀별로 나눠지는 tr들까지만 select하고/ 각 tr에서 이름이 담겨있는 span class를 가져와 출력하기
출력화면

 

+ Recent posts