160917: 완료

학원은 끝이 났고!

이제 이건 저장용으로 사용하며 프로젝트의 일환이 될 것입니다!



추신.

아! 럭키 블루 스미스 예쁘다!

'Programming' 카테고리의 다른 글

160826: 111회차  (0) 2016.08.26
160825: 110회차  (0) 2016.08.25
160824: 109회차  (0) 2016.08.24
160823: 108회차  (0) 2016.08.23
160822: 107회차  (0) 2016.08.22
Posted by DAVID

160826: 111회차

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


프로젝트 ppt - 기능을 휘황찬란하게 써야지! :-)




5. 수업

진도: 

hw: 


6. 할것


2. 몽고디비 

4.서브라임텍스트

'Programming' 카테고리의 다른 글

160917: 완료  (1) 2016.09.17
160825: 110회차  (0) 2016.08.25
160824: 109회차  (0) 2016.08.24
160823: 108회차  (0) 2016.08.23
160822: 107회차  (0) 2016.08.22
Posted by DAVID

160825: 110회차

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것

[03] R 스크립트, R 함수

1. R 스크립트 및 Packages 설치
 
(1) R 스크립트
 
- 파일 -> 새로운 스크립트 -> 편집창에 아래 입력
 
x <- rnorm(1000)   : 1000개의 난수를 만들어 객체 x에 저장
mean(x)            : 평균 구한다
sd(x)              : 표준편차 구한다
hist(x)            : 히스토그램를 그려본다.
 
입력후 저장버튼을 눌러 저장한다 (example.R)
 
- 파일 -> 스크립트 불러오기 -> 편집창에서 Ctrl + R 로 한줄 실행하거나 전체를 선택후 Ctrl + R로 한꺼번에 실행한다.
 
 
 
(2) Packages 설치
 
- 패키지들 -> 패키지 설치 -> Korea 선택 -> lubridate 선택 -> OK
 
- 패키지들 -> 패키지 불러오기 -> lubridate 선택(시간 관련 패키지)
 
- 마크다운,니키 패키지가 설치됩니다. (필요한 기능은 Package를 설치하여 사용)



2. R 함수 

 
(1) apply(x,m,fun,...) :행렬이나 배열의 차원 별로 지정한 함수를 적용
  - x:대상자료(행렬,배열)
  - m:차원  1(행),2(열),3(면), c(1,2)
  - fun: 적용할 함수명





 
(2) lapply(x,fun,..) :list apply, 리스트에 지정한 함수를 적용
  - x : 대상 리스트 객체
  - fun:적용할 함수명
  - ..:함수에서 사용할 인수
 
 
(3) sapply(x,fun,...,simplify=TRUE,
    USE.NAMES=TRUE) : simplification apply
 
  - x : 대상 리스트 객체
  - fun:적용할 함수명
  - ..:함수에서 사용할 인수
  - simplify = T :연산결과를 벡터, 행렬 등 간단히 반환
  - simplify = F :연산결과를 리스트로 반환
  - USE.NAMES=T : 이름 속성도 반환
  - USE.NAMES=F : 이름 속성없이 반환
 



 
 (4) vapply(x.fun,fun.value,...,
     USE.NAMES=TRUE) : values simplification apply
 
  - x : 대상 리스트 객체
  - fun:적용할 함수명
  - fun.value:반환하는 데이터 유형 지정
  - ...:함수에서 사용할 인수
 







(5) replicate(n,expr,simplify="array")
    : expr을 n번 반복하여 행렬이나 리스트로 반환
 
   - n:반복횟수
   - expr:표현식
   - simplify=F: 리스트로 반환



 
 
 (6) sweep(x,m,s,fun="-",check.margin=TRUE,...)
    : 행렬, 배열, 데이터프레임에 함수와 통계량을 적용하는 함수
 
   - x: 대상객체(배열)
   - m: 배열의 차원
   - s: 적용할 통계량
   - fun: 적용할 함수(="-":뺄셈연산,default)
   - check.margin:인수 길이가 같은지 확인
 



 
 (7)aggregate(x,b,fun)
    : 데이터 부분별로 함수를 적용해서 통계량을 구하는 함수
   - x: 대상 자료 객체
   - b: a list of grouping elements
   - fun: 적용할 함수명
 



 - iris[,1:4] : 행은 모두, 열은(1~4)까지
 - list(Species=iris[,5]) : iris 5열의 값을 Species name에 담아서 list로 반환
 - mean : 표준편차


3. 연습문제
 
ex) R에 저장되어 있는 state.x77의 데이터를 이용하여 다음 각각의 물음에 답하시오.
 
1) 3번째 행과 8번째 열위 원소를 추출하시오.
 
풀이)
> state.x77[3,8]
[1] 113417
 
2) 5, 22, 44행과 1, 4, 7열에 해당하는 값을 추출하시오.
풀이)
> state.x77[c(5,22,44), c(1,4,7)]
           Population  Life Exp  Frost
California      21198    71.71    20
Michigan        9111    70.63   125
Utah            1203    72.90   137
 
3) 5행부터 50행까지를 제외한 나머지 행과 3열부터 5열까지의 원소를 추출하시오.
풀이)
> state.x77[-(5:50), 3:5]
         Illiteracy  Life Exp  Murder
Alabama      2.1    69.05   15.1
Alaska        1.5    69.31   11.3
Arizona       1.8    70.55    7.8
Arkansas      1.9    70.66   10.1
 
4) stats.x77의 두 번째 열인 Income이 4000보다 큰 것만을 추출하시오.
풀이)
> inc <- state.x77[1:50]
> state.x77[inc>4000,2]
California               5114 
Florida                 4815 
Georgia                4091
Illinois                  5107 
Indiana                 4458
Maryland               5299
Massachusetts          4755
Michigan               4751
Missouri                4254
New Jersey             5237 
New York               4903 
North Carolina          3875  
Ohio                   4561
Pennsylvania           4449
Tennessee             3821
Texas                 4188
Virginia                4701
Wisconsin             4468
 
3. 1~8, 11~18, 111~118로 이루어진 2, 4, 3차원의 배열을 만드시오.
풀이)
> b <- c(1:8, 11:18, 111:118)
> dim(b) <- c(2,4,3)
> b
, , 1
 
      [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
 
, , 2
 
      [,1] [,2] [,3] [,4]
[1,]   11   13   15   17
[2,]   12   14   16   18
 
, , 3
 
      [,1] [,2] [,3] [,4]
[1,]  111  113  115  117
[2,]  112  114  116  118
 
4. R에 저장된 iris의 (38,1,3)번째 원소를 추출하시오.
풀이)
> iris[38,1,3]
[1] 4.9
 

[04] R 그래프 기초

[01]  R 그래프 기초
1. plot()함수
  - plot(y축데이터, 옵션)
  - plot(x축데이터,y축 데이터, 옵션)
 
> v<-c(5,4,6,3,2)
> plot(v)
 
> x<-1:10
> y<-10:1
> plot(x,y)
 
 
 -  xlim, ylim : 한계값지정
 > plot(x,y,xlim=c(1,20), ylim=c(20,1))
 
 - xlab, ylab : x축, y축 이름 지정, main을 이용해서 그래프제목 지정
> plot(x,y,xlim=c(1,20), ylim=c(20,1))
> plot(x,y,xlim=c(1,20), ylim=c(20,1),
+ xlab="X축 값",ylab="Y축값",
+ main="Plot Test")
 
 - 옵션
 
2. plot, axis, title, par, legend
 
 - plot() : 그래프 그리기
 - axis() : 축값 지정 하기
 - title() : 제목 달기
 
> plot.new()     # 새로운 그래프 창 열기
> v1<-c(100,120,130,140,150)
> plot(v1,type="o", col="red", ylim=c(0,200),axes=F, ann=F)
> axis(1,at=1:5, lab=c("MON","TUE","WED","THU","FRI"))
> axis(2,ylim=c(0,200))
> title(main="FRUT", col.main="red", font.main=4)
> title(xlab="DAY", col.lab="black")
> title(ylab="PRIC", col.lab="blue")
 
 
 - par(mfrow=c(nr,nc)) nr:행의 갯수, nc 열의 갯수
   :한 화면에 여러 개의 그래프 동시 배치
   nr:행의 갯수, nc 열의 갯수
 
> v1
[1] 100 120 130 140 150
> par(mfrow=c(1,3))
> plot(v1,type="o")
> plot(v1,type="s")
> plot(v1,type="l")
 
  - legend(x축 위치, y축 위치, 내용, cex=글자크기, col=색상,pch=크기, lty=선모양)
   :범례 추가
 
  - lines(), par(new=T) : 충첩허용
  
  > dev.new()
> a1 <- c(1,2,3,4,5)
> a2 <- c(5,4,3,2,1)
> a3 <- c(2,4,6,8,10)
 
> plot(a1,type="s", col="red", ylim=c(1,10))
> lines(a2,type="o", col="blue", ylim=c(1,5))
> lines(a3,type="l", col="green", ylim=c(1,15))
> legend(4,9,c("a1","a2","a3"),cex=0.9,col=c("red","blue","green"),lty=1)



3. 막대 그래프
 
  - barplot() 함수를 이용(세로막대)
  - horiz=T : 가로막대
  - beside=T : 그룹으로 묶어서 출력
 
> xm <- matrix(x,2,5)
> xm
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
>
>
>
 
  - 옵션
  
 
 
4. 파이 그래프
 
   - pie() 함수를 이용
 
   - 옵션 

  
 
> dev.new()
 
> p1<- c(10,20,30,40)
>
> pie(p1,radius=1)
>
> #시작각도를 90도로 지정
> pie(p1,radius=1,init.angle=90)
>
> #색상과 lable 지정
> pie(p1,radius=1,init.angle=90,col=rainbow(p1))
>
> pie(p1,radius=1,init.angle=90,col=rainbow(p1)
+ ,label=c("Week 1", "Week 2", "Week 3", "Week 4"))
 
   - 수치값및 범례 보여주기
   - round(대상, 반올림할 자리수)
   - paste(a,b) : a에 b를 붙여서 하나로 만드는 함수
 
> pct<-round(p1/sum(p1) * 100,1)
> lab<-paste(pct,"%")
> pie(p1,radius=1,init.angle=90,col=rainbow(p1),label=lab)
> legend(1,1,c("Week 1","Week 2","Week 3","Week 4"),cex=0.5,fill=rainbow(length(p1)))
 
  - pie3D()함수
    : 3D로 파이그래프 만들기
      plotrix패키지를 설치후 library를 로딩해야함.
 
      install.packages("plotrix")
      library(plotrix)
 
      [05]비정형 데이타 그래프 출력시 사용
 
 
 
 5. 나이팅 게일 그래프 
 
   - star()함수 사용 : 비교,분석시 사용
 
> dev.new()
> total <- read.table("학생별전체성적_new.txt",header=T,sep=",")
> total
    이름 국어 영어 수학 국사 화학 물리
1 박지영   90   85   55   88   91   79
2 김태함   70   65   80   75   76   89
3 김효섭   92   95   76   65   89   91
4 임경희   76   89   88   98  100   91
5 권혁진   97   87   83   91   86   91
6 하혜진   80   86   97   85   69   77
7 이준원   80   30   40   50   70   90
8 윤정웅   70   82   54   56   58   60
9 주시현   90   95  100   85   89   92
> row.names(total)<- total$이름
> total
         이름 국어 영어 수학 국사 화학 물리
박지영 박지영   90   85   55   88   91   79
김태함 김태함   70   65   80   75   76   89
김효섭 김효섭   92   95   76   65   89   91
임경희 임경희   76   89   88   98  100   91
권혁진 권혁진   97   87   83   91   86   91
하혜진 하혜진   80   86   97   85   69   77
이준원 이준원   80   30   40   50   70   90
윤정웅 윤정웅   70   82   54   56   58   60
주시현 주시현   90   95  100   85   89   92
> total <- total[2:7]
> total
       국어 영어 수학 국사 화학 물리
박지영   90   85   55   88   91   79
김태함   70   65   80   75   76   89
김효섭   92   95   76   65   89   91
임경희   76   89   88   98  100   91
권혁진   97   87   83   91   86   91
하혜진   80   86   97   85   69   77
이준원   80   30   40   50   70   90
윤정웅   70   82   54   56   58   60
주시현   90   95  100   85   89   92
>
> stars(total,flip.labels=F,draw.segment=F,frame.plot=T,full=T,main="학생별 과목별 성적분석")
> lab <- names(total)
> lab
[1] "국어" "영어" "수학" "국사" "화학" "물리"
> value <- table(lab)
> value
lab
국사 국어 물리 수학 영어 화학 
   1    1    1    1    1    1 
> pie(value,labels=lab,radius=0.1,cex=0.6,col=NA)
> draw.segment=T #색상 표현
> color <- c("black","red","green","blue","cyan","violet")
> pie(value,labels=lab,col=color,radius=0.1,cex=0.6)
 
  [05] R 그래프(비정형 데이터)
1. 비정형 데이터를 이용한 그래프

  - 거의 대부분의 DBMS 벤더 제품은 정형화 된 형태의 데이터를 저장하고 있습니다.
  - 비정형화된 데이터는 web을 통해서 크롤링(crawling-데이터를 모으는 작업) 하거나 설문등을 통해서 모아진 데이터등 일상적인 모든 환경에서 접할 수 있는 모든 데이터를  말합니다.

 - 블로그등 인터넷에서 크롤링한 데이터 (서울의 추천 명소)별로 그래프를 그리는 작업 


 >>>> 작업1) 작업디렉토리 확인하고 필요한 단어추출과 그래프를 위한 패키지 설치와 로딩

 > getwd()

 > install.packages("KoNLP")
 > install.packages("wordcloud")
 > install.packages("stringr")

 > Sys.setenv(Java_HOME='c:\\Program Files\\Java\\jre1.8.0_40')    # 'rJava'를 로딩할 수 없습니다. 오류시에 작성

  > library(KoNLP) #설치된 KoNLP 패키지를 호출
 
필요한 패키지를 로딩중입니다: rJava
필요한 패키지를 로딩중입니다: stringr
필요한 패키지를 로딩중입니다: hash
hash-2.2.6 provided by Decision Patterns
 
필요한 패키지를 로딩중입니다: tau
필요한 패키지를 로딩중입니다: Sejong
Successfully Loaded Sejong Package.
Building dictionary structures.
 
 
다음의 패키지를 부착합니다: ‘KoNLP’
 
The following object is masked from ‘package:tau’:
 
    is.ascii
 
 > library(wordcloud) #설치된 wordcloud 패키지를 호출
필요한 패키지를 로딩중입니다: RColorBrewer
 > library(stringr)   #설치된 stringr패키지를 호출
 

>>>> 작업2) 세종사전에 서울 관광지 명소를 수동으로 추가 (파일로 추가)

> useSejongDic() 
 
> mergeUserDic(data.frame(readLines("mergefile.txt"),"ncn"))
21 words were added to dic_user.txt.


>>>> 작업3) 분석할 크롤링한 자료를 변수로 불러 들여서 명사만 분리

> txt <-readLines("seoul_go.txt")
> place <- sapply(txt,extractNoun,USE.NAMES=F) #명사만 분리
> head(place,10) #확인
[[1]]
[1] "162,900" "건"     
 
[[2]]
[1] ""
 
[[3]]
[1] "서울"   "야경"   "데이트"
 
