달력

10

« 2022/10 »

  •  
  •  
  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  
  •  
728x90
반응형

오늘도 난 전혀 감도 없는 인사이트를 얻기 위해.... 삽질중..^^;;

 

오늘도 주중에 키움API 실시간 체결창 정보를 MySQL로 저장한뒤

그 정보를 가지고 몇 시간을 요리조리 해보다가..갑자기 드는 자괴감..

이런다고 돈 많이 버나? ㅎ

 

그래서...

그냥 천천히 하기로 하고 파이썬을 이용해서 간단하게 시각화 해보는 것에 대해서 작성해 본다.

엄청 다양하게 시도해봤지만..딱히 떠오르는 것이 없다.

 

우선은 내가 좋아하는 Interactive Chart 인 plotly 를 이용하기로 했다.

아! 들어가기전에 키움 API를 이용한 데이터 수집에 대해서는 pass~

간단히 시각화 코드만 만들어봤다.

 

import plotly.express as px
import plotly.graph_objs as go
import pandas as pd

라이브러리는 저정도만 입력해보 작동 가능 할 것이다.

나의 코드에는 그 외에도 DB를 이용하기 위한 라이브러리, os 등등 너무 잡다하게 있어서 pass

 

stock_code = '064550'
_dt = '2021-09-10'
day_list = _dt.split('-')

dt_y = day_list[0]
dt_m = day_list[1]
dt_d = day_list[2]
print('검색날짜 :', dt_y, dt_m, dt_d)    

df_stocks_info = stocks_info()
df_tick = tick(dt_y, dt_m, dt_d, stock_code)

위와 같이 정보를 입력하고,

각각 필요한 데이터를 함수를 호출하여 Dataframe 형태로 저장한다..

 

그 형태는 아래와 같다.

df_stocks_info

stocks_info 는 키움의 종목에 대한 정보들을 담기 위한 것이다. 아직은 코스피, 코스닥 구분 및 종목명만 있다.

추후에 필요하다면 시가총액, 등등 정보 다양한 정보를 받을 것이다.

 

df_tick

예전과 다르게 키움에서 조금 업그레이드를 했는지 전일동시거래량도 추가된 것을 볼 수 있다.

여기서 잠깐 사족을 좀 달자면..

체결시간의 경우 키움 API 는 HHMMSS 형태의 string 형태인데. MS(밀리세컨드) 시간이 없다.

그래서 상기 표에서도 나와있지만. 단순히 데이터들 정보가 들어오는 순서 그대로 놔뒀다.

키움 API 게시판에 찾아보니

저 체결량 순서는 체결되는 순서 그대로라고 하니.. 뭐 맞겠지???(추후에 확인해봐야지.ㅋ)

 

우선 간단하게 시간순에 따라서 체결량을 시각화 해봤다.

px 를 이용하여 상단 및 우측에 histogram도 함께 추가하였다.

stock_name = df_stocks_info.loc[stock_code]['NAME']

fig = px.scatter(df_tick, x=df_tick.index, y="VOLUME", color="VOLUME", marginal_x='histogram', 
                 marginal_y="histogram", width=1500, height=1000, title='{} {} 체결창 분석'.format(_dt, stock_name))

fig.show()

바이오니아_체결창.html
6.78MB

 

위에서 보면 9시 10시 2시 정도에 체결량이 증가 한 것을 알 수 있다.

그리고........음....... 뭐냐? 뭐가 있냐!! 제발 보여달라!!! 나에게 인사이트를 내어달라!!!! ㅠ.ㅠ

반응형

이번에는 모든 데이터를 같은 차트에 넣고 볼려고 한다.

자세한 내용은 구글등에서 plotly multipule axes 등 으로 검색하면 관련 자료들이 많다.

한참 구글링 한 다음 만든 차트

fig = go.Figure()
go.Scatter
fig.add_trace(go.Scatter(x=df_tick.index, y=df_tick['VOLUME'], name="체결량", mode='markers', 
                         marker=dict(size=5, color=df_tick['VOLUME'], line_width=1)))
fig.add_trace(go.Line(x=df_tick.index, y=df_tick['PRICE'], name="체결가", yaxis="y2", line=dict(color='#9467bd')))
fig.add_trace(go.Line(x=df_tick.index, y=df_tick['TURNOVER_RATE'], name="회전율", yaxis="y3", line=dict(color='#d62728')))
fig.add_trace(go.Line(x=df_tick.index, y=df_tick['TRANS_STR'], name="체결강도", yaxis="y4", line=dict(color='#ff7f0e')))
fig.add_trace(go.Line(x=df_tick.index, y=df_tick['PAST_STIME_RATE'], name="전동거", yaxis="y5", line=dict(color='#1f77b4')))

fig.update_layout(xaxis=dict(domain=[0.1, 0.8]),
                  yaxis=dict(title='체결량'), 
                  yaxis2=dict(title='체결가', titlefont=dict(color='#9467bd'), tickfont=dict(color='#9467bd'), anchor='free', overlaying='y', side='left', position=0.05),
                  yaxis3=dict(title='회전율',titlefont=dict(color='#d62728'), tickfont=dict(color='#d62728'), anchor='free', overlaying='y', side='left', position=0.01),
                  yaxis4=dict(title='체결강도',titlefont=dict(color='#ff7f0e'), tickfont=dict(color='#ff7f0e'), anchor='x', overlaying='y', side='right'),
                  yaxis5=dict(title='전동거',titlefont=dict(color='#1f77b4'), tickfont=dict(color='#1f77b4'), anchor='free', overlaying='y', side='right', position=0.85))

fig.update_layout(title_text='{} {} 종합분석'.format(_dt, stock_name), width=1500, height=1200)

fig.show()

xaxis 축의 domain 의 경우 표의 구역을 정의 한다고 보면 될 듯한다.

그리고 거기에 맞춰서 position 을 이용하여 원하는 위치에 넣어주면 된다.

 

위와 같이 작성하면 아래와 같은 결과를 얻을 수 있다.

이날 바이오니아 종목의 체결량이 많았는지 꽤 무겁다. 용량도 크고..

 

다른 분들은 저와 같이 삽질하질 마시길...

프로그래밍 공부를 위한 분석인가? 투자를 잘 해서 돈을 벌기 위함 인가???

오늘도 난 고민에 빠진다.... 시간 로스가 너무 많다. 쳇.

 

728x90
반응형
Posted by 패치#

댓글을 달아 주세요

728x90
반응형

오늘 키움 호가창 실시간 데이터를 mysql DB에 수집하는 C#을 가동해봤다...

10시 50분부터 시작을 해서 16시 11분까지..

집중되는 9시~10시 사이는 코딩 수정때문에 수집을 하지는 못했음에도 불구하고..

헐...6.4 기가라니.....

 

호가창 분석은 일자 limit를 두던지 아니면 해야 할듯..

 

관리가 필요할 듯 하다...

DB까지도 공부해야 하나? ㅠ.ㅠ

 

아니면 초기 integer 자릿수에 대해서 정확히 안배해 볼까?

음....

근데 내가 이 데이터로 멀 할려는 거지? 젠장..

728x90
반응형
Posted by 패치#

댓글을 달아 주세요

728x90
반응형

파이썬 datetime의 timedelta 에는 day 를 더해서 몇일 후의 날짜를 구할 수는 있지만,

다음달을 계산해주지는 않는다.

 

timedelta 를 편법적으로 사용해서 하는 방법도 있지만,

calendar 함수를 사용하면 아주 편하게 return 받을 수 있다.

 

calendar 함수는 기본함수이므로 바로 import를 해준다.

import calendar

기본 문서는 아래 링크를 통해서 확인 할 수 있다.

calendar — General calendar-related functions — Python 3.9.7 documentation

 

calendar — General calendar-related functions — Python 3.9.7 documentation

calendar — General calendar-related functions Source code: Lib/calendar.py This module allows you to output calendars like the Unix cal program, and provides additional useful functions related to the calendar. By default, these calendars have Monday as

docs.python.org

 

여기서 몇 가지의 예제를 살펴보면

내가 가장 찾고 있었던 기능인 다음달 계산은 nextmonth 함수와 연도, 달..

입력으로 다음달을 계산해 준다.

calendar.nextmonth(2021, 12)

위와 같이 한줄로 바로 알아낼수가 있다. 하지만!!!!!

여기서 주의할 점은..

그럴리는 잘 없지만 잘못된 달을 입력하게 되면 이런식으로 리턴받게 된다.

calendar.nextmonth(2021, 13)

이건 내부함수에서 볼 수 있듯이 12만 인식을 하고 있다.

def _nextmonth(year, month):
    if month == 12:
        return year+1, 1
    else:
        return year, month+1

그래서 12이상으로 안 들어가도록 미리 input limit 을 준다던지 하는식으로 코딩해줘야 한다.

 

그외에도 아래와 같이 다양하게 활용할 수 있다.

* 캘린더 호출

calendar.calendar(2021)

이렇게 호출하면 되지만, 주피터 노트북에서는 print를 붙여주지 않으면 이런식으로 나온다.

따라서 호출할때는 print( ) 와 함께

print(calendar.calendar(2021))

 

* 원하는 달 호출

calendar.prmonth(2021, 9)

 

* monthrange 를 쓸 경우에는 그 달의 시작하는 1일의 요일과, 마지막날의 날짜를 리턴해준다.

calendar.monthrange(2021, 9)

(2, 30)

에서 2는 0(월), 1(화), 2(수), 3(목), 4(금), 5(토), 6(일).. 을 각각 가지고 있으므로

수요일로 시작한다는 것을 알 수 있고,

마지막날은 30일..리턴

 

* 요일 알기

calendar.weekday(2021, 9, 4)

5가 리턴 되었으니 토요일 인것을 알 수가 있다.

 

* 그 달을 리스트형식으로 리턴

calendar.monthcalendar(2021,9)

 

위와 같이 다양하게 활용할 수 있다.

calendar 함수와 datetime 함수를 이용한다면 다양한 날짜에 관한 사항들을 활용할 수 있을 것이다.

728x90
반응형
Posted by 패치#

댓글을 달아 주세요

  1. 파이채굴러 2021.09.08 08:36 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 파이채굴러입니다.
    요기조기 구경다니다가 들어왔는데,
    포스팅 진짜 잘하시는거 같아요.👍👍
    저도 배워갑니다.
    시간되실때 제 블로그도
    한번 들려주세요.🤗🤗🤗🤗

728x90
반응형

데이터 프레임을 자주 사용하다 보면

각 셀별로 데이터의 길이를 구해서 판단을 해야 하는 경우도 발생하게 된다.

 

예를 들어 아래와 같은 전화번호 컬럼이 있다고 가정해보자.

