no image
[Python] MySQL 데이터로 DataFrame 만들기
1. 필요한 패키지 - sqlalchemy - pymysql - mysqlclient !pip install sqlalchemy !pip install pymysql !pip install mysqlclient 2. 데이터베이스 연결 데이터베이스 접속 URL은 데이터베이스 종류마다 다름 별도의 패키지를 설치해야 하는 경우도 있음 포트는 3306이면 생략 가능 import pandas as pd from sqlalchemy import create_engine import pymysql #연결 connect = create_engine('데이터베이스종류://아이디:비밀번호@IP:포트/데이터베이스이름') df = pd.read_sql_table('테이블', connect) print(df) Empty Dat..
2024.02.14
[Python] 크롤링 - Selenium
1. 개요 - 웹 앱을 테스트하는데 사용하는 프레임워크 - WebDriver 라는 API를 이용해서 운영체제에 설치된 브라우저를 제어하는 프레임워크 - 크롤링을 할 때 JavaScript를 이용해서 비동기적으로 가져오는 데이터를 읽고자 할 때 이용할 수 있고 로그인 후 가져와야 하는 데이터를 읽어오는데 사용합니다. 메뉴얼: http://docs.seleniumhq.org/docs/ - 파이썬에서 사용 준비 pip install selenium 브라우저의 드라이버가 필요 크롬의 버전을 확인 https://googlechromelabs.github.io/chrome-for-testing/#stable 2. 크롬 브라우저 실행 1) 기본 API - 접속: get(url) - html 코드 읽어오기: page_..
2024.02.14
no image
[Python] 크롤링 - 기사 스크래핑
1. 검색어를 입력받아서 동아일보 신문 기사를 스크래핑해서 파일에 저장하기 1) 필요한 패키지 - urllib.parse.quote 함수: 검색어가 한글이라면 인코딩을 하기 위해서 - requests: 웹의 문자열을 읽어오기 위한 패키지, 기본 패키지가 아니라서 설치를 해야 함 - beautifulsoup: HTML 문자열에서 원하는 데이터를 추출하기 위해서 필요한 패키지, 기본 패키지가 아니라서 설치를 해야 함 !pip install requests !pip install beautifulsoup4 2) URL 확인 https://www.donga.com/news/search?sorting=1&check_news=91&search_date=1&v1=&v2=&more=1&query=%EB%8B%B9%EA..
2024.02.14
no image
[Python] Pandas
1. Pandas 패키지 - 데이터 분석을 위한 고수준의 자료구조, 분석 도구 제공 - 자료구조 Series: 열이 1개인 데이터 구조 DataFrame: 열이 2개 이상인 데이터 구조 2. Series - Index와 Value 1개를 가지는 자료구조 series (데이터, index=None, dtype=None, copy=False) 데이터: list, set, dict와 numpy.ndarray 가능 index: 데이터를 가리키는 이름 list · set · ndarray를 대입하면 0부터 시작하는 숫자 인덱스가 자동으로 생성 dict를 설정하면 key가 인덱스 index 옵션에 직접 인덱스 설정 가능 dtype 데이터 1개의 자료형으로 설정 -> 그 자료형으로 생성 설정 없음 -> pandas가..
2024.02.08
no image
[Python] Numpy
1. 특징 - Python에서 고성능의 과학적 계산 수행하는 패키지 (ex.선형 대수) - Python 머신러닝 스택의 기초 패키지 - 다차원 배열인 ndarray를 제공 - 벡터화 된 연산과 Broadcasting 연산 지원 2. 설치 pip install numpy *아나콘다는 자동 설치 *다른 패키지를 설치할 때 종속적으로 설치되는 경우가 있음 -> 버전 문제 발생 3. 사용 import numpy import numpy as np from numpy import * # 모듈의 모든 내용을 현재 모듈에서 사용 from numpy import ndarray # numpy 모듈 중에서 ndarray만 사용 import *을 쓰면 nupmy 써주지 않아도 사용할 수 있지만, 내장함수인지 구분이 가지 않음..
2024.02.06
no image
[Tableau] 대시보드
하나 이상의 목표를 달성할 때 필요한 가장 중요한 정보의 시각적 디스플레이 하나의 화면에 통합 및 정렬되어서 한눈에 정보를 모니터링 범례, 필터, 매개변수, 텍스트, 컨테이너, 이미지, 확장, 단추, 웹 개체와 같은 구성 요소와 함께 하나의 캔버스에 놓인 개별 시각화의 배열 데이터 스토리를 전달하는 단위 데이터 스토리 지침 - 메인 스토리와 관련 없는 모든 것은 제외 - 데이터 스토리는 목표가 있어야 하고 관련 없는 모든 것은 제외 - 쉽게 이해할 수 있도록 만들어야 하고 주요 아이디어는 명확하게! - 데이터 스토리를 읽는 청자가 결론을 도출할 수 있게 만든다. 대시보드 목적 - 안내 분석: 대시보드를 만드는 쪽에서 데이터분석 결과 발견 - 탐색: 결론을 당장 내리기 어려운 경우 대시보드는 탐색이 목적 ..
2024.02.06
no image
[Tableau] 기타 차트
라운드형 막대 막대 그래프에서 두께에 변화를 주는 형태로 작성 캘린더 차트 날짜 필드를 기준으로 달력의 형태 차트 요일별 혹은 평일/휴일 분리해서 패턴 파악 열: 주문일자 - 불연속형 년/월, 주문일자 - 불연속형 요일이름 행: 주문일자 - 불연속형 요일 주차 주문일자 - 텍스트 특정 월만 출력 [주문일자] 필터로 드래그 > 연도/월 > 날짜 선택 [수익] - 색상 마크 - 사각형 도넛 차트 파이 차트에서 가운데에 구멍을 뚫어놓은 도넛 모양 구멍에 추가 내용 또는 세부 정보를 전달할 수 있어서 파이차트보다 시각적인 효과 Good\ But 파이차트 계열은 데이터 수가 5개 이상이면 정보 전달 기능이 떨어짐 이런 경우는 사각형 차트 이용 Pyramid Bar & Diverging Chart 좌우 대칭이 되는..
2024.02.05
no image
[Tableau] 히스토그램
빈도수를 나타내는 그래프 쇼핑몰에서는 재구매에 걸리는 날짜가 중요 이 날짜를 이용해서 적절한 이벤트를 제시 고객 재구매 이력 히스토그램 - 재구매 날짜 간격을 알아보기 위해 계산 계산된 필드: 고객별 첫 주문일자 {FIXED [고객명] : MIN([주문 일자]) } 계산된 필드: 고객별 재주문일자 IIF([주문 일자] > [고객별 첫 주문일자], [주문 일자], NULL) 계산된 필드: 고객별 두번째 주문일자 {FIXED [고객명] : MIN([고객별 재주문일자]) } - 두번째 주문일자와 첫 주문일자 사이의 간격 계산 계산된 필드: 고객별 첫 주문 후 두번째 주문까지 걸린 날짜 DATEDIFF('day', [고객별 첫 주문일자], [고객별 두번쨰 주문일자]) - 히스토그램을 위한 구간차원 만들기 (Bi..
2024.02.05

1. 필요한 패키지

- sqlalchemy

- pymysql

- mysqlclient

!pip install sqlalchemy
!pip install pymysql
!pip install mysqlclient

 

2. 데이터베이스 연결

  • 데이터베이스 접속 URL은 데이터베이스 종류마다 다름
  • 별도의 패키지를 설치해야 하는 경우도 있음
  • 포트는 3306이면 생략 가능
import pandas as pd
from sqlalchemy import create_engine
import pymysql

#연결
connect = create_engine('데이터베이스종류://아이디:비밀번호@IP:포트/데이터베이스이름')
df = pd.read_sql_table('테이블', connect)
print(df)
Empty DataFrame
Columns: [num, name, vendor, description]
Index: []

 

테이블 가져와서 데이터프레임 만들기 

dataframe = pandas.read_sql_table('테이블이름', database_connection)

 

 

실습 데이터

create table dbms(
	num int(10) NOT NULL AUTO_INCREMENT,
	name varchar(255) NOT NULL,
	vendor varchar(255) NOT NULL,
	description varchar(255),
	PRIMARY KEY(num)
);

INSERT INTO dbms(name, vendor, description) values('Oracle', 'Oracle', '금융과 대기업에서 많이 사용하는 가장 안정적인 데이터베이스');

INSERT INTO dbms(name, vendor, description) values('HANA DB', 'SAP', '오라클 대체용으로 사용하는 데이터베이스로 현대 자동차에서 사용');

INSERT INTO dbms(name, vendor, description) values('MySQL', 'Oracle', '현재 가장 많이 사용한다고 알려진 관계형 데이터베이스로 중소 기업이나 플랫폼 기업에서 주로 이용');

INSERT INTO dbms(name, vendor, description) values('Maria DB', 'Open Source', 'MySQL의 fork로 현재는 Kakao에서 사용하고 있습니다.');

INSERT INTO dbms(name, vendor, description) values('PostgreSQL', 'Open Source', '요즈음 많이 사용되는 데이터베이스');

.

import pandas as pd
from sqlalchemy import create_engine
import pymysql

#연결
connect = create_engine('mysql+mysqldb://root:0000@localhost/python_dataframe')
df = pd.read_sql_table('dbms', connect)
print(df)

 

 

 

3. 그 외의 데이터 사용

1) R의 데이터 활용

- pyreadr 이라는 패키지를 사용

- 읽는 방법

pyreadr.readr('rds 파일 경로')[None]

 

2) 통계 프로그램 데이터 읽어오기

- pyreadstat 패키지를 이용하면 SPSS, Stata, SAS 프로그램의 데이터를 읽을 수 있음

 

3) 최근 pySpark의 dataframe을 이용하는 경우가 많음

-  pySpark가 가져올 수 있는 데이터의 종류가 더 많고
- pySpark에서는 SQL을 그대로 사용할 수 있기 때문에 SQL을 아는 것이 중요

 

'Python' 카테고리의 다른 글

[Python] 데이터 시각화  (0) 2024.02.14
[Python] 데이터 탐색  (0) 2024.02.14
[Python] 크롤링 - Selenium  (0) 2024.02.14
[Python] 크롤링 - 기사 스크래핑  (0) 2024.02.14
[Python] Pandas  (1) 2024.02.08

[Python] 크롤링 - Selenium

0ㅑ채
|2024. 2. 14. 12:55

1. 개요

- 웹 앱을 테스트하는데 사용하는 프레임워크

- WebDriver 라는 API를 이용해서 운영체제에 설치된 브라우저를 제어하는 프레임워크

- 크롤링을 할 때 JavaScript를 이용해서 비동기적으로 가져오는 데이터를 읽고자 할 때 이용할 수 있고 로그인 후 가져와야 하는 데이터를 읽어오는데 사용합니다.

 