[[4]]
[1] ""
 
[[5]]
[1] "6"
 
[[6]]
[1] ""
 
[[7]]
[1] ""
 
[[8]]
 [1] "서울"           "야경"           "데이트"         "야경"          
 [5] "명소"           "BEST7"          "7"              "전"            
 [9] "서울"           "명소가되었는데" "달빛"           "후원"          
[13] "모습"           "수"             "곳인거"         "두"            
[17] "번째"           "서울"           "야경"           "명소"          
[21] "북악"           "팔각정"         "저"             "rudyrudy1207"  
[25] "blog"           "me"             "220147814047"   "루디"          
[29] "반딧불이"       "세"             "블로그"         "내"            
[33] "검색"          
 
[[9]]
[1] ""
 
[[10]]
[1] "여행"   "하기"   "좋은곳"

>head(unlist(place),30) #보기좋은 모양(리스트가 아닌)으로 변경
>c <- unlist(place)
>place <- Filter(function(x) {nchar(x) >= 2},c) #2자이상된 단어만 필터링함


>>>> 작업4) 의미없는 문자, 기호, 숫자, 공백 제거


>res <- str_replace_all(place,"[^[:alpha:]]","")      #영문,한글 아닌것 전부제거
>res <- res[res != ""]                                  #벡터에서 공백을 제거합니다.
> res <-gsub("서울","",res)                      #문자열 변환
> res <-gsub("명소","",res)
> res <-gsub("소개","",res)
> res <-gsub("추천","",res)
> res <-gsub("블로그","",res)
> res <-gsub("검색","",res)
> res <-gsub("blog","",res)
> res <-gsub("naver","",res)
> res <-gsub("com","",res)
> res <-gsub("me","",res)
> res <-gsub("데이트","",res)
> res <-gsub("약도","",res)
> res <-gsub("사진","",res)
> res <-gsub("야경","",res)
> res <-gsub("여행","",res)
> res <-gsub("근교","",res)
> res <-gsub("이야기","",res)
> res <-gsub("안녕","",res)
> res <-gsub("도시","",res)
> res <-gsub("관광","",res)
> res <-gsub("벚꽃","",res)
> res <-gsub("코스","",res)
> res <-gsub("오늘","",res)
> res <-gsub("요한","",res)
> res <-gsub("축제","",res)
> res <-gsub("행복","",res)
> res <-gsub("가볼만한곳","",res)
> res <-gsub("걷기","",res)
> res <-gsub("km","",res)
> res <-gsub("거리","",res)
> res <-gsub("공원","",res)
> res <-gsub("문화","",res)
> res <-gsub("마을","",res)
> res <-gsub("가을","",res)
> res <-gsub("단풍","",res)
> res <-gsub("나들이","",res)
> res <-gsub("주말","",res)
> res <-gsub("출사","",res)
> res <-gsub("하게","",res)
> res <-gsub("구경","",res)
> res <-gsub("유명","",res)
> res <-gsub("좋은곳","",res)
> res <-gsub("daum","",res)
> res <-gsub("시간","",res)
 
> NROW(res) #행객수
[1] 5540

> write(res,"seoul_go2.txt")                    #정제된 내용을 파일로 저장
> res2 <- read.table("seoul_go2.txt")         #파일을 다시 변수로 읽어옴
> wordcount<-table(res2)                     #각 언어별 언급 횟수를 집계
> head(sort(wordcount,decreasing=T),30)   #언급횟수가 30부터내림차순의 내용 출력
res2
          한옥           북촌           홍대         삼청동         경복궁 
            38             32             25             23             22 
          인사           하늘         창경궁         올림픽 국립중앙박물관 
            20             20             18             17             13 
        나들길           남산         청계천         cognos           명동 
            13             13             13             12             12 
          억새           호수           강남 국립민속박물관           벽화 
            12             12             11             11             11 
            에           촬영           하나           국립         선유도 
            11             11             11             10             10 
          에서           일출           카페           하기        tistory 
            10             10             10         



>>>> 작업5) 추선 수가 높은 상위 10개의 명소를 골라서 pie형 그래프로 출력

> top10 <- head(sort(wordcount,decreasing=T),10)
> top10
res2
          한옥           북촌           홍대         삼청동         경복궁 
            38             32             25             23             22 
          인사           하늘         창경궁         올림픽 국립중앙박물관 
            20             20             18             17             13 
> pie(top10)
> savePlot("seoul_go_1.jpeg",type="jpeg")


>>>> 작업6) 색깔과 크기 지정해서 pie형 그래프 출력



> pie(top10,col=rainbow(10),radius=1)
> savePlot("seoul_go_2.jpeg",type="jpeg")

 

>>>> 작업7) 수치값을 함께 출력

> pct<-round(top10/sum(top10)*100,1)
> names(top10)
 [1] "한옥"           "북촌"           "홍대"           "삼청동"        
 [5] "경복궁"         "인사"           "하늘"           "창경궁"        
 [9] "올림픽"         "국립중앙박물관"
 
> lab<-paste(names(top10),"\n",pct,"%")
> pie(top10,main="서울시 가볼만한 명소 TOP 10",col=rainbow(10),cex=0.8,labels=lab)
> savePlot("seoul_go_3.jpeg",type="jpeg")


>>>> 작업8) 도넛모양 으로 출력

> pie(top10,radius=0.6,col="black",labels=NA,border=NA)
> pie(top10,main="서울시 가볼만한 명소 TOP 10",col=rainbow(10),cex=0.8,labels=lab)
> par(new=T) #기존 파이그래프 지우지 않고 덮어쓴다는 의미
> pie(top10,radius=0.6,col="white",labels=NA,border=NA)
> savePlot("seoul_go_4.jpeg",type="jpeg")


>>>> 작업9) 3D Pie 출력


   - pie3D()함수  
    : 3D로 파이그래프 만들기
      plotrix패키지를 설치후 library를 로딩해야함.
 
      install.packages("plotrix")
      library(plotrix)
 
>   bchart <- head(sort(wordcount, decreasing=T), 10)
>   th_pct <- round(bchart/sum(bchart)*100,1)
>   th_names <- names(bchart)
>   th_labels <- paste(th_names,"\n","(",th_pct,")")
>   pie3D(bchart,main="서울의 가볼만한 명소 Top 10",col=rainbow(10),
+   cex=0.5,labels=th_labels,explode=0.05)
>   savePlot("seoul_go_5.jpeg",type="jpeg")


>>>> 작업10) bar 형식으로 출력

> bplot <- barplot(bchart, main="서울의 가볼만한 명소 top10",col=rainbow(10),
+ cex.names=0.7,las=2,ylim=c(0,45))
> pct <- round(bchart/sum(bchart) *100,1)
> pct
res2
          한옥           북촌           홍대         삼청동         경복궁           인사           하늘         창경궁         올림픽 국립중앙박물관 
          16.7           14.0           11.0           10.1            9.6            8.8            8.8            7.9            7.5            5.7 

> text(x=bplot, y=bchart*1.05, labels=paste("(",pct,"%",")"), col = "black", cex=0.5)
> text(x=bplot, y=bchart*0.95, labels = paste(bchart,"건"),col="black",cex=0.5)
> savePlot("seoul_go_6.jpeg",type="jpeg")


-------------------------------------------------------------------------------------------


>   barplot(bchart, main="서울의 가볼만한 명소 top10",col=rainbow(10),
+  xlim=c(0,45),cex.names=0.7,las=2,horiz=T)
>  text(y=bplot, x=bchart*0.9, labels = paste(bchart,"건"), col = "black", cex=0.7)
>  text(y=bplot, x=bchart*1.1, labels = paste("(",pct,"%",")"),col="black",cex=0.7)
>  savePlot("seoul_go_7.jpeg",type="jpeg")
 
 




R은 읽어봐야 할 것 같다^^



5. 수업

진도: 

hw: 


6. 할것



'Programming' 카테고리의 다른 글

160917: 완료  (1) 2016.09.17
160826: 111회차  (0) 2016.08.26
160824: 109회차  (0) 2016.08.24
160823: 108회차  (0) 2016.08.23
160822: 107회차  (0) 2016.08.22
Posted by DAVID

160824: 109회차

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


[01] R 프로그램 시작 (설치) , R 자료형 (기본, 벡터, 팩터, 행렬)
[01] R프로그래밍 시작
 
1. R 특징
 
 - 통계 분석및 시각화를 위한 프로그래밍 언어.
 
 - 객체지향이며, 패키지를 추가 및 사용하여 기능확장함.
 
 - Java, C, Python등 다른 언어들과도 인터페이스 지원 가능
 
 - 통계 분석, 모델링, 그래픽 작업등 사용
 
 - 자료 분석, 조직화 및 시각화 가능
 
 
 
 2. R 설치
 
- http://cran.r-project.org 에서 운영체제에 맞는 파일 다운로드합니다.
 
  Download R for Windows -> base의 install R for the first time -> Download R 3.2.1 for Windows 


 
- 구성요소 설치 화면에서 본인의 운영체제에 맞는 것만 선택해서 설치합니다.
 
- 실행후 다음과 같이 입력합니다.

 
> 1+4        : 1+4
 
> a<-5       : a=5
 
> a          : a값 확인
 
> ls()       :작업공간에 있는 객체 목록
 
> rm(x)      :작업공간에 있는 객체 x 삭제
 
> q()        :R종료
 
> getwd()    :현재 작업공간 확인
 
- 작업공간변경: 파일 -> 작업디렉토리 변경 -> 변경할 폴더 선택(R 폴더아래 새로운 폴더 mywork생성후 선택)
 
- 자료형없이 객체를 선언하며 데이터 할당시 <- 를 사용합니다.
 
 
3. R 자료형
 
- 문자형(character) :문자, 문자열
- 수치형(numeric) : 정수(integer), 실수(double)
- 복소수형(complex) : 실수 + 허수
- 논리형 (logical) : TRUE(T, 1), FALSE(F, 0)
- NULL :비어있는 값
- NA : missing value, 결측값
- NaN(not a number) :수학적으로 정의되지 않은 값
- Inf, -Inf :무한대
- mode(), typeof() : 자료형 확인
 
참고) 복소수






 
참고) R화면 지우기: CRT + L


(1) 벡터(vector)
   하나 이상의 원소로 구성된 데이터 구조, 하나의 벡터는 한 종류의 기본형만 존재함

   벡터는 C()함수로 작성한다


(2) 팩터(factor):범주형
   카테고리 데이터를 나타낼때 사용할 수 있는 벡터이며,
 수치값이 아니, 어떤 성질을 나타 냄, 벡터의 특수한 형태임. 예를 들어서 어떤 사람의 성별에 관한 값이 있을 것인데 (남자/여자) 그런것들을 나타낼 때는 Factor를 사용하면 된다.
 
 
(3)  행렬(matrix) 
   동일한 형으로 이루어진 2차원 데이타 구조
 
- mode() : 타입 출력
- typeof() : 저장된 실제 타입
- dim() : 행과 열의 갯수
- dimnames() : 행과 열의 이름
- paste() : 문자열 연결
 








 1) 행렬의 속성
     행렬의 속성에는 벡터의 속성에다가 행과 열의 개수, 이름을 나타내는 dim과 dimnames가 포함된다.


      
 
 
예제)
 
> matr <- matrix(1:9, nrow=3)                   #3행 3열 행렬 생성
> dimnames(matr) <- list(paste("row", c(1:3)), paste("col", c(1:3)))
                                                 #행과 열 이름 지정
> matr
       col 1  col 2 col 3
row 1     1     4     7
row 2     2     5     8
row 3     3     6     9
 
> length(matr)                                   #자료의 개수
[1] 9
> mode(matr)                                    #자료의 형태
[1] "numeric"
> dim(matr)                                      #행과 열의 개수
[1] 3 3
> dimnames(matr)                                #행과 열의 이름 확인
[[1]]
[1] "row 1" "row 2" "row 3"
 
[[2]]
[1] "col 1" "col 2" "col 3"


 
 
 2) 기본함수
    행렬(matrix)은 여러 변수들이 이차원적으로 모여 있는 개체로, 행렬을 생성하기 위해서는 matrix() 함수를 사용한다. 
    matrix() 함수 이외에 cbind(), rbind(), dim() 등을 이용하여 행렬을 생성시킬 수 있다.
 
 
예1)
> matrix(1:9, nrow=3)                            #nrow  : 행의 개수 지정
      [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

 
예2)
> matrix(c(1,4,7,2,5,8,3,6,9), byrow=T, ncol=3)     
                                                            #ncol : 열의 개수 지정
                                                            #byrow=T : 행 기준 행렬을 생성
      [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

 
예3)
> r1 <- c(1,4,7)                                 #r1, r2, r3 행 벡터 생성
> r2 <- c(2,5,8)
> r3 <- c(3,6,9)
> rbind(r1, r2, r3)                              #rbind : 행을 기준으로 결합
    [,1] [,2] [,3]
r1    1    4    7
r2    2    5    8
r3    3    6    9

 
예4)
> c1 <- 1:3                                       #c1, c2, c3 열 벡터 생성
> c2 <- 4:6
> c3 <- 7:9
> cbind(c1, c2, c3)                           #cbind : 열을 기준으로 결합
     c1 c2 c3
[1,]  1  4  7
[2,]  2  5  8
[3,]  3  6  9

 
예5)
> m1 <- 1:9
> dim(m1) <- c(3,3)                        #dim : 차원을 지정
> m1
      [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
 
 
 
 3) 관련함수
     행렬과 관련된 여러 함수와 성분의 추출과 삭제 등에 관해 알아보자.

 
예제)
> mat <- matrix(c(1,2,3,4,5,6,7,8,9), ncol=3, byrow=T)   
                                                 #행 기준 3열의 행렬 생성
> mat
       [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
 
> mat[1,]                                       #행렬 mat의 1행의 값
[1] 1 2 3
> mat[,3]                                       #행렬 mat의 3열의 값
[1] 3 6 9
 
> mat[mat[,3] > 4, 1]                    #3열에서 4보다 큰 행의 값 중  1열의 모든 값 
[1] 4 7                                          
> mat[mat[,3] > 4, 2]                    #3열에서 4보다 큰 행의 값 중   2열의 모든 값
[1] 5 8                                          
 
> mat[2,3]                                    #2행 3열의 값 추출
[1] 6
                       #2행 값만을 추출
      [,1] [,2] [,3]
[1,]    4    5    6
 
 
 
예제)
> is.matrix(mat[2,,drop=F])             #mat[2,,drop=F]가 행렬인지 확인
[1] TRUE                                           
 
> mat[-2,-3]                                     #2행과 3열의 값을 삭제
      [,1] [,2]
[1,]    1    2
[2,]    7    8
 
> dim(mat)                                       #차수 표시 : 3행 3열
[1] 3 3
> nrow(mat)                                     #행의 개수 표시 : 3행
[1] 3
> ncol(mat)                                      #열의 개수 표시 : 3열
[1] 3
 
> y <- diag(1:3)   #diag : 대각행렬을 생성
> y
      [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    2    0
[3,]    0    0    3
 
> diag(y)                                        # diag(y) : 대각원소 표현
[1] 1 2 3
 
> col(y)                                          #col(y) : 원소들의 열 번호 표현
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1    2    3
[3,]    1    2    3
 
 
 
예제)
> height <- c(140,155,142,175)                  #height 벡터 생성
> size.1 <- matrix(c(130,26,110,24,118,25,112,25), ncol=2, byrow=T,
+ dimnames=list(c("Abe", "Bob", "Carol", "Deb"), c("Weight", "Waist")))
                                                                  #size.1 행렬 생성
