반응형

**일반적인 python이나 anaconda를 이용해서 설치한 파이썬 -C로 만들어진 PYTHON

=>C언어로만든 라이브러리를 파이썬에서 사용할 수 있음

=>C언어는 소스코드를 가지고 실행 파일을 만들어서 배포

실행 파일을 만들 때 운영체제의 start up코드가 포함되어야 합니다.

실행되는 프로그램이 운영체제마다 다릅니다.

=>windows에서 실행되는 c언어는 ms-c이고 이 언어로 프로그램을 만드느 대표적인 idevisual c++ 이고 이 visual c++로 만들어진 프고르램을 실행시키기 위해서 재배포 패키지나 build tool이 설치되어 있어야 합니다.

 

**windows애서 python t실행시 라이브러리가 설치되지 않는데

visual c++ 14.0이 설치되어 있어야 하는데 설치되어 잇지 않다는 에러 메시지가 출력되는 경우

-visual studio 2015 재배포 패키지 설치 : 설치해도 잘 안됨

-visual studio 2015 build tools 설치 : 설치해도 잘 안됨

-visual studio 최신 버전 설치 : visual studio community버전 다운로드

 

 

ar . vr 게임 등 관심있으면 unity

mmo rpg ->언니얼

microsoft vr tool -> 테이블 그래는 것 자동으로 하는 것

 

 

 

데이터 적을 때 는 오차 , 정밀도 , 재현울 , F1점수 roc 곡선 등

 

 

 

** 불균형한(개수가 다른 경우) 클래스의 데이터를 가지고 분석을 해야 하는 경우

=>샘플 자체의 개수가 작을 떄는 자료를 더 수집하는 것이 가장 좋은 방법

=>데이터 를 수집하는 것이 가능하지 않을 때는 데이터에 가중치를 적용해서 사용- 분류 알고리즘의 매개변수 중에서 weight가 있으면 이 매개변수가 데이터에 가중치를 적용할 수 있는 매개변수 입니다.

=>개수가 작은 데이터의 개수를 강제로 늘리거나 개수가 많은 데이터의 개수를 줄이는 업샘플링이나 다운 샘플링을 해서 알고리즘에 적용

=>평가지표를 다양하게 선택 - 정확도 대신에 재현율이나 F1 통계량 등을 이용

정확도 , 재현율 등 .. 어느 하나 선택할 때는 결과가 외곡 될 수 있다.

정확도 , 재현율 ,F1통계량 결정 계수 등  정확하게 뭘 의미하는 지 알아야 한다.

분석은 어렵지 않다.그 결과를 판정하는 데 어렵고 뭐하는지 알아야 한다.

 

 

import numpy as np

import pandas as pd

 

#0 10개이고 1 90개 인 ndarray생성

list1 =[]

for i in range(0,10,1):

    list1.append(0)

 

list2 =[]

for i in range(0,90,1):

    list2.append(1)

   

#2개의 list를 가지고 하나이 array생성

target = np.array(list1+ list2)

#list더하기 하면 결합이고

#분석은 더하기 하면 더하기 이다.

print(target)

 

#분류 알고리즘에 위의 데이터를 이용하는 경우

#0: 10% 1 : 90%

from sklearn.ensemble import RandomForestClassifier

#데이터의 비율이 헌저하게 다르기 때문에 가중치 설정

weights = {0:0.9, 1:0.1}

#비율은 반대로 쓴다. 10%, 90%

#0.9 = .9

rfc = RandomForestClassifier(class_weight = weights)

print(rfc)

 

#assemble하고 down는 같이 하면 안된다.

 

#가중치를 직접 설정하지 않고 분류기에게 판단하도록 해주는 옵션

rfc = RandomForestClassifier(class_weight='balanced')

print(rfc)

 

#샘플링 비율 조건

#np.where(target == 0)

#target행렬에서 값이 0인 데이터의 행번호를 리턴

#(행번호행렬, 자료형)으로 결과를 리턴

#행번호행렬만 가져오기 위해서 [0]을 추가