import pandas as pd
data = [['John', 45, '010-1234-4589'],['Will', 20, '02-1234-1324'],['Ai', 13, '123']]
df = pd.DataFrame(data,columns=['Name','Age', 'Telephone'])
df

 

다양한 방법들이 존재하겠지만,

전화번호 영역에 다른 이상한 것이 끼어있다면 아래와 같이 len( ) 함수를 이용해서 간단하게 처리 할 수 있다.

 

df['Telephone'].apply(len)

len 함수를 사용하게 되면 각 row 별로 리턴해준다.

아래와 같이 조건에 맞게 설정한뒤 다시 데이터프레임으로 저장하면 쓸데없는 값을 쉽게 해결할 수 있다.

df = df[df['Telephone'].apply(len) >= 12]
df

 

간단하지만 많은 부분에서 사용할 수 있을 것라고 생각해본다.

728x90
반응형
Posted by 패치#

댓글을 달아 주세요

728x90
반응형

안녕하세요.

제목 그대로 크롤링을 하다가 보면 다양한 값들을 읽어와야 하는데요.

 

그중에 특정 텍스트나 속성 값을 불러오는 방법에 대해서 간략히 알아보도록 하겠습니다.

 

[예시]

from bs4 import BeautifulSoup

html_source = '''
    <div class="Top div class 입니다.">
        <div class="Second div class 입니다.">
            <ul class="ul 입니다.">
                <li data-sequence='12345645'>
                <a id="link" href="특정 링크">부자되기 프로젝트!!!!!</a></li>
            </ul>
        </div>
    </div>
'''

soup = BeautifulSoup(html_source, 'html.parser')

a_tag = soup.find_all('a', attrs={"href" : "특정 링크"})

# 태그 불러오기
print('Soup 내용 그대로 불러오기', a_tag)

# 태그내 텍스트 불러오기
print('텍스 내용 불러오기', a_tag[0].text)

# attribute 값 얻어오기
li_tag = soup.find_all('li')
print(li_tag) # 리스트 형태로 반환

attribute = li_tag[0].attrs #리스트의 0 번째 태그
print('attribute 값 얻어오기',attribute)
print('특정 attribute 값 얻오기', attribute['data-sequence'])

 

[결과 값]

Soup 내용 그대로 불러오기 [<a href="특정 링크" id="link">부자되기 프로젝트!!!!!</a>]
텍스 내용 불러오기 부자되기 프로젝트!!!!!
[<li data-sequence="12345645">
<a href="특정 링크" id="link">부자되기 프로젝트!!!!!</a></li>]
attribute 값 얻어오기 {'data-sequence': '12345645'}
특정 attribute 값 얻오기 12345645

soup의 find_all은 보통 리스트형태로 반환됩니다.

리스트로 감싸여 있기 때문에 인덱스를 지정하고 텍스트 불러오기나, attribute 값들을 가지고 오면 됩니다.

 

감사합니다.

728x90
반응형
Posted by 패치#

댓글을 달아 주세요

728x90
반응형

파이썬 requests 라이브러리를 이용하여 크롤링을 할때

현재 내가 검색해서 보여지는 창의 스크립트가 아닌

다른 내용의 스크립트가 리턴 될 때도 있습니다.

 

그럴때는

requests 와 함께 headers 정보의 user-agent 를 같이 넘겨주게 되면 해결 할 수 있어요.

 

아래는 구글 영화 정보 사이트의 인기차트 내용에 대해서 보는 것인데요.

헤더 정보를 넣는냐 아니냐에 따라서 정보가 달라지는 것을 볼 수 있습니다.

 

[헤더 정보를 넣었을 때]

import requests
from bs4 import BeautifulSoup

url = "https://play.google.com/store/movies/top"
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62'}

res = requests.get(url, headers=headers)

soup = BeautifulSoup(res.text, 'html.parser')

movie_list = soup.select('#fcxH9b > div.WpDbMd > c-wiz > div > c-wiz > div > div > c-wiz > c-wiz > c-wiz > div > div.ZmHEEd > div:nth-child(1) > c-wiz > div > div > div.RZEgze > div > div > div.bQVA0c > div > div > div.b8cIId.ReQCgd.Q9MA7b > a > div')
movie_list
[<div class="WsMG1c nnK0zc" title="A Quiet Place Part II">A Quiet Place Part II</div>]

 

[헤더 정보를 빼고 호출하였을때]

import requests
from bs4 import BeautifulSoup

url = "https://play.google.com/store/movies/top"
res = requests.get(url)

soup = BeautifulSoup(res.text, 'html.parser')

movie_list = soup.select('#fcxH9b > div.WpDbMd > c-wiz > div > c-wiz > div > div > c-wiz > c-wiz > c-wiz > div > div.ZmHEEd > div:nth-child(1) > c-wiz > div > div > div.RZEgze > div > div > div.bQVA0c > div > div > div.b8cIId.ReQCgd.Q9MA7b > a > div')
movie_list
[<div class="WsMG1c nnK0zc" title="F9: The Fast Saga">F9: The Fast Saga</div>,
 <div class="WsMG1c nnK0zc" title="Rick and Morty">Rick and Morty</div>,
 <div class="WsMG1c nnK0zc" title="Gotron Jerrysis Rickvangelion">Gotron Jerrysis Rickvangelion</div>]

 

헤더정보에 대해서는 아래 사이트에 들어가면 본인의 인터넷창에 대한 정보가 나옵니다.

그걸 복사해서 사용하시면 됩니다.

What's My User Agent? (whatmyuseragent.com)

 

What's My User Agent?

Your IP Address 121.53.80.255 Country Name: Korea, Republic of City Name: Latitude: 37.5112 Longitude: 126.9741

whatmyuseragent.com

728x90
반응형
Posted by 패치#

댓글을 달아 주세요

728x90
반응형

어떤 프로그램을 사용하다가 보면

특정 시간대에 실행하는 경우가 많이 있습니다.

 

windows의 스케쥴링을 이용한다거나 cron을 이용해서 할수도 있지만,

파이썬에서는 간단한 스케쥴 라이브러리가 있습니다.

 

우선 아래와 같이 설치를 하고

pip install schedule

[참고자료]

GitHub - dbader/schedule: Python job scheduling for humans.

 

GitHub - dbader/schedule: Python job scheduling for humans.

Python job scheduling for humans. Contribute to dbader/schedule development by creating an account on GitHub.

github.com

 

라이브러리에 설명된 몇 가지 예시

import schedule
import time
import datetime

def job(message='stuff'):
    print(datetime.datetime.now())
    print("I'm working...")

schedule.every(3).seconds.do(job) # 3초 마다 실행
# schedule.every(10).minutes.do(job) # 10분 마다 실행
# schedule.every().hour.do(job) # 매시간마다 실행
# schedule.every().day.at("10:30").do(job) # 매일 10:30에 실행
# schedule.every(5).to(10).minutes.do(job) # 05:10분에 실행
# schedule.every().monday.do(job) # 월요일마다 실행
# schedule.every().wednesday.at("13:15").do(job) # 수요일마다 13:15에 실행
# schedule.every().minute.at(":17").do(job) # 매시간 17분마다 실행
# schedule.every().hour.do(job, message='things') # 매시간마다 변수와 함께 실행(default는 'stuff')

while True:
    schedule.run_pending()
    time.sleep(1)

※ 3초 마다 실행 확인

이외에도 다양한 예제 파일이 아래 사이트에 있으니 필요한 옵션들을 골라서 사용하면 되구요.

그중 몇 가지 대표적인 기능들을 아래에 적어놨으니

다양하게 조합하셔서 사용하시면 좋을 것 같네요.

schedule/examples.rst at master · dbader/schedule · GitHub

 

GitHub - dbader/schedule: Python job scheduling for humans.

Python job scheduling for humans. Contribute to dbader/schedule development by creating an account on GitHub.

github.com

Run a job every x minute

import schedule
import time

def job():
    print("I'm working...")

# Run job every 3 second/minute/hour/day/week,
# Starting 3 second/minute/hour/day/week from now
schedule.every(3).seconds.do(job)
schedule.every(3).minutes.do(job)
schedule.every(3).hours.do(job)
schedule.every(3).days.do(job)
schedule.every(3).weeks.do(job)

# Run job every minute at the 23rd second
schedule.every().minute.at(":23").do(job)

# Run job every hour at the 42rd minute
schedule.every().hour.at(":42").do(job)

# Run jobs every 5th hour, 20 minutes and 30 seconds in.
# If current time is 02:00, first execution is at 06:20:30
schedule.every(5).hours.at("20:30").do(job)

# Run job every day at specific HH:MM and next HH:MM:SS
schedule.every().day.at("10:30").do(job)
schedule.every().day.at("10:30:42").do(job)

# Run job on a specific day of the week
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)
schedule.every().minute.at(":17").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)

 

Cancel a job

To remove a job from the scheduler, use the schedule.cancel_job(job) method

import schedule

def some_task():
    print('Hello world')

job = schedule.every().day.at('22:30').do(some_task)
schedule.cancel_job(job)

 

 

감사합니다.

728x90
반응형
Posted by 패치#

댓글을 달아 주세요

2021. 6. 28. 19:47

(1292): Truncated incorrect DOUBLE value Programming/Python2021. 6. 28. 19:47

728x90
반응형
sql_80040 = "SELECT * FROM `{}{}{}_80040` WHERE stock_code='{}'".format(dt_y, dt_m, dt_d, stock_code)

위의 코드에서 종목 코드를 mysql에서 제대로 읽어오지 않았던 문제를...

정말 단순했지만 신경을 쓰지 않았던 문제를...

 

mysql에서 데이터를 읽어 올때. where 구문에서 integer 형태로 들어가는

stock_code={ } 부분의 코드를 stock_code = '{ }' 로 바꾸어서 해결..

 

역시 기본에 충실해야 하는 거다...ㅠ.ㅠ

728x90
반응형
Posted by 패치#

댓글을 달아 주세요

728x90
반응형

어떤 게시판을 크롤링하고 싶어서

selenium 으로 작업하던 도중 pyautogui 를 이용하여 글 제목을 크롤링해서 붙여넣기를 하는데

계속 오류가 발생했었다.

 

그 원인은..... 한글 입력이 되지 않았던것..

그래서 그 해결책을 조금 찾아봤다.

 

우선 

pip install pyperclip

이놈을 인스톨하고 나서.

 

import pyperclip

file_name = '한글 제목'
pyperclip.copy(file_name)
pyautogui.hotkey('ctrl', 'v')

이런식으로 작업을 하면 원하는 곳에 한글을 자동으로 입력할 수 있게 된다.

클립보드로 복사 후 다시 붙여 넣는 방식이라고 생각하면 된다.

 

또한.. 크롤링 시 웹페이지를 자동으로 저장할 때는 특수문자