> size <- cbind(size.1, height)                   #size.1 행렬과 height 벡터의 열 기준 결합
                                                  
> size
       Weight Waist height
Abe      130    26    140
Bob      110    24    155
Carol    118    25    142
Deb      112    25    175
 
> colmean <- apply(size, 2, mean)              #2열의 평균값을 계산
> colmean
Weight  Waist  height 
 117.5   25.0  153.0
 
> rowmean <- apply(size, 1, mean)             #1행의 평균값을 계산
> rowmean
      Abe       Bob      Carol       Deb 
 98.66667  96.33333  95.00000 104.00000
 
> colvar <- apply(size, 2, var)                     #2열의 분산값을 계산
> colvar
     Weight         Waist       height 
 81.0000000   0.6666667 259.3333333
 
> rowvar <- apply(size, 1, var)                   #1행의 분산값을 계산
> rowvar
     Abe      Bob     Carol      Deb 
3985.333 4430.333 3819.000 5673.000

 
 
예제)
> sweep(size, 2, colmean)                        #size 각 열의 값과 colmean의 차
       Weight Waist height
Abe     12.5     1    -13
Bob     -7.5    -1      2
Carol    0.5      0    -11
Deb     -5.5     0     22
 
> sweep(size, 1, rowmean)                       #size 각 행의 값과 rowmean의 차
        Weight       Waist    height
Abe   31.33333 -72.66667 41.33333
Bob   13.66667 -72.33333 58.66667
Carol  23.00000 -70.00000 47.00000
Deb    8.00000 -79.00000 71.00000
 
> sweep(size, 1, c(1,2,3,4), "+")                 #size 각 행의 값에  c(1,2,3,4)값을 더해줌
                                                    
       Weight  Waist  height
Abe      131    27    141
Bob      112    26    157
Carol     121    28    145
Deb      116    29    179
 
> sweep(size, 1, c(1,2,3,4), "-")                 #size 각 행의 값에 c(1,2,3,4)값을 빼줌
                                                  
       Weight Waist  height
Abe      129    25    139
Bob      108    22    153
Carol     115    22    139
Deb      108    21    171
 

 
4) 행렬의 연산
   여러 가지 함수를 이용하여 행렬의 곱셈, 역행렬, 대각행렬, 전치행렬 

       

   
   
예제)
> m1 <- matrix(1:4, nrow=2)                     #1~4까지 2행 2열의 행렬 생성
> m1
      [,1] [,2]
[1,]    1    3
[2,]    2    4
 
> m2 <- matrix(5:8, nrow=2)                     #5~8까지 2행 2열의 행렬 생성
> m2
      [,1] [,2]
[1,]    5    7
[2,]    6    8
 
> m1*1:2                                                   #m1의 1행×1, 2행×2
      [,1] [,2]
[1,]    1    3
[2,]    4    8
> m1%*%m2                                             #m1과 m2 행렬의 곱셈
      [,1] [,2]
[1,]   23   31
[2,]   34   46
> solve(m1)                                              #m1행렬의 역 행렬 생성
      [,1] [,2]
[1,]   -2  1.5
[2,]    1 -0.5
 
> t(m1)                                                    #m1행렬의 전치행렬 생성
       [,1] [,2]
[1,]    1    2
[2,]    3    4
> eigen(m1)                                          #m1행렬의 고유치와 고유벡터 
$values                                                 #고유치
[1]  5.3722813 -0.3722813
$vectors                                               #고유벡터
            [,1]         [,2]
[1,] -0.5657675 -0.9093767
[2,] -0.8245648  0.4159736
 
> vec1 <- as.vector(m1)                      #행렬을 벡터로 변환
> vec1
[1] 1 2 3 4
 


 
[02] R 자료형 (array, list, data frame)
(4) 배열(array)
    동일한 형으로 이루어진 다차원 데이타 구조,  벡터에 차원부여하면 배열임
     배열(Array)은 행렬을 2차원 이상으로 확장시킨 객체이다. 
    따라서 2차원의 구조를 갖는 행렬도 배열의 한 종류이다. 
    그러나 일반적으로 3차원 이상의 차원을 갖는 데이터 객체를 배열이라고 부른다.
 
  1) 배열(Array)의 속성
 
    배열의 속성은 행렬의 속성과 같이 자료의 개수를 나타내는 length, 형태를 보여주는 mode, 
    각 차원의 벡터의 크기를 나타내는 dim 그리고 각 차원의 리스트 이름을 나타내는 
    dimnames로 구성되어 있다.
 

    
 
 
예제)
> arr <- array(1:24, c(3,3,2))                    #1~18까지의 자료 생성
> dimnames(arr) <- list(paste("row", c(1:3)),paste("col", c(1:3)),paste("ar", c(1:2)))
                                                 #각 차원의 이름을 지정
> arr
, , ar 1
 
       col 1 col 2  col 3
row 1     1     4     7
row 2     2     5     8
row 3     3     6     9
 
, , ar 2
 
       col 1 col 2  col 3
row 1    10    13    16
row 2    11    14    17
row 3    12    15    18
 
> length(arr)                                   #자료의 개수 확인
[1] 18
> mode(arr)                                     #자료의 형태 확인
[1] "numeric"
> dim(arr)                                      #각 차원 벡터의 크기
[1] 3 3 2
> dimnames(arr)                                 #각 차원 리스트의 이름
[[1]]
[1] "row 1" "row 2" "row 3"
 
[[2]]
[1] "col 1" "col 2" "col 3"
 
[[3]]
[1] "ar 1" "ar 2"
 
 
   2) 배열(Array)의 생성
      배열을 생성하기 위한 함수로 array() 함수와 dim() 함수가 있다.
 
    - array() 함수
 
예제)
> array(1:6)                                         #1~6의 자료로 1차원 배열 생성
[1] 1 2 3 4 5 6
 
> array(1:6, c(2,3))                              #1~6의 자료로 2차원 배열 생성
      [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
 
> array(1:8, c(2,2,2))                           #1~8의 자료로 3차원 배열 생성
, , 1
 
      [,1] [,2]
[1,]    1    3
[2,]    2    4
 
, , 2
 
      [,1] [,2]
[1,]    5    7
[2,]    6    8
 
 
     - dim() 함수
 
예제)
> arr <- c(1:24)                                   #1~24의 자료 생성
> dim(arr) <- c(3,4,2)                          #dim() 함수를 이용하여 3행 4열의 행렬 2개 생성
> arr                                             
, , 1
 
      [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
 
, , 2
 
      [,1] [,2] [,3] [,4]
[1,]   13   16   19   22
[2,]   14   17   20   23
[3,]   15   18   21   24
 
 
 
  2) 배열의 연산+
     같은 크기의 배열간의 사칙연산 및 같은 위치의 원소간의 연산을 수행할 수 있다. 
     또한 숫자와 배열 또는 배열과 숫자간의 산술 연산도 가능하다.
 
예제)
> ary1 <- array(1:8, dim = c(2,2,2))  
> ary2 <- array(8:1, dim = c(2,2,2))
> ary1
, , 1
 
      [,1] [,2]
[1,]    1    3
[2,]    2    4
 
, , 2
 
      [,1] [,2]
[1,]    5    7
[2,]    6    8
 
> ary2
, , 1
 
      [,1] [,2]
[1,]    8    6
[2,]    7    5
 
, , 2
 
      [,1] [,2]
[1,]    4    2
[2,]    3    1
 
> ary1 + ary2                                 #자료의 덧셈
, , 1
 
      [,1] [,2]
[1,]    9    9
[2,]    9    9
 
, , 2
 
      [,1] [,2]
[1,]    9    9
[2,]    9    9
 
> ary1 * ary2                                  #자료의 곱셈
, , 1
 
      [,1] [,2]
[1,]    8   18
[2,]   14   20
 
, , 2
 
      [,1] [,2]
[1,]   20   14
[2,]   18    8
 
> ary1 %*% ary2                                #두 배열 원소들의 곱의 합
      [,1]
[1,]  120
> sum(ary1 * ary2)
[1] 120
 
 
 3) 배열원소의 추출 및 삭제
    배열의 원소를 추출하는 방법은 행렬의 경우와 유사한데, 
   “,”로 구분하여 차원의 인덱스를 기술하면 된다.
 
예제)
> ary1[,,1]
      [,1] [,2]
[1,]    1    3
[2,]    2    4
> ary1[1,1,]
[1] 1 5
> ary1[1,,-2]
[1] 1 3




  set.seed는 pseudorandom number, 즉 유사난수를 생성하기 위한 알고리즘이다.
 유사난수란 알고리즘의 상태에 의해 생성되는 수열(from wikipedia). 
 즉 무차별적으로 숫자가 생성되는 것이 아니라 랜덤하긴 하지만 일정한 규칙이 있는 것이다


 
 
(5) 리스트(list)
   서로다른 자료형의 데이터들로 이루어진 자료형
   리스트는 성분(component)이라는 것으로 이루어지는데 이 성분들은 서로 다른
   형의 원소를 가질 수 있고, 길이도 다를 수 있다. 성분은 행렬과 배열의  차원과 유사하다.
   리스트를 생성하는 함수는 list()이다.
 
 
예)
 >li <- list("top", c(2,4,6),c(T,F,T))     #list(문자, 숫자, 논리형 객체)    
[[1]]
[1] "top"
 
[[2]]
[1] 2 4 6
 
[[3]]
[1]  TRUE FALSE  TRUE
 
> li[[1]]                                        #[[1]]:첫 번째 성분
[1] "top"
 
예)
> mat1 <- matrix(1:4, nrow=2)
> list1 <- list("A", 1:8, mat1)
> list1
[[1]]
[1] "A"
 
[[2]]
[1] 1 2 3 4 5 6 7 8
 
[[3]]
      [,1] [,2]
[1,]    1    3
[2,]    2    4
 
> son <- list(son.name = c("Minsu", "Minchul"), son.cnt = 2, son.age = c(2.6))
> son
$son.name
[1] "Minsu"   "Minchul"
$son.cnt
[1] 2
$son.age
[1] 2.6

 
  1) 리스트 속성
 
   
예) 
> a <- 1:10
> b <- 11:15
> klist <- list(vec1=a, vec2=b, descrip="example")
> length(klist)                                  #klist 리스트 자료의 개수
[1] 3
> mode(klist)                                    #klist 리스트 자료의 형태
[1] "list"
> names(klist)                                   #klist 리스트 각 구성요소의 이름
[1] "vec1"    "vec2"    "descrip"

 
 
 2) 리스트 생성 및 다양한 변화
 
리스트에서의 성분을 추출하는 방법은 [[]] 를 사용하며, 
성분의 이름을 지정하였다면 $ 연산자를 사용한다. 또한, 성분의 원소를 추출하고자 하는 경우에는
[] 연산자를 사용한다. 그리고 리스트에서 성분과 성분의 원소를 추가 또는 삭제할 수도 있다.
 
예) 
> exm <- list(c("Abe", "Bob", "Carol", "Deb"),c("Weight","Waist"))
> exm                                           #exm 리스트 생성
[[1]]
[1] "Abe"   "Bob"   "Carol" "Deb"  
 
[[2]]
[1] "Weight" "Waist"
 
> exm[[2]]                                     #리스트의 2번째 성분
[1] "Weight" "Waist"
> exm[[2]][2]                                 #2번째 성분 2번째 원소
[1] "Waist"
 
예)
> names(exm) <- c("Rows","Columns")           #exm 리스트에 성분 이름 부여
> exm
$Rows
[1] "Abe"   "Bob"   "Carol" "Deb"  
 
$Columns
[1] "Weight" "Waist"
 
> exm$Rows                                      #exm의 Rows 성분만 표현
[1] "Abe"   "Bob"   "Carol" "Deb"
> exm$Rows[2]                                 #Rows 성분 2번째 원소 표현
[1] "Bob"
 
> exm$Columns                                 #exm의 Columns 성분만 표현
[1] "Weight" "Waist"
 
예)
 > list1 <- list("A", 1:8)                         #list1 리스트 생성
 > list1
[[1]]
[1] "A"
 
[[2]]
[1] 1 2 3 4 5 6 7 8
 
> list1[[3]] <- list(c(T, F))                    #세 번째 성분을 추가
> list1[[2]][9] <- 9                               #두 번째 성분에 원소 추가 
> list1
[[1]]
[1] "A"
 
[[2]]
[1] 1 2 3 4 5 6 7 8 9
 
[[3]]
[[3]][[1]]
[1]  TRUE FALSE
 
> list1[[3]] <- NULL                             #세 번째 성분 삭제
> list1[[2]] <- list1[[2]][-9]                  #두 번째 성분의 9번째 원소 삭제
> list1
[[1]]
[1] "A"
 
[[2]]
[1] 1 2 3 4 5 6 7 8
 
 
 3) 관련함수
    리스트는 성분에 리스트와 벡터 등을 사용할 수 있다.
 
예) 
> a <- 1:10
> b <- 11:15                               #벡터 a, b 생성
 
> klist <- list(vec1=a, vec2=b, descrip="example")
> klist                                    
$vec1                                        
[1]  1  2  3  4  5  6  7  8  9  10
 
$vec2
[1] 11 12 13 14 15
 
$descrip
[1] "example"
 
> klist[[2]][5]                              #두 번째 성분 vec2의 5번째 원소
[1] 15
 
> klist$vec2[c(2,3)]                         #vec2의 2, 3번째 원소
[1] 12 13
 
 

 
(6) 데이터 프레임(data frame) 
     list와 행렬의 특징을 가짐
    데이터 프레임은 행렬과 비슷한 형태로 되어 있으나, 행렬은 차원으로 표시되며 같은 형태(mode)의 
    객체를 가지는 반면, 데이터 프레임은 각 열(column)들이 서로 다른 형태(mode)의 객체를 가질 수 
    있으므로 범주형 변수를 가질 수도 있기 때문에 범주형 자료분석에도 유용하게 사용된다.

 
 
  1) 데이터 프레임의 장점
      - 데이터 프레임은 형태(mode)가 일반화된 행렬(matrix)이다.
      - 데이터 프레임이라는 하나의 객체에 여러 종류의 자료가 들어갈 수 있다.
      - 데이터 프레임의 각 열은 각각 변수와 대응한다.
      - 분석이나 모형 설정에 적합한 자료 객체이다.

 
 
  2) 데이터 프레임의 생성
     -  데이터 프레임을 생성하는 방법으로는 read.table() 함수를 이용하여 외부 텍스트 파일을 
        불러들이는 방법
     - data.frame() 함수를 이용하여 여러 종류의 자료객체들을 서로 결합시키는 방법
     - as.data.frame() 함수를 사용하여 다른 형태의 자료객체를 데이터 프레임의 형태로 변환하는 방법이 있다.


 
    >> read.table()
 
    외부의 파일에 대해서는 read.table() 함수를 이용해서 생성한다. 
    read.table() 함수의 괄호 안에 자료가 입력 되어있는 곳의 경로명을 지정한다. 
    이때 자료는 다음과 같이 작성되어 “c:\exam\story.txt"에 저장되어 있다고 하자.
 
    no name age sex
    1 Lee 55 M
    2 Park 47 F
    3 So 35 M
    4 Kim 26 F
    5 Yoon 29 M
 