class0 = np.where(target == 0)[0]

class1 = np.where(target == 1)[0]

print(len(class0))

print(len(class1))

 

#target 1인 데이터에서 target 0인 데이터만큼 다운 샘플링을 해서

#새로운 데이터 셋을 생성

#class1에서 class0의 데이터 개수 만큼 비복원 추출 (나온것은 제거)

#assembling랄 때는 복원 추축

downsample = np.random.choice(class1, size = len(class0) , replace= False)

result = np.hstack((target[class0], target[downsample]))

#0개에서는 90개 만들 수 없다.

#downsample = np.random.choice(class0, size = len(class1) , replace= True)

#result = np.hstack((target[class1], target[downsample]))

print(result)

 

** 다변량 분석에서 데이터의 상대적 크기 문제

=>다변량 분석 - 2개이상의 컬럼의 데이터를 가지고 분석

=>하나의 컬럼의 데이터는 값의 범위가 0-100이고 다른 컬럼의 데이터는 값이 범이가 0-1이라면 이 경우 2개의 데이터를 가지고 다변량 분석을 하게 되면 첫번째 컬럼의 영향을 받게 될 수 있습니다.

이런 경우에는 값의 범위를 일치시켜 주는 것이 좋습니다.

=>값의 범위는 같은데 분포가 다른 경우에도 분포를 기준으로 값을 조정할 필요가 있습니다.

최대값으로 나누거나 최대값 - 최소값을 분모로하고 해당값 - 최소값을 분자로 해서 값을 조정

=>이러한 값의 조정을 scalling이라고 합니다.

0-1 사이나 -1~1사이로 조정합니다.

더 큰 값으로 가능하지만 머신러닝 모델에서는 값으 크기가 커지면 정확도가 떨어집니다.

 

 

1.표준화

=>모든 값들의 표준 값을 정해서 그 값을 기준으로 차이를 구해서 비교하는 방법

1)표준값: (데이터- 평균) /표준편차 -표준 값의 평균은 50 (사람한테 줄 때 )

2)편차값: 표준값 * 10 + 50 -위의 숫자보다 큰  숫자로 변환

 

#표준화

#student.csv파일의 내용을 가져오기

#index로 이름을 설정

import os

print(os.getcwd())

#utf8이 아니다.

data = pd.read_csv('./Desktop/data/student.csv', index_col ='이름',encoding = 'cp949')

print(data)

 

#그래프에 한글을 출력하기 위한 설정

import matplotlib.pyplot as plt

import platform

from matplotlib import font_manager, rc

#매킨토시의 경우

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)

 

#인덱스를 기준으로 해서 막대 그래프 그리기

data.plot(kind='bar')

 

#표준값 - 작업

#평균을 표준 편차로 나누어서 계산

#각과목의 평균과 표준편차 구하기

kormean, korstd = data['국어'].mean(), data['국어'].std()

engmean, engstd = data['영어'].mean(), data['영어'].std()

matmean, matstd = data['수학'].mean(), data['수학'].std()

 

 

#표쥰값 구하기 -(자신의 값 - 평균 )/ 표준편차

#내가 0.0이면 중간

#편차값이 1.0이면 항상 상하위 15%

#2.0 상하위 1.1%

#음수가 있을 수 있다.

data['국어표준값'] = (data['국어']- kormean )/korstd

data['영어표준값'] = (data['영어']- engmean )/engstd

data['수학표준값'] = (data['수학']- matmean )/matstd

print(data[['국어표준값','영어표준값','수학표준값']])

#박지영은 국어는 영어보다 잘 한다.  수학은 못한다.

 

#음수를 잘 안보이기 때문에 우리가 자주사용하는 숫자로 변한다.

 

#표준값은 비교가 가능하기는 하지만 사람이 알아보기 불편

#표준값 * 10 + 50 을 해서 편차값을 만들어서 보고서를 만듬

 

 

data['국어표준값'] = data['국어표준값']* 10 + 50

data['영어표준값'] = data['영어표준값']* 10 + 50