? < > | : * / \ 등의 특수문자가 들어가게 되면 오류가 발생하게 된다.

이것 또한 해결을 해 주는 것이 좋다.

 

[특수문자 없애기-1]

# 특수문자 없애기-1
characters = "/'!?|*<>:\\"
str_title = "안녕하세요_!@##$%%^^|/'!?|*<>:\\: Goodmorning"
new_title = ''.join(x for x in str_title if x not in characters)
print(new_title)

#출력
안녕하세요_@##$%%^^ Goodmorning

이런식으로 그냥 없애는 방식으로 진행했다.

replace, 정규식의 sub 등이 있는데 번거롭기만 한듯.

위의 방식이 나에게는 가장 간단한 방식이라고 생각한다.

 

[특수문자없애기-2]

# 특수문자 없애기-2
import re

str_title = "안녕하세요_!@##$%%^^|/'!?|*<>:\\: Goodmorning"
new_title = re.sub('[^a-zA-Z0-9ㄱ-힣]', '_', str_title)
print(new_title)

#출력
안녕하세요_______________________Goodmorning

정규식도 이용해서 작업을 해봤다.

1번 방법도 괜찮지만 for문도 돌리고, 혹시나 글 이외의 특수문자들로 인해서 다른 오류가 나면 안되니깐..

2번째 방법은 특수문자나 중간 띄워쓰기 부분은 '_' underscore 로 모두 변환

728x90
반응형
Posted by 패치#

댓글을 달아 주세요

2021. 6. 10. 13:09

Range 함수 역순 Programming/Python2021. 6. 10. 13:09

728x90
반응형

for문에서 range 를 이용할 때 가끔은 리버스로 순서가 돌아가는 것이 필요할 때가 있다.

 

for i in range(10, 0, -1):
    print(f"카운트 다운!!! {i}")

위와 같이 입력면 역순으로 수를 전달할 수 있다.

여기서 주의할 점은 10이 스타트.. 10부터 시작

0 앞에 까지 가서 멈춘다는 것 즉.. 1까지만 전달이 된다는 것을 염두에 두고 있어야 한다.

# 결과
카운트 다운!!! 10
카운트 다운!!! 9
카운트 다운!!! 8
카운트 다운!!! 7
카운트 다운!!! 6
카운트 다운!!! 5
카운트 다운!!! 4
카운트 다운!!! 3
카운트 다운!!! 2
카운트 다운!!! 1

 

Built-in Types — Python 3.9.5 documentation

 

Built-in Types — Python 3.9.5 documentation

The following sections describe the standard types that are built into the interpreter. The principal built-in types are numerics, sequences, mappings, classes, instances and exceptions. Some collection classes are mutable. The methods that add, subtract,

docs.python.org

Ranges

The range type represents an immutable sequence of numbers and is commonly used for looping a specific number of times in for loops.

class range(stop)class range(start, stop[, step])

The arguments to the range constructor must be integers (either built-in int or any object that implements the __index__ special method). If the step argument is omitted, it defaults to 1. If the start argument is omitted, it defaults to 0. If step is zero, ValueError is raised.

For a positive step, the contents of a range r are determined by the formula r[i] = start + step*i where i >= 0 and r[i] < stop.

For a negative step, the contents of the range are still determined by the formula r[i] = start + step*i, but the constraints are i >= 0 and r[i] > stop.

A range object will be empty if r[0] does not meet the value constraint. Ranges do support negative indices, but these are interpreted as indexing from the end of the sequence determined by the positive indices.

Ranges containing absolute values larger than sys.maxsize are permitted but some features (such as len()) may raise OverflowError.

Range examples:

>>>>>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list(range(1, 11)) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> list(range(0, 30, 5)) [0, 5, 10, 15, 20, 25] >>> list(range(0, 10, 3)) [0, 3, 6, 9] >>> list(range(0, -10, -1)) [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] >>> list(range(0)) [] >>> list(range(1, 0)) []

Ranges implement all of the common sequence operations except concatenation and repetition (due to the fact that range objects can only represent sequences that follow a strict pattern and repetition and concatenation will usually violate that pattern).

start

The value of the start parameter (or 0 if the parameter was not supplied)

stop

The value of the stop parameter

step

The value of the step parameter (or 1 if the parameter was not supplied)

The advantage of the range type over a regular list or tuple is that a range object will always take the same (small) amount of memory, no matter the size of the range it represents (as it only stores the start, stop and step values, calculating individual items and subranges as needed).

Range objects implement the collections.abc.Sequence ABC, and provide features such as containment tests, element index lookup, slicing and support for negative indices (see Sequence Types — list, tuple, range):

>>>>>> r = range(0, 20, 2) >>> r range(0, 20, 2) >>> 11 in r False >>> 10 in r True >>> r.index(10) 5 >>> r[5] 10 >>> r[:5] range(0, 10, 2) >>> r[-1] 18

Testing range objects for equality with == and != compares them as sequences. That is, two range objects are considered equal if they represent the same sequence of values. (Note that two range objects that compare equal might have different start, stop and step attributes, for example range(0) == range(2, 1, 3) or range(0, 3, 2) == range(0, 4, 2).)

Changed in version 3.2: Implement the Sequence ABC. Support slicing and negative indices. Test int objects for membership in constant time instead of iterating through all items.

Changed in version 3.3: Define ‘==’ and ‘!=’ to compare range objects based on the sequence of values they define (instead of comparing based on object identity).

New in version 3.3: The start, stop and step attributes.

See also

  • The linspace recipe shows how to implement a lazy version of range suitable for floating point applications.
728x90
반응형
Posted by 패치#

댓글을 달아 주세요

2021. 5. 8. 23:08

tensorflow 깔아보기 Programming/Python2021. 5. 8. 23:08

728x90
반응형

Python 가상 환경은 패키지 설치를 시스템으로부터 분리하는 데 사용됩니다.

Ubuntu/macOSWindowsConda

Python 인터프리터를 선택하고 저장할 .\venv 디렉터리를 만들어 새로운 가상 환경을 만듭니다.

 

python -m venv --system-site-packages .\venv

가상 환경을 활성화합니다.

 

.\venv\Scripts\activate

호스트 시스템 설정에 영향을 주지 않고 가상 환경 내에 패키지를 설치합니다. pip 업그레이드로 시작합니다.

 

pip install --upgrade pip

pip list  # show packages installed within the virtual environment

가상 환경을 나중에 종료하려면 다음 단계를 따르세요.

 

deactivate  # don't exit until you're done using TensorFlow

728x90
반응형
Posted by 패치#

댓글을 달아 주세요

728x90
반응형

 

변경전

 

변경후

기존에 프로그래밍을 배울 때 변수명을 한글로 배워서 하다보니..

대부분의 한글 변수명이었는데..

차트 그리기 부분에 Area Chart 부분.. y axis 0 을 기준으로 색이 원래 칠해져야 하지만(변경후).

안되었던 부분(변경전)이..

Series 에 보내는 부분의 변수명을 영문으로 바꾸고 나서.. 되었다... 이게 말이되!???

음.. 다른걸 건드렸나?

 

여튼.. 중요한 것은 여러분!

변수명은 한글이 아닌 영문으로!!! 예상하지 못한 에러가 날 수도 있으니 영문으로 추천 드립니다!!!!

 

 

728x90
반응형

'Programming > C#' 카테고리의 다른 글

C# Datetime  (0) 2021.01.24
Posted by 패치#

댓글을 달아 주세요

728x90
반응형

이전글에서는 decreasing 에 대해서 알아보았구요.

이번에는 순서상 중요한 것이 hoverinfo 가 있겠네요. 한번 알아보도록 하겠습니다.

 

[링크]

https://plotly.com/python-api-reference/generated/plotly.graph_objects.layout.template.data.html 

 

property high 

Sets the high values. 

The ‘high property is an array that may be specified as a tuple, list, numpy array, or pandas Series 

Returns 

Return type 

numpy.ndarray 

# high는 고가, 기본적인 데이터라고 보면 됩니다. 이거와 기본적으로 들어가는 것들이 open(시가), close(종가), low(저가)

 

property highsrc 

Sets the source reference on Chart Studio Cloud for high . 

The ‘highsrc property must be specified as a string or as a plotly.grid_objs.Column object 

Returns 

Return type 

str 

# 이 파라미터 또한 chart studio 에서 쓰는 옵션 인 것 같네요.

 

property hoverinfo 

Determines which trace information appear on hover. If none or skip are set, no information is displayed upon hovering. But, if none is set, click and hover events are still fired. 

The ‘hoverinfo property is a flaglist and may be specified as a string containing: 

  • Any combination of [‘x’, ‘y’, ‘z’, ‘text’, ‘name’] joined with ‘+’ characters (e.g. ‘x+y’) OR exactly one of [‘all’, ‘none’, ‘skip’] (e.g. ‘skip’) 
  • A list or array of the above 

Returns 

Return type 

Any|numpy.ndarray 

# 이 옵션은 차트를 그려놓은 상태에서 캔들에 마우스를 올리게 되면 띄워지는 옵션이라고 보면됩니다.

# 기본적인 셋팅은 아래와 같습니다.

# 마우수를 가져가면 캔들 위로 x 축 레이블, open, close, high, low 값이 뜨게 됩니다.

import plotly.graph_objects as go

fig = go.Figure(data=[go.Candlestick(x=[1, 2, 3, 4, 5],
                open  = [ 1, 6, 7, 10, 5 ],
                close = [ 2, 10, 3, 12, 8  ],
                high  = [ 10, 12, 8, 15, 18 ],
                low   = [ 0.1, 5, 2, 8, 5 ],                                                                               
                )])

fig.show()

 

# 설명에 있는 대로 옵션을 조금씩 바꿔 보도록 하겠습니다.

hoverinfo = 'x'

 

hoverinfo = 'y'

hoverinfo = 'z'

# z 값은 3차원 그래프에서 적용되는 듯 한데요. 적용을 해도 아무 표시도 뜨지 않네요.

hoverinfo = 'text'

# 이 옵션은 text 값을 별도로 넣어주어야 합니다.

import plotly.graph_objects as go

fig = go.Figure(data=[go.Candlestick(x=[1, 2, 3, 4, 5],
                open  = [ 1, 6, 7, 10, 5 ],
                close = [ 2, 10, 3, 12, 8  ],
                high  = [ 10, 12, 8, 15, 18 ],
                low   = [ 0.1, 5, 2, 8, 5 ],     
                text = '캔들차트',
                hoverinfo = 'text'
                )])

fig.show()

# 여기서 text 파라미터에 대해서 함께 살펴보면 text 에는 list 형태로도 올수 있다고 합니다.