메뉴얼: http://docs.seleniumhq.org/docs/

 

- 파이썬에서 사용 준비

pip install selenium
  • 브라우저의 드라이버가 필요
  •  크롬의 버전을 확인

https://googlechromelabs.github.io/chrome-for-testing/#stable

 

2. 크롬 브라우저 실행

1) 기본 API

- 접속: get(url)

- html 코드 읽어오기: page_source

- 일정 시간 대기: implicitly_wait(시간)

- 브라우저 종료: quit()

- 카카오 접속

from selenium import webdriver
import os

os.environ['webdriver.chrome.driver'] = '크롬드라이버 경로'
while(True):
	pass
#사이트 접속
driver.get("https://www.kakao.com")
#html 읽어오기
html = driver.page_source
print(html)
while(True):
	pass

 

2) element 접근 API

- 하나만 찾는 API

find_element_by_name(이름)
find_element_by_id(아이디)
find_element_by_xpath(xpath)

 

- 배열로 찾는 API

find_element_by_css_selector(선택자)
find_element_by_css_class_name(클래스 이름)
find_element_by_tag_name(태그)

 

3) Element 동작 API

send_keys(값): 값이 입력됨
click(), submit(): 클릭

 

4) 스크립트 실행

execute_script(스크립트 코드)

 

5) 유튜브 스크롤

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import bs4
import os
import time

#드라이버 경로 설정
os.environ['webdriver.chrome.driver'] = 'C:\\Users\\USER\\Downloads\\chromedriver-win64\\chromedriver-win64\\chromedriver'
driver = webdriver.Chrome()
#사이트 접속
driver.get("https://www.youtube.com/results?search_query=%EB%8B%B9%EA%B7%BC%20%ED%9B%84%EA%B8%B0")
#5초 대기
time.sleep(5)

i = 0

body = driver.find_element(By.TAG_NAME, 'body')
while i < 10:
    body.send_keys(Keys.PAGE_DOWN)
    time.sleep(2)
    i = i + 1

#html 읽어오기
html = driver.page_source
print(html)
while(True):
	pass

 


6) 네이버 로그인

  • 아이디 와 비밀번호를 입력했을 때 capture 가 보이는 경우는 입력을 직접하지 않고 자바스크립트를 이용하면 보이지 않을 것
from selenium import webdriver
from selenium.webdriver.common.by import By
import os

#드라이버 경로 설정
os.environ['webdriver.chrome.driver'] = 'C:\\Users\\USER\\Downloads\\chromedriver-win64\\chromedriver-win64\\chromedriver'
driver = webdriver.Chrome()
#사이트 접속
driver.get("https://nid.naver.com/nidlogin.login")
#5초간 대기
driver.implicitly_wait(5)

#userid 와 password 에 아이디와 비밀번호를 직접 입력하면 자동 로그인이 됩니다.
userid = input("아이디")
password = input("비밀번호")

driver.execute_script("document.getElementsByName('id')[0].value=\'" + userid + "\'")
driver.execute_script("document.getElementsByName('pw')[0].value=\'" + password + "\'")
driver.find_element(By.XPATH, '//*[@id="log.login"]').click()
while(True):
	pass

 

 

 

 

 

'Python' 카테고리의 다른 글

[Python] 데이터 탐색  (0) 2024.02.14
[Python] MySQL 데이터로 DataFrame 만들기  (0) 2024.02.14
[Python] 크롤링 - 기사 스크래핑  (0) 2024.02.14
[Python] Pandas  (1) 2024.02.08
[Python] Numpy  (0) 2024.02.06

1. 검색어를 입력받아서 동아일보 신문 기사를 스크래핑해서 파일에 저장하기

1) 필요한 패키지

- urllib.parse.quote 함수: 검색어가 한글이라면 인코딩을 하기 위해서

- requests: 웹의 문자열을 읽어오기 위한 패키지, 기본 패키지가 아니라서 설치를 해야 함

- beautifulsoup: HTML 문자열에서 원하는 데이터를 추출하기 위해서 필요한 패키지, 기본 패키지가 아니라서 설치를 해야 함

!pip install requests
!pip install beautifulsoup4

 

2) URL 확인

https://www.donga.com/news/search?sorting=1&check_news=91&search_date=1&v1=&v2=&more=1&query=%EB%8B%B9%EA%B7%BC%20%ED%9B%84%EA%B8%B0

=> query: 검색어

 

3) 검색어 입력받아 URL 만들기

from urllib.parse import quote

#검색어를 입력받아서 인코딩
string = input("검색어를 입력하세요:")
keyword = quote(string)
#print(keyword)

target_URL = "https://www.donga.com/news/search?query=" + keyword
print(target_URL)

=> 검색어를 입력하세요: 당근 후기
https://www.donga.com/news/search?sorting=1&check_news=91&search_date=1&v1=&v2=&more=1&query=%EB%8B%B9%EA%B7%BC%20%ED%9B%84%EA%B8%B0

 

 

4) 첫 화면의 HTML 가져오기

# 정적인 웹의 데이터를 가져올 때 사용하는 패키지
import requests
html = requests.get(target_URL).text
print(html)

 

 

5) 기사 개수 가져오기

#HTML, XML 파싱에 사용하는 패키지
from bs4 import BeautifulSoup

#HTML 텍스트는 메모리에 트리 형태로 펼치기
bs = BeautifulSoup(html, 'html.parser')

#선택자는 동일한 데이터가 있을 수 있으므로 list
cnt = bs.select('div.cntPage > span')

#데이터가 1건이라서 반복문을 돌리지 않고 첫번재 데이터에서 바로 추출
'''
for x in cnt:
    print(x.getText())
'''
cnt = cnt[0].getText()
#print(cnt)
cnt = int(cnt[0:-1].replace(",", ""))
print(cnt)

=> 73

 

6) 기사 링크 가져오기

#페이지 개수 만들기
pageno = int(cnt / 15 + 0.99)

#기사의 링크를 저장할 list
links = []
#페이지 개수 만큼 순회하면서 html을 읽어서 파싱해서 저장
for i in range(0, pageno):
    #기사 링크와 제목이 나오는 페이지를 읽기
    url = "https://www.donga.com/news/search?p=" + str(i*15+1) + "&query=" + keyword + "&check_news=91&more=1&sorting=1&search_date=1&v1=&v2="
    html = requests.get(url).text
    soup = BeautifulSoup(html, "html.parser")
    linktag = bs.select('span.tit > a')
    for tag in linktag:
        #a 태그의 href 속성의 값을 가져오기
        links.append(tag['href'])
        
print(links)

 

 

7) 기사 링크에 가서 기사를 읽어서 텍스트 파일에 저장

#기록할 텍스트 파일을 생성
output_file = open(string + ".txt", 'w', encoding='utf8')

for link in links:
    html = requests.get(link).text
    bs = BeautifulSoup(html, "html.parser")
    articles = bs.select('#article_txt')
    for article in articles:
        #파일에 기록
        output_file.write(article.getText())

output_file.close()

 

 

 

 

 

 

 

 

 

 

 

'Python' 카테고리의 다른 글

[Python] MySQL 데이터로 DataFrame 만들기  (0) 2024.02.14
[Python] 크롤링 - Selenium  (0) 2024.02.14
[Python] Pandas  (1) 2024.02.08
[Python] Numpy  (0) 2024.02.06
Day10. REST API  (0) 2024.01.26

[Python] Pandas

0ㅑ채
|2024. 2. 8. 17:48

1. Pandas 패키지

- 데이터 분석을 위한 고수준의 자료구조, 분석 도구 제공

- 자료구조

  • Series: 열이 1개인 데이터 구조
  • DataFrame: 열이 2개 이상인 데이터 구조

 

2. Series

- Index와 Value 1개를 가지는 자료구조

series (데이터, index=None, dtype=None, copy=False)
  • 데이터: list, set, dict와 numpy.ndarray 가능
  • index: 데이터를 가리키는 이름
    • list · set · ndarray를 대입하면 0부터 시작하는 숫자 인덱스가 자동으로 생성
    • dict를 설정하면 key가 인덱스
    • index 옵션에 직접 인덱스 설정 가능
  • dtype
    • 데이터 1개의 자료형으로 설정 -> 그 자료형으로 생성
    • 설정 없음 -> pandas가 추론
  • copy: True -> 데이터 복제해서 생성 / False -> 참조를 가져와서 생성

 

- index와 values 속성

  • index 속성 호출 : 인덱스를 numpy의 ndarray로 리턴
  • values 속성 호출: 값들을 numpy의 ndarray로 리턴

* 딥러닝은 기본적으로  numpy의 ndarray로 수행하는데, 데이터가 pandas의 자료구조면 values 속성을 호출해서 numpy의 ndarray로 수행해야 함.

* pandas를 사용해야 하는 이유: 다양한 데이터를 불러올 수 있기 때문! pandas로 불러오고 numpy 배열로 바꿔줘야 한다.

 

- 하나의 데이터를 접근

  • Series[index]

- numpy와 동일한 형태로 연산 수행하고 numpy의 함수 사용 가능

  • numpy의 1차원 배열과 Series의 차이는 Index의 여부!!!
#시리즈를 생성
price = pd.Series([1000, 3000, 2000, 4000])
#시리즈를 출력 - 자동 생성된 인덱스 와 값이 출력
print(price)
#1이라는 인덱스를 가진 데이터를 조회
print(price[1])
#인덱스를 직접 설정
price.index = ["사탕", "과자", "음료수", "과일"]
print(price)
#인덱스가 사탕이라는 데이터를 조회: 1000
print(price["사탕"])
0    1000
1    3000
2    2000
3    4000
dtype: int64

3000

사탕     1000
과자     3000
음료수    2000
과일     4000
dtype: int64

1000
파이썬을 쓰는 것은 숫자가 항상 0부터 시작하고, n-1까지인데
개발자가 아닌 경우 1부터 시작하고 마지막을 포함한다. (ex.R)
pandas는 데이터분석을 위한 패키지기 때문에 (1, n)으로 인식한다.

 

x = price["사탕":"음료수"] #사탕부터 음료수까지의 데이터의 참조를 가져온 것
#x의 데이터를 변경하면 원본인 price 의 데이터도 수정
x["사탕"] = 800
print(x)
print(price)
print("=============================================")
y = price[["사탕","음료수"]] #사탕과 음료수의 데이터를 복제해 온 것
#y의 데이터를 변경해도 원본인 price의 데이터를 변경되지 않는 것
y["사탕"] = 2000
print(y)
print(price)
사탕      800
과자     3000
음료수    2000
dtype: int64

사탕      800
과자     3000
음료수    2000
과일     4000
dtype: int64

=============================================

사탕     2000
음료수    2000
dtype: int64

사탕      800
과자     3000
음료수    2000
과일     4000
dtype: int64
  • x는 참조를 가져와서 쓴 것. 따라서 x의 데이터를 변경하면 원본인 price의 데이터도 변경된다. 
  • y는 데이터를 복제함. y의 데이터를 변경해도 원본인 price의 데이터는 변경되지 않았다.
