'파이썬/데이터 분석'에 해당되는 글 4건

728x90

MariaDB 에서 SQL 데이터를 읽어서 Pandas DataFrame 에 출력하는 코드이다.

mariadb 와 mysql 둘 모두 테스트 결과 잘 읽어온다.

 

# pip install pymysql 또는 pip install mariadb
# pip install numpy scipy matplotlib ipython scikit-learn pandas pillow imageio
 
import pandas as pd
 
def query_mariadb(query):
    import pandas as pd
    import pymysql
    import mariadb
 
    # Connect to MariaDB (mariadb.connect 대신 pymysql.connect 로 해도 된다)
    dbconn = mariadb.connect(
        user="root",
        password="autoset",
        host="localhost",
        port=3306,
        database="python_sample"
    )
 
    # dbconn = mydb.cursor()  # 이 명령어는 불필요.
    # mariaDB Query to Pandas DataFrame
    query_result= pd.read_sql(query,dbconn)
    dbconn.close()
 
    return query_result
 
 
if __name__ == '__main__':
    sql = "SELECT * FROM cate"
    df = query_mariadb(sql)
    print(df)
 
 

 

앞 게시글에서 저장했던 SQL 데이터를 출력하는 것이라서 결과는 아래와 같다.

'파이썬 > 데이터 분석' 카테고리의 다른 글

Python Pandas CSV 읽고 DB 저장  (0) 2022.01.19
Python Pandas 기초 학습  (0) 2022.01.18
Pycharm과 Jupyter Notebook 연결하기  (0) 2022.01.12
블로그 이미지

Link2Me

,
728x90

판다스를 이용하면 대용량의 데이터도 쉽게 읽어서 분석할 수 있다.

 

 

https://www.data.go.kr/ 에서  샘플 데이터 가져오기

 

 

 

다운로드 받은 파일이 압축파일이며, 내용을 보면 아래와 같이  csv 파일로 되어 있다.

서울 파일을 영문이름으로 변경했다.

 

이제, 파이참(PyCharm)에서 코드를 실행해 본다.

https://www.w3schools.com/python/pandas/default.asp 에 기본적인 코드 사용법이 잘 나와있다.

 

 

 

import pandas as pd
 