data['수학표준값'] = data['수학표준값']* 10 + 50

print(data[['국어표준값','영어표준값','수학표준값']])

 

 

data[['국어표준값','영어표준값','수학표준값']].plot(kind='bar')

 

 

#최대값으로 나누어서 표준화  - 정규화로 많이 불리운다.

#자신의 값 - 최소값/ 최대값 - 최소값으로 하기도 함

#0.0 ~ 1.0 사이로 있다.

data['국어정규화1']  = data['국어'] / data['국어'].max()

data['국어정규화2']  =( data['국어']- data['국어'].min()) / (data['국어'].max()-data['국어'].min())

 

 

 

2.sklearn의 정규화

1)StandartScaler: 평균이 0이고 표준편차가 1이 되도록 변환

(백터- 평균) / 표준편차

주로 주성분분석에서 많이 이용

음수가 잇을 가능성 있다.

 

2)MinMaxScaler:  최대값이 1 최소값이 0 이 되도록 변환

(백터 - 최소값) /(최대값 - 최소값)

신경망에서 주로 이용 (cnn, rnn)

 

 

 

3)RobustScaler: 중앙값이 0 IQR(4분위수 )를 이용하는 방식

(백터 - 중간값) /( 75%- 255)

=>앞의 방식들은 outlier(이상치)에 영향을 많이 받습니다.

=>데이터의 분포가 불균형이거나 극단치가 존재하는 경우에 주로 이용

 

 

 

0 1 2 3 4 5 6 100->이상치가 있을 수 있다. 1),2) OUTLIER

그래서 75%의 값 25%의 값

그래서 최대값 최소값 영향을 받지않는다.

 

 

4)QuantileTransformer:데어터를 1000개의 분위로 나눈 후 0-1 사이에 고르게 분포시키는 방식

=>outlier 의 영향을 적게 받기 위해서 사용

 

 

0 ~ 100 사이의 데이터인데

17 27 25 16 41 33 27 -> 이렇게 된것은 표준화 하면 안좋다. 데이터의 분포가 작아서

표준화 하면 꼭 고려해야 할 두가지 데이터 분포 , outlier

아주 큰 값 있으면 하나 버리기

데이터 분포가 완전히 쏠려져 있을 경우에는 정규화를 하지 않는다.

 

변화 하면 fit_transform

모델에 적용하면 fit 이다.

표준화는 값만 가지고 해야 한다.

 

 

 

#표준화 작업

#sklearn을 이용한 scailing

from sklearn import preprocessing

 

#StandardScaler

#StandardScaler - 평균은 0 표준편차는 1이 되도록 표준화

scaler = preprocessing.StandardScaler()

#국어 점수만 이용하는 경우 data['국어'] 가 아닌고 data[['국어']]

#머신러닝의 데이터들은 행렬을 이용하는데 data['국어']하게 되면 컬럼이름이

#1개라서 하나의 열로 리턴되서 1차원 데이터가 됨

#data[['국어']] 하게 되면 list를 대입하기 때문에 datafrmae으로 리턴

result = scaler.fit_transform(data[['국어']].values)

print(result) #표준값 구한 것

print(np.mean(result)) #평균이 0에 가까워진다. 1.2335811384723961e-17 ->거의 0이다 e 17

print(np.std(result)) # 값이 1에 가까워진다.

 

 

 

#MinMaxScaler

#MinMaxScaler - 음수가 안나온다. 최대값 최소값 이용해서 하기 때문에

scaler = preprocessing.MinMaxScaler()

result = scaler.fit_transform(data[['국어']].values)

print(result)

print(np.mean(result))

print(np.std(result))

 

 

#RobustScaler

#RobustScaler - 음수가 나온다.  이상치 값이 있을 때 해결하기 위한 것

scaler = preprocessing.RobustScaler()

result = scaler.fit_transform(data[['국어']].values)

print(result)

print(np.mean(result))

print(np.std(result))

 

 

#QuantileTransformer

#QuantileTransformer - 음수가 나오지 않는다. 데어터 분포를 고려해야 한다. 데이터가 적으면 안된다.