배열은 데이터의 연속적인 모임이다. array는 연속이 전제된다.
물리적으로 연속되면 array list (혹은 dense list)라고 하고, 논리적으로 연속되면 linked list라고 한다.

대괄호를 쓴 건 복제를 하겠다는 뜻

 

 

 

- Series와 Series의 연산은 인덱스를 기준

  • 동일한 인덱스가 없으면 연산을 수행하지 못한다. 
s1 = pd.Series([100, 200, 300, np.nan], index=["사과", "배", "한라봉", "천혜향"])
print(s1)
s2 = pd.Series([100, 200, 300, 500], index=["사과", "한라봉", "천혜향", "무화과"])
print(s2)

print(s1 + s2)
사과     100.0
배      200.0
한라봉    300.0
천혜향      NaN
dtype: float64

사과     100
한라봉    200
천혜향    300
무화과    500
dtype: int64

무화과      NaN
배        NaN
사과     200.0
천혜향      NaN
한라봉    500.0
dtype: float64
  • 시리즈는 인덱스를 일치하는 데이터끼리 연산을 수행
  • 한쪽에만 존재하거나 np.nan인 데이터가 있으면 결과가 np.nan
  • None은 데이터가 없다는 뜻이고, np.nan은 숫자로 볼 수 없다는 뜻. 

 

 

 

3. DataFrame

- 인덱스를 가진 테이블 형태의 자료구조

- 관계형 데이터베이스의 테이블과 유사하지만 인덱스를 직접 설정할 수 있다는 것이 다르다.

- dict를 이용해서 주로 생성.

  • dict의 키가 컬럼(열)의 이름이 되고 값이 셀 값이 된다.
  • head(n), tail(n)로 앞 또는 뒤에서 n 개의 데이터를 추출할 수 있다.
    • 기본적으로 5개를 가져온다.
    • 데이터를 제대로 가져왔는지 확인할 때 많이 사용한다.

- idex: DataFrame의 index를 리턴하고 설정할 수 있는 속성

  • 0부터 연속되는 숫자로 인덱스가 생성. index 속성으로 인덱스 직접 설정 가능

- columns: 컬럼의 이름을 리턴하고 이름을 수정할 수 있는 속성

  • columns = [리스트]  하면 컬럼의 이름을 직접 설정하는 것도 가능

- values: DataFrame의 데이터를 2차원 ndarray로 리턴

 

- info()는 데이터프레임의 개요를 리턴

#DataFrame 생성
source = {
    "code":[1, 2, 3, 4],
    "name":["카리나", "지젤", np.nan, "윈터"],
    "age": [23, 22, 34, 21]
}

df = pd.DataFrame(source)
print(df)

print(df.head(2)) #앞에서 2개

print(df.tail(2)) #뒤에서 2개

df.info()
   code name  age
0     1  카리나   23
1     2   지젤   22
2     3  NaN   34
3     4   윈터   21

   code name  age
0     1  카리나   23
1     2   지젤   22

   code name  age
2     3  NaN   34
3     4   윈터   21

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   code    4 non-null      int64 
 1   name    3 non-null      object
 2   age     4 non-null      int64 
dtypes: int64(2), object(1)
memory usage: 224.0+ bytes

 

 

 

 

4. Pandas를 이용한 데이터 수집

1) 클립보드의 내용 읽어오기

pandas.read_clipboard()

 

 

2) 자주 사용하는 데이터셋

scikit-learn

https://scikit-learn.org/stable/datasets/toy_dataset.html

load_digits(): 숫자 데이터 셋 - 분류에 사용
load_iris(): 붓꽃 데이터 - 분류에 사용
load_diabetes(): 당뇨병 데이터 - 회귀에 사용
load_linnerud(): 체력 검사 데이터 - 회귀에 사용
load_wine(): 와인 품질 데이터 - 분류에 사용
load_breast_cancer(): 유방암 데이터 - 분류에 사용

 

UCI 머신러닝 데이터 저장소: https://archive.ics.uci.edu/ml/index.php

kaggle: https://www.kaggle.com

데이콘: https://dacon.io/

 

#사이킷런(scikit-learn)에서 제공하는 데이터를 사용
from sklearn import datasets
#iris 데이터 읽어오기
iris = datasets.load_iris()
#print(iris)
#데이터프레임이 아니고 Bunch 클래스의 인스턴스
print(type(iris))
  • type은 <class 'sklearn.utils._bunch.Bunch'>
  • 데이터프레임이 아니라 Bunch 클래스의 인스턴스임

 

키 확인

print(iris.keys())

dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])

  • data가 피처, target이 레이블
  • 레이블은 target, 목표값이다.
  • 어떤 target을 찾을 수 있는 열을 feature라고 한다.

 

데이터 확인

print(iris.data)

[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]

....

  • type은 ndarray

 

 

 

 

5. 텍스트 파일의 데이터 읽기

1) fwf 파일 읽기

2017-04-10다음32000
2017-04-11다음34000
2017-04-12다음33000
  • 일정한 간격을 가지고 컬럼을 구분하는 텍스트파일
  • 텍스트 파일은 포맷과 인코딩 방식 확인

인코딩 방식: utf-8, euc-kr, cp949(윈도우 한글 기본 포맷)

pandas.read_fwf('파일 경로', widths = (글자 사이의 간격), names = (컬럼 이름나열), encoding = 인코딩 방식)

#fwf 파일 읽기
df = pd.read_fwf('C:\\Users\\USER\\Downloads\\data\\data\\data_fwf.txt', 
                 widths=(10, 2, 5), 
                 names = ('날짜', '이름', '가격'),
                 encoding = 'utf-8')
print(df)
  • 윈도우에서 파일의경로를 설정할 때 역슬래시는 두번씩 입력
           날짜  이름     가격
0  2017-04-10  다음  32000
1  2017-04-11  다음  34000
2  2017-04-12  다음  33000

 

2) csv 파일 읽기

- csv: 구분 기호로 분리된 텍스트 파일

  • pandas.read_csv: 기본 구분자가 쉼표(,)
  • pandas.read_table: 기본 구분자가 탭

- 첫번째 매개변수로 파일 경로 설정

  • 아무런 옵션이 없으면 첫 번째 줄 데이터를 컬럼 이름으로 사용
#item.csv 파일 읽기
item = pd.read_csv('C:\\Users\\USER\\Downloads\\data\\data\\item.csv')
print(item)
print(item.info())
   code  manufacture            name  price
0     1        korea           apple   1500
1     2        korea      watermelon  15000
2     3        korea  oriental melon   1000
3     4  philippines          banana    500
4     5        korea           lemon   1500
5     6        korea           mango    700

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 4 columns):
 #   Column       Non-Null Count  Dtype 
---  ------       --------------  ----- 
 0   code         6 non-null      int64 
 1   manufacture  6 non-null      object
 2   name         6 non-null      object
 3   price        6 non-null      int64 
dtypes: int64(2), object(2)
memory usage: 324.0+ bytes
None

 

옵션

- path: 데이터의 경로

- sep, delimiter: 구분자 설정. 기본은   ,

- header: 컬럼이름의 행번호 설정. 기본은 0, 없을 때는 None을 설정

- index_col: 인덱스로 사용할 컬럼 번호나 컬럼 이름 설정

- names: 컬럼 이름으로 사용할 list를 설정할 수 있는데 header=None일 때만 사용

- skiprows: 읽지 않을 행의 개수

- nrows: 읽을 행의 개수

- skip_footer: 무시할 마지막 행 개수

- endocing

- thousands: 천 단위 구분 기호. 설정하지 않으면 문자로 인식함

- na_values: NA 값으로 처리할 문자의 list

- parse_dates: 날짜 텍스트를 문자열이 아닌 날짜로 인식하게 하는 설정. 기본은 False라서 문자열로 인식

 

* csv 파일을 읽을 때는 먼저 파일을 열어서 첫번째 행이 컬럼의 이름인지, 한글이 포함되어있는지, 구분기호가 뭔지 확인

 

#item.csv 파일 읽기
good = pd.read_csv('C:\\Users\\USER\\Downloads\\data\\data\\good.csv')
print(good)
    apple  10   1500
0  banana   5  15000
1   melon   7   1000
2    kiwi  20    500
3   mango  30   1500
4  orange   4    700
  • 첫번째 행이 컬럼 이름이 되어버렸다. 
  • 첫번째 행을 컬럼 이름이 아니고 데이터로 만들기
#item.csv 파일 읽기
good = pd.read_csv('C:\\Users\\USER\\Downloads\\data\\data\\good.csv', 
                  header=None, names=['제품이름', '수량', '가격'])
print(good)

 

     제품이름  수량     가격
0   apple  10   1500
1  banana   5  15000
2   melon   7   1000
3    kiwi  20    500
4   mango  30   1500
5  orange   4    700

 

- 데이터 양이 아주 많은 경우에 한 번에 읽으려고 하면 실패

  • nrows 속성을 이용해서 시작 위치에서 일부분의 데이터만 읽어오고 skiprows를 이용해서 읽을 수 있음
#item.csv 파일 읽기
parser = pd.read_csv('C:\\Users\\USER\\Downloads\\data\\data\\good.csv', 
                  header=None, nrows=2, skiprows=4)
print(parser)
        0   1     2
0   mango  30  1500
1  orange   4   700
  • 반복문을 사용하면
#item.csv 파일 읽기
for i in range(0, 3):
    parser = pd.read_csv('C:\\Users\\USER\\Downloads\\data\\data\\good.csv', 
                      header=None, nrows=2, skiprows=i*2)
    print(parser)
        0   1      2
0   apple  10   1500
1  banana   5  15000
       0   1     2
0  melon   7  1000
1   kiwi  20   500
        0   1     2
0   mango  30  1500
1  orange   4   700
  • 데이터 갯수가 몇개인지 모르면 while문
i = 0
while True:
    try:
        parser = pd.read_csv('C:\\Users\\USER\\Downloads\\data\\data\\good.csv', 
                          header=None, nrows=2, skiprows=i*2)
        print(parser)
        i = i + 1
    except:
        break
  • chunksize를 설정해서 한 번에 읽을 데이터의 개수를 설정하고 이때 리턴되는 TextParser 객체를 순회하면서 읽을 수 있음
parser = pd.read_csv('C:\\Users\\USER\\Downloads\\data\\data\\good.csv', 
                      header=None, chunksize=2)
for piece in parser:
    print(piece)

 

- 탭으로 구분된 파일 읽기

ParserError: Error tokenizing data. C error: Expected 1 fields in line 326, saw 2
  • 탭으로 구분돼있음을 확인
gapminder = pd.read_csv('C:\\Users\\USER\\Downloads\\data\\data\\gapminder.tsv', 
                       sep = 'Wt')
