"Pandas:DataFrame:다른 형태로 저장하고 불러오기"의 두 판 사이의 차이

Pywiki
둘러보기로 가기 검색하러 가기
잔글 (→‎mysql)
 
(같은 사용자의 중간 판 8개는 보이지 않습니다)
2번째 줄: 2번째 줄:
 
데이터프레임을 사용했다면 그냥 여기에서 멈추는 것이 아니라, 다른 형태로 저장해두어야 추후에 불러와 사용할 수 있다.
 
데이터프레임을 사용했다면 그냥 여기에서 멈추는 것이 아니라, 다른 형태로 저장해두어야 추후에 불러와 사용할 수 있다.
  
= mysql =
+
표형 데이터는 판다스로 쉽게 가져올 수 있다.
mariasql도 동일하다.
 
  
=== sqlalchemy 사용 ===
+
page = requests.get(url)
방법은 굉장히 간단하다. 다만, 프라이머리키가 중복된 데이터가 있는 경우엔 적용할 수가 없다.(이런 경우엔 겹치는 데이터를 제거해준 후 넣어야 한다.)
+
 
 +
tables = pd.read_html(page.text)
 +
 
 +
== 엑셀, CSV ==
 +
데이터프레임을 엑셀로 저장하거나, 엑셀파일을 데이터프레임으로 불러오거나.
 +
 
 +
2차원 데이터를 다루는 가장 쉬운 방법은 엑셀을 이용하는 것. 저장하고 시각화 하는 데 엑셀을 이용한다면 굉장히 편리할 것이다.
 +
 
 +
=== 사전준비 ===
 +
엑셀 관련기능을 사용하려면 관련 라이브러리를 설치해야 한다.
 