scaler = preprocessing.QuantileTransformer()

result = scaler.fit_transform(data[['국어']].values)

print(result)

print(np.mean(result))

print(np.std(result))

 

 

**정규화

=>값의 범위를 0 -1 사이의 데이터로 변환

=>표쥰화는 일정한 범위 내로 데이터를 변환하는 것이고 정규화는 0-1 사이로 해야 합니다.

=>Normalizer클래스를 이용해서 transform메소드에 데이터를 대입하면 됩니다.

이 때 norm매개변수에 옵션을 설정할 수 있는데 l1, l2, max등의 값을 설정할 수 있습니다.

max는 최대값으로 나누는 방식

l1l2는 거리 계산 방식

l1-  맨하턴 거리를 이용하고 l2는 유클리드 거리를 이용

맨하탄 거리  -> 장애물이 있을 경우에는 직접 못간다.'

이 두개 크기 자체는 별로 차이 안나는데 계산 방식이 다르다.

게임 shoting게임 할 때 사용한다.

A B 거리 계산 할때 거리 계산한다. 거리가 멀면 시간이 오래 걸린다.

ping할 때  ttl ->라우터의 계수

 

 

 

 

#이차원 행렬을 생성

matrix = data[['국어','영어']].values

print(matrix)

 

 

matrix = np.array([[30,20],[10,30],[30,40]])

print(matrix)

 

from sklearn import preprocessing

 

#l1-  맨하턴 거리를 이용하고 l2는 유클리드 거리를 이용

#정규화 객체 생성 - 유클리디안 거리를 사용

norm = preprocessing.Normalizer(norm = 'l2')

print(norm.transform(matrix))

# 30 /  302+ 402승 에 root => 30 / 50

 

#합을 가지고 나누느 방식

norm = preprocessing.Normalizer(norm = 'l1')

print(norm.transform(matrix))

# 30 / 50  20/50

 

#큰값을 가지고 나누는 방식

norm = preprocessing.Normalizer(norm = 'max')

print(norm.transform(matrix))

#30/40  40/40

 

 

** 다항과 교차항 특성

=>기존 데이터에 데이터들을 곱하고 제곱을 해서 데이터를 추가하는 것

=>특성과 타겟 사이에 비선형 관계과 존재할 때 사용하는 방식

=>비선형 관계는 2개의 관계가 직선의 형태가 아니고 곡선의 형태인것

=>각 특성이 다른 특성에 영향을 줄 때 각 특성을 곱할 교차형을 가지고 인코딩

=>다변량 분석(2개 이상의 컬럼을 가지고 분석) 을 할 때 2개의 컬럼 사이에 상관관계가 있는 경우가 있는데 이런 경우 2개의 컬럼 모두를 가지고 분석을 하게 되면 다중공선성 문제가 발생할 수 있습니다.

어떤 컬럼의 값을 알면 다른 컬럼의 값을 예측할 수 있는 경우 발생할 수 있는 문제입니다.

이런 경우에는 2개의 컬럼을 1개의 컬럼으로 변환하는 작업을 해야 하는데 (차원축소) 이런 경우 더하거나 거나 제곱해서 새로운 값을 만들어냅니다ㅣ.

 

 

 

=>PolynomialFeatures 클래스를 이용하는데 몇 차 항 까지 생성할 것인지 degree에 설정

첫번 떄 데이터로 1을 추가할 지 여부를 include_bias에 설정

=>연산식의 순서는 get_features_names메소드를 이용해서 확인 가능

 

[ 1 , 2 ]            degree  = 2 제곱 까지 만 한다.

[1 , 2 , 1의 제곱 1, 1 * 2 = 2, 2의 제곱 = 4 ]

2를 적용하면 5개 데이터를 만든다.

[4,7]

[4, 7, 16, 28, 49 ]

 

degree = 3

[4, 7, 16, 28, 49 , 64, .......]

[[  4.   7.  16.  28.  49.  64. 112. 196. 343.]]

차원 축소 할 때 데이터를 만들어 낸다.