print(gapminder.head())
       country continent  year  lifeExp       pop   gdpPercap
0  Afghanistan      Asia  1952   28.801   8425333  779.445314
1  Afghanistan      Asia  1957   30.332   9240934  820.853030
2  Afghanistan      Asia  1962   31.997  10267083  853.100710
3  Afghanistan      Asia  1967   34.020  11537966  836.197138
4  Afghanistan      Asia  1972   36.088  13079460  739.981106

 

 

csv로 저장

- Series나 DataFrame의 to_csv 메소드 호출

- 첫 번째 매개변수로 파일 경로 설정

- 기본적으로는 index와 컬럼 이름이 저장되는데 index와 header에 False 설정하면 출력되지 않음

- sep: 구분자 설정

- na_rep: NaN 값을 원하는 형식으로 설정

- cols: 컬럼 이름을 list로 설정하면 설정한 컬럼만 파일에 저장

data.to_csv('test.csv', index=False)

 

 

 

3) 엑셀 파일 읽기

pandas.io.excel.read_excel("파일 경로")
  • read_csv와 유사한데 sep는 없음
  • sheet_name: 시트 선택해서 불러오기

- xlrd 패키지 설치

pip install xlrd

* anaconda는 패키지가 내장되어있음

 

- DataFrame으로 만들기

df = pd.read_excel('C:\\Users\\USER\\Downloads\\2023-2 FOLLOW 순모임 출석체크.xlsx')
df

 

 

엑셀 파일 저장

- openpyxl 패키지 설치

*아나콘다는 내장

 

- 엑셀파일 경로를 갖는 라이터변수

!pip install xlsxwriter

writer = pandas.ExcelWriter("엑셀파일 경로", engine="xlsxwriter")
df.to_excel(writer, sheet_name='시트이름')
writer.close()
  • 저장했지만 여전히 쥬피터가 df를 쓰고 있기 때문에 작업이 완전히 끝난 후에 자유롭게 쓸 수 있음!

 

 

6. Web의 데이터 읽기

1) HTML에 있는 table 태그의 모든 가져오기

- pandas.read_html('파일의 경로나 URL')을 이용하면 table 태그의 내용을 DF로 만들어서 list 리턴

- 옵션으로 천단위 구분 기호 설정, 인코딩 방식, na 데이터 설정 등

 

https://ko.wikipedia.org/wiki/인구순_나라_목록

https://ko.wikipedia.org/wiki/%EC%9D%B8%EA%B5%AC%EC%88%9C_%EB%82%98%EB%9D%BC_%EB%AA%A9%EB%A1%9D

  • URL에는 한글을 직접 사용하지 않고 인코딩된 URL을 사용해야 함

 

li = pd.read_html('https://ko.wikipedia.org/wiki/%EC%9D%B8%EA%B5%AC%EC%88%9C_%EB%82%98%EB%9D%BC_%EB%AA%A9%EB%A1%9D')
print(li[0])
  • 인덱스를 이용해 원하는 테이블을 선택해야 함
      순위       나라          인구   갱신 년도  \
0      1       인도  1428627663  2024.0   
1      2  중화인민공화국  1409670000  2024.0   
2      3       미국   334914895  2023.0   
3      4    인도네시아   279476346  2023.0   
4      5     파키스탄   247653551  2023.0   
..   ...      ...         ...     ...   
236  237     토켈라우        1893  2023.0   
237  238      니우에        1681  2022.0   
238  239   바티칸 시국         764  2023.0   
239  240   코코스 제도         593  2021.0   
240  241   핏케언 제도          47  2021.0   

                                               기타  
0    공식 인구시계 UN 프로젝션[1][2][3] UN 예상치 인구가 가장 많은 국가  
1                                         공식 인구시계  
2                                         공식 인구시계  
3                                         공식 인구시계  
4                                         공식 인구시계  
..                                            ...  
236                                        UN 예상치  
237                                        공식 추계치  
238                  바티칸 시국 인구통계 인구가 가장 적은 UN 가입국  
239                                        공식 추계치  
240                                  인구가 가장 적은 속령  

[241 rows x 5 columns]

 

 

2) 웹에서 데이터 활용

- 웹에서 데이터 가져오기

- 데이터를 파싱 (데이터를 해석해서 원하는 데이터를 추출)

- 웹에서 제공되는 텍스트 데이터 종류

 

XML

  • 데이터를 태그 형식으로 표현하는데 해석은 사용자가 함
<Persons>
    <Person>
        <name>귀도반로썸</name>
        <language>파이썬</language>
    </Person>
    <Person>
        <name>제임스 고슬링</name>
        <language>자바</language>
</Persons>

 

JSON

  • 자바스크립트의 객체 표현법으로 데이터를 표현하는 방식
  • 최근의 API에서는 대부분 JSON만 지원

{"persons" : [{"name" : "하일스베르", "language" : "C#"}, {"name" : "데니스 리치히", "language" : "C"}]}

 

YAML (yml, 야믈)

  • 가장 최근에 등장한 포맷으로 이메일 형식으로 데이터 표현하는 방식
  • 클라우드 환경에서 설정 파일의 대부분은 YAML
persons:
    person:
        name:하일스베르
        language: typescript
    person:
        name: 래리앨리슨
        language: 오라클

 

HTML

  • 웹 브라우저가 해석해서 화면에 랜더링하기 위한 포맷
  • 구조적이지 않아서 데이터를 표현하는 데는 사용하기 어려움
  • API를 제공하지 않는 사이트에서 화면에 보여지는 데이터를 추출하기 위해 다운로드 받아서 사용

 

 

3) 웹에서 데이터 가져오기

- urllib와 urllib2라는 파이썬 내장 모듈을 이용해서 웹의 데이터를 가져올 수 있음

  • 내장 모듈의 request 객체의 urlopen이라는 메소드에 url을 문자열로 대입하면 url에 해당하는 데이터를 response 타입의 객체로 리턴
  • response객체의 getheaders()를 이용하면 제공하는 데이터의 정보를 읽을 수 있고 read()를 호출하면 내용을 읽을 수 있다.
  • read().decode("인코딩정보"): 읽온 내용이 한글이 포함되어 있다면 인코딩 설정
import urllib.request
from urllib.parse import quote

keyword = quote("네이버")

result = urllib.request.urlopen("https://search.hani.co.kr/search?searchword="+ keyword)
print(result.read())

 

- URL 한글 인코딩

  • 문자열을 인코딩하고자 하면 urllib.parse 모듈의 quote_plus와 qoute 함수 이용
  • 두 함수의 차이는 공백을 +로 처리하느냐 %20으로 처리하느냐의 차이

 

- 한겨례 신문사에서 '네이버' 검색 결과 가져오기

https://search.hani.co.kr/search?searchword=%EB%84%A4%EC%9D%B4%EB%B2%84

  • https://search.hani.co.kr/search?searchword=검색어
  • 한글을 치면 인코딩 에러가 나기 때문에 변수 keyword
import urllib.request
from urllib.parse import quote

keyword = quote("네이버")

result = urllib.request.urlopen("https://search.hani.co.kr/search?searchword="+ keyword)
print(result.read())

 

 

- requests 패키지를 활용한 웹의 데이터 가져오기

  • GET, POST, PUT, DELETE 요청을 사용할 수 있고 데이터 인코딩이 편리한 패키지
  • 파라미터로 넘겨줄 데이터를 dict로 만들어서 GET이나 POST 등에서 사용하면 인코딩을 자동으로 수행
requests.get("url")
  • 웹 페이지의 결과를 Response 객체를 리턴
    • Response.txt를 이용하면 문자열을 가져올 수 있고 
    • content 속성을 호출하면 bytes를 리턴
pip install requests

import requests
resp = requests.get("http://httpbin.org/get")
print(resp.text)
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.31.0", 
    "X-Amzn-Trace-Id": "Root=1-65c46116-58a3d4551f99f24768fa4fe0"
  }, 
  "origin": "118.131.111.158", 
  "url": "http://httpbin.org/get"
}

 

#파라미터 만들기
param = {"id":"itstudy", "name":"군계", "age":53}
resp = requests.post('http://httpbin.org/post', data=param)
print(resp.text)
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "age": "53", 
    "id": "itstudy", 
    "name": "\uad70\uacc4"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Content-Length": "41", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.31.0", 
    "X-Amzn-Trace-Id": "Root=1-65c4619a-6cea70d6665e833a7d02a84f"
  }, 
  "json": null, 
  "origin": "118.131.111.158", 
  "url": "http://httpbin.org/post"
}

 

- 이미지 파일 다운로드

#이미지 파일 다운로드
imageurl = "https://search.pstatic.net/common/?src=http%3A%2F%2Fblogfiles.naver.net%2FMjAyMTA1MTVfMjg1%2FMDAxNjIxMDA0ODI5MDc0.Q17_bqOFXmCDBx4kAr_UQl3vGPfvY4wNAS48RCfwja8g.UM29jj3Mra_yEHXChamjsDevclJMy13NgQRRzEbWyPAg.JPEG.gody97%2Fresized%25A3%25DFoutput%25A3%25DF1906874251.jpg&type=sc960_832"

filename ="redpanda.jpg"

try:
    #다운로드
    resp = requests.get(imageurl)
    #파일에 저장
    with open(filename, "wb") as h:
        #다운로드 받은 내용을 bytes로 리턴
        img = resp.content
        h.write(img)
except Exception as e:
    print(e)

 

 

 

 4) json 데이터 파싱

방법

- requests를 이용해서 다운로드 받은 후 직접 파싱 - 옵션이 많을 때 좋음

- pandas.read_json을 이용해서 자동으로 파싱 - 데이터의 구조가 단순할 때 좋음

 

pandas.read_json을 이용해서 파싱