# 리스트에 각각의 값을 넣어주면 캔들마다 표시가 됩니다. 다시 말해 위와 같이 text='캔들차트' 하나만 넣게 되면 모든 캔들에 '캔들차트'라고 뜨지만 아래와 같이 리스트로 정해주면 정해준 숫자만큼 앞에서 부터 지정이 됩니다.

# 뒤쪽에 지정안된 캔들은 표시가 안됨.

 

property text 

Sets hover text elements associated with each sample point. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to this trace’s sample points. 

The ‘text property is a string and must be specified as: 

  • A string 
  • A number that will be converted to a string 
  • A tuple, list, or one-dimensional numpy array of the above 

Returns 

Return type 

str|numpy.ndarray 

text = ['캔들1', '캔들2']

 

# name 옵션은 범례를 표시한다고 생각하시면 됩니다. 이것 또한 모든 캔들위에 저것만 표시가 됩니다.

name = '주식회사',
hoverinfo = 'name'

property name 

Sets the trace name. The trace name appear as the legend item and on hover. 

The ‘name property is a string and must be specified as: 

  • A string 
  • A number that will be converted to a string 

Returns 

Return type 

str 

 

# 조합을 통해서도 나타낼 수 있습니다.

hoverinfo = 'x+y'

# 초기 셋팅이랑 동일합니다.

# 하나만 더 해보자면

text = ['캔들1', '캔들2', '캔들3', '캔들4', '캔들5'],
hoverinfo = 'x+text'

# 이런식으로도 조합이 가능합니다.

# x+y, y+text, x+name 등등 필요 용도에 따라 조합해서 사용하시면 될듯합니다.

 

# 그리고 all, none, skip 이 있습니다. none과 skip 은 어떠한 정보도 표시하지 않습니다.

# all은 아래와 같이 모든 정보가 표시됩니다.

name = '주식회사',
text = ['캔들1', '캔들2', '캔들3', '캔들4', '캔들5'],
hoverinfo = 'all'

# 이렇게 하나씩 살펴보니 참 다양한 옵션들이 있네요. 정작 주식을 잘하기 위해서 이게 무슨 쓸모가 있을지는 모르겠지만..^^;; 오늘도 이렇게 하나씩 공부를 해나간다는 생각으로 앞으로 나아가겠습니다.


[이전글]

2021/02/17 - [Programming/Python] - plotly-01 #Candlestick Charts 살펴보기

2021/02/19 - [Programming/Python] - plotly-02 #Candlestick Parameters 살펴보기1-decreasing

728x90
반응형
Posted by 패치#

댓글을 달아 주세요

728x90
반응형

 

[Candlestick Documentation]

plotly.github.io/plotly.py-docs/generated/plotly.graph_objects.Candlestick.html

 

# 상기 주소로 가서 Candlestick class 의 parameter 을 살펴보면 다양한 종류가 있습니다.

 

# 이전 살펴보기에서 어떤식으로 간략히 그릴수 있는지 살펴봤었고, x, close, high, open, low 값을 통해 그릴 수 있었습니다.

# 이외에도 다양하게 있는데 하나씩 살펴볼려고 합니다.

* 찾아봐도 모르겠는건 과감히~~^^ pass~~^^;;;;;;;;;;;; 누가 좀 알려주세용~^^

 

* close – Sets the close values.

# 종가 가격

 

* closesrc – Sets the source reference on Chart Studio Cloud for close .

# Chart Studio Cloud 에서 어떤 셋팅을 하는 것 같다. 주피터에서는 별다른 작동을 안함.

 

* customdata – Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, “scatter” traces also appends customdata items in the markers DOM elements

# unknown function ^^;;

 

* decreasing – plotly.graph_objects.candlestick.Decreasing instance or dict with compatible properties 

* class plotly.graph_objects.candlestick.Decreasing(arg=None, fillcolor=None, line=None, **kwargs)

plotly.graph_objects.candlestick package — 4.14.3 documentation

# decreasing 은 캔들에서 떨어가지는 캔들에 대한 fillcolor 와 line 에 대한 정의를 할 수 있습니다.

 

Bases: plotly.basedatatypes.BaseTraceHierarchyTypeproperty fillcolor

Sets the fill color. Defaults to a half-transparent variant of the line color, marker color, or marker line color, whichever is available.