42* 7 ,

28 * 6  * 7 = 196

 

 

 

 

 

matrix = np.array([[30,20],[10,30],[30,40]])

print(matrix)

 

#다항과 교차항을 만들어주는 객체를 생성

#include_bias = False 첫번 때 0을 안 집어 여겠다.

# degree = 2: 제곱한 것 까지 생성

polynomial  = preprocessing.PolynomialFeatures(degree = 2, include_bias = False)

result = polynomial.fit_transform(matrix)

print(result )

 

matrix = np.array([[4,7]])

print(matrix)

 

polynomial  = preprocessing.PolynomialFeatures(degree = 3, include_bias = False)

result = polynomial.fit_transform(matrix)

print(result )

 

**표준화나 정규화는 직접 하는 경우가 많지만 다항식을 만드는 것은 머신러닝 알고리즘에서 자체적으로 처리하는 경우가 많음

 

**특성 변환

=>데이터에 동일한 함수를 적용해서 다른 데이터로 직접 변환하는 것

=>pandas에서는 apply메소드를 이용하고 sklean에서는 preprocessing.FunctionTransformerColumnTransformer클래스를 이용ㅇ

=>FunctionTransformer는 모든 열에 동일한 함수를 적용하고  ColumnTransformer는 서로 다른 함수를 적용할 수 있습니다.

객체를 생성할 때 적용할 함수를 설정해서 만들고 transform 메소드에 데이터를 대입하면 됩니다.

 

import numpy as np

from sklearn import preprocessing

#함수 적용하기

matrix = np.array([[100,200],[300,150]])

print(matrix)

#위 데이터를 정수로 변환하기

#100을 결합하기

def intconvert(x):

    return x + 100

#행렬을 변환해서 리턴해준다.

transformer = preprocessing.FunctionTransformer(intconvert)

result = transformer.fit_transform(matrix)

print(result)

print(data['국어'])

print(data['국어'].apply(intconvert))

 

 

**Outlier 감지

=>Outlier 이상치나 극단치 , 일반적인 데이터의 범위를 넘어선 값

1.z점수를 이용하는 방법 : 중앙값을 기준으로 표준편차가 3 또는 -3 범위의 바깥똑에 있는 데이터를 Outlier 로 간주

2.z점수의 보정 :z 점수는 데이터가 12개 이하이면 감지를 못함

넘 작으면 표준편차가 잡지 못하기 때문에

편차의 범위를 3.5로 늘리고 0.6745를 곱한 값을 이용

3.IOR(3사분위수 - 1사 분위수)이용: 1사분위수 (25%)보다 1.5 IQR 작은 값이나 3사분위수(75%) 보다 1.5IQR 큰 데이터를 outlier 로 간주

 

 

1,2,3 10004

10010/4

 

1,2,3 10004 , 10004 => 이 경우에는 outlier가 알될수 도 있다. 많이 적으면 outlier가 나올 수 있다.

 

 

import numpy as np

import pandas as pd

 

 

#array를 입력받아서 z 점수(표준편차의 3) 밖에 있는 데이터를 리턴해주는 함수

def z_score_outlier(ar):

    threshold  = 3

    #평균 가져오기

    meandata = np.mean(ar)

    stdevdata = np.std(ar)

    #stdevdata for y in ar의 요소를 y에 하나씩 대입하고 앞에 수식을 적용해서 결과를 가지고

    #다시 list를 만드는 것

    z_scores  = [(y-meandata) / stdevdata for y in ar]

    return np.where(np.abs(z_scores) > threshold)

 

#샘플 데이터 생성

#features = np.array([[10,30,13,-20,4,12],[20000,3,5,4,2,1]])

#features = np.array([[10,30,1003,-20,4,12],[2,30,5,4,2,1]])

    #(array([0], dtype=int64), array([2], dtype=int64)) 0 2

#features = np.array([[10,30,13,-20,4,12],[2,9,5,4,2,10]])#없다.

