<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>o__o.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 01 Jun 2022 12:47:06 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. o__o.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/o__o" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[python5]]></title>
            <link>https://velog.io/@o__o/python5</link>
            <guid>https://velog.io/@o__o/python5</guid>
            <pubDate>Wed, 01 Jun 2022 12:47:06 GMT</pubDate>
            <description><![CDATA[<h3 id="백테스팅-순서">&lt;백테스팅 순서&gt;</h3>
<blockquote>
<p>⇒ (1) 원하는 종목의 주가 데이터를 가져오고
⇒ (2) 주가 데이터를 원하는 형태로 가공하기
⇒ (3) 사고 → 파는 시점을 적어두기
⇒ (4) 종가를 이용해서 수익률을 구하기
⇒ (5) 이 것을 여러 종목 또는 파라미터를 바꿔서 수행하기</p>
</blockquote>
<h3 id="변동성-돌파전략">&lt;변동성 돌파전략&gt;</h3>
<blockquote>
<p>: ⇒ 주식이 막 오르는 것 같다면? 일단 사자! → 그리고 내일 바로 팔자</p>
</blockquote>
<p>⇒ 예) k = 0.5 라고 할 때.</p>
<ol>
<li><p>어제 삼성전자의 주가가  최고 120,000원 ~ 최저 100,000원 이었다.</p>
</li>
<li><p>오늘 삼성전자의 주가가 105,000원으로 시작했다.</p>
</li>
<li><p>오늘 (120,000 - 100,000) ⇒ 20,000원 x 0.5 = 10,000원 오르면 산다.</p>
<blockquote>
<p><strong><em>⇒ 사야하는 가격 = (어제 최고가 - 어제 최저가) * k + 오늘 시작가</em></strong></p>
</blockquote>
</li>
<li><p>여기서 0.5는 <code>k</code> 값이라고 불리는데, 적당히 넣어준다. (통상 0.4~0.6)</p>
</li>
<li><p>즉, 105,000 + 10,000 = <strong>115,000원이 되면 산다.</strong> 오르는 <code>분위기</code> 라고 판단.</p>
</li>
<li><p>역시 오르는가 싶더니 오늘 마감 때 <strong>130,000원이 됐다.</strong></p>
</li>
<li><p>내일 바로 판다.</p>
</li>
</ol>
<p>→ 수익: 130,000 - 115,000원 =15,000원
→ 수익률: 15,000 / 115,000원 = 13%</p>
<blockquote>
<p><em><strong>즉, 어제 변동한 것의 특정 비율만큼 오늘 올랐으면, Buy → 내일 열자마자 Sell</strong></em></p>
</blockquote>
<h4 id="주가-가져오기">&lt;주가 가져오기&gt;</h4>
<p>*<em>라이브러리 : *</em></p>
<pre><code>from pandas_datareader import data as pdr
import yfinance as yf

yf.pdr_override()

import numpy as np
import pandas as pd

import FinanceDataReader as fdr

df = fdr.DataReader(&#39;005930&#39;,&#39;2018&#39;)

df.head()</code></pre><h4 id="사야하는-날-파는가격-구하기">&lt;사야하는 날, 파는가격 구하기&gt;</h4>
<blockquote>
<ul>
<li>사는 가격
⇒ 사야하는 가격 = (어제 최고가 - 어제 최저가) * k + 오늘 시작가
cf. 어제의 High 를 나타낸 열 추가해보기
df[&#39;High2&#39;] = df[&#39;High&#39;].shift(1)</li>
</ul>
</blockquote>
<pre><code>df = fdr.DataReader(&#39;005930&#39;,&#39;2018&#39;)

k = 0.4

df[&#39;buy_at&#39;] = (df[&#39;High&#39;].shift(1) - df[&#39;Low&#39;].shift(1))*k + df[&#39;Open&#39;]</code></pre><blockquote>
<p><strong>* 사야하는 날</strong>
⇒ high와 buy_at을 비교한다! high 이하 값에 buy_at이 있어야함!</p>
</blockquote>
<pre><code>df[&#39;is_buy&#39;] = np.where(df[&#39;buy_at&#39;] &lt; df[&#39;High&#39;],&#39;buy&#39;,&#39;&#39;)</code></pre><blockquote>
<p><strong>* 파는 시점</strong>
⇒ 샀으면 다음날 장이 열리자마자 파는 것입니다!(다음날의 open가격)
cf. 한칸 땡키키 : shift(-1)</p>
</blockquote>
<pre><code>df[&#39;sell_at&#39;] = df[&#39;Open&#39;].shift(-1)</code></pre><p><strong>* 수익률</strong>
⇒ is_buy 있는 행들만 추리기</p>
<pre><code>df = df[df[&#39;is_buy&#39;] == &#39;buy&#39;]</code></pre><p>⇒ buy_at, sell_at 만 추리기</p>
<pre><code>df = df[[&#39;buy_at&#39;,&#39;sell_at&#39;]]</code></pre><p><strong>⇒ 수익률 열을 추가해주기(<code>return</code>)열</strong>
⇒ <code>return</code> = <code>sell_at</code> / <code>buy_at</code></p>
<pre><code>df[&#39;return&#39;] = df[&#39;sell_at&#39;]/df[&#39;buy_at&#39;]</code></pre><p><strong>⇒ 누적곱</strong></p>
<pre><code>df[[&#39;return&#39;]].cumprod().iloc[-1,-1] -1</code></pre><hr>
<h3 id="함수최적의-k값-구하기">&lt;함수:최적의 K값 구하기&gt;</h3>
<pre><code>def get_return(code,k):
  df = fdr.DataReader(code,&#39;2018&#39;)

  df[&#39;buy_at&#39;] = (df[&#39;High&#39;].shift(1) - df[&#39;Low&#39;].shift(1))*k + df[&#39;Open&#39;]

  df[&#39;is_buy&#39;] = np.where(df[&#39;buy_at&#39;] &lt; df[&#39;High&#39;],&#39;buy&#39;,&#39;&#39;)

  df[&#39;sell_at&#39;] = df[&#39;Open&#39;].shift(-1)

  df = df[df[&#39;is_buy&#39;] == &#39;buy&#39;]

  df = df[[&#39;buy_at&#39;,&#39;sell_at&#39;]]

  df[&#39;return&#39;] = df[&#39;sell_at&#39;]/df[&#39;buy_at&#39;]

  return df[[&#39;return&#39;]].cumprod().iloc[-1,-1] -1</code></pre><h4 id="⇒-k가-04부터-06까지-001씩-상승하는걸-반복-">*<em>⇒ k가 0.4부터 0.6까지 0.01씩 상승하는걸 반복! *</em></h4>
<pre><code>for k in np.arange(0.4,0.6,0.01):
  print(round(k,2), get_return(&#39;005930&#39;,k))</code></pre><h4 id="⇒-dataframe-만들어서-내림차순-정렬하기">⇒ dataframe 만들어서 내림차순 정렬하기</h4>
<pre><code>df = pd.DataFrame()
for k in np.arange(0.4,0.6,0.01):
  doc = {
      &#39;k&#39;:k,
      &#39;return&#39;:get_return(&#39;005930&#39;,k)
  }
  df = df.append(doc,ignore_index=True)

df.sort_values(by=&#39;return&#39;,ascending=False)  </code></pre><hr>
<h3 id="월-금전략">&lt;월-금전략&gt;</h3>
<blockquote>
<p>: 월요일에 사서 금요일에 파는 전략 만들기</p>
</blockquote>
<p><strong>* 요일 표기하기</strong></p>
<blockquote>
<p>⇒ date값이 처음에 index로 들어가있어서, reset후 재설정 해줘야함</p>
</blockquote>
<pre><code>df = fdr.DataReader(&#39;005930&#39;,&#39;2018&#39;)

df = df.reset_index()
df = df[[&#39;Date&#39;,&#39;Open&#39;]]</code></pre><h4 id="⇒-date를-date속성으로-바꾸기"><em>⇒ date를 date속성으로 바꾸기</em></h4>
<pre><code>df[&#39;Date&#39;] = pd.to_datetime(df[&#39;Date&#39;])</code></pre><h4 id="⇒-요일얻기"><em>⇒ 요일얻기</em></h4>
<pre><code>df[&#39;Day&#39;] = pd.to_datetime(df[&#39;Date&#39;]).dt.day_name()</code></pre><h4 id="-월금-남기기"><em>* 월/금 남기기</em></h4>
<pre><code>cond = (df[&#39;Day&#39;] == &#39;Monday&#39;)  | (df[&#39;Day&#39;] == &#39;Friday&#39;)</code></pre><p><strong>⇒ 월요일로 시작해서 금요일로 끝나게끔 설정</strong></p>
<blockquote>
<p>if df.iloc[0,2] == &#39;Friday&#39;: 
  df = df.iloc[1:,:] (첫번째줄 날리기)</p>
</blockquote>
<p>if df.iloc[-1,2] == &#39;Monday&#39;:
  df = df.iloc[:-1,:] (마지막줄 날리기)</p>
<h4 id="cf-휴일-고려하기"><em>cf. 휴일 고려하기</em></h4>
<pre><code>cond = (df[&#39;Day&#39;] == &#39;Monday&#39;) &amp; (df[&#39;Day&#39;].shift(-1) == &#39;Monday&#39;)
df = df.drop(index = df[cond].index)

cond = (df[&#39;Day&#39;] == &#39;Friday&#39;) &amp; (df[&#39;Day&#39;].shift(1) == &#39;Friday&#39;)
df = df.drop(index = df[cond].index)</code></pre><h4 id="⇒-월-금요일의-주가를-한-행에-두고-이름을-바꿔줍니다">⇒ 월-금요일의 주가를 한 행에 두고, 이름을 바꿔줍니다.</h4>
<pre><code>df[&#39;Open_fri&#39;] = df[&#39;Open&#39;].shift(-1)

df = df[df[&#39;Day&#39;]==&#39;Monday&#39;].copy()

df = df[[&#39;Open&#39;,&#39;Open_fri&#39;]]

df.columns = [&#39;buy_at&#39;,&#39;sell_at&#39;]

⇒ cumprod()
df[&#39;return&#39;] = df[&#39;sell_at&#39;] / df[&#39;buy_at&#39;]

df[[&#39;return&#39;]].cumprod().iloc[-1,-1] - 1</code></pre><hr>
<h3 id="엣지-케이스-없애기inf나온다무한대">&lt;엣지 케이스 없애기:inf나온다!(무한대)&gt;</h3>
<blockquote>
<p>⇒ buy_at 이 0인 경우가 있었던 걸까? 0 아닌애들만 가져오기!</p>
</blockquote>
<pre><code>cond = (df[&#39;sell_at&#39;] != 0) &amp; (df[&#39;buy_at&#39;] != 0)
df = df[cond]

df[[&#39;return&#39;]].cumprod().iloc[-1,-1] - 1</code></pre><h4 id="함수">&lt;함수&gt;</h4>
<pre><code>
 def get_return_mf(code):
  df = fdr.DataReader(code,&#39;2018&#39;)

  df = df.reset_index()
  df = df[[&#39;Date&#39;,&#39;Open&#39;]]

  df[&#39;Day&#39;] = pd.to_datetime(df[&#39;Date&#39;]).dt.day_name()

  cond = (df[&#39;Day&#39;] == &#39;Friday&#39;) | (df[&#39;Day&#39;] == &#39;Monday&#39;)

  df = df[cond]

  if df.iloc[0,2] == &#39;Friday&#39;:
    df = df.drop(index = df.index[0])

  if df.iloc[-1,2] == &#39;Monday&#39;:
    df = df.drop(index = df.index[-1])

  cond = (df[&#39;Day&#39;] == &#39;Monday&#39;) &amp; (df[&#39;Day&#39;].shift(-1) == &#39;Monday&#39;)
  df = df.drop(index = df[cond].index)

  cond = (df[&#39;Day&#39;] == &#39;Friday&#39;) &amp; (df[&#39;Day&#39;].shift(1) == &#39;Friday&#39;)
  df = df.drop(index = df[cond].index)

  df[&#39;Open_fri&#39;] = df[&#39;Open&#39;].shift(-1)

  df = df[df[&#39;Day&#39;]==&#39;Monday&#39;]

  df = df[[&#39;Open&#39;,&#39;Open_fri&#39;]]

  df.columns = [&#39;buy_at&#39;,&#39;sell_at&#39;]

  df[&#39;return&#39;] = df[&#39;sell_at&#39;] / df[&#39;buy_at&#39;]

  cond = (df[&#39;sell_at&#39;] != 0) &amp; (df[&#39;buy_at&#39;] != 0)
  df = df[cond]

  return df[[&#39;return&#39;]].cumprod().iloc[-1,-1] - 1</code></pre><hr>
<h3 id="dart-fss-최적화-종목-찾기">&lt;dart fss 최적화 종목 찾기&gt;</h3>
<h4 id="-종목-가져오기">* 종목 가져오기</h4>
<pre><code>import dart_fss as dart_fss
import pandas as pd

api_key = &#39;API키 입력하기&#39;
dart_fss.set_api_key(api_key=api_key)

all = dart_fss.api.filings.get_corp_code()

df = pd.DataFrame(all)

df_listed = df[df[&#39;stock_code&#39;].notnull()]

for row in df_listed.sample(10)[[&#39;stock_code&#39;,&#39;corp_name&#39;]].itertuples():
  print(row[1], row[2])</code></pre><h4 id="-dataframe만들기">* dataframe만들기</h4>
<pre><code> df = pd.DataFrame()
for row in df_listed.sample(10)[[&#39;stock_code&#39;,&#39;corp_name&#39;]].itertuples():
  try:
    doc = {
        &#39;name&#39; : row[2],
        &#39;return&#39; : get_return_mf(row[1])
    }
    df = df.append(doc, ignore_index = True)
  except:
    print(f&#39;error - {row[2]}&#39;)

df.sort_values(by=&#39;return&#39;, ascending=False)</code></pre><hr>
<h1 id="과제">과제</h1>
<h3 id="5주차-과정-총-정리">5주차 과정 총 정리!</h3>
<blockquote>
<ul>
<li>1주차: Colab, 파이썬 문법
구글 Colab 이란?: 온라인에서 파이썬 데이터분석을 학습할 수 있는 환경!
파이썬: 가장 직관적인 문법을 가진 언어!
크롤링 기본 코드: requests 로 정보를 가져와서 (enter 치는 라이브러리), BeautifulSoup으로 분석하기 좋게! 만드는 것이랍니다.(잘 솎아내는 라이브러리)</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>2주차: yfinance 활용한 해외주식 분석 
Pandas 판다스: 파이썬에서 데이터를 쉽게 다룰 수 있게 해주는 라이브러리
yfinance:yahoo finance를 통해 해외주식 분석
데이터를 모을 빈 DataFrame 만들기&gt; 정보 모아서 딕셔너리 변환&gt; 딕셔너리 형태로 append: df.append(doc,ignore_index = True)</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>3주차: dart-fss 라이브러리 활용한 국내주식 분석
OpenAPI 란?: 데이터를 가져다 쓸 수 있게 서버의 ‘창구’를 열어둔 것!
Dart-fss 라이브러리: Dart의 OpenAPI를 쉽게 사용할 수 있도록 만들어둔 코드</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>4주차: 백테스팅 기초(1) : 골든/데드크로스 전략 구현
백테스팅이란?: 이전 주가의 추이에 전략을 대입해보는 것
이동평균선:이전 며칠(3일, 5일, 20일, 50일 등) 간의 가격을 평균하여 움직이는 선!,일수가 커질수록 곡선이 완만해질 수밖에
골든크로스: 단기이평선이 장기이평선 뚫고올라올때! 주가가 높아질 가능성이 있다는 신호
데드크로스: 단기이평선이 장기이평선 뚫고내려올떄! 주가가 낮아질 가능성이 있다는 신호
<code>shift</code> 를 가지고 열을 맞춰보기</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>5주차: 백테스팅 기초(2) : 변동성 돌파 전략 / 월-금 전략
&lt;백테스팅 순서&gt;(1) 원하는 종목의 주가 데이터를 가져오고 (2) 주가 데이터를 원하는 형태로 가공하기 (3) 사고 → 파는 시점을 적어두기 (4) 종가를 이용해서 수익률을 구하기 (5) 이 것을 여러 종목 또는 파라미터를 바꿔서 수행하기
변동성 돌파전략: 주식이 막 오르는 것 같다면? 일단 사자! → 그리고 내일 바로 팔자: 사야하는 가격 = (어제 최고가 - 어제 최저가) * k + 오늘 시작가</li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[python4]]></title>
            <link>https://velog.io/@o__o/python4</link>
            <guid>https://velog.io/@o__o/python4</guid>
            <pubDate>Sun, 29 May 2022 13:31:25 GMT</pubDate>
            <description><![CDATA[<h3 id="백테스팅이란">&lt;백테스팅이란?&gt;</h3>
<p>: 이전 주가의 추이에 전략을 대입해보는 것</p>
<blockquote>
<p><strong>1) 이동평균선이란?</strong>
⇒ 이전 며칠(3일, 5일, 20일, 50일 등) 간의 가격을 평균하여 움직이는 선!
⇒ 일수가 커질수록 곡선이 완만해질 수밖에 없겠죠!
<strong>2) 골든크로스</strong>
: 단기이평선이 장기이평선 뚫고올라올때! 주가가 높아질 가능성이 있다는 신호
**   데드크로스 **
: 단기이평선이 장기이평선 뚫고내려올떄! 주가가 낮아질 가능성이 있다는 신호</p>
</blockquote>
<h3 id="주가-가져오기-라이브러리-pandas-datareader-와-finance-datareader">&lt;주가 가져오기: 라이브러리 pandas-datareader 와 finance-datareader&gt;</h3>
<pre><code>!pip install yfinance pandas-datareader finance-datareader
from pandas_datareader import data as pdr

import yfinance as yf
yf.pdr_override()

import numpy as np
import pandas as pd

import FinanceDataReader as fdr

df = fdr.DataReader(&#39;005930&#39;,&#39;2018&#39;)

df.head()</code></pre><blockquote>
<hr>
</blockquote>
<ul>
<li>Open: 시초가 </li>
<li>High: 고가</li>
<li>Low: 저가  </li>
<li>Close: 종가 </li>
<li>Volume: 거래량 </li>
<li>Change: 변동</li>
</ul>
<hr>
<h3 id="간단한-그래프-그리기네이버금융">&lt;간단한 그래프 그리기:네이버금융&gt;</h3>
<p><strong>1) 주가 그래프 그려보기</strong>
<code>.plot(y=[&#39;컬럼명&#39;])</code></p>
<pre><code>df = fdr.DataReader(&#39;005930&#39;,&#39;2018&#39;)
df.plot(y=[&#39;Close&#39;])</code></pre><p><strong>크게그리고, 격자 추가하기</strong></p>
<pre><code>df.plot(y=[&#39;Close&#39;],figsize=(15,8),grid=True)</code></pre><p><strong>2) 종목 두 개의 최근 100일 주가 변동 그래프 그려보기</strong></p>
<pre><code>df_1 = fdr.DataReader(&#39;005930&#39;,&#39;2018&#39;)
df_2 = fdr.DataReader(&#39;066570&#39;,&#39;2018&#39;)

df_tot = pd.DataFrame()
df_tot[&#39;Samsung&#39;] = df_1[[&#39;Change&#39;]]
df_tot[&#39;LG&#39;] = df_2[[&#39;Change&#39;]]

df_tot.tail(100).plot(figsize=(15,8))</code></pre><p><strong>&lt;이동평균값 만들기 3일&gt;
3일마다 평균 값을 구하기</strong></p>
<pre><code>df.rolling(3).mean()

df = fdr.DataReader(&#39;005930&#39;,&#39;2018&#39;)
df = df[[&#39;Close&#39;]]
df[&#39;ma&#39;] = df.rolling(3).mean()

df</code></pre><h3 id="buy-sell-표시">&lt;buy sell 표시&gt;</h3>
<p><strong>1) <code>shift</code> 를 가지고 열을 맞춰보기</strong></p>
<p> ⇒ 사실은 다음 날 값과, ma 값을 비교해야 하는 것!
 ⇒ 같은 행에 두면 넘었는지 / 안 넘었는지 쉽게 알 수 있겠죠</p>
<blockquote>
<p>** ma값을 한칸 내려야하니까 shift(1) 추가하기!**</p>
</blockquote>
<pre><code>df = fdr.DataReader(&#39;005930&#39;,&#39;2018&#39;)
df = df[[&#39;Close&#39;]]
df[&#39;ma&#39;] = df.rolling(3).mean().shift(1)</code></pre><p><strong>2) buy &amp; sell 표기하기</strong>
    ⇒ 그러면, 넘었으면 buy, 아니면 sell 로 표기할 수 있겠죠!</p>
<pre><code>df[&#39;action&#39;] = np.where(df[&#39;Close&#39;] &gt; df[&#39;ma&#39;], &#39;buy&#39;, &#39;sell&#39;)</code></pre><hr>
<h3 id="수익률-구하기">&lt;수익률 구하기&gt;</h3>
<p><strong>1)실제로 사는 시점</strong>
⇒ buy → buy → buy 이면, 사는 게 아니겠죠!</p>
<blockquote>
<p>⇒ 즉, buy와 sell이 바뀌는 순간이 중요!</p>
</blockquote>
<pre><code>df[&#39;action_temp&#39;] = df[&#39;action&#39;].shift(1)</code></pre><p><strong>2)사는/파는 순간을 모아볼까요!</strong></p>
<pre><code>cond1 = (df[&#39;action&#39;] == &#39;buy&#39;) &amp; (df[&#39;action&#39;].shift(1) == &#39;sell&#39;)
cond2 = (df[&#39;action&#39;] == &#39;sell&#39;) &amp; (df[&#39;action&#39;].shift(1) == &#39;buy&#39;)

df_buy = df[cond1]
df_sell = df[cond2]</code></pre><p><strong>3) 마지막은?무조건 팔아야 함! 그래야 수익율을 알 수 있겠죠</strong></p>
<pre><code>df.iloc[-1,-1] = &#39;sell&#39;</code></pre><hr>
<h3 id="수익률구하기2">&lt;수익률구하기2&gt;</h3>
<p><strong>1) 사고, 파는 시점을 붙이기</strong>
    ⇒ 마찬가지로 <code>concat</code> 을 이용하면 된답니다 </p>
<blockquote>
<p>   좌우로 붙이려면
    ⇒ <code>,axis=1</code> 를 붙이면 되지요!</p>
</blockquote>
<pre><code>df_result = pd.concat([df_buy,df_sell],axis=1)

df_result</code></pre><p><strong>2) 전략 세워보기</strong>
⇒  buy 때의 Close와 sell 때의 Close 에 주목하면 되는 것</p>
<blockquote>
<p>.reset_index() 붙여서 더 깔끔히보기!</p>
</blockquote>
<pre><code>df = fdr.DataReader(&#39;005930&#39;,&#39;2018&#39;)

df = df[[&#39;Close&#39;]]
df[&#39;ma&#39;] = df.rolling(3).mean().shift(1)
df[&#39;action&#39;] = np.where(df[&#39;Close&#39;] &gt; df[&#39;ma&#39;], &#39;buy&#39;, &#39;sell&#39;)

df.iloc[-1,-1] = &#39;sell&#39;

cond1 = (df[&#39;action&#39;] == &#39;buy&#39;) &amp; (df[&#39;action&#39;].shift(1) == &#39;sell&#39;)
cond2 = (df[&#39;action&#39;] == &#39;sell&#39;) &amp; (df[&#39;action&#39;].shift(1) == &#39;buy&#39;)

df_buy = df[cond1].reset_index()
df_sell = df[cond2].reset_index()

df_result = pd.concat([df_buy,df_sell],axis=1)
df_result</code></pre><p><strong>3) 수익률 구하기</strong>
⇒ 먼저 Close라는 컬럼명을 다르게 수정해줘야 값을 고를 수 있겠죠!
⇒ 그리고 <code>수익률 = 판 값 / 산 값</code> 을 구합니다.</p>
<pre><code>df_buy = df[cond1].reset_index()
df_buy.columns = [&#39;날짜&#39;,&#39;종가(buy)&#39;,&#39;이평값&#39;,&#39;액션&#39;]

df_sell = df[cond2].reset_index()
df_sell.columns = [&#39;날짜&#39;,&#39;종가(sell)&#39;,&#39;이평값&#39;,&#39;액션&#39;]

df_result = pd.concat([df_buy,df_sell],axis=1)

df_result[&#39;수익률&#39;] = df_result[&#39;종가(sell)&#39;] / df_result[&#39;종가(buy)&#39;]

df_result</code></pre><hr>
<h3 id="수익률구하기3">&lt;수익률구하기3&gt;</h3>
<p><strong>수익률 계산하기</strong></p>
<blockquote>
<p>⇒ 누적 곱을 볼 수 있어요(마지막값 가져오기)**</p>
</blockquote>
<pre><code>df_result[[&#39;수익률&#39;]].cumprod().iloc[-1,-1]</code></pre><blockquote>
<p><strong>⇒ 1(원금)을 빼주고 100을 곱해줘야 수익률이겠죠!</strong></p>
</blockquote>
<pre><code>(df_result[[&#39;수익률&#39;]].cumprod().iloc[-1,-1] - 1)*100</code></pre><p><strong>함수로 만들기</strong></p>
<pre><code>def get_return(code,n):
  df = fdr.DataReader(code,&#39;2018&#39;)

  df = df[[&#39;Close&#39;]].copy()

  df[&#39;ma&#39;] = df.rolling(n).mean().shift(1)

  df[&#39;action&#39;] = np.where(df[&#39;Close&#39;] &gt; df[&#39;ma&#39;], &#39;buy&#39;, &#39;sell&#39;)

  df.iloc[-1,-1] = &#39;sell&#39;

  cond1 = (df[&#39;action&#39;] == &#39;buy&#39;) &amp; (df[&#39;action&#39;].shift(1) == &#39;sell&#39;)
  cond2 = (df[&#39;action&#39;] == &#39;sell&#39;) &amp; (df[&#39;action&#39;].shift(1) == &#39;buy&#39;)

  df_buy = df[cond1].reset_index()
  df_buy.columns = [&#39;날짜&#39;,&#39;종가(buy)&#39;,&#39;이평값&#39;,&#39;액션&#39;]

  df_sell = df[cond2].reset_index()
  df_sell.columns = [&#39;날짜&#39;,&#39;종가(sell)&#39;,&#39;이평값&#39;,&#39;액션&#39;]

  df_result = pd.concat([df_buy,df_sell],axis=1)

  df_result[&#39;수익률&#39;] = df_result[&#39;종가(sell)&#39;] / df_result[&#39;종가(buy)&#39;]

  return df_result[[&#39;수익률&#39;]].cumprod().iloc[-1,-1] - 1</code></pre><hr>
<h3 id="단기장기이평선-적용하기rolling의-숫자변경">&lt; 단기/장기이평선 적용하기:rolling의 숫자변경&gt;</h3>
<pre><code>def get_return_sl(code, short, long):
  df = fdr.DataReader(code,&#39;2018&#39;)

  df = df[[&#39;Close&#39;]].copy()

  df[&#39;ma1&#39;] = df[&#39;Close&#39;].rolling(short).mean().shift(1)
  df[&#39;ma2&#39;] = df[&#39;Close&#39;].rolling(long).mean().shift(1)

  df[&#39;action&#39;] = np.where(df[&#39;ma1&#39;] &gt; df[&#39;ma2&#39;], &#39;buy&#39;, &#39;sell&#39;)

  df.iloc[-1,-1] = &#39;sell&#39;

  cond1 = (df[&#39;action&#39;] == &#39;buy&#39;) &amp; (df[&#39;action&#39;].shift(1) == &#39;sell&#39;)
  cond2 = (df[&#39;action&#39;] == &#39;sell&#39;) &amp; (df[&#39;action&#39;].shift(1) == &#39;buy&#39;)

  df_buy = df[cond1].reset_index()
  df_buy.columns = [&#39;날짜&#39;,&#39;종가(buy)&#39;,&#39;이평값1&#39;,&#39;이평값2&#39;,&#39;액션&#39;]

  df_sell = df[cond2].reset_index()
  df_sell.columns = [&#39;날짜&#39;,&#39;종가(sell)&#39;,&#39;이평값1&#39;,&#39;이평값2&#39;,&#39;액션&#39;]

  df_result = pd.concat([df_buy,df_sell],axis=1)

  df_result[&#39;수익률&#39;] = df_result[&#39;종가(sell)&#39;] / df_result[&#39;종가(buy)&#39;]

  df_final = (df_result[[&#39;수익률&#39;]].cumprod().tail(1) - 1)*100
  df_final[&#39;단기&#39;] = short
  df_final[&#39;장기&#39;] = long

  return df_final</code></pre><h3 id="과제">#과제</h3>
<blockquote>
<p>한 종목에 대해 최적의 단기/장기이평선을 구해볼까요!
⇒ 단기 며칠 / 장기 며칠이 이 종목에 가장 적절한 전략일까요!
3일<del>10일 / 30일</del>60일</p>
</blockquote>
<p><strong>이중 반복문! for in range()</strong></p>
<pre><code>def get_return_sl(code, short, long):
  df = fdr.DataReader(code,&#39;2018&#39;)

  df = df[[&#39;Close&#39;]].copy()

  df[&#39;ma1&#39;] = df[&#39;Close&#39;].rolling(short).mean().shift(1)
  df[&#39;ma2&#39;] = df[&#39;Close&#39;].rolling(long).mean().shift(1)

  df[&#39;action&#39;] = np.where(df[&#39;ma1&#39;] &gt; df[&#39;ma2&#39;], &#39;buy&#39;, &#39;sell&#39;)

  df.iloc[-1,-1] = &#39;sell&#39;

  cond1 = (df[&#39;action&#39;] == &#39;buy&#39;) &amp; (df[&#39;action&#39;].shift(1) == &#39;sell&#39;)
  cond2 = (df[&#39;action&#39;] == &#39;sell&#39;) &amp; (df[&#39;action&#39;].shift(1) == &#39;buy&#39;)

  df_buy = df[cond1].reset_index()
  df_buy.columns = [&#39;날짜&#39;,&#39;종가(buy)&#39;,&#39;이평값1&#39;,&#39;이평값2&#39;,&#39;액션&#39;]

  df_sell = df[cond2].reset_index()
  df_sell.columns = [&#39;날짜&#39;,&#39;종가(sell)&#39;,&#39;이평값1&#39;,&#39;이평값2&#39;,&#39;액션&#39;]

  df_result = pd.concat([df_buy,df_sell],axis=1)

  df_result[&#39;수익률&#39;] = df_result[&#39;종가(sell)&#39;] / df_result[&#39;종가(buy)&#39;]

  df_final = (df_result[[&#39;수익률&#39;]].cumprod().tail(1) - 1)*100
  df_final[&#39;단기&#39;] = short
  df_final[&#39;장기&#39;] = long

  return df_final

--------------------------

dfs = []
for short in range(3,11):
  for long in range(30,61):
    df = get_return_sl(&#39;005930&#39;,short,long)
    dfs.append(df)

df_result = pd.concat(dfs)
df_result.sort_values(by=&#39;수익률&#39;, ascending=False)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[python3]]></title>
            <link>https://velog.io/@o__o/python3</link>
            <guid>https://velog.io/@o__o/python3</guid>
            <pubDate>Sun, 29 May 2022 12:03:57 GMT</pubDate>
            <description><![CDATA[<h3 id="openapi-란">OpenAPI 란?</h3>
<blockquote>
<p>데이터를 가져다 쓸 수 있게 서버의 ‘창구’를 열어둔 것!</p>
</blockquote>
<p>⇒ Dart Open API를 활용하면 공시 정보를 ‘데이터 분석’에 활용할 수 있어요.</p>
<p>⇒ 이제 일일이 공시자료를 보러가지 않아도, 분석을 할 수 있답니다!</p>
<p>⇒ 게다가, 이 모든 것을 쉽게 활용할 수 있게 만든 ‘라이브러리’까지. 🙂</p>
<h3 id="api란">API란?</h3>
<blockquote>
<p>서버에 접근하는 ‘창구’와 같은 것
<img src="https://velog.velcdn.com/images/o__o/post/475f2b3b-8288-4497-ae75-e9555fb18d37/image.png" alt=""></p>
</blockquote>
<p><strong>키는 왜 발급 받아야 할까?</strong>
: 은행에도 여러가지 데이터가 있지만, 우리는 ‘창구’를 활용해서 정해진 약속으로 정해진 데이터만 접근 할 수 있어요. 예) 입출금창구에 가서 주민등록증을 보여줘야 → 잔고를 확인할 수 있죠</p>
<blockquote>
<p>⇒ 누구에게나 열어둔 ‘창구’이기 때문에, 너무 많은 요청이 오면 서버가 매우 힘들겠죠!
⇒ 그래서 인 당 할당량을 정해서 ‘key’를 발급하는 것이랍니다. 요청할 때 이 것이 늘 필요하죠.</p>
</blockquote>
<p><strong>Dart OpenAPI 키 발급</strong></p>
<blockquote>
<p>:⇒ 인증키 신청을 누르고 정보를 입력하면, 누구나 쉽게 키를 발급 받을 수 있습니다.
⇒ API 사용 환경은 ‘웹, 앱 모두’로 해주시고, 사용용도는 ‘개인 공부’라고 적어주세요
<a href="https://opendart.fss.or.kr/uat/uia/egovLoginUsr.do">https://opendart.fss.or.kr/uat/uia/egovLoginUsr.do</a></p>
</blockquote>
<hr>
<h3 id="dart-라이브러리-활용">&lt;Dart 라이브러리 활용&gt;</h3>
<h3 id="dart-fss-라이브러리는">Dart-fss 라이브러리는?</h3>
<blockquote>
<p>Dart의 OpenAPI를 쉽게 사용할 수 있도록 만들어둔 코드입니다.
    ⇒ 라이브러리를 활용하면 복잡한 개발 가이드<a href="https://dart-fss.readthedocs.io/en/latest/">(링크)</a> 없이 데이터들을 얻을 수 있답니다.</p>
</blockquote>
<ul>
<li>dart-fss 깔고 전체 기업목록 불러오는 코드 (아래)</li>
</ul>
<pre><code>import dart_fss as dart_fss
import pandas as pd

api_key = &#39;여기에 API 키를 입력&#39;
dart_fss.set_api_key(api_key=api_key)

corp_list = dart_fss.get_corp_list()

corp_list.corps</code></pre><h3 id="종목-정리하기">&lt;종목 정리하기&gt;</h3>
<p><strong>전체 종목을 보는 코드</strong></p>
<pre><code>all = dart_fss.api.filings.get_corp_code()

all[0]</code></pre><p>*<em>df = pd.DataFrame(all) *</em>살펴보기</p>
<blockquote>
<p>: stock_code 가 있는 종목은 상장사, 없는 종목은 비상장사를 의미</p>
</blockquote>
<pre><code>df_listed = df[df[&#39;stock_code&#39;].notnull()]</code></pre><blockquote>
<p>.notnull(): none이 아니다!</p>
</blockquote>
<pre><code>df_non_listed = df[df[&#39;stock_code&#39;].isnull()]</code></pre><blockquote>
<p>.isnull(): none이다!</p>
</blockquote>
<h3 id="엑셀로-저장해두기">엑셀로 저장해두기</h3>
<blockquote>
<p>⇒ <code>.to_excel(&#39;파일명.xlsx&#39;)</code> 만 붙이면 엑셀로 만들어준답니다. 판다스의 힘!</p>
</blockquote>
<pre><code>df_listed.to_excel(&#39;상장종목.xlsx&#39;)

df_non_listed.to_excel(&#39;비상장종목.xlsx&#39;)</code></pre><hr>
<h3 id="dart-api-사용해보기">&lt;dart API 사용해보기&gt;</h3>
<p><strong>1) 한 개 종목을 정해서 코드를 찾기</strong></p>
<pre><code>corp_code = df_listed[df_listed[&#39;corp_name&#39;] == &#39;삼성전자&#39;].iloc[0,0]

corp_code
</code></pre><p><strong>2) dart api 를 사용해보기</strong></p>
<h3 id="사업보고서"><strong>&lt;사업보고서&gt;</strong></h3>
<blockquote>
<p>나온 정보중에 모르는것이 있다면?
dart open api사이트 - 개발가이드 - 공시정보 - 기업개황 바로가기 </p>
</blockquote>
<ol>
<li><p>기업 정보</p>
<pre><code>corp_code = df_listed[df_listed[&#39;corp_name&#39;] == &#39;카카오&#39;].iloc[0,0]
dart_fss.api.filings.get_corp_info(corp_code)</code></pre></li>
<li><p>미등기임원 보수 총액</p>
<pre><code>corp_code = df_listed[df_listed[&#39;corp_name&#39;] == &#39;카카오&#39;].iloc[0,0]
data = dart_fss.api.info.unrst_exctv_mendng_sttus(corp_code, &#39;2021&#39;, &#39;11011&#39;)
pd.DataFrame(data[&#39;list&#39;])</code></pre></li>
<li><p>증자(감자)현황</p>
<pre><code>corp_code = df_listed[df_listed[&#39;corp_name&#39;] == &#39;카카오&#39;].iloc[0,0]
data = dart_fss.api.info.irds_sttus(corp_code, &#39;2021&#39;, &#39;11011&#39;)
pd.DataFrame(data[&#39;list&#39;])</code></pre></li>
<li><p>배당 현황</p>
<pre><code>corp_code = df_listed[df_listed[&#39;corp_name&#39;] == &#39;카카오&#39;].iloc[0,0]
data = dart_fss.api.info.alot_matter(corp_code, &#39;2021&#39;, &#39;11011&#39;)
pd.DataFrame(data[&#39;list&#39;])</code></pre></li>
</ol>
<p>5.최대주주 현황</p>
<pre><code>
corp_code = df_listed[df_listed[&#39;corp_name&#39;] == &#39;카카오&#39;].iloc[0,0]
data = dart_fss.api.info.hyslr_sttus(corp_code, &#39;2021&#39;, &#39;11011&#39;)
pd.DataFrame(data[&#39;list&#39;])</code></pre><p>⇒ 최대주주 중 몇 명이 주식을 샀는지 / 팔았는지도 알 수 있겠군요!</p>
<pre><code>
pd.DataFrame(data[&#39;list&#39;])[[&#39;nm&#39;,&#39;bsis_posesn_stock_qota_rt&#39;,&#39;trmend_posesn_stock_qota_rt&#39;]]
</code></pre><ol start="6">
<li>임원 사항<pre><code>corp_code = df_listed[df_listed[&#39;corp_name&#39;] == &#39;카카오&#39;].iloc[0,0]
data = dart_fss.api.info.exctv_sttus(corp_code, &#39;2021&#39;, &#39;11011&#39;)
</code></pre></li>
</ol>
<p>pd.DataFrame(data[&#39;list&#39;])</p>
<pre><code>
7. 직원 현황</code></pre><p>corp_code = df_listed[df_listed[&#39;corp_name&#39;] == &#39;카카오&#39;].iloc[0,0]
data = dart_fss.api.info.emp_sttus(corp_code, &#39;2021&#39;, &#39;11011&#39;)</p>
<p>pd.DataFrame(data[&#39;list&#39;])</p>
<pre><code>
8. 이사 보수</code></pre><p>corp_code = df_listed[df_listed[&#39;corp_name&#39;] == &#39;카카오&#39;].iloc[0,0]
data = dart_fss.api.info.hmv_audit_indvdl_by_sttus(corp_code, &#39;2021&#39;, &#39;11011&#39;)</p>
<p>pd.DataFrame(data[&#39;list&#39;])</p>
<pre><code>
9. 연봉 top 5</code></pre><p>corp_code = df_listed[df_listed[&#39;corp_name&#39;] == &#39;카카오&#39;].iloc[0,0]
data = dart_fss.api.info.indvdl_by_pay(corp_code, &#39;2021&#39;, &#39;11011&#39;)</p>
<p>pd.DataFrame(data[&#39;list&#39;])</p>
<pre><code>
10. 타법인 출자 현황</code></pre><p>corp_code = df_listed[df_listed[&#39;corp_name&#39;] == &#39;카카오&#39;].iloc[0,0]
data = dart_fss.api.info.otr_cpr_invstmnt_sttus(corp_code, &#39;2021&#39;, &#39;11011&#39;)</p>
<p>pd.DataFrame(data[&#39;list&#39;])</p>
<pre><code>

### &lt;상장기업 재무정보&gt;

⇒ 재무제표의 3년 치 주요 정보</code></pre><p>corp_code = df_listed[df_listed[&#39;corp_name&#39;] == &#39;카카오&#39;].iloc[0,0]
data = dart_fss.api.finance.fnltt_singl_acnt(corp_code, &#39;2021&#39;, &#39;11011&#39;)</p>
<p>pd.DataFrame(data[&#39;list&#39;])</p>
<pre><code>
⇒ 모든 항목</code></pre><p>corp_code = df_listed[df_listed[&#39;corp_name&#39;] == &#39;카카오&#39;].iloc[0,0]
data = dart_fss.api.finance.fnltt_singl_acnt_all(corp_code, &#39;2021&#39;, &#39;11011&#39;, &#39;CFS&#39;)</p>
<p>pd.DataFrame(data[&#39;list&#39;])</p>
<pre><code>
&gt; * 참고: CFS:연결재무제표, OFS:재무제표

### &lt;지분공시 종합정보:주주정보&gt;

임원, 주요 주주 소유 보고</code></pre><p>corp_code = df_listed[df_listed[&#39;corp_name&#39;] == &#39;카카오&#39;].iloc[0,0]
data = dart_fss.api.shareholder.elestock(corp_code)</p>
<p>pd.DataFrame(data[&#39;list&#39;])</p>
<pre><code>
특정 사람</code></pre><p>corp_code = df_listed[df_listed[&#39;corp_name&#39;] == &#39;카카오&#39;].iloc[0,0]
data = dart_fss.api.shareholder.elestock(corp_code)</p>
<p>df_temp = pd.DataFrame(data[&#39;list&#39;])
df_temp[df_temp[&#39;repror&#39;] == &#39;김범수&#39;]</p>
<pre><code>
---------------------------
### &lt;상장종목 분석하기1:시총 Top 50 社 - 연봉왕 뽑아보기&gt;

1) 한 종목에 대해 뽑아보기</code></pre><p>corp_code = df_listed[df_listed[&#39;corp_name&#39;] == &#39;카카오&#39;].iloc[0,0]
print(corp_code)</p>
<p>def get_salary(name):
  corp_code = df_listed[df_listed[&#39;corp_name&#39;] == name].iloc[0,0]
  data = dart_fss.api.info.indvdl_by_pay(corp_code, &#39;2021&#39;, &#39;11011&#39;)</p>
<p>  df = pd.DataFrame(data[&#39;list&#39;])
  df = df[[&#39;corp_name&#39;,&#39;nm&#39;,&#39;ofcps&#39;,&#39;mendng_totamt&#39;]]
  df.columns = [&#39;기업명&#39;,&#39;이름&#39;,&#39;역할&#39;,&#39;보수&#39;]</p>
<p>#보수 내림차순 보기위해 숫자로 만드는 작업
  df[&#39;보수&#39;] = pd.to_numeric(df[&#39;보수&#39;].str.replace(&#39;,&#39;,&#39;&#39;))
  df = df.sort_values(by=&#39;보수&#39;,ascending=False)</p>
<p>  return df</p>
<pre><code>
&gt; #df.dtypes
해당부분 숫자인지(int64) 확인!

### 여러개 종목에 대해 뽑아보기</code></pre><p>names = [&#39;삼성전자&#39;,&#39;LG에너지솔루션&#39;,&#39;SK하이닉스&#39;,&#39;NAVER&#39;,&#39;삼성바이오로직스&#39;,&#39;삼성전자우&#39;,&#39;카카오&#39;,&#39;삼성SDI&#39;,&#39;현대차&#39;,&#39;LG화학&#39;,&#39;기아&#39;,&#39;POSCO홀딩스&#39;,&#39;KB금융&#39;,&#39;카카오뱅크&#39;,&#39;셀트리온&#39;,&#39;신한지주&#39;,&#39;삼성물산&#39;,&#39;현대모비스&#39;,&#39;SK이노베이션&#39;,&#39;LG전자&#39;,&#39;카카오페이&#39;,&#39;SK&#39;,&#39;한국전력&#39;,&#39;크래프톤&#39;,&#39;하나금융지주&#39;,&#39;LG생활건강&#39;,&#39;HMM&#39;,&#39;삼성생명&#39;,&#39;하이브&#39;,&#39;두산중공업&#39;,&#39;SK텔레콤&#39;,&#39;삼성전기&#39;,&#39;SK바이오사이언스&#39;,&#39;LG&#39;,&#39;S-Oil&#39;,&#39;고려아연&#39;,&#39;KT&amp;G&#39;,&#39;우리금융지주&#39;,&#39;대한항공&#39;,&#39;삼성에스디에스&#39;,&#39;현대중공업&#39;,&#39;엔씨소프트&#39;,&#39;삼성화재&#39;,&#39;아모레퍼시픽&#39;,&#39;KT&#39;,&#39;포스코케미칼&#39;,&#39;넷마블&#39;,&#39;SK아이이테크놀로지&#39;,&#39;LG이노텍&#39;,&#39;기업은행&#39;]</p>
<p>dfs = []</p>
<p>for name in names:
  try:
    df = get_salary(name)
    dfs.append(df)
  except:
    print(f&#39;error - {name}&#39;)</p>
<p>#합치기 concat!
df_result = pd.concat(dfs)
df_result.sort_values(by=&#39;보수&#39;,ascending=False)</p>
<p>df_result.sort_values(by=&#39;보수&#39;,ascending=False).head(30)</p>
<pre><code>
### &lt;상장종목 분석하기2:최대 주주의 주식 변동 모아보기&gt;
</code></pre><p>def get_shareholders(corp_code):
  data = dart_fss.api.info.hyslr_sttus(corp_code, &#39;2021&#39;, &#39;11011&#39;)
  df = pd.DataFrame(data[&#39;list&#39;])</p>
<p>  df = df[[&#39;corp_name&#39;,&#39;nm&#39;,&#39;relate&#39;,&#39;bsis_posesn_stock_qota_rt&#39;,&#39;trmend_posesn_stock_qota_rt&#39;,&#39;rm&#39;]]
  df.columns = [&#39;회사명&#39;,&#39;이름&#39;,&#39;관계&#39;,&#39;기초지분율&#39;,&#39;기말지분율&#39;,&#39;비고&#39;]</p>
<p>  df = df[df[&#39;관계&#39;].notnull()]</p>
<p>  df[&#39;기초지분율&#39;] = pd.to_numeric(df[&#39;기초지분율&#39;])
  df[&#39;기말지분율&#39;] = pd.to_numeric(df[&#39;기말지분율&#39;])</p>
<p>  return df.sort_values(by=&#39;기초지분율&#39;,ascending=False).head(3)</p>
<pre><code>
### * 상장 종목 중 10개만 추려내기
&gt; ⇒ 하루에 쓸 수 있는 콜 수가 정해져 있답니다.
10개종목 추려서df_listed.sample(10) 증감 큰 순서대로 정렬하기
</code></pre><p>corp_codes = list(df_listed.sample(10)[&#39;corp_code&#39;])</p>
<p>dfs = []
for corp_code in corp_codes:
  try:
    df = get_shareholders(corp_code)
    dfs.append(df)
  except:
    print(f&#39;error - {corp_code}&#39;)</p>
<p>df_result = pd.concat(dfs)</p>
<p>df_result[&#39;증감&#39;] = df_result[&#39;기말지분율&#39;] - df_result[&#39;기초지분율&#39;]</p>
<p>df_result.sort_values(by=&#39;증감&#39;,ascending=False)</p>
<pre><code>--------------------------
### &lt;상장 종목 분석하기3: &#39;돈 많이 번 회사’를 찾기; 이익잉여금 많아진 회사&gt;
</code></pre><p>def get_profit(name):
  corp_code = df_listed[df_listed[&#39;corp_name&#39;] == name].iloc[0,0]
  data = dart_fss.api.finance.fnltt_singl_acnt(corp_code, &#39;2021&#39;, &#39;11011&#39;)
  df = pd.DataFrame(data[&#39;list&#39;])</p>
<p>  cond = (df[&#39;fs_div&#39;] == &#39;CFS&#39;) &amp; (df[&#39;account_nm&#39;] == &#39;이익잉여금&#39;)
  df = df[cond]</p>
<p>  df[&#39;name&#39;] = name</p>
<p>  df = df[[&#39;name&#39;,&#39;thstrm_amount&#39;,&#39;frmtrm_amount&#39;]]
  df.columns = [&#39;기업명&#39;,&#39;당기&#39;,&#39;전기&#39;]</p>
<p>  df[&#39;당기&#39;] = pd.to_numeric(df[&#39;당기&#39;].str.replace(&#39;,&#39;,&#39;&#39;))
  df[&#39;전기&#39;] = pd.to_numeric(df[&#39;전기&#39;].str.replace(&#39;,&#39;,&#39;&#39;))</p>
<p>  df[&#39;증감&#39;] = df[&#39;당기&#39;] - df[&#39;전기&#39;]
  df[&#39;증감율&#39;] = abs(df[&#39;증감&#39;])/abs(df[&#39;전기&#39;])
  return df</p>
<pre><code>
&gt; #절대값: abs


### 상장사 10개</code></pre><p>names = list(df_listed.sample(10)[&#39;corp_name&#39;])</p>
<p>dfs = []
for name in names:
  try:
    df = get_profit(name)
    dfs.append(df)
  except:
    print(f&#39;error - {name}&#39;)</p>
<p>df_result = pd.concat(dfs)
df_result.sort_values(by=&#39;증감율&#39;, ascending=False)
df_result</p>
<pre><code>### &lt;비상장 종목 분석하기: 배당항목으로 당기순이익 확인&gt;
: 비상장 종목은 ‘사업보고서 주요정보’만 분석할 수 있어요**
</code></pre><p>def get_earning(name):
  corp_code = df_non_listed[df_non_listed[&#39;corp_name&#39;] == name].iloc[0,0]
  data = dart_fss.api.info.alot_matter(corp_code, &#39;2021&#39;, &#39;11011&#39;)
  df = pd.DataFrame(data[&#39;list&#39;])</p>
<p>  df = df[df[&#39;se&#39;] == &#39;(연결)당기순이익(백만원)&#39;]
  df = df[[&#39;corp_name&#39;,&#39;thstrm&#39;,&#39;frmtrm&#39;,&#39;lwfr&#39;]]
  df.columns = [&#39;기업명&#39;,&#39;2021&#39;,&#39;2020&#39;,&#39;2019&#39;]</p>
<p>  df[&#39;2021&#39;] = pd.to_numeric(df[&#39;2021&#39;].str.replace(&#39;,&#39;,&#39;&#39;))
  df[&#39;2020&#39;] = pd.to_numeric(df[&#39;2020&#39;].str.replace(&#39;,&#39;,&#39;&#39;))
  df[&#39;2019&#39;] = pd.to_numeric(df[&#39;2019&#39;].str.replace(&#39;,&#39;,&#39;&#39;))</p>
<p>  return df</p>
<pre><code>
# 과제
</code></pre><p>def get_salary(name):
  corp_code = df_listed[df_listed[&#39;corp_name&#39;] == name].iloc[0,0]
  data = dart_fss.api.info.emp_sttus(corp_code, &#39;2021&#39;, &#39;11011&#39;)</p>
<p>  df = pd.DataFrame(data[&#39;list&#39;])
  df = df[[&#39;corp_name&#39;,&#39;sexdstn&#39;,&#39;jan_salary_am&#39;]]</p>
<p>  df_result = pd.DataFrame()
  doc = {
      &#39;기업명&#39;: name,
      &#39;연봉(남)&#39;:df[df[&#39;sexdstn&#39;] == &#39;남&#39;].iloc[-1,-1],
      &#39;연봉(여)&#39;:df[df[&#39;sexdstn&#39;] == &#39;여&#39;].iloc[-1,-1]
  }
  df_result = df_result.append(doc, ignore_index=True)</p>
<p>  df_result[&#39;연봉(남)&#39;] = pd.to_numeric(df_result[&#39;연봉(남)&#39;].str.replace(&#39;,&#39;,&#39;&#39;))
  df_result[&#39;연봉(여)&#39;] = pd.to_numeric(df_result[&#39;연봉(여)&#39;].str.replace(&#39;,&#39;,&#39;&#39;))
  df_result[&#39;차이(남-여)&#39;] = df_result[&#39;연봉(남)&#39;] - df_result[&#39;연봉(여)&#39;]
  df_result[&#39;평균&#39;] = (df_result[&#39;연봉(남)&#39;]+df_result[&#39;연봉(여)&#39;])/2</p>
<p>  return df_result</p>
<p>#-----------------------------------</p>
<p>corp_codes = list(df_listed.sample(10)[&#39;corp_name&#39;])</p>
<p>dfs = []
for corp_code in corp_codes:
  try:
    df = get_salary(corp_code)
    dfs.append(df)
  except:
    print(f&#39;error - {corp_code}&#39;)</p>
<p>df_result = pd.concat(dfs)
df_result.sort_values(by=&quot;차이(남-여)&quot;,ascending=True)
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[python2]]></title>
            <link>https://velog.io/@o__o/python2</link>
            <guid>https://velog.io/@o__o/python2</guid>
            <pubDate>Fri, 20 May 2022 13:41:07 GMT</pubDate>
            <description><![CDATA[<h3 id="pandas-판다스"><strong>&lt;Pandas 판다스&gt;</strong></h3>
<p>: 파이썬에서 데이터를 쉽게 다룰 수 있게 해주는 라이브러리 / 데이터분석 필수사항</p>
<pre><code>import pandas as pd
import numpy as np</code></pre><p>: 판다스의 DataFrame 형식을 이용하면 표 형태로 데이터를 볼 수 있다
<strong>⇒ DataFrame은 “딕셔너리” 형태로 표현된 데이터를 표로 바꿔주는 역할
⇒ 맨 왼쪽은 “index”</strong></p>
<pre><code>data = {
    &#39;name&#39; : [&#39;영수&#39;,&#39;철수&#39;,&#39;영희&#39;,&#39;소희&#39;],
    &#39;age&#39; : [20,15,38,8]
}

df = pd.DataFrame(data)</code></pre><h3 id="dataframe-기초"><strong>&lt;Dataframe 기초&gt;</strong></h3>
<p><strong>1) 행 추가 (ignore_index=True 해야 밑에추가됨)</strong></p>
<pre><code>doc = {
    &#39;name&#39;:&#39;세종&#39;,
    &#39;age&#39;:14,
}
df = df.append(doc,ignore_index=True)</code></pre><p><strong>2) column 추가</strong></p>
<pre><code>df[&#39;city&#39;] = [&#39;서울&#39;,&#39;부산&#39;,&#39;부산&#39;,&#39;서울&#39;,&#39;서울&#39;]</code></pre><p><strong>3) 특정 column 뽑기
⇒ 대괄호를 두번 해야 dataframe형식으로 반환된다!</strong></p>
<pre><code>df[[&#39;name&#39;,&#39;city&#39;]]
</code></pre><p><strong>4) 원하는 조건 행 뽑기</strong></p>
<pre><code>df[df[&#39;age&#39;] &lt; 20]</code></pre><p><strong>5) 특정 행에서 뽑기(많이 사용!)</strong></p>
<pre><code>df.iloc[-1,0] # 마지막 행의 0번째 정보
df.iloc[0,0] # 첫 행의 0번째 정보</code></pre><h3 id="dataframe-연산"><strong>&lt;Dataframe 연산&gt;</strong></h3>
<p><strong>1) 열 정렬(나이로 ascending오름차순)</strong></p>
<pre><code>df.sort_values(by=&#39;age&#39;,ascending=True)</code></pre><p><strong>2) 조건맞는 열 추가
⇒ 조건에 맞는 데이터 넣을때 numpy를 쓴다!</strong></p>
<pre><code>df[&#39;is_adult&#39;] = np.where(df[&#39;age&#39;] &gt; 20,&#39;성인&#39;,&#39;청소년&#39;)</code></pre><p><strong>3) 평균/최대값/최소값/개수</strong></p>
<pre><code>df[&#39;age&#39;].mean()

df[&#39;age&#39;].max()

df[&#39;age&#39;].min()

df[&#39;age&#39;].count()</code></pre><h4 id="⇒-요약"><strong>⇒ 요약</strong></h4>
<pre><code>df[&#39;age&#39;].describe()</code></pre><p><strong>4) 퀴즈-서울사는사람중 나이가장많은사람은 몇살?</strong></p>
<pre><code>df[df[&#39;city&#39;] == &#39;서울&#39;][&#39;age&#39;].max()

df[df[&#39;city&#39;] == &#39;서울&#39;].sort_values(by=&#39;age&#39;,ascending=False).iloc[0,1]</code></pre><hr>
<h3 id="엑셀-가져와서-dataframe으로-읽기">&lt;엑셀 가져와서 dataframe으로 읽기&gt;</h3>
<pre><code>pd.read_excel(&#39;종목데이터.xlsx&#39;)
df = pd.read_excel(&#39;종목데이터.xlsx&#39;)</code></pre><h4 id="일부만-보기"><strong>&lt;일부만 보기&gt;</strong></h4>
<ul>
<li>처음5개 df.head() <ul>
<li>끝5개 df.tail() </li>
<li>처음20개 df.head(20)</li>
<li>끝20개 df.tail(20)</li>
</ul>
</li>
</ul>
<ul>
<li>소수점 둘째자리까지 보기<pre><code>pd.options.display.float_format = &#39;{:.2f}&#39;.format</code></pre></li>
</ul>
<hr>
<h3 id="pandas-실전">&lt;Pandas 실전&gt;</h3>
<p><strong>1) 어제 오른 종목들만 골라보기</strong></p>
<pre><code>df[df[&#39;change_rate&#39;] &gt; 0]</code></pre><p><strong>2) per가 0 인 종목들을 제거하기</strong></p>
<pre><code>df = df[df[&#39;per&#39;] &gt; 0]</code></pre><p>**
3) 순이익, 종가를 추가하기
<em>⇒ per = 시가총액/이익 = 주가/주당순이익</em>**</p>
<pre><code>df[&#39;earning&#39;] = df[&#39;marketcap&#39;] / df[&#39;per&#39;]
df[&#39;close&#39;] = df[&#39;per&#39;] * df[&#39;eps&#39;]</code></pre><p><strong>4) date 컬럼을 없애기</strong></p>
<pre><code>del df[&#39;date&#39;]</code></pre><p><strong>5) pbr &lt; 1 &amp; 시총 1조 이상 &amp; per &lt; 20 을 추려보기</strong></p>
<pre><code>cond = (df[&#39;marketcap&#39;] &gt; 1000000000000) &amp; (df[&#39;pbr&#39;] &lt; 1) &amp; (df[&#39;per&#39;] &lt; 20)
df[cond]
</code></pre><p><strong>⇒ 시총이 큰 순서대로 보기</strong></p>
<pre><code>df[cond].sort_values(by=&#39;marketcap&#39;, ascending=False)</code></pre><p><strong>⇒ 평균, 표준편차 등의 정보를 보기 (함께하기)</strong></p>
<pre><code>df[cond].describe()</code></pre><hr>
<h3 id="yfinanceyahoo-finance를-통해-해외주식-분석">&lt;yfinance:yahoo finance를 통해 해외주식 분석&gt;</h3>
<pre><code>!pip install yfinance</code></pre><p>⇒ !느낌표 꼭 붙여주기</p>
<pre><code>import yfinance as yf</code></pre><h3 id="기업-정보-보기">&lt;기업 정보 보기&gt;</h3>
<pre><code>company = yf.Ticker(&#39;TSLA&#39;)
company.info</code></pre><h3 id="yfinance-사용법">&lt;yfinance 사용법&gt;</h3>
<p><strong>* 전체 사용법 :</strong> <a href="https://pypi.org/project/yfinance/">https://pypi.org/project/yfinance/</a></p>
<p><strong>1) 기본 정보 얻기(예) 회사명, 산업, 시가총액, 매출)</strong></p>
<pre><code>name = company.info[&#39;shortName&#39;]
industry = company.info[&#39;industry&#39;]
marketcap = company.info[&#39;marketCap&#39;]
revenue = company.info[&#39;totalRevenue&#39;]</code></pre><pre><code>print(name,industry,marketcap,revenue)</code></pre><p><strong>2) 재무제표에서 3년치 데이터 얻기(대차대조표, 현금흐름표, 기업 실적)</strong></p>
<pre><code>company.balance_sheet

company.cashflow

company.earnings</code></pre><p><strong>3) 그 외 정보(주주정보, 애널리스트 추천 등)</strong></p>
<pre><code>company.institutional_holders

company.recommendations

company.calendar

news = company.news

for n in news:
  print(n[&#39;title&#39;])</code></pre><h3 id="yahoo-finance"><strong>yahoo finance</strong></h3>
<ul>
<li>52주 change / 주소 / beta값 / current price(현재가) / Earning / freeCashflow / trailingPE(PER) / Name / Business Summary / Zip code</li>
</ul>
<p>: yahoo finance UI와 코드상 항목별name과 상이해서 잘 비교해서 분석해야한다.</p>
<h3 id="yahoo-finance둘러보기"><strong>yahoo finance둘러보기</strong></h3>
<p>cash index만 df형태로 보기 : </p>
<pre><code>company.balance_sheet.loc[[&#39;Cash&#39;]]</code></pre><p>jpMorgan의 recommendations만 필터링해서 정보 보기</p>
<pre><code>
df = company.recommendations
cond = df[&#39;Firm&#39;] == &#39;JP Morgam&#39;
df[cond]</code></pre><hr>
<h3 id="분석-전략-세우기---데이터-모으기---모은-데이터-분석하기">&lt;분석: 전략 세우기 - 데이터 모으기 - 모은 데이터 분석하기&gt;</h3>
<h3 id="1-전략-세우기">&lt;1. 전략 세우기&gt;</h3>
<ul>
<li>종목코드 ⇒ code</li>
<li>회사명 ⇒ company.info[’shortName’]</li>
<li>산업 ⇒ company.info[’industry’]</li>
<li>설명 ⇒ company.info[’longBusinessSummary’]</li>
<li>시가총액 ⇒ company.info[’marketCap’]</li>
<li>현재 주가 ⇒ company.info[’currentPrice’]</li>
<li>1년 후 예상 주가 ⇒ company.info[’targetMeanPrice’]</li>
<li>PER ⇒ company.info[’trailingPE’]</li>
<li>EPS ⇒ company.info[’trailingEps’]</li>
<li>PBR ⇒ company.info[’priceToBook’]</li>
<li>매출 (3년치) ⇒ company.earnings ⇒ 3년 치 가져오기</li>
<li>순이익 (3년치) ⇒ company.earnings ⇒ 3년 치 가져오기</li>
<li>뉴스 ⇒ company.news ⇒ 최근 뉴스 1개 가져오기</li>
</ul>
<pre><code>company = yf.Ticker(&#39;TSLA&#39;)

code = &#39;TSLA&#39;
name = company.info[&#39;shortName&#39;]
industry = company.info[&#39;industry&#39;]
marketcap = company.info[&#39;marketCap&#39;]
summary = company.info[&#39;longBusinessSummary&#39;]
currentprice = company.info[&#39;currentPrice&#39;]
targetprice = company.info[&#39;targetMeanPrice&#39;]

per = company.info[&#39;trailingPE&#39;]
eps = company.info[&#39;trailingEps&#39;]
pbr = company.info[&#39;priceToBook&#39;]

print(code,name,industry,marketcap,summary,
currentprice,targetprice,per,eps,pbr)</code></pre><p><strong>⇒ 최근 3년 매출, 순이익 더하기</strong></p>
<pre><code>rev2021 = company.earnings.iloc[-1,0]
rev2020 = company.earnings.iloc[-2,0]
rev2019 = company.earnings.iloc[-3,0]

ear2021 = company.earnings.iloc[-1,1]
ear2020 = company.earnings.iloc[-2,1]
ear2019 = company.earnings.iloc[-3,1]</code></pre><h3 id="2-데이터-모으기">&lt;2. 데이터 모으기&gt;</h3>
<blockquote>
<p>데이터를 모을 빈 DataFrame 만들기
정보 모아서 딕셔너리 변환
딕셔너리 형태로 append </p>
</blockquote>
<pre><code>doc = {
    &#39;code&#39;:code,
    &#39;name&#39;:name,
    &#39;industry&#39;:industry,
    &#39;bussiness&#39;:bussiness,
    &#39;marketCap&#39;:marketCap/1000,
    &#39;currentPrice&#39;:currentPrice,
    &#39;targetPrice&#39;:targetPrice,
    &#39;per&#39;:per,
    &#39;eps&#39;:eps,
    &#39;pbr&#39;:pbr,
    &#39;news&#39;:news,
    &#39;rev2021&#39;:rev2021/1000,
    &#39;rev2020&#39;:rev2020/1000,
    &#39;rev2019&#39;:rev2019/1000,
    &#39;ear2021&#39;:ear2021/1000,
    &#39;ear2020&#39;:ear2020/1000,
    &#39;ear2019&#39;:ear2019/1000,
}

df.append(doc,ignore_index = True)</code></pre><blockquote>
<p>전체 데이터 모으는 함수!</p>
</blockquote>
<pre><code>def add_company(code):
  company = yf.Ticker(code)
  name = company.info[&#39;shortName&#39;]
  industry = company.info[&#39;industry&#39;]
  bussiness = company.info[&#39;longBusinessSummary&#39;]
  marketCap= company.info[&#39;marketCap&#39;]
  currentPrice= company.info[&#39;currentPrice&#39;]
  targetPrice= company.info[&#39;targetMeanPrice&#39;]
  per = company.info[&#39;forwardPE&#39;]
  eps = company.info[&#39;forwardEps&#39;]
  pbr = company.info[&#39;priceToBook&#39;]
  rev2021 = company.earnings.iloc[-1,0]
  rev2020 = company.earnings.iloc[-2,0]
  rev2019 = company.earnings.iloc[-3,0]
  ear2021 = company.earnings.iloc[-1,1]
  ear2020 = company.earnings.iloc[-2,1]
  ear2019 = company.earnings.iloc[-3,1]

  doc = {
    &#39;code&#39;:code,
    &#39;name&#39;:name,
    &#39;industry&#39;:industry,
    &#39;bussiness&#39;:bussiness,
    &#39;marketCap&#39;:marketCap/1000,
    &#39;currentPrice&#39;:currentPrice,
    &#39;targetPrice&#39;:targetPrice,
    &#39;per&#39;:per,
    &#39;eps&#39;:eps,
    &#39;pbr&#39;:pbr,
    &#39;rev2021&#39;:rev2021/1000,
    &#39;rev2020&#39;:rev2020/1000,
    &#39;rev2019&#39;:rev2019/1000,
    &#39;ear2021&#39;:ear2021/1000,
    &#39;ear2020&#39;:ear2020/1000,
    &#39;ear2019&#39;:ear2019/1000,
  }
  return doc
</code></pre><p><strong>분석하기2</strong></p>
<pre><code>df = pd.DataFrame()

codes = [&#39;AAPL&#39;,&#39;ABNB&#39;,&#39;BIDU&#39;,&#39;FB&#39;,&#39;GOOG&#39;,&#39;MSFT&#39;,&#39;TSLA&#39;,&#39;PYPL&#39;,&#39;NFLX&#39;,&#39;NVDA&#39;]

for code in codes:
  print(code)
    row = add_company(code)
    df = df.append(row, ignore_index = True)

df</code></pre><p>이렇게만 입력하면 에러뜨는데, 특정 코드에 데이터가 없는 경우 에러가 뜸.
=&gt; 에러처리 해줘야함 (아래 코드) : <strong><em>try except 구문!</em></strong></p>
<pre><code>df = pd.DataFrame()

codes = [&#39;AAPL&#39;,&#39;ABNB&#39;,&#39;BIDU&#39;,&#39;FB&#39;,&#39;GOOG&#39;,&#39;MSFT&#39;,&#39;TSLA&#39;,&#39;PYPL&#39;,&#39;NFLX&#39;,&#39;NVDA&#39;]

for code in codes:
  print(code)
  try:
    row = add_company(code)
    df = df.append(row, ignore_index = True)
  except:
    print(f&#39;error - {code}&#39;)

df</code></pre><h3 id="3-모은-데이터-분석하기">&lt;3. 모은 데이터 분석하기&gt;</h3>
<p>:  관심 종목을 매일 자동으로 모아서, 분석하고 결과까지 내어줄 수 있다!</p>
<p><strong>1) eps 순서대로 정렬해보기</strong></p>
<pre><code>df.sort_values(by=&#39;eps&#39;,ascending=False)</code></pre><p><strong>2) 특정 per 이하만 보기</strong></p>
<pre><code>df[df[&#39;per&#39;] &lt; 30].sort_values(by=&#39;per&#39;,ascending=False)
</code></pre><p><strong>3) 현재가격 - 1년 후 가격의 비율 차이가 큰 종목들을 추려내기</strong></p>
<pre><code>df[[&#39;code&#39;,&#39;name&#39;,&#39;currentPrice&#39;,&#39;targetPrice&#39;]]

new_df = df[[&#39;code&#39;,&#39;name&#39;,&#39;currentPrice&#39;,&#39;targetPrice&#39;]].copy()
new_df[&#39;gap&#39;] = new_df[&#39;targetPrice&#39;] / new_df[&#39;currentPrice&#39;] -1
new_df.sort_values(by=&#39;gap&#39;,ascending=False)</code></pre><p><strong>4) 3년 연속 순수익이 오른 기업을 표기하기</strong></p>
<pre><code>import numpy as np
new_df2 = df[[&#39;code&#39;,&#39;name&#39;,&#39;ear2021&#39;,&#39;ear2020&#39;,&#39;ear2019&#39;]].copy()

cond = (new_df2[&#39;ear2021&#39;] &gt; new_df2[&#39;ear2020&#39;]) &amp; (new_df2[&#39;ear2020&#39;] &gt; new_df2[&#39;ear2019&#39;])

new_df2[&#39;is_target&#39;] = np.where(cond,&#39;O&#39;,&#39;X&#39;)

new_df2[new_df2[&#39;is_target&#39;] == &#39;O&#39;]</code></pre><h3 id="분석하기3"><strong>분석하기3</strong></h3>
<p>현재가격 - 1년 후 가격의 비율 차이가 큰 종목들을 추려내기</p>
<pre><code>new_df[&#39;gap&#39;] = new_df[&#39;targetPrice&#39;] / new_df[&#39;currentPrice&#39;] -1</code></pre><ul>
<li><p>new_df = df[[&#39;code&#39;,&#39;name&#39;,&#39;currentPrice&#39;,&#39;targetPrice&#39;]].copy()
원본 필터링 후 조작하려면 _*<em>.copy() *</em>_추가해주기!</p>
<p><strong>ox 표기할 열 만들기</strong></p>
<pre><code>new_df[&#39;is_target&#39;] = np.where(cond,&#39;O&#39;,&#39;X&#39;)</code></pre></li>
</ul>
<p><strong>index 숫자찍히도록 0부터시작 초기화(?)</strong></p>
<pre><code>df.reset_index(drop=True)</code></pre><hr>
<h3 id="-과제"># 과제</h3>
<pre><code>#소수점 둘째자리까지 표기하기
pd.options.display.float_format = &#39;{:.2f}&#39;.format

#과제
company = yf.Ticker(&#39;AAPL&#39;)

df = company.balance_sheet.loc[[&#39;Cash&#39;]]
df.columns = [&#39;2021&#39;,&#39;2020&#39;,&#39;2019&#39;,&#39;2018&#39;]
df[&#39;name&#39;] = company.info[&#39;shortName&#39;]

new_df =  df[[&#39;name&#39;,&#39;2021&#39;,&#39;2020&#39;]].copy()
new_df[&#39;diff&#39;] = new_df[&#39;2021&#39;] - new_df[&#39;2020&#39;]

new_df.reset_index(drop=True)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[python1]]></title>
            <link>https://velog.io/@o__o/python1</link>
            <guid>https://velog.io/@o__o/python1</guid>
            <pubDate>Sun, 15 May 2022 14:44:39 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>**&lt;구글 Colab 이란?&gt; **
: 온라인에서 파이썬 데이터분석을 학습할 수 있는 환경!</p>
</blockquote>
<p>(실행: ctrl Enter)
(1) 내 컴퓨터에 파이썬을 설치 할 필요 없고, 
(2) 인터넷만 되면 어디서든 접근 가능하고, 
(3)내 컴퓨터보다 빠르답니다!</p>
<blockquote>
<p><strong>&lt;파이썬&gt;</strong>
: 가장 직관적인 문법을 가진 언어!</p>
</blockquote>
<h3 id="1-변수--기본연산"><em><strong>1) 변수 &amp; 기본연산</strong></em></h3>
<p>  ⇒ 변수(숫자,문자): 값을 담아두는 박스</p>
<pre><code>a = 3      # 3을 a에 넣는다
b = a      # a를 b에 넣는다
a = a + 1  # a+1을 다시 a에 넣는다
num1 = a*b # a*b의 값을 num1이라는 변수에 넣는다
num2 = 99 # 99의 값을 num2이라는 변수에 넣는다</code></pre><blockquote>
<p>[자료형] 숫자, 문자 말고도..
여러가지 문자열들이 순서에 의해 묶여있는 list!</p>
</blockquote>
<h3 id="2-리스트-딕셔너리-형"><strong><em>2) 리스트, 딕셔너리 형</em></strong></h3>
<blockquote>
<p> ⇒ 리스트 형 : 순서가 중요!</p>
</blockquote>
<pre><code>a_list = [&#39;사과&#39;,&#39;배&#39;,&#39;감&#39;,&#39;수박&#39;]</code></pre><blockquote>
<p> ⇒ Dictionary 형 : { key : value } 형태가 중요!</p>
</blockquote>
<pre><code>a_dict = {&#39;name&#39;:&#39;bob&#39;,&#39;age&#39;:21}
요소 추가 a_dict[&#39;height&#39;] = 178 </code></pre><blockquote>
<p> ⇒ Dictionary 형과 List 형의 조합</p>
</blockquote>
<pre><code>people = [{&#39;name&#39;:&#39;bob&#39;,&#39;age&#39;:20},{&#39;name&#39;:&#39;carry&#39;,&#39;age&#39;:38}]</code></pre><ul>
<li>people[0][&#39;name&#39;]의 값은? &#39;bob&#39;</li>
<li>people[1][&#39;name&#39;]의 값은? &#39;carry&#39;</li>
</ul>
<pre><code>person = {&#39;name&#39;:&#39;john&#39;,&#39;age&#39;:7}
people.append(person)</code></pre><ul>
<li>people의 값은? [{&#39;name&#39;:&#39;bob&#39;,&#39;age&#39;:20},{&#39;name&#39;:&#39;carry&#39;,&#39;age&#39;:38},{&#39;name&#39;:&#39;john&#39;,&#39;age&#39;:7}]</li>
<li>people[2][&#39;name&#39;]의 값은? &#39;john&#39;</li>
</ul>
<h3 id="3-함수"><em><strong>3) 함수</strong></em></h3>
<p> ⇒ 수학에서의 함수와 살짝 다르답니다! 
 ⇒ 프로그래밍에선 정해진 일을 하게끔! </p>
<p><strong>파이썬에서 def 콜론 엔터친다음에 들여쓰기가 중요!</strong></p>
<pre><code>def f(x):
    return 2*x+3

result = f(2)
result? 7</code></pre><h3 id="4-조건문"><em><strong>4) 조건문</strong></em></h3>
<blockquote>
<p> if:/else:
 ⇒ 무엇을 하라라는 꾸러미가 있다면 들여쓰기를 해라!(함수처럼)</p>
</blockquote>
<pre><code></code></pre><pre><code>def is_adult(age):
  if age &gt; 20:
        print(&#39;성인&#39;)
  else:
        print(&#39;청소년&#39;)</code></pre><pre><code>
is_adult(30)</code></pre><h3 id="5-반복문"><em><strong>5) 반복문</strong></em></h3>
<blockquote>
<p> ⇒ ★반복문은 항상 list 꺼내서 함께쓴다</p>
</blockquote>
<pre><code>a_list = [&#39;사과&#39;,&#39;배&#39;,&#39;감&#39;,&#39;귤&#39;]

for a in a_list:
  print(a)</code></pre><p>** ⇒ 조건문 + 함수 + 반복문을 한번에 사용해보기
 (4번 조건문 함수와 함께 적용한다면,)**</p>
<pre><code>ages = [20,30,15,5,10]

for age in ages:
    is_adult(age)</code></pre><hr>
<h2 id="스크래핑-실습-업무자동화1"><strong>&lt;스크래핑 실습: 업무자동화1&gt;</strong></h2>
<ul>
<li>웹스크래핑<blockquote>
<ul>
<li>웹페이지의 동작 방식
:URL을 넣고 엔터를 치면 → 정보를 가져와서 → 보여주는 게 브라우저의 역할!
:HTML 이라고 하는 “뼈대”로 구성</li>
</ul>
</blockquote>
</li>
</ul>
<h3 id="크롤링-기본-코드"><strong>&lt;크롤링 기본 코드&gt;</strong></h3>
<blockquote>
<p><strong>⇒ requests *<em>로 정보를 가져와서 *</em>(enter 치는 라이브러리)
→ BeautifulSoup</strong>으로 분석하기 좋게! 만드는 것이랍니다.<strong>(잘 솎아내는 라이브러리)</strong></p>
</blockquote>
<pre><code>import requests
from bs4 import BeautifulSoup

headers = {&#39;User-Agent&#39; : &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36&#39;}
data = requests.get(&#39;https://search.naver.com/search.naver?where=news&amp;ie=utf8&amp;sm=nws_hty&amp;query=삼성전자&#39;,headers=headers)

soup = BeautifulSoup(data.text, &#39;html.parser&#39;)</code></pre><p><strong>⇒ select_one **과,</strong> select <strong>만 기억하면 됩니다!</strong>
→ html태그 안에 있는 요소들 불러오는 것!**</p>
<pre><code>a = soup.select_one(&#39;#sp_nws1 &gt; div.news_wrap.api_ani_send &gt; div &gt; a&#39;)
a[&#39;href&#39;]
a.text</code></pre><h2 id="스크래핑-실습-업무자동화2">&lt;스크래핑 실습: 업무자동화2&gt;</h2>
<p>(colab 칸 지우기: ctrl m+d)</p>
<blockquote>
<p>⇒ requests.get(f. 하고 {중괄호부분에 keyword},)
→ get_news(keyword) 하면 스크래핑 됨!</p>
</blockquote>
<pre><code>def get_news(keyword):
  headers = {&#39;User-Agent&#39; : &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36&#39;}
  data = requests.get(f&#39;https://search.naver.com/search.naver?where=news&amp;ie=utf8&amp;sm=nws_hty&amp;query={keyword}&#39;,headers=headers)

  soup = BeautifulSoup(data.text, &#39;html.parser&#39;)
  lis = soup.select(&#39;#main_pack &gt; section &gt; div &gt; div.group_news &gt; ul &gt; li&#39;)

  for li in lis:
    a = li.select_one(&#39;a.news_tit&#39;)
    print(a.text, a[&#39;href&#39;])</code></pre><h2 id="엑셀-다루기-업무자동화1">&lt;엑셀 다루기: 업무자동화1&gt;</h2>
<blockquote>
<p>*<em>openpyxl *</em>
⇒ 엑셀 다루는 라이브러리</p>
</blockquote>
<p><strong>&lt;openpyxl 기본 코드&gt;</strong></p>
<pre><code>from openpyxl import Workbook

wb= Workbook()
sheet = wb.active

sheet[&#39;A1&#39;] = &#39;안녕하세요!&#39;

wb.save(&quot;샘플파일.xlsx&quot;)
wb.close()</code></pre><p><strong>&lt;openpyxl 엑셀 읽기&gt;</strong></p>
<pre><code>import openpyxl
wb = openpyxl.load_workbook(&#39;샘플파일.xlsx&#39;)
sheet = wb[&#39;Sheet&#39;]

#두번째행부터 불러오기(list로 만들어서!)
rows = list(sheet.rows)[1:]

for row in rows:
  if row[2].value &lt; 300:
    print(row[0].value,row[1].value,row[2].value)</code></pre><blockquote>
<p>#tip&gt; <strong>런타임-초기화 하면 날아감!</strong>
 Colab 환경은, “저장소”가 아닙니다. 즉, 다시 들어오면 파일은 사라지고 없으니,  작업 용도로만 사용하셔야 한다는 점을 기억해주세요!</p>
</blockquote>
<h2 id="엑셀-다루기-업무자동화2">&lt;엑셀 다루기: 업무자동화2&gt;</h2>
<p>&lt;스크래핑 결과를 엑셀에 넣기&gt;: <strong>sheet.append(row)</strong></p>
<p><strong>&lt;파이썬 날짜 가져오기&gt;</strong></p>
<pre><code>from datetime import datetime
datetime.today().strftime(&quot;%Y-%m-%d&quot;)
wb.save(폴더명/~)
폴더명이라는 폴더에 쌓여라!</code></pre><h2 id="파일다운로드-업무자동화">&lt;파일다운로드: 업무자동화&gt;</h2>
<blockquote>
<p>#tip&gt; Colab에선 파일을 올리는 것은 쉬운데, 내려 받는 것이 살-짝 까다로워요! <strong>기본적으로 Colab은 “파일을 모아두는 용도”가 아니기 때문에,
파일을 “묶어주고” → “다운로드” 받는 것이 보통이랍니다.</strong></p>
</blockquote>
<p><strong>파일 묶어주기:</strong></p>
<pre><code>!zip -r /content/files.zip /content/news</code></pre><h2 id="파일명바꾸기-업무자동화">&lt;파일명바꾸기: 업무자동화&gt;</h2>
<pre><code>name = &#39;2022-05-15_NAVER.xlsx&#39;
new_name = name.split(&#39;.&#39;)[0]+&#39;(뉴스).xlsx&#39;</code></pre><p><strong>이렇게 바꾸는 게 기초! os.rename사용하기</strong></p>
<pre><code>
import os

path = &#39;/content/news&#39;
names = os.listdir(path)

for name in names:
  new_file = name.split(&#39;.&#39;)[0] + &#39;(뉴스).xlsx&#39;
  os.rename(path+&#39;/&#39;+name,path+&#39;/&#39;+new_file)
</code></pre><h2 id="이미지-다운로드-업무자동화">&lt;이미지 다운로드: 업무자동화&gt;</h2>
<pre><code>import urllib.request

url = &#39;여기에 URL을 입력하기&#39;
urllib.request.urlretrieve(url, &quot;test.jpg&quot;)</code></pre><h2 id="과제">과제</h2>
<pre><code>#관리종목 엑셀파일 이미지 다운로드
import urllib.request
import openpyxl

wb = openpyxl.load_workbook(&#39;관리종목.xlsx&#39;)
sheet = wb[&#39;종목&#39;]

new_rows = list(sheet.rows)[1:]

for row in new_rows:
  url = f&#39;https://ssl.pstatic.net/imgfinance/chart/item/area/year3/{row[1].value}.png&#39;
  urllib.request.urlretrieve(url, f&quot;imgs/{row[0].value}.png&quot;)

#이미지 압축 후 한번에 다운로드 받기
!zip -r /content/imgs.zip /content/imgs</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[개발일지5]]></title>
            <link>https://velog.io/@o__o/sparta5</link>
            <guid>https://velog.io/@o__o/sparta5</guid>
            <pubDate>Thu, 21 Apr 2022 12:51:15 GMT</pubDate>
            <description><![CDATA[<h2 id="강의자료">강의자료</h2>
<p><img src="https://velog.velcdn.com/images/o__o/post/7d483e21-ed15-4537-a5f7-89e50d62279e/image.png" alt=""></p>
<p>Filezilla
가비아</p>
<hr>
<p><strong>&lt;버킷리스트 POST연습-기록&gt;</strong></p>
<ol>
<li>요청 정보 :  URL= /bucket, 요청 방식 = POST</li>
<li>클라(ajax) → 서버(flask) : bucket</li>
<li>서버(flask) → 클라(ajax) : 메시지를 보냄 (기록 완료!)</li>
</ol>
<p>단! 서버에서 한 가지 일을 더 해야합니다.</p>
<blockquote>
<p>→ 번호를 만들어 함께 넣어주는 것. 그래야 업데이트가 가능하겠죠!</p>
</blockquote>
<p><strong>&lt;버킷리스트 GET연습&gt;</strong></p>
<ol>
<li>요청 정보 :  URL= /bucket, 요청 방식 = GET</li>
<li>클라(ajax) → 서버(flask) : (없음)</li>
<li>서버(flask) → 클라(ajax) : 전체 버킷리스트를 보여주기</li>
</ol>
<p><strong>&lt;버킷리스트 POST연습-완료&gt;</strong></p>
<ol>
<li>요청 정보 :  URL= /bucket/done, 요청 방식 = POST</li>
</ol>
<p><strong>2. 클라(ajax) → 서버(flask) : num (버킷 넘버)</strong>
3. 서버(flask) → 클라(ajax) : 메시지를 보냄 (버킷 완료!)</p>
<hr>
<p><strong>&lt;내프로젝트를 서버에 올리기&gt;</strong></p>
<ul>
<li><p>웹서비스 런칭에 필요한 개념</p>
</li>
<li><p>웹 서비스를 런칭하기 위해 클라이언트의 요청에 항상 응답해줄 수 있는 서버에 프로젝트를 실행시켜줄 거에요.</p>
</li>
<li><p>언제나 요청에 응답하려면, 
1) 컴퓨터가 <strong>항상</strong> 켜져있고 프로그램이 실행되어 있어야하고, 
2) 모두가 접근할 수 있는 공개 주소인 공개 IP 주소(Public IP Address)로 나의 웹 서비스에 <strong>접근할 수 있도록</strong> 해야해요.</p>
</li>
<li><p>서버는 그냥 컴퓨터라는거 기억나시죠? 외부 접속이 가능하게 설정한 다음에 내 컴퓨터를 서버로 사용할 수도 있어요.</p>
</li>
<li><p>우리는 AWS 라는 클라우드 서비스에서 편하게 서버를 관리하기 위해서 항상 켜 놓을 수 있는 컴퓨터인 EC2 사용권을 구입해 서버로 사용할 겁니다.</p>
</li>
</ul>
<p>cf) OS로 리눅스의 Ubuntu를 설치 - AWS EC2
<a href="https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2">https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2</a></p>
<p>** EC2 서버 종료하는 방법 (1년 후 자동결제 방지!) **
대상 인스턴스에 마우스 우클릭 &gt; &#39;인스턴스 상태&#39; 를 클릭합니다. 중지 또는 종료 중 하나를 클릭하면 명령을 실행합니다.</p>
<p><strong>&lt;EC2에 접속하기&gt;</strong></p>
<ul>
<li><p>SSH(Secure Shell Protocol)</p>
<ul>
<li>다른 컴퓨터에 접속할 때 쓰는 프로그램입니다. 
다른 것들 보다 보안이 상대적으로 뛰어납니다.</li>
<li>접속할 컴퓨터가 22번 포트가 열려있어야 접속 가능합니다. 
AWS EC2의 경우, 이미 22번 포트가 열려있습니다.</li>
</ul>
</li>
<li><p>Window: ssh가 없으므로, git bash라는 프로그램을 이용!</p>
<ul>
<li><p>gitbash를 실행하고, 아래를 입력!</p>
<p>ssh -i 받은키페어를끌어다놓기 ubuntu@AWS에적힌내아이피</p>
</li>
</ul>
</li>
</ul>
<p><strong>&lt;리눅스 명령어&gt;</strong><br>리눅스는 쉘 명령어를 통해 OS 조작 가능(마우스 역할)</p>
<ul>
<li>ls: 내 위치의 모든 파일을 보여준다.</li>
<li>pwd: 내 위치(폴더의 경로)를 알려준다.</li>
<li>mkdir: 내 위치 아래에 폴더를 하나 만든다.</li>
<li>cd [갈 곳]: 나를 [갈 곳] 폴더로 이동시킨다.</li>
<li>cd .. : 나를 상위 폴더로 이동시킨다.</li>
<li>cp -r [복사할 것] [붙여넣기 할 것]: 복사 붙여넣기</li>
<li>rm -rf [지울 것]: 지우기</li>
<li>sudo [실행 할 명령어]: 명령어를 관리자 권한으로 실행한다.</li>
<li>sudo su: 관리가 권한으로 들어간다. (나올때는 exit으로 나옴)</li>
</ul>
<hr>
<p><strong>&lt;EC2 한방에 세팅하기&gt;</strong></p>
<h4 id="python3---python">python3 -&gt; python</h4>
<p>sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10</p>
<h4 id="pip3---pip">pip3 -&gt; pip</h4>
<p>sudo apt-get update
sudo apt-get install -y python3-pip
sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1</p>
<h4 id="port-forwarding">port forwarding</h4>
<p>sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000</p>
<h3 id="pip3-설치">pip3 설치</h3>
<p>sudo apt-get update
sudo apt-get install -y python3-pip</p>
<h3 id="pip3-대신-pip-라고-입력하기-위한-명령어">pip3 대신 pip 라고 입력하기 위한 명령어</h3>
<p>sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1</p>
<h3 id="포트포워딩-80포트-→-5000포트">포트포워딩 (80포트 → 5000포트)</h3>
<p>80포트로 들어오는 요청을 5000포트로 넘겨주는 명령어</p>
<p>sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000</p>
<hr>
<p><strong>&lt;Flask 서버 실행&gt;</strong></p>
<ul>
<li>AWS에서 5000포트를 열어주기<ul>
<li>EC2 서버(=가상의 내 컴퓨터)에서 포트를 따로 설정하는 것 외에도,
AWS EC2에서도 자체적으로 포트를 열고/닫을 수 있게 관리를 하고 있습니다.
→ 그래서 AWS EC2 Security Group에서 인바운드 요청 포트를 열어줘야 합니다.</li>
</ul>
</li>
</ul>
<h4 id="80포트-http-접속을-위한-기본포트">80포트: HTTP 접속을 위한 기본포트</h4>
<p>↓</p>
<p><strong>&lt;포트 번호 없애기 - 기본 개념&gt;</strong></p>
<ul>
<li>지금은 5000포트에서 웹 서비스가 실행되고 있습니다. 그래서 매번 :5000 이라고 뒤에 붙여줘야 하죠. 뒤에 붙는 포트 번호를 없애려면 어떻게 해야할까요?</li>
<li><strong>http 요청에서는 80포트가 기본이기 때문에, 굳이 :80을 붙이지 않아도 자동으로 연결이 됩니다.</strong></li>
<li>포트 번호를 입력하지 않아도 자동으로 접속되기 위해, 우리는 80포트로 오는 요청을 5000 포트로  전달하게 하는 포트포워딩(port forwarding) 을 사용하겠습니다.</li>
<li>리눅스에서 기본으로 제공해주는  포트포워딩을 사용할 것입니다. 그림으로 보면 아래와 같습니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/o__o/post/9ea6af75-6cc3-44b3-af45-04418e48ea11/image.png" alt=""></p>
<hr>
<p><strong>&lt;nohup설정&gt;</strong>
ssh접속 끊어도 서버 계속 돌게하기
Git bash 또는 맥의 터미널을 종료하면 (=즉, SSH 접속을 끊으면) 프로세스가 종료되면서, 서버가 돌아가지 않고 있습니다. 그러나 우리가 원격접속을 끊어도, 서버는 계속 동작해야겠죠?</p>
<p>서버 돌아가게 하기
nohup python app.py &amp;</p>
<p>서버 강제종료하기
ps -ef | grep &#39;python app.py&#39; | awk &#39;{print $2}&#39; | xargs kill</p>
<hr>
<p><strong>&lt;og태그&gt;</strong></p>
<p>static 폴더 아래에 이미지 파일을 넣고, 
각자 프로젝트 HTML의 <head>~</head> 사이에 아래 내용을 작성하면 
og 태그를 개인 프로젝트에 사용할 수 있습니다.</p>
<meta property="og:title" content="내 사이트의 제목" />
<meta property="og:description" content="보고 있는 페이지의 내용 요약" />
<meta property="og:image" content="이미지URL" />

<ul>
<li><p>이미지를 바꿨는데 이전 ogimage가 그대로 나와요!
  👉 그것은 페이스북/카카오톡 등에서 처음 것을 한동안 저장해놓기 때문입니다.</p>
<ul>
<li>페이스북 og 태그 초기화 하기: <a href="https://developers.facebook.com/tools/debug/">https://developers.facebook.com/tools/debug/</a></li>
<li>카카오톡 og 태그 초기화 하기: <a href="https://developers.kakao.com/tool/clear/og">https://developers.kakao.com/tool/clear/og</a></li>
</ul>
</li>
</ul>
<hr>
<h2 id="메모">메모</h2>
<p>Filezilla 설치하기: 파일 보낼수있는 프로그램(클라우드에 올리기)</p>
<p>가비아 가입하기 &amp; 도메인 구입하기</p>
<p>sparta-mini.shop/
ns.gabia.co.kr 211.234.118.50
ns1.gabia.co.kr 121.78.117.39
ns.gabia.net 110.45.166.50</p>
<hr>
<p><strong>&lt;버킷리스트&gt; 프로젝트 세팅/뼈대준비</strong></p>
<p>[POST]
지금까지 과제와 다른점은 서버에서 한가지 일을 더 해야한다.
리스트별 번호를 만들어 함께 데이터 넣어주는 것!(그래야 완료여부 등 업데이트 가능)</p>
<p>. done 값 0-&gt;1로 만들기
. 업데이트 : db.users.update_one({&#39;name&#39;:&#39;bobby&#39;},{&#39;$set&#39;:{&#39;age&#39;:19}})
. 숫자를 클라이언트로부터 받아왔으면 숫자로 받아주는 작업 필요(서버처리지)
<strong>--&gt; int()</strong></p>
<hr>
<p><strong>&lt;내서비스가 인터넷에서 계속 살아있으려면?&gt;</strong>
내프로젝트를 서버에 올리고...(서버=컴퓨터)</p>
<p>컴퓨터가 항상 켜져있고 프로그램 실행되어 있어야하고
모두가 접근할 수 있는 공개IP주소로 내 웹서비스에 접근할 수 있도록!
<strong>-&gt; 요즘은 클라우드 환경 이용(EX. AWS EC2 사용권)</strong></p>
<p><strong>&lt;AWS 서버 구매하기&gt;</strong>
윈도우 맥OS가 아니라, 
리눅스 OS -&gt; <strong>원격접속:명령어로 실행(Git Bash)</strong></p>
<p> . mkdir sparta : sparta폴더생성
 . ls : 폴더들어가기
 . cd sparta : sparta폴더접속
 . cd .. : 폴더나가기
 (Tab키 자동완성)
 (화살표 윗키 : 내가 마지막으로 썼던 것)</p>
<p>인스턴스 시작(컴퓨터 on)
인스턴스 중지(컴퓨터 off)
인스턴스 종료(컴퓨터 반납)</p>
<hr>
<p><strong>&lt;서버 세팅하기&gt;</strong>
EC2 한방에 세팅하기(git bash에 한줄씩 입력)
<strong>파일질라 실행(좌: 내 컴퓨터 / 우: 내가 빌린 컴퓨터)</strong></p>
<p><strong>&lt;flask서버 실행하기&gt;</strong>
파일질라에서 app.py &amp; templates &amp; static 업로드
git bash 필요한 인터프리터 다운(flask, pymongo, dnspython)
python app.py 실행</p>
<p>ip주소 복사+:5000 입력 &amp; 
**AWS 보안 탭 &gt; 보안그룹 클릭 &gt; 인바운드규칙편집 &gt; 규칙추가 (+80도 규칙추가!!!)</p>
<p><a href="http://52.79.233.43:5000/">http://52.79.233.43:5000/</a>
<a href="http://52.79.233.43">http://52.79.233.43</a></p>
<p><strong>* 리눅스 기본제공 포트포워딩</strong>
외부요청들 -&gt; 80포트 -&gt; 우리서버 -&gt; 5000포트로 -&gt; 도달</p>
<p>: sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000</p>
<hr>
<p><strong><nohup></strong>
원격접속 종료하더라도 서버 계속 들어갈 수 있게</p>
<p>nohup python app.py &amp; 
ctrl + c : 끄기</p>
<p><strong>&lt;nuhup 강제종료&gt;</strong>
ps -ef | grep &#39;python app.py&#39; | awk &#39;{print $2}&#39; | xargs kill</p>
<hr>
<ul>
<li>파이참 작업 배포시 </li>
<li>파일질라에서 static templates app.py 올리기</li>
<li>git bash 에서 nohup으로 켜기
nohup python app.py</li>
</ul>
<hr>
<p><strong>&lt;도메인 연결하기&gt;</strong></p>
<p>가비아 - dns설정</p>
<hr>
<p><strong>&lt;og태그&gt;</strong></p>
<ul>
<li>휴대폰 공유 시, 링크만 뜨는게 아니라 이미지도 같이 뜨도록 태그설정
og:image
og:title
og:description</li>
</ul>
<meta property="og:title" content="내 사이트의 제목" />
<meta property="og:description" content="보고 있는 페이지의 내용 요약" />
<meta property="og:image" content="이미지URL" />

<hr>
<ul>
<li><p>nohup 끄고 app.py파일 수정배포하기!
(nohup 종료실행코드 &gt; 파일질라 해당파일 삭제 &gt; 다시배포)</p>
</li>
<li><p>카카오톡에서 저장된 og태그 삭제하기
:수정된 og태그 불러올수있게!
<a href="https://developers.kakao.com/tool/clear/og">https://developers.kakao.com/tool/clear/og</a></p>
</li>
</ul>
<h2 id="결과물"><strong>결과물</strong></h2>
<p><a href="http://sparta-mini.shop/">http://sparta-mini.shop/</a></p>
<hr>
<p><strong>&lt;정리&gt;</strong>
기본적으로 <strong>웹서비스를 만든다고 하면 필요한 것</strong></p>
<p>1) 내눈에 보이는 것: HTML CSS Javascript
2) 내눈에 보이는 것을 건네줄 존재: 서버</p>
<p><strong>파이썬:</strong> 서버를 만들 수 있는 언어</p>
<p><strong>서버 만들고, 인터넷 환경에 배포하기까지!</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발일지4]]></title>
            <link>https://velog.io/@o__o/sparta4</link>
            <guid>https://velog.io/@o__o/sparta4</guid>
            <pubDate>Tue, 19 Apr 2022 15:21:57 GMT</pubDate>
            <description><![CDATA[<h2 id="강의자료">강의자료</h2>
<ul>
<li><p>로컬개발환경
<img src="https://velog.velcdn.com/images/o__o/post/cc51ce3e-16eb-408d-ba59-e45f496f5b9d/image.png" alt=""></p>
</li>
<li><p>클라우드환경
<img src="https://velog.velcdn.com/images/o__o/post/12aaee80-1fc2-461a-a3b2-4f5c723b4cdd/image.png" alt=""></p>
</li>
</ul>
<p><strong>Flask 프레임워크:</strong> 서버를 구동시켜주는 편한 코드 모음. 서버를 구동하려면 필요한 복잡한 일들을 쉽게 가져다 쓸 수 있습니다.</p>
<ul>
<li><p>flask 서버를 돌리는 파일은 app.py라고 이름 짓습니다!</p>
</li>
<li><p><strong>html 파일 불러오기 :</strong> flask 내장함수 render_template를 이용합니다.</p>
</li>
</ul>
<p><em>from flask import Flask, render_template</em></p>
<hr>
<p>GET, POST 방식</p>
<ul>
<li><p>GET → 데이터 조회(Read) 요청할 때
예) 영화 목록 조회</p>
<pre><code>→ 데이터 전달할 때 : 
URL 뒤에 물음표를 붙여 key=value로 전달</code></pre><p>) google.com<strong>?q=북극곰</strong></p>
</li>
<li><p>POST → 데이터 생성(Create), 변경(Update), 삭제(Delete) 요청할 때
예) 회원가입, 회원탈퇴, 비밀번호 수정</p>
<pre><code> → 데이터 전달할 때 : 
 바로 보이지 않는 HTML body에 key:value 형태로 전달</code></pre></li>
</ul>
<hr>
<ul>
<li>화성땅 공동구매 - POST</li>
</ul>
<ol>
<li>요청 정보 :  URL= /mars, 요청 방식 = POST</li>
<li>클라(ajax) → 서버(flask) : name, address, size</li>
<li>서버(flask) → 클라(ajax) : 메시지를 보냄 (주문 완료!)</li>
</ol>
<ul>
<li>화성땅 공동구매 - GET</li>
</ul>
<ol>
<li>요청 정보 :  URL= /mars, 요청 방식 = GET</li>
<li>클라(ajax) → 서버(flask) : (없음)</li>
<li>서버(flask) → 클라(ajax) : 전체 주문을 보내주기</li>
</ol>
<hr>
<p><strong>* META 태그란?</strong>
URL만 입력했는데, 자동으로 불러와지는 부분들 : &#39;meta&#39;태그를 크롤링 함으로써 공통적으로 얻을 수 있다. </p>
<head></head> 부분에 들어가는, 
눈으로 보이는 것(body) 외에 사이트의 속성을 설명해주는 태그들입니다.
예) 구글 검색 시 표시 될 설명문, 사이트 제목, 카톡 공유 시 표시 될 이미지 등

<ul>
<li>스파르타피디아 - POST</li>
</ul>
<ol>
<li>요청 정보 :  URL= /movie, 요청 방식 = POST</li>
<li>클라(ajax) → 서버(flask) : url, star, comment</li>
<li>서버(flask) → 클라(ajax) : 메시지를 보냄 (포스팅 완료!)</li>
</ol>
<ul>
<li>스파르타피디아 - GET</li>
</ul>
<ol>
<li>요청 정보 :  URL= /movie, 요청 방식 = GET</li>
<li>클라(ajax) → 서버(flask) : (없음)</li>
<li>서버(flask) → 클라(ajax) : 전체 영화를 보내주기</li>
</ol>
<h2 id="메모">메모</h2>
<p><strong>mongoDB / HTML CSS JS / 서버</strong>를 만든다!
-&gt; 내 컴퓨터에서 만들고 내컴퓨터에서 테스트해본다 = 로컬개발환경</p>
<p><strong>flask 프레임워크 :</strong> 서버를 만들수있는 프레임워크
(서버를 구동시켜주는 편한 코드 모음)</p>
<p>@app.route(&#39;/&#39;)
def home():
   return &#39;This is Home!&#39;</p>
<p>@app.route(&#39;/mypage&#39;)
def mypage():
   return &#39;This is mypage!!!&#39;</p>
<p>localhost:5000<strong>/mypage</strong></p>
<hr>
<p><strong>&lt;flask 기본 폴더구조&gt;</strong>
[세팅 루틴: (프로젝트 폴더안에 항상 이렇게 세팅하고 시작)]</p>
<ul>
<li><p>파일-새프로젝트 폴더 설정</p>
</li>
<li><p>폴더 내 경로(directory) 생성: </p>
</li>
<li><ul>
<li>. static(이미지, css 파일 넣어둠)
. templates(html 파일 담아두고 불러오는 역할)**</li>
</ul>
</li>
<li><p>폴더 내 파이썬 파일 생성: 
*<em>. app.py
*</em></p>
</li>
<li><p>templates 경로 내** index.html **생성</p>
</li>
<li><p>파일-설정-프로젝트-python-인터프리터-+-패키지 설치
<strong>. flask
. pymongo
. dnspython</strong></p>
</li>
</ul>
<p><em><strong>&lt;서버에 html보내기&gt;</strong></em>
render_template 
return render_template(&#39;index.html&#39;) 하면
templates폴더 내의 html을 읽어서 서버에 보내준다</p>
<p><em><strong>&lt;localhost:5000 VS 파이참 우측상단 크롬 버튼?&gt;</strong></em>
  . localhost:서버가 보여주는 것
  . 우측상단 크롬: 내 컴퓨터 파일 열어서 보는것과 같은 개념</p>
<hr>
<p><strong>&lt; api &gt;</strong>
<strong>get : ** 데이터 조회
. url뒤에 ?key=value
**post :</strong> 데이터 생성 변경 삭제
. html body에 key:value</p>
<p>cf. 프론트엔드 html쪽, 백엔드 flask/서버쪽</p>
<hr>
<p>** &lt;과제들&gt;**</p>
<p><strong>[화성땅공동구매]</strong></p>
<ul>
<li><p>dbprac파일 참고하여 작성
cf) 새로고침: window.location.reload()</p>
</li>
<li><p>주문하기 / 정보 서버에 주기(post) / 버튼클릭 시 완료</p>
</li>
<li><blockquote>
<p>버튼누르면 save_order function 실행되고</p>
</blockquote>
</li>
<li><blockquote>
<p>name,address,size정보를 Jquery로 가져와서 실어보냄</p>
</blockquote>
</li>
<li><blockquote>
<p>미리약속한대로(창구에) -&gt; app.py에서 약속한대로 받음(post) </p>
</blockquote>
</li>
<li><blockquote>
<p>창구에서 db에 저장하고 -&gt; 주문완료라고 return 값 보내면</p>
</blockquote>
</li>
<li><blockquote>
<p>메시지가 받아서 alert 로 보여주고 -&gt; window reload</p>
</blockquote>
</li>
<li><p>주문 보여주기 / 로딩완료 시 자동조회(get)</p>
</li>
</ul>
<p><strong>[스파르타피디아-movie]</strong></p>
<ul>
<li><p>조각 기능 : 프로젝트 구현전 필요한 기능들을 먼저 구현</p>
</li>
<li><p>크롤링 연습 - meta 태그
ex) 네이버 영화 : html head 부분에 og:image, og:title...</p>
</li>
</ul>
<ul>
<li><p>뼈대 준비하기 API 만들기(POST)
. 무엇을 만들기 파악하기
. 서버만들기(app.py)-클라이언트만들기(html)-확인하기</p>
</li>
<li><p>mongo DB에 저장한 값 화면에 보여주기(GET)</p>
</li>
</ul>
<p><strong>[팬명록 완성 과제]</strong>
서버만들고 클라이언트 만드는 것 까지 잘 한 것 같은데,
데이터 입력 후 mongo DB에 저장 및 화면에 적재되는 게 계속 오류가 났다.</p>
<p>※ 오류코드: 
    name_receive = request.form[&#39;name_give&#39;]
  File &quot;상세 파일위치\바탕 화면\sparta\projects\homework\venv\lib\site-packages\werkzeug\datastructures.py&quot;, line 375, in <strong>getitem</strong>
    raise exceptions.BadRequestKeyError(key)</p>
<p>werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.</p>
<p>KeyError: &#39;name_give&#39;  </p>
<p>  --&gt; 해결완료! (04/20)
  POST 쪽에 name_give 정의를 안해줬었다..^^;</p>
<pre><code>      function save_comment() {
        let name = $(&#39;#name&#39;).val()
        let comment = $(&#39;#comment&#39;).val()

        $.ajax({
            type: &#39;POST&#39;,
            url: &#39;/homework&#39;,
            data: {name_give:name, comment_give: comment},
            success: function (response) {
                alert(response[&#39;msg&#39;])
                window.location.reload()
            }
        })
    }</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[개발일지3]]></title>
            <link>https://velog.io/@o__o/sparta3</link>
            <guid>https://velog.io/@o__o/sparta3</guid>
            <pubDate>Sun, 10 Apr 2022 15:28:42 GMT</pubDate>
            <description><![CDATA[<h2 id="강의자료">강의자료</h2>
<p>파이썬을 설치한다?</p>
<p>→ 일종의 번역팩을 설치한다고 생각하면 됩니다. 
컴퓨터는 101010001 과 같은 언어만 알아듣는다고 했지요? 
파이썬 문법으로 된 것을 101010001로 변환해줄 수 있도록, 번역 패키지를 설치하는 것입니다.</p>
<p><strong>* 변수 &amp; 기본연산</strong>
a = 3      # 3을 a에 넣는다
b = a      # a를 b에 넣는다
a = a + 1  # a+1을 다시 a에 넣는다</p>
<p>num1 = a<em>b # a</em>b의 값을 num1이라는 변수에 넣는다
num2 = 99 # 99의 값을 num2이라는 변수에 넣는다</p>
<p><strong>* 자료형1(숫자, 문자형)</strong>
name = &#39;bob&#39; # 변수에는 문자열이 들어갈 수도 있고,
num = 12 # 숫자가 들어갈 수도 있고,</p>
<p>is_number = True # True 또는 False -&gt; &quot;Boolean&quot;형이 들어갈 수도 있습니다.
그리고 List, Dictionary 도 들어갈 수도 있죠.</p>
<p><strong>* 자료형2(리스트헝(Javascript의 배열형과 동일))</strong>
a_list = []
a_list.append(1)     # 리스트에 값을 넣는다
a_list.append([2,3]) # 리스트에 [2,3]이라는 리스트를 다시 넣는다</p>
<p>a_list의 값은? [1,[2,3]]
a_list[0]의 값은? 1
a_list[1]의 값은? [2,3]
a_list[1][0]의 값은? 2</p>
<ul>
<li>자료형3(Dictionary 형 (Javascript의 dictionary형과 동일))
a_dict = {}
a_dict = {&#39;name&#39;:&#39;bob&#39;,&#39;age&#39;:21}
a_dict[&#39;height&#39;] = 178</li>
</ul>
<p>a_dict의 값은? {&#39;name&#39;:&#39;bob&#39;,&#39;age&#39;:21, &#39;height&#39;:178}
a_dict[&#39;name&#39;]의 값은? &#39;bob&#39;
a_dict[&#39;age&#39;]의 값은? 21
a_dict[&#39;height&#39;]의 값은? 178</p>
<p><strong>* 함수</strong></p>
<p>#수학문제에서
f(x) = 2*x+3
y = f(2)
y의 값은? 7</p>
<p>#참고: 자바스크립트에서는
function f(x) {
    return 2*x+3
}</p>
<p>#파이썬에서
def f(x):
    return 2*x+3</p>
<p>y = f(2)
y의 값은? 7</p>
<p><strong>* 조건문(if/else)</strong>
def oddeven(num):  # oddeven이라는 이름의 함수를 정의한다. num을 변수로 받는다.
    if num % 2 == 0: # num을 2로 나눈 나머지가 0이면
         return True   # True (참)을 반환한다.
    else:            # 아니면,
         return False  # False (거짓)을 반환한다.</p>
<p>result = oddeven(20)</p>
<ul>
<li>반복문(for in)
파이썬에서의 반복문은, 리스트의 요소들을 하나씩 꺼내쓰는 형태입니다.
무조건 리스트와 함께 쓰입니다!</li>
</ul>
<p>fruits = [&#39;사과&#39;,&#39;배&#39;,&#39;배&#39;,&#39;감&#39;,&#39;수박&#39;,&#39;귤&#39;,&#39;딸기&#39;,&#39;사과&#39;,&#39;배&#39;,&#39;수박&#39;]</p>
<p>count = 0
for fruit in fruits:
    if fruit == &#39;사과&#39;:
        count += 1</p>
<p>print(count)
#사과의 갯수를 세어 보여줍니다.</p>
<hr>
<h3 id="패키지-라이브러리">패키지? 라이브러리?</h3>
<p>Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 
이런 패키지 의 묶음을 라이브러리 라고 볼 수 있습니다. </p>
<ol>
<li><p>가상 환경(virtual environment) 이란?  - 프로젝트별로 패키지들을 담을 공구함
같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.</p>
</li>
<li><p>pip(python install package) 사용 - requests 패키지 설치해보기
앱을 설치할 때 앱스토어/플레이스토어를 가듯이, 
새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 pip 를 이용하게 됩니다.</p>
</li>
</ol>
<hr>
<p>태그 안의 텍스트를 찍고 싶을 땐 → 태그.text
태그 안의 속성을 찍고 싶을 땐 → 태그[&#39;속성&#39;]</p>
<h4 id="beautifulsoup-내-select에-미리-정의된-다른-방법을-알아봅니다">beautifulsoup 내 select에 미리 정의된 다른 방법을 알아봅니다</h4>
<p><strong>#선택자를 사용하는 방법 (copy selector)</strong>
soup.select(&#39;태그명&#39;)
soup.select(&#39;.클래스명&#39;)
soup.select(&#39;#아이디명&#39;)</p>
<p>soup.select(&#39;상위태그명 &gt; 하위태그명 &gt; 하위태그명&#39;)
soup.select(&#39;상위태그명.클래스명 &gt; 하위태그명.클래스명&#39;)</p>
<p>#태그와 속성값으로 찾는 방법
soup.select(&#39;태그명[속성=&quot;값&quot;]&#39;)</p>
<p>#한 개만 가져오고 싶은 경우
soup.select_one(&#39;위와 동일&#39;)</p>
<p><strong>#크롬 개발자도구를 참고할 수도 있습니다.</strong></p>
<ol>
<li>원하는 부분에서 마우스 오른쪽 클릭 → 검사</li>
<li>원하는 태그에서 마우스 오른쪽 클릭</li>
<li>Copy → Copy selector로 선택자를 복사할 수 있음</li>
</ol>
<hr>
<h4 id="db-데이터베이스-종류">DB 데이터베이스 종류</h4>
<p><img src="https://velog.velcdn.com/images/o__o/post/229b38be-b0c9-4b0a-a45d-c14a7718c378/image.png" alt=""></p>
<p><strong>RDBMS(SQL)</strong></p>
<p>행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 
데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 
그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
ex) MS-SQL, My-SQL 등</p>
<p><strong>No-SQL</strong>
딕셔너리 형태로 데이터를 저장해두는 DB입니다. 
고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 
자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
ex) MongoDB</p>
<p>DB는 간단하게, 우리가 쓰는 프로그램과 같은 것이랍니다.
즉, 내 컴퓨터에 게임도 설치하고, PPT도 설치하고, DB도 설치할 수 있는 것이죠.
이 마저도 요새는 Cloud 형태로 제공해주는 곳들이 많답니다.</p>
<ul>
<li>유저가 몰리거나 / DB를 백업해야 하거나 / 모니터링 하기가 아주 용이하기 때문이죠!</li>
</ul>
<hr>
<p><strong>_pymongo 라이브러리의 역할
_</strong></p>
<p>예를 들어, MS Excel를 파이썬으로 조작하려면,
특별한 라이브러리가 필요하지 않겠어요?</p>
<p>마찬가지로, <strong>mongoDB</strong> 라는 프로그램을 조작하려면,
특별한 라이브러리, pymongo가 필요하답니다!</p>
<p>from pymongo import MongoClient
client = MongoClient(&#39;여기에 URL 입력&#39;)
db = client.dbsparta</p>
<h4 id="pymongo-사용법-코드-요약">pymongo 사용법. 코드 요약</h4>
<h4 id=""></h4>
<p>#저장 - 예시
doc = {&#39;name&#39;:&#39;bobby&#39;,&#39;age&#39;:21}
db.users.insert_one(doc)</p>
<p>#한 개 찾기 - 예시
user = db.users.find_one({&#39;name&#39;:&#39;bobby&#39;})</p>
<p>#여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{&#39;_id&#39;:False}))</p>
<p>#바꾸기 - 예시
db.users.update_one({&#39;name&#39;:&#39;bobby&#39;},{&#39;$set&#39;:{&#39;age&#39;:19}})</p>
<p>#지우기 - 예시
db.users.delete_one({&#39;name&#39;:&#39;bobby&#39;})</p>
<hr>
<h2 id="메모">메모</h2>
<p><strong>&lt;파이썬 기초&gt;</strong>
(변수)
(자료형)  list = [&#39;&#39;], dict = {&#39;&#39;:&#39;&#39;, &#39;&#39;:&#39;&#39;}</p>
<p>(함수) def sum(a,b): 
        return a+b</p>
<p>(조건문) if  조건:
        결과
     else: 
        결과        </p>
<ul>
<li>: tab(들여쓰기) 다음부터는 나의 내용물입니다.</li>
</ul>
<p>(반복문) 리스트와 함께 쓴다 for in</p>
<p>( 예제 1 )
count = 0
for fruit in fruits:
    if fruit == &#39;사과&#39;:
        count += 1
print(count)</p>
<p>( 예제 2 )
for ppp in people:
    if ppp[&#39;age&#39;] &gt; 20:
        print(ppp[&#39;name&#39;])</p>
<hr>
<p><strong>&lt;라이브러리&gt;</strong>
라이브러리 = 패키지 묶음
패키지 = 모듈(기능묶음)을 모아놓은 단위</p>
<p>venv (virtual environment, 가상환경) = 프로젝트별로 패키지들을 담을 공구함
(프로젝트마다 쓰는 라이브러리 버전이 다를수도 있기떄문에!)</p>
<p>pip (python install package) </p>
<p>Ajax 같은 역할을 하는 패키지 requests 를 깔았다!
-&gt; import requests</p>
<hr>
<p><strong>&lt;웹스크래핑=크롤링&gt;</strong>
패키지 추가설치 beautifulsoup4</p>
<p>크롤링을 하려면 두가지를 한다.
requests를 해서 html을 가져오는 것
특정값 찾게해주는 라이브러리 = beautifulsoup4</p>
<p>패키지 beautifulsoup4 를 깔았다!
-&gt; from bs4 import BeautifulSoup</p>
<p>headers = 코드에서 콜 날리듯이, 브라우저에서 콜 날린것처럼 (사람인것처럼) 해주려고 쓰는 용도
headers = {&#39;User-Agent&#39; : &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36&#39;}
data = requests.get(&#39;url&#39;,headers=headers)</p>
<p>&lt;bs4 쓰는 방법&gt;
링크 내 특정값 - 오른쪽마우스 검사 - copy - copy selector</p>
<p>bs4 결과값 볼 때 태그에서 
값을 텍스트로만 보려면 print(title.text)
경로(?) 보려면 print(title[&#39;href&#39;])</p>
<p>같다 ==
아니다 != , is not</p>
<hr>
<p>**&lt;데이터베이스&gt; **
데이터를 잘 가져오게하는 프로그램이다
db에는 index라는 순서로 데이터들이 정렬되어있다!</p>
<p>RDBMS(SQL)
: 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.
ex) MS-SQL, My-SQL 등
: 정형화되어있고, 빨리 찾을수있으나 유연한 대처가 어려움</p>
<p>No-SQL (Not only SQL)
: 딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
ex) MongoDB</p>
<p>-&gt; 유저가 몰리거나 / DB를 백업해야 하거나 / 모니터링 하기가 아주 용이하기 때문에 컴퓨터에 까는것 보다 클라우드 형태로 이용하는게 트랜드!
ex) mongoDB Atlas 클라우드 환경에서 mongoDB가 제공해주는 서비스
: 그때그때 쌓이기때문에 유연하게 대처할수있다(초기서비스에 유용)</p>
<p><strong><mongoDB Atlas></strong>
패키지 추가설치 pymongo, dnspython</p>
<p>data 넣고 mongoDB 에서 데이터가 잘 들어갔는지 보기 : browse collections</p>
<p>&lt;mongoDB 사용방법&gt;
파이썬이라는 프로그래밍 언어로 데이터베이스에 데이터를 넣거나 가져오거나 수정하거나 삭제하거나!</p>
<p><em><strong>#저장 - 예시</strong></em>
doc = {&#39;name&#39;:&#39;bobby&#39;,&#39;age&#39;:21}
db.users.insert_one(doc)</p>
<p><em><strong>#한 개 찾기 - 예시</strong></em>
user = db.users.find_one({&#39;name&#39;:&#39;bobby&#39;})</p>
<p><em><strong>#여러개 찾기 - 예시 ( _id 값은 제외하고 출력)</strong></em>
all_users = list(db.users.find({},{&#39;_id&#39;:False}))</p>
<p><em><strong>#바꾸기 - 예시</strong></em>
db.users.update_one({&#39;name&#39;:&#39;bobby&#39;},{&#39;$set&#39;:{&#39;age&#39;:19}})</p>
<p><em><strong>#지우기 - 예시</strong></em>
db.users.delete_one({&#39;name&#39;:&#39;bobby&#39;})</p>
<hr>
<p><strong>&lt;웹스크래핑 결과 저장하기&gt;</strong></p>
<ul>
<li>db연결을 위한 즐겨찾기
from pymongo import MongoClient
client = MongoClient(&#39;mongodb+srv://test:<a href="mailto:sparta@cluster0.mswdg.mongodb.net">sparta@cluster0.mswdg.mongodb.net</a>/cluster0?retryWrites=true&amp;w=majority&#39;)
db = client.dbsparta</li>
</ul>
<p><a href="https://cloud.mongodb.com/">https://cloud.mongodb.com/</a></p>
<hr>
<p><strong>&lt;정리&gt;</strong></p>
<ul>
<li><p>웹서비스를 만들기위해 필요한 것 2가지
1) 눈에보이는 것을 만드는 HTML, CSS, Javascript
2) 눈에보이는 것을 주는 서버</p>
</li>
<li><p>서버를 만들수있는 프로그래밍 언어: 파이썬 / (db)</p>
</li>
</ul>
<p>.strip() : 여백없애기</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발일지2]]></title>
            <link>https://velog.io/@o__o/sparta2</link>
            <guid>https://velog.io/@o__o/sparta2</guid>
            <pubDate>Thu, 07 Apr 2022 15:53:43 GMT</pubDate>
            <description><![CDATA[<h2 id="강의자료">강의자료</h2>
<p>jQuery를 이용해 Javascript로 HTML을 쉽게 제어하고,
Ajax를 이용해 다시 서버에 데이터를 요청하고 받아보겠습니다.</p>
<p>jQuery는 Javascript와 다른 특별한 소프트웨어가 아니라 미리 작성된 Javascript 코드입니다. 전문 개발자들이 짜둔 코드를 잘 가져와서 사용하는 것임을 기억해주세요! (그렇게 때문에, 쓰기 전에 &quot;임포트&quot;를 해야합니다!)</p>
<hr>
<p>JSON은, Key:Value로 이루어져 있습니다. 자료형 Dictionary와 아주- 유사하죠 </p>
<ul>
<li><p>GET        →      통상적으로! 데이터 조회(Read)를 요청할 때</p>
<pre><code>                     예) 영화 목록 조회</code></pre></li>
<li><p>POST     →      통상적으로! 데이터 생성(Create), 변경(Update), 삭제(Delete) 요청 할 때</p>
<pre><code>                     예) 회원가입, 회원탈퇴, 비밀번호 수정</code></pre></li>
</ul>
<hr>
<p> Ajax는 jQuery를 임포트한 페이지에서만 동작 가능합니다.</p>
<ul>
<li><p>Ajax코드해설
$.ajax({</p>
<p>type: &quot;GET&quot;, // GET 방식으로 요청한다.</p>
<p>url: &quot;<a href="http://spartacodingclub.shop/sparta_api/seoulair&quot;">http://spartacodingclub.shop/sparta_api/seoulair&quot;</a>, // 요청할 url</p>
<p>data: { param: &#39;value&#39;, param2: &#39;value2&#39; }, // POST 요청하면서 함께 줄 데이터, (GET 요청시엔 비워두세요)</p>
<p>success: function(response){ // 서버에서 준 결과를 response라는 변수에 담음</p>
<p>console.log(response) // 서버에서 준 결과를 이용해서 나머지 코드를 작성
}
})</p>
</li>
</ul>
<hr>
<ul>
<li>이미지 바꾸기 : 
<code>$(&quot;#아이디값&quot;).attr(&quot;src&quot;, 이미지URL);</code></li>
<li>텍스트 바꾸기 : 
<code>$(&quot;#아이디값&quot;).text(&quot;바꾸고 싶은 텍스트&quot;);</code></li>
</ul>
<h2 id="메모">메모</h2>
<h4 id="jquery란">&lt;jQuery란&gt;</h4>
<p>HTML 요소들을 조작하는 Javascript를 미리 작성해둔 라이브러리
(누군가가 짜둔 css = 부트스트랩)</p>
<ul>
<li>CSS 의 CLASS 처럼, JQUERY 에선 ID !</li>
</ul>
<p>$(&#39;#url&#39;).val(&#39;입력값&#39;)
    id=url에다가 jquery 적용
    그곳에 입력하는 값 = .val(&#39;입력값&#39;)
    입력값을 알기위해서는 = $(&#39;#url&#39;).val(&#39;&#39;)</p>
<p>$(&#39;#post-box&#39;).hide() = 숨기기
$(&#39;#post-box&#39;).show() = 보여주기</p>
<p>let temp_html = <code>물결표시 shift키 누르지않은키</code>
$(&#39;#cards-box&#39;).append(temp_html) 
    cards-box에다가 temp_html의 값을 html화 하겠다</p>
<p>$(&#39;#cards-box&#39;).empty()
    지우고 호출(?)</p>
<p>display: none; = 초기화면에 노출안함</p>
<p>console.log(txt.includes(&#39;@&#39;))
    console창에서 @포함여부 확인해보기 (true/false)</p>
<p>if (txt.includes(&#39;@&#39;) == true) {
    alert(txt.split(&#39;@&#39;)[1].split(&#39;.&#39;)[0])
} else {
    alert(&#39;이메일이 아닙니다.&#39;)
}</p>
<h4 id="json이란">&lt;json이란&gt;</h4>
<p>서버로부터 데이터를 받아오는것
서버-클라이언트 통신 이해하기</p>
<ul>
<li><p>클라이언트가 요청할때 타입이라는 것이 있다</p>
</li>
<li><p>GET: 데이터 조회(Read) 요청
? : 여기서부터 전달할 데이터가 작성됨
&amp; : 전달할 데이터가 더 있다는 뜻</p>
</li>
<li><p>POST: 데이터 생성(Create), 변경(Update), 삭제(Delete) 요청</p>
</li>
</ul>
<h4 id="ajax란">&lt;Ajax란&gt;</h4>
<p>브라우저에서 엔터치는것과 같이 자바스크립트에서 어떻게 데이터를 요청하느냐</p>
<ul>
<li><p>json형식 딕셔너리와 리스트가 합쳐진 형태로 보임</p>
</li>
<li><p>기본골격
$.ajax({
  type: &quot;GET&quot;,
  url: &quot;여기에URL을입력&quot;,
  data: {},
  success: function(response){
  console.log(response)
  }</p>
<pre><code>  })</code></pre></li>
</ul>
<ul>
<li>이미지 바꾸기
$(&quot;#아이디값&quot;).attr(&quot;src&quot;, 이미지URL);</li>
</ul>
<p>텍스트 바꾸기 : 
$(&quot;#아이디값&quot;).text(&quot;바꾸고 싶은 텍스트&quot;);</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발일지1]]></title>
            <link>https://velog.io/@o__o/sparta1</link>
            <guid>https://velog.io/@o__o/sparta1</guid>
            <pubDate>Fri, 01 Apr 2022 16:22:11 GMT</pubDate>
            <description><![CDATA[<h2 id="강의자료">강의자료</h2>
<p>우리가 보는 웹페이지는 모두 서버에서 미리 준비해두었던 것을 &quot;받아서&quot;,
&quot;그려주는&quot; 것입니다. 즉, 브라우저가 하는 일은 1) 요청을 보내고, 2) 받은 HTML 파일을 그려주는 일 뿐이죠. 서버가 만들어 놓은 &quot;API&quot;라는 창구에 미리 정해진 약속대로 요청을 보내는 것이랍니다.</p>
<p><strong>HTML은 뼈대, CSS는 꾸미기!</strong>
HTML은 구역과 텍스트를 나타내는 코드로, CSS는 잡은 구역을 꾸며주는 것으로 생각합니다. 
CSS를 잘 사용할 줄 아는 것과, &#39;예쁘게&#39; 만드는 것은 다른 영역이기 때문에(붓을 잡을 줄 아는 것과 그림을 잘 그릴 줄 아는 것의 차이), 많은 경우 웹디자이너나 퍼블리셔에게 의존하게 됩니다.</p>
<p><strong>HTML은 크게 head와 body로 구성된답니다.</strong></p>
<ul>
<li>head안에는 페이지의 속성 정보를, body안에는 페이지의 내용을 담습니다.</li>
<li>head 안에 들어가는 대표적인 요소들: meta, script, link, title 등</li>
<li>body 안에 들어가는 대표적인 요소들!
h1 : 제목
span 특정구역꾸며주기
a 하이퍼링크 href
img 이미지태그 src<blockquote>
<p>ctrl+alt+L (맥은 cmd+alt+L) 로 자동정렬 기능  </p>
</blockquote>
</li>
</ul>
<p><strong>CSS는 <head> ~ </head> 안에 <style> ~ </style> 로 공간을 만들어 작성합니다.</strong>
mytitle라는 클래스를 가리킬 때, .mytitle { ... } 라고 써줘야 하는 것을 꼭! 기억하세요!</p>
<ul>
<li>margin은 바깥 여백을, padding은 내 안쪽 여백</li>
<li>width를 주고, margin: auto를 사용하자! 그래도 안되면? display:block을 추가!</li>
</ul>
<p><strong>부트스트랩이란? 예쁜 CSS를 미리 모아둔 것</strong>
CSS를 다룰 줄 아는 것과, 미적 감각을 발휘하여 예쁘게 만드는 것은 다른 이야기이기 때문에, 현업에서는 미리 완성된 부트스트랩을 가져다 쓰는 경우가 많습니다.</p>
<p><strong>모바일에서는 &quot;가로 사이즈&quot;가 가장 문제</strong>
어디서나 500px 로 맞춰라 (width: 500px)
화면 폭 500px 전에는 95%로 맞추다가, 넘으면 500px으로 보여줘 라고 할 수 있다면?</p>
<blockquote>
<p>width: 95%;
max-width: 500px;</p>
</blockquote>
<p><strong>자바스크립트란 프로그래밍 언어 중 하나로, 브라우저가 알아들을 수 있는 언어입니다.</strong>
클라이언트가 서버에 요청하면, 서버가 클라이언트에게 HTML+CSS+Javascript를 준다..
모든 브라우저는 기본적으로 Javascript를 알아듣게 설계되어있고, 모든 웹서버는 HTML+CSS+Javascript를 주게 되어있죠. </p>
<head> ~ </head> 안에 <script> ~ </script> 로 공간을 만들어 작성합니다.
<script> ~ </script> 내에 자바스크립트를 작성하는 것이죠

<blockquote>
<p>윈도우: F12
&quot;마우스 오른쪽 클릭 → 검사 → console&quot;도 가능!
console.log(변수)</p>
</blockquote>
<h2 id="메모">메모</h2>
<p>토글 열고닫기 : ctrl alt t
개발일지 작성(티스토리, 미디엄, 벨로그)</p>
<p>서버 네이버컴퓨터
브라우저 네이버컴퓨터에 요청 후 가져와서 보여줌 
새로고침 새로 가져옴</p>
<frontend>
html 뼈대
css 꾸미기
js 움직이기

<p>서버는 frontend를 준다</p>
<html>
head </head>
body </body>
h1 : 제목
span 특정구역꾸며주기
a 하이퍼링크 href
img 이미지태그 src

<p>&lt;단축키&gt;
Tab 들여쓰기 Shift Tab 반대들여쓰기
ctrl alt L 왼쪽정렬</p>
<css>
이름을 붙인뒤 꾸미기 태그설정

<p>margin 바깥쪽여백
padding 안쪽여백</p>
<ul>
<li>: 모든 태그에 적용</li>
</ul>
<p>주석달기(태그해제) ctrl+/</p>
<p>css길어지면 파일분리가능</p>
<p>&lt;부트스트랩&gt;
예쁜css꾸러미</p>
<p>hover (버튼 위에 커서올려졌을때를 가정)</p>
<p>*화면 모바일 버전
max-width: 500px;
width: 95%;</p>
<javascript>
프로그래밍언어: 브라우저가 알아들을 수 있는 언어
script와 동일한 화면: 인터넷 창의 f12 console

<p>&lt;프로그래밍언어 5가지&gt;</p>
<p>1) 변수: 값을 담는다
2) 자료형: 숫자, 문자
  리스트:[&#39;&#39;,&#39;&#39;],딕셔너리{&#39;key&#39;:&#39;val&#39;,...}
3) 함수: def()
  function 
    alert
    alert대신에 console.log
4) 조건문: if(), else()
5) 반복문: let ~ 
          for ~ 
           if~ 
            console.log</p>
]]></description>
        </item>
    </channel>
</rss>