예) 
> test1 <- read.table("c:\\exam\\story.txt") //역슬래시 2개 
> test1
  V1   V2  V3  V4
1 no name age sex
2  1  Lee  55   M
3  2 Park  47   F
4  3   So  35   M
5  4  Kim  26   F
6  5 Yoon  29   M
 
행의 번호가 있음에도 또 다시 행의 번호가 지정되어있으므로, 
이를 해결해보자
 
예) 
> test2 <- read.table("c:\\exam\\story.txt",row.names = 'no', header = T)
> test2
  name age sex
1  Lee  55   M
2 Park  47   F
3   So  35   M
4  Kim  26   F
5 Yoon  29   M
 
 read.table() 함수의 인수 중에서 row.names = 'no'는 행 이름임을 알려주며, 
 header = T 는 첫 번째 줄이 헤드라인임을 알려준다. 
 test2를 보면 첫 번째 열과 세 번째 열은 범주형, 두 번째 열은 숫자형 중에서도 정수형으로 서로 다르다. 
 자료의 구조는 행렬과 같은데 각각 열의 데이터 유형이 다른 점이 행렬과 큰 차이점이다.
 

 
 
>> data.frame()
 이 함수는 이미 생성되어 있는 벡터들을 결합하여 데이터 프레임을 생성하는 것이다. 
 벡터 char1과 num1을 결합하여 test1이라는 데이터 프레임을 생성해보자.
 
예) 
> char1 <- rep(LETTERS[1:3],c(2,2,1))          #벡터 char1 ,rep(a,b) a를 b만큼반복
> char1
[1] "A" "A" "B" "B" "C"
> num1 <- rep(1:3,c(2,2,1))                           #벡터 num1
> num1
[1] 1 1 2 2 3
> test1 <- data.frame(char1, num1)             #test1 데이터 프레임 생성
> test1
  char1 num1
1     A    1
2     A    1
3     B    2
4     B    2
5     C    3
 
 
ls 는 지금까지 사용한 객체들 다 보여줌


 
>>  as.data.frame()
 
  이 함수를 이용하면 모든 다른 종류의 자료객체들을 데이터 프레임으로 변환할 수가 있다. 
  행렬 a1을 test3라는 데이터프레임의 형태로 변환하면 다음과 같다.
 
예) 
> a1 <- c("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o")
> dim(a1) <- c(5,3)
> a1                                           #a1 행렬  
    [,1] [,2] [,3]
[1,] "a"  "f"  "k" 
[2,] "b"  "g"  "l" 
[3,] "c"  "h"  "m" 
[4,] "d"  "i"  "n" 
[5,] "e"  "j"  "o" 
> test3 <- as.data.frame(a1)                   #a1을 데이터 프레임으로 변환
> test3
  V1 V2 V3
1  a  f  k
2  b  g  l
3  c  h  m
4  d  i  n
5  e  j  o
 
 
 
 3) 데이터 프레임 합치기
    여러 데이터 프레임을 합쳐서 하나의 데이터 프레임으로 생성할 수가 있는데 이렇게 합치는 방법에는
    각각의 데이터 프레임을 옆으로 합치는 방법과 아래로 합치는 방법이 있다.
 
  - 옆으로 합치기
   데이터 프레임을 옆으로 합치는 경우에는 cbind() 함수를 사용하는데, cbind() 함수를 사용할 때 
   두 데이터 프레임간에 같은 변수가 있으면 그 변수가 두 번 나타나게 되는데 이러한 경우에 merge() 
   함수를 사용하면 같은 변수에 대해서 한번만 보여주게 된다.
 
예) 
> cbind(test1,test3)
  char1 num1 V1 V2 V3                        #test1과 test2를 옆으로 합친 형태
1     A    1  a  f  k
2     A    1  b  g  l
3     B    2  c  h  m
4     B    2  d  i  n
5     C    3  e  j  o
 
  - 아래로 합치기
    데이터 프레임을 아래로 합치는 경우에는 rbind() 함수를 사용하는데, 아래로 합칠 때에는 자료의 열의
    개수가 동일해야 하고 변수 이름도 동일해야 한다.
 
예) 
> char1 <- rep(LETTERS[3:1],c(3,3,3))
> char2 <- rep(LETTERS[1:3],c(3,3,3))
> dim(char1) <- c(3,3)
> char1
     [,1] [,2] [,3]
[1,] "C"  "B"  "A" 
[2,] "C"  "B"  "A" 
[3,] "C"  "B"  "A" 
> dim(char2) <- c(3,3)
> char2
     [,1] [,2] [,3]
[1,] "A"  "B"  "C" 
[2,] "A"  "B"  "C" 
[3,] "A"  "B"  "C" 
> data.frame(char1)
  X1 X2 X3
1  C  B  A
2  C  B  A
3  C  B  A
> data.frame(char2)
  X1 X2 X3
1  A  B  C
2  A  B  C
3  A  B  C
> rbind(char1,char1)
     [,1] [,2] [,3]
[1,] "C"  "B"  "A" 
[2,] "C"  "B"  "A" 
[3,] "C"  "B"  "A" 
[4,] "C"  "B"  "A" 
[5,] "C"  "B"  "A" 
[6,] "C"  "B"  "A" 
> rbind(char2, char2)
     [,1] [,2] [,3]
[1,] "A"  "B"  "C" 
[2,] "A"  "B"  "C" 
[3,] "A"  "B"  "C" 
[4,] "A"  "B"  "C" 
[5,] "A"  "B"  "C" 
[6,] "A"  "B"  "C" 
 
 

(7) 시계열
    시간에 따른 관측치들 순서대로 나열,저장
  
 - data:데이터, start:시작 지점, end:종료지점
   frequency=1:년 ,4:분기, 12 :월주기
 



 



5. 수업

진도: 

hw: 


6. 할것



'Programming' 카테고리의 다른 글

160826: 111회차  (0) 2016.08.26
160825: 110회차  (0) 2016.08.25
160823: 108회차  (0) 2016.08.23
160822: 107회차  (0) 2016.08.22
160819: 106회차  (0) 2016.08.19
Posted by DAVID

160823: 108회차

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


Framework 비밀번호: IOC




5. 수업

진도: 

hw: 


6. 할것



'Programming' 카테고리의 다른 글

160825: 110회차  (0) 2016.08.25
160824: 109회차  (0) 2016.08.24
160822: 107회차  (0) 2016.08.22
160819: 106회차  (0) 2016.08.19
160817: 105회차  (0) 2016.08.17
Posted by DAVID

160822: 107회차

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


[02] NoSQL 구조 및 특징, 키구조

[01] NoSQL 구조 및 특징

   - NoSQL에서는 관계형 데이터베이스에서 금기시했던 정규화 관련 제약사항들이 
     거이 허용되며, 그런만큼 NoSQL에서 데이터 모델 구조 설계의 폭이 더 넓어졌다.
   - NoSQL에서는 시스템의 품질이 설계 구조에 따라 결정된다.


1. Static Column Family와 Eynamic Column Family
  - NoSQL에는 컬럼정의가 데이터 저장시 이루어진다.
  - Cassandra DB인 경우에는 테이블 정의시 column을 정의
    할 수 있다.
  1) Static Column Family(고정 컬럼 패밀리)
   - 관계형 데이터베이스와 같이 테이블 정의시 컬럼정의(Cassandra)
  
  2) Dynamic Column Family(유동 컬럼 패밀리)
   - 테이블 생성시 컬럼을 미리 정의하지 않는다.
   - 컬럼은 데이터 저장시 컬럼명을 그때 그때 부여받는다.
   - 관계형 데이터베이스와 가장 큰 차이점이다.
 
  3) 관계형/NoSqL 모델
 
   a. 관계형 모델
    - PK : 년월 + 도서명 , 작가
 
  
   b. NoSQL(Static) // 관계형 데이터 모델과 거의 비슷하다
    - 년월 + 도서명이 row key로 정의되어 테이블생성시 정의된다.

 
 
   c. NoSQL(Dynamic)
    - row key는 년월이 되고 컬럼이 도서명이 된다.value값은 작가가된다.
    - NoSQL에서는 컬럼명이 데이터로 들어가기 때문에 이 모델도 가능하다.
    - 컬럼명은 무한대로 확장 가능하고 컬럼명도 계속 변한다.
 
고정값이 아니라서 변형 가능하다.

 
2. Nested Table
  - NoSQL에서는 관계형 데이터베이스와는 다른 nested 테이블이 가능하다
    테이블 안에 테이블을 정의할 수 있다.
  - 관계형 모델에서 nested 모델은 제 1정규화 위반이다
 
  1) 단일 nested 모델
  - 관계형 모델에서 부모자식 관계로 표현된다.
  - 관계형 모델에선 nested 모델은 추천하지 않는 구조이며
    이구조를 구현하기위해선 별개의 테이블을 생성한다.

  a. 관계형 모델
  - 학생이 과목을 수강하는 예에서 학생은 여러과목을
    수강할 수 있다.
  - 학생과 수강테이블이 분리되어 관계를 맺게된다.
 
 
  - 만약 조인을 하지 않기 위해서 역정규화를 하게되면
    하나의 학생테이블에 통합하게 되어 잘못된 설계가
    된다.
  - 이 잘못된 사례가 NoSQL에서는 정상적인 모델링 방법
    이 된다.
  b.NoSQL 모델
  - 사원과 조직이력을 예를 들어 보면, 사원은 근무하면서 여러번
    조직이 바뀔수 있다.
  - 관계형 모델에서는 사원,조직 테이블로 분리해 테이블이 생성
    된다.
   
 
 
  - NoSQL에서는 하나의 사원테이블안에 조직 변경이력을 관리한다.
 
 
 
  - 실제로 데이터베이스에 저장되는 모습이다.
 
  - row key는  사번이 저장되고, Columns에 성명 컬럼은 
    CQ(column qualifier)로 저장된다.
   
  - nested에 해당되는 개편차수와 부서코드를 통합하여
    CQ로 저장하고 부서명과 부서장이 결합되어 value로
    저장된다.

 
  2) 복합 nested 모델
   - Nested 엔티티가 하나 이상일 경우에 사용되는 모델이다.
  - 하나 이상을  구분하기 위해 CQ에 prifix를 사용하여 구분한다.
 



  - 데이터베이스 실제 저장되는 형태, 자격증은 L을 prefix로 사용하며,
    부서는 D를 prefix로 사용한다.
  

 
  3) Column Family를 활용한 Nested 모델

   - 부서이력과 자격사항을 Column Family로 구분해 설계했다.
   
   

  - 데이터베이스에 저장된 형태
  

 
 
3. Tall-Narrow vs, Flat-Wide Table 구조

   1) Tall-Narrow
   - 한 row에 컬럼수가 적고 컬럼이 고정되어 있다.
   - Cassandra에서는 skinny Row 라고도 하다.
  

   - row key에 아이디와 t1,t2..(등록일시)로 합쳐진 복합키로 이루어졌다.
   - message라는 컬럼이 고정되어있다.
   - 장점: row key로 부분 선별이 가능하다, 대량의 데이터 더 적합하다.
   - 단점: row가 많아진다.
 

  2) Flat-Wide
    - 한 row에 컬럼수가 많고 row수가 적다
    - Dynamic 컬럼을 많이 사용한다.
    - Cassandra에서는 Wide Row라고 한다.
   

   - CQ의 컬럼이 고정이 아니라 유동컬럼이다.
   - 한 row에 많은 컬럼들이 포함된다. row 단위로 저장하기 때문에 row에 데이터가 집중될수 있다.
   - 장점: 모든 컬럼은 row별로 정렬되어 저장된다, 
컬럼의 부분집합을 선택할 수 있다 
           즉, 한 계정의 메세지의 t1~t3사이의 메세지를 수분선택 가능하다.
   - 단점: row의 크기가 너무 커지면, 데이터가 한 서버에 집중 될 수 있다.
 

//2교시

4. NoSQL json
  - JSON 현태의 테이터 보관이 가능
 - 한 컬럼이지만 내부적으로 제이터 구조를 가지고 저장되므로 프로그램에서
    json 데이터 처리가 가능하다.
 - 저장된 데이터의 형태이다.


  


[02] NoSQL 키구조

 - 데이터베이스에서는는 거의 모든 연산이 key에 의해 수행된다.
 - 데이터베이스에서 key를 설정하는 것이 무척중요하다. 그렇치만 Key 구조를 
   
결정하는 것은 그리 쉬운일이 아니다. 
 - key 선택에는 경우의 수가 많아 많은 요구조건을 고려한 최적의 선택을 하여야 하고 
   
그선택은 데이터베이스 구조 및 성능을 구성하는 데 결정적 역할을 한다.

 
1. 관계형 모델 Key구조


 
 - 위에 예에서 주키(PK)의 설정은 매우 중요하고 성능 및
   모델의 품질을 결정한다.?
 - 베스트 앨범에도 같은 노래의 키를 사용하면 원 앨범을 쉽게
   조회할 수 있다.

 
2. NoSQL key구조
 1)Key/Value Key 구조
  - Row Key : 해당 테이블의 유일한 키
  - Value : 해당 테이블의 값
  - Key/value는 Key로 value에 접근하는 Key-based file systems로
    NoSQL에서 가장 간단한 구조이자 가장 기본적인 구조인다.
 
 2)Column Family 구조
  - NoSQL 키구조
  
 
 - key 영역은 row key, columns으로 구분된다.
    그리고 columns영역은 Column Family, Column Qualified,
    Timestamp로 세분화 된다.
  
  - RK(row key)
    모든 row는 논리적으로 Rk(Row key)에서 의해 결정되고
    전체 row에서 유일하다.예로 사원테이블의 사번이 RK이다
  
  - Column
    NoSQL 모델은 컬럼 단위로 데이터를 저장하기 때문에 컬럼
    RK와 같이 NoSQL의 key를 구성한다.
 
  - CF(Column Family)
    같은 개념을 갖는 컬럼들을 묶어 CF로한다. 일종의 구조적
    표현방식이다. 기존 관계형 모델에서 표현하지 못한 부분을
    NoSQL에서는 CF를 활용해서 표현한다.
 
  - CQ(Column Qualifier) 
    관계형 모델에서 이야기하는 컬럼이다. 컬럼별로 value가 
    저장된다. NoSQL에서 RK+CF+CQ와 value형태로 구성된다.
 
  - TS(Timestamp)
    TS는 해당 컬럼이 생성된 시간을 나타낸다. 이력 데이터 보관
    이라는 기능을 사용할 수 있도록 key로 구성된다.
 
  - 값(value)
    실제 데이터의 값이 들어간다.
 
 
3. NoSQL Row Key 확장
  - row key가 하나인것은 기본모델이지만 row key는 하나
    이상 확장될 수 있다.
  - row key가 사번+프로젝트 구개로 구성된 예다


 
  - row key를 구성하는 방법이 여러가지 있다.
 
  1)고정길이(Fixed Length)표현방법
  - 복합된 속성의 자리수를 고정시키는 방법이다.
    4자리 사번이고 5자리부터 8자리까지는 프로젝트 코드
    로 정의하고 자리수로 정의하는것이다.
 
  - 이방법은 속성의 길이가 고정되어 있을 경우에 사용해야
    한다.
  
  2)구분자(Delimiter)표현방법
  - 속성과 속성 사이에 사전에 약속한 구분자를 사용해
    구분하는 방법이다. 
  - 이방법은 key 속성의 길이가 가변일 경우에 주로 사용된다.
  - 사번:프로젝트와 같이 :로 구분해 두개의 key를 조합한다.
  
  3) Json 형식으로 데이터를 관리하는 방법도 있다.


