import numpy as np
# 정규분포에서 나온 난수
= 100, 10
mu, sigma
= np.random.normal(mu, sigma, size = 10)
random_samples
# 정규화 값을 저장
= []
results
# 정규화 함수
def normalize(sample):
return( (sample - mu) / sigma)
# 정규화
for sample in random_samples:
results.append( normalize(sample) )
print(results)
#> [-0.37082741498345084, 0.8656631990371195, -0.18901873427866747, 0.82126547785832, -1.829051157694846, -0.533750732400371, -0.6976763280348308, -0.14691958971619384, 0.03463514277669048, -1.5771028398960425]
파이썬 프로그래밍
데이터 과학을 위한 프로그래밍을 배워봅니다.
1 정규화
파이썬 정규화 함수를 작성하고 이를 통해 정규분포 난수에서 나온 표본을 표준정규분포로 정규화하는 코드.
2 벡터화
벡터화(Vectorization)는 데이터 과학에서 크게 두가지 점에서 중요하다.
- 루프 반복문을 돌리는 대신 전체 배열과 행렬에 연산작업을 수행하여 속도를 높임. 특히 데이터가 큰 경우 큰 효과를 볼 수 있음. 대체로 Vectorization은 C 혹은 포트란으로 작성됨.
- 동일한 작업을 벡터화 코드로 작성하게 되면 가독성을 크게 높이고 코드가 간결해지는 장점이 있음.
import numpy as np
# 배열 두개를 생성
= np.array([1, 2, 3, 4, 5])
A_arr = np.array([6, 7, 8, 7, 8])
B_arr
# 최종 결과 저장
= []
result_arr
# 각 배열 항목별로 연산작업을 수행
for i in range(len(A_arr)):
+ B_arr[i])
result_arr.append(A_arr[i]
print(result_arr)
#> [7, 9, 11, 11, 13]
import numpy as np
# 배열 두개를 생성
= np.array([1, 2, 3, 4, 5])
A_arr = np.array([6, 7, 8, 7, 8])
B_arr
# 벡터화 연산
= A_arr + B_arr
result_arr
print(result_arr)
#> [ 7 9 11 11 13]
3 제곱 방법
다양한 방식으로 데이터에 함수 (제곱)를 적용시켜 보자.
= [1, 2, 3, 4, 5]
samples = []
squared_samples
for sample in samples:
**2)
squared_samples.append(sample
squared_samples#> [1, 4, 9, 16, 25]
= [1, 2, 3, 4, 5]
samples = [x**2 for x in samples]
squared_samples
squared_samples#> [1, 4, 9, 16, 25]
= (1, 2, 3, 4, 5)
samples = (x**2 for x in samples)
squared_samples list(squared_samples)
#> [1, 4, 9, 16, 25]
= [1, 2, 3, 4, 5]
samples = list(map(lambda x: x**2, samples))
squared_samples
squared_samples#> [1, 4, 9, 16, 25]
= np.array([1, 2, 3, 4, 5])
samples_arr = samples_arr ** 2
squared_samples
squared_samples# print(squared_samples)
#> array([ 1, 4, 9, 16, 25])
import pandas as pd
= [1, 2, 3, 4, 5]
samples
= pd.DataFrame(samples, columns=["samples"])
df "squared_numbers"] = df["samples"].apply(lambda x: x**2)
df[print(df)
#> samples squared_numbers
#> 0 1 1
#> 1 2 4
#> 2 3 9
#> 3 4 16
#> 4 5 25
4 gapminder
데이터셋
4.1 사용자 정의 함수
import pandas as pd
= pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df
# 제곱함수
def square(x):
return x**2
# A 칼럽에 사용자 정의 함수를 적용
'A_squared'] = df['A'].apply(square)
df[
print(df)
#> A B A_squared
#> 0 1 4 1
#> 1 2 5 4
#> 2 3 6 9
4.2 apply()
함수
import pandas as pd
from gapminder import gapminder
'GDP'] = gapminder.apply(lambda row: row['pop'] * row['gdpPercap'] / 10**9, axis=1)
gapminder[
'country', 'pop', 'gdpPercap', 'GDP']]
gapminder[[#> country pop gdpPercap GDP
#> 0 Afghanistan 8425333 779.445314 6.567086
#> 1 Afghanistan 9240934 820.853030 7.585449
#> 2 Afghanistan 10267083 853.100710 8.758856
#> 3 Afghanistan 11537966 836.197138 9.648014
#> 4 Afghanistan 13079460 739.981106 9.678553
#> ... ... ... ... ...
#> 1699 Zimbabwe 9216418 706.157306 6.508241
#> 1700 Zimbabwe 10704340 693.420786 7.422612
#> 1701 Zimbabwe 11404948 792.449960 9.037851
#> 1702 Zimbabwe 11926563 672.038623 8.015111
#> 1703 Zimbabwe 12311143 469.709298 5.782658
#>
#> [1704 rows x 4 columns]
4.3 사용자 정의 함수
import pandas as pd
from gapminder import gapminder
from functools import partial
def calculate_gdp(row):
return(row['pop'] * row['gdpPercap'] / 10**9)
'GDP'] = gapminder.apply(calculate_gdp, axis=1)
gapminder[
'country', 'pop', 'gdpPercap', 'GDP']]
gapminder[[#> country pop gdpPercap GDP
#> 0 Afghanistan 8425333 779.445314 6.567086
#> 1 Afghanistan 9240934 820.853030 7.585449
#> 2 Afghanistan 10267083 853.100710 8.758856
#> 3 Afghanistan 11537966 836.197138 9.648014
#> 4 Afghanistan 13079460 739.981106 9.678553
#> ... ... ... ... ...
#> 1699 Zimbabwe 9216418 706.157306 6.508241
#> 1700 Zimbabwe 10704340 693.420786 7.422612
#> 1701 Zimbabwe 11404948 792.449960 9.037851
#> 1702 Zimbabwe 11926563 672.038623 8.015111
#> 1703 Zimbabwe 12311143 469.709298 5.782658
#>
#> [1704 rows x 4 columns]