{| class="wikitable"
 
{| class="wikitable"
 
!과정
 
!과정
12번째 줄: 20번째 줄:
 
!방법
 
!방법
 
|-
 
|-
|라이브러리 설치
+
|openpyxl
 
|
 
|
|pip install sqlalchemy
+
|pip install openpyxl
 +
|}
 +
 
 +
=== 사용 ===
 +
{| class="wikitable"
 +
!과정
 +
!설명
 +
!방법
 
|-
 
|-
|모듈 임포트
+
|파일 저장하기
|
+
|openpyxl 따위의'''<nowiki/>''' '''<nowiki/>'''라이브러리 설치가 선'''<nowiki/>'''행되'''<nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/>'''어야 한다.
|from sqlalchemy import create_engine
+
아래 두 방법으로 df를 엑셀에 저장한다.
|-
+
 
|엔진 연결
+
 
|DB를 만든 후에 DB와 연결할 수 있다.
+
객체.to_excel('''<nowiki/>'<nowiki/>'''c:\\경로.xlsx'''<nowiki/>'''')
 +
 
 +
객체.to_csv('''<nowiki/>'<nowiki/>'''c:\\경로.csv'''<nowiki/>'''')
 
|<syntaxhighlight lang="python">
 
|<syntaxhighlight lang="python">
engine = create_engine("mysql+pymysql://{user}:{pw}@localhost/{db}"
+
import os  # 저장경로를 지정하기 위함.
                      .format(user="root",  # sql 계정 입력.
+
 
                              pw="0000",  # sql 비밀번호 입력.
+
wd = os.getcwd()  # 현재 디랙터리.
                              db="dbname")# 연결할 db이름 입력.
+
file_dir = '{}\\경로명\\'.format(wd)    # 저장할 경로 지정.
 +
file_name = '파일이름'                  # 저장할 이름 지정.
 +
df.to_excel(file_dir + file_name)       # 파일저장.
 
</syntaxhighlight>
 
</syntaxhighlight>
 
|-
 
|-
|sql로 전환
+
|파일 불러오기
|이미 만들어진 테이블에 dataframe을 넣는다.
+
|openpyxl 따위의 라이브러리 설치가 '''<nowiki/>'''선'''<nowiki/>'''행되어야 한다.
(역시, 테이블은 미리 준비되어야 한다.)
+
아래 두 방법으로 불러온다.
 +
 
 +
객체 = p'''<nowiki/>'''a'''<nowiki/>'''ndas.read_e'''<nowiki/>'''xc'''<nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/>'''el('''<nowiki/>'<nowiki/>'''c:\\경로.xlsx'''<nowiki/>'''')'''<nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/>'''
  
옵션은 아래에서 설명한다.
+
객체 = pandas.read_csv('''<nowiki/>''''c:\\경로.csv')
|<syntaxhighlight lang="python">
+
 
data.to_sql('테이블명', con = engine, if_exists = 'append', chunksize = 1000)
+
보통 첫번째 시트만 df로 만든다.
</syntaxhighlight>
+
|저장했던 엑셀파일을 불러오면 저장한 df 그대로 사용되는 게 아니라, 엑셀의 제한된 기능에 따라 변형되기 때문에 칼럼을 다시 만져주어야 제대로 사용할 수 있다. 기본적으로 맨 윗줄을 칼럼 처리한다.(상관없으면 그냥 쓰고;)
 +
때문에 df['열이름'] = pd.to_numeric(df['열이름']) 형태로 데이터형을 다시 통일, 설정해주어야 한다.
 +
 
 +
 
 +
인덱스 지정은 따로 하지 않는다. 'index_col=숫자' 옵션으로 인덱스를 지정할 수도 있다.
 +
 
 +
Sheet_name='시트명' 옵션으로 해당 시트를 열 수도 있다.
 
|-
 
|-
|옵션값
 
| colspan="2" |
 
{| class="wikitable"
 
!인자
 
!설명
 
|-
 
|if_exists
 
 
|
 
|
{| class="wikitable"
+
|
!옵션
+
|
!설명
 
|-
 
|appends
 
|기존에 데이터가 들어가 있으면 덧붙인다.
 
|-
 
|replace
 
|기존의 데이터를 대체한다.(테이블 단위로 덮어씌워, 기존 데이터는 사라진다.)
 
|-
 
|fail
 
|테이블 안에 데이터가 있으면 아무것도 하지 않음.
 
 
|}
 
|}
|-
 
|chunksize
 
|한 번에 몇 개의 데이터를 처리할지.
 
|}
 
|}
 
 
==== 관련에러 ====
 
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, "Access denied for user '.....'@'localhost' (using password: YES)")
 
  
위 형태의 에러는... 99% 확률로 DB에 대한 정보를 잘못 입력했기 때문에 나오는 에러이다.
+
= Json =
 +
데이터프레임을 Json으로 바꾸거나 Json을 데이터프레임으로.
  
=== 단순 입력 ===
+
범용적으로 쓰이는 데이터 전달 포멧. 장고 등 서비스에서 스프레드시트를 파일로 저장하는 것도 좋지만, json화 하여 저장하는 것도 방법이 될 수 있다.
 
{| class="wikitable"
 
{| class="wikitable"
 
!과정
 
!과정
76번째 줄: 79번째 줄:
 
!방법
 
!방법
 
|-
 
|-
|라이브러리 설치
+
|Json으로 변환
|
+
|데이터프레임을 json으로.
|pip install pymysql
+
|<syntaxhighlight lang="python">
|-
+
import pandas as pd
|모듈 임포트
+
 
|
+
df = pd.read_excel(uploadedFile)  # 어떤 방식으로든 df를 만들고..
|import pymysql
+
json_text = df.to_json()
 +
</syntaxhighlight>
 
|-
 
|-
|DB연결
+
|Json을 dataframe으로
|
+
|단순히 읽으면 된다.
|DB = pymysql.connect(host='localhost', port=3306, db='db이름', user="root", passwd='비밀번호', charset='utf8')
 
|-
 
|커서생성
 
|sql을 순회하는 커서 생성
 
|cur = self.coinDB.cursor()
 
|-
 
|함수제작
 
|함수로 만들어 처리하면 편할 듯하다.
 
DB 객체와 테이블명을 넣어 작동한다.
 
 
|<syntaxhighlight lang="python">
 
|<syntaxhighlight lang="python">
def df_to_db(df, db, table):
+
import pandas as pd
    '''df를 받아 db에 저장하는 것.'''
+
 
    cur = db.cursor()  # 커서를 만든다.
+
df = pd.read_json('test.json')
    cols = "`,`".join([str(i) for i in df.columns.tolist()])  # df의 칼럼을 추출한다.
 
    for i, row in df.iterrows():  # 하나씩 입력한다.
 
        try:
 
            sql = "INSERT INTO `{table}` (`{cols}`) VALUES (".format(table=table, cols=cols) +  "%s," * (
 
                        len(row) - 1) + "%s)"  # 마지막엔 쉼표 없이.
 
            cur.execute(sql, tuple(row))
 
            # the connection is not autocommitted by default, so we must commit to save our changes
 
            db.commit()
 
        except Exception as e:
 
            # print(e)
 
            pass
 
 
</syntaxhighlight>
 
</syntaxhighlight>
 
|}
 
|}
[[분류:Pandas:DataFrame]]
+
 
 +
= HTML =
 +
웹문서에서 읽어온 데이터를 바로 dataframe화 하는 경우도 필요하다.
 +
{| class="wikitable"
 +
! 의도
 +
!방법
 +
!설명
 +
|-
 +
|데이터 불러오기
 +
|객체 = pandas.read_html('''h<nowiki/>t<nowiki/>ml 문서''')'''<nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/><nowiki/>'''
 +
|'''<nowiki/>'''html 문서의 데이터타입은 str이어야 한다. requests 등으로 웹문서를 불러와 변환해 넣으면 된다.'''<nowiki/><nowiki/><nowiki/>'''
 +
|}표형 데이터는 쉽게 가져올 수 있다.<syntaxhighlight lang="python">
 +
page = requests.get(url)
 +
tables = pd.read_html(page.text)
 +
</syntaxhighlight>  [굳이 .text 속성에 접근해야 하네;;? 그냥 객체와 text속성은 어떻게 다른지 보자.]
 +
 
 +
여러 테이블이 있는 경우, 데이터프레임이 들어있는 리스트로 반환된다.

2023년 2월 1일 (수) 12:38 기준 최신판

1 개요[편집 | 원본 편집]

데이터프레임을 사용했다면 그냥 여기에서 멈추는 것이 아니라, 다른 형태로 저장해두어야 추후에 불러와 사용할 수 있다.

표형 데이터는 판다스로 쉽게 가져올 수 있다.

page = requests.get(url)

tables = pd.read_html(page.text)

2 엑셀, CSV[편집 | 원본 편집]

데이터프레임을 엑셀로 저장하거나, 엑셀파일을 데이터프레임으로 불러오거나.

2차원 데이터를 다루는 가장 쉬운 방법은 엑셀을 이용하는 것. 저장하고 시각화 하는 데 엑셀을 이용한다면 굉장히 편리할 것이다.

2.1 사전준비[편집 | 원본 편집]

엑셀 관련기능을 사용하려면 관련 라이브러리를 설치해야 한다.

과정 설명 방법
openpyxl pip install openpyxl

2.2 사용[편집 | 원본 편집]

과정 설명 방법
파일 저장하기 openpyxl 따위의 라이브러리 설치가 선행되어야 한다.

아래 두 방법으로 df를 엑셀에 저장한다.


객체.to_excel('c:\\경로.xlsx')

객체.to_csv('c:\\경로.csv')

import os  # 저장경로를 지정하기 위함.

wd = os.getcwd()  # 현재 디랙터리.
file_dir = '{}\\경로명\\'.format(wd)    # 저장할 경로 지정.
file_name = '파일이름'                  # 저장할 이름 지정.
df.to_excel(file_dir + file_name)       # 파일저장.
파일 불러오기 openpyxl 따위의 라이브러리 설치가 행되어야 한다.

아래 두 방법으로 불러온다.

객체 = pandas.read_excel('c:\\경로.xlsx')

객체 = pandas.read_csv('c:\\경로.csv')

보통 첫번째 시트만 df로 만든다.

저장했던 엑셀파일을 불러오면 저장한 df 그대로 사용되는 게 아니라, 엑셀의 제한된 기능에 따라 변형되기 때문에 칼럼을 다시 만져주어야 제대로 사용할 수 있다. 기본적으로 맨 윗줄을 칼럼 처리한다.(상관없으면 그냥 쓰고;)

때문에 df['열이름'] = pd.to_numeric(df['열이름']) 형태로 데이터형을 다시 통일, 설정해주어야 한다.


인덱스 지정은 따로 하지 않는다. 'index_col=숫자' 옵션으로 인덱스를 지정할 수도 있다.

Sheet_name='시트명' 옵션으로 해당 시트를 열 수도 있다.

3 Json[편집 | 원본 편집]

데이터프레임을 Json으로 바꾸거나 Json을 데이터프레임으로.

범용적으로 쓰이는 데이터 전달 포멧. 장고 등 서비스에서 스프레드시트를 파일로 저장하는 것도 좋지만, json화 하여 저장하는 것도 방법이 될 수 있다.

과정 설명 방법
Json으로 변환 데이터프레임을 json으로.
import pandas as pd

df = pd.read_excel(uploadedFile)  # 어떤 방식으로든 df를 만들고..
json_text = df.to_json()
Json을 dataframe으로 단순히 읽으면 된다.
import pandas as pd

df = pd.read_json('test.json')

4 HTML[편집 | 원본 편집]

웹문서에서 읽어온 데이터를 바로 dataframe화 하는 경우도 필요하다.

의도 방법 설명
데이터 불러오기 객체 = pandas.read_html(html 문서) html 문서의 데이터타입은 str이어야 한다. requests 등으로 웹문서를 불러와 변환해 넣으면 된다.

표형 데이터는 쉽게 가져올 수 있다.

page = requests.get(url)
tables = pd.read_html(page.text)

  [굳이 .text 속성에 접근해야 하네;;? 그냥 객체와 text속성은 어떻게 다른지 보자.]

여러 테이블이 있는 경우, 데이터프레임이 들어있는 리스트로 반환된다.