--------------------------------------------
nosql 설계 공부해보기

---------------------------------------------------------------------

[03] MongoDB 개요 및 설치
[01]몽고DB 개요
 
1) 특징
 - 몽고DB는 NoSQL(Not Only SQL)데이터베이스로, JSON(Javascript
   Object Notation) 형태이 데이터를 저장한다.
 - SQL를 지원하지 않기 때문에 조인(Join)개념이 없고, 스키마는
   유동적이다. 
 - 스키마가 유동적이다란 몽고DB에서 저장하는 데이터 단위가 
   도큐먼트라는 것을 의미한다.
 - 몽고DB의 도큐먼트 속성은 SQL처럼 정형화되어 있지 않고, 
   가변적이기 때문에 모든 문서형태가 비정형 데이터를 저장하고
   처리하는데 적합하다.
 - 몽고DB는 C++로 작성된 오픈소스 문서지향(Document-Oriented)적 
   Cross-platform (어떤 OS던지 상관없이 설치가 가능한) 데이터베이스이며, 확장성과 성능이 높다 
 
2) Document

 - Document Oriented 데이터베이스란 Document를 그냥 ‘문서’로 
  번역해버리면 조금은 애매하다. 문서라고 하면 보통 워드/엑셀에 
  사용되는 그런 문서가 아니라 Document는 RDMS의 record 와 비슷한 
  개졈으로 이의 데이터 구조는 한개이상의 key-value pair (키와 값 쌍)으로 
  이뤄져있다. MongoDB 샘플 Document이다.
{
    "_id": ObjectId("5099803df3f4948bd2f98391"),
    "username": "velopert",
    "name": { first: "M.J.", last: "Kim" }
}
 
{
    "_id": ObjectId("5099803df3f4948bd2f98391"),
    "username": "velopert",
    "name": { first: "M.J.", last: "Kim" }
}

 - Document는 동적(dynamic)의 schema 를 갖고있다. 
   같은 Collection 안에 있는 Document 끼리 다른 schema 를
   갖을수 있다. 서로 다른 데이터(즉 다른 key) 들을 가지고 있다.
 
 
 3) Collection

 
 - Collection은 MongoDB Document의 그룹이다. 
 - Document들이 Collection내부에 위치하고 있으며, RDMS의 table과
   비슷한 개념이지만 RDMS와 달리 schema를 따로 가지고 있지 않는다. 
 - Document 부분설명에 나와있듯이각 Document들이 동적인 schema를 
   가지고 있다.
 
 4) Database
 
 - Database는 Collection들의 물리적인 컨테이너이다.
   각 Database는 파일시스템에 여러파일들로 저장된다.
 
    
 5) RDMS와의 비교
 
  - RDMS(Relational Database Management System:관계형 데이터베이스
    관리시스템)은 행과 열로 된 2차원의 table로 데이터를 관리하는 
    데이터베이스 시스템이다. Mysql, Oracle Database, DB2 등 

    

 
 [02]몽고 DB 설치

1.MongoDB 다운로드 및 설치 
 
 - 다운로드 :https://www.mongodb.com/download-center



 
 - MongoDB 공식 홈페이지의 다운로드 페이지에서 MSI 파일로 설치하면
   C:\Program Files\MongoDB\Server\3.2\bin\ 에 설치된다.

  
 
  

   
 
 - 기본 데이터베이스 디렉토리를 D:\javadb\mongodb\data\db 실행 전 폴더를 
   수동으로 만들어 준다.
 
 - CMD 창을 열어서 디렉토리로 들어가 mongod 를 실행하면 서버가 실행된다
 
 C:\Program Files\MongoDB\Server\3.2\bin\mongod --dbpath D:\javadb\mongodb\data\db
 
   

   
  
 - MongoDB가 실행되면 접속을 한다.
 
  C:\Program Files\MongoDB\Server\3.2\bin\mongo
 
      

   - 환경변수에 추가 Path=C:\Program Files\MongoDB\Server\3.2\bin;

 
[04] MongoDB CRUD Operation
[01] MongoDB CRUD Operation 
 - 참조:https://docs.mongodb.com/manual/crud/
 - 몽고DB의 CRUD(create,read,update,delete)연산은 별도의
   프로그래밍 언어가 아니며, 프로그래밍 언어의 API의 메소드
   또는 함수로 동작한다.
 - 몽고DB에서는 도큐먼트를 JSON형태로 전달하면서 2진 JSON인 
   BSON(Binary JSON)코드로 저장된다.
 - BSON은 경량화, 이식성 및 효율성을 고려하여 데이터 타입을
   정의한다.
 - BSON은 배열, 부울 대수, 자바스크립트 문자열, 정수, 실수,
   2진수 및 UTC시간, 타임스탬프, 도큐먼트 등의 데이터 형식을
   모두 활용할 수 있다.
 - 몽고DB는 컬렉션에 모든 도큐먼트를 저장하며, 컬렉션은 공유
   하는 3개의 인덱스셋을 갖는 관련 다큐멘트의 묶음이다.
 - 컬렉션은 관계형 모델의 테이블과 유사하다
 
 1) Create Operations
 - db.collection.insert()메소드는 컬렉션에 새로운 도큐먼트추가 

 
 
 - 사용자가 _id 필드없이 새로운 도큐먼트를 추가할 경우,
   클라이언트 라이브러리 또는 mongo 인스턴스는 _id를 추가하고
   유일한 Objectid를 부여한다.
 
 - 컬렉션에 도큐먼트 저장
  db.inventory.insert(
   {
    item:"ABC1",
    details:{
        model : "14Q3",
manufacturer : "xyz Company"
    },
    stock:[{size:"s",qty:25},{size:"M",qty:50}],
    category: "clothing"
   }
  )
 
 - inventory 컬렉션이 존재하지 않으면 컬렉션을 만들고 입력한다.
 
 - 입력된 도큐먼트 확인
  db.inventory.find()
 
 - 변수에 여러개의 도큐먼트를 저장한후 변수의 값(Documents)를
   저장한다.
 
 var mydocuments =
 [
   {
    item:"ABC2",
    details:{
        model : "14Q3",
manufacturer : "ABC Company"
    },
    stock:[{size:"M",qty:50}],
    category: "clothing"
   },
   {
    item:"ABC3",
    details:{
        model : "14Q3",
manufacturer : "CCC Company"
    },
    stock:[{size:"s",qty:25},{size:"M",qty:50},{size:"L",qty:50}],
    category: "clothing"
   },
    {
    item:"ABC3",
    details:{
        model : "14Q3",
manufacturer : "AAA Company"
    },
    stock:[{size:"s",qty:30}],
    category: "clothing"
   },
  ]
 
  db.inventory.insert(mydocuments)
 
 - 입력된 도큐먼트 확인
  db.inventory.find()

  


 
 2) Update Operations
 - db.collection.update()메소드로 갱신동작을 한다.
 - 컬렉션에 이미 존재하는 도큐멘트를 수정한다.
 - 어떠한 도큐먼트를 수정할것인지 결정하기 위해
   쿼리 기준을 정하거나 multi조건으로 다중 도큐먼트를
   갱신할 수 있다.

 
 - id 필드는 항상 도큐먼트의 첫번째 필드이다.
 - 필드이름을 다시 정하는 갱신동작은 도큐먼트의 필드
   순서를 다시 정할 수 있다.

 db.inventory.update(
 {item : "ABC2"},
 {
   $set:{
     category : "apparel",
     details:{model:"14Q3", manufacturer:"XYZ Company"}
   },
 
   $currentDate:{LastModified: true}
 
  }
 )
 
 - item : "ABC2"인 도큐먼트에 대해 $set과 같은 update
   연산자를 이용하여 수정한다.
 - $currentDate연산자를 사용하여 Lastmodified필드를 갱신한다.
 
 - 갱신실습을 위해 users컬렉션에 데이터를 입력한다.
 
 db.users.insertMany(
   [
     {
       _id: 1,
       name: "sue",
       age: 19,
       type: 1,
       status: "P",
       favorites: { artist: "Picasso", food: "pizza" },
       finished: [ 17, 3 ],
       badges: [ "blue", "black" ],
       points: [
          { points: 85, bonus: 20 },
          { points: 85, bonus: 10 }
       ]
     },
     {
       _id: 2,
       name: "bob",
       age: 42,
       type: 1,
       status: "A",
       favorites: { artist: "Miro", food: "meringue" },
       finished: [ 11, 25 ],
       badges: [ "green" ],
       points: [
          { points: 85, bonus: 20 },
          { points: 64, bonus: 12 }
       ]
     },
     {
       _id: 3,
       name: "ahn",
       age: 22,
       type: 2,
       status: "A",
       favorites: { artist: "Cassatt", food: "cake" },
       finished: [ 6 ],
       badges: [ "blue", "Picasso" ],
       points: [
          { points: 81, bonus: 8 },
          { points: 55, bonus: 20 }
       ]
     },
     {
       _id: 4,
       name: "xi",
       age: 34,
       type: 2,
       status: "D",
       favorites: { artist: "Chagall", food: "chocolate" },
       finished: [ 5, 11 ],
       badges: [ "Picasso", "black" ],
       points: [
          { points: 53, bonus: 15 },
          { points: 51, bonus: 15 }
       ]
     },
     {
       _id: 5,
       name: "xyz",
       age: 23,
       type: 2,
       status: "D",
       favorites: { artist: "Noguchi", food: "nougat" },
       finished: [ 14, 6 ],
       badges: [ "orange" ],
       points: [
          { points: 71, bonus: 20 }
       ]
     },
     {
       _id: 6,
       name: "abc",
       age: 43,
       type: 1,
       status: "A",
       favorites: { food: "pizza", artist: "Picasso" },
       finished: [ 18, 12 ],
       badges: [ "black", "blue" ],
       points: [
          { points: 78, bonus: 8 },
          { points: 57, bonus: 7 }
       ]
     }
   ]
)
 
 - Update 처리를 한다.
 - db.users.updateOne : 조건에 맞는 첫번째 도큐먼트만 수정한다.
 - db.users.updateMany :  조건에 맞는 모든 도큐먼트 수정.
 - "favorites.artist": "Picasso" : 조건기준
 - $set: { "favorites.food": "pie", type: 3 } : 변경될 데이터
 
 db.users.updateOne(
   { "favorites.artist": "Picasso" },
   {
     $set: { "favorites.food": "pie", type: 3 },
     $currentDate: { lastModified: true }
   }
)
 
db.users.updateMany(
   { "favorites.artist": "Picasso" },
   {
     $set: { "favorites.artist": "Pisanello", type: 3 },
     $currentDate: { lastModified: true }
   }
)
 
 
3) Delete Operations
- db.collection.remove()메소드로 삭제한다.
- users컬렉션의 status:D인 도큐멘트 모두를 삭제함

 
db.users.deleteOne( { status: "D" } )











5. 수업

진도: 

hw: 


6. 할것



'Programming' 카테고리의 다른 글

160824: 109회차  (0) 2016.08.24
160823: 108회차  (0) 2016.08.23
160819: 106회차  (0) 2016.08.19
160817: 105회차  (0) 2016.08.17
160816: 104회차  (0) 2016.08.16
Posted by DAVID

160819: 106회차

종료하기 전 티스토리 네이버 로그아웃 할 것



노오력



1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


01-8/16 - ㅊ1

02-8/17 - ㅊ2

03-8/18 - ㅁㅈ13

04-8/19 - ㅊ3

05-8/22 - ㅊ4

06-8/23 - ㅊ5

07-8/24 - ㅊ6

08-8/25 - ㅊ7

09-8/26 - ㅈㅌ14

10-8/29 - x

11-8/30 - x

12-8/31 - x

13-9/1  - ㅊ8

14-9/2  - ㅊ9

15-9/5  - ㅊ10

16-9/6  - ㅊ11

17-9/7  - ㅊ12


[01] NoSQL 개요, 종류
[01] NoSQL

1. NoSQL 개요
  - NoSQL은 Not Only SQL의 약자로 기존 RDBMS 형태의 관계형 데이터베이스가 
    아닌 다른 형태의 데이터 저장 기술을 의미함 
  - NoSQL이라고 해서 RDBMS 제품군(MS-SQL, Oracle, Sybase, MySQL) 등과
    같이 공통된 형태의 데이터 저장 방식(테이블)과 접근 방식(SQL)을 갖는 제품군이 
    아니라 RDBMS와 다른 형태의 데이터 저장 구조를 갖는다는 의미이며, NoSQL을 
    하나의 제품군으로 정의할 수는 없음
 
  1) KV(key/Value) Store
  - NoSQL에서 가장 기본이되는 것이다.
  - 오로지 속성은 key와 value만 존재한다. 
  - NoSQL에서 키는 관계형 데이터베이스의 PK(primary Key,주키)로 정의되고
    속성값들이 value에 데이터로 통합되어 저장되는 무척단순한 구조이다.
  - 이구조는 DynamoDB 등에서 사용되는 형식이다.

 

 

  2) 컬럼패밀리(Column Family)기본 모델
   - key/value모델의 확장된 모델이다.
   - 컬럼이 columns라는 속성에 데이터로 저장되고 value속성에는 해당 컬럼의 
     값만 존재한다. 
   - 관계형 데이터베이스에 성별이라는 컬럼이있다면 columns에 성별이 데이터로
     저장된고 value엔느 "남"또는 "여"라는 데이터가 저장된다.
   - 관계형 모델이 컬럼을 수직적으로 배열했다면, NoSQL 모델에서는 데이터를
     수평적으로 나열해 놓는 방식이다.
   - 관계형 모델에서 유연성을 극대화한 모델이라고 볼 수 있다.
   - 관계형 모델에서 테이블 생성시 컬럼명을 정의해 줘야 하고 컬럼이 추가되면
     테이블의 구조를 바꿔야 하지만, Column Family 테이블에선 구조변경이
     필요없고 새로운 데이터로 컬럼과 데이터를 입력만 하면된다.


 
 
  - NoSQL에서는 관계형 데이터베이스와 다르게 컬럼의 정의가 자유롭고 컬럼이 
    데이터로 NoSQL 데이터베이스에 입력 저장된다.
  - 관계형 데이터베이스에서는 테이블 생성시 정의된 고정 컬럼때문에 관계형 
    데이터베이스에서는 NULL로 관리되지만, NoSQL에서는 데이터가 존재하지 
    않으면 데이터를 입력할 필요가 없다. 디스크공간을 효율적으로 사용할 수
    있고 필요없는 정보는 관리할 필요가 없다.



 
 
2. NoSQL 종류
  - 가장기본적인 모델인  Key/Value Store
  - Key/Value Store에서 컬럼 개념을 확장하여 생성된 Column Family
  - 문서 저장에 적합한 Document Store 
  - 네트워크 구조인 Graph 구조에 적용하는 Graph 데이터베이스
  - 등 각 데이터베이스별 각각의 특성이 있고 사용 용도가 다르다.
  - NoSQL의 기본이 되는 Key/Value Store와 Column Family 데이터 구조에
    대해 알아본다.

 