df = pd.read_json("http://swiftapi.rubypaper.co.kr:2029/hoppin/movies?version=1&page=1&count=30&genreId=&order=releasedateasc") 
hoppin = df["hoppin"]
print(hoppin)
movies        {'movie': [{'genreNames': '코미디,드라마', 'genreIds...
totalCount                                                 4266
Name: hoppin, dtype: object

 .

movies = hoppin['movies']
print(movies)
movie = movies['movie']
print(movie)

 .

for item in movie:
    print(item["title"] + ":" + item["ratingAverage"])
인포먼트:6.7
엣지 오브 다크니스:6.9
베이비 돌:6
황야의 역마차:6.3
전원 교향곡:8
아버지의 깃발:8
여덟번의감정:6
레드:8.7
영광의 탈출:6.8
크로싱:8.8
맨 인 블랙:8.9
차형사:8.4
에이지 오브 드래곤:3.9
로드 오브 워리어:7.4
[메이킹 다큐] 도둑들 영화를 만들다!:7.9
괜찮아요 수달씨:7.5
파파:9
이케맨 뱅크:6.7
다중인격소녀 ISOLA:5.7
위조지폐:6.5
카인과 아벨:6.9
돌핀 블루:8.2
더 코드:7.6
철권 블러드 벤전스:8
블루 엘리펀트 (우리말 더빙):8.8
해결사 (2010):8.3
하나오니 2: 사랑의 시작:8.5
하나오니 3: 복수의 시간:8.5
아테나 전쟁의 여신 극장판:7.7
아이스 프린세스:8.8

 

- 파이썬의 기본 모듈을 이용해서 json 파싱

  • jsonloads("문자열") 
  • json 문자열을 파싱해서 파이썬 dict나 list 생성
  •   {   로 시작하면 dict
  •   [   로 시작하면 list

 

 

 

5) 카카오 검색 API 데이터를 가져와서 MySQL에 저장

2024.03.15 - [Python/Python 실전편] - [Python] Pandas 실습 _ 카카오 검색 API 데이터 가져오기

 

[Python] Pandas 실습 _ 카카오 검색 API 데이터 가져오기

- 카카오 검색 API developers.kakao.com - 애플리케이션 생성 후 REST API 키 복사 a89507c93f15074167c0700239d4b1d0 블로그 검색 메서드URL인증 방식 GET https://dapi.kakao.com/v2/search/blog REST API 키 헤더 Authorization Authoriz

yachae4910.tistory.com

 

 

6) XML 파싱

RSS

- 사용할 URL:  https://www.hankyung.com/feed/it

- 파싱 방법:

import xml.etree.ElementTree as et

# urllib.request를 이용해서 읽어온 데이터: res

#메모리에 펼치기
tree = et.parse(res)

#루트 찾기
xroot = tree.getroot()

#특정 태그의 데이터 가져오기
items = xroot.findall('태그')

#태그는 여러개 나올 수 있으므로 반복문 수행
for node in items:
    node.find(태그).text : 태그 안의 데이터
import urllib.request
url = "https://www.chosun.com/arc/outboundfeeds/rss/category/economy/?outputType=xml"
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)

#xml 파싱
import xml.etree.ElementTree as et
#메모리에 트리 형태로 펴맃기
tree = et.parse(response)
print(tree)

 

 

 

7) HTML 파싱

# BeautifulSoup 패키지 이용

!pip install beautifulsoup4

* 아나콘다에는 내장

 

  • 모듈을 import 할 때는 bs4를 import

 

# 메모리에 펼치기

bs4.BeautifuleSoup(파싱할 html, "html.parser")

 

 

# 태그 안의 데이터 찾기

bs.태그이름 나열.get_text

*별로 쓰지 않음. 

 

 

import requests
import bs4

resp = requests.get("http://finance.daum.net/")
html = resp.text
print(html)

</html lang="ko">
 
 
</meta http-equiv="content-type" content="text>
 
</meta http-equiv="x-ua-compatible" content="ie=edge" >
 
</meta property="og:site_name" content="다음금융" >


...

#html 파싱
bs = bs4.BeautifulSoup(html, 'html.parser')
#html에서 body 태그 안의 span 태그의 텍스트 가져오기
print(bs.body.span.get_text())

금융

 

 

 

- find 함수

find(태그, attributes, recursive, text, limit, keywords)
  • 태그: 찾고자 하는 태그를 설정
  • attributes: 태그 중에서 특정 속성의 값만 가져올 때 사용
  • recursive: False면 최상위 태그에서만 찾고, True면 하위로 들어가면서도 찾음
  • 일치하는 태그 1개를 찾아온다.
  • 일치하는 태그 여러개를 찾으려면 find_all 사용

 

 

- select 함수

선택자를 이용해서 찾아오는 함수

 

 

 

- bs4.element.Tag

  • find와 select의 결과는 Tag 클래스의 list
  • Tag 클래스에서 getText()를 호출하면 태그가 감싸고 있는 텍스트를 가져올 수 있고
  • get('속성이름')은 속성의 값을 가져올 수 있다.

 

선택자는 앞에서부터 생략도 가능

https://news.naver.com/section/105

 

import requests
import bs4

resp = requests.get("https://search.hankyung.com/search/total?query=%ED%94%8C%EB%9E%AB%ED%8F%BC")
html = resp.text
# print(html)

#html 파싱
bs = bs4.BeautifulSoup(html, 'html.parser')
tags = bs.select('div > a')

#html에서 body 태그 안의 span 태그의 텍스트 가져오기
for tag in tags:
    print(tag.getText())
    print(tag.get('href'))
    print()
개발자 10명 중 8명 "생성형 AI, 개발 대체할 것" [Geeks' Briefing]

https://www.hankyung.com/article/202402084600i


https://www.hankyung.com/article/2024020844441


'공정위 혼자 왜이리 급하냐'…국회도 혀 찬 플랫폼법 독주

https://www.hankyung.com/article/2024020844441


https://www.hankyung.com/article/202402083905i

 

 

 

 

'Python' 카테고리의 다른 글

[Python] 크롤링 - Selenium  (0) 2024.02.14
[Python] 크롤링 - 기사 스크래핑  (0) 2024.02.14
[Python] Numpy  (0) 2024.02.06
Day10. REST API  (0) 2024.01.26
Day9. 웹 서버 만들기  (1) 2024.01.24

[Python] Numpy

0ㅑ채
|2024. 2. 6. 18:20

1. 특징

- Python에서 고성능의 과학적 계산 수행하는 패키지 (ex.선형 대수)

- Python 머신러닝 스택의 기초 패키지

- 다차원 배열인 ndarray를 제공

- 벡터화 된 연산과 Broadcasting 연산 지원

 

 

2. 설치

pip install numpy

*아나콘다는 자동 설치

*다른 패키지를 설치할 때 종속적으로 설치되는 경우가 있음 -> 버전 문제 발생

 

 

3. 사용

import numpy
import numpy as np
from numpy import * # 모듈의 모든 내용을 현재 모듈에서 사용
from numpy import ndarray # numpy 모듈 중에서 ndarray만 사용
  • import *을 쓰면 nupmy 써주지 않아도 사용할 수 있지만, 내장함수인지 구분이 가지 않음!

 

 

 

4. ndarray

- array, 배열

- list나 tuple보다 생성 방법이 다양하고 가능한 작업 많음

- id의 모임이 아니라 값의 모임

  • list나 tuple은 id의 모임이기 때문에 보기에는 자료형이 달라도 같은 자료형(id)으로 취급해서 생성이 가능했다.
  • 그런데 ndarray는 동일한 자료형의 grid
  • ndarray를 생성할 때 다른 자료형을 대입하면 추론을 통해 하나의 자료형으로 변환해서 생성

 

 

 

5. 속도

import datetime

li = range(1, 100000)

#현재 시간 저장
start = datetime.datetime.now()

#모든 요소에 10 곱하기
for i in li:
    i = i * 10
    
#현재 시간 저장
end = datetime.datetime.now()
print(start, end)

🤍

2024-02-06 12:39:02.822362 2024-02-06 12:39:03.379676

.

import numpy as np

ar = np.arange(1, 10000000)

#현재 시간 저장
start = datetime.datetime.now()

ar = ar * 10

#현재 시간 저장
end = datetime.datetime.now()
print(start, end)

🤍

2024-02-06 12:39:03.403699 2024-02-06 12:39:03.418701
  • numpy가 더 빠름

 

 

 

6. 생성

numpy.array(object, dtype=None, copy=True)
  • object: Vector 자료형 (데이터의 모임 - list, tuple, set 등의 데이터)
  • dtype: 요소의 자료형, 생략 시 numpy가 알아서 추론
  • copy: 복제 여부. 기본값은 True라서 원본 데이터를 복제해서 생성
numpy.asarray(object, dtype = None)
  • object가 ndarray 자료형이면 데이터를 copy하지 않음

 

 

 

 

7. ndarray의 정보 확인 속성

- dtype: 데이터 한 개의 자료형

- ndim: 배열의 차원

- shape: 각 차원의 크기를 튜플로 리턴

- size: 데이터 개수

- itemsize: 하나의 항목이 차지하는 메모리 크기

- nbytes: 전체가 차지하는 메모리 크기

 

차원 확인

import numpy as np

#list를 이용해서 array 생성
ar = np.array([1, 2, 3])

#1차원
print(ar.ndim) 
print(ar.shape)  #1차원 3개의 데이터로 구성 (3, )

#2차원
table = np.array([[1, 2, 3], [4, 5, 6]])
print(table.ndim) 
print (table.shape) # 2행 3열의 배열 (2, 3)

 

 

 

 

8. 배열을 생성하는 다른 방법

numpy.arange(start, stop, step, dtype=None)
  • start부터 stop까지 step 간격으로 생성
  • dtype은 데이터 1개의 하나의 자료형
  • stop 값만으로 생성할 수 있음
  • 샘플 데이터 만들 때 자주 사용
ar = np.arange(1, 10, 2)
print(ar)
[1 3 5 7 9]

 

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
  • start부터 stop까지 num만큼 배열로 생성
  • endpoint는 마지막 값 포함 여부
  • axis는 축
  • 샘플 데이터 만들 때 자주 사용
numpy.zeros(), numpy.ones()
  • 차원을 매개변수로 받아서 0이나 1로 채워주는 함수들
numpy.zeros_like(), numpy.ones_like()
  • 배열을 매개변수로 받아서 동일한 크기의 배열을 만들고 0이나 1로 채워주는 함수들
numpy.empty(), numpy.empty_like()
  • 초기화하지 않은 데이터(의미없는 값)의 배열 생성
numpy.eye(N, M, k=0, dtype=None)
  • N은 행의 개수, M은 열의 수, k는 대각 위치로
    k=0이면 주대각선 방향만 1로 채워주고 k != 0이면 좌우로 대각 방향을 이동해서 1을 채워주는 행렬 생성
  • N과 M 둘 중 하나의 값만 입력하면 하나의 값을 복사해서 정방행렬 생성
numpy.diag(행렬)
  • 행렬에서 주 대각선 방향의 데이터만 골라 행렬 생성
#주대각선 방향이 1인 3*3 정방 행렬 생성
ar = np.eye(3)
print(ar)

print()
#행렬에서 주 대각선의 데이터만 골라서 다시 배열 생성
print(np.diag(ar))

🤍

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

[1. 1. 1.]

 

 

 

 

 

9. 자료형

- numpy의 ndarray는 모든 요소의 자료형이 동일해야 한다.

  • 데이터의 자료형이 다르면 하나의 자료형으로 형변환해서 생성
  • 정수와 실수가 같이 있으면 실수로, 숫자와 문자열이 같이 있으면 문자열로 생성

- 요소의 자료형은 dtype 속성으로 확인 가능

 

자료형

정수: numpy .int8, int16, .int32, .int64, .unit8, .unit16, .unit32, .unit64 - unit은 양수만 저장

실수: float16, float32, float64, float128

복소수: complex64, complex128,  complex256

boolean: bool

문자열: string_

유니코드: unicode_

객체: object

 

- 만들어진 배열의 자료형을 변경해서 다시 생성

  • ndarray.astype(자료형)

- 형 변환을 하는 이유

  • 머신러닝에서는 숫자 데이터만 사용 가능하기 때문에
  • 서로 다른 배열끼리 연산을 하는 경우에
  • 메모리를 효율적으로 사용하기 위해서
색상값 0~255까지의 숫자를 표현해야 하는 경우

int8는 8비트이다. 
int는 양수와 음수를 같이 표현한다.
양수와 음수의 모양이 각각 128가지 (-128 ~ 127)이다. 그래서 색상값 표현이 안된다. 
따라서 int16을 사용해서 표현해야 함! 

그런데 unit는 마찬가지로 모양이 256가지인데
음수를 표현하지 않기 떄문에
0~255 범위의 데이터를 표현하는 것이 가능하다.
메모리 효율 달성~

 

#데이터 타입 확인과 형변환
ar = np.array([1, "2", 3]) # 숫자 -> 문자열로 바뀜
print(ar.dtype)

ar2 = np.array([1, 2.3, 3]) # 정수 -> 실수로 바뀜
print(ar2.dtype)

#ar 배열의 자료형을 정수로 변환
ar3 = ar.astype(np.int32)
print(ar3.dtype)

🤍

<U11
float64
int32

 

 

 

 

 

10. 배열 차원 변환

머신러닝이나 딥러닝을 하다보면 특정한 차원의 데이터를 요구

현재 가지고 있는 데이터가 요구하는 차원과 맞지 않으면 차원을 변경해서 사용해야 함

 

차원 변경 함수

  • reshape: 차원을 튜플로 받아서 튜플에 해당하는 차원으로 변경
  • flatten: 무조건 1차원 배열로 변환
  • 튜플을 대입하지 않고 -1을 대입하면 1차원으로 변경
  • 튜플로 숫자를 설정할 때 마지막 값을 -1로 설정하면 numpy가 알아서 마지막 값 추론하고 설정

 

10개의 데이터가 있는 1차원 1배열 -> 2차원 배열로 변경

#0부터 19까지의 숫자를 가지고 1차원 배열 생성
ar = np.arange(20)
print(ar)

print()
#ar을 4*5짜리 2차원배열로 변환
#5 대신에 -1을 대입해도 결과는 동일
#20개의 데이터는 4행으로 만들려면 5열밖에 안됨
matrix = ar.reshape((4, -1))
print(matrix)

print()
#다차원 데이터를 1차원으로 변환
br = matrix.flatten()
print(br)

.

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]

 

 

 

 

11. 배열의 부분 사용

1) 하나의 요소 사용 Indexing

