- 형태
속성 : 값
- 값이 여러 개 이면 앞에 -를 추가
connection 변수 = sqlalchemy.create_engine(db ulr)
pandas.read_sql_query(SQL구문, connection 변수)
pandas.read_sql_table(Table 이름, connection 변수)
python에서 sqlite3의 경우는 별도로 설치할 필요가 없고, 패키지도 별도 설치할 필요가 없습니다.
pip install pymysql
from sqlalchemy import create_engine # 오류나면 pip install sqlalchemy import pymysql pymysql.install_as_MySQLdb() import MySQLdb #연결 connect=create_engine('mysql+mysqldb://ID:비밀번호@localhost/mino') dataframe=pd.read_sql_table('dbms',connect) print(dataframe)
docker exec -it 컨테이너이름 bash
: 쉘 접속cd bin
, mongosh
: MongoDB 접속use mymongo
db.echo.insertOne({num:11, name:"Spark", function:"클러스터 컴퓨팅 프레임워크"})
db.echo.find()
: 데이터 확인pip install pymongo
from pymongo import MongoClient # MongoDB 연결 conn=MongoClient('127.0.0.1') # DB 연결 db=conn.mymongo # 컬렉션 연결 collection=db.echo # 데이터 가져오기 result=collection.find() # print(result) # <pymongo.cursor.Cursor object at ~~> # 커서는 데이터를 가져올 포인터 # 커서를 순회하면서 각 데이터를 list에 삽입하기 # 이후 데이터프레임으로 변환하기 li=[] for r in result: del r['_id'] # print(r) li.append(r) echo=pd.DataFrame(li) print(echo)
- spss, sas, stata는 실제 데이터와 메타 데이터를 리턴합니다.
- R은 dict 형태로 리턴하는데, 데이터의 key가 None입니다.
- SPSS로 보는 예시
# SPSS # import pandas, numpy, and pyreadstat import pandas as pd import numpy as np import pyreadstat # 데이터 와 메타 데이터 가져오기 # 이 함수는 데이터와 메타 데이터를 튜플로 리턴한다. # 그렇기 떄문에 변수를 나눠서 받는 것이 훨씬 좋다. nls97spss, metaspss = pyreadstat.read_sav('data/nls97.sav') print(type(nls97spss)) print(type(metaspss)) print(nls97spss.head())
DF이름['열이름']
또는 DF이름.열이름
으로 접근할 때는 열 이름이 반드시 문자열이어야 합니다.DF이름.loc[인덱스 이름]
또는 iloc[정수형 위치 인덱스]
[열이름][인덱스]
loc[인덱스][열이름]
iloc[행위치, 열위치]
df[열이름]
: Series로 리턴df[[열이름]]
: DataFrame으로 리턴
# csv 파일 읽어서 df로 변환하기 df=pd.read_csv('./data/item.csv') # print(df) # 인덱스 변경 df.index=['사과','수박','참외','바나나','레몬','망고'] # print(df) # 열 선택 # print(df['code']) # 열 선택할 때, list이용하면 DataFrme이다. # 자료형 보기 # print(type(df['code'])) # 행 선택 : 하나의 행을 선택한다면 Series # print(df.loc[1]) # print(df.iloc[0]) # 하나의 셀 선택 print(df) # 열 이름과 위치 인덱스 이용하기 print(df['name'][0]) # 인덱스와 열 이름을 이용해서 셀 선택 print(df.loc['참외','name']) # 위치 인덱스로만 셀 선택 print(df.iloc[1,2])
:
을 이용해서 지정## 범위 선택 # 사과부터 사과부터 참외까지 print(df.loc['사과':'참외', 'name']) print(df.iloc[0:3]) # 불리언 색인 print(df[df['price']>1000]) print(df[(df['price']>1000)&(df['price']<2000)]) # isin -list에 있는 항목은 True 아니면 False로 리턴 print(df[df['price'].isin([1000,1500])])
- shape
- 행과 열의 개수를 tuple로 리턴- dtypes
- 각 열의 자료형을 리턴합니다.
- info()
- 데이터 유형, 행 인덱스의 구성, 열 이름의 종류와 개수, 자료형, 메모리 사용량 등의 정보를 리턴합니다.- describe()
- 기술 통계 정보를 리턴합니다.
-include='all'
을 설정하면, 숫자가 아닌 열의 정보도 리턴한다.- count()
- 데이터 개수- value_counts()
- 고유한 값의 종류와 등장 횟수 리턴- unique()
- 고유한 값의 종류를 리턴- nunique()
- 고유한 값의 개수- dropna
- 옵션이 있는 경우, 이 옵션에 True를 설정하면 None은 제외
## 범위 선택 # 사과부터 사과부터 참외까지 print(df.loc['사과':'참외', 'name']) print(df.iloc[0:3]) # 불리언 색인 print(df[df['price']>1000]) print(df[(df['price']>1000)&(df['price']<2000)]) # isin -list에 있는 항목은 True 아니면 False로 리턴 print(df[df['price'].isin([1000,1500])])
{기존이름 : 새로운 이름, ...}
를 이용하면 됩니다.set_index(열 이름 또는 [열이름 나열])
을 이용해서 기존 컬럼의 값을 인덱스로 사용하는 것이 가능한데, 이 경우 기존 컬럼은 제거됨reset_index()
를 호출하면 기존 인덱스가 제거되고 0부터 시작하는 숫자로 인덱스를 재설정# DataFrame 이나 Series의 메서드나 함수가 # inplace 옵션을 가지고 있따면, # 원본에 작업할지 작업한 뒤에 리턴할 지 결정할 수 있습니다. # inplcae 가 False면 작업을 복사본에 수행하고 리턴을 합니다. # inplace 에 True를 설정하면 원본에 작업을 수행하게 됩니다. # df.set_index('name') # print(df) # 이러면 name이 안넘어감 # df.set_index('name', inplace=True) # name을 index로 설정 # print(df) # 이러면 name이 넘어감 # 인덱스를 일반 컬럼으로 변경하고 정수의 일련번호로 인덱스를 수정 df.reset_index(inplace=True) print(df)
del 이름[열이름]
을 이용할 수 있지만, 비추천# origin 열을 제거 # df.drop('origin', inplace=True, axis=1) # print(df.head()) # 0 번 행을 삭제 df.drop(0,inplace=True) print(df.head())
# df.head() # df['색상']='red' # 색상은 없는 컬럼이고, 값은 red로만 해놔서 모두가 red # df.head() # df['색상']='blue' # '색상' 이 존재하므로 수정 # df.head() # 행 수정 # df.loc[1]=5 # df.head() # 셀 수정 df.loc[2,'cylinders']=9 df.head()
# df.T print(df.transpose()) # numpy에서는 3차원배열이 있을 수 있기에, # T와 transpose의 기능이 다르다. # np transpose는 행과 열의 순서를 지정 # pandas에서는 2차원 배열까지만 존재하기에, T와 transpose는 동일
fill_value
라는 옵션을 이용해서, 한쪽에만 존재하는 인덱스에 기본값을 설정하는 것이 가능합니다.items1={'1':{'price':1500},'2':{'price':15000},'3':{'price':1000}} items2={'1':{'price':2700},'2':{'price':7000},'4':{'price':1200}} data1=pd.DataFrame(items1).T data2=pd.DataFrame(items2).T print(data1) print() print(data2) # 스칼라 데이터와의 연산은 모든 셀에 적용 # print(data1+10) # DataFrame이나 Series 끼리의 연산은 동일한 인덱스끼리 수행 # print(data1+data2) # 함수 이용 - 기본값 설정이 가능 print(data1.add(data2, fill_value=0))
- count, min, max, sum, mean, median, var, std, mode(최빈값)
- kurt(첨도), skew(비대칭도, 왜도), sem(평균의 표준 오차)
- argmin, argmax, idxmin, idxmax (위치를 주느냐 인덱스를 주느냐의 차이)
- quantile
- cumsum, cummin, cummax, cumprod
- diff(이전 데이터와의 산술적인 차이), pct_change(이전 데이터와의 백분율)
- unique() : 유일한 값을 찾기
df=pd.read_csv('./data_ex/noheader_auto-mpg.csv', header=None) # 헤더 설정 df.columns=['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'model year', 'origin', 'name'] #mpg의 평균 # print(df['mpg'].mean()) #수치값이라면 여러개 가능합니다. # print(df[['mpg', 'cylinders']].mean()) #이전 데이터와의 차이를 구해보자. # print(df[['mpg', 'cylinders']].diff()) print(df[['mpg', 'cylinders']].pct_change())
-1 ~ 1
# 전체 다 하면 우선 수치값이 아닌 컬럼은 빠지게 된다. # 모든 숫자 컬럼의 상관 계수를 전부 구하기 df.corr()
- 관련성이 있다고 하려면 abs(corr)>0.4
- 수치값이 0에 가까울 수록 관련성이 없다고 한다.
# mpg와 weight 컬럼의 상관계수를 구하기 print(df[['mpg', 'weight']].corr())
- 음의 상관관계를 갖는다.
sort_index()
함수를 호출하면 인덱스 순서대로 오름차순 정렬을 한다.sort_values
이용합니다.sort_values
호출하는데, by 매개변수 변수에 컬럼의 이름이나 컬럼의 이름 list를 설정df=pd.read_csv('./data_ex/noheader_auto-mpg.csv', header=None) # 헤더 설정 df.columns=['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'model year', 'origin', 'name']
rank()
함수를 이용하는데, 기본은 오름차순입니다.# 앤스콤 데이터 가져오기 import seaborn as sns anscombe=sns.load_dataset("anscombe") anscombe.head() # info로 데이터셋의 구성을 확인해보자. # dataset 과, x, y 컬럼으로 구성되어있다. anscombe.info() print(anscombe['dataset'].unique()) # 각 그룹의 기술통계값 # 거의 비슷합니다. print(anscombe[anscombe['dataset']=='I'].describe()) print(anscombe[anscombe['dataset']=='II'].describe()) print(anscombe[anscombe['dataset']=='III'].describe()) print(anscombe[anscombe['dataset']=='IV'].describe()) #데이터 분리시키기 dataset_1 = anscombe[anscombe['dataset']=='I'] dataset_2 = anscombe[anscombe['dataset']=='II'] dataset_3 = anscombe[anscombe['dataset']=='III'] dataset_4 = anscombe[anscombe['dataset']=='IV'] # 그래프를 그려보자. import matplotlib.pyplot as plt fig=plt.figure() # 영역을 4개로 분할 / subplot(행개수, 열개수, 번호) axes1=fig.add_subplot(2,2,1) axes2=fig.add_subplot(2,2,2) axes3=fig.add_subplot(2,2,3) axes4=fig.add_subplot(2,2,4) # 각 영역에 각 dataset의 그래프를 출력하기 axes1.plot(dataset_1['x'],dataset_1['y'],'o') axes2.plot(dataset_2['x'],dataset_2['y'],'o') axes3.plot(dataset_3['x'],dataset_3['y'],'o') axes4.plot(dataset_4['x'],dataset_4['y'],'o') # 제목 출력 axes1.set_title('dataset_1') axes2.set_title('dataset_2') axes3.set_title('dataset_3') axes4.set_title('dataset_4') # 전체 제목 출력 fig.suptitle("Anscombe Data") fig.tight_layout()
- 그래프 상에서 확인했을 때, 데이터의 분포가 아예 다른 것을 확인하였따.
- matplotlib
- seaborn
- matplotlib 기반- pandas
- matplotlib 기반- folium
- 지도 출력
- 서울과 전라남도 사이의 인구 이동에 대한 시각화
# 데이터 읽어오기 df=pd.read_excel('./data/시도_별_이동자수.xlsx',header=0) print(df) # NaN 이라면 앞에 있는 데이터로 값을 채워버리자. df=df.fillna(method='ffill') # 서울에서 다른 곳으로 이동한 데이터만 추출 # 추출 조건을 걸어버리자. mask=(df['전출지별']=='서울특별시')&(df['전입지별']!='서울특별시') df_seoul=df[mask] print(df_seoul) # 전출지별 이라는 열을 삭제하자. df_seoul.drop(['전출지별'], axis=1, inplace=True) print(df_seoul) # 전입지별 -> 전입지 로 컬럼의 이름 변경 df_seoul.rename({'전입지별':'전입지'}, axis=1, inplace=True) print(df_seoul) # 전입지를 index로 설정하기. # 현재는 단순 수치 index가 있기에, 전입지가 key가 될 수 있기에 index로 설정 df_seoul.set_index('전입지',inplace=True) print(df_seoul) # 서울->전라남도 이동한 사람들을 보고 싶다. # index가 전라남도인 데이터만 추출해보자. sr_one=df_seoul.loc['전라남도'] print(sr_one) sr_one.info() # 연도 & 인구수 -> 선 그래프가 좋겠다. plt.plot(sr_one.index, sr_one.values) # 한글 출력을 위한 설정 from matplotlib import font_manager, rc import platform if platform.system()=='Darwin': rc('font', family='AppleGothic') elif platform.system()=='Windows': font_name=font_manager.FontProperties(fname='c:/Windows/Fonts/malgun.ttf').get_name() rc('font', family=font_name) plt.style.use('ggplot') # 스타일 설정 plt.figure(figsize=(14,5)) # 크기 설정 # X축 눈금 회전 plt.xticks(size=10, rotation='vertical') # 그래프 설정 plt.plot(sr_one.index, sr_one.values, marker='o', markersize=10) # 제목 설정 - 한글 (아마 깨질 것이다.) plt.title('연도별 서울에서 전라남도로 이동한 인구수', size=30) plt.xlabel('기간', size=20) plt.ylabel('이동 인구 수 ', size=20) # 범례 plt.legend(labels=['서울->전라남도'], loc='best', fontsize=15) # y축 범위 지정 plt.ylim(10000,100000) # 화살표 출력 plt.annotate("",xy=(13,70000), xytext=(2,20000), xycoords='data', arrowprops=dict(arrowstyle='->', color='pink', lw=5)) # 화살표 출력 2 plt.annotate("",xy=(45,25000), xytext=(20,58000), xycoords='data', arrowprops=dict(arrowstyle='->', color='skyblue', lw=5)) # 텍스트 출력 plt.annotate("인구이동 증가(1970-1985)", xy=(7, 25000), rotation=45, va='baseline', ha='center', fontsize=15) plt.annotate("인구이동 증가(1985-현재)", xy=(35, 36000), rotation=-15, va='baseline', ha='center', fontsize=15) # 그래프 출력 plt.show()
- 결과물
- 전남 -> 서울로 만들어보자.
# 서울에서 다른 곳으로 이동한 데이터만 추출 # 추출 조건을 걸어버리자. mask2=(df ['전출지별']=='전라남도')&(df['전입지별']!='전라남도') df_jn=df[mask2] print(df_jn) # 전출지별 이라는 열을 삭제하자. df_jn.drop(['전출지별'], axis=1, inplace=True) print(df_jn) # 전입지별 -> 전입지 로 컬럼의 이름 변경 df_jn.rename({'전입지별':'전입지'}, axis=1, inplace=True) print(df_jn) # 전입지를 index로 설정하기. # 현재는 단순 수치 index가 있기에, 전입지가 key가 될 수 있기에 index로 설정 df_jn.set_index('전입지',inplace=True) print(df_jn) # 서울->전라남도 이동한 사람들을 보고 싶다. # index가 전라남도인 데이터만 추출해보자. sr_two=df_jn.loc['서울특별시'] print(sr_two) sr_two.info() plt.style.use('ggplot') # 스타일 설정 plt.figure(figsize=(14,5)) # 크기 설정 # X축 눈금 회전 plt.xticks(size=10, rotation='vertical') # 그래프 설정 plt.plot(sr_two.index, sr_two.values, marker='o', markersize=10) # 제목 설정 - 한글 (아마 깨질 것이다.) plt.title('연도별 전라남도에서 서울로 이동한 인구수', size=30) plt.xlabel('기간', size=20) plt.ylabel('이동 인구 수 ', size=20) # 범례 plt.legend(labels=['전라남도->서울'], loc='best', fontsize=15) # y축 범위 지정 plt.ylim(10000,150000) # 화살표 출력 plt.annotate("",xy=(5,130000), xytext=(2,20000), xycoords='data', arrowprops=dict(arrowstyle='->', color='pink', lw=5)) # 화살표 출력 2 plt.annotate("",xy=(45,25000), xytext=(17,90000), xycoords='data', arrowprops=dict(arrowstyle='->', color='skyblue', lw=5)) # 텍스트 출력 plt.annotate("인구이동 증가(1970-1975)", xy=(3, 25000), rotation=80, va='baseline', ha='center', fontsize=15) plt.annotate("인구이동 감소(1985-현재)", xy=(30, 50000), rotation=-15, va='baseline', ha='center', fontsize=15) # 그래프 출력 plt.show()
- 결과물
- 이번에는 그래프를 2개 그려보자.
# 2개의 그래프 그리기 fig=plt.figure(figsize=(10,10)) # 영역 생성 ax1=fig.add_subplot(2,1,1) ax2=fig.add_subplot(2,1,2) ax1.plot(sr_one, marker='o', markerfacecolor='blue', markersize=10, color='orange', linewidth=2, label='서울->전라남도') ax2.plot(sr_two, marker='o', markerfacecolor='green', markersize=10, color='olive', linewidth=2, label='전라남도->서울') ax1.legend(loc='best') ax2.legend(loc='best') ax1.set_ylim(10000,150000) ax2.set_ylim(10000,150000) ax1.set_xticklabels(sr_one.index, rotation=75) ax2.set_xticklabels(sr_two.index, rotation=75) plt.show()
- 두 선 그래프가 한 평면에 있으면 조금 더 잘 보일 것 같다.
- 이번에는 한 좌표평면 위에 선 그래프 2개를 그려보자.
# 한 영역 안에 그래프를 2개 그려보자. # 한개의 plt에다가 그리면 된다. (subplot x) plt.figure(figsize=(14,6)) plt.xticks(size=10, rotation='vertical') plt.plot(sr_one.index, sr_one.values, marker='o', markersize=10, markerfacecolor='blue', label='서울->전라남도') plt.plot(sr_two.index, sr_two.values, marker='o', markersize=10, markerfacecolor='green', label='전라남도->서울') plt.title('서울<->전라남도', size=30) plt.xlabel('기간', size=20) plt.ylabel('인구 수', size=20) plt.legend(loc='best', fontsize=15) plt.ylim(10000,150000) plt.xticks(size=10, rotation='vertical') plt.show()
- 여러개 넣고 싶으면 plt 하나에 계속 작성하면 됩니다.
width
속성을 이용한다.# 막대 그래프 출력 plt.bar(sr_one.index, sr_one.values, width=1.0, color='r') plt.xticks(range(0,len(sr_one.index),1),sr_one.index, rotation='vertical') plt.title('연도별 서울->전라남도 이주 인구 수 ') plt.show()
# 서울에서 경기도, 충청남도, 전라남도, 경상남도 로 이주한 인구수를 표현 sr=df_seoul.loc[['경기도', '충청남도', '전라남도', '경상남도']] # 행과 열 전치 sr=sr.T # print(sr) # 인덱스의 자료형을 정수로 변환(계산을 위해) sr.index=sr.index.map(int) plt.figure(figsize=(15,6)) # 축 이동을 위한 변수 x=pd.RangeIndex(0,len(sr.index),1) # 경기도가 너무 차이나니까 잠깐 주석처리하고 그래프를 보자. plt.bar(x,sr['경기도'], width=0.5, color='orange', label='경기도') plt.bar(x+0.25,sr['충청남도'], width=0.5, color='olive', label='충청남도') plt.bar(x+0.5,sr['전라남도'], width=0.5, color='blue', label='전라남도') plt.bar(x+0.75,sr['경상남도'], width=0.5, color='pink', label='경상남도') plt.xticks(range(0,len(sr_one.index),1), sr_one.index, rotation='vertical') plt.title('서울에서 인구 이동') # 범례를 넣어주자. plt.legend() plt.show()