1)KV(key/Value)Store
 - Nosql의 가장 기본적인 구조 
 - store는 DBMS가 아니라 단순한 데이터를
   저장하는 의미
 
 
 
Key Value구조
 
 - 대표적으로 사용하는 Key/value Store는 아마존 DynamoDB이다
 - DynamoDB는 테이블 생성을 아마존에서 제공하는 화면에서 직접 생성한다.
 - Table name과 Primary Key를 입력하고 테이블을 생성하는 절차를
   거치면 원하는 테이블이 생성된다.
 
2) DynamoDB 핵심 구성 요소 
 - DynamoDB 테이블에서, 항목 및 속성은 작업 시 필요한 핵심 구성 요소이다.
   테이블은 항목 집합이고, 각 항목은 속성 집합이다. 
 - DynamoDB는 기본 키를 사용하여 테이블의 각 항목을 고유하게 식별하고 
   보조 인덱스를 사용하여 보다 유연하게 쿼리를 작성하도록 해 준다.
 - DynamoDB Streams를 사용해서는 DynamoDB 테이블의 데이터 수정 이벤트를
   캡처할 수 있다.
 
 ** 항목 **
   a. 테이블, 항목 및 속성
   . 테이블:다른 데이터베이스 시스템과 마찬가지로 DynamoDB는 데이터를
          
테이블에 저장함. 
          테이블은 데이터의 집합이다. 예를 들어, 개인 연락처 정보를 저장하는 데 
          사용할 수 있는 People(아래에 표시됨)이라는 예제 테이블이 있다.
   . 항목 :각 테이블에는 여러 개의 항목이 있다. 항목은 모든 기타 항목 중에서 
          고유하게 식별할 수 있는 속성들의 집합이다. DynamoDB의 항목은 여러  
          가지 면에서 다른 데이터베이스 시스템의 행, 레코드 또는 튜플과 유사하다.
          예제 People 테이블에서 각 항목은 한 사람을 나타낸다.
   . 속성 :각 항목은 하나 이상의 속성으로 구성된다 속성은 기본적인 데이터 요소로서
          더 이상 나뉠 필요가 없는 것이다. DynamoDB의 속성은 여러 가지 면에서 
          다른 데이터베이스 시스템의 필드 또는 열과 유사하다.
          예를 들어, 예제 People 테이블의 항목에는 PersonID, LastName, 
          FirstName 등의 속성이 포함된다.


>>>People 테이블에 대한 내용
- People 테이블에서는 기본 키가 하나의 속성(PersonID)으로 구성.
  기본 키를 제외하고, People 테이블에는 스키마가 없다.이는 속성이나 데이터  
  형식을 미리 정의할 필요가 없음을 의미한다.
- 각 항목에는 자체의 고유 속성이 있을 수 있다.
  대부분의 속성은 스칼라인데, 이는 하나의 값만 가질 수 있다
  문자열 및 숫자가 스칼라의 일반적인 예이다.
- 일부 항목은 내포 속성(Address)을 갖는다. -
  DynamoDB는 최대 32 수준 깊이까지 내포 속성을 지원한다.
 
 

>>>Music 테이블에 대한 내용
  - Music의 기본 키는 두 개의 속성(Artist 및 SongTitle)으로 구성.
    테이블의 각 항목이 이러한 두 속성을 가지고 있어야 한다.
  - Artist와 SongTitle의 조합은 테이블의 각 항목을 다른 모든 항목과 구별한다.
    기본 키를 제외하고, Music 테이블에는 스키마가 없다.이는 속성이나 데이터 형식을
    미리 정의할 필요가 없다.
  - 각 항목에는 자체의 고유 속성이 있을 수 있다.
    항목 중 하나에는 내포 속성(PromotionInfo)이 있는데, 이 속성은 다른 내포 
    속성을 포함한다.

 
 b. 기본 키
   - 각 기본 키 속성은 스칼라여야 한다(즉, 단일 값만 가질 수 있음).
   - 기본 키 속성에 허용되는 데이터 형식은 문자열, 숫자 또는 이진수뿐이다.
     다른 키가 아닌 속성에는 이러한 제한이 없다.
   - 예로는 파티션 키와 파티션 및 정렬 키(복합키)
 
 c. 보조 인덱스
    - DynamoDB는 인덱스를 사용하도록 요구하지는 않으면서도 데이터를 쿼리할 때 
      애플리케이션에 보다 많은 유연성을 제공한다.
    - DynamoDB는 두 가지 종류의 인덱스를 지원한다.
    - Global secondary index :
      파티션 키 및 정렬 키가 테이블의 파티션 키 및 정렬 키와 다를 수 있는 인덱스.
    - Local secondary index  :
      테이블과 파티션 키는 동일하지만 정렬 키는 다른 인덱스.
 
 d. DynamoDB Streams
    - DynamoDB Streams는 DynamoDB 테이블의 데이터 수정 이벤트를 캡처하는 
      선택적 기능이다. 이러한 이벤트에 대한 데이터가 이벤트가 발생한 순서대로
      거의 
실시간으로 스트림에 표시된다.
 
    - 각 이벤트는 스트림 레코드에 의해 나타납니다. 테이블에서 스트림을 설정하면,
      이벤트 중 하나가 발생할 때마다 DynamoDB Streams가 스트림 레코드를 기록함.
 
    - 이벤트종류는 테이블에 새로운 항목 추가,항목 업데이트, 항목 삭제등이 있다.

 
2) Column Family
  - Key/Value모델이 한 단계 발전한 모델이다.
  - 테이블에 데이터가 입력될 때 컬럼도 데이터로 저장됨
  - Cassandra와 HBase데이터베이스가 Column Family의 종류이다.
  - Cassandra는 Column Family대신 Super Column이라 한다.
  - 용어
  a. 테이블
     관계형 모델의 테이블과 동일한 개념이다.
  b. Row
     관계형 모델에서 튜플(Tuple)에 해당하는 개념이다.
     관계형 모델에서는 row 형태로 데이터베이스에 저장되지만 NoSQL에서는
     논리적으로 설계하기 위한 모델이고 실제 저장되는 단위는 아님
  c. Column Family
    관계형 모델에서는 존재하지 않는 구조체 모델로  NoSQL 모델에서 특히
    Column Family 모델에서 사용된다.
  d. Cell
    관계형 모델에선 튜플인 row 단위로 데이터베이스에 저장되므로 row까지
    관리되지만 NoSQL에서는 row를 컬럼 단위로 다시 분해해 저장하는데 
    이value 단위를 cell이라고 한다.

 
     

    


  - NoSQL Column Family / 관계형 데이터베이스 비교

  

  관계형 DB - 사원테이블, 최종학력테이블 ,여권정보

 
   
 
 
    - HBase와 Cassandra 테이블 생성 
    - HBase에서  userinfotable 테이블 생성및 put로 자료 등록
 
   
 
 - HBase에서 Scan를 사용해서 내용 확인
  
 
  - Cassandra에서 테이블 생성및 자료등록 내용확인

  
  
 
    

   



5. 수업

진도: 

hw: 


6. 할것



'Programming' 카테고리의 다른 글

160823: 108회차  (0) 2016.08.23
160822: 107회차  (0) 2016.08.22
160817: 105회차  (0) 2016.08.17
160816: 104회차  (0) 2016.08.16
160809: 103회차  (0) 2016.08.09
Posted by DAVID

160817: 105회차

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:



그리고 제안서 기술서 포트폴리오 첨부해 놓기

사람인 


4. 공부하는 것


[15] Django Framework를 이용한 웹프로그래밍

[01]Django를 이용한 웹프로그래밍
 
1. Django Framework
 
 - Django는 파이썬으로 만들어진 무료 오픈소스 웹 어플리케이션 프레임워크
 
 - 쉽고 빠르게 웹사이트를 개발할 수 있도록 돕는 구성요소로 이루어진 
   웹 프레임워크.
 
 - 공통모듈에 해당하는 회원가입, 로그인, 로그아웃과 같이 사용자 인증을 다루는 방법이나 
   웹사이트의 관리자 패널, 폼, 파일 업로드와 같은 것등 새로운 웹 사이트를 개발할 때 
   바로 사용할 수 있는 구성요소들을 갖춘 프레임워크
 
 - 새로운 웹사이트를 개발할 때 뒤따르는 간접비용의 부담을 덜어준다.
 
 - 새로운 request의 url은 urlresolver에서 처리할 model를 거쳐 보여줄 view를 검색하여
   브라우저에 response된다.
 
2. Django 설치
 
  1) 가상환경: Django Framework의 버전이 달라지면 생성된 애플리케이션에 또한 영향을
     미치므로 가상환경을 이용하여 Python/Django를 설치할것을 권장함.
     - 프로젝트 기초 전부를 Python/Django와 분리시켜준다. 웹사이트가 변경되어도 
       개발 중인 것에 영향을 미치지 않다는 것입니다. (생략가능)
 
  2) Python 설치
     - 다운:https://www.python.org/downloads/
     - 2.7.X or 3.5.X 버전 선택
     - C:\Python27
     - 시스템 환경변수설정
     - path=C:\Python27;~
     - cmd에서 python --version 으로 설치확인
 
 
  3) Django 설치
     - 다운:https://www.djangoproject.com/download/


 
     - 1.9 or 1.10 버전선택
     - 압축풀기: tar.gz 파일 압축풀고 설치
       C:\Django-1.9.9
     - 설치:cmd에서 설치폴더로 이동후 python setup.py install
     - C:\Django-1.9.9\django\bin\django-admin.py 파일을
       파이썬 설치폴더 C:\Python27로 이동
     - C:\Django-1.9.9폴더 삭제해도 됨
     - cmd에서 django-admin.py --version 설치확인
 
 
  4) Django 프로젝트 생성후 Helloword 브라우저로 출력
     - New Project -> PyDev -> PyDev Django project
     - 프로젝트명:web_python


 
     - Django server 실행 -> 브라우저에서 확인




 
 
     - Helloworld 출력하기 위한 새로운 application 생성
 
    - web_python 우클릭-> Django -> Create application(manage.py startapp) 

  

 
    - web_python -> web_python(패키지)-> setting.py
    - Time-Zone내용변경 및  Static_Root 경로 설정(css 경로설정을 위해)


 
 
     """
Django settings for web_python project.
 
Generated by 'django-admin startproject' using Django 1.9.9.
 
For more information on this file, see
https://docs.djangoproject.com/en/1.9/topics/settings/
 
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.9/ref/settings/
"""
 
import os
 
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 
 
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/
 
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '*=6ck#5l((0++(5k$!mfsl_lye90)er*^pb0ovac!!gb+d%=4r'
 
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
 
ALLOWED_HOSTS = []
 
 
# Application definition
 
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
 
MIDDLEWARE_CLASSES = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
 
ROOT_URLCONF = 'web_python.urls'
 
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
 
WSGI_APPLICATION = 'web_python.wsgi.application'
 
 
# Database
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases
 
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
 
 
# Password validation
# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators
 
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]
 
 
# Internationalization
# https://docs.djangoproject.com/en/1.9/topics/i18n/
 
LANGUAGE_CODE = 'en-us'
 
TIME_ZONE = 'Asia/Seoul'
 
USE_I18N = True
 
USE_L10N = True
 
USE_TZ = True
 
 
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
 
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
 
 
 
    - web_python -> web_python(패키지)-> urls.py
    - 아래 url의 Helloworld는 application 명과 같아야 함. 
      url(r'^Helloworld/', include('Helloworld.urls')),
 
 