- 일차원 배열의 경우 배열명[인덱스]의 형태로 접근

  • 앞에서부터 접근할 때는 0부터 시작, 맨 뒤에서 접근할 때는 -1, -2 ...

- 이차원 배열의 경우 배열명[행번호, 열번호] 또는 배열명[행번호][열번호]

- 삼차원 배열의 경우 사용할 수 있는 번호만 늘리기

#배열에서 하나의 요소 접근
ar = np.arange(10)
matrix = ar.reshape((2, -1)) #행 2개, 열은 알아서
print(ar)
print(matrix)

#일차원 배열에 요소 접근
print(ar[0]) #첫번째 데이터
print(ar[-1]) #마지막 데이터

#이차원 배열에서 요소 접근
print(matrix[0, 2])
print(matrix[0][2])

🤍

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

 

 

2) 여러 개의 데이터 접근: Slicing

하나의 행 또는 열 단위로 접근

#배열에서 범위를 이용한 접근
ar = np.arange(10)
matrix = ar.reshape((2, -1))

print(ar[1:4]) #1에서 3까지
print(ar[5:]) #5부터 마지막값까지
print(ar[:4]) #시작위치부터 3까지
print(ar[:]) #전체

#이차원 배열에서의 접근
print(matrix[1][1:3]) 
print(matrix[1]) #1행 전체
print(matrix[:,1]) #1열 전체

🤍

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

[6 7]
[5 6 7 8 9]
[1 6]

 

 

 

3) 복사 방법

인덱싱이나 슬라이싱은 원본 데이터의 *참조만* 가져오는 것
- 인덱싱이나 슬라이싱으로 가져온 데이터를 변경하면, 원본의 데이터도 수정
- 복제를 하려면 copy()를 호출해야 함

 

- 참조 복사

  • 데이터의 위치를 복사
  • 원본이나 사본에 영향을 준다. 
  • 지역 변수의 참조를 전역변수에 대입해서 사라지지 않도록 하기 위해 사용

- weak copy(얕은 복사)

  • 데이터 참조를 한 번만 찾아가서 복사
  • 데이터가 다른 데이터의 참조인 경우 원본에 영향

- deep copy(깊은 복사)

  • 데이터의 참조를 재귀적으로 찾아가서 실제 데이터 복사
  • 어떠한 경우에도 다른 데이터에 영향 줄 수 없음
  • 데이터를 다른 변수로 참조하고자 할 때 권장하지만, 메모리가 부족한 경우 얕은 복사나 참조 복사를 하기도 함
#배열 생성
ar = np.arange(10)
print(ar)

#범위를 이용해서 데이터를 가져오는 것 - 참조를 복사
br = ar[0:4]
print(br)

#br[0]을 수정하면 ar의 데이터도 영향
br[0] = 42
print(br)
print(ar)

🤍

[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3]
[42  1  2  3]
[42  1  2  3  4  5  6  7  8  9]

 

* 원본 데이터를 수정하는 것은 위험

#데이터를 복제해서 br이 가리키도록 하려면

ar = np.arange(10)
br = ar[0:4].copy() # 원본 데이터 영향없음
print(br)

.

[0 1 2 3]

 

 

4) Fancy Indexing

- 데이터를 선택할 때 list 이용해서 선택

- 연속된 범위가 아니더라도 선택이 가능

- 데이터는 복제됨!

ar = np.arange(10)

#Fancy Indexing
br = ar[[1, 3, 5, 7]]
print(br)
br[0] = 15700
print(br)
print(ar)

.

[1 3 5 7]
[15700     3     5     7]
[0 1 2 3 4 5 6 7 8 9]

🤍

matrix = ar.reshape((2, -1))
print(matrix)

print(matrix[:, 0])
#이차원 배열에서 list를 이용해서 행 번호나 열 번호를 지정하면 이차원 배열이 만들어짐
print(matrix[:, [0]])

🤍

[[0 1 2 3 4]
 [5 6 7 8 9]]
[0 5]
[[0]
 [5]]
  • numpy의 ndarray나 pandas의 DataFrame에서 
    하나의 열을 선택할 때 구조를 유지하기 위해서는 list로 설정

 

5) 조건에 맞는 데이터 선택

- 브로드캐스트 연산: numpy의 ndarray는 차원이 다른 데이터끼리 연산을 수행하면 순회하면서 연산 수행

- 산술 연산 -> 결과 리턴: 수치 데이터

- 논리 연산 -> 결과 리턴: bool의 배열

- 인덱싱 때 bool 배열을 대입 -> True인 데이터만 추출

- 논리 연산을 결합할 때 and, or를 사용하지 않고 &와 |를 사용해야 함

  • and, or는 하나의 연산을 하나의 결과 (True or False)로 보기 때문!
    and와 or는 좌측과 우측의 데이터를 무조건 하나의 데이터로 간주
    &와 |는 하나의 데이터끼리 연산을 하면 하나의 결과를 만들고 배열끼리 연산을 하면 배열을 만듦

- 파이썬에서 None, 숫자 0, 데이터가 없는 벡터 데이터 => False로 간주, 나머지 데이터는 True

print(matrix)
print(ar)

#브로드캐스트 연산

#numpy와 ndarray와 논리연산을 수행하면 bool의 배열이 만들어짐
print(ar==3)

#인덱스의 bool 배열을 대입하면 True인 데이터만 추출
print(ar[ar%2 ==1])

#홀수이거나 4의 배수인 데이터만 골라내기
print(ar[(ar % 2 == 1) | (ar % 4 == 0)])
  • 차원이 다른경우 차원을 순회하면서 연산 수행
  • 연산은 구조를 맞춰놓고 해야 한다.
[[0 1 2 3 4]
 [5 6 7 8 9]]
[0 1 2 3 4 5 6 7 8 9]
[False False False  True False False False False False False]
[1 3 5 7 9]
[0 1 3 4 5 7 8 9]

 

 

 

 

12. 연산

1) 포함 여부를 판단하는 연산

- in: 데이터가 포함돼있으면 True, 아니면 False

- not in: 데이터가 포함돼있으면 True, 아니면 False

 

 

2) 배열의 모든 요소에 함수 적용

- numpy.vectorize(함수)를 이용해서 벡터화된 함수 생성

  • 벡터화된 함수에 numpy의 배열을 대입하면 함수의 결과를 다시 배열로 만들어서 리턴
  • 함수는 반드시 리턴을 해야 한다. 
  • list에서 사용하는 map()함수와 동일한 작업
matrix = np.array([1, 2, 3])
print(matrix)

#요소의 제곱을 수행하는 람다 함수
square_lambda = lambda x : x * x

#함수를 배열의 모든 요소에 적용해서 결과를 배열로 만들기
vectorized_func = np.vectorize(square_lambda)

result = vectorized_func(matrix)
print(result)

🤍

[1 2 3]
[1 4 9]

 

데이터가 None 이면 0 100보다 크면 100 으로 한 결과 배열 생성
#None을 걸러내는 작업을 먼저 해야 합니다.

ar = np.array([80, 70, 80, None, 120])

def preprocessing(data) -> int:
    if data == None:
        return 0
    elif data > 100:
        return 100
    else:
        return data
    
vec_func = np.vectorize(preprocessing)
print(vec_func(ar))

🤍

[ 80  70  80   0 100]

 

 

3) 배열의 전치와 축 변경

- 전치: 행과 열 반전

- 축 변경: 3차원 이상에서 데이터의 축 순서를 바꾸는 것

- 머신러닝 등 데이터의 증강(늘리는 것)이나 다양한 패턴을 찾을 때 사용

- 행렬은 T라는 속성으로 전치 가능

- numpy의 배열에는 transpose 메소드에서 축 순서를 설정하면 축 순서를 변경

  • 축의 순서는 기본적으로 행(0), 열(1), 면(2)...

- 실제적으로 3차원 이상의 데이터는 차원 변경을 잘 하지 않음

  • 3차원 이상의 차원 변경은 애니메이션에서 수행
#행렬의 전치 - 축변경
original = np.array([[1, 2, 3], [4, 5, 6]])

print(original)
print(original.T)
print(original.transpose(1, 0))

🤍

[[1 2 3]
 [4 5 6]]

[[1 4]
 [2 5]
 [3 6]]