The ‘fillcolor’ property is a color and may be specified as:

  • A hex string (e.g. ‘#ff0000’)
  • An rgb/rgba string (e.g. ‘rgb(255,0,0)’)
  • An hsl/hsla string (e.g. ‘hsl(0,100%,50%)’)
  • An hsv/hsva string (e.g. ‘hsv(0,100%,100%)’)
  • A named CSS color:aliceblue, antiquewhite, aqua, aquamarine, azure, beige, bisque, black, blanchedalmond, blue, blueviolet, brown, burlywood, cadetblue, chartreuse, chocolate, coral, cornflowerblue, cornsilk, crimson, cyan, darkblue, darkcyan, darkgoldenrod, darkgray, darkgrey, darkgreen, darkkhaki, darkmagenta, darkolivegreen, darkorange, darkorchid, darkred, darksalmon, darkseagreen, darkslateblue, darkslategray, darkslategrey, darkturquoise, darkviolet, deeppink, deepskyblue, dimgray, dimgrey, dodgerblue, firebrick, floralwhite, forestgreen, fuchsia, gainsboro, ghostwhite, gold, goldenrod, gray, grey, green, greenyellow, honeydew, hotpink, indianred, indigo, ivory, khaki, lavender, lavenderblush, lawngreen, lemonchiffon, lightblue, lightcoral, lightcyan, lightgoldenrodyellow, lightgray, lightgrey, lightgreen, lightpink, lightsalmon, lightseagreen, lightskyblue, lightslategray, lightslategrey, lightsteelblue, lightyellow, lime, limegreen, linen, magenta, maroon, mediumaquamarine, mediumblue, mediumorchid, mediumpurple, mediumseagreen, mediumslateblue, mediumspringgreen, mediumturquoise, mediumvioletred, midnightblue, mintcream, mistyrose, moccasin, navajowhite, navy, oldlace, olive, olivedrab, orange, orangered, orchid, palegoldenrod, palegreen, paleturquoise, palevioletred, papayawhip, peachpuff, peru, pink, plum, powderblue, purple, red, rosybrown, royalblue, rebeccapurple, saddlebrown, salmon, sandybrown, seagreen, seashell, sienna, silver, skyblue, slateblue, slategray, slategrey, snow, springgreen, steelblue, tan, teal, thistle, tomato, turquoise, violet, wheat, white, whitesmoke, yellow, yellowgreen

ReturnsReturn type

str

property line

The ‘line’ property is an instance of Line that may be specified as:

  • An instance of plotly.graph_objects.candlestick.decreasing.Line
  • A dict of string/value properties that will be passed to the Line constructorcolorwidth
  • Sets the width (in px) of line bounding the box(es).
  • Sets the color of line bounding the box(es).
  • Supported dict properties:

ReturnsReturn type

plotly.graph_objects.candlestick.decreasing.Line

 

# 우선 여기서 비교를 위해서 아래와 같이 주피터 노트북으로 간단한 캔들차트를 그려보았습니다.

import plotly.graph_objects as go

fig = go.Figure(data=[go.Candlestick(x=[1, 2, 3, 4, 5],
                open  = [ 1, 6, 7, 10, 5 ],
                close = [ 2, 10, 3, 12, 8  ],
                high  = [ 10, 12, 8, 15, 18 ],
                low   = [ 0.1, 5, 2, 8, 5 ],                                                                                                   
                )])

fig.show()

기본 차트

 

# decreasing 적용을 위해서는 아래와 같이 dict 형태로 묶어서 전달하는 해주면 됩니다.

import plotly.graph_objects as go

fig = go.Figure(data=[go.Candlestick(x=[1, 2, 3, 4, 5],
                open  = [ 1, 6, 7, 10, 5 ],
                close = [ 2, 10, 3, 12, 8  ],
                high  = [ 10, 12, 8, 15, 18 ],
                low   = [ 0.1, 5, 2, 8, 5 ],                                                               
                decreasing = dict(fillcolor='blue')                                                     
                )])

fig.show()

# decreasing 의 fillcolor 는 위의 설명에서 보듯, rgd 코드, css 타입등등으로 넣을 수 있습니다. 전, 익숙한 blue 로 색을 채워보았습니다.

 

# 선이 아직도 빨간색이라서 선도 파란색으로 넣어 보겠습니다.

# 선 또한 rgb, hex 등등으로 색을 변경할 수 있습니다.

import plotly.graph_objects as go

fig = go.Figure(data=[go.Candlestick(x=[1, 2, 3, 4, 5],
                open  = [ 1, 6, 7, 10, 5 ],
                close = [ 2, 10, 3, 12, 8  ],
                high  = [ 10, 12, 8, 15, 18 ],
                low   = [ 0.1, 5, 2, 8, 5 ],                                                               
                decreasing = dict(fillcolor='blue', line=dict(color='blue'))                                                     
                )])

fig.show()

# 선의 굵기도 조정할 수 있습니다.

line=dict(color='blue', width=5)

# 5정도로 하면 아래와 같습니다.

# 여기서 alpha 값을 줘서 파란색을 배경이 보이는 형태로 만들고 싶으면. rgba 를 사용하면됩니다.

# rgb 표 색상은 구글에 검색하시면 엄청 잘 나와있어요~^^

fillcolor='rgba(0,0,255,0.5)'

# rgba(red, green, blue, alpha) 값을 나타냅니다. alpha 를 0.5 정도로 적용하면 아래와 같습니다.

# alpha 값은 0.0 (투명) ~ 1.0 (불투명) 으로 보시면 됩니다.

 


[이전글]

2021/02/16 - [Programming/Python] - plotly-00 #시작

2021/02/17 - [Programming/Python] - plotly-01 #Candlestick Charts 살펴보기

728x90
반응형
Posted by 패치#

댓글을 달아 주세요

728x90
반응형

# 시작에 이어서 우리에게 필요한(?) 캔들 차트 그리기를 알아보도록 하겠습니다.

 

# 오늘도 스스로를 위한 공부시작!!!!

 

# 오늘도 소스는 plotly 공식 사이트를 참고해 보았습니다.


[참고 사이트]

plotly.com/python/candlestick-charts/

 

# 주식 정보들을 다루다 보면 필연적으로 pandas 와 많이 부딪치게 되는 것 같습니다. pandas 에 정보를 담아서 주가를 그려보도록 하겠습니다.

# 주가 데이터셋 또한 plotly 에서 제공해주기 때문에 연습할 때 용이합니다.

# 전체코드
import plotly.graph_objects as go

import pandas as pd
from datetime import datetime

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')

fig = go.Figure(data=[go.Candlestick(x=df['Date'],
                open=df['AAPL.Open'],
                high=df['AAPL.High'],
                low=df['AAPL.Low'],
                close=df['AAPL.Close'])])

fig.show()

차트 예시

# 실행해보면 밑에 컨트롤바와 함께 이쁜 차트가 자동으로 완성됩니다.

# 마수를 캔들위에 놓으면 캔들의 시가, 고가, 종가, 저가를 알수가 있고, 아래의 컨트롤바를 움직이면 확대하거나 해서 원하는 시간대로 이동할수도 있습니다.


 

[코드 살펴보기]

 

import plotly.graph_objects as go

# import 를 해주는 것이고, as 는 보통 go 로 통상적으로 많이 사용하고 있습니다.

import pandas as pd

# pandas 도 import

# 만약 설치가 안되어있다면 jupyter notebook 에서 아래와 같이 설치하여 실행하시기 바랍니다.

!pip install pandas
from datetime import datetime

# datetime 은 왜 import 했는지 모르겠네요~^^ 사이트에서 제공하는 코드소스인데도.. 뭔가 쓸데 없는 것이..~^^;;;;

# 사용을 하지 않으므로 주석처리 또는 삭제 처리 해주셔도 되네요.

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')

# dataframe 형태로 사이트에서 제공해주는 데이터셋을 불러와 정보를 담습니다.

fig = go.Figure(data=[go.Candlestick(x=df['Date'],
                open=df['AAPL.Open'],
                high=df['AAPL.High'],
                low=df['AAPL.Low'],
                close=df['AAPL.Close'])])

# 정보를 불어모녀 x축과 y축에 각각 정보를 줘야 합니다. fig에 위와 같이 x 축에는 날짜 항목을 불러오고, y축에는 open(시가), high(고가), low(저가), close(종가) 불러 옵니다. 여기서는 애플의 주가를 불러왔나보네요.

fig.show()

# 마지막으로 정보 불러온것을 보여줍니다.

# mpl_finance 를 이용해서 candlestick 을 그리시는 분들도 있지만. 저는 plotly 가 더 저한테는 맞는것 같더라구요. ^^

 

# 다음에도 plotly 사이트에 있는 문서들을 좀 더 살펴보고 하나씩 하나씩 공부해 나가도록 하겠습니다.


[이전글]

2021/02/16 - [Programming/Python] - plotly-00 #시작

728x90
반응형
Posted by 패치#

댓글을 달아 주세요

2021. 2. 16. 09:52

파이썬 차트, plotly-00 #시작 Programming/Python2021. 2. 16. 09:52

728x90
반응형

# 파이썬으로 주식 데이터를 분석하다면 그래프를 무조건 사용하게 되어 있다.

나는 초창기에 기본적인 matplotlib을 가지고 시도했었으나 plotly 를 알고 나서부터는 이것만 사용하게 되었다.

 

# 가장 큰 차이점은 matplotlib 의 경우 주가 데이터를 그리더라도 활용도가 plotly 보다 훨~~~~씬 뒤처지는 개인적인 느낌이 있어서 plotly만 사용하고 있는 중이다.

 추후에 더 좋은 것이 나온다면..... 음...~ move move~~

 

# 오늘은 시작하는 느낌으로 기초부터 시작하고

점점 내가 활용하고 있는 단계까지 작성을 해볼려고 한다.

 

# 나를 위한 공부 start!!!!

 

[설치]

pip install plotly

만약 주피터 노트북을 사용한다면

!pip install plotly

 

[공식 사이트]

plotly.com/

 

Plotly: The front end for ML and data science models

Plotly creates & stewards the leading data viz & UI tools for ML, data science, engineering, and the sciences. Language support for Python, R, Julia, and JavaScript.

plotly.com

# 대부분 Jupyter notebook을 활용해서 그래프를 그리고 있으므로 Jupyter notebook 위주로 설명

 

plotly.com/python/getting-started/

[그래프 그려보기]

import plotly.graph_objects as go
fig = go.Figure(data=go.Bar(y=[2, 3, 1]))
fig.show()

 

Jupyter notebook 구현

# matplotlib은 이미지를 화면에 찍어내지만, plotly 는 위와 같이 쉽게 active 하게 그릴 수 있다.

728x90
반응형
Posted by 패치#

댓글을 달아 주세요

2021. 1. 24. 18:02

C# Datetime Programming/C#2021. 1. 24. 18:02

728x90
반응형

https://thedeveloperblog.com/datetime-performance

C# DateTime Performance Class

Home | Contact Us CSharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript C# DateTime Performance Class This C# performance class optimizes accesses to the DateTime.Now method. DateTime performance. A program uses DateTime.Now to frequen

thedeveloperblog.com

728x90
반응형

'Programming > C#' 카테고리의 다른 글

변수, 딕셔너리 등등 변수명은 영문으로!!!!  (0) 2021.04.13
Posted by 패치#

댓글을 달아 주세요

2021. 1. 19. 18:43

KRX 회원사별 어디갔니? Programming/Python2021. 1. 19. 18:43

728x90
반응형

매일 저녁 돌리던 KRX 크롤링...ㅠ.ㅠ 홈페이지가 개편이 되면서 원래 자료를 취합해오던 회원사별 메뉴가 없어졌다.

어디로 간거냐..

 

한참을 뒤지던중...

[출처] KRX 홈페이지

 

이젠 데이터상품으로 데이터 장사를...........

내가 주식시장에 가져다준 돈이 얼마인데...ㅠ.ㅠ

 

이런것도..맘대로.. 못 보공. 흥.칫.뿡

728x90
반응형
Posted by 패치#

댓글을 달아 주세요

728x90
반응형

패스트캠퍼스

[파이썬을 활용한 데이터 전처리 Level UP]

챌린지 참여 후기

 

마지막 실전 프로젝트를 정리하기전 이번 챌린지 이벤트 참여에 대한 소회..

 

나에게 아직은 데이터분석은 생소한 분야임에는 틀림이 없다. 하지만 한단계 레벨업을 하기 위해서는 반드시 필요하다가 나 스스로가 깨닫고 있다.

수 많은 용어들과 통계학, 라이브러리 등 적응이 잘 안 되고 있지만 반복적인 학습을 통해서 매일매일 해나가도 보면 언젠가는 도달 할 수 있지 않을까?

아직도 늦었다고 생각하는가?

오늘도 한 걸음만 더 나아가보자!!!

할 수 있다!!!!!

해야만 한다!!!!!


 

01. Ch 23. 진짜 문제를 해결해 보자 (1) - 상점 신용카드 매출 예측 - 01. (1) 문제 소개

* 대회 소개

- 출처 : 삼성 신용카드 매출 예측 경진대회

 . 문제 제공자 : FUNDA (데이콘)

 . 소상공인 가맹점 신용카드 빅데이터와 AI로 매출 예측 분석 

dacon.io/competitions/official/140472/overview/

 

상점 신용카드 매출 예측 경진대회

출처 : DACON - Data Science Competition

dacon.io

// 하나의 레코드가 하나로 대응 되는 거라고 생각하면 된다.

 

02. Ch 23. 진짜 문제를 해결해 보자 (1) - 상점 신용카드 매출 예측 - 02-1. (2) 학습 데이터 구축 (이론)

* 기본 데이터 구조 설계

 - 레코드가 수집된 시간 기준으로 3개월 이후의 총 매출을 예측하도록 구조를 설계해야 한다.

 - 시점은 월단위로 정의

 

* 시점변수 생성

// 시점 변수 생성이 필요하다.

 - 시점 변수 생성 : 시점 (t) = (연도 - 2016 ) * 12 + 월

 

* 변주 변수 탐색

// 부적절하다고 하는 것은 데이터 기반이 아니라고 생각하면 된다.

// 범주형 변수로 상태 공간이 매우 커서, 더미화하기에는 부적절하다고 판단했다.

// 결측은 제거하지 않고 없음이라고 변환한다.

 

* 학습 데이터 구조 작성

// 정리되지 않은 데이터를 바탕으로 학습 데이터를 생성해야 하는 경우에는 레코드의 단위를 고려하여 학습 데이터의 구조를 먼저 작성하는 것이 바람직하다.

// 중복을 제거

 

* 평균 할부율 부착

// 할부를 많이 하는 그룹이 있을 것 같아서 groupby 를 이용해서 생성 replace 를 이용해서 다시 만들었고

 

* 기존 데이터에 부착 테크닉

// concat, merge 를 이용하면 일반적인 것은 붙일 수 있는데

// 다른 데이터에서 붙여야 하므로 case1 t가 유니크한 경우, 각 데이터를 정렬 후, 한 데이터에 대해 shift 를 사용

// case 2. t 가 유니크하지 않은 경우, t_1 변수를 생성

 

* 기존 데이터 부착 테크닉 Case 1

// shift 를 이용해서 concat 수행

// df2.shift(1)

// 시계열 예측에서 많이 쓰이는 패턴이다.

 

* 기존 데이터 부착 테크닉 Case 2

// 새로운 컬럼은 생성하서 merge를 수행한다.

 

* 기존 매출 합계 부착

 

* 기존 지역별 매출 합계 부착

 

* 라벨 부착하기

// 라벨의 경우에는 어떤 시점 t 에 상점 id 별로 붙이고 1 2 3 에 대해서 더 해준다.

 

03. Ch 23. 진짜 문제를 해결해 보자 (1) - 상점 신용카드 매출 예측 - 02-2. (2) 학습 데이터 구축 (실습)

 

// region 에 결측이 있지만 대체를 하기에는 힘들고 제거를 하기에는 힘들다. 그래서 없음으로 표시

// 변수 목록 탐색을 통해서 상점 ID 가 일치 하는지 탐색을 해야 한다.

 

* 학습 데이터 구축

// 일자에서 연, 월, 일을 구분 해야 하므로 split 을 사용해서 구분

// 데이터 병합을 위한 새로운 컬럼 생성 및 기존 시간 변수를 삭제한다.

 

* 불필요한 변수 제거

// card_id, card_company는 특징으로 사용하기에는 너무 세분화 될수 있어서, 특징으로 유요할 가능성이 없다고 삭제.

// 주관적인 판단으로 처리한 것이다.

 

* 업종 특성, 지역, 할부 평균 탐색

// 대부분이 일시불이므로, installment_term 변수를 할부인지 아닌지 여부로 변환해야 한다.

// astype(int) 로 해서 할부는 0 , 할부하지 않은 것은 1로 나타난다.

 

// 상점별 평균 할부 비율

// .mean( ) 함수를 통해서 각 평균을 구해서 store_id 를 본다.

 

// 지역은 region 제거를 할수 없기 때문에 없음으로 대체 '없음'

// 업종도 비슷하다.

 

// 피벗 테이블을 생성하고 결측을 바로 앞 값으로 채울 수 있다.

// 값이 없는 경우는 결측으로 출력이 나옴.

// ffill 바로 앞 값과 bfill 그 다음은 바로 뒤값으로 채워준다.

 

// 변수 실수를 줄여야 한다.

// 모델 학습을 적용하기 위한 일반적인 전처리에 대한 준비를 했다.

 

04. Ch 23. 진짜 문제를 해결해 보자 (1) - 상점 신용카드 매출 예측 - 03. (3) 학습 데이터 탐색 및 전처리

* 학습 데이터 기초 탐색 및 전처리

 - 특징과 라벨 분리

// 필요없는 라벨들은 drop 으로 제거 해준다. axis = 1

 

 - 학습데이터와 평가 데이터로 데이터 분할

// 특징 대비 샘플이 많다는 것을 알 수 있다. 37673

// 회귀 문제 예측 문제라고 예상하면 된다.

 

 - 이상치 제거

// IQR rule 을 위배하지 않는 bool list 계산 (True : 이상치 없음, False : 이상치 있음)

// Y_condition 이상치가 아닌 값들로 구성된것

 

 - 치우침 제거

// 모두 좌로 치우침을 확인 할수가 있다.

// 왜도의 절대값이 1.5이상인 컬럼만 가져왔다.

// Train_X.skew().abs() > 1.5

 

// 스케일링 수행

sklearn.preprocessing MinMaxScaler 수행

 

// 원래는 데이터 프레임을 정의하는 것이 좋기는 한데 메모리 문제로 처음부터 정의하지 않음

// 아무리 꼼꼼하더라도 모든 변수를 제거 할 필요는 없다.

 

// abs( ) Documentation

docs.python.org/3/library/functions.html#abs

abs(x)

Return the absolute value of a number. The argument may be an integer, a floating point number, or an object implementing __abs__(). If the argument is a complex number, its magnitude is returned.

 

3. Data model — Python 3.9.1rc1 documentation

A class can implement certain operations that are invoked by special syntax (such as arithmetic operations or subscripting and slicing) by defining methods with special names. This is Python’s approach to operator overloading, allowing classes to define

docs.python.org

object.__abs__(self)

 

 

05. Ch 23. 진짜 문제를 해결해 보자 (1) - 상점 신용카드 매출 예측 - 04. (4) 모델 학습

// 모델 선택

// 샘플 대비 특징이 적고, 특징의 타입이 전부연속형으로 같다.

// kNN, RandomForestRegressor, LightGBM 고려함.

// 신경망을 쓰기에는 변수가 적기 때문에 좋은 결과를 기대하기는 어렵다.

 

// sklearn.ensemble.RandomForestRegressor Documentation

scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html

class sklearn.ensemble.RandomForestRegressor(n_estimators=100, *, criterion='mse', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, ccp_alpha=0.0, max_samples=None)

A random forest regressor.

A random forest is a meta estimator that fits a number of classifying decision trees on various sub-samples of the dataset and uses averaging to improve the predictive accuracy and control over-fitting. The sub-sample size is controlled with the max_samples parameter if bootstrap=True (default), otherwise the whole dataset is used to build each tree.

Read more in the User Guide.

 

Parameters

n_estimatorsint, default=100

The number of trees in the forest.

Changed in version 0.22: The default value of n_estimators changed from 10 to 100 in 0.22.

criterion{“mse”, “mae”}, default=”mse”

The function to measure the quality of a split. Supported criteria are “mse” for the mean squared error, which is equal to variance reduction as feature selection criterion, and “mae” for the mean absolute error.

New in version 0.18: Mean Absolute Error (MAE) criterion.

max_depthint, default=None

The maximum depth of the tree. If None, then nodes are expanded until all leaves are pure or until all leaves contain less than min_samples_split samples.

min_samples_splitint or float, default=2

The minimum number of samples required to split an internal node:

  • If int, then consider min_samples_split as the minimum number.

  • If float, then min_samples_split is a fraction and ceil(min_samples_split * n_samples) are the minimum number of samples for each split.

Changed in version 0.18: Added float values for fractions.

min_samples_leafint or float, default=1

The minimum number of samples required to be at a leaf node. A split point at any depth will only be considered if it leaves at least min_samples_leaf training samples in each of the left and right branches. This may have the effect of smoothing the model, especially in regression.

  • If int, then consider min_samples_leaf as the minimum number.

  • If float, then min_samples_leaf is a fraction and ceil(min_samples_leaf * n_samples) are the minimum number of samples for each node.

Changed in version 0.18: Added float values for fractions.

min_weight_fraction_leaffloat, default=0.0

The minimum weighted fraction of the sum total of weights (of all the input samples) required to be at a leaf node. Samples have equal weight when sample_weight is not provided.

max_features{“auto”, “sqrt”, “log2”}, int or float, default=”auto”

The number of features to consider when looking for the best split:

  • If int, then consider max_features features at each split.

  • If float, then max_features is a fraction and int(max_features * n_features) features are considered at each split.

  • If “auto”, then max_features=n_features.

  • If “sqrt”, then max_features=sqrt(n_features).

  • If “log2”, then max_features=log2(n_features).

  • If None, then max_features=n_features.

Note: the search for a split does not stop until at least one valid partition of the node samples is found, even if it requires to effectively inspect more than max_features features.

max_leaf_nodesint, default=None

Grow trees with max_leaf_nodes in best-first fashion. Best nodes are defined as relative reduction in impurity. If None then unlimited number of leaf nodes.

min_impurity_decreasefloat, default=0.0

A node will be split if this split induces a decrease of the impurity greater than or equal to this value.

The weighted impurity decrease equation is the following:

N_t / N * (impurity - N_t_R / N_t * right_impurity - N_t_L / N_t * left_impurity)

where N is the total number of samples, N_t is the number of samples at the current node, N_t_L is the number of samples in the left child, and N_t_R is the number of samples in the right child.

N, N_t, N_t_R and N_t_L all refer to the weighted sum, if sample_weight is passed.

New in version 0.19.

min_impurity_splitfloat, default=None

Threshold for early stopping in tree growth. A node will split if its impurity is above the threshold, otherwise it is a leaf.

Deprecated since version 0.19: min_impurity_split has been deprecated in favor of min_impurity_decrease in 0.19. The default value of min_impurity_split has changed from 1e-7 to 0 in 0.23 and it will be removed in 0.25. Use min_impurity_decrease instead.

bootstrapbool, default=True

Whether bootstrap samples are used when building trees. If False, the whole dataset is used to build each tree.

oob_scorebool, default=False

whether to use out-of-bag samples to estimate the R^2 on unseen data.

n_jobsint, default=None

The number of jobs to run in parallel. fit, predict, decision_path and apply are all parallelized over the trees. None means 1 unless in a joblib.parallel_backend context. -1 means using all processors. See Glossary for more details.

random_stateint or RandomState, default=None

Controls both the randomness of the bootstrapping of the samples used when building trees (if bootstrap=True) and the sampling of the features to consider when looking for the best split at each node (if max_features < n_features). See Glossary for details.

verboseint, default=0

Controls the verbosity when fitting and predicting.

warm_startbool, default=False

When set to True, reuse the solution of the previous call to fit and add more estimators to the ensemble, otherwise, just fit a whole new forest. See the Glossary.

ccp_alphanon-negative float, default=0.0

Complexity parameter used for Minimal Cost-Complexity Pruning. The subtree with the largest cost complexity that is smaller than ccp_alpha will be chosen. By default, no pruning is performed. See Minimal Cost-Complexity Pruning for details.

New in version 0.22.

max_samplesint or float, default=None

If bootstrap is True, the number of samples to draw from X to train each base estimator.

  • If None (default), then draw X.shape[0] samples.

  • If int, then draw max_samples samples.

  • If float, then draw max_samples * X.shape[0] samples. Thus, max_samples should be in the interval (0, 1).

New in version 0.22.

 

Attributes

base_estimator_DecisionTreeRegressor

The child estimator template used to create the collection of fitted sub-estimators.

estimators_list of DecisionTreeRegressor

The collection of fitted sub-estimators.

feature_importances_ndarray of shape (n_features,)

The impurity-based feature importances.

n_features_int

The number of features when fit is performed.

n_outputs_int

The number of outputs when fit is performed.

oob_score_float

Score of the training dataset obtained using an out-of-bag estimate. This attribute exists only when oob_score is True.

oob_prediction_ndarray of shape (n_samples,)

Prediction computed with out-of-bag estimate on the training set. This attribute exists only when oob_score is True.

 

 

// 파라미터 그리드를 생성하고 하이퍼 마라미터 그리드를 parma_dict 에 추가함.

 

// sklearn.metrics.mean_absolute_error Documentation

scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_absolute_error.html

sklearn.metrics.mean_absolute_error(y_true, y_pred, *, sample_weight=None, multioutput='uniform_average')

Mean absolute error regression loss

Read more in the User Guide.

 

Parameters

y_truearray-like of shape (n_samples,) or (n_samples, n_outputs)

Ground truth (correct) target values.

y_predarray-like of shape (n_samples,) or (n_samples, n_outputs)

Estimated target values.

sample_weightarray-like of shape (n_samples,), optional

Sample weights.

multioutputstring in [‘raw_values’, ‘uniform_average’] or array-like of shape (n_outputs)

Defines aggregating of multiple output values. Array-like value defines weights used to average errors.

‘raw_values’ :

Returns a full set of errors in case of multioutput input.

‘uniform_average’ :

Errors of all outputs are averaged with uniform weight.

 

Returns

lossfloat or ndarray of floats

If multioutput is ‘raw_values’, then mean absolute error is returned for each output separately. If multioutput is ‘uniform_average’ or an ndarray of weights, then the weighted average of all output errors is returned.

MAE output is non-negative floating point. The best value is 0.0.

 

// 값이 작을 수록 좋기 때문에 초기 값은 매우 큰 값으로 정의함.

// LightGBM 에서 DataFrame 이 잘 처리 되지 않는 것을 방지하기 위해서 .values 를 사용하였다.

 

06. Ch 23. 진짜 문제를 해결해 보자 (1) - 상점 신용카드 매출 예측 - 05. (5) 모델 적용

// 모델 학습이 다 끝나서 새로 들어온 데이터에서 대해서 예측을 해보는 것이다.

// pipeline 을 이용해서 구축할 수 있다.

 

 

07. Ch 24. 진짜 문제를 해결해 보자 (2) - 아파트 실거래가 예측 - 01. (1) 문제 소개

 

* 아파트 실거래가 예측

 

// 실제 데이터는 크기가 크기 때문에 샘플 데이터로 주었다.

// 참조 데이터는 대회 문제 해결을 위해, 강사가 직접 수집한 데이터이며, 어떠한 정제도 하지 않았다.

 

08. Ch 24. 진짜 문제를 해결해 보자 (2) - 아파트 실거래가 예측 - 02. (2) 변수 변환 및 부착

 

* 변수 부착시에 자주 발생하는 이슈 및 해결 방안

// 데이터 크기가 줄어도는 경우가 존재한다.

// np.isin 함수 사용

 

// numpy.isin Documentation

numpy.org/doc/stable/reference/generated/numpy.isin.html

numpy.isin(element, test_elements, assume_unique=False, invert=False)

Calculates element in test_elements, broadcasting over element only. Returns a boolean array of the same shape as element that is True where an element of element is in test_elements and False otherwise.

 

Parameters

elementarray_like

Input array.

test_elementsarray_like

The values against which to test each value of element. This argument is flattened if it is an array or array_like. See notes for behavior with non-array-like parameters.

assume_uniquebool, optional

If True, the input arrays are both assumed to be unique, which can speed up the calculation. Default is False.

invertbool, optional

If True, the values in the returned array are inverted, as if calculating element not in test_elements. Default is False. np.isin(a, b, invert=True) is equivalent to (but faster than) np.invert(np.isin(a, b)).

 

Returns

isinndarray, bool

Has the same shape as element. The values element[isin] are in test_elements.

 

* 불필요한 변수 제거

// 사용하지 않는 변수들은 미리 삭제하여 메모리 부담을 줄여준다.

 

* 범주 변수 구간화 : floor 변수

// floor 변수는 이론적으로는 연속형 변수지만, 범주형 변수로 간주하는 것이 적절하다.

// 너무 정교하게 하면 과최적화가 일어날 수가 있다.

// 박스플롯을 그려서 군집을 세분화한다.

 

* 시세 변수 추가

// groypby를 이용, 구별 전체 평균 시세 변수 추가

// 구별 작년 평균 시세, 구별 작년 거래량 변수 추가

// 아파트별 평균가격 변수 추가

 

* 실습

// engine = 'python' 에러를 줄이기 위해

 

// 일치하지 않는 경우를 확인해야 한다.

 

// isin 함수를 통해서 확인

// df_loc 가 ref_df_loc에 포함되지 않는 경우가 다수 있음을 확인했다.

 

// 시도와 법정동이 완전히 똑같은 행이 있어 제거를 하고, dong 에 리가 붙어 있으면 제거 해야 한다.

 

// apartment_id 를 삭제 할려고 했으나 완전히 유니크하지 않으므로 어느정도 사용이 가능할 것이라 보여서 살펴뒀음.

 

09. Ch 24. 진짜 문제를 해결해 보자 (2) - 아파트 실거래가 예측 - 03. (3) 외부 데이터 부착

// 공원 데이터를 추가 한다.

// 동별로 유형에 공원수를 계산한 뒤, 데이터를 부착한다.

 

// 어린이집 데이터를 추가

// 처리에 관한 방법은 비슷하지만 어떤식으로 정리를 해야 할지는 많은 경험치가 필요할 듯 보인다.

 

10. Ch 24. 진짜 문제를 해결해 보자 (2) - 아파트 실거래가 예측 - 04. (4) 모델 학습

* 데이터 분리

// 라벨 변수 할당

// 불필요한 변수를 제거하여 정의

// 학습 데이터의 크기가(27012, 22) 임을 확인, 특징 22개 데이터의 크기는 27012 이다.

 

// 더미화

// 샘플 대비 특징이 많지 않고, 범주형 변수의 개수도 많지 않아 더미화를 하더라도 큰 문제가 없다고 판단

 

* 결측 대체

// 원 데이터에는 결측이 없으나, 과거 거래와 관련돈 변수를 부착하는 과정에서 과거가 없는 데이터에 대한 결측이 생성된다.

 

* 모델 재학습

// 학습 데이터와 평가 데이터를 부착하고, 재학습을 실시함.

// 시간이 허락되면 해주는 것이 바람직하다.

 

* 실습

// 샘플 대비 특징이 매우 적다는 것은 더미화 가능하다

// 샘플이 충분히 많이 있으므로 트리 뿐만 아니라 트리 기반의 앙상블도 적절함.

 

* 더미화시킴

 

* 변수 부착 과정에서 생성된 결측 대체

 

// key 가 모델 function

 

// sklearn.metrics.mean_absolute_error 를 사용함.

 

// LGB 은 아스키 코드가 포함되면 작동안하는 경우가 있기 때문에 ndarrary 로 작업을 한다.

 

11. Ch 24. 진짜 문제를 해결해 보자 (2) - 아파트 실거래가 예측 - 05. (5) 모델 적용

 

* 파이프라인 구축

// 새로들어온 데이터의 아파트 값 예측

// 파이프라인 사용에 필요한 모든 요소를 pickle 을 사용하였음

 

// pckl 로 저장함.

// pickle.dump

// pickle 의 파일들은 binary 로 수행한다.

 

// pickle Documentation

docs.python.org/3/library/pickle.html

The pickle module implements binary protocols for serializing and de-serializing a Python object structure. “Pickling” is the process whereby a Python object hierarchy is converted into a byte stream, and “unpickling” is the inverse operation, whereby a byte stream (from a binary file or bytes-like object) is converted back into an object hierarchy. Pickling (and unpickling) is alternatively known as “serialization”, “marshalling,” 1 or “flattening”; however, to avoid confusion, the terms used here are “pickling” and “unpickling”.

 

Comparison with json

There are fundamental differences between the pickle protocols and JSON (JavaScript Object Notation):

  • JSON is a text serialization format (it outputs unicode text, although most of the time it is then encoded to utf-8), while pickle is a binary serialization format;

  • JSON is human-readable, while pickle is not;

  • JSON is interoperable and widely used outside of the Python ecosystem, while pickle is Python-specific;

  • JSON, by default, can only represent a subset of the Python built-in types, and no custom classes; pickle can represent an extremely large number of Python types (many of them automatically, by clever usage of Python’s introspection facilities; complex cases can be tackled by implementing specific object APIs);

  • Unlike pickle, deserializing untrusted JSON does not in itself create an arbitrary code execution vulnerability.

// 솔직히 난 json 타입을 더 선호하기는 하던데..

 

https://bit.ly/3m7bW22

 

파이썬을 활용한 데이터 전처리 Level UP 올인원 패키지 Online. | 패스트캠퍼스

데이터 분석에 필요한 기초 전처리부터, 데이터의 품질 및 머신러닝 성능 향상을 위한 고급 스킬까지 완전 정복하는 데이터 전처리 트레이닝 온라인 강의입니다.

www.fastcampus.co.kr

 

728x90
반응형
Posted by 패치#

댓글을 달아 주세요

728x90
반응형

[파이썬을 활용한 데이터 전처리 Level UP- 28 회차 미션 시작]

 

* 복습

 - 마지막 미션!!!!

 - 범주형 변수 문자에 대한 처리 방법

 - 이상치 제거.. 그리고 스케일링

 


[05. Part 5) Ch 20. 편향된 모델은 쓸모 없어 - 클래스 불균형 문제 - 01. 문제 정의 및 탐색 방법]

 

 

