# 선요약
1. pandas의 read_excel, to_csv 를 사용해서 엑셀파일을 csv 파일로 변환하여 저장할 수 있다.
2. read_csv로 csv파일을 읽어서 dataframe으로 저장할 수 있다.
3. pandas는 merge, unique, columns 등의 method를 지원한다.
4. matplotlib를 이용해서 시각화 할 수 있다.
matplotlib를 이용하여 그래프 그리는 코드
import matplotlib.pyplot as plt
import numpy as np
t = np.arange(0,12,0.01)
y=np.sin(t)
plt.figure(figsize=(10,6))
plt.plot(t,y)
plt.grid()
plt.xlabel('time')
plt.ylabel('Amplitude')
plt.title('Example of sinewave')
plt.show()
plt.figure(figsize=(10,6))
plt.plot(t, np.sin(t),lw=3,label='sin') #line width
plt.plot(t, np.cos(t),'r',label='cos') #red
plt.grid()
plt.legend()
plt.show()
t=[0,1,2,3,4,5,6]
y=[1,4,5,8,9,5,3]
plt.figure(figsize=(10,6))
plt.plot(t,y,color='green',linestyle='dashed',marker='o',markerfacecolor='blue',markersize='12')
plt.xlim([-0.5,6.5])
plt.ylim([0.5,9.5])
plt.show()
t=np.array([0,1,2,3,4,5,6,7,8,9])
y=np.array([9,8,7,9,8,3,2,4,3,4])
colormap=t
plt.figure(figsize=(10,6))
plt.scatter(t,y,s=50,c=colormap,marker='>')
plt.colorbar
plt.show()
s1=np.random.normal(loc=0,scale=1,size=1000)
s2=np.random.normal(loc=5,scale=0.5,size=1000)
s3=np.random.normal(loc=10,scale=2,size=1000)
plt.figure(figsize=(10,6))
plt.plot(s1,label='s1')
plt.plot(s2,label='s2')
plt.plot(s3,label='s3')
plt.legend()
plt.show()
plt.figure(figsize=(10,6))
plt.boxplot((s1,s2,s3))
plt.grid()
plt.show()
data frame 변경하는 코드
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
##### CCTV #####
data_xlsx = pd.read_excel(
'./data/cctv.xlsx',
sheet_name = 'Excel_Import_1',
header = None, #0행을 머리글로 사용한다
index_col = None, #index_col = 'id', #index로 사용할 열
na_values = np.nan,
thousands = ',', #천 구분 쉼표 제외
#nrows = 20, #20행만 읽기
comment = '#' # #문장은 주석처리
)
#xlsx를 csv 파일로 저장
data_xlsx.to_csv('./data/cctv_sl.csv', encoding='utf-8', header=None, index=False)
cctv_sl = pd.read_csv('./data/cctv_sl.csv', encoding='utf-8')
#csv 데이터에 접근하는 여러 함수
cctv_sl.columns
cctv_sl[cctv_sl.columns[9]]
cctv_sl.columns.size
cctv_sl.index
cctv_sl.index.size
#column 이름 바꾸기
cctv_sl.rename(columns={cctv_sl.columns[0]:'구별',
cctv_sl.columns[1]:'소계',
cctv_sl.columns[2]:'2011년이전'}, inplace=True)
#구별 행에 해당하는 데이터의 공백문자 제거하기
cctv_sl['구별'] = cctv_sl['구별'].str.replace(' ','')
#nan to 0
cctv_sl = cctv_sl.fillna(0)
#2011~2015데이터 합치기
cctv_sl['2015년이전']=cctv_sl['2011년이전']+cctv_sl['2012년']+cctv_sl['2013년']+cctv_sl['2014년']+cctv_sl['2015년']
cctv_sl_n = cctv_sl[['구별','소계','2015년이전','2016년','2017년','2018년']].copy()
cctv_sl_n['최근증가율']=(cctv_sl_n['2016년']+cctv_sl_n['2017년']+cctv_sl_n['2018년'])/cctv_sl_n['2015년이전']*100
#cctv 가장 적은 구
print(cctv_sl_n.sort_values(by='소계',ascending=True).head(5))
#cctv 가장 많은 구
print(cctv_sl_n.sort_values(by='소계',ascending=False).head(5))
##### CCTV #####
##### population #####
#txt파일을 csv파일로 저장 tab제거, 위의 두줄 제거, 천 이상 숫자의 쉽표구분 제거
pp_sl = pd.read_csv('./data/population.txt',encoding='utf-8',delimiter='\t', header=2,thousands=r',')
pp_sl.to_csv('./data/pp_sl.csv')
#columns 이름 바꾸기
pp_sl.rename(columns={pp_sl.columns[1]:'구별',
pp_sl.columns[3]:'인구수',
pp_sl.columns[6]:'한국인',
pp_sl.columns[9]:'외국인',
pp_sl.columns[13]:'고령자'}, inplace=True)
#pp_sl의 특정 열만 추출하여 새로운 데이터 프레임을 만들어 저장하기
pp_sl_n = pp_sl[['구별','인구수','한국인','외국인','고령자']].copy()
pp_sl_n.drop([0], inplace=True)
pp_sl_n['외국인비율']=pp_sl_n['외국인']/pp_sl_n['인구수']*100
pp_sl_n['고령자비율']=pp_sl_n['고령자']/pp_sl_n['인구수']*100
print(pp_sl_n.head())
#중복되는 항목이 있는지 검사하기
pp_sl_n['구별'].unique()
#nan데이터 찾기
pp_sl_n[pp_sl_n['구별'].isnull()]
##### population #####
##### merge to result #####
data_result = pd.merge(cctv_sl_n, pp_sl_n, on='구별')
#열 삭제하기
del data_result['2015년이전']
del data_result['2016년']
del data_result['2017년']
del data_result['2018년']
#인덱스 변경하기
data_result.set_index('구별',inplace=True)
print(data_result.head(5))
#상관분석. 절대값0.1이하 무시, 0.3이하 약한 상관관계, 0.7이하 뚜렷한 상관관계
print(np.corrcoef(data_result['고령자비율'],data_result['소계']))
print(np.corrcoef(data_result['외국인비율'],data_result['소계']))
print(np.corrcoef(data_result['인구수'],data_result['소계']))
##### merge to result #####
plt.rcParams['axes.unicode_minus']=False #한글 처리
rc('font',family='AppleGothic')
#data_result['소계'].sort_values().plot(kind='barh',grid=True,figsize=(10,10))
#data_result['CCTV비율']=data_result['소계']/data_result['인구수']*100
#data_result['CCTV비율'].sort_values().plot(kind='barh',grid=True,figsize=(10,10))
##### draw result graph #####
fp1 = np.polyfit(data_result['인구수'],data_result['소계'],1)#최소제곱법, 1은 차수, x, y값들로 기울기 절편찾기
f1 = np.poly1d(fp1) #y data (함수)
fx = np.linspace(100000, 700000, 100) #x data
data_result['오차']=np.abs(data_result['소계']-f1(data_result['인구수']))
df_sort=data_result.sort_values(by='오차',ascending=False) #일차함수로부터의 거리
plt.figure(figsize=(10,10))
plt.scatter(data_result['인구수'], data_result['소계'],s=50)
plt.plot(fx, f1(fx), ls='dashed', lw=3, color='g')
for n in range(10):
plt.text(df_sort['인구수'][n]*1.02,df_sort['소계'][n]*0.98,df_sort.index[n],fontsize=15)
plt.xlabel('인구수')
plt.ylabel('CCTV')
plt.colorbar()
plt.grid()
plt.show()
##### draw result graph #####
data_result.to_csv('./data/cctv_result.csv', sep=',', encoding='utf-8')
엑셀 파일에서 CSV로 바꾸는 코드
import xlrd
import csv
def csv_from_excel():
wb = xlrd.open_workbook('cctv.xlsx')
sh = wb.sheet_by_name('Sheet1')
your_csv_file = open('cctv1.csv', 'w')
wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL)
for rownum in range(sh.nrows):
wr.writerow(sh.row_values(rownum))
your_csv_file.close()
# runs the csv_from_excel function:
csv_from_excel()
import openpyxl
filename = 'cctv.xlsx'
## opening the xlsx file
xlsx = openpyxl.load_workbook(filename)
## opening the active sheet
sheet = xlsx.active
## getting the data from the sheet
data = sheet.rows
## creating a csv file
csv = open("cctv2.csv", "w+")
for row in data:
l = list(row)
for i in range(len(l)):
if i == len(l) - 1:
csv.write(str(l[i].value))
else:
csv.write(str(l[i].value) + ',')
csv.write('\n')
## close the csv file
csv.close()
##using pandas
import pandas as pd
data_xls = pd.read_excel('cctv.xlsx', 'Excel_Import_1', index_col=None)
data_xls.to_csv('cctv3.csv', encoding='utf-8', header=None, index=False)
'데이터 사이언스 공부 > 파이썬으로데이터주무르기' 카테고리의 다른 글
time series (0) | 2020.05.12 |
---|---|
self gas station analysis (0) | 2020.05.12 |
chicago analysis (0) | 2020.05.12 |
crime analysis (0) | 2020.05.12 |