features = np.array([[10,30,13,-2000000,4, 12, 10,30, 13, 11, 4, 12,10,30,13,20,4,2,4,2],

                     [2,9,5,4,2,2000000,10,30,13,20,4,12,10,30,13,20,4,2,4,2]])

#(array([0, 1], dtype=int64), array([3, 5], dtype=int64))

    #0번에 3 1번에 5

 

result = z_score_outlier(features)

print(result)

 

 

#z score 보정  -범위를 3.5배로 널리고 표준편차 0.6875를 곱해줍니다.

def modify_z_score_outlier(ar):

    threshold  = 3.5

    #평균 가져오기

    meandata = np.mean(ar)

    stdevdata = np.std(ar)

    #stdevdata for y in ar의 요소를 y에 하나씩 대입하고 앞에 수식을 적용해서 결과를 가지고

    #다시 list를 만드는 것

    z_scores  = [0.6875 * (y-meandata) / stdevdata for y in ar]

    return np.where(np.abs(z_scores) > threshold)

 

#샘플 데이터 생성

features = np.array([[10,30,13,-20,4, 12, 10,30, 13, 11, 4, 12,10,30,13,20,4,2,4,2],

                     [2,9,5,4,2,2000000,10,30,13,20,4,12,10,30,13,20,4,2,4,2]])

#(array([0, 1], dtype=int64), array([3, 5], dtype=int64))

 

result = modify_z_score_outlier(features)

print(result)

 

 

#iqr이용 : 3 사분위수 - 1사분위의 +- 1.5 배이상 차이나면 이상치로 간주

def iqr_outlier(ar):

    #25% 75%의 값 찾기

    q1 ,q3 = np.percentile(ar,[25,75])

    #iqr값 찾기

    iqr = q3- q1

    #25% 값과 .5 iqr보다 작은 값 찾기

    lower = q1- iqr*1.5

    upper = q3 + iqr* 1.5

    return np.where( (ar > upper )| (ar < lower))

 

#샘플 데이터 생성

features = np.array([[10,30,13,-20,4, 12, 10,30, 13, 11, 4, 12,10,30,13,20,4,2,4,2],

                     [2,9,5,4,2,2000000,10,30,13,20,4,12,10,30,13,20,4,2,4,2]])

 

 

result = iqr_outlier(features)

print(result)

 

 

**Outlier처리

1.제거

=>설문조사를 했는데 이상한 데이터가 입력된 것 같은 경우

=>분석 목적에 맞지 않는 데이터인 경우

 

 

2.이상한 데이터로 표현해두고 특성의 하나로 간주

이상한 상황을 없에면 안되고 특수한 상황으로 해야 한다.

 

3. outlier의 영향이 줄어돌도록 특성을 변환 - 값의 범위를 줄임(표준화, 정규화 등)

=> 표준화 할 때는 RobustScalar를 이용하는 것이 좋음

 

 

house = pd.DataFrame()

house['price'] = [100000,200000,150000,10000000]

house['rooms'] = [1,3,2,100]

house['square'] = [11,23, 16, 1200]

print(house)

 

 

#이상한 데이터 제거 : 방이 5개 이상 제거

print(house[house['rooms'] < 6])

#이상한 데이터를 별도로 표시

house['outlier'] = np.where(house['rooms'] < 6 , 0,1)

print(house)

 

 

#값의 범위 줄이기 -np.log는 자연 로그를 계산

house['log'] = [np.log(x) for x in house['rooms']]

print(house)

 

** 시계열 데이터

=>날짜 및 시간에 관련된 데이터

1.pandas의 시계열 자료형

=>datatime64 : 부등호를 이용해서 크기비교를 할 수 있고 - 를 이용해서 뺄셈을 할 수 있음

=>Period:두개의 날 짜 사이의 간격을 나타내기 위한 자료형

=>시계열 자료형을 별도로 구성하는 이유는 일정한 패턴을 만들기 쉽도록 하기 위해서

 

 

 

2. 생성

=>문자열 데이터를 시계열로 변경 : pandas.to_datetime()이용

날짜 형식의 문자열과 format매개변수에 날짜 형식을 대입

 

 