* 문제 정의

// 하나의 값에 치우친 데이터로 편향되는 문제

// 클래스 불균형 문제가 있는 모델은 정확도가 높고, 재현율이 매우 낮은 경향이 있다.

 

 

* 용어 정의

// 다수 클래스 : 대부분 샘플이 속한 클래스

// 소수 클래스 : 대부분 샘플이 속하지 않은 클래스

 

* 발생 원인

 

 

 

* 탐색 방법 (1) 클래스 불균형 비율

 

 

// 9 이상이면 편향된 모델이 학습될 가능성이 있다.

 

 

 

* 탐색 방법 (2) k- 최근접 이웃을 활용하는 방법

 

 

// k 값은 5~ 11 정도.. 보통은 11정도를 선호하는 수치이다.

 

* 문제 해결의 기본 아이디어

 

 

// 소수 클래스에 대한 결정 공간을 넓히는 것이다.

 


 

[05. Part 5) Ch 20. 편향된 모델은 쓸모 없어 - 클래스 불균형 문제 - 02-1. 재샘플링 - 오버샘플링과 언더 샘플링(이론)]

 

 

 

* 분류 : 오버샘플링과 언더샘플링

 

 

 

* 어디에 만들고 어느 것을 지울까?

// 결정 경계에 가까운 다수 클래스 샘플을 제거하고, 결정 경계에 가까운 소수 클래스 샘플을 생성해야 한다.

 

 

