<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ryu_36.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Tue, 27 Jun 2023 14:07:35 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. ryu_36.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ryu_36" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[41_git(1)]]></title>
            <link>https://velog.io/@ryu_36/41git1</link>
            <guid>https://velog.io/@ryu_36/41git1</guid>
            <pubDate>Tue, 27 Jun 2023 14:07:35 GMT</pubDate>
            <description><![CDATA[<h2 id="버전-관리">버전 관리</h2>
<h3 id="버전관리-시스템형상관리">버전관리 시스템(형상관리)</h3>
<ul>
<li>Configuration Management Systems</li>
<li>Versino Control Systems</li>
</ul>
<h3 id="버전관리를-하는-이유">버전관리를 하는 이유</h3>
<ul>
<li>Source Data + History</li>
<li>협업, 작업추적, 복구 등이 가능</li>
</ul>
<h2 id="git-등장-배경">Git 등장 배경</h2>
<h3 id="기존-방식">기존 방식</h3>
<ul>
<li>Source Folder + 실행파일을 버전별로 카피하여 관리<ul>
<li>&#39;진짜마지막파일&#39;, &#39;진짜진짜마지막파일&#39;, ...</li>
</ul>
</li>
</ul>
<h3 id="local-version-control-systems">Local Version Control Systems</h3>
<ul>
<li>내 컴퓨터에서 버전 관리 가능 -&gt; 내 컴퓨터 하드가 날아가면 전체 코드 사라짐</li>
<li>버전은 관리되지만, 협업은 여전히 어려움</li>
<li>그래서 중앙에서 관리해보자!</li>
</ul>
<h3 id="centralized-version-control-systems">Centralized Version Control Systems</h3>
<ul>
<li>협업이 가능해짐</li>
<li>Commit 하는 순간 배포되어 다수에게 버그 유발 가능(서버로 바로 commit)</li>
<li>인터넷이 안되면 작업이 불가능</li>
<li>자신만의 version history를 가질 수 없음</li>
<li>그래서 개발된..</li>
</ul>
<h3 id="distributed-version-control-systems">Distributed Version Control Systems</h3>
<ul>
<li>commit 하더라도 개인저장소 내에 적용됨(다른 개발자에게 영향 없음)</li>
<li>원하는 순간에 배포(Push) 가능</li>
<li>오프라인에서도 작업 가능</li>
<li>자신만의 version history를 가짐</li>
</ul>
<h2 id="버전관리-시스템의-종류">버전관리 시스템의 종류</h2>
<h3 id="종류">종류</h3>
<ul>
<li>CVCS: CVS, SVN, etc</li>
<li>DVCS: Mercurial, Git, etc</li>
</ul>
<h3 id="cvs">CVS</h3>
<ul>
<li>1980년대 만들어진 형상관리 시스템</li>
<li>commit 중 오류 발생 시 rollback이 되지 않는 등의 문제</li>
<li>이후 SVN으로 대체</li>
</ul>
<h3 id="svn">SVN</h3>
<ul>
<li>2000년대 만들어졌고 현재까지 두루 사용됨</li>
</ul>
<h3 id="git">Git</h3>
<ul>
<li>SVN보다 빠른 속도와 많은 기능 지원</li>
<li>현재 많은 기업이 사용 중</li>
</ul>
<h2 id="기본-용어">기본 용어</h2>
<h3 id="repository">Repository</h3>
<ul>
<li>소스코드가 저장되어 있는 여러 개의 Branch가 모여있는 디스크상의 물리적 공간</li>
<li>Local Repository와 Remote Repository로 구분</li>
</ul>
<h3 id="checkout">Checkout</h3>
<ul>
<li>특정시점이나 Branch의 소스코드로 이동하는 것을 의미</li>
<li>Checkout 대상 - Branch, Commit, Tag</li>
<li>Checkout 을 통해 과거 여러 시점의 코드로 이동이 가능</li>
</ul>
<h3 id="stage">Stage</h3>
<ul>
<li>작업할 내용이 올라가는 임시저장영역</li>
<li>이 영역을 이용하여 작업한 내용 중 commit에 반영할 파일만 선별하여 commit을 수행할 수 있음</li>
</ul>
<h3 id="commit">Commit</h3>
<ul>
<li>작업할 내용을 Local Repository에 저장하는 과정</li>
<li>각각의 commit은 의미있는 변경단위이고, 변경에 대한 설명을 commit log로 남김</li>
<li>commit은 아끼지 말자</li>
</ul>
<h3 id="tag">Tag</h3>
<ul>
<li>임의의 commit 위치에 쉽게 찾아갈 수 있도록 붙여놓은 이정표</li>
<li>Tag가 붙은 commit은 commit id (version) 대신 tag name으로 쉽게 check out 가능</li>
</ul>
<h3 id="push">Push</h3>
<ul>
<li>Local Repository의 내용 중, Remote Repository에 반영되지 않은 commit을 Remote Repository로 보내는 과정</li>
<li>push하는 순간 다른 개발자들도 영향을 받기 때문에 검증되지 않은 코드는 push하지 않도록 함</li>
</ul>
<h3 id="pull">Pull</h3>
<ul>
<li>Remote Repository에 있는 내용 중, Local Repository에 반영되지 않은 내용을 가져와서 Local Repository에 저장하는 과정</li>
<li>다른 팀원이 변경하고 Push 한 내용을 Local Repository에 가져올 수 있음</li>
<li>Push 과정에서 Conflict(충돌)이 일어나서 Push가 거절된 경우, Pull을 통해 Remote Repository의 변경 내용을 Local Repository에 반영하여 Conflict를 해결한뒤 다시 Push를 시도 해야 함</li>
</ul>
<h3 id="branch">Branch</h3>
<ul>
<li>특정 시점(commit 단위)에서 분기하여 새로운 commit을 쌓을 수 있는 가지를 만드는 것</li>
<li>개발의 주축이 되는 branch를 master branch( 혹은 main branch)라고 함</li>
<li>모든 branch는 최종적으로 다시 master branch에 merge(병합)되는 형식으로 진행됨</li>
</ul>
<h3 id="merge">Merge</h3>
<ul>
<li>Branch의 반대 개념으로 하나의 Branch를 다른 Branch와 합치는 과정</li>
<li>Merge 되는 두 Branch는 주종관계가 성립</li>
<li>Merge되는 과정에서 충돌이 발생하는 경우 Diff를 수정하여 Conflict를 해결한 뒤 Merge를 진행할 수 있음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[40_SQL(10)]]></title>
            <link>https://velog.io/@ryu_36/40SQL10</link>
            <guid>https://velog.io/@ryu_36/40SQL10</guid>
            <pubDate>Tue, 27 Jun 2023 14:07:11 GMT</pubDate>
            <description><![CDATA[<h2 id="subquery">Subquery</h2>
<ul>
<li>하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문을 의미</li>
<li>메인 쿼리가 서브쿼리를 포함하는 종속적 관계</li>
<li>서브쿼리는 메인쿼리의 컬럼 사용 가능</li>
<li>메인쿼리는 서브쿼리의 컬럼 사용 불가</li>
</ul>
<h3 id="주의점">주의점</h3>
<ul>
<li>Subquery는 괄호로 묶어서 사용</li>
<li>단일 행 혹은 복수 행 비교 연산자와 함께 사용 가능</li>
<li>서브쿼리에서는 <code>ORDER BY</code> 사용 불가</li>
</ul>
<h3 id="종류">종류</h3>
<ul>
<li>스칼라 서브쿼리(Scalar Subquery): <code>SELECT</code> 절에 사용</li>
<li>인라인 뷰(Inline View): <code>FROM</code> 절에 사용</li>
<li>중첩 서브쿼리(Nested Subquery): <code>WHERE</code> 절에 사용</li>
</ul>
<h3 id="스칼라-서브쿼리">스칼라 서브쿼리</h3>
<ul>
<li><p><code>SELECT</code> 절에 사용하는 서브쿼리. 결과는 하나의 Column</p>
<pre><code class="language-mysql">SELECT column1, (SELECT column2 FROM table2 WHERE condition)
FROM table1
WHERE condition;</code></pre>
</li>
</ul>
<h3 id="인라인-뷰">인라인 뷰</h3>
<ul>
<li><p><code>FROM</code> 절에 사용하는 서브쿼리. 메인쿼리에서는 인라인 뷰에서 조회한 Column만 사용가능</p>
<pre><code class="language-mysql">SELECT a.column, b.column
FROM table1 a, (SELECT column1, column2 FROM table2) b
WHERE condition;</code></pre>
</li>
</ul>
<h3 id="중첩-서브쿼리">중첩 서브쿼리</h3>
<ul>
<li><code>WHERE</code> 절에서 사용하는 서브쿼리<ul>
<li><code>Single Row</code>: 하나의 열을 검색하는 서브쿼리</li>
<li><code>Multiple Row</code>: 하나 이상의 열을 검색하는 서브쿼리</li>
<li><code>Multiple Column</code>: 하나 이상의 행을 검색하는 서브쿼리</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[39_SQL(9)]]></title>
            <link>https://velog.io/@ryu_36/39SQL9</link>
            <guid>https://velog.io/@ryu_36/39SQL9</guid>
            <pubDate>Tue, 27 Jun 2023 14:06:44 GMT</pubDate>
            <description><![CDATA[<h2 id="집계함수aggregate-function">집계함수(Aggregate Function)</h2>
<h3 id="정의">정의</h3>
<ul>
<li>여러 칼럼 혹은 테이블 전체 칼럼으로부터 하나의 결과값을 반환하는 함수</li>
</ul>
<h3 id="count">COUNT</h3>
<ul>
<li>전체 개수를 반환하는 함수</li>
</ul>
<h3 id="sum">SUM</h3>
<ul>
<li>숫자 컬럼의 합계를 계산하는 함수</li>
</ul>
<h3 id="avg">AVG</h3>
<ul>
<li>숫자컬럼의 평균을 계산하는 함수</li>
</ul>
<h3 id="min">MIN</h3>
<ul>
<li>숫자컬럼의 가장 작은값 반환</li>
</ul>
<h3 id="max">MAX</h3>
<ul>
<li>숫자 컬럼의 가장 큰 값 반환</li>
</ul>
<h3 id="group-by">GROUP BY</h3>
<ul>
<li>그룹화하여 데이터 조회</li>
<li>정렬(ORDER BY)도 같이 사용이 가능하지만 DISTINCT를 사용한 경우에는 불가</li>
</ul>
<h3 id="having">HAVING</h3>
<ul>
<li>조건에 집계함수가 포함되는 경우 <code>WHERE</code>를 사용할 수 없고 <code>HAVING</code>을 사용</li>
</ul>
<h2 id="scalar-function">Scalar Function</h2>
<ul>
<li>입력값을 기준으로 단일 값을 반환하는 함수</li>
</ul>
<h3 id="ucase">UCASE</h3>
<ul>
<li><p>입력값을 대문자로 조회</p>
<pre><code class="language-mysql">SELECT UCASE(&quot;take this&quot;);    # TAKE THIS</code></pre>
</li>
</ul>
<h3 id="lcase">LCASE</h3>
<ul>
<li>입력값을 소문자로 조회</li>
</ul>
<h3 id="mid">MID</h3>
<pre><code class="language-mysql">SELECT MID(string, start_position, length);</code></pre>
<ul>
<li>string: 원본 문자열</li>
<li>start: 문자열 반환 시작위치(1부터 시작)</li>
<li>Length: 반환할 문자열 길이</li>
</ul>
<h3 id="length">LENGTH</h3>
<ul>
<li>문자열의 길이를 반환</li>
<li><code>NULL</code>의 경우 0이 아니라 <code>NULL</code> 값을 반환</li>
</ul>
<h3 id="round">ROUND</h3>
<ul>
<li><p>지정한 자리에서 숫자를 반올림</p>
<pre><code class="language-mysql">SELECT ROUND(number, decimals_place);</code></pre>
<ul>
<li>number: 반올림할 대상</li>
<li>decimals: 반올림할 소수점 위치(Option)</li>
<li><code>decimals_place</code>에는 음수도 줄 수 있고, -1이면 일의 자리에서 반올림</li>
</ul>
</li>
</ul>
<h3 id="now">NOW</h3>
<ul>
<li>현재 날짜 및 시간을 반환</li>
</ul>
<h3 id="format">FORMAT</h3>
<ul>
<li><p>숫자를 천 단위 콤마가 있는 형식으로 반환하는 함수</p>
<pre><code class="language-mysql">SELECT FORMAT(number, decimal_price);</code></pre>
<ul>
<li>number: 포맷을 적용할 문자 혹은 숫자</li>
<li>decimals: 표시할 소수점 위치</li>
<li>소수점 열자리까지 표시 가능하며, 원본 숫자의 소수점 자리수가 지정한 자리수보다 적을 경우 부족한만큼 0으로 채움</li>
<li>원본값이 숫자라도 FORMAT으로 반환된 값은 문자열</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[38_SQL(8)]]></title>
            <link>https://velog.io/@ryu_36/38SQL8</link>
            <guid>https://velog.io/@ryu_36/38SQL8</guid>
            <pubDate>Tue, 27 Jun 2023 14:06:14 GMT</pubDate>
            <description><![CDATA[<h2 id="primary-key">Primary Key</h2>
<ul>
<li>테이블의 각 레코드를 식별</li>
<li>중복되지 않은 고유값을 포함</li>
<li>NULL 값을 포함할 수 없음</li>
<li>테이블 당 하나의 기본키</li>
</ul>
<h3 id="생성">생성</h3>
<ul>
<li><p><code>CREATE TABLE</code> 시에 생성할 수 있음</p>
<pre><code class="language-mysql">CREATE TABLE tablename
(
    column1 datatype NOT NULL,
    column2 datatype NOT NULL,
    ...
    CONSTRAINT constraint_name
        PRIMARY KEY (column1, column2, ...)
)</code></pre>
</li>
<li><p>하나의 컬럼을 줄 수도 있고, 여러 개의 컬럼을 줄 수도 있음</p>
<ul>
<li>여러 개의 컬럼을 준다고 해서 <code>PRIMARY KEY</code>가 여러 개인 것이 아니라 여러 컬럼의 조합이 하나의 기본 키가 되는 것</li>
</ul>
</li>
</ul>
<h3 id="삭제">삭제</h3>
<pre><code class="language-mysql">ALTER TABLE tablename
DROP PRIMARY KEY;</code></pre>
<h3 id="추가">추가</h3>
<pre><code class="language-mysql">ALTER TABLE tablename
ADD PRIMARY KEY (column1, column2, ...);</code></pre>
<h2 id="foreign-key">Foreign Key</h2>
<ul>
<li>한 테이블을 다른 테이블과 연결해주는 역할</li>
<li>참조되는 테이블의 항목은 그 테이블의 기본 키(혹은 단일값)</li>
</ul>
<h3 id="생성-1">생성</h3>
<pre><code class="language-mysql">CREATE TABLE tablename
(
    column1 datatype NOT NULL,
    column2 datatype NOT NULL,
    ...
    CONSTRAINT constraint_name
        PRIMARY KEY (column1, column2, ...)
)</code></pre>
<h3 id="삭제-1">삭제</h3>
<pre><code class="language-mysql">ALTER TABLE tablename
DROP FOREIGN KEY foreign_key;</code></pre>
<h3 id="추가-1">추가</h3>
<ul>
<li><p>이미 생성된 테이블에 FOREIGN KEY를 지정</p>
<pre><code class="language-mysql">ALTER TABLE tablename
ADD FOREIGN KEY (column) REFERENCES person(column);</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[37_SQL(7)]]></title>
            <link>https://velog.io/@ryu_36/37SQL7</link>
            <guid>https://velog.io/@ryu_36/37SQL7</guid>
            <pubDate>Tue, 27 Jun 2023 14:05:36 GMT</pubDate>
            <description><![CDATA[<h2 id="aws-rds">AWS RDS</h2>
<ul>
<li>AWS에서 제공하는 관계형 데이터베이스 서비스</li>
<li>Cloud 상에 Database 구축</li>
</ul>
<h2 id="db-backup">DB Backup</h2>
<pre><code class="language-bash">mysqldump -u username -p dbname &gt; backup.sql</code></pre>
<h2 id="db-restore">DB restore</h2>
<ul>
<li><p>데이터베이스를 백업한 File을 실행하여 그 시점으로 복구하거나 이전할 수 있음</p>
<pre><code class="language-mysql">source backup.sql</code></pre>
</li>
</ul>
<h2 id="table-backup">Table Backup</h2>
<ul>
<li><p>Table 단위로도 백업이 가능</p>
<pre><code class="language-bash">mysqldump -u username -p dbname tablename &gt; backup.sql</code></pre>
</li>
</ul>
<h2 id="table-restore">Table restore</h2>
<ul>
<li>Table 역시 해당 Table을 복구하거나 이전할 수 있음</li>
</ul>
<h2 id="table-schema-backup">Table Schema Backup</h2>
<ul>
<li><p>데이터는 제외하고 테이블 생성 쿼리만 백업할 수 있음</p>
<pre><code class="language-bash">mysqldump -d -u username -p dbname tablename &gt; backup.sql # 특정 Table Schema Backup
mysqldump -d -u username -p dbname &gt; backups.ql # 모든 Table Schema Backup</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[36_SQL(6)]]></title>
            <link>https://velog.io/@ryu_36/36SQL6</link>
            <guid>https://velog.io/@ryu_36/36SQL6</guid>
            <pubDate>Tue, 27 Jun 2023 14:05:06 GMT</pubDate>
            <description><![CDATA[<h2 id="concat">CONCAT</h2>
<ul>
<li><p>여러 문자열들을 하나로 합침</p>
<pre><code class="language-mysql">SELECT CONCAT(&quot;이름: &quot;, name) FROM celeb;</code></pre>
</li>
</ul>
<h2 id="alias">ALIAS</h2>
<ul>
<li><p>컬럼이나 테이블 이름에 별칭 생성</p>
<pre><code class="language-mysql">SELECT [column] as [alias]
FROM ...

SELECT column1, column2, ...
FROM tablename as [alias]</code></pre>
</li>
<li><p><code>as</code>는 생략이 가능</p>
</li>
</ul>
<h2 id="distinct">DISTINCT</h2>
<ul>
<li>검색한 결과의 중복 제거</li>
</ul>
<h2 id="limit">LIMIT</h2>
<ul>
<li>검색결과를 정렬된 순으로 주어진 숫자만큼만 조회</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[35_SQL(5)]]></title>
            <link>https://velog.io/@ryu_36/35SQL5</link>
            <guid>https://velog.io/@ryu_36/35SQL5</guid>
            <pubDate>Tue, 27 Jun 2023 14:04:36 GMT</pubDate>
            <description><![CDATA[<h2 id="join">JOIN</h2>
<h3 id="join이란">JOIN이란?</h3>
<ul>
<li>두 개 이상의 테이블을 결합하는 것</li>
<li><code>INNER JOIN, FULL OUTER JOIN, LEFT JOIN, RIGHT JOIN</code>  등이 있음</li>
</ul>
<h3 id="inner-join">INNER JOIN</h3>
<ul>
<li><p>두 개의 테이블에서 공통된 요소들을 통해 결합하는 방식</p>
<pre><code class="language-mysql">SELECT column1, column2, ...
FROM tableA
INNER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;</code></pre>
</li>
</ul>
<h3 id="left-join">LEFT JOIN</h3>
<ul>
<li>두 개의 테이블에서 공통영역을 포함해 왼쪽 테이블의 다른 데이터를 포함하는 조인방식</li>
</ul>
<h3 id="full-outer-join">FULL OUTER JOIN</h3>
<ul>
<li>두 개의 테이블에서 공통영역을 포함하여 양쪽 테이블의 다른 영역을 모두 포함하는 조인방식</li>
<li>MySQL에서는 FULL JOIN을 지원하지 않음<ul>
<li>따라서 FULL JOIN을 하려면 LEFT JOIN과 RIGHT JOIN을 UNION하여 같은 결과를 얻을 수 있다.</li>
</ul>
</li>
</ul>
<h3 id="self-join">SELF JOIN</h3>
<pre><code class="language-mysql">SELECT column1, column2, ...
FROM tableA, tableB, ...
WHERE condition;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[34_SQL(4)]]></title>
            <link>https://velog.io/@ryu_36/34SQL4</link>
            <guid>https://velog.io/@ryu_36/34SQL4</guid>
            <pubDate>Wed, 21 Jun 2023 13:59:49 GMT</pubDate>
            <description><![CDATA[<h2 id="like">LIKE</h2>
<ul>
<li><p>조건값이 패턴에 맞으면 TRUE</p>
<pre><code class="language-mysql">SELECT *
FROM [table]
WHERE [column] LIKE [pattern];</code></pre>
</li>
<li><p><code>%</code>: 임의의 문자열을 의미</p>
<ul>
<li>ex) &quot;가%&quot;: &quot;가&quot;로 시작하는 문자열</li>
</ul>
</li>
<li><p><code>_</code>: 하나의 문자열을 의미</p>
<ul>
<li>ex) &quot;_가%&quot;: 두 번째 글자가 &quot;가&quot;인 문자열</li>
</ul>
</li>
</ul>
<hr>
<h2 id="union">UNION</h2>
<ul>
<li>여러 개의 SQL 문을 합쳐서 하나의 SQL 문으로 만들어주는 방법</li>
<li>주의 할 점은 컬럼의 개수가 같아야 함<ul>
<li>개수만 같으면 되고 컬럼명이나 데이터 타입은 달라도 됨</li>
</ul>
</li>
</ul>
<h3 id="union-1">UNION</h3>
<ul>
<li>중복된 값을 제거하여 알려줌</li>
</ul>
<h3 id="union-all">UNION ALL</h3>
<ul>
<li>여러 개의 컬럼을 합쳐서 가져올 경우 중복된 값도 모두 보여줌</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[33_SQL(3)]]></title>
            <link>https://velog.io/@ryu_36/33SQL3</link>
            <guid>https://velog.io/@ryu_36/33SQL3</guid>
            <pubDate>Wed, 21 Jun 2023 13:59:29 GMT</pubDate>
            <description><![CDATA[<h2 id="논리연산자">논리연산자</h2>
<h3 id="and">AND</h3>
<ul>
<li>조건을 모두 만족하는 경우 TRUE</li>
</ul>
<h3 id="or">OR</h3>
<ul>
<li>하나의 조건이라도 만족하는 경우 TRUE</li>
</ul>
<h3 id="not">NOT</h3>
<ul>
<li>조건을 만족하지 않는 경우 TRUE</li>
</ul>
<h3 id="between">BETWEEN</h3>
<ul>
<li><p>조건값이 범위 사이에 있으면 TRUE</p>
<pre><code class="language-mysql">SELECT column1, column2
FROM tablename
WHERE column1 BETWEEN value1 AND value2;</code></pre>
</li>
</ul>
<h3 id="in">IN</h3>
<ul>
<li><p>조건값이 목록에 있으면 TRUE</p>
<pre><code class="language-mysql">SELECT * FROM celeb
WHERE age IN (28, 48);</code></pre>
</li>
</ul>
<h3 id="like">LIKE</h3>
<ul>
<li>조건값이 패턴에 맞으면 TRUE</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[32_SQL(2)]]></title>
            <link>https://velog.io/@ryu_36/32SQL2</link>
            <guid>https://velog.io/@ryu_36/32SQL2</guid>
            <pubDate>Wed, 21 Jun 2023 13:59:07 GMT</pubDate>
            <description><![CDATA[<h2 id="user-관리">User 관리</h2>
<h3 id="user-조회">User 조회</h3>
<pre><code class="language-mysql">use mysql;
SELECT host, user FROM user;</code></pre>
<ul>
<li>사용자 정보는 mysql에서 관리하므로 일단 mysql 데이터베이스로 이동 후 조회</li>
</ul>
<h3 id="user-생성---localhost">User 생성 - localhost</h3>
<pre><code class="language-mysql">CREATE USER &#39;username&#39;@&#39;localhost&#39; identified by &#39;password&#39;;</code></pre>
<ul>
<li>현재 PC에서만 접속 가능한 사용자와 비밀번호 생성</li>
</ul>
<pre><code class="language-mysql">CREATE USER &#39;username&#39;@&#39;%&#39; identified by &#39;password&#39;;</code></pre>
<ul>
<li>외부에서 접속 가능한 사용자를 비밀번호와 함께 생성</li>
<li>아이디는 중복이 되면 안되지만 호스트 정보가 다르다면 아이디가 같아도 상관없음</li>
</ul>
<h3 id="user-삭제">User 삭제</h3>
<pre><code class="language-mysql">DROP USER &#39;username&#39;@&#39;localhost&#39;
DROP USER &#39;username&#39;@&#39;%&#39;</code></pre>
<h3 id="user-권한-확인">User 권한 확인</h3>
<pre><code class="language-mysql">SHOW GRANTS FOR &#39;username&#39;@&#39;localhost&#39;;</code></pre>
<h3 id="user-권한-부여">User 권한 부여</h3>
<pre><code class="language-mysql">GRANT ALL ON dbname.* to &#39;username&#39;@&#39;localhost&#39;; 

# 수정 내용이 적용되지 않은 경우 새로고침
FLUSH PRIVILEGES;</code></pre>
<h3 id="user-권한-제거">User 권한 제거</h3>
<pre><code class="language-mysql">REVOKE ALL ON dbname.* from &#39;username&#39;@&#39;localhost&#39;;</code></pre>
<hr>
<h2 id="table">Table</h2>
<h3 id="table-생성">Table 생성</h3>
<ul>
<li><p>데이터베이스 안에서 실제 데이터가 저장되는 형태이고, 행(Row)과 열(column)로 구성된 데이터모음</p>
<pre><code class="language-mysql">CREATE TABLE tablename
(
    columnname datatype,
  ...
)</code></pre>
</li>
</ul>
<h3 id="table-정보-확인">table 정보 확인</h3>
<pre><code class="language-mysql">DESC mytable;</code></pre>
<h3 id="table-이름-변경">Table 이름 변경</h3>
<pre><code class="language-mysql">ALTER TABLE tablename
RENAME new_tablename</code></pre>
<h3 id="table-column-추가변경">table column 추가/변경</h3>
<pre><code class="language-mysql"># column 추가
ALTER TABLE person ADD COLUMN agee double;

# column 변경 - datatype
ALTER TABLE person MODIFY COLUMN agee int;

# column 변경 - table name
ALTER TABLE tablename CHANGE COLUMN [원래 이름] [새로운 이름] [데이터 타입];

# column 삭제
ALTER TABLE person DROP COLUMN agee;</code></pre>
<h3 id="table-삭제">table 삭제</h3>
<pre><code class="language-mysql">DROP TABLE tablename;</code></pre>
<hr>
<h2 id="insert">INSERT</h2>
<h3 id="문법">문법</h3>
<pre><code class="language-mysql">INSERT INTO tablename (column1, column2, ...)
VALUES (value1, value2, ...)</code></pre>
<ul>
<li>주의할 점은 column 순서와 값 순서가 일치해야 함</li>
<li>모든 컬럼값을 추가하는 경우에는 컬럼명을 생략할 수 있음. 다만 추가하는 값의 순서가 컬럼의 순서와 일치해야 함</li>
</ul>
<h2 id="select">SELECT</h2>
<h3 id="문법-1">문법</h3>
<pre><code class="language-mysql"># name, age, sex 컬럼 조회
SELECT name, age, sex FROM perosn;

# 모든 컬럼 조회
SELECT * FROM person;</code></pre>
<h2 id="where">WHERE</h2>
<ul>
<li><p>테이블 내에서 조건을 만족하는 데이터 조회</p>
<pre><code class="language-mysql">SELECT * FROM person WHERE sex=&quot;F&quot;;</code></pre>
</li>
</ul>
<h2 id="update">UPDATE</h2>
<pre><code class="language-mysql">UPDATE [tablename] SET [컬럼명]=[바꿀 값] WHERE [조건];</code></pre>
<h2 id="delete">DELETE</h2>
<pre><code class="language-mysql">DELETE FROM [tablename] WHERE [조건];</code></pre>
<h2 id="order-by">ORDER BY</h2>
<ul>
<li><p>SELECT 문에서 데이터를 특정 컬럼을 기준으로 오름차순 혹은 내림차순 정렬</p>
</li>
<li><p>ASC: 오름차순 정렬(기본값)</p>
</li>
<li><p>DESC: 내림차순 정렬</p>
</li>
<li><p>여러 개의 정렬 기준을 지정할 수 있고, 각각에 대해서 오름차순 or 내림차순 지정 가능</p>
<pre><code class="language-mysql">SELECT name, age
FROM celeb
ORDER BY age DESC, name ASC;</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[31_SQL(1)]]></title>
            <link>https://velog.io/@ryu_36/31SQL1</link>
            <guid>https://velog.io/@ryu_36/31SQL1</guid>
            <pubDate>Wed, 21 Jun 2023 13:58:46 GMT</pubDate>
            <description><![CDATA[<h2 id="database-정의">Database 정의</h2>
<h3 id="database란">Database란?</h3>
<ul>
<li>여러 사람이 공유하여 사용할 목적으로 체계화해 통합, 관리하는 데이터의 집합체</li>
</ul>
<h3 id="dbms란">DBMS란?</h3>
<ul>
<li>Database Management System</li>
<li>사용자와 데이터베이스 사이에서 사용자의 요구에 따라 정보를 생성해주고 데이터베이스를 관리해주는 소프트웨어</li>
</ul>
<h3 id="관계형-데이터베이스란">관계형 데이터베이스란?</h3>
<ul>
<li>Relational Database</li>
<li>서로간에 관계가 있는 데이터 테이블들을 모아둔 데이터 저장공간</li>
</ul>
<h3 id="sql이란">SQL이란?</h3>
<ul>
<li>Structured Query Language</li>
<li>데이터베이스에서 데이터를 정의, 조작, 제어하기 위해 사용하는 언어</li>
</ul>
<h3 id="sql-구성">SQL 구성</h3>
<ul>
<li>데이터 정의 언어(DDL, Data Definition Language)<ul>
<li><code>CREATE, ALTER, DROP</code></li>
</ul>
</li>
<li>데이터 조작 언어(DML, Data Manipulation Language)<ul>
<li><code>INSERT, UPDATE, DELETE, SELECT</code> 등</li>
</ul>
</li>
<li>데이터 제어 언어(DCL, Data Control Language)<ul>
<li><code>GRANT, REVOKE, COMMIT, ROLLBACK</code> 등</li>
</ul>
</li>
</ul>
<h2 id="database-관리">Database 관리</h2>
<h3 id="database-생성">Database 생성</h3>
<pre><code class="language-mysql"># 데이터베이스 생성
CREATE DATABASE testdb;

# 데이터베이스 사용
USE testdb;

# 데이터베이스 삭제
DROP DATABASE testdb;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[30_EDA(7)]]></title>
            <link>https://velog.io/@ryu_36/30EDA7</link>
            <guid>https://velog.io/@ryu_36/30EDA7</guid>
            <pubDate>Wed, 21 Jun 2023 13:58:22 GMT</pubDate>
            <description><![CDATA[<h2 id="beautiful-soup-만으로-해결할-수-없는-것">Beautiful Soup 만으로 해결할 수 없는 것</h2>
<ul>
<li>접근할 웹 주소를 알 수 없을 때</li>
<li>javascript를 사용하는 웹 페이지의 경우</li>
<li>웹 브라우저로 접근하지 않으면 안될 때</li>
</ul>
<h3 id="selenium">Selenium</h3>
<ul>
<li>웹 브라우저를 원격조작하는 도구</li>
<li>자동으로 url을 열고 클릭 등이 가능</li>
<li>스크롤, 문자입력, 화면 캡쳐 등등</li>
</ul>
<h2 id="selenium-기초">Selenium 기초</h2>
<ul>
<li><p>드라이버 실행하기</p>
<pre><code class="language-python">from selenium import webdriver

driver = webdriver.Chrome(&#39;./chromedriver&#39;)
driver.get(&#39;https://www.naver.com/&#39;)</code></pre>
</li>
</ul>
<h3 id="기능">기능</h3>
<pre><code class="language-python"># 화명 최대 크기 설정
driver.maximize_window()

# 화면 최소 크기 설정
driver.minimize_window()

# 화면 크기 설정
driver.set_window_size(600, 600)

# 새로 고침
driver.refresh()

# 앞으로 가기
driver.forward()

# 뒤로 가기
driver.back()

# 클릭
from selenium.webdriver.common.by import By

first_content = driver.find_element(By.CSS_SELECTOR, &quot;#content &gt; div.cover-masonry &gt; div &gt; ul &gt; li:nth-child(1) &gt; a &gt; span.title&quot;)
first_content.click()

# 새로운 탭 생성
driver.execute_script(&#39;window.open(&quot;https://www.naver.com&quot;)&#39;)

# 탭 이동
driver.switch_to.window(driver.window_handles[1])

# (현재) 탭 닫기
driver.close()

# driver.quit()은 전체를 닫음

# 스크롤 가능한 높이(길이)
# 자바스크립트 코드 실행

driver.execute_script(&#39;return document.body.scrollHeight&#39;)

# 화면 스크롤 하단으로 이동
driver.execute_script(&#39;window.scrollTo(0, document.body.scrollHeight);&#39;)

# 현재 보이는 화면의 스크린샷 저장
driver.save_screenshot(&#39;./last-height.png&#39;)

# 화면 스크롤 상단 이동
driver.execute_script(&#39;window.scrollTo(0, 0);&#39;)

# 특정 태그 지점까지 스크롤 이동
from selenium.webdriver import ActionChains

some_tag = driver.find_element(By.CSS_SELECTOR, &#39;#widgetboard &gt; div.RightSecond-module__tool_area___KOtcI &gt; div.RightSecond-module__tool_content___rysfx &gt; div:nth-child(1) &gt; a &gt; div &gt; span.RightSecond-module__link_info_title___Z_U01&#39;)
action = ActionChains(driver)
action.move_to_element(some_tag).perform()</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[29_EDA(6)]]></title>
            <link>https://velog.io/@ryu_36/29EDA6</link>
            <guid>https://velog.io/@ryu_36/29EDA6</guid>
            <pubDate>Wed, 21 Jun 2023 13:57:51 GMT</pubDate>
            <description><![CDATA[<h2 id="beautiful-soup">Beautiful Soup</h2>
<h3 id="beautiful-soup이란">Beautiful Soup이란?</h3>
<ul>
<li><p>태그로 되어있는 문서를 해석하는 기능을 가진 파이썬 모듈</p>
<pre><code class="language-python">from bs4 import BeautifulSoup

page = open(path, &quot;r&quot;).read()
soup = BeautifulSoup(page, &quot;html.parser&quot;)</code></pre>
</li>
</ul>
<h3 id="findtag-find_alltag">.find(tag), .find_all(tag)</h3>
<ul>
<li><code>tag</code>에 해당하는 태그를 처음 발견되는 하나를 찾음</li>
<li>해당하는 <code>tag</code>를 모두 찾고자한다면 <code>find_all</code> 사용. 이 때 반환결과는 <code>list</code></li>
</ul>
<h3 id="css-선택자-정리">CSS 선택자 정리</h3>
<ul>
<li><p>전체: <code>*</code></p>
</li>
<li><p>태그 선택자: <code>[tag name]</code></p>
</li>
<li><p>ID 선택자: <code>#[id name]</code></p>
</li>
<li><p>클래스 선택자: <code>.[class name]</code></p>
</li>
<li><p>복합 선택자: 태그, ID, 클래스를 이어서 작성하면 됨</p>
<ul>
<li>ex) <code>p</code>태그 이면서 <code>overview</code>라는 클래스를 가진 요소 선택: <code>p.overview</code></li>
</ul>
</li>
<li><p>후손 태그 선택: <code>[부모 tag] [자손 tag]</code></p>
<ul>
<li>후손태그는 부모 태그에서 1 level 이상 하위에 있는 모든 태그를 의미</li>
</ul>
</li>
<li><p>자식 태그 선택: <code>[부모 tag] &gt; [자식 tag]</code></p>
<ul>
<li>자식 태그는 부모태그에서 1 level 하위에 있는 태그</li>
</ul>
</li>
</ul>
<h3 id="참고자료">참고자료</h3>
<ul>
<li><a href="https://flukeout.github.io/">https://flukeout.github.io/</a></li>
<li>css 선택자를 연습할 수 있는 사이트</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[28_EDA(5)]]></title>
            <link>https://velog.io/@ryu_36/28EDA5</link>
            <guid>https://velog.io/@ryu_36/28EDA5</guid>
            <pubDate>Wed, 21 Jun 2023 13:57:23 GMT</pubDate>
            <description><![CDATA[<h2 id="folium">folium</h2>
<ul>
<li>지도를 활용하여 데이터를 시각화할 수 있도록 도와주는 라이브러리</li>
<li>지도를 활용하고, 다양한 Marker를 추가하거나 원으로 범위를 표시하는 등의 유용한 기능 제공</li>
</ul>
<h3 id="foliummarker">folium.Marker()</h3>
<ul>
<li>지도에 마커 생성</li>
<li><code>location</code>: 위도, 경도로 위치 지정</li>
<li><code>popup, tooltip, icon</code> 등으로 마커를 클릭하거나 마우스를 가져다 댔을 때 정보를 전달할 수 있고, 아이콘이나 색상으로 마커를 꾸밀 수 있음</li>
</ul>
<h3 id="foliumclickformarker">folium.ClickForMarker()</h3>
<ul>
<li>지도에서 특정 위치를 클릭했을 때 해당 위치에 마커 생성</li>
</ul>
<h3 id="foliumlatlngpopup">folium.LatLngPopup()</h3>
<ul>
<li>지도를 마우스로 클릭할 때 위도, 경도 정보 반환</li>
</ul>
<h3 id="foliumcircle-foliumcirclemarker">folium.Circle(), folium.CircleMarker()</h3>
<ul>
<li>원형 범위 표시</li>
</ul>
<h3 id="foliumchoropleth">folium.Choropleth</h3>
<ul>
<li>지도 위에 데이터 값에 따라 영역별로 구분하여 표시가 가능</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[27_EDA(5)]]></title>
            <link>https://velog.io/@ryu_36/27EDA5</link>
            <guid>https://velog.io/@ryu_36/27EDA5</guid>
            <pubDate>Fri, 02 Jun 2023 15:19:43 GMT</pubDate>
            <description><![CDATA[<h2 id="seaborn">Seaborn</h2>
<h3 id="seaborn이란">seaborn이란?</h3>
<ul>
<li>Matplotlib를 기반으로 다양한 색상 테마와 통계용 차트 등의 기능을 추가한 시각화 패키지</li>
<li><code>import</code> 하는 것 만으로도 무언가 효과가 있음</li>
<li>보통 <code>sns</code>로 네이밍 함</li>
</ul>
<h3 id="시각화-기능">시각화 기능</h3>
<ul>
<li>스타일<ul>
<li><code>sns.set_style(스타일)</code></li>
<li>white, dark, whitegrid, darkgrid 등등</li>
</ul>
</li>
<li><code>.despine()</code> <ul>
<li>위쪽과 오른쪽 축을 숨길 수 있음</li>
<li><code>top, left, right, bottom</code>에 <code>bool</code> 값을 줌으로써 축을 숨길 수 있으며, 기본 값은 <code>top, right</code>이 <code>True</code> 값을 가짐</li>
</ul>
</li>
<li><code>.boxplot()</code><ul>
<li><code>hue</code> 속성: 범주형 변수를 이용하여 세분화</li>
</ul>
</li>
<li><code>.swarmplot()</code><ul>
<li>데이터의 분포를 확인할 수 있도록 점으로 표시</li>
</ul>
</li>
<li><code>.lmplot()</code><ul>
<li>두 변수 사이의 관계 파악</li>
<li>마찬가지로 <code>hue</code> 옵션을 사용하면 더 분명한 대비가 가능</li>
</ul>
</li>
<li><code>.pivot()</code></li>
<li><code>.heatmap()</code><ul>
<li>전체 경향 파악에 용이</li>
</ul>
</li>
<li><code>.pairplot()</code><ul>
<li>다수의 컬럼을 비교</li>
</ul>
</li>
<li><code>lmplot()</code><ul>
<li>데이터의 분포와 회귀선을 함께 나타냄</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[26_EDA(4)]]></title>
            <link>https://velog.io/@ryu_36/26EDA4</link>
            <guid>https://velog.io/@ryu_36/26EDA4</guid>
            <pubDate>Fri, 02 Jun 2023 13:20:53 GMT</pubDate>
            <description><![CDATA[<h2 id="pandas에서의-반복문">Pandas에서의 반복문</h2>
<ul>
<li><code>iterrows()</code>를 사용하는 것이 좋음</li>
<li>Pandas의 데이터프레임은 대부분 2차원</li>
<li>이럴 때 for 문을 사용하면 n번째라는 지정을 반복해서 가독률이 떨어짐</li>
<li>따라서 <code>itterows()</code>를 사용하는 것이 좋고 받을 때 인덱스와 내용으로 나누어 받는다는 것만 주의</li>
</ul>
<h2 id="멀티인덱스에서-비사용-level의-제거">멀티인덱스에서 비사용 level의 제거</h2>
<ul>
<li><p>엑셀로 정의된 표를 데이터로 불러오다보면 <code>index</code>가 다중구조로 되어있는 경우가 있음</p>
</li>
<li><p>예컨대 범죄 종류에서 첫 단계로 강도 - 폭행 - 살인으로 나누어져있고, 각각에서 발생 - 검거 등으로 나뉜 경우 멀티인덱스가 됨</p>
</li>
<li><p>이런 경우 데이터 활용을 위해서 하나의 단계로 합쳐주는 등의 작업이 필요한데 이 때 <code>get_level_values()</code> 메서드를 사용할 수 있음</p>
<ul>
<li><p>예시</p>
<pre><code class="language-python">crime_station.columns    # 컬럼 조회
&quot;&quot;&quot;
MultiIndex([(&#39;강간&#39;, &#39;검거&#39;),
                        (&#39;강간&#39;, &#39;발생&#39;)])
&quot;&quot;&quot;

crime_station.columns.get_level_values(0)[0] + crime_station.columns.get_level_values(1)[0]
# 강간검거</code></pre>
<p>위와 같은 과정을 반복문을 활용하여 <code>index</code>를 정리해줄 수 있음</p>
</li>
</ul>
</li>
</ul>
<h2 id="피벗테이블">피벗테이블</h2>
<ul>
<li>특정 인덱스를 기준으로 데이터를 정리할 때 사용</li>
<li><code>pd.pivot_table(데이터프레임, index, aggfunc)</code><ul>
<li><code>index</code>에는 어떤 인덱스를 기준으로 정리할 것인지, <code>aggfunc</code>에는 어떤 연산을 적용할 것인지를 넣어줌</li>
<li>예를 들어 <code>aggfunc=np.sum</code>이라면 총합을 계산함</li>
</ul>
</li>
</ul>
<h2 id="컬럼-끼리의-연산">컬럼 끼리의 연산</h2>
<h3 id="컬럼을-컬럼으로-나누기">컬럼을 컬럼으로 나누기</h3>
<ul>
<li><code>crime_anal_gu[컬럼1] / crime_anal_gu[컬럼2]</code></li>
</ul>
<h3 id="다수의-컬럼을-하나의-컬럼으로-나누기">다수의 컬럼을 하나의 컬럼으로 나누기</h3>
<ul>
<li><code>crime_anal_gu[[컬럼1, 컬럼2]].div(crime_anal_gu[컬럼3], axis=0)</code></li>
</ul>
<h3 id="다수의-컬럼을-다수의-컬럼으로-각각-나누기">다수의 컬럼을 다수의 컬럼으로 각각 나누기</h3>
<ul>
<li><code>crime_anal_gu[컬럼리스트1].div(crime_anal_gu[컬럼리스트2].values)</code></li>
<li>이때 컬럼리스트1과 2의 길이가 다르면 에러가 발생함</li>
</ul>
<h2 id="컬럼-이름-변경">컬럼 이름 변경</h2>
<ul>
<li><code>.rename()</code><ul>
<li>변경 전 컬럼 이름을 <code>key</code>, 변경하려는 컬럼 이름을 <code>value</code>로 한 딕셔너리 형태로 인자로 넣어줌</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[25_EDA(3)]]></title>
            <link>https://velog.io/@ryu_36/25EDA3</link>
            <guid>https://velog.io/@ryu_36/25EDA3</guid>
            <pubDate>Thu, 01 Jun 2023 07:31:48 GMT</pubDate>
            <description><![CDATA[<h2 id="데이터-병합하기">데이터 병합하기</h2>
<h3 id="merge를-이용한-데이터-병합">merge를 이용한 데이터 병합</h3>
<ul>
<li><code>pd.merge(left, right, how=&quot;left&quot;, on=&quot;key&quot;)</code><ul>
<li><code>on</code>은 무엇을 기준으로 병합시킬 것인지 지정</li>
<li><code>how</code>는 어디에 병합시킬 것인지 지정. <code>left</code>로 정해졌으면 <code>left</code>의 <code>key</code>는 전부 보존됨</li>
<li><code>right</code>에 <code>left</code>의 <code>key</code>에 대응되는 데이터가 없으면 <code>Nan</code></li>
<li><code>how=&quot;outer&quot;, how=&quot;inner&quot;</code> 등등도 있음. <code>inner</code>가 기본값</li>
</ul>
</li>
</ul>
<h3 id="병합-후-정리하기">병합 후 정리하기</h3>
<ul>
<li><code>data_result.set_index(&quot;구별&quot;, inplace=True)</code><ul>
<li>&quot;구별&quot;을 <code>index</code>로 지정한다는 것</li>
<li>데이터를 정리하는 과정에서 <code>index</code>를 재지정하는 경우가 있음</li>
<li><code>unique</code>한 데이터를 <code>index</code>로 잡자</li>
</ul>
</li>
</ul>
<h2 id="상관관계">상관관계</h2>
<ul>
<li>두 변량 사이에 한쪽이 증가하면 다른 쪽도 증가/감소 하는 경향이 있을 때 두 변량 사이에 상관관계가 있다고 함</li>
<li>주의할 것은 상관관계가 있다는 것이 인과관계임을 의미하지는 않음</li>
<li>0.2이하이면 상관관계가 없거나 무시해도 좋은 수준, 0.4이하이면 약한 상관관계, 0.6 이상이면 강한상관관계에 있다고 판단</li>
<li><code>data_result.corr()</code></li>
<li>따라서 무조건 CCTV 비율이 높은 곳을 찾는게 아니라 구별 인구대비 현황을 분석하여 &quot;상대적으로&quot; CCTV가 적거나 많은 구를 찾는 것이 의미를 가짐</li>
</ul>
<hr>
<h2 id="matplotlib-기초">matplotlib 기초</h2>
<ul>
<li>파이썬의 대표적인 시각화 도구</li>
<li>일반적으로 plt라고 naming함</li>
<li>Jupyter notebook을 사용할 때 결과가 out session에 나타나는 것이 유리하므로 <code>%matplotlib inline</code> 옵션을 사용</li>
</ul>
<h3 id="matpllotlibpyplot">matpllotlib.pyplot</h3>
<ul>
<li><p>2D 그래프를 담당</p>
<pre><code class="language-python">import matplotlib.pyplot as plt
# %matplotlib inline
get_ipython().run_line_magic(&quot;matplotlib&quot;, &quot;inline&quot;)</code></pre>
</li>
</ul>
<h3 id="삼각함수-그리기">삼각함수 그리기</h3>
<ul>
<li><code>numpy</code>의 <code>sin</code>함수<ul>
<li><code>np.arrage(a, b, s)</code></li>
<li><code>np.sin(value)</code></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[24_EDA(2)]]></title>
            <link>https://velog.io/@ryu_36/24EDA2</link>
            <guid>https://velog.io/@ryu_36/24EDA2</guid>
            <pubDate>Mon, 29 May 2023 15:32:39 GMT</pubDate>
            <description><![CDATA[<h2 id="전체적인-흐름-및-목표">전체적인 흐름 및 목표</h2>
<p><img src="https://velog.velcdn.com/images/ryu_36/post/3ad6afc3-a61e-4a5d-9a95-f8d1403b2b8e/image.png" alt=""></p>
<h2 id="pandas로-csv-엑셀-파일-읽기">Pandas로 csv, 엑셀 파일 읽기</h2>
<h3 id="pandas란">pandas란?</h3>
<ul>
<li>R만큼의 강력한 데이터 핸들링 성능을 제공하는 모듈</li>
<li>표로 되어있는 숫자 데이터를 읽는 데 가장 많이 사용됨</li>
</ul>
<h3 id="csv-파일-읽기">csv 파일 읽기</h3>
<ul>
<li><code>import pandas as pd</code></li>
<li><code>pd.read_csv(경로, 인코딩)</code></li>
<li>다른 파일형식을 읽고 싶다면 <code>read_파일형식</code>을 지정하면 됨</li>
</ul>
<h3 id="pandas-dataframe의-구조">pandas dataframe의 구조</h3>
<ul>
<li>Column Name: 세로 방향의 데이터들의 이름</li>
<li>Index: 가로방향의 데이터들의 이름</li>
<li>Column</li>
<li>Values</li>
<li><code>.columns</code>: column의 이름을 조회할 수 있음</li>
</ul>
<h3 id="column명-변경하기">column명 변경하기</h3>
<ul>
<li><code>CCTV_Seoul.rename(columns={CCTV_Seoul.columns[0]: &quot;구별&quot;}, inplace=True)</code><ul>
<li>기존 CCTV_Seoul의 첫번째 컬럼명을 &quot;구별&quot;로 변경하는 코드. <code>inplace</code>값을 <code>True</code>로 주어야 함</li>
</ul>
</li>
</ul>
<h3 id="필요한-컬럼-지정하기">필요한 컬럼 지정하기</h3>
<ul>
<li><code>pd.read_excel(경로, header=2, usecols=&quot;B, D, G, J, N&quot;)</code><ul>
<li><code>header</code>: 자료를 읽기 시작할 행</li>
<li><code>usecols</code>: 읽어올 엑셀의 컬럼</li>
</ul>
</li>
</ul>
<h3 id="데이터-조회하기">데이터 조회하기</h3>
<ul>
<li><code>.head()</code><ul>
<li>기본값은 5행이고 조회할 데이터 수를 조절하고 싶다면 인자로 조회할 데이터 수를 주면 됨. 기본값이 5</li>
</ul>
</li>
<li><code>.tail()</code><ul>
<li>데이터의 끝에서부터 조회. 데이터의 총 수를 알기 좋음</li>
</ul>
</li>
</ul>
<hr>
<h2 id="pandas-기초">pandas 기초</h2>
<ul>
<li><p>pandas의 데이터형을 구성하는 기본은 <code>series</code></p>
<ul>
<li><code>a = pd.series([1, 2, 3])</code></li>
</ul>
</li>
<li><p>날짜, 시간 이용</p>
<ul>
<li><code>dates = pd.date_range(&quot;20130101&quot;, periods=6)</code></li>
<li>2013년 1월 1일부터 6일간</li>
</ul>
</li>
<li><p>pandas에서 가장 많이 사용되는 데이터형은 <code>DataFrame</code>이고 index와 columns를 지정</p>
<ul>
<li><code>df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=[&quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;])</code></li>
</ul>
</li>
<li><p><code>head()</code></p>
<ul>
<li>앞부분 5개</li>
</ul>
</li>
<li><p><code>.index, .columns, .values</code></p>
</li>
<li><p><code>.info()</code></p>
<ul>
<li><code>DataFrame</code>의 기본정보 확인</li>
<li>각 컬럼의 크기와 데이터 형태를 확인하는 경우가 많음</li>
</ul>
</li>
<li><p><code>.describe()</code></p>
<ul>
<li><code>DataFrame</code>의 통계적 기본정보 확인(평균, 표준편차 등등)</li>
</ul>
</li>
<li><p><code>.sort_values(by=기준, ascending=True)</code></p>
<ul>
<li>정렬</li>
</ul>
</li>
<li><p><code>df[&quot;A&quot;]</code></p>
<ul>
<li>&quot;A&quot; 컬럼만 읽기</li>
<li><code>slice</code>로 지정 가능<ul>
<li>인덱스나 컬럼의 &quot;이름&quot;으로 slice하는 경우 리스트에서의 <code>slice</code>와 달리 끝을 포함함</li>
</ul>
</li>
</ul>
</li>
<li><p><code>df.loc[:, [&quot;A&quot;, &quot;B&quot;]]</code></p>
<ul>
<li>행과 열을 지정</li>
<li><code>:</code>는 모든 행 또는 열을 의미</li>
<li>컬럼이나 인덱스의 &quot;이름&quot;으로 접근</li>
</ul>
</li>
<li><p><code>df.iloc[3]</code></p>
<ul>
<li>번호로 접근</li>
<li><code>df.iloc[[1, 2, 4], [0, 2]]</code>: 1, 2, 4번 행 + 0, 2번 열</li>
</ul>
</li>
<li><p><code>df[조건]</code></p>
<ul>
<li>조건에 맞는 데이터를 조회</li>
<li>단 pandas의 버전에 따라 조금씩 허용되는 문법이 다르기 때문에 버전확인 필요</li>
</ul>
</li>
<li><p><code>df[컬럼명]</code></p>
<ul>
<li>컬럼명이 기존에 존재하지 않을 때는 <code>df[컬럼명] = 데이터</code>와 같이 데이터를 추가할 수 있음</li>
</ul>
</li>
<li><p><code>.isin(확인할 데이터)</code></p>
<ul>
<li>데이터가 있는지 확인</li>
</ul>
</li>
<li><p><code>del df[&quot;E&quot;]</code></p>
<ul>
<li>특정 컬럼 제거</li>
</ul>
</li>
<li><p><code>.apply(함수)</code></p>
<ul>
<li>함수를 데이터들에 적용</li>
</ul>
</li>
</ul>
<p>​    </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[23_EDA(1)]]></title>
            <link>https://velog.io/@ryu_36/23EDA1</link>
            <guid>https://velog.io/@ryu_36/23EDA1</guid>
            <pubDate>Mon, 29 May 2023 15:31:33 GMT</pubDate>
            <description><![CDATA[<h2 id="가상환경">가상환경</h2>
<h3 id="가상환경-생성">가상환경 생성</h3>
<ul>
<li><code>conda create -n 가상환경이름 python=버전</code></li>
</ul>
<h3 id="가상환경-활성화">가상환경 활성화</h3>
<ul>
<li><code>conda activate 가상환경이름</code> or <code>source activate 가상환경이름</code></li>
</ul>
<h3 id="가상환경-종료">가상환경 종료</h3>
<ul>
<li><code>deactivate</code></li>
</ul>
<h3 id="가상환경-제거">가상환경 제거</h3>
<ul>
<li><code>conda env remove -n 가상환경이름</code></li>
</ul>
<h2 id="matplotlib-한글설정">matplotlib 한글설정</h2>
<h3 id="matplotlib란">matplotlib란?</h3>
<ul>
<li>파이썬에서 사용하는 기본 그래픽 표현도구</li>
<li>기본적으로 설정되어있는 폰트가 한글을 지원하지 않음
<img src="https://velog.velcdn.com/images/ryu_36/post/86eaac58-28bb-450d-aaa8-71c3269cd3f7/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryu_36/post/586f089b-019c-4b75-b26a-45bafabd49f4/image.png" alt=""></p>
<ul>
<li>따라서 해결방법은 기본 폰트를 한글을 지원하는 폰트로 변경해주면 됨
<img src="https://velog.velcdn.com/images/ryu_36/post/70b34fac-5270-4342-8a7a-72d0c8f98c72/image.png" alt=""></li>
</ul>
<h2 id="colab-환경-설정">Colab 환경 설정</h2>
<h3 id="matplotlib-한글-문제-해결">matplotlib 한글 문제 해결</h3>
<ol>
<li><p>아래의 코드 실행</p>
<pre><code class="language-bash">!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf</code></pre>
</li>
<li><p>런타임 - 런타임 다시 시작 실행</p>
</li>
<li><p>아래 코드로 한글이 정상적으로 나타나는지 확인</p>
<pre><code class="language-python">import matplotlib.pyplot as plt 
%matplotlib inline

plt.rcParams[&quot;font.family&quot;] = &#39;NanumGothic&#39;

plt.title(&#39;그래프&#39;)
plt.show()</code></pre>
</li>
<li><p>실행할 때마다 위 과정을 반복</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[22_알고리즘 주간을 마치며]]></title>
            <link>https://velog.io/@ryu_36/22%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%A3%BC%EA%B0%84%EC%9D%84-%EB%A7%88%EC%B9%98%EB%A9%B0</link>
            <guid>https://velog.io/@ryu_36/22%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%A3%BC%EA%B0%84%EC%9D%84-%EB%A7%88%EC%B9%98%EB%A9%B0</guid>
            <pubDate>Mon, 29 May 2023 15:29:44 GMT</pubDate>
            <description><![CDATA[<h2 id="정렬-알고리즘은-왜-이렇게-다양할까">정렬 알고리즘은 왜 이렇게 다양할까</h2>
<ul>
<li>알고리즘을 공부하면서 가장 궁금했던 점 중 하나는 &#39;왜 정렬 알고리즘에 필요 이상으로 많은 무게가 실려있는가&#39;였다. 어차피 Python의 경우에는 <code>sort</code>메서드나 <code>sorted</code> 함수를 이용하지 굳이 정렬을 직접 구현하여 쓰게 될 일은 거의 없을 것 같았고, 실제로도 그래왔기 때문이다.</li>
<li>그래서 조금 검색하며 생각해본 결과 어느 정도는 그 이유를 이해할 수 있었다. 간단하게 요약하자면 문제 해결에 있어서 필요한 여러가지 사고 방식을 익힐 수 있었고, 상대적으로 열위에 있는 방법이라고 하더라도 상황에 따라 좋을 수 있으며, 개발에 있어 고려해야할 여러 사항을 알 수 있다.</li>
</ul>
<h3 id="문제해결에-필요한-다양한-사고">문제해결에 필요한 다양한 사고</h3>
<ul>
<li>버블소트와 같은 방식에서는 완전탐색 방식을 살펴볼 수 있고, 병합정렬에서는 문제해결에 있어 중요한 사고 방식 중 하나인 분할정복을 학습할 수 있었다. 또한 힙정렬과 같이 여러 자료구조가 활용되기도 한다.</li>
<li>이렇게 종류가 다양한만큼 다양한 수단과 사고가 녹아있는 곳이 정렬 알고리즘이 아닐까 생각한다.</li>
</ul>
<h3 id="상황에-따라-적절한-알고리즘이-다르다">상황에 따라 적절한 알고리즘이 다르다</h3>
<ul>
<li>일반적으로 학습하는 퀵정렬, 병합정렬, 버블정렬, 삽입정렬 등등 다양한 정렬방식에서 병합정렬은 최선, 평균, 최악의 시간복잡도가 모두 <code>O(N logN)</code>으로 가장 괜찮은 정렬 방식으로 여겨진다. </li>
<li>반대로 버블정렬의 경우 이런 정렬을 누가 쓸까 싶을 정도로 단순하지만 비효율적인 정렬방식으로 생각된다. 하지만 버블정렬은 최선의 경우 시간복잡도가 <code>O(N)</code>이 된다(보통 정렬이 되어있는 경우에 그렇다). 이런 사실을 놓고본다면 일반적으로 정렬 알고리즘을 학습할 때 배우는 알고리즘들 중 가장 좋다고 여겨지는 병합정렬보다 어떤 상황에서는 최악이라고 여겨지는 버블정렬이 나은 경우도 있다는 것이다.</li>
<li>따라서 주어진 상황을 잘 고려해서 상황에 맞는 알고리즘을 잘 가져다가 사용하는 역량이 중요하다고 할 수 있겠다.</li>
</ul>
<h3 id="여러-고려사항의-존재">여러 고려사항의 존재</h3>
<ul>
<li>윗 문단과 어느정도 통하는 얘기지만 시간복잡도가 고려사항의 전부는 아니라는 것이다. 때로는 정렬 수행시간보다 메모리를 적게 쓰는 것이 중요한 상황이 있을 수도 있고, 주어지는 데이터의 길이가 길지 않아서 시간보다는 코드를 간결하게 작성하는 것이 중요한 경우도 있을 수 있겠다(실무에서 그런 일이 있을지는 잘 모르겠다). </li>
<li>이렇듯 일반적으로 알고리즘을 배울 때 시간복잡도를 굉장히 중시하지만 하나의 각도에서만 보지말고 다양한 각도에서 보는 것 또한 중요하다는 생각을 할 수 있었다.</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>