#문자 데이터를 pandas의 시계열 데이터로 만들기

df = pd.read_csv('./Desktop/data/stock-data.csv')

print(df)

#자료형 확인

print(df.info())

#Date 컬럼의 값을 시계열로 변경해서 추가

df['newDate'] = pd.to_datetime(df['Date'])

print(df.info())

 

 

#위와 같은 데이터프레임에서는

#날짜를 index로 설정하는 경우가 많습니다.

df.set_index('newDate',inplace = True)

df.drop('Date',axis = 1 , inplace = True)

print(df.head())

 

 

 

 

 

3.Period 간격을 나타낸다.

=>pandas.to_period 함수를 이용해서 datatimeperiod로 생성

freq 옵션에 기준이 되는 기간을 설정

=>freq옵션

 

D: 1

W: 1

M 1개월 (월말 기준)

MS: 1개월 (월초 기준)

Q: 분기말

QS :  분기초

A:연말

AS:

B: 휴일제외

H,T,S,L,U,N: 시간 , , , 밀리초 , 마이코로초 , 나노초

 

 

#일정한 간격을 갖는 날짜 만들기

dates = ['2017-03-01','2017-06-01','2019-12-01']

print(dates)

#날짜로 변경

pddates = pd.to_datetime(dates)

print(pddates)# DatetimeIndex로 바꿔졌다.

 

 

#Period로 변환

pdperiod  = pddates.to_period(freq = 'D')

print(pdperiod)

#PeriodIndex(['2017-03-01', '2017-06-01', '2019-12-01'], dtype='period[D]', freq='D')

 

pdperiod  = pddates.to_period(freq = 'M')

print(pdperiod)

#PeriodIndex(['2017-03', '2017-06', '2019-12'], dtype='period[M]', freq='M')

 

pdperiod  = pddates.to_period(freq = 'Q')

print(pdperiod)

 

pdperiod  = pddates.to_period(freq = 'A')

print(pdperiod)

 

 

 

5.date_range()

=>일정한 간격을 소유한 날짜 데이터의 집합을 생성

=>매개변수

start: 시작 날짜

end: 종료 날짜

periods: 생성할 날짜 개수

freq: 간격

tx: 시간대

 

 

 

#일정한 간격을 가진 날짜 데이터 생성

ts_ms = pd.date_range(start = '2018-01-01',end = None, periods = 12, freq = 'M')

print(ts_ms)

 

ts_ms = pd.date_range(start = '2018-01-01',end = None, periods = 12, freq = 'D')

print(ts_ms)

 

#2H ->2시간씩

ts_ms = pd.date_range(start = '2018-01-01',end = None, periods = 12, freq = '2H')

print(ts_ms)

 

 

6.날짜 데이터에서 필요한 부분 추출하기

=>dt.year, dt.month, dt.day...

=>요일은  dt.weekday_name은 문자열로 dt.weekday하면 숫자로 리턴 (월요일이 0)

화면에 출력할 때는 문자열로 하고 머신러닝을 사용할 때는 숫자로 리턴 받습니다.

ts_year = df['newDate'].dt.year

print(ts_year)

 

df['year'] = df['newDate'].dt.year

print(df['year'])

 

 

7.python에서는 날짜는 datetime패키지의 datetime으로 제공

=>날짜 형식의 문자열을 가지고 날짜 형식의 데이터를 생성

 

 

8.shift함수를 이용하면 기존 날짜를 이동시키는 것이 가능

=>freq 매개변수에 간격을 설정할 수 있습니다.

 

 

#python의날짜 패키지

from datetime import datetime

dates = [datetime(2017,1,1),datetime(2017,1,4),datetime(2017,1,7)]

ts = pd.Series(np.random.randn(3) , index = dates)

print(ts)

print(ts.shift()) #데이터를 하나씩 민다. 아래쪽으로

print(ts.shift(1)) #데이터를 하나씩 민다. 아래쪽으로

print(ts.shift(-1)) #데이터를 하나씩 반대로 민다. 위로

 

 