// 평가 데이터에 대해서는 절대로 재샘플링을 적용하면 안된다!!!!

 

* 대표적인 오버샘플링 알고리즘 : SMOTE

 

 

 

 

* imblearn.over_sampling.SMOTE Documentation

imbalanced-learn.org/stable/generated/imblearn.over_sampling.SMOTE.html

classimblearn.over_sampling.SMOTE(*, sampling_strategy='auto', random_state=None, k_neighbors=5, n_jobs=None)[source]

Class to perform over-sampling using SMOTE.

This object is an implementation of SMOTE - Synthetic Minority Over-sampling Technique as presented in [1].

Read more in the User Guide.

 

Parameters

sampling_strategyfloat, str, dict or callable, default=’auto’

Sampling information to resample the data set.

  • When float, it corresponds to the desired ratio of the number of samples in the minority class over the number of samples in the majority class after resampling. Therefore, the ratio is expressed as 

     where 

     is the number of samples in the minority class after resampling and 

     is the number of samples in the majority class.

    Warning

    float is only available for binary classification. An error is raised for multi-class classification.

  • When str, specify the class targeted by the resampling. The number of samples in the different classes will be equalized. Possible choices are:

    'minority': resample only the minority class;

    'not minority': resample all classes but the minority class;

    'not majority': resample all classes but the majority class;

    'all': resample all classes;

    'auto': equivalent to 'not majority'.

  • When dict, the keys correspond to the targeted classes. The values correspond to the desired number of samples for each targeted class.

  • When callable, function taking y and returns a dict. The keys correspond to the targeted classes. The values correspond to the desired number of samples for each class.

random_stateint, RandomState instance, default=None

Control the randomization of the algorithm.

  • If int, random_state is the seed used by the random number generator;

  • If RandomState instance, random_state is the random number generator;

  • If None, the random number generator is the RandomState instance used by np.random.

k_neighborsint or object, default=5

If int, number of nearest neighbours to used to construct synthetic samples. If object, an estimator that inherits from sklearn.neighbors.base.KNeighborsMixin that will be used to find the k_neighbors.

n_jobsint, default=None

Number of CPU cores used during the cross-validation loop. None means 1 unless in a joblib.parallel_backend context. -1 means using all processors. See Glossary for more details.

 

* 대표적인 언더샘플링 알고리즘 : NearMiss

// 평균 거리가 짧은 다수 클래스 샘플을 순서대로 제거하는 방법이다.

 

 

// version 2 소수 클래스 샘플까지의 평균 거리를 사용한다.

 