# data = pd.read_csv('soho_seoul.csv', header=None) # KeyError: '상권업종대분류명'
df = pd.read_csv('soho_seoul.csv'# KeyError: '상권업종대분류명'
 
## Fastest would be using length of index
print("전체 행 : "len(df.index))
 
## If you want the column and row count then
row_count, column_count = df.shape
print("총 행(row) 수 : ", row_count)
print("총 칼럼(열) 수 : ", column_count)
 
# 데이터 셋 df의 종합적인 정보는 df.info( ) 함수를 통해 확인 가능
# Dtype의 int64는 정수, object는 문자열, float64는 실수를 의미
print(df.info())
 
# 데이터 프레임에서 결측치를 True, 값이 있으면 False를 반환
print(df.isnull())
 
# 각 column들이 몇개의 null값을 가졌는지 확인
is_null = df.isnull().sum()
print(is_null)
 

 

jupyter notebook 에서 df.info() 를 한 결과 화면이다.

 

 

열의 칼럼이 39개나 되어서 출력 결과가 보기 좋지 않아 칼럼 일부만 발췌해서 출력하는 걸 테스트했다.

 

# 위에서부터 지정된 개수만큼 출력하기
df_head = df.head(10# 개수를 지정하지 않으면 기본 5개 출력
print(df_head)
 
# 3 ~ 6번째 데이터 출력, 칼럼(열)은 10번째 열까지 출력
print(df.iloc[2:7,:10])
 
# 열 여러개 선택하기
new_df = df.head(20)[['상호명','상권업종대분류명','상권업종중분류명','상권업종소분류명','표준산업분류명','시군구명','행정동명','건물명']]
print(new_df)
 
# 맨 하단 10개 데이터를 칼럼(열) 10개만 출력
print(df.tail(10).iloc[:,:10])
 
print(df.tail(10)[['상가업소번호','상호명','상권업종대분류명','상권업종중분류명','상권업종소분류명','표준산업분류명','시군구명','행정동명','건물명']])
 
 

 

 

특정 칼럼 중복 제거 및 DB에 데이터 저장

# 특정 칼럼 중복 제거
item = df['상권업종대분류명'].drop_duplicates()
print(item)
 
# LIST로 변환
item_list = item.values.tolist()
print(item_list)
 
# 가나다순 정렬
varlist = sorted(item_list)
print(varlist)
 
# LIST to DB Insert
 

 

 

판다스에서 읽은 데이터를 mariaDB에 저장 테스트 목적으로 샘플 테이블을 생성했다.

다중 카테고리로 사용하는 테이블이다.

CREATE TABLE cate (
  `id` int(11NOT NULL,
  `parent_id` int(11NOT NULL DEFAULT 0,
  `depth` int(3NOT NULL DEFAULT 1,
  `name` varchar(50NOT NULL,
  `text` varchar(50DEFAULT NULL
ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
ALTER TABLE cate
  ADD PRIMARY KEY (`id`);
 
ALTER TABLE cate
  MODIFY `id` int(11NOT NULL AUTO_INCREMENT;
COMMIT;
 

 

데이터 무결성(중복 저장 방지)을 위해서 다중칼럼 UNIQUE 인덱스를 추가했다.

parent_id, depth, name 칼럼이 마치 1개의 칼럼처럼 동작하여 동일한 자료가 업로드되면 추가되지 않는다.

보통 userID 가 중복되지 않도록 1개의 칼럼에 UNIQUE 인덱스를 설정하는데, 데이터가 중복 저장되지 않도록 하기 위한 모든 칼럼에 다중 UNIQUE INDEX를 설정하면 중복 저장을 방지할 수 있다.

 

ALTER TABLE cate
  ADD UNIQUE KEY parentid_name (parent_id,depth,name);
 

 

DB에 데이터 Insert 과정의 소스 코드

csv 파일의 데이터를 읽어서 원하는 칼럼의 자료를 선택하고 중복된 값을 제거하고 DB에 카테고리화를 위한 데이터 저장 목적으로 코드를 연습해 본 것이다.

# pip install PyMySQL # mysql 연동시
# pip install mariadb
# pip install numpy scipy matplotlib ipython scikit-learn pandas pillow imageio
 
import pandas as pd
import mariadb
import sys
 
# Connect to MariaDB Platform
try:
    mydb = mariadb.connect(
        user="root",
        password="autoset",
        host="localhost",
        port=3306,
        database="python_sample"
 
    )
except mariadb.Error as e:
    print(f"Error connecting to MariaDB Platform: {e}")
    sys.exit(1)
 
# Get Cursor
dbconn = mydb.cursor()
 
 
# data = pd.read_csv('soho_seoul.csv', header=None) # KeyError: '상권업종대분류명'
df = pd.read_csv('soho_seoul.csv') # KeyError: '상권업종대분류명'
 
## Fastest would be using length of index
print("전체 행 : ", len(df.index))
 
## If you want the column and row count then
row_count, column_count = df.shape
print("총 행(row) 수 : ", row_count)
print("총 칼럼(열) 수 : ", column_count)
 
# 특정 칼럼 중복 제거
item = df['상권업종대분류명'].drop_duplicates()
print(item)
 
# LIST로 변환
item_list = item.values.tolist()
print(item_list)
 
# 가나다순 정렬
varlist = sorted(item_list)
print(varlist)
 
# 배열 사이즈 구하기
print(len(varlist))
 
# 배열 사이즈만큼 동일한 값 초기화, 두가지 방법 모두 가능
parent_id = [0 for i in range(len(varlist))]
depth = [1* len(varlist)
 
# Series 생성 및 DataFrame 전환 <== mariaDB 입력 데이터 생성 목적
df_parentid = pd.Series(parent_id)
df_depth = pd.Series(depth)
df_name = pd.Series(varlist)
 
df_all = pd.concat([df_parentid, df_depth, df_name, df_name], axis=1)
print(df_all)
 
# DataFrame to List
db_itemlist = df_all.values.tolist()
print(db_itemlist)
 
# LIST to mariaDB Insert
sql = "INSERT INTO cate(parent_id,depth,name,text) VALUES(%s,%s,%s,%s)"
dbconn.executemany(sql,db_itemlist)
 
 

 

 

DB에 잘 저장되었는지 여부를 확인해 보자.

 

 

파일을 다시 한번 더 실행하면 아래와 같은 에러 메시지를 출력한다.

 

위와 같은 메시지가 출력되는 걸 방지하고 싶다면, INSERT IGNORE INTO 로 변경하면 된다.

중복하려는 자료가 있다면 기존 자료를 유지하고, 새로운 자료는 무시하라는 명령어이다.

 

# LIST to mariaDB Insert
sql = "INSERT IGNORE INTO cate(parent_id,depth,name,text) VALUES(%s,%s,%s,%s)"
dbconn.executemany(sql,db_itemlist)
dbconn.close()
 

 

 

'파이썬 > 데이터 분석' 카테고리의 다른 글

MariaDB to Python Pandas DataFrame  (0) 2022.01.21
Python Pandas 기초 학습  (0) 2022.01.18
Pycharm과 Jupyter Notebook 연결하기  (0) 2022.01.12
블로그 이미지

Link2Me

,
728x90

pandas란 엑셀처럼 테이블(표)로 된 데이터를 다룰 때 아주 유용한 도구이다.

판다스는 데이터 분석용 언어인 R의 data.frame 구조를 본뜬 DataFrame이라는 구조를 사용하기 때문에, R의 data.frame의 기능들을 대부분 사용할 수 있도록 만들어졌다.

index 를 제외한 각 열(Column)을 Series라고 부른다.

각 열 단위(Series)가 모여 하나의 표를 DataFrame 이라고 부른다.

 

 

아래 코드는 jupyter notebook 환경에서 실습하면 된다.

https://link2me.tistory.com/2094  게시글에 라이브러리 설치와 Jupyter notebook 설치하는 방법이 기술되어 있다.

 

index 를 내가 원하는 형식으로 변경할 수 있다.

import pandas as pd
# Series 는 인덱스와 값으로 구성된다.
 
array = pd.Series(['사과''바나나''당근'], index=['a','b','c'])
 
print(array)
print()
 
# index 출력하기
for i in array.index:
    print(i)
    
print()
 
# value 출력하기
for val in array.values:
    print(val)

 

import pandas as pd
data = {
    'a''사과',
    'b''바나나',
    'c''당근'
}
 
# Dict 자료형을 Series로 바꾸기
array = pd.Series(data)
 
print(array)
 

 

import pandas as pd
 
# 데이터 프레임 : 다수의 시리즈(Series)를 모아 처리하기 위한 목적으로 사용
# Dict 자료형
word_dict = {
    'Apple''사과',
    'Banana''바나나',
    'Carrot''당근'
}
 
frequency_dict = {
    'Apple'3,
    'Banana'5,
    'Carrot'7
}
 
word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
 
# name : value
summary = pd.DataFrame({
    'word': word,
    'frequency': frequency
})
 
display(summary)
 
 

 

import pandas as pd
 
# Series 끼리 사칙연산이 가능하다. 사칙연산을 한 결과는 또 다른 Series이다.
 
word_dict = {
    'Apple''사과',
    'Banana''바나나',
    'Carrot''당근'
}
 
frequency_dict = {
    'Apple'3,
    'Banana'5,
    'Carrot'7
}
 
importance_dict = {
    'Apple'3,
    'Banana'2,
    'Carrot'1
}
 
word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)
 
summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})
 
 
score = summary['frequency'* summary['importance']
summary['score'= score
 
display(summary)
 

 

DataFrame 의  칼럼(열) 순서를 바꿔보고 싶다면....

import pandas as pd
 
# 데이터 프레임의 슬라이싱
 
word_dict = {
    'Apple''사과',
    'Banana''바나나',
    'Carrot''당근',
    'Durian''두리안'
}
 
frequency_dict = {
    'Apple'3,
    'Banana'5,
    'Carrot'7,
    'Durian'2
}
 
importance_dict = {
    'Apple'3,
    'Banana'2,
    'Carrot'1,
    'Durian'1
}
 
word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)
 
summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})
 
display(summary)
 
# DataFrame 의 칼럼(열) 순서를 바꿔보기
df = pd.DataFrame(summary, columns=['word''importance''frequency'])
display(df)
 
# 이름을 기준으로 슬라이싱
display(summary.loc['Banana':'Carrot''importance':])
 
 
# 인덱스를 기준으로 슬라이싱
display(summary.iloc[1:32:])
 

 

 

# 데이터 프레임의 연산
import pandas as pd
 
word_dict = {
    'Apple''사과',
    'Banana''바나나',
    'Carrot''당근',
    'Durian''두리안'
}
 
frequency_dict = {
    'Apple'3,
    'Banana'5,
    'Carrot'7,
    'Durian'2
}
 
importance_dict = {
    'Apple'3,
    'Banana'2,
    'Carrot'1,
    'Durian'1
}
 
word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)
 
summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})
 
display(summary)
 
summary.loc['Apple''importance'= 9 # 데이터의 변경
summary.loc['Elderberry'= ['엘더베리'53# 새 데이터 삽입
 
display(summary)
 
print()
# 끝에서 마지막 2줄을 불러온다. tail() 로 하면 마지막 5개를 불러온다.
display(summary.tail(2))
 
print()
# 맨 처음부터 2줄을 불러온다.
display(summary.head(2))
 
# 데이터의 대략적인 통계적 정보 요약을 보여준다.
display(summary.describe())
 
 

 

# 엑셀로 내보내기/불러오기
import pandas as pd
 
word_dict = {
    'Apple''사과',
    'Banana''바나나',
    'Carrot''당근'
}
 
frequency_dict = {
    'Apple'3,
    'Banana'5,
    'Carrot'7
}
 
word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
 
summary = pd.DataFrame({
    'word': word,
    'frequency': frequency
})
 
 
summary.to_csv("summary.csv", encoding="utf-8-sig")
# csv 파일 형태로 저장한 데이터는 텍스트 파일 형태
 
# csv 파일 엑셀 읽어오기 및 화면 출력
saved = pd.read_csv("summary.csv", index_col=0)
display(saved)
 
 

 

 

'파이썬 > 데이터 분석' 카테고리의 다른 글

MariaDB to Python Pandas DataFrame  (0) 2022.01.21
Python Pandas CSV 읽고 DB 저장  (0) 2022.01.19
Pycharm과 Jupyter Notebook 연결하기  (0) 2022.01.12
블로그 이미지

Link2Me

,
728x90

Pycharm 에서 Jupyter Notebook 연결하는 방법을 적어둔다.

 

프로젝트 생성

https://link2me.tistory.com/2090 를 참조하면 도움될 것이다.

 

Jupyter Notebook 실행시 실행이 안되는 경우가 있어서 업그레이드를 해준 사항

 

Jupyter Notebook 연결

Jupyter notebook은 프로그램 코드를 브라우저에서 실행해주는 대화식 환경이다.

Jupyter notebook 을 설치하는 방법은 UI 화면에서 하는 방법과 터미널 창에서 하는 방법이 있다.

터미널 창에서 아래 명령어를 실행한다.

# pip install numpy scipy matplotlib ipython scikit-learn pandas pillow imageio
# pip install graphviz
# pip install nltk spacy
# pip install tensorflow
# pip install jupyter notebook
 

 

아래 그림에서 + 버튼을 눌러서 jupyter 를 입력하고 Install Packages 를 눌러서 설치해도 된다.

 

 

위 그림과 같이 설정하고 하는 방법도 있지만....

그냥 터미널 창에서 실행하면 자동으로 Web 창에서 실행할 ULR 이 나온다.

 

jupyter notebook 을 입력하고 엔터키를 치면

 

아래와 같은 웹화면에서 데이터를 입력하고 Run 버튼을 클릭하면 3번과 같은 결과가 출력된다.

pandas란 엑셀처럼 테이블(표)로 된 데이터를 다룰 때 아주 유용한 도구이다.

판다스는 데이터 분석용 언어인 R의 data.frame 구조를 본뜬 DataFrame이라는 구조를 사용하기 때문에, R의 data.frame의 기능들을 대부분 사용할 수 있도록 만들어졌다.

 

 

 

이제 Github 에 올려진 파일을 받아서 보면서 연습 실행해보면 도움된다.

https://github.com/rickiepark/introduction_to_ml_with_python

 

GitHub - rickiepark/introduction_to_ml_with_python: 도서 "[개정판] 파이썬 라이브러리를 활용한 머신 러닝"의

도서 "[개정판] 파이썬 라이브러리를 활용한 머신 러닝"의 주피터 노트북과 코드입니다. Contribute to rickiepark/introduction_to_ml_with_python development by creating an account on GitHub.

github.com

 

자세한 설명을 원하면 책을 구입해서 봐야 한다.

 

Github 자료를 다운로드 하는 법

 

git clone 하고 2번 복사한 것을 붙여넣기 하면 아래와 같이 된다.

 

 

'파이썬 > 데이터 분석' 카테고리의 다른 글

MariaDB to Python Pandas DataFrame  (0) 2022.01.21
Python Pandas CSV 읽고 DB 저장  (0) 2022.01.19
Python Pandas 기초 학습  (0) 2022.01.18
블로그 이미지

Link2Me

,