티스토리 뷰
연습문제¶
- 기후 데이터를 불러와서 날자 부분을 [연도, 달, 일]로 분리하라.
In [2]:
s = '지점,일시,평균기온(°C),최저기온(°C),최저기온 시각(hhmi),최고기온(°C),최고기온 시각(hhmi),강수 계속시간(hr),10분 최다 강수량(mm),10분 최다강수량 시각(hhmi),1시간 최다강수량(mm),1시간 최다 강수량 시각(hhmi),일강수량(mm),최대 순간 풍속(m/s),최대 순간 풍속 풍향(16방위),최대 순간풍속 시각(hhmi),최대 풍속(m/s),최대 풍속 풍향(16방위),최대 풍속 시각(hhmi),평균 풍속(m/s),풍정합(100m),평균 이슬점온도(°C),최소 상대습도(%),최소 상대습도 시각(hhmi),평균 상대습도(%),평균 증기압(hPa),평균 현지기압(hPa),최고 해면기압(hPa),최고 해면기압 시각(hhmi),최저 해면기압(hPa),최저 해면기압 시각(hhmi),평균 해면기압(hPa),가조시간(hr),합계 일조 시간(hr),1시간 최다일사 시각(hhmi),1시간 최다일사량(MJ/m2),합계 일사(MJ/m2),일 최심신적설(cm),일 최심신적설 시각(hhmi),일 최심적설(cm),일 최심적설 시각(hhmi),합계 3시간 신적설(cm),평균 전운량(1/10),평균 중하층운량(1/10),평균 지면온도(°C),최저 초상온도(°C),평균 5cm 지중온도(°C),평균 10cm 지중온도(°C),평균 20cm 지중온도(°C),평균 30cm 지중온도(°C),0.5m 지중온도(°C),1.0m 지중온도(°C),1.5m 지중온도(°C),3.0m 지중온도(°C),5.0m 지중온도(°C),합계 대형증발량(mm),합계 소형증발량(mm),9-9강수(mm),기사,안개 계속시간(hr)'
cols = s.strip().split(',')
cols
Out[2]:
In [5]:
for i,c in enumerate(cols):
print('%03d=>%s' % (i,c))
In [10]:
import numpy as np
In [177]:
f=open('기상관측_서울_20181004141633.csv', encoding='cp949')
f.readline()
data=[]
t = []
for line in f:
I = line.strip().split(',')
I2 = [int(i) for i in I[1].split('-')] # 2019-01-29 를 '-'에 대해 스플릿 하면 [2019,01,29]라는 리스트가 나온다.
data.append(I2)
t.append(I[5])
f.close()
- 기후 데이터에서 "최고기온"이 비어있는 날은 몇일인가? (도전문제: 그 날은 몇월 몇일인가?)
In [162]:
np.loadtxt('기상관측_서울_20181004141633.csv', skiprows=1, delimiter=',',usecols=[5],
converters = {5: lambda s: float(s) if s!='' else 0}, encoding='cp949')
Out[162]:
In [164]:
len(t)
Out[164]:
In [153]:
n=0
idx=[]
for i,v in enumerate(t):
if v.strip() == '':
# strip을 이용해 공백을 없애고 ''인것이 있으면 n에 1개 더해줘(개수를 셈).
#그리고 해당 부분 인덱스를 i=idx에 넣어줌
n+=1
idx.append(i)
n, idx
Out[153]:
int('112') = 숫자, int('112a')=error를 이용해 데이터 안에 문자가 있는지 확인한다.
np는 숫자로 만들어놓고 사용하는게 좋다.
데이터 전처리를 통해 빠진 정보나, 중복된 부분 등등 찾아낼 수 있어야 한다. 그리고 그것들을 어떻게 처리할지도 생각해야한다.
평균기온 그래프¶
In [154]:
import matplotlib.pyplot as plt
In [168]:
f = open('기상관측_서울_20181004141633.csv', encoding='cp949')
f.readline()
t=[]
m=[]
for line in f:
I = line.strip().split(',')
t.append(float(I[2]))
m.append(float(I[24]))
f.close()
In [170]:
plt.plot(t)
plt.plot(m)
Out[170]:
In [171]:
plt.scatter(t,m)
Out[171]:
NumPy 정렬¶
In [29]:
import numpy as np
import matplotlib.pyplot as plt
sort() 함수¶
- 기본은 옆으로 정렬한다.
In [32]:
a = np.random.randint(10,size=10) #np에도 sort 기능이 있다
a
Out[32]:
In [34]:
a.sort()
In [35]:
a
Out[35]:
In [37]:
a[::-1] #여기 넣는 숫자에 따라 몇칸 뛰고 숫자가 들어갈지 정한다. -는 반대방향
Out[37]:
In [39]:
a[::2]
Out[39]:
근데 데이터 자체를 바꿔버리니 다른 방법을 이용하고 싶다.
In [40]:
a = np.random.randint(10,size=10)
a
Out[40]:
In [41]:
a2 = np.sort(a)
a2
Out[41]:
2차원이면 어떻게 될까?
In [45]:
a = np.random.randint(25, size=[5,5])
a
Out[45]:
In [46]:
np.sort(a) # 옆으로 정렬 [axis=1]
Out[46]:
In [47]:
np.sort(a, axis=0) # 아래로 정렬 [axis=0]
Out[47]:
In [48]:
a
Out[48]:
In [49]:
last_col = a[:,-1]
last_col
Out[49]:
In [50]:
np.sort(last_col)
Out[50]:
In [54]:
np.argsort(last_col) # arg가 붙으면 결과가 index이다. 무조건 표 형태는 argsort를 호출한다.
Out[54]:
인덱스가 22가 0, 0은 1, 13은 2, 2는 3, 15가 4인데,
이걸 정렬하면 0 , 2, 13, 15, 22 순으로 정렬되고
이것의 인덱스는 1, 3, 2, 4, 0이 된다.
In [60]:
a[np.argsort(last_col)] # a[[1,3,2,4,0]] 리스트 안에 인덱스 , 1번 3번 2번 4번 0번 행 순서대로 나타낸다. a[[:,[1,3,2,4,0]]]은 행 순서대로
Out[60]:
In [63]:
a[np.argsort(a[:,-1])] # 한 줄로 처리하기
Out[63]:
In [67]:
## 사례
'''
X = iris[:,:4]
y = iris[:,4]
X[np.argsort(y)]'''
Out[67]:
In [68]:
a
Out[68]:
In [71]:
names = ['홍','장','이','김','한']
np.sort(names)
Out[71]:
In [73]:
np.argsort(names)
Out[73]:
In [72]:
a[np.argsort(names)] # a를 정렬하는데 names를 기준으로 정렬함.
Out[72]:
연습문제¶
Iris 데이터를 첫번째 칼럼 기준으로 정렬하시오.
정렬된 데이터의 4가지 속성을 plt.plot() 함수를 이용하여 4가지 직선으로 시각화 하시오.
- lexsort()는 뒤의 인자를 먼저 기준을 잡아 정렬한다.
- 정렬된 인덱스를 반환한다.
In [84]:
f = open('iris.csv')
line = f.readline()
features = line.strip().split(',')[:4]
labels = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']
data = []
for line in f:
l = line.strip().split(',')
l[:4] = [float(i) for i in l[:4]]
l[4] = labels.index(l[4])
data.append(l)
f.close()
iris = np.array(data)
In [86]:
names = ['SepalLength','SepalWidth','PetalLength','PetalWidth','Name']
In [87]:
np.sort(names)
Out[87]:
In [92]:
np.argsort(names)
Out[92]:
In [98]:
t=iris[:,np.argsort(names)]
In [99]:
X=t[:,1:]
In [100]:
import matplotlib.pyplot as plt
In [103]:
plt.plot(X)
plt.legend(['PL','PW','SL','SW'])
Out[103]:
lexsort()¶
- 뒤의 인자를 먼저 기준을 잡아 정렬
- 정렬된 인덱스를 반환한다.
In [104]:
np.lexsort([a[:,1],a[:,0]]) # 칼럼0 -> 칼럼1 순으로 정렬한 인덱스를 반환한다.
Out[104]:
np.argmax(), np.argmin() 함수도 있다.¶
- 가장 큰 값과 가장 작은 값의 인덱스를 찾는 역할
In [105]:
a
Out[105]:
In [106]:
np.argmax(a) # a 안에서 가장 큰 값인 24의 인덱스는 2이다.
Out[106]:
In [108]:
np.argmin(a) # a 안에서 가장 작은 값인 0의 인덱스는 7이다.(처음에 있는 0의 인덱스 값이 나왔다.)
Out[108]:
In [109]:
np.argmax(a,axis=0) # 각 열에서 가장 큰 숫자의 열에서의 인덱스.
Out[109]:
In [111]:
np.argmin(a,axis=0) # 각 열에서 가장 작은 숫자의 열에서의 인덱스.
Out[111]:
In [112]:
a = np.random.randint(10, size=[5,5])
a
Out[112]:
In [116]:
np.where(a<5) # 5보다 작은 값의 좌표값 (0,0), (0,1), (0,2),... 의 인덱스를 출력. 왜 이렇게 출력할까?
Out[116]:
In [119]:
a[np.where(a<5)]
# 이렇게 그 값들을 출력하기 위해! (0,0)에 해당하는 값은 1, (0,1)에 해당하는 값은 2, (0,3)에 해당하는 값은 4 ...
# a[1] = 1행 출력, a[:,1]= 1열 출력, a[1,4]= (1,4) 해당 점을 출력. a[[1,3]]= 1,3행 출력, a[:,[1,3]]= 1,3행 출력, a[[1,3],[2,4]]= (1,2)와 (2,4)를 출력
Out[119]:
In [121]:
np.where(a[:,-1]<5) #마지막 열에 5보다 작은 값은 4와 3인데 그것의 인덱스는 3과 4이다.
Out[121]:
In [145]:
a[np.where(a[:,-1]<5)]
Out[145]:
In [176]:
tp = (1,2)
tp[0]
Out[176]:
In [174]:
tp = (99,)
tp[0]
Out[174]:
In [144]:
np.where(a[:,-1]<5)[0]
Out[144]:
In [125]:
a[np.where(a[:,-1]<5)[0]] #인덱스를 출력할 수 있다.
Out[125]:
In [126]:
iris[iris[:,-1]==1] #값을 출력할 수 있다.
Out[126]:
In [128]:
a
Out[128]:
In [129]:
np.where(a<5,0,1) # if문과 유사
Out[129]:
In [134]:
np.where(a<5,0,a) # a가 5보다 작으면 0 아니면 a 값을 적어라
Out[134]:
In [132]:
np.maximum(a,5) # a와 5를 비교해서 큰 값을 적어라
Out[132]:
In [135]:
plt.imshow(a,vmin=0, vmax=9, cmap='gray_r')
plt.colorbar()
Out[135]:
In [136]:
plt.imshow(np.where(a<5,0,a),vmin=0, vmax=9, cmap='gray_r')
plt.colorbar()
Out[136]:
In [139]:
plt.imshow(np.where(a<5,0,a),vmin=4, vmax=7, cmap='gray_r') #matplotlib은 최소값 최대값을 설정할수 있다. 설정하지 않으면 안에 있응 값 중에 최대 최소값을 기준으로 한다.
plt.colorbar()
Out[139]:
'beginner > 파이썬 기초' 카테고리의 다른 글
NumPy_기타 (0) | 2019.02.19 |
---|---|
NumPy_구간나누기 (0) | 2019.02.18 |
NumPy_파일입출력 (0) | 2019.02.14 |
NumPy_함수 (0) | 2019.02.13 |
NumPy_사칙연산 (0) | 2019.02.13 |