"""web_python URL Configuration
 
The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/1.9/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url ,include
from django.contrib import admin
 
urlpatterns = [
    url(r'^Helloworld/', include('Helloworld.urls')),
    url(r'^admin/', admin.site.urls),
]
 
 
 
   - Helloworld(패키지)-> urls.py 생성
 
 
from django.conf.urls import url
from . import views
 
urlpatterns = [
     url(r'^$', views.index, name='index'),
 ]
 
 
   - Helloworld(패키지)-> views.py 아래내용으로 변경
 
 
   from django.http import HttpResponse
 
# Create your views here.
def index(request):
    return HttpResponse("Hello, world. Let's Django!!")
 
 
   - Django 서버실행후 브라우저에서 http://127.0.0.1:8000/Helloworld 확인
 
 
 
3. web_python 프로젝트에 blog 애플리케이션 만들기
  - blog에 글목록/글상세
  - sqlite3을 이용해서 ORM 사용(sql문이 전혀사용안함) - 오브젝트 릴레이티드 매핑
 
  1) Django -> Create application (manage.py startapp)-> blog
 
   - web_python/settings.py  33Line~41Line 쯤 blog 추가
 
        :
    INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
]
 
        :
 
  2) Django Model 정의 : blog/models.py에 아래 코드 저장
 
  - 장고 안의 모델은 객체의 특별한 종류이다.
  - 이 모델을 저장하면 그 내용이 데이터베이스에 저장되는 것이 특별한 점이다.
  - 블로그 글을 위한 장고 모델을 만든다.
 
from django.db import models
from django.utils import timezone
 
 
class Post(models.Model):
    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length=200) - 좀 작은 내용
    text = models.TextField() - 얘는 좀 큰 내용
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)
 
    def publish(self):
        self.published_date = timezone.now()
        self.save()
 
    def __str__(self):
        return self.title
 
 
  - models.Model은 Post가 장고 모델임을 의미함
  - 이 코드 때문에 Post가 데이터베이스에 저장 된다.
  - title, text, created_date, published_date, author속성을 정의함. - 컬럼에 연관되는 필드 같은 것
  - 각 필드마다 데이터 타입은 텍스트, 숫자, 날짜, 유저 등이 있다.
 
  - models.CharField - 글자 수가 제한된 텍스트를 정의할 때 사용한다.
    글 제목같이 대부분의 짧은 문자열 정보를 저장할 때 사용한다.
  - models.TextField - 글자 수에 제한이 없는 긴 텍스트를 위한 속성이다.
    블로그 콘텐츠등
  - models.DateTimeField - 이것은 날짜와 시간을 나타냄
  - models.ForeignKey - 다른 모델에 대한 참조를 의미한다.
 
  3)데이터베이스에 모델을 위한 테이블 만들기
 
  - 데이터베이스에 우리의 새 모델, Post 모델을 추가한다.
  - 장고는 데이터베이스에 바로 반영할 수 있도록 마이그레이션 파일
    (migration file)을 준비하고 있다.
  
  - eclipse : web_python->Django->Make migrations .....
 
  
 
  - 실제 데이터베이스에 모델 추가를 반영한다.
  - eclipse : web_python->Django->Migrate .....

   

 
 
 4) Django 관리자로 글추가/수정/삭제
 
  - 조금전 모델링한 글들을 장고 관리자에서 추가,수정,삭제할 수 있다.
 
  - blog/admin.py 파일을 열어서 내용을 다음과 같이 바꿈
 
from django.contrib import admin
from .models import Post
 
admin.site.register(Post)
 
 - 앞에서 정의했던 Post 모델을 가져오고(import) 있다.
 - 관리자 페이지에서 만든 모델을 보려면 admin.site.register(Post)
   로 모델을 등록해야한다.
 
 - python manage.py runserver 실행후 



 
 - 브라우저에서 http://127.0.0.1:8000/admin/ 입력후 로그인창 확인
 - 로그인을 위해서 모든 권한을 가지는 슈퍼유저(superuser)를 생성해야함.
 - 커맨드라인에서 python manage.py createsuperuser을 입력후, 
   사용자 이름 (소문자, 공백 없이), 이메일 주소 및 암호를 입력한다.

 
 username : blog
 email : blog@blog.com
 password : blog1234
 
 - python manage.py runserver 실행후 다시 브라우저에서 
   http://127.0.0.1:8000/admin/ 입력후 로그인후 몇개의 글등록를 함.
 
 
 5) Django의 URL과 정규표현식
 
 - 어플리케이션은 URL을 입력한 사용자에게 어떤 내용을 보여줘야한다.
 - 장고는 URLconf (URL configuration)를 사용하며, URLconf는 
   장고에서 URL과 일치하는 뷰를 찾기 위한 패턴들의 집합이다.
 - web_python/urls.py파일을 열면 아래와 같다.
 
from django.conf.urls import url ,include
from django.contrib import admin
 
urlpatterns = [
    url(r'^Helloworld/', include('Helloworld.urls')),
    url(r'^admin/', admin.site.urls),
]
 
 - admin/ 또는 Helloworld/로 시작하는 모든 URL을 장고가 view와 
   대조해 찾아낸다는 뜻.
 - 이때 사용한것이 정규표현식이다.
 
 ^ 문자열이 시작할 ?
 $ 문자열이 끝날 때
 \d 숫자
 + 바로 앞에 나오는 항목이 계속 나올 때
 () 패턴의 부분을 저장할 때
 
 - web_python/urls.py에 다음 url를 추가함.
   url(r'', include('blog.urls')),
   의미는 http://127.0.0.1:8000 요청될때 blog.urls를 참조함.
 
 
from django.conf.urls import url ,include
from django.contrib import admin
 
urlpatterns = [
    url(r'^Helloworld/', include('Helloworld.urls')),
    url(r'^admin/', admin.site.urls),
    url(r'', include('blog.urls')),
 
 
 - blog/urls.py 파일 생성 하여 다음 작성
 - 'http://127.0.0.1:8000/' 요청하면 views.post_list를 보여줌
 - views가 없어서 오류남.
 
from django.conf.urls import url
from . import views
 
urlpatterns = [
      url(r'^$', views.post_list, name='post_list'),
 ]
 
 
 
 6) Django의 뷰 만들기
 
 - blog/views.py에 다음 작성.
 - post_list메서드는 요청(request)을 넘겨받아 render 메서드를 호출.
   render 메서드는 넘겨진 요청(request)과 blog/post_list.html 
   페이지를 받아 그 내용이 브라우저에 보여지게 된다.
 
from django.shortcuts import render
 
# Create your views here.
def post_list(request):
    return render(request, 'blog/post_list.html', {})
 
 
 - 브라우저에 보여줄 파일은 templates폴더안 애플리케이션이름과 동일한
   blog폴더안에 생성함.
 - blog/template/blog/post_list.html 작성
 - python manage.py runserver 실행후 http://127.0.0.1:8000 확인
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
        <body>
            <div>
                <h1><a href="">Django Girls Blog</a></h1>
            </div>
 
            <div>
                <p>published: 14.06.2014, 12:14</p>
                <h2><a href="">My first post</a></h2>
                <p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>
            </div>
 
            <div>
                <p>published: 14.06.2014, 12:14</p>
                <h2><a href="">My second post</a></h2>
                <p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut f.</p>
            </div>
        </body>
 
</html>
 
 7) Django ORM과 QuerySets
 
  - Django 데이터베이스 처리는 sql문이 없이 ORM방식으로 처리함.
  - QuerySets은 전달받은 모델의 객체 목록이다.
    쿼리셋은 데이터베이스로부터 데이터를 읽고, 필터를 걸거나 정렬한다.
 
  - Django shell에서 확인 
    cmd -> python manage.py shell
    eclipse -> web_python -> Django -> Shell with django environment
 
#포스팅된 글 모두 읽어오기
from blog.models import Post
Post.objects.all()
[<Post: test>, <Post: test>]
 
#등록된 계정 모두 읽어오기
User.objects.all()
[<User: blog>, <User: clare>]
 
#me 변수에 계정하나를 등록
me = User.objects.get(username='blog')
 
#새로운 글을 포스팅함
Post.objects.create(author=me, title='Sample title', text='Test')
<Post: Sample title>
 
#다시 모두 보여주기 
Post.objects.all()
[<Post: test>, <Post: test>, <Post: Sample title>]
 
#필터링하기
- 예를 들어, 우리는 blog라는 User가 작성한 모든 글을 검색을 할때 
  이런 경우 Post.objects.all()에서 all 대신, filter를 사용한다.
  author=me를 사용한다.
Post.objects.filter(author=me)
[<Post: test>, <Post: Sample title>]
 
 
#모든 글들 중, 제목(title)에 'title'이라는 글자를 포함한 것만 
Post.objects.filter( title__contains='title' )
[<Post: Sample title>]
 
#오늘날짜 이전에 작성된 글모여주기
from django.utils import timezone
Post.objects.filter(published_date__lte=timezone.now())
[<Post: test>, <Post: test>,<Post: Sample title>]
 
#바로전 작성된 글이 안보이면(생략가능)
post = Post.objects.get(title="Sample title")
post.publish()
 
Post.objects.filter(published_date__lte=timezone.now())
[<Post: test>, <Post: test>, <Post: Sample title>]
 
#정렬 (글생성될때 빠른 날짜순)
Post.objects.order_by('created_date')
[<Post: test>, <Post: test>, <Post: Sample title>]
 
#정렬(-는 역순)
Post.objects.order_by('-created_date')
[<Post: Sample title>, <Post: test>, <Post: test>]
 
#필터및 정렬
Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
[<Post: test>, <Post: test>, <Post: Sample title>]

 
 
8) 데이터베이스 내용 views페이지에 보여주기
 
 - blog/views.py 에 작성
 - posts 쿼리셋을 처리해서 views에 보낸다.
 
from django.shortcuts import render
from django.utils import timezone
from .models import Post
 
def post_list(request):
    posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    return render(request, 'blog/post_list.html', {'posts': posts})
 
 - blog/templates/blog/post_list.html
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <div>
    <h1><a href="/">Python Django Blog</a></h1>
    </div>
 
{% for post in posts %}
    <div>
        <p>published: {{ post.published_date }}</p>
        <h1><a href="">{{ post.title }}</a></h1>
        <p>{{ post.text|linebreaksbr }}</p>
    </div>
</body>
 
</html> 
 
 - blog/static/css/blog.css 생성
 - Django는 app폴더 안에 있는 "static" 폴더를 자동으로 찾아 안에 있는 
   내용을 인식함.
 
 .page-header {
    background-color: #ff9400;
    margin-top: 0;
    padding: 20px 20px 20px 40px;
}
 
.page-header h1, .page-header h1 a, .page-header h1 a:visited, .page-header h1 a:active {
    color: #ffffff;
    font-size: 36pt;
    text-decoration: none;
}
 
.content {
    margin-left: 40px;
}
 
h1, h2, h3, h4 {
    font-family: 'Lobster', cursive;
}
 
.date {
    float: right;
    color: #828282;
}
 
.save {
    float: right;
}
 
.post-form textarea, .post-form input {
    width: 100%;
}
 
.top-menu, .top-menu:hover, .top-menu:visited {
    color: #ffffff;
    float: right;
    font-size: 26pt;
    margin-right: 20px;
}
 
.post {
    margin-bottom: 70px;
}
 
.post h1 a, .post h1 a:visited {
    color: #000000;
}
 
 
 - blog/templates/blog/post_list.html css 및 bootstrap
   적용으로 변경
 
{% load staticfiles %}
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Python Django Blog/title>
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
        <link rel="stylesheet" href="{% static 'css/blog.css' %}">
    </head>
 
<body>
<div class="page-header">
    <h1><a href="/">Python Django Blog</a></h1>
</div>
 
<div class="content container">
    <div class="row">
        <div class="col-md-8">
            {% for post in posts %}
                <div class="post">
                    <div class="date">
                        {{ post.published_date }}
                    </div>
                    <h1><a href="">{{ post.title }}</a></h1>
                    <p>{{ post.text|linebreaksbr }}</p>
                </div>
            {% endfor %}
        </div>
    </div>
</div>
 
<body>
 
 - 기본 템플릿 페이지 만들기
 - blog/teamplates/blog/base.html 생성
 
 {% load staticfiles %}
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Python Django Blog</title>
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
        <link rel="stylesheet" href="{% static 'css/blog.css' %}">
    </head>
 
<body>
<div class="page-header">
    <h1><a href="/">Python Django Blog</a></h1>
</div>
 
<div class="content container">
    <div class="row">
        <div class="col-md-8">
            {% block content %}
            {% endblock %}
        </div>
    </div>
</div>
 
<body>
 
 
  - blog/post_list.html 기본템플릿을 적용하여 변경
 
{% extends 'blog/base.html' %}
 
{% block content %}
            {% for post in posts %}
                <div class="post">
                    <div class="date">
                        {{ post.published_date }}
                    </div>
                    <h1><a href="">{{ post.title }}</a></h1>
                    <p>{{ post.text|linebreaksbr }}</p>
                </div>
            {% endfor %}
 
{% endblock content %}
<body>
 
 
  - post_list.html 페이지 링크걸기
  - 상세페이지로 연결하는 링크 만들기
 
<h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1>
 
  - {% %} 표기는 장고 템플릿 태그를 말함. 
  - 요청 URL에 blog.views.post_detail는  post_detail view 이다. 
  - views는 views.py 파일의 이름에서 나온 것이며, 
    post_detail는 view 의 이름이다.
 
  - blog/urls/py에 views.post_detail를 추가
 
from django.conf.urls import url
from . import views
 
urlpatterns = [
    url(r'^$', views.post_list, name='post_list'),
    url(r'^post/(?P<pk>[0-9]+)/$', views.post_detail, name='post_detail'),
]
 
 
^post/(?P<pk>[0-9]+)/$ 의미
 
^은 "시작"이란 뜻 첫 부분 다음부터 나오는 post/는 URL이 post를
포함해야한다는 뜻이다.
 
(?P<pk>[0-9]+) 이 정규 표현식의 의미는 파라메터를 pk변수에 담아 
뷰로 전송하겠다는 뜻이다.
 
[0-9]은 문자를 제외하고, 숫자 0부터 9까지 하나의 숫자란 뜻이며,
+는 하나 또는 그 이상의 숫자가 와야한다는 것을 의미한다. 
 
/은 다음에 / 가 한번 더 와야 한다는 의미이다.
$은 그 뒤로 더이상 문자가 오면 안된다.
 
 - http://127.0.0.1:8000/post/5/입력하면, 장고는 post_detail인 
   view 를 찾으며 pk변수에 5를담아 view 로 정보를 보낸다
 
 - blog/views.py 추가
 
 
from django.shortcuts import render
from django.utils import timezone
from .models import Post
from django.shortcuts import render, get_object_or_404
 
def post_list(request):
    posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    return render(request, 'blog/post_list.html', {'posts': posts})
 
def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    return render(request, 'blog/post_detail.html', {'post': post})
 
 
 - blog/templates/blog/post_detail.html 생성후 작성
 
 - 서버실행후 브라우저에서 확인
 








5. 수업

진도: 

hw: 


6. 할것



'Programming' 카테고리의 다른 글

160822: 107회차  (0) 2016.08.22
160819: 106회차  (0) 2016.08.19
160816: 104회차  (0) 2016.08.16
160809: 103회차  (0) 2016.08.09
160808: 102회차  (0) 2016.08.08
Posted by DAVID

160816: 104회차

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


[14] SQLite3를 이용한 데이터베이스

[01]SQLite3를 이용한 데이터베이스
 
1. SQLite3의 파이썬 API

- 파이썬 자료형에 대응하는  SQLite3자료형
 
 
- 파이썬에는 SQLite3이 기본 탑재되어 있으므로 import문의 모듈추가로
  SQLite3 API를 사용할 준비가된다.
 
- import sqlite3
 
- SQLite3 API사용순서
 
1)커넥션(Conntion) 열기 
  - sqllite3.connect('d:javadb/python/sqlite/test.db')사용
  - test.db는 해당경로에 파일이 존재하면 열고 없으면 새로 생성
 
  import sqlite3
 
  conn = sqlite3.connect('d:javadb/python/sqlite/test.db')
 
  conn.close()
 
 
2)커서(Cursor)열기
  - cursor()메소드를 사용하여 생성.
  - sql문을 실행하는 임무를 담당함.
  - sql문을 실행하기위해 excute()메소드를 이용함.
  - 레코드추가/조회/수정/삭제 수행
 
  import sqlite3
 
  conn = sqlite3.connect('d:javadb/python/sqlite/test.db')
  cursor = conn.cursor()
 
  cursor.close()
  conn.close()
 
3)커서를 이용하여 테이블 생성 및 레코드 추가/조회/수정/삭제
 
- 테이블 생성
 
>>>> table.py
import sqlite3
 
conn = sqlite3.connect('d:/javadb/python/sqlite/test.db')
cursor = conn.cursor()
 
cursor.execute("""
CREATE TABLE PHONEBOOK 
(NAME CHAR(32), PHONE CHAR(32), EMAIL CHAR(64) PRIMARY KEY)
""")
 
cursor.close()
conn.close()
 
 
- 레코드 등록
- 레코드 추가/수정/삭제시 Connection의 commit()함수 호출
 
# -*- coding:utf-8 -*-
import sqlite3
 
conn = sqlite3.connect('d:javadb/python/sqlite/test.db')
conn.text_factory = str #한글 DB에 입력시 작성
cursor = conn.cursor()
 
cursor.execute("""
INSERT INTO PHONEBOOK (NAME, PHONE, EMAIL) 
VALUES(?, ?, ?)
""", ("김길동", '021-322-1542', 'kim@python.com'))
 
id = cursor.lastrowid
print(id)
 
cursor.execute("""
INSERT INTO PHONEBOOK (NAME, PHONE, EMAIL) 
VALUES(?, ?, ?)
""", ('박길동', '021-445-2424', 'park@python.com'))
 
id = cursor.lastrowid
print(id)
 
conn.commit()
 
cursor.close()
conn.close()
 
 
- 레코드 조회
- SELECT문의 결과를 얻어올때는 커서의 fetchone(),fetchall()
  사용 
# -*- coding:utf-8 -*-
import sqlite3
 
conn = sqlite3.connect('d:javadb/python/sqlite/test.db')
conn.text_factory = str #한글을 DB에서 조회시 사용
cursor = conn.cursor()
 
cursor.execute("SELECT NAME, PHONE, EMAIL FROM PHONEBOOK")
 
 
rows = cursor.fetchall()
for row in rows:
    print ("NAME: {0}, PHONE: {1}, EMAIL: {2} ".
        format(row[0], row[1], row[2]))
 
cursor.close()
conn.close()
 
 
 
- 레코드 수정
- 레코드 추가/수정/삭제시 Connection의 commit()함수 호출
 
# -*- coding:utf-8 -*-
import sqlite3
 
conn = sqlite3.connect('d:javadb/python/sqlite/test.db')
conn.text_factory = str #한글를 DB 입력시 작성
 
cursor = conn.cursor()
 
cursor.execute("""
UPDATE PHONEBOOK SET PHONE=?, EMAIL=? WHERE NAME=?
""", ('030-1234-0000', 'kim@dong.com', '김길동'))
 
conn.commit()
 
cursor.execute("""
SELECT NAME, PHONE, EMAIL FROM PHONEBOOK
WHERE NAME=?
""", ('김길동',))
 
rows = cursor.fetchall()
for row in rows:
    print ("NAME: {0}, PHONE: {1}, EMAIL: {2} ".
        format(row[0], row[1], row[2]))
 
cursor.close()
conn.close()
 
 
- 레코드 삭제
- 레코드 추가/수정/삭제시 Connection의 commit()함수 호출
 
import sqlite3
conn = sqlite3.connect(d:javadb/python/sqlite/test.db')
conn.text_factory = str #한글을 DB에서 조회시 사용
cursor = conn.cursor()
 
cursor.execute("""
DELETE FROM PHONEBOOK WHERE EMAIL=?
""", ('kim@dong.com',))
conn.commit()
 
cursor.execute("SELECT NAME, PHONE, EMAIL FROM PHONEBOOK")
 
rows = cursor.fetchall()
for row in rows:
    print ("NAME: {0}, PHONE: {1}, EMAIL: {2} ".
        format(row[0], row[1], row[2]))
 
cursor.close()
conn.close()
 
4)커서 닫기
5)커넥션 닫기



2. Eclipse에서 SQLite3 연결

 
1) sqlitejdbc-v53.jar 다운로드
   - 강사배포
 
2) Database Development -> New Connection Profile -> SQLite 선택
 
  
 
3) New Driver Definition -> sqlitejdbc-v53.jar 선택
 
   Database :TEST
   Database Location : d:javadb\python\sqlite3\test.db 선택및 입력
 
   Test Conntect 버튼 클릭
 
 

 
4) Data Source Explorer
   edit SQL statments 선택후 
   test.sql 파일을 현재작업하는 python프로젝트의 
   sqlite3폴더생성후 저장

 
 






  



5. 수업

진도: 

hw: 


6. 할것



'Programming' 카테고리의 다른 글

160819: 106회차  (0) 2016.08.19
160817: 105회차  (0) 2016.08.17
160809: 103회차  (0) 2016.08.09
160808: 102회차  (0) 2016.08.08
160805: 101회차  (0) 2016.08.05
Posted by DAVID

160809: 103회차

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것

[13] 모듈과 패키지

[01] 모듈과 패키지
1. 이름공간(Naming Space or Scope):이름이 존재하는 장소
 - 파이썬은 실행 시간에 각 이름들을 적절한 이름 공간에 넣어 관리한다.
 1) 이름 공간(스코프)의 종류 
  - 지역(Local): 각 함수 내부,  클래스 메소드 안. 객체 내부  
  - 전역(Global): 모듈 (파일) 내부, 모듈의 물리적인 단위 = 파일
  - 내장(Built-in): 파이썬 언어 자체에서 정의한 영역 
 2) 변수가 정의되는 위치에 의해 변수의 스코프가 정해짐 
  - 파이썬에서 변수의 정의->?변수가 l-value로 사용될 때 
  - 변수가 r-value로 사용될 때 해당 변수의 값을 아래 순서 규칙 
    에 따라 찾는다. L --> G --> B
  - a = 1 에서 a라고 하는 것이 =의 왼쪽에 존재 시 a는 ㅣ-value 
  - b = a 를 하게 되면 b는 l-value, a는 r-value 
  - L → G → B : a 값을 local, global, built-in 순서로 찾음 
 
 3) 지역변수와 전역변수
  - 변수의 스코프는 해당 변수가 l-value로서 정의되는 위치에 따라 달라짐
  - 변수가 함수 내에서 정의되면 해당 함수의 지역 변수가 된다.
 
# -*- coding:utf-8 -*-
# g, h는 전역 변수 
g = 10
h = 5
def f(a): # a는 지역 변수 
    h = a + 10 # h는 지역, 새로 l-value로 정의했음 
    b = h + a + g # b도 지역, g는 r-value이므로 기존 값을 참조 - 전역 변수 
    return b
print f(h) # 함수 호출시에 사용되는 변수는 해당 위치의 스코프에서 값을 찾음 - 전역 변수
print h # 전역 변수 h는 변함 없음
 
 
 
  - 함수 내부에서 전역 변수를 직접 사용하고자 할 때 -> global 키워드 활용
 
# -*- coding:utf-8 -*-
h = 5
def f(a):      # a는 지역
     global h   # h 변수를 전역이라고 미리 선언함
     h = a + 10 # h는 l-velue로 정의되더라도 미리 선언된 내용 때문에 전역 변수
     return h
print f(10)
print h        # 전역 변수 h 값이 함수 내에서 변경되었음
 
 
 
- 동일 함수 내에서 동일한 변수가 지역변수와 전역변수로 동시에 활용될 수 없음
- 함수 내에서 정의되는 변수는 지역 변수로 간주 
- 지역 변수로 선언되기 이전에 해당 변수를 사용할 수 없음
# -*- coding:utf-8 -*-
g = 10      
def f(): 
    a = g    # r-value로 사용되는 g는 전역 변수   
    g = 20   # 전역변수와 동일한 이름의 g를 생성하면오류(l-value)
    return a
print f()
 
 
# -*- coding:utf-8 -*-
g = 10      
def f(): 
    g = 20   # l-value로 새로운 지역변수 g선언
    a = g    # r-value로 사용되는 g는 바로위에서 생성한 지역변수(L->G->B)   
    return a
print f()
print g  #전역변수 g출력
 
 
# -*- coding:utf-8 -*-
g = 10      
def f(): 
    global g # g를 전역변수로 선언
    g = 20   # l-value g는 전역 변수 
    a = g    # g는 전역 변수   
    return a
print f()
print g
 
 4) 특정 공간의 이름 목록 얻기
  - 이름(Name) : 변수 (객체) 이름,함수 이름, 클래스 이름, 모듈 이름 
  - dir(): 함수가 호출된 스코프에서 정의되어 있는 모든 Name들을 
           문자열 리스트로 반환한다.
  - dir(object): object이 지니고 있는 모든 Name들을 문자열 리스트로 반환한다.
  - object = 함수, 특정객체, 클래스, 인스턴스, 모듈의 이름 등 
  - '__'로 시작되는 것들은 특수한 변수 또는 메소드
 
# -*- coding:utf-8 -*-
l = [] 
print dir(l)
print dir()
 
 5) 함수의 중첩 영역(Nested Scopes) 지원
  - Nested Scope: 함수 안에 정의되어 있는 함수에서는 
    가장 안쪽의 스코프부터 바깥쪽의 스코프쪽으로 변수를 찾는다.
  - 함수 안에 print x를 하면 가까운 x를 먼저 찾는다.
 
# -*- coding:utf-8 -*-
x = 2 
def F(): 
    x = 1 
    def G(): 
        print x 
    G()
F()
 
 
 
2.모듈
 - 파이썬 프로그램 파일로서 파이썬 데이터와 함수등을 정의하고 있는 단위
 - 서로 연관된 작업을 하는 코드들을 묶어서 독립성을 유지하되 재사용 가능하게 만드는 단위 
 - 모듈을 사용하는 측에서는 모듈에 정의된 함수나 변수 이름을 사용할 수 있음.
 - 파이썬 모듈이 정의되는 파일의 확장자: .py 
 - 다른 곳에서 모듈을 사용하게 되면 해당 모듈의 .py는 바이트 코드로 컴파일 되어
   .pyc로 존재한다.
 
 1) 모듈의 종류는 
   - 표준모듈 : 파이썬 언어 패키지 안에 기본적으로 포함된 모듈 ,math, string 
   - 사용자 생성 모듈 : 개발자가 직접 정의한 모듈 
   - 써드 파티 모듈 : 다른 업체나 개인이 만들어서 제공하는 모듈
 
 2) 사용자 모듈 생성및 사용
 
# -*- coding:utf-8 -*-
#File: mymath.py 
mypi = 3.14
def add(a, b): 
    return a + b
def area(r): 
    return  mypi * r * r
 
 
# -*- coding:utf-8 -*-
import mymath
print dir(mymath)    # mymath에 정의된 이름들 확인하기
print mymath.mypi # mymath 안에 정의된 mypi를 사용한다
print mymath.area(5) # mymath 안에 정의된 area를 사용한다
 
 
3) 클래스와 함수의 이름공간
 - 클래스도 독립적인 이름 공간
 - c.a = 1 --> 인스턴스 c 안에 a가 존재하고 a 값은 1 
 
   # -*- coding:utf-8 -*-
class C:            # 클래스도 독립적인 이름 공간
    a = 2           # 클래스 이름 공간 내에 변수 선언 
    pass            # pass까지가 클래스 정의
c = C()             # 클래스 인스턴스 객체 생성
c.a = 1             # 클래스에서 생성된 인스턴스 객체도 별도의 이름 공간
print c.a
c.a = 5
print c.__class__.a          # 클래스에서 정의된 a
print C.a
print c.a
 
 
 - 함수도 독립적인 이름 공간. 함수 내에서 선언된 로컬 변수는 함수 외부에서 
   접근할 수 없다.
 
# -*- coding:utf-8 -*-
x = 10    # 현재 모듈 내부에 정의되는 이름 
def f():
    a = 1 
    b = 2 # 현재 모듈에 정의되는 함수 f 내에 이름 a,b를 정의하고있다. 함수도 독립적인 이름 공간
    
f.c = 1 
print f.c 
print 
#print f.a  #주석풀면 오류
 

클래스 내에서 선언된 건 접근 가능
함수 내에서 선언된 변수는 접근 불가능 

 4) 모듈 검색경록
 - 파이썬이 모듈을 찾는 순서  
   * 이미 메모리에 로딩되어진 것 
   * 현재 디렉토리 (ipython에서 pwd 명령으로 확인 가능)   
   * PYTHONPATH 환경 변수에 기술된 디렉토리 목록을 차례로 탐색 
   * 표준 라이브러리 디렉토리들 -> sys 모듈 임포트 후 sys.path 로 확인 가능 
 
 - 이클립스에서 PYTHONPATH 설정 
 
 
 5) 모듈 import 하기
  - 이름 공간 mymath가 그대로 유지되므로 mymath.area() 형태로 자격 이름 사용 
# -*- coding:utf-8 -*-
import mymath
print mymath.area(5) 
 
  - from 모듈명 import 이름들 
  - 해당 모듈에 존재하는 지정 이름들을 현재 이름 공간으로 불러들인다.
  - import 하는 이름들이 기존에 미리 존재하고 있었다면 그 이름들에 의해 참조되던  
    기존 객체들은 상실된다. 
 
from mymath import area, mypi 
print area(5) 
 
  - import 뒤 * 사용하면 앞 이름공간의 모든 식별자를 import 
 
from mymath import * 
print area(5) 
 
  - import 모듈명 as 새로운 모듈 이름 
  - 기존 모듈 이름이 너무 길거나 현재 사용중인 다름 이름들과 충돌이 일어날 때 유용 
from string import replace as substitute 
print substitute
print substitute('ham chicken spam', 'chicken', 'egg') 
 
 
from string import replace as substitute, upper as up 
print up 
print up('abc') 
 
  - import 문은 보통의 문(statement)이 작성될 수 있는 곳이면 
    어디에서나 사용 가능 
 
# -*- coding:utf-8 -*-
def str_test(s): 
    import string
    t = string.split(s)
    return t 
 
print str_test("홍길 동 ")
 
 -import는 코드를 가져오기만 하는 것이 아니라 가져온 코드를 수행한다. 
# -*- coding:utf-8 -*-
#FILE : mymath.py 
mypi = 3.14  
def add(a, b): 
    return a + b  
def area(r):     
    return mypi * r * r  
 
print area(4.0)
 
------------------------------
import mymath
 
 
6) 모듈 실행과 테스트 
- __name__는 현재의 모듈이 최상위 모듈로서 수행되는지, 아니면 다른 모듈에 의해 
  import 되어 수행되는지를 구별하기 위해 주로 활용 
- prname.py를 직접 수행할 때의 출력 내용: __main__  
- prname.py가 최상위 모듈로서 수행됨을 의미 
- __main__ 값이 __name__에 할당되어 있음 
- __name__은 바로 수행해서 사용하고 있으므로 최상위 모듈 
 
 #FILE : prname.py 
 print __name__ 
 
실행결과 : __main__ 
 
- prname.py가 모듈로서 다른 이름 공간으로 import 되어질 때의 
- 다른 모듈에 의해 import 되어짐 → name 값은 모듈 이름 그대로 출력 
 
import prname 
print prname.__name__ 
 
실행결과 : prname
 
------------------------------------------------------
import string 
print string.__name__  
 
import re 
print re.__name__  
 
import mimetools 
print mimetools.__name__  
 
import os 
print os.__name__ 
 
실행결과:
string
re
mimetools
os
 
 
- 아래 코드는 최상위 모듈로서 수행될 때에 호출이 일어난다. 
- 보통 파이썬 모듈을 개발할 때에는 마지막 부분에 
  if __name__ == "__main__": 과    
  같은 코드를 추가하여 테스트 코드를 삽입한다. 
 
# -*- coding:utf-8 -*-
#file: module_test.py 
def add(a, b):     
    return a + b  
def f():     
    print "Python is becoming popular."   // 파이썬은 무조건 리턴값을 넣어줘야 하는데 타입을 안 넣으면 무조건 None을 리턴함!

if __name__ == "__main__":    
    print add(1, 10)     
    f()
 
실행결과:
11
Python is becoming popular.
 
 - import 했을때는 실행되지 않고 그모듈의 이름영역에 접근한다.
 
import module
module.add(10,11)
model.f()
 
 
3. 패키지
 1) 패키지 (Package) 
 - 여러 모듈들을 한데 묶어서 정리해 놓은 구조 
 - 물리적으로 여러 모듈 파일을 모아 놓은 디렉토리에 해당 
 - 최상위 디렉토리 이름이 패키지 이름이 된다. 
 - 최상위 디렉토리 하위에 여러 서브 디렉토리는 해당 최상위 패키지의 하위 패키지가 된다. 
 - 각 패키지 폴더마다 __init__.py 파일 존재한다.

 
 
 2) 패키지 import
 - package1/package2/pactest.py
 
 def train(): 
    print "Train"
    pass
def loadModel(): 
    print "LoadModel" 
    pass
def saveModel(): 
    print "SaveModel"    
    pass
 
------------------------------------------
 
# -*- coding:utf-8 -*-
import package1.package2.pactest
print package1.package2.pactest.train()
print package1.package2.pactest.loadModel()
print package1.package2.pactest.saveModel()
 
 
# -*- coding:utf-8 -*-
from  package1.package2 import pactest
print pactest.train()
print pactest.loadModel()
print pactest.saveModel()
 
 
# -*- coding:utf-8 -*-
from  package1.package2.pactest import train, loadModel, saveModel
print train()
print loadModel()
print saveModel()
 
 
# -*- coding:utf-8 -*-
from  package1.package2.pactest import *
print train()
print loadModel()
print saveModel()




5. 수업

진도: 

hw: 


6. 할것



'Programming' 카테고리의 다른 글

160817: 105회차  (0) 2016.08.17
160816: 104회차  (0) 2016.08.16
160808: 102회차  (0) 2016.08.08
160805: 101회차  (0) 2016.08.05
160804: 100회차  (0) 2016.08.04
Posted by DAVID