[[1 4]
 [2 5]
 [3 6]]

 

 

4) 랜덤

- 머신러닝 · 데이터 분석에서 샘플데이터 추출할 때 사용

  • 정수인 seed 를 설정해서 난수표를 만들고 순서대로 데이터를 가져오는 것
  • seed 값을 실시간으로 변경
    • 프로그래밍 언어 별로 seed 값이 실시간으로 변경되는 언어가 있고, 고정된 언어가 있음
    • 머신러닝에서는 seed를 고정한다.

메소드

numpy.random.seed(seed)
  • 시드 설정
  • seed: 시드 번호
numpy.random(데이터 개수)
  • 0.0 ~ 1.0 사이의 숫자를 개수만큼 추출
numpy.randint(최소, 최대, 데이터 개수)
  • 최소와 최대 사이에서 개수만큼 정수를 추출
numpy.rand(데이터 개수)
  • 균등 분포에서 데이터 개수만큼 추출
numpy.randn(데이터 개수)
  • 표준 편차가 1, 평균이 0인 정규 분포에서 데이터 개수만큼 추출
numpy.binomial(n, p, size)
  • 이항분포에서 추출.
  • n: 0부터 나올 수 있는 숫자까지의 범위
  • p: 확률
  • size: 개수
numpy.random.permutation(x)
  • 정수를 설정해서 랜덤한 배열을 생성
numpy.random.shuffle(x)
  • 랜덤한 배열을 생성
numpy.random.choice()
  • 배열에서 복원 추출

 

- 복원 추출:  이번에 생성된 데이터를 그룹에 다시 포함시켜 추출하는 것

- 비복원 추출:  생성된 데이터를 그룹에 포함시키지 않고 추출

 

파이썬은 실행될 때 seed를 설정하지 않으면 seed를 실행 시간을 기준으로 설정

#랜덤한 숫자 추출의 개념

#seed를 설정하지 않으면 실행 시간을 기준으로 seed 가 설정되므로 
#실행할 때 마다 다른 숫자가 리턴
result = np.random.normal(size = 5)
print(result)

#seed를 42로 고정하면 실행할 때 마다 동일한 데이터가 리턴
np.random.seed(seed=42)
result = np.random.normal(size = 5)
print(result)

🤍

[ 0.30064545 -1.12631817  0.86785173  0.76195105  0.9716669 ]
[ 0.49671415 -0.1382643   0.64768854  1.52302986 -0.23415337]

 

 

 

13. Numpy 메소드

1) 메소드 분류

- Unary Function: 매개변수가 1개인 경우

- Binary Function: 매개변수가 2개인 경우

 

 

2)기본 통계 함수

- sum: 합계

- prod: 곱
- nanprod: None 을 1로 간주하고 곱
- nansum: None을 0으로 간주하고 합

- mean: 평균
- median: 중앙값
- max: 최대
- min: 최소

- std: 표준편차
- var: 분산

- percentile: 백분위수

  • axis: 2차원 배열에서 행이나 열방향 과 관련된 옵션
  • ddof: 표준 편차 와 분산은 ddof를 1로 설정해서 비편향 표준 편차 와 분산을 계산.
  • 자유도는 다른 데이터의 값이 결정되면 자동으로 값이 결정되는 데이터의 개수
#4행 3열짜리 배열 생성
matrix = np.arange(1, 13).reshape((4, -1))
print(matrix)

#전체 데이터의 합계
print(np.sum(matrix))

#열의 합계
print(np.sum(matrix, axis=0))

#행의 합계
print(np.sum(matrix, axis=1))

🤍

[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
78
[22 26 30]
[ 6 15 24 33]

 

 

 

- 피보나치 수열

  • 첫번째 와 두번째는 무조건 1 이고 세번째부터는 앞 2개의 항의 합으로 만들어지는 수열
  • 1, 1, 2, 3, 5, 8, 13, 21, 34, 55...
#피보나치 수열

def fibo(n: int) -> int:
    if n == 1 or n == 2:
        return 1
    else:
        return fibo(n-1) + fibo(n-2)
print(fibo(6))

def norecursion_fibo(n:int) -> int:
    n1 = 1
    n2 = 1
    v = 1
    for i in range(3, n+1):
        v = n1 + n2
        n2 = n1
        n1 = v
    return v
print(norecursion_fibo(6))

8

8

 

- 표준 편차와 분산

  • 표준 편차 와 분산은 ddof 옵션에 따라 값이 다르게 나옴
  • 표준 편차 와 분산은 평균이 결정되고 전체 데이터 개수 - 1 만큼의 값을 알게되면
  • 나머지 1개의 값은 자동으로 결정된다.
  • 자동으로 결정되는 값을 빼고 계산하거나 포함시켜 계산할 수 있다.
  • 이 옵션이 ddof 옵션
matrix = np.arange(1, 13).reshape((4, -1))
print(np.var(matrix))
print(np.var(matrix, ddof=1))

🤍

11.916666666666666
13.0

 

 

3) 기술 통계

- argmin, argmax: 최소값 과 최대값의 인덱스

- cumsum: 누적합

- cumprod: 누적곱

- diff: 차분은 이전 값을 뺀 값, n 이라는 옵션으로 차수를 설정할 수 있습니다.

 

 

4) 소수 관련 함수

- 소수를 버리거나 올림하거나 반올림해주는 함수를 제공

 

 

5) 숫자 처리 관련 함수

- 절대값, 제곱, 제곱근, 부호 판별 함수를 제공

 

 

6) 논리 함수

- numpy.isnan(배열): 배열에 None, NULL 등이 포함 여부를 리턴

- numpy.nanNone을  표현

- logical_not( ): 조건에 맞지 않는 데이터 인지 여부를 리턴

#배열 생성
ar = np.array([10, 2, 3, 4, np.nan, 32, 42])

#배열에 None 데이터가 있는지 확인
print(np.isnan(ar)) #결측치 확인

#결측치를 제외하고 가져오기
result = ar[np.logical_not(np.isnan(ar))]
print(result)

#결측치를 제외하고 가져오기 - 결측치를 제거하지 않고 수행하면 nan 이 포함됩니다.
#ar을 가지고 수행하면 np.nan 이 포함되고 result를 가지고 수행하면 np.nan이 제거
result = result[np.logical_not(result > 10)]
print(result)

ar = np.array([2, 5, 23, 34, 21, 42, np.nan, 25])
print(ar)
#3의 배수이거나 4의 배수인 데이터만 추출 np.nan을 제거
temp = ar[np.logical_not(np.isnan(ar))]
result = temp[(temp % 3 == 0) | (temp % 4 ==0)]
print(result)

🤍

[False False False False  True False False] #결측치 확인
[10.  2.  3.  4. 32. 42.] #결측치 제외한 값
[10.  2.  3.  4.]
[ 2.  5. 23. 34. 21. 42. nan 25.]
[21. 42.]

 

 

7) 2개의 배열로 작업하는 함수

- add, subtract, multiply, divide, floor_divide(몫만 가져오기), mod

- power

- maximum, fmax, minimum, fmin

  • f 가 붙는 함수는 np.nan을 무시

- greater, greater_equal, less, less_equal, equal, not_equal: 결과가 bool 의 배열

- logical_and, logical_or, logical_xor

  • eXclusive OR(배타적 논리합, 같으면 False 다르면 True, True 와 True 또는 False 와 False 이면 False 가 되고 True 와 False로 데이터가 다르면 True 가 되는 연산)

- where(bool 배열, True 일 때 선택할 배열, False 일 때 선택할 배열)

 

 

8) 집합 관련 함수

- unique(): 중복을 제거

  • 범주형에서 이상치를 찾는 데 사용

- intersect1d(): 교집합

- union1d(): 합집합

- in1d(): 데이터의 존재 여부를 bool 배열로 리턴

- setdiff1d(): 차집합

- setxor1d(): 한쪽에만 존재하는 데이터의 집합

#아래 데이터는 1, 2, 3, 4 중에 하나를 선택하는 범주형 데이터의 집합
#이상한 값이 있는지 확인
ar = np.array([2, 1, 3, 4, 5, 1, 2, 3])
print(np.unique(ar))

🤍

[1 2 3 4 5]

 

 

9) ndarray.sort()

  • numpy sort는 리턴,  ndarray sort는 리턴X
  • 내림차순 정렬은 numpy의 sort를 이용
  • 2차원 배열은 numpy에서는 sort 를 잘 사용하지 않음 - (데이터의 인덱스가 깨짐)
ar = np.array([2, 1, 3, 4, np.nan])
print(ar.sort())
print(ar)
print(np.sort(ar)[::-1])
matrix = np.array([[1, 3, 2, 4], [9, 4, 1, 8]])
matrix.sort(axis = 0)
print(matrix)

🤍

None #리턴X
[ 1.  2.  3.  4. nan]
[nan  4.  3.  2.  1.]
[[1 3 1 4]
 [9 4 2 8]]

 

 

 

10)배열 분할

- numpy.split: 배열 그리고 개수 와 axis 옵션을 설정

 

 

 

11) 배열 결합

- numpy.concatenate ( 배열 2개, axis )

- hstack, vstack, dstack, stack, r_, c_, tile 함수

 

* hstack, vstack 자주 씀

테이블의 데이터가 너무 많아서 조회가 느린 경우 테이블을 분할해서 저장할 수 있는데
열을 분할하거나 행을 분할(Partition)한다.

열 단위로 분할할 때, 기본키를 양쪽 테이블에 갖게 하고 자주 사용하는 열과 자주 사용하지 않는 열로 나눈다.
1:1의 관계를 갖는 구조.

데이터베이스에서는 조인을 통해 하나의 테이블로 변환하는데
hstack은 행의 개수가 같을 때 옆으로 갖다 붙이자! 
vstack은 열의 개수가 같을 때 위아래로 갖다 붙이자! 

 

hstack: 행의 개수가 같은 두개 이상의 배열을 옆으로 연결하는 함수

vstack:  열의 개수가 같은 두개 이상의 배열을 상하로 연결하는 함수

dstack: 차원을 늘려서 결합

stack: dstack 함수를 확장한 것으로 차원의 위치(axis)를 직접 설정

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

r_: hstack과 유사한 예전 API

c_: vstack과 유사한 예전 API

tile: 배열을 반복해서 하나의 배열을 만드는 것     tile(배열, 반복횟수)

 

#htstack
ar = np.array([[1, 2, 3], [4, 5, 6]])
print(ar)
br = np.array([[11, 22, 33], [44, 55, 66]])
print(br)
print(np.hstack([ar, br]))
print(np.vstack([ar, br]))
print(np.dstack([ar, br]))

🤍

[[1 2 3]
 [4 5 6]]
 
[[11 22 33]
 [44 55 66]]
 
[[ 1  2  3 11 22 33]
 [ 4  5  6 44 55 66]]
 
