NumPyNumerical Python의 줄임말로, 파이썬에서 산술 계산을 위한 가장 중요한 필수 패키지 중 하나다. 과학 계산을 위한 대부분의 패키지는 NumPy의 배열 객체를 데이터 교환을 위한 공통 언어처럼 사용한다. 

 

1. Numpy에서 제공하는 것

  • 효율적인 다차원 배열인 ndarray는 빠른 배열 계산과 유연한 브로드캐스팅 기능을 제공한다.
  • 반복문을 작성할 필요 없이 전체 데이터 배열을 빠르게 계산할 수 있는 표준 수학 함수
  • 배열 데이터디스크에 쓰거나 읽을 수 있는 도구와 메모리에 적재된 파일을 다루는 도구
  • 선형대수, 난수 생성기, 푸리에 변환 기능
  • C, C++, 포트란으로 작성한 코드를 연결할 수 있는 C API

NumPy의 C API는 사용하기 쉬우므로 저수준 언어로 작성된 외부 라이브러리에 데이터를 전달하거나 반대로 외부 라이브러리에서 NumPy 배열 형태로 파이썬에 데이터를 전달하기 용이하다. 이 기능은 파이썬으로 레거시 C, C++, 포트란 코드를 감싸서 동적이며 쉽게 사용할 수 있는 인터페이스를 만들 수 있도록 해준다.

 

NumPy 자체는 모델링이나 과학 계산을 위한 기능을 제공하지 않으므로 먼저 NumPy 배열과 배열 기반 연산에 대한 이해를 한 다음 pandas 같은 배열 기반 도구를 사용하면 훨씬 더 효율적이다. NumPy만으로도 방대한 주제이므로 브로드캐스팅 같은 NumPy의 고급 기능은 부록 A에서 따로 다루도록 하겠다.

 

2. 데이터 분석 애플리케이션에서 중요하게 생각하는 기능

  • 벡터 배열 상에서 데이터 가공(데이터 먼징 또는 데이터 랭글링), 정제, 부분집합, 필터링, 변형 그리고 다른 여러 종류의 연산을 빠르게 수행
  • 정렬, 유일 원소 찾기, 집합 연산 같은 일반적인 배열 처리 알고리즘
  • 통계의 효과적인 표현과 데이터를 수집 요약하기
  • 다양한 종류의 데이터를 병합하고 엮기 위한 데이터 정렬과 데이터 간의 관계 조작
  • 내부에서 if - elif - else를 사용하는 반복문 대신 사용할 수 있는 조건절 표현을 허용하는 배열 처리
  • 데이터 붂음 전체에 적용할 수 있는 수집, 변형, 함수 적용 같은 데이터 처리

NumPy는 일반적인 산술 데이터 처리를 위한 기반 라이브러리를 제공하기 때문에 많은 독자가 통계나 분석, 특히 표 형식의 데이터를 처리하기 위해 pandas를 사용하기 원할 것이다. 또한 pandas는 Numpy에는 없는 시계열 처리 같은 다양한 도메인 특화 기능을 제공한다.

 

3. NumPy가 대용량 데이터 배열을 효율적으로 다룰수 있는 이유

  • NumPy는 내부적으로 데이터를 다른 내장 파이썬 객체와 구분된 연속된 메모리 블록에 저장한다. NumPy의 각종 알고리즘은 모두 C로 작성되어 타입 검사나 다른 오버헤드 없이 메모리를 직접 조작할 수 있다. NumPy 배열은 또한 내장 파이썬의 연속된 자료형들보다 훨씬 더 적은 메모리를 사용한다.
  • NumPy 연산은 파이썬 반복문을 사용하지 않고 전체 배열에 대한 복잡한 계산을 수행할 수 있다.

 

'Data organization > Numpy' 카테고리의 다른 글

NumPy ndarray(다차원 배열 객체)  (0) 2021.02.19

람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions)를 지칭하는 용어다.

 

람다 함수는 간단히 말하자면 수학에서 사용하는 함수를 보다 단순하게 표현하는 방법.

 

람다 함수(익명 함수 (Anonymous functions))이름을 가질 필요가 없다.

 

람다 함수는 코드가 간결하다는 장점이 있어 사용 시 코딩을 깔끔하게 할 수 있다 

 

일반 함수와 람다 함수를 비교할 수 있게 예제를 살펴보면,

short_function(x)라는 함수가 있고, equiv_anon(x)라는 람다 함수가 있다. 이 둘에 '3'이라는 숫자를 넣어주면 6이라는 같은 결과값을 얻게 된다.

 

 

또 다른 활용으로는 함수에 list와 람다 함수를 전달하면 그에 맞는 결과값을 가져올 수 있다.

apply_to_list에 ints와 람다 함수를 전달하여 [8, 0, 2, 10, 12]의 리스트가 완성되었다.

 

만약 수식이 자주 바뀌는 경우 이러한 식으로 람다 함수만 변경하여 전달한다면 원하는 리스트를 만들 수 있게 된다.

 

1. 상대 경로를 전개하는 방법

 