* imblearn.under_sampling.NearMiss Documentation

imbalanced-learn.org/stable/generated/imblearn.under_sampling.NearMiss.html

classimblearn.under_sampling.NearMiss(*, sampling_strategy='auto', version=1, n_neighbors=3, n_neighbors_ver3=3, n_jobs=None)[source]

Class to perform under-sampling based on NearMiss methods.

Read more in the User Guide.

 

Parameters

sampling_strategyfloat, str, dict, callable, default=’auto’

Sampling information to sample the data set.

  • When float, it corresponds to the desired ratio of the number of samples in the minority class over the number of samples in the majority class after resampling. Therefore, the ratio is expressed as 

     where 

     is the number of samples in the minority class and 

     is the number of samples in the majority class after resampling.

    Warning

    float is only available for binary classification. An error is raised for multi-class classification.

  • When str, specify the class targeted by the resampling. The number of samples in the different classes will be equalized. Possible choices are:

    'majority': resample only the majority class;

    'not minority': resample all classes but the minority class;

    'not majority': resample all classes but the majority class;

    'all': resample all classes;

    'auto': equivalent to 'not minority'.

  • When dict, the keys correspond to the targeted classes. The values correspond to the desired number of samples for each targeted class.

  • When callable, function taking y and returns a dict. The keys correspond to the targeted classes. The values correspond to the desired number of samples for each class.

versionint, default=1

Version of the NearMiss to use. Possible values are 1, 2 or 3.

n_neighborsint or object, default=3

If int, size of the neighbourhood to consider to compute the average distance to the minority point samples. If object, an estimator that inherits from sklearn.neighbors.base.KNeighborsMixin that will be used to find the k_neighbors.

n_neighbors_ver3int or object, default=3

If int, NearMiss-3 algorithm start by a phase of re-sampling. This parameter correspond to the number of neighbours selected create the subset in which the selection will be performed. If object, an estimator that inherits from sklearn.neighbors.base.KNeighborsMixin that will be used to find the k_neighbors.

n_jobsint, default=None

Number of CPU cores used during the cross-validation loop. None means 1 unless in a joblib.parallel_backend context. -1 means using all processors. See Glossary for more details.

 


[05. Part 5) Ch 20. 편향된 모델은 쓸모 없어 - 클래스 불균형 문제 - 02-2. 재샘플링 - 오버샘플링과 언더 샘플링(실습)]

 

 

// kNN 을 사용해서 클래스 불균형도 테스트를 해준다.

// KNeighborsClassifier

// 재현율 0% 로 불균형이 심각한 수준이라 볼 수 있다.

 

 

 

 

 

 

[05. Part 5) Ch 20. 편향된 모델은 쓸모 없어 - 클래스 불균형 문제 - 03-1 비용 민감 모델 (이론)]

 

 

// 모델의 학습 변경한 모델이라고 볼 수 있다. 전처리라고 보기는 좀 어렵다.

 

* 정의

// 비용을 위양성 비용보다 크게 설정

 

 

 

* 확률 모델

 

 

 

* 관련문법: .predict_proba

 

 

 

* Tip.Numpy 와 Pandas 잘 쓰는 기본 원칙 : 가능하면 배열 단위 연산을 하라

// 유니버설 함수, 브로드캐스팅, 마스크 연산을 최대한 활용

 

 

 

* 비확률 모델 (1) 서포트 벡터 머신

 

 

 

* 비확률 모델 (2) 의사결정 나무

 

 

 

* 관련문법 : class_weight

 


[05. Part 5) Ch 20. 편향된 모델은 쓸모 없어 - 클래스 불균형 문제 - 03-2 비용 민감 모델 (실습)]

 

* 실습

// kNN 을 사용한 클래스 불균형 테스트들을 사용

 

 

// cost_sensitive_model 의 함수를 만들어 준다.

 

// 둔감하다는 표현이 더 좋은 표현이라고 생각하면 된다.

 

 

 

// class weight 도 튜닝을 해야 한다고 보면 된다.

 

// sklearn.svm.SVC Documentation

scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

class sklearn.svm.SVC(*, C=1.0, kernel='rbf', degree=3, gamma='scale', coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape='ovr', break_ties=False, random_state=None)

C-Support Vector Classification.

The implementation is based on libsvm. The fit time scales at least quadratically with the number of samples and may be impractical beyond tens of thousands of samples. For large datasets consider using sklearn.svm.LinearSVC or sklearn.linear_model.SGDClassifier instead, possibly after a sklearn.kernel_approximation.Nystroem transformer.

The multiclass support is handled according to a one-vs-one scheme.

For details on the precise mathematical formulation of the provided kernel functions and how gamma, coef0 and degree affect each other, see the corresponding section in the narrative documentation: Kernel functions.

Read more in the User Guide.

 

Parameters

Cfloat, default=1.0

Regularization parameter. The strength of the regularization is inversely proportional to C. Must be strictly positive. The penalty is a squared l2 penalty.

kernel{‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’}, default=’rbf’

Specifies the kernel type to be used in the algorithm. It must be one of ‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ or a callable. If none is given, ‘rbf’ will be used. If a callable is given it is used to pre-compute the kernel matrix from data matrices; that matrix should be an array of shape (n_samples, n_samples).

degreeint, default=3

Degree of the polynomial kernel function (‘poly’). Ignored by all other kernels.

gamma{‘scale’, ‘auto’} or float, default=’scale’

Kernel coefficient for ‘rbf’, ‘poly’ and ‘sigmoid’.

  • if gamma='scale' (default) is passed then it uses 1 / (n_features * X.var()) as value of gamma,

  • if ‘auto’, uses 1 / n_features.

Changed in version 0.22: The default value of gamma changed from ‘auto’ to ‘scale’.

coef0float, default=0.0

Independent term in kernel function. It is only significant in ‘poly’ and ‘sigmoid’.

shrinkingbool, default=True

Whether to use the shrinking heuristic. See the User Guide.

probabilitybool, default=False

Whether to enable probability estimates. This must be enabled prior to calling fit, will slow down that method as it internally uses 5-fold cross-validation, and predict_proba may be inconsistent with predict. Read more in the User Guide.

tolfloat, default=1e-3

Tolerance for stopping criterion.

cache_sizefloat, default=200

Specify the size of the kernel cache (in MB).

class_weightdict or ‘balanced’, default=None

Set the parameter C of class i to class_weight[i]*C for SVC. If not given, all classes are supposed to have weight one. The “balanced” mode uses the values of y to automatically adjust weights inversely proportional to class frequencies in the input data as n_samples / (n_classes * np.bincount(y))

verbosebool, default=False

Enable verbose output. Note that this setting takes advantage of a per-process runtime setting in libsvm that, if enabled, may not work properly in a multithreaded context.

max_iterint, default=-1

Hard limit on iterations within solver, or -1 for no limit.

decision_function_shape{‘ovo’, ‘ovr’}, default=’ovr’

Whether to return a one-vs-rest (‘ovr’) decision function of shape (n_samples, n_classes) as all other classifiers, or the original one-vs-one (‘ovo’) decision function of libsvm which has shape (n_samples, n_classes * (n_classes - 1) / 2). However, one-vs-one (‘ovo’) is always used as multi-class strategy. The parameter is ignored for binary classification.

Changed in version 0.19: decision_function_shape is ‘ovr’ by default.

New in version 0.17: decision_function_shape=’ovr’ is recommended.

Changed in version 0.17: Deprecated decision_function_shape=’ovo’ and None.

break_tiesbool, default=False

If true, decision_function_shape='ovr', and number of classes > 2, predict will break ties according to the confidence values of decision_function; otherwise the first class among the tied classes is returned. Please note that breaking ties comes at a relatively high computational cost compared to a simple predict.

New in version 0.22.

random_stateint or RandomState instance, default=None

Controls the pseudo random number generation for shuffling the data for probability estimates. Ignored when probability is False. Pass an int for reproducible output across multiple function calls. See Glossary.

 

Attributes

support_ndarray of shape (n_SV,)

Indices of support vectors.

support_vectors_ndarray of shape (n_SV, n_features)

Support vectors.

n_support_ndarray of shape (n_class,), dtype=int32

Number of support vectors for each class.

dual_coef_ndarray of shape (n_class-1, n_SV)

Dual coefficients of the support vector in the decision function (see Mathematical formulation), multiplied by their targets. For multiclass, coefficient for all 1-vs-1 classifiers. The layout of the coefficients in the multiclass case is somewhat non-trivial. See the multi-class section of the User Guide for details.

coef_ndarray of shape (n_class * (n_class-1) / 2, n_features)

Weights assigned to the features (coefficients in the primal problem). This is only available in the case of a linear kernel.

coef_ is a readonly property derived from dual_coef_ and support_vectors_.

intercept_ndarray of shape (n_class * (n_class-1) / 2,)

Constants in decision function.

fit_status_int

0 if correctly fitted, 1 otherwise (will raise warning)

classes_ndarray of shape (n_classes,)

The classes labels.

probA_ndarray of shape (n_class * (n_class-1) / 2)probB_ndarray of shape (n_class * (n_class-1) / 2)

If probability=True, it corresponds to the parameters learned in Platt scaling to produce probability estimates from decision values. If probability=False, it’s an empty array. Platt scaling uses the logistic function 1 / (1 + exp(decision_value * probA_ + probB_)) where probA_ and probB_ are learned from the dataset [2]. For more information on the multiclass case and training procedure see section 8 of [1].

class_weight_ndarray of shape (n_class,)

Multipliers of parameter C for each class. Computed based on the class_weight parameter.

shape_fit_tuple of int of shape (n_dimensions_of_X,)

Array dimensions of training vector X.

 

Methods

decision_function(X)

Evaluates the decision function for the samples in X.

fit(X, y[, sample_weight])

Fit the SVM model according to the given training data.

get_params([deep])

Get parameters for this estimator.

predict(X)

Perform classification on samples in X.

score(X, y[, sample_weight])

Return the mean accuracy on the given test data and labels.

set_params(**params)

Set the parameters of this estimator.

 


[파이썬을 활용한 데이터 전처리 Level UP-Comment]
 - 각 불균형 문제에 대해서 샘플링 및 비용 민감 모델을 어떻게 다룰 것인지에 대해서 학습했다.

 

 

 

https://bit.ly/3m7bW22

파이썬을 활용한 데이터 전처리 Level UP 올인원 패키지 Online. | 패스트캠퍼스

데이터 분석에 필요한 기초 전처리부터, 데이터의 품질 및 머신러닝 성능 향상을 위한 고급 스킬까지 완전 정복하는 데이터 전처리 트레이닝 온라인 강의입니다.

www.fastcampus.co.kr

 

728x90
반응형
Posted by 패치#

댓글을 달아 주세요