[[ 1  2  3]
 [ 4  5  6]
 [11 22 33]
 [44 55 66]]
 
[[[ 1 11]
  [ 2 22]
  [ 3 33]]

 [[ 4 44]
  [ 5 55]
  [ 6 66]]]

 

 

 

 

14. 배열의 저장과 불러오기

1) 배열을 저장

numpy.save('파일 경로', 배열)
  • 파일의 확장자는 관습적으로 npy 를 사용

2) 배열의 데이터 불러오기

numpy.load('파일 경로')

3) 여러 개의 배열을 저장

numpy.savez('파일 경로', 이름 = 데이터, ...

이렇게 저장한 데이터는 불러올 때 numpy.load('파일 경로', '이름') 사용

4) 머신 러닝 중 자주 사용하는 데이터가 있다면 npy 로 저장한 후 호출하는 것이 효율적

 

 

 

 

'Python' 카테고리의 다른 글

[Python] 크롤링 - 기사 스크래핑  (0) 2024.02.14
[Python] Pandas  (1) 2024.02.08
Day10. REST API  (0) 2024.01.26
Day9. 웹 서버 만들기  (1) 2024.01.24
Day8. 가상환경 만들기  (1) 2024.01.19

[Tableau] 대시보드

0ㅑ채
|2024. 2. 6. 11:35
  • 하나 이상의 목표를 달성할 때 필요한 가장 중요한 정보의 시각적 디스플레이
  • 하나의 화면에 통합 및 정렬되어서 한눈에 정보를 모니터링
  • 범례, 필터, 매개변수, 텍스트, 컨테이너, 이미지, 확장, 단추, 웹 개체와 같은 구성 요소와 함께
    하나의 캔버스에 놓인 개별 시각화의 배열
  • 데이터 스토리를 전달하는 단위

 

 

데이터 스토리 지침

- 메인 스토리와 관련 없는 모든 것은 제외

- 데이터 스토리는 목표가 있어야 하고 관련 없는 모든 것은 제외

- 쉽게 이해할 수 있도록 만들어야 하고 주요 아이디어는 명확하게!

- 데이터 스토리를 읽는 청자가 결론을 도출할 수 있게 만든다.

 

 

 

대시보드 목적

- 안내 분석: 대시보드를 만드는 쪽에서 데이터분석 결과 발견

- 탐색: 결론을 당장 내리기 어려운 경우 대시보드는 탐색이 목적

  • 데이터 수집 초기에 만드는 대시보드는 탐색이 목적

- 스코어 카드: 대시보드를 보고 바로 어떤 동작을 취할 수 있도록 해주는 경우

- 내러티브: 데이터 스토리 전달

 

 

 

 

대시보드 액션

- 하이라이트 액션: 설정한 값에는 색상을 지정, 다른 모든 값은 블러

- URL 이동: 대시보드 내의 값을 선택하면 웹 페이지로 아웃 링크 발송

 

 

 

 

하이라이트와 URL 이동 기능 구현

- 데이터 원본: 플랜잇 소셜 미디어 채널_2019.xlsx

 

- 열을 행으로 치환: Pivot

전환할 열을 선택 > 우상단의 삼각형 > 피벗

 

- 소셜 미디어 채널 URL 시트 가져오기

  • 두번째 시트를 추가했는데 동일한 구조면 Union, 그렇지 않으면 Join 수행
  • 두 시트에 동일한 이름의 필드가 있으면 그 필드로 Join 수행, 없으면 Error

- 소셜 미디어 채널을 이용해 Join

  • 조인 후에는 사용한 필드가 모두 화면에 보이기 때문에 하나는 숨기기 

 

- 시트를 선택

 

마크: 소셜미디어 채널 - 모양

열: 소셜미디어 채널

 

 

- 아이콘으로 사용할 이미지파일 다운로드

 

- 다운로드 받은 이미지 파일 복사

  • /MyDocuments/My Tableau Repository/Shapes 디렉토리에 폴더로 저장하면 아이콘 사용 가능

- 마크 모양 세부편집 > 팔레트 선택 > 팔레트 할당

 

 

마크: 세부정보 - [URL]

이름.png를 쓰면 자동으로 sort된 거랑 안맞아서, 저장할 때는 01.png로 해주는게 좋다. 

아니면 모양 세부정보 들어가서 일일이 바꿔주기

 

 

열: 월 - 연속형

 

 

- 4개의 분류가 하나의 뷰에 그려지게 설정

나눠서 그릴 때 이중축이 필요하면 (이중축은 값2개 필요) 마크 색상에 두기 

 

 

 

 

 

 

대시보드 구성

 

 

 

대시보드 동작

툴바 대시보드 > 동작 > 하이라이트 추가

 

 

 

 

 

 

'Tableau' 카테고리의 다른 글

[Tableau] 기타 차트  (1) 2024.02.05
[Tableau] 히스토그램  (1) 2024.02.05
[Tableau] Gantt 차트  (0) 2024.02.05
[Tableau] 테이블 수준 계산  (0) 2024.02.05
[Tableau] 함수  (0) 2024.02.05

[Tableau] 기타 차트

0ㅑ채
|2024. 2. 5. 17:48

 

라운드형 막대

막대 그래프에서 두께에 변화를 주는 형태로 작성
 

 
 
 
 

캘린더 차트

날짜 필드를 기준으로 달력의 형태 차트
요일별 혹은 평일/휴일 분리해서 패턴 파악
 
열: 주문일자 - 불연속형 년/월,  주문일자 - 불연속형 요일이름
행: 주문일자 - 불연속형 요일 주차
주문일자 - 텍스트

 
특정 월만 출력
[주문일자] 필터로 드래그 > 연도/월 > 날짜 선택
[수익] - 색상
마크 - 사각형

 
 
 
 

도넛 차트

  • 파이 차트에서 가운데에 구멍을 뚫어놓은 도넛 모양
  • 구멍에 추가 내용 또는 세부 정보를 전달할 수 있어서 파이차트보다 시각적인 효과 Good\

  • But 파이차트 계열은 데이터 수가 5개 이상이면 정보 전달 기능이 떨어짐
    • 이런 경우는 사각형 차트 이용

 
 
 

Pyramid Bar & Diverging Chart

  • 좌우 대칭이 되는 막대 차트
  • 세로 축을 공유하며 가로 축은 반대 방향으로 뻗어나감
  • 성별의 차이와 같이 2가지 대상을 동일한 기준으로 비교분석
  • 비즈니스 인사이트 도출이 목적이라면 좌우에 이미지 등을 추가해서 이 차트를 읽기 전에 도출할 수 있게 만드는 것이 중요

이미지 등을 붙여주는게 좋다.

 
 
 
 

Table Chart

  • 여러 수치 정보를 테이블 형태로 출력
  • 차트와 수치를 함께 출력하는 것이 가능
  • 집계 수준을 요약한 테이블 차트

- 수익률 필드 생성
계산된 필드: 수익률
SUM([수익]) / SUM([매출])
 
- Total이라는 문자열 출력하는 필드 생성
계산된 필드: Total
'Total'
 
- 제품 계층 생성
'Total > 대분류 > 중분류'
3개의 필드를 한번에 선택 > 마우스 우클릭 > 계층 > 계층 생성
 
열: 지역, 축1, 축2

  • 축: 더블클릭하여 0 입력

행: 제품 계층 - 모든 계층 표시
축2 우클릭 > 이중축

 
 
그래프 모양으로 만들기
: 위쪽 합계 선택 > Gantt 차트 선택 , 매출 - 텍스트
: 아래쪽 합계 선택 > 측정값 이름 중 [수익률]

 
 

단일축 이중축

 

 

 

 

 

기울기 차트

  • 하나의 기간이나 상태로부터 다른 기간이나 상태로 값이 변화하는 것을 출력
  • 2개의 기간을 이용하면 기울기 차트, 여러 개의 기간을 이용하면 범프 차트

 

Superstore.csv

2017년부터 2018년까지 West 지역 내 각 주(State)의 판매 순위 변화

 

계산된 필드: 판매순위

RANK(SUM([Sales]))

 

열: Order Date 

필터: Order Date - 2017, 2018 선택, Region - West

마크: 텍스트 - State

행: 판매 순위 우클릭 > Compute Using > State

Order date
열에 있는 연도의 영향을 받아서 순위를 지정한다.
열과 행의 영향을 받기 때문에 
State로 지정해주는 작업이 필요하다.

 

축 우클릭 > 축 편집 > Reverse

 

 

 

 

 

범프 차트

2개의 기간보다 많은 기간을 가지고 그리면 범프 차트

 

 

 

'Tableau' 카테고리의 다른 글

[Tableau] 대시보드  (1) 2024.02.06
[Tableau] 히스토그램  (1) 2024.02.05
[Tableau] Gantt 차트  (0) 2024.02.05
[Tableau] 테이블 수준 계산  (0) 2024.02.05
[Tableau] 함수  (0) 2024.02.05

[Tableau] 히스토그램

0ㅑ채
|2024. 2. 5. 16:11
  • 빈도수를 나타내는 그래프
  • 쇼핑몰에서는 재구매에 걸리는 날짜가 중요
    • 이 날짜를 이용해서 적절한 이벤트를 제시

 

고객 재구매 이력 히스토그램

- 재구매 날짜 간격을 알아보기 위해 계산

  • 계산된 필드: 고객별 첫 주문일자   
    {FIXED [고객명] : MIN([주문 일자]) }
  • 계산된 필드: 고객별 재주문일자 
    IIF([주문 일자] > [고객별 첫 주문일자], [주문 일자], NULL)
  • 계산된 필드: 고객별 두번째 주문일자   
    {FIXED [고객명] : MIN([고객별 재주문일자]) }

 
- 두번째 주문일자와 첫 주문일자 사이의 간격 계산

  • 계산된 필드:  고객별 첫 주문 후 두번째 주문까지 걸린 날짜 
    DATEDIFF('day', [고객별 첫 주문일자], [고객별 두번쨰 주문일자])

 
- 히스토그램을 위한 구간차원 만들기 (Binning)

  • 구간차원: 넓은 범위의 숫자 데이터를 일정한 간격 또는 일정한 구성 비율로 만들기위해 구간 설정
연속형 데이터는 범주로 쓰기 어렵기 떄문에 구간화를 해줘야 한다.

 
 
[필드] 우클릭 > Create > Bins.. > Size of bins

  • 어떤 구간이 좋은지는 계속 확인해봐야 한다.

행: 고객명 - 측정값: Count(D)
열: [Bins] 우클릭 > 연속형

 
 
 

 

 

 

 

'Tableau' 카테고리의 다른 글

[Tableau] 대시보드  (1) 2024.02.06
[Tableau] 기타 차트  (1) 2024.02.05
[Tableau] Gantt 차트  (0) 2024.02.05
[Tableau] 테이블 수준 계산  (0) 2024.02.05
[Tableau] 함수  (0) 2024.02.05