상대 경로를 전개할 때는 urllib.parse.urljoin()을 사용

 

from urllib.parse import urljoin

 

base = "http://example.com/html/a.html"

 

print(urljoin(base, "b.html"))

print(urljoin(base, "/hihi/c.html"))

print(urljoin(base, "./hehe/d.html"))

print(urljoin(base, "../haha/e.html"))

 

이렇게 4가지 경우를 만들어 프로그램을 돌릴 경우 결과는,

상대 경로

1. urljoin(base, "b.html")의 경우 html/b.html로 마지막의 부분(a.html -> b.html)이 변경.

 

2. urljoin(base, "/hihi/c.html")의 경우 html/a.html이 모두 사라지고 com뒤에 /hihi/c.html가 되어 경로 변경.

 

3. urljoin(base, "./hehe/d.html")의 경우  첫 번째와 마찬가지로 마지막 부분(a.html -> hehe/d.html)이 변경.

 

4. urljoin(base, "../haha/e.html")의 경우 두 번째와 마찬가지로 com뒤에 haha/e.html가 되어 경로가 변경.

 

2. 절대 경로를 설정하는 방법

from urllib.parse import urljoin

 

base = "http://example.com/html/a.html"

 

print(urljoin(base, "hoge.html"))

print(urljoin(base, "http://otherExample.com/wiki"))

print(urljoin(base, "//anotherExample.org/test"))

 

이렇게 3가지 경우를 만들어 프로그램을 돌릴 경우 결과는,

절대 경로

1. urljoin(base, "hoge.html")의 경우 hoge.html로 마지막의 부분(a.html -> hoge.htmll)이 변경. (상대 경로 설정)

 

2. urljoin(base, "/hihi/c.html")의 경우 http://example.com/html/a.html이 전부 사라지고 http://otherExample.com/wiki경로가 설정 

 

3. urljoin(base, "//anotherExample.org/test")의 경우 역시 http://example.com/html/a.html이 전부 사라지고 //anotherExample.org/test로 설정이 됩니다.

 

즉, 절대 경로는 //로 시작하거나 http://로 시작하는 경우 절대 경로로 설정된다는 것을 알 수 있습니다.

 

3. 예제 학습하기

앞에서 배운 내용을 토대로 python공식 홈페이지에서 파이썬 메뉴얼이 있는 홈페이지 경로를 다운 받아보겠습니다.

 

일단 홈페이지에 가서 확인을 먼저 하면, 

다음과 같이 되어있고,

 

import urllib.request as req

 

url = "https://docs.python.org/3.8/library/"

res = req.urlopen(url)

soup = BeautifulSoup(res, "html.parser")

links = soup.select("link[rel='stylesheet']")  # CSS선택자를 이용하여 links 설정

links += soup.select("a[href]")  # links에 a[href]에 있는 상대 경로들을 추가하여 links 설정

result = []  # result란 리스트를 만들어준다

 

# for문을 사용하여 경로를 설정해주고 이를 result에 저장

for a in links:

    href = a.aattrs['href']

    url = urljoin(base, href)

    result.append(url)

print(result)

 

다음과 같이 프로그램을 짜서 실행을 시킬 경우, result안에 홈페이지 경로들이 저장될 것입니다.

'AI > 데이터 수집' 카테고리의 다른 글

Selenium을 활용한 로그인  (0) 2021.02.02
requests 모듈의 메서드  (0) 2021.01.31
requests를 사용하여 로그인  (0) 2021.01.31
CSS 선택자  (0) 2021.01.25
파이썬을 활용하여 데이터 받아오기(urllib을 활용)  (0) 2021.01.24

데이터 수집을 하기 위한 방법 중 CSS 선택자를 활용하여 원하는 데이터를 가져올 수가 있는데요.

오늘은 CSS 선택자에 대해 알아보도록 하겠습니다.

 

1. 선택자 기본 서식

서식 설명
* 모든 요소를 선택
<요소 이름> 요소 이름을 기반으로 선택
.<클래스 이름> 클래스 이름 기반으로 선택
#<id 이름> id 속성을 기반으로 선택

 

2. 선택자들의 관계를 지정하는 서식

서식 설명
<선택자>, <선택자> 쉼표로 구분된 여러 개의 선택자를 모두 선택
<선택자> <선택자> 앞 선택자의 후손 중 뒤 선택자에 해당하는 것을 모두 선택
<선택자> > <선택자> 앞 선택자의 자손 중 뒤 선택자에 해당하는 것을 모두 선택
<선택자> + <선택자> 같은 계층에서 바로 뒤에 있는 요소를 선택
<선택자> ~ <선택자> 선택자1부터 선택자2까지의 요소를 모두 선택

 

3. 선택자 속성을 기반으로 지정하는 서식

서식 설명
<요소>[<속성>] 해당 속성을 가진 요소를 선택
<요소>[<속성>=<값>] 해당 속성의 값이 지정한 값과 같은 요소를 선택
<요소>[<속성>~=<값>] 해당 속성의 값이 지정한 값을 단어로 포함(띄어쓰기로 구분해서 완전히 포함)하고 있다면 선택
<요소>[<속성>|=<값>] 해당 속성의 값으로 시작하면 선택(이때 하이픈 기호로 구분해서 확인)
<요소>[<속성>^=<값>] 해당 속성의 값이 지정한 값으로 시작하면 선택
<요소>[<속성>$=<값>] 해당 속성의 값이 지정한 값으로 끝나면 선택
<요소>[<속성>*=<값>] 해당 속성의 값이 지정한 값을 포함하고 있다면 선택

 

4. 예제로 살펴보기

다음과 같은 HTML 구성이 있을 때,

 

html = '''

<ul id='fruits'>

    <li id='apple'>Apple</li>

    <li id='banana'>Banana</li>

    <li id='orange'>Orange</li>

    <li id='mango'>Mango</li>

    <li id='melon'>Melon</li>

</ul>

'''

 

mango를 추출하기 위해 사용할 수 있는 선택자를 살펴보겠습니다.

 

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'html.parser')

 

fruit = lambda q: print(soup.select_one(q).string)

fruit("#mango")

fruit("li#mango")

fruit("ul > li#mango")

fruit("#fruits #mango")

fruit("#fruits > #mango")

fruit("#ul#fruits > li#mango")

fruit("li[id='mango']")

 

혹은

 

(주의) 0부터 시작할 경우 3은 4번째 요소가 된다

print(soup.select("li")[3].string)

print(soup.find_all("li")[3].string)

 

결과는

mango

mango

mango

mango

mango

mango

mango

mango

mango

가 될것입니다.

 

 

안녕하세요. 오늘은 파이썬을 활용하여 웹 사이트에 있는 데이터를 추출 해볼까 합니다.

 

우선 데이터를 받기 위해서 "urllib 라이브러리"를 사용할 예정입니다.

이 라이브러리를 이용하면 HTTP 또는 FTP를 사용해 데이터를 다운로드 할 수 있습니다.

 

urllib은 URL을 다루는 모듈을 모아놓은 패키지라고 할 수 있습니다.

 

그 중에서도 urllib.request 모듈은 웹 사이트에 있는 데이터에 접근하는 기능을 제공합니다.

 

데이터를 다운로드 하기 전에 데이터 url을 알아야 하는데요.

 

저는 데이터를 전부 받으면 용량이 너무 크기 때문에 간략히 네이버 로고정도만 다운로드를 할 예정입니다.

 

네이버 로고를 받기 위해서는,

 

1.  크롬 기준으로 오른쪽 위의 점 3개를 클릭 후 도구 더보기 -> 개발자 도구를 클릭하여 들어간다.

2. 빨간색 동그라미가 쳐진 부분을 클릭네이버 로고를 클릭해준다.

3. url을 복사한다.

이제 url을 알았으니 본격적으로 파이썬을 활용하여 이미지를 받도록 하겠습니다.

 

1. 파일 내 바로 저장하기

# 라이브러르 읽어 들이기
import urllib.request

 

# 원하는 url을 입력
url = "http://s.pastatic.net/static/www/mobile/edit/2020/1222/mobile_223827482666.png"


# 저장하고자 하는 파일 이름 입력
savename = "naver.png"

 

# 다운로드 실행(urlretrieve을 활용하여 바로 저장)
urllib.request.urlretrieve(url, savename)

 

이와 같이 코딩을 해서 실행해주면 다음과 같이 naver란 이름의 PNG파일이 저장됩니다.

 

2. 파이썬 메모리 위에 데이터를 올린 후 파일에 저장

# 라이브러르 읽어 들이기
import urllib.request

 

# 원하는 url을 입력
url = "http://www.kacn.org/image/main1.jpg"

 

# 저장하고자 하는 파일 이름 입력

savename = "natural.png"

 

# urlopen을 이용하여 메모리 위에 데이터를 올려놓음
natural_pic = urllib.request.urlopen(url).read()

 

# mode를 wb로하여 파일로 저장 (wb에서 w는 쓰기(write), b는 바이너리모드(binary를 의미))
with open(savename, mode="wb") as f:
    f.write(natural_pic)

이와 같이 코딩을 해서 실행해주면 다음과 같이 natural란 이름의 PNG파일이 저장됩니다.

 

 

만약 원하는 데이터가 바로 추출할 수 있다면 첫 번째 방법으로 처리가 가능하지만,

 

대부분의 데이터는 가공할 필요가 있기 때문에 2번째 방법이 더 많이 쓰이고 있습니다.

 

이상 파이썬을 활용하여 데이터를 가져오는 방법에 대하여 설명하였습니다.

'AI > 데이터 수집' 카테고리의 다른 글

Selenium을 활용한 로그인  (0) 2021.02.02
requests 모듈의 메서드  (0) 2021.01.31
requests를 사용하여 로그인  (0) 2021.01.31
상대경로 및 절대경로  (0) 2021.01.26
CSS 선택자  (0) 2021.01.25

+ Recent posts