9.resampling

=>시계열의 빈도를 변환하는 것

=>상위 빈도의 데이터를 하위 빈도의 데이터로 변환하는 것을 다운 샘플링이라고 하고 반대의 과정을 asampling이라고 한다.

=>resampling(freq, how, fill, method, closed, label , king)

freq: 리샘플링 빈도(M,Q, A)

how: 집계함수를 지정하는 것으로 기본은 mean(평균을 구한다.) first, last, max, median ,min

데이터가 있으면  합계등 골라내다.

fill_method: 업 샘플링할 때 데이터를 채우늠 옵션이므로 기본은 None인데 fill이나 bfill을 설정해서 이전값이나 이후값으로 채울 수 있음

closed: 다운 샘플링을 할 때 왼쪽과 오른쪽 어느쪽을 호팜시킬지 설정

label: 다운 샘플링을 할 때 레이블을 왼쪽 또는 오른쪽을 사용할 것인지 여부

 

 

 

#일정한 조건으로 집계

ran = pd.date_range('11/3/2010',periods = 20, freq ='T')

print(ran)

 

ts = pd.Series(np.arange(20),index = ran)

print(ts)

#5개씩 하면 5분단위로 할 수 있다.

#실데이터는 다르다. 10분마다

#label 0분이나 4분이나 할 것이다

 

#5분 단위로 합게

print(ts.resample('5T').sum())

 

print(ts.resample('5T').mean())

 

 

10.날짜 데이터가 데이터프레임에 존재하는 경우 날짜 데이터를 인덱스로 설정하면 특정 시간단위로 집계를 하는 것이 쉬워집니다.

 

**이동시간 윈도우

=>통계적 수치를 계산을 할 때 최근의 데이터에 가중치를 부여해야 한다라는 개념

평균을 구할 때 데이터 전체의 평균을 구하는 것 보다는 최근의 데이터 몇 개의 평균을 구하는 것이 미래를 예축할 때는 더 잘 맞을 가능성이 높다.

이전 데이터와 최근의 데이터를 같이 사용할 거라면 최근의 데이터에 가중치를 부여하는 것이 미래를 예측할 때는 더 잘 맞을 가능성이 높다.

 

 

1.rolling 함수

=>단순 이동 평균을 계산해주는 함수

=>winodw 매개변수에 데이터 개수를 설정하면 데이터 개수 단위로 연산을 수행

 

 

2.ewm함수

=>지수 이동 평균을 계산해주는 함수

=>지수 이동 평균은 최근의 데이터에 가중치를 부여하는 방식의 평균

주식 데이터는 이 평균을 사용합니다.

=>기간(span)을 설정하면 아래 수식으로 평균

데이터가 3개인 경우

x1, x2, x3(가장 최근 데이터)

1-span을 알파라고 합니다.

 

x3+(1-(1-span)) x2 +(1-(1-span) )제곱 x3  / 1 + (1-알파) +(1-알파)제곱

숫자를 줄인다.

 

 

500 2000 2300 2700

3

2000 +2500+2700 / 3

반영율을 조정한다.

 2500 + (1-1/3) * 2000 + (1-1/3)2 의 제곱 * 2000

 

지수 이용 평균

어느 속도를 기준해서 낮아진다. 불량율 , 숙련도 주식등에서 많이 사용한다.

 

시간에 따라 변경되는

데이터를 가지고 계속 할 때는 최근의 데이터

가중치를 부여해야 한다.

에이징 커브 -전년도 데이터를 해서 하는 것

최근에 얼마 사용했는지에 따라 가중치를 준다.

휴대폰이 2100시간 최근에는 2시간

 

 

python문법 ->데이터 가공 numpy pandas ->

sklearn

회귀 군집 알고리즘 등

반응형

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

데이터분석-8  (0) 2020.11.14
데이터분석-8  (0) 2020.11.12
데이터분석-6  (0) 2020.11.10
데이터분석-5  (0) 2020.11.09
데이터분석-4  (0) 2020.11.08

+ Recent posts