<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hugh_y.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 17 Dec 2023 22:16:57 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. hugh_y.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hugh_y" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[ZB] SQL 05]]></title>
            <link>https://velog.io/@hugh_y/ZB-SQL-05</link>
            <guid>https://velog.io/@hugh_y/ZB-SQL-05</guid>
            <pubDate>Sun, 17 Dec 2023 22:16:57 GMT</pubDate>
            <description><![CDATA[<h1 id="subquery">Subquery</h1>
<ul>
<li>SQL문 안에 포함된 또 다른 SQL문
메인쿼리가 서브쿼리를 포함하는 종속적인 관계이다.<ul>
<li>서브쿼리는 메인쿼리의 칼럼 사용 가능</li>
<li>메인쿼리는 서브쿼리의 칼럼 사용 불가</li>
</ul>
</li>
<li>Subquery는 괄호로 묶어서 사용</li>
<li>단일 행 혹은 복수 행 비교 연산자와 함께 사용 가능</li>
<li>Subquery에는 order by 사용 X</li>
</ul>
<h2 id="subquery-종류">Subquery 종류</h2>
<ul>
<li>Scalar Subquery: SELECT 절에 사용</li>
<li>Inline View: FROM 절에 사용</li>
<li>Nested Subquery: WHERE 절에 사용</li>
</ul>
<h3 id="scalar-subquery">Scalar subquery</h3>
<ul>
<li>SELECT 절에 사용하며, 결과는 하나의 column이어야 한다.<pre><code class="language-sql">SELECT column1, (SELECT column2
               FROM tabe2
               WHERE condition)
FROM table1
WHERE condition;</code></pre>
</li>
</ul>
<blockquote>
<p>ex)</p>
<pre><code class="language-sql">SELECT case_number 은평강도검거, (SELECT avg(case_number)
                                 FROM crime_status
                                 WHERE crime_type LIKE &#39;강도&#39; AND status_type LIKE &#39;검거&#39;) 평균강도검거
FROM crime_status
WHERE police_station LIKE &#39;은평&#39; AND crime_type LIKE &#39;강도&#39; AND status_type LIKE &#39;검거&#39;;</code></pre>
</blockquote>
<h3 id="inline-view">Inline View</h3>
<ul>
<li>FROM 절에 사용하는 서브쿼리, 메인쿼리에서는 인라인 뷰에서 조회한 Column만 사용 가능<pre><code class="language-sql">SELECT a.column, b.column
FROM table a, (SELECT column1, column2 FROM table2) b
WHERE condition</code></pre>
<blockquote>
<p>ex)</p>
<pre><code class="language-sql">SELECT c.police_station, c.crime_type, c.case_number
FROM crime_status c, (
SELECT police_station, max(case_number) count
FROM crime_status
WHERE status_type LIKE &#39;발생&#39;
GROUP BY police_station) m
WHERE c.police_station = m.police_station AND c.case_number = m.count;</code></pre>
<blockquote>
<p>활용예시
<img src="https://velog.velcdn.com/images/hugh_y/post/b0bb30c9-385c-4986-9142-610b1acf4007/image.png" alt="">
<img src="https://velog.velcdn.com/images/hugh_y/post/4337722e-81d4-48f4-bddb-958031516961/image.png" alt=""></p>
</blockquote>
</blockquote>
</li>
</ul>
<h3 id="nested-subquery">Nested Subquery</h3>
<h4 id="single-row">Single Row</h4>
<p>-하나의 열을 검색하는 서브쿼리
서브쿼리가 비교연산자와 사용되는 경우, 서브쿼리의 검색 결과는 한 개의 결과값을 가져야 한다.(두 개 이상인 경우 에러)</p>
<pre><code class="language-sql">SELECT column_name
FROM table_name
WHERE column_name = (SELECT column_name
                FROM table_name
                WHERE condition)
ORDER BY column_name;</code></pre>
<blockquote>
<p>ex)</p>
<pre><code class="language-sql">SELECT 상호, 가격
FROM oil_price
WHERE 가격 &gt; (SELECT host
              FROM snl_show
              WHERE id=1);</code></pre>
<blockquote>
<p>활용예시
<img src="https://velog.velcdn.com/images/hugh_y/post/498f08ea-6ceb-446f-adf8-3855350036df/image.png" alt=""></p>
</blockquote>
</blockquote>
<h4 id="multiple-row">Multiple Row</h4>
<ul>
<li><p>하나 이상의 열을 검색하는 서브쿼리</p>
</li>
<li><p>IN: 서브쿼리 결과 중에 포함될 때</p>
<pre><code class="language-sql">SELECT column_names
FROM table_name
WHERE column_name IN (SELECT column_name
                    FROM column_name
                    WHERE condition)
ORDER BY column_names;</code></pre>
<blockquote>
<p>ex)</p>
<pre><code class="language-sql">SELECT host
FROM snl_show
WHERE host IN (SELECT name
             FROM celeb
             WHERE job_title LIKE &#39;%영화배우%&#39;);</code></pre>
<blockquote>
<p>활용예시
<img src="https://velog.velcdn.com/images/hugh_y/post/63dd5929-65db-45a2-b62c-3ad673357b01/image.png" alt=""></p>
</blockquote>
</blockquote>
</li>
<li><p>EXISTS: 서브쿼리 결과에 값이 있으면 반환</p>
<pre><code class="language-sql">SELECT column_names
FROM table_name
WHERE EXISTS (SELECT column_name
                    FROM column_name
                    WHERE condition)
ORDER BY column_names;</code></pre>
<blockquote>
<p>ex)</p>
<pre><code class="language-sql">SELECT name
FROM police_station p
WHERE EXISTS (SELECT police_station
            FROM crime_status c
            WHERE p.name=c.reference AND case_number &gt; 2000);</code></pre>
</blockquote>
</li>
<li><p>ANY: 서브쿼리 결과 중 최소 하나라도 만족하면 (비교연산자 사용)</p>
<pre><code class="language-sql">SELECT column_names
FROM table_name
WHERE column_name = ANY (SELECT column_name
                       FROM column_name
                         WHERE condition)
ORDER BY column_names;</code></pre>
<blockquote>
<p>ex)</p>
<pre><code class="language-sql">SELECT name
FROM celeb
WHERE name = ANY (SELECT host
                FROM snl_show);</code></pre>
</blockquote>
</li>
<li><p>ALL: 서브쿼리 결과를 모두 만족하면(비교연산자 사용)</p>
<pre><code class="language-sql">SELECT column_name
FROM table_name
WHERE column_name = (SELECT column_name
                   FROM table_name
                     WHERE condition)
ORDER BY column_name;</code></pre>
<blockquote>
<p>ex)</p>
<pre><code class="language-sql">SELECT name
FROM celeb
WHERE name = ALL (SELECT host
            FROM snl_show
            WHERE id=1);</code></pre>
</blockquote>
</li>
</ul>
<h4 id="multiple-columnl">Multiple ColumnL</h4>
<ul>
<li>하나 이상의 행을 검색하는 서브쿼리<pre><code class="language-sql">SELECT column_names
FROM tablename a
WHERE (a.column, column2, ...) IN (SELECT b.column1, column2, ...)
                                 FROM tablename b
                                 WHERE a.columnname = b.columnname);</code></pre>
</li>
</ul>
<blockquote>
<p>ex)</p>
<pre><code class="language-sql">SELECT name, sex, agency
FROM celeb
WHERE (sex, agency) IN (SELECT sex, agency
                        FROM celeb
                        WHERE name=&#39;강동원&#39;);</code></pre>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ZB] SQL 04
]]></title>
            <link>https://velog.io/@hugh_y/ZB-SQL-04</link>
            <guid>https://velog.io/@hugh_y/ZB-SQL-04</guid>
            <pubDate>Sat, 16 Dec 2023 21:31:46 GMT</pubDate>
            <description><![CDATA[<h1 id="aggregate-functions-집계함수">Aggregate Functions (집계함수)</h1>
<ul>
<li>COUNT: 촉 갯수를 계산해주는 함수
SUM: 합계
AVG: 평균
MIN: 가장 작은 값
MAX: 가장 큰 값
FIRST: 첫 번째 결과값을 리턴
LAST: 마지막 결과값을 리턴</li>
</ul>
<h2 id="count">COUNT</h2>
<ul>
<li>갯수를 파악할 때 사용</li>
<li>DISTINCT와 함께 사용하면 중복 없는(UNIQUE) 데이터의 갯수를 파악할 수 있다.<pre><code class="language-sql">SELECT COUNT(column)
FROM tablename
WHERE dondition;</code></pre>
</li>
</ul>
<h2 id="sum">SUM</h2>
<ul>
<li>합계<pre><code class="language-sql">SELECT SUM(column)
FROM tablename
WHERE dondition;</code></pre>
</li>
</ul>
<h2 id="avg">AVG</h2>
<ul>
<li>평균<pre><code class="language-sql">SELECT AVG(column)
FROM tablename
WHERE dondition;</code></pre>
</li>
</ul>
<h2 id="minmax">MIN/MAX</h2>
<ul>
<li>최소/최대<pre><code class="language-sql">SELECT MIN(column)
FROM tablename
WHERE dondition;</code></pre>
<pre><code class="language-sql">SELECT MAX(column)
FROM tablename
WHERE dondition;</code></pre>
<blockquote>
<p>TMI</p>
</blockquote>
</li>
<li>동일값이 여러 개인 경우에도 단 한 개만 반환한다.
<img src="https://velog.velcdn.com/images/hugh_y/post/e9825de1-ec12-44d4-a1be-ebbe75697763/image.png" alt="">
<img src="https://velog.velcdn.com/images/hugh_y/post/61d06746-14f7-4c0b-9a5d-652bb30160b4/image.png" alt=""><blockquote>
<blockquote>
<p>TMI2</p>
<ul>
<li>MIN과 다른 컬럼을 같이 써서 &#39;강도 발생&#39;이 가장 적은 경찰서는 어디일지 찾아보고 싶었다.
SELECT에 MIN과 타 컬럼을 같이 썼더니, 엉뚱한 결과값이 나왔다.
(위에 강도 발생이 가장 적은 경찰서는 중부라고 나오는데, 중부경찰서의 강도발생 건수는 3건이었다.
<img src="https://velog.velcdn.com/images/hugh_y/post/e1402523-2f04-4f89-8d52-261c13b90abd/image.png" alt=""></li>
</ul>
</blockquote>
</blockquote>
</li>
</ul>
<h1 id="group-by">GROUP BY</h1>
<ul>
<li>데이터를 그룹화하여 조회<pre><code class="language-sql">SELECT column1, column2, ...
FROM tablename
WHERE condition
GROUP BY column1, column2, ...
ORDER BY column1, column2, ...;</code></pre>
</li>
<li>주로 집계함수와 같이 사용하여 그룹별로 집계된 값을 추출할 때 사용한다.<blockquote>
<p>GROUP BY, ORDER BY 뒤에는 컬럼 이름을 써도 되지만, SELECT에 사용한 순서대로 숫자만 써도 된다.</p>
<pre><code class="language-sql">SELECT police_station, AVG(case_number) 평균건수 FROM crime_status
WHERE (crime_type LIKE &#39;폭력&#39; OR crime_type LIKE &#39;절도&#39;) AND status_type LIKE &#39;발생&#39;
GROUP BY 1
ORDER BY 2;</code></pre>
</blockquote>
</li>
</ul>
<h1 id="having">HAVING</h1>
<ul>
<li>조건에 집계함수가 포함되는 경우 WHERE 대신 HAVING 사용<pre><code class="language-sql">SELECT column1, column2, ...
FROM tablename
WHERE condition
GROUP BY column1, column2, ...
HAVING condition (Aggregate Functions)
ORDER BY column1, column2, ...;</code></pre>
</li>
</ul>
<h1 id="scalar-functions">Scalar Functions</h1>
<ul>
<li><p>입력값을 기준으로 단일 값을 반환하는 함수</p>
</li>
<li><p>UCASE: 영문을 대문자로 변환</p>
</li>
<li><p>LCASE: 영문을 소문자로 변환</p>
</li>
<li><p>MID: 문자열의 부분을 반환</p>
<pre><code class="language-sql">SELECT MID(string, start_position, length)</code></pre>
</li>
<li><p>LENGTH: 문자열의 길이를 반환</p>
</li>
<li><p>ROUND: 반올림</p>
<pre><code class="language-sql">SELECT ROUND(number, decimals_place)</code></pre>
</li>
<li><p>NOW: 현재 날짜, 시간 표시</p>
<blockquote>
<p>TMI
SELECT NOW()를 했을 때 현재 시간과 다르게 나올 수 있다.
이는 mysql에서 time zone 세팅으로 인한 차이이다.</p>
<ul>
<li>time zone 세팅값 확인<pre><code class="language-sql">select @@system_time_zone, @@global.time_zone, @@session.time_zone;</code></pre>
</li>
<li>time zone 세팅<pre><code class="language-sql">SET time_zone=&#39;Asia/Seoul&#39;;</code></pre>
<blockquote>
<p>TMI2
system_time_zone은 가장 높은 단계의 설정값으로, OS에 설정된 시간대 정보를 가져와 설정한다.
global.time_zone은 mysql 서버(인스턴스)에 설정된 설정값
session.time_zone은 현재 임의로 설정된 설정값으로, 재접속시 (global_timezone)으로 초기화</p>
<p>위 방법으로 time zone 설정시 session.time_zone이 변경된다.</p>
</blockquote>
</li>
</ul>
</blockquote>
</li>
<li><p>FORMAT: 천 단위 콤마 형식으로 변환
ROUND는 반환값이 숫자인 대신, FORMAT은 문자로 반환한다. (비교 불가능)</p>
<pre><code class="language-sql">SELECT FORMAT(number, decimals_place) # decimals_place는 소수점 표시 위치. 숫자가 없으면 0으로 채워서 표시한다.</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ZB] SQL 03]]></title>
            <link>https://velog.io/@hugh_y/ZB-SQL-03</link>
            <guid>https://velog.io/@hugh_y/ZB-SQL-03</guid>
            <pubDate>Sun, 03 Dec 2023 16:13:37 GMT</pubDate>
            <description><![CDATA[<h2 id="primay-key기본-키">Primay Key(기본 키)</h2>
<ul>
<li>테이블의 각 레코드를 식별</li>
<li>중복되지 않은 고유값을 포함</li>
<li>NULL값을 포함할 수 없음 (NOT NULL 옵션을 주지 않아도 자동으로 NOT NULL이 된다)</li>
<li>테이블 당 하나의 기본 키(Primary Key)를 가짐</li>
</ul>
<h3 id="pk-설정">PK 설정</h3>
<pre><code class="language-sql">CREATE TABLE tablename
(
    column1 datatype not null,
    column2 datatype not null,
    ...,
    CONSTRAINT constraint_name   # 생략가능
        PRIMARY KEY (column1, column2, ...)
);</code></pre>
<ul>
<li>primary key에 컬럼이 두 개 이상 들어가는 것은 PK가 두 개라는 뜻이 아니라, 컬럼 두 개가 하나의 PK라는 뜻이다.
(두 개 이상의 컬럼이 PK로 설정되는 경우, 한 컬럼에서의 중복은 가능하다.)
<img src="https://velog.velcdn.com/images/hugh_y/post/d95eb757-6537-4412-910f-d6963f4eb338/image.png" alt=""><img src="https://velog.velcdn.com/images/hugh_y/post/679df056-ec14-4fd6-a880-8caf8fd3001e/image.png" alt=""></li>
</ul>
<ul>
<li>PK가 한 개인 경우 다음과 같은 방법으로 설정할 수도 있다.<pre><code class="language-sql">CREATE TABLE tablename
(
  column1 datatype not null PRIMARY KEY,
  column2 datatype not null,
  ...,
  CONSTRAINT constraint_name   # 생략가능
);</code></pre>
</li>
</ul>
<h4 id="이미-생성된-table에-pk-설정추가">이미 생성된 Table에 PK 설정(추가)</h4>
<pre><code class="language-sql">ALTER TABLE tablename
ADD PRIMARY KEY (column1, column2, ...)</code></pre>
<h3 id="pk-삭제">PK 삭제</h3>
<pre><code class="language-sql">ALTER TABLE tablename
DROP PRIMARY KEY;</code></pre>
<h2 id="foreign-key외래-키">Foreign Key(외래 키)</h2>
<ul>
<li>한 테이블을 다른 테이블과 연결해주는 역할</li>
<li>참조되는 테이블의 항복은 그 테이블의 기본 키(혹은 단일값)</li>
<li>DESC에서 MUL로 표시</li>
</ul>
<h3 id="fk-설정">FK 설정</h3>
<pre><code class="language-sql">CREATE TABLE tablename
(
    column1 datatype not null,
    column2 datatype not null,
    ...,
    CONSTRAINT constraint_name   # 생략가능
        PRIMARY KEY (column1, column2, ...),
    CONSTRAINT constraint_name
        FOREIGN KEY (column3, column4, ...) REFERENCES REF_tablename(REF_column),
        FOREIGN KEY (column5, column6, ...) REFERENCES REF_tablename2(REF2_column)
);</code></pre>
<ul>
<li>PK와 마찬가지로 CONSTRAINT는 생략 가능하다.
차이점은, PK는 생략시 CONSTARINT가 없는 반명 FK는 생성된다.</li>
</ul>
<h4 id="이미-생성된-table에-fk-설정추가">이미 생성된 Table에 FK 설정(추가)</h4>
<pre><code class="language-sql">ALTER TABLE tablename
ADD FOREIGN KEY (column) REFERENCES REF_tablename(REF_column);</code></pre>
<h3 id="fk-삭제">FK 삭제</h3>
<ul>
<li>FK는 PK와 다르게 여러 개일 수 있으므로, DROP하려면 정확한 이름을 정해야 삭제할 수 있다.</li>
<li>FK 이름(constraint)은 SHOW CREATE TABLE tablename;을 통해 확인할 수 있다.
<img src="https://velog.velcdn.com/images/hugh_y/post/db44c6d1-6771-48f6-a2ec-d8532dd9a0f1/image.png" alt=""></li>
</ul>
<blockquote>
<p>TMI
FK가 설정되면 Reference가 되는 Table의 Column을 Drop할 수 없다. (Table도 drop되지 않는다.)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ZB] SQL 02]]></title>
            <link>https://velog.io/@hugh_y/ZB-SQL-02</link>
            <guid>https://velog.io/@hugh_y/ZB-SQL-02</guid>
            <pubDate>Fri, 01 Dec 2023 17:06:48 GMT</pubDate>
            <description><![CDATA[<h1 id="aws-rds">AWS RDS</h1>
<ul>
<li>AWS(Amazon Web Services)에서 제공하는 RDS(Relational Database Service)</li>
<li>클라우드 환경에서 데이터베이스를 손쉽게 설정, 운영, 확장할 수 있는 시스템</li>
<li>터미널 환경에서 -h 옵션으로 RDS의 엔드포인트와 -P(port) 옵션으로 포트를 설정하면 어디서나 접속할 수 있다.</li>
</ul>
<h2 id="sql-파일">SQL 파일</h2>
<ul>
<li>SQL 쿼리를 모아놓은 파일</li>
<li>여러 개의 쿼리를 한꺼번에 실행할 수 있음</li>
<li>database, table 등을 백업하고 복원(resotre)할 때 용이하다.</li>
</ul>
<h3 id="sql-파일-실행">SQL 파일 실행</h3>
<ul>
<li>방법1: 파일이 저장된 위치에서 SQL에 접속해서 실행<pre><code class="language-sql">source filename.sql</code></pre>
</li>
<li>방법2: 터미널 환경에서 바로 실행<pre><code>mysql -u username -p &lt;database&gt; &lt; &lt;/path/filename.sql&gt;</code></pre></li>
</ul>
<h3 id="sql-백업">SQL 백업</h3>
<ul>
<li><p>SQL 파일로 database를 백업할 수 있다.</p>
<pre><code>mysqldump -u username -p dbname &gt; backup.sql            # 특정 db 백업
mysqldump -u username -p --all-databases &gt; backup.sql   # 모든 db 백업</code></pre></li>
<li><p>백업시 기존에 데이터와 중복되는 경우, 기존 데이터를 삭제하고 다시 만들도록 SQL 백업파일이 생성된다.</p>
</li>
</ul>
<blockquote>
<p>위 방식으로 백업 후 RDS에서 실행했을 때 에러가 발생하는 경우가 있다.
인코딩 문제로 보이는데, 백업시 언어 설정을 기본값으로 설정했던 utf8mb4가 아닌 utf8로 설정해줘서 해결할 수 있었다.</p>
</blockquote>
<pre><code>mysqldump -u username -p dbname --default-character-set utf8 &gt; backup.sql</code></pre><p>mysql에 접속할 때 인코딩을 설정하는 방법도 있다</p>
<pre><code>mysql -u username -p --default -character-set utf8mb4</code></pre><blockquote>
<ul>
<li>AWS RDS의 데이터베이스를 백업할 때는 옵션을 추가해야 한다.</li>
</ul>
</blockquote>
<pre><code>mysqldump --set-gtid-purged=OFF -h hostname -P port -u username -p dbname &gt; backup.sql</code></pre><h3 id="table-백업">Table 백업</h3>
<ul>
<li>table 단위로도 백업할 수 있다.<pre><code>mysqldump -u username -p dbname tablename &gt; backup.sql</code></pre></li>
<li>복원(resotre) 방법은 위 SQL 파일 실행과 같다.</li>
</ul>
<h3 id="table-schema-백업">Table Schema 백업</h3>
<ul>
<li>Table에서 데이터를 제외하고 테이블 정보만 백업할 수도 있다.</li>
<li>방법은 table 백업과 동일하고, user 옵션 앞에 -d 옵션을 추가하면 된다.<pre><code>mysqldump -d -u username -p dbname tablename &gt; backup.sql</code></pre></li>
</ul>
<h1 id="python---sql">Python - SQL</h1>
<ul>
<li><p>mysql-connector-python 모듈 설치</p>
<pre><code>pip install mysql-connector-python</code></pre></li>
<li><p>python에서 불러올 때</p>
<pre><code class="language-py">import mysql.connector</code></pre>
</li>
</ul>
<h2 id="create-connection">Create Connection</h2>
<pre><code class="language-py">mydb = mysql.connector.connect(
    host = &quot;&lt;hostname&gt;&quot;,
    port = &lt;port&gt;,   # local 연결시 생략
    user = &quot;&lt;username&gt;&quot;,
    password = &quot;&lt;password&gt;&quot;,
    database = &quot;&lt;databasename&gt;&quot;   # 생략시 DB선택 없이 mysql 접속
)</code></pre>
<h2 id="execute-sql">Execute SQL</h2>
<ul>
<li><p>cursor를 만들어 sql 쿼리문을 전송한다.</p>
<pre><code class="language-py">cur = mydb.cursor()
cur.excute(&quot;&lt;query&gt;&quot;)</code></pre>
<h3 id="sql-파일-실행-1">SQL 파일 실행</h3>
</li>
<li><p>open().read() 함수를 통해 실행</p>
<pre><code class="language-py">sql = open(&quot;&lt;filename&gt;.sql&quot;).read
cur.excute(sql)</code></pre>
<blockquote>
<h4 id="tmi">TMI</h4>
<p>open(&quot;file&quot;) 자체는 특수 클래스(_io.TextIOWrapper)로, 뒤에 .read()를 써줘야 안의 내용을 변수에 담을 수 있다.
<img src="https://velog.velcdn.com/images/hugh_y/post/8e788592-912c-43e3-a35f-fdbea28cb533/image.png" alt="">
<img src="https://velog.velcdn.com/images/hugh_y/post/58225e1e-ed84-4f7e-bbab-046c10245a30/image.png" alt=""></p>
</blockquote>
</li>
<li><p>sql 파일에 여러 문장이 들어있는 경우, multi=True 옵션을 추가해야 한다.
사용법</p>
<pre><code class="language-py">remote = mysql.connector.connect(
  host=&quot;&lt;hostname&gt;&quot;,
  port = &lt;port&gt;, 
  user = &quot;&lt;username&gt;&quot;,
  password = &quot;&lt;password&gt;&quot;,
  database = &quot;&lt;databasename&gt;&quot;
)
</code></pre>
</li>
</ul>
<p>cur = remote.cursor()
sql = open(&quot;test04.sql&quot;).read()
for result_iterator in cur.execute(sql, multi=True):
    if result_iterator.with_rows:
        print(result_iterator.fetchall())
    else:
        print(result_iterator.statement)</p>
<p>remote.commit()
remote.close()</p>
<pre><code>- commit()을 실행함으로써 sql 데이터에 반영된다.(insert문 등이)

&gt;#### TMI
- cur.excute(sql)에서 sql이 단문인 경우, return값이 없이 실행만 되는 메서드이다.(print문 안에 있더라도 쿼리는 실행된다)
![](https://velog.velcdn.com/images/hugh_y/post/594170de-c7c6-46a1-87f8-df4bd2029d98/image.png)
- 하지만 sql이 복문(여러 쿼리 포함)이라면, generator 객체를 return한다.
![](https://velog.velcdn.com/images/hugh_y/post/7fe1b4fd-21d8-4c1c-b3cf-2281eae30df9/image.png)
![](https://velog.velcdn.com/images/hugh_y/post/53749291-09e9-4c87-97fb-8a29d3f4b21a/image.png)

&gt;**TMI2**
- 여러 sql문을 한꺼번에 execute할 때 executemany()를 쓸 수 있다.


## Fetch All
- fetch: 가지고[데리고/불러] 오다
- sql에서 select문을 사용하는 경우 결과 데이터를 가져온다.
- 가져온 데이터를 변수에 담을 때 cur.fetchall()을 사용한다.
- 읽어올 데이터 양이 많을 때는 커서를 만들 때 buffered=True 옵션을 주는 것이 좋다.
- fetchall()을 통해 가져온 데이터는 list 안에 tuple 형태로 담긴다.
&gt;![](https://velog.velcdn.com/images/hugh_y/post/942e53ee-3660-42f2-8537-85f37cdf3934/image.png)

### Pandas 활용
- fetchall()을 통해 가져온 데이터가 리스트/튜플이므로, pandas를 통해 데이터프레임으로 만들 수 있다.
&gt;![](https://velog.velcdn.com/images/hugh_y/post/31ca6768-ea30-42c3-aa0a-9ca2132a0c7e/image.png)
- execute()에 data를 직접 넣어 변수를 한꺼번에 입력할 수 있다.
cursor.execute(query, data)
```py
cur = remote.cursor(buffered=True)
sql = &quot;INSERT INTO police_station VALUES (%s, %s)&quot;

for i, row in df.iterrows():
    cur.execute(sql, tuple(row))
    print(tuple(row))
    remote.commit()</code></pre><blockquote>
<h4 id="tmi-1">TMI</h4>
</blockquote>
<ol>
<li>강의에서는 tuple 형태로 넣었는데, list도 가능했다.</li>
<li>executemany(query, data)를 쓰면 for문을 쓰지 않고 여러 데이터를 한번에 입력할 수 있다.
<img src="https://velog.velcdn.com/images/hugh_y/post/a5eac159-ba57-40bc-9c70-8b0b93701892/image.png" alt="">
executemany()에 들어가는 데이터는 컨테이너 안에 컨테이너 형태로 들어가야 한다.
pandas df를 넣기 위해서는 자료형 변환이 필요하다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ZB] SQL 01]]></title>
            <link>https://velog.io/@hugh_y/ZB-SQL-01</link>
            <guid>https://velog.io/@hugh_y/ZB-SQL-01</guid>
            <pubDate>Mon, 27 Nov 2023 18:46:41 GMT</pubDate>
            <description><![CDATA[<h1 id="database-관리">Database 관리</h1>
<ul>
<li>show databases: 설치된 db 목록 불러오기</li>
<li>create database [dbname]: db 생성</li>
<li>drop database [dbname]: db 삭제</li>
</ul>
<blockquote>
<ul>
<li>CREATE DATABASE [dbname] DEFAULT CHARACTER SET utf8mb4: 해당 DB의 주 언어 설정</li>
</ul>
</blockquote>
<h1 id="user-관리">User 관리</h1>
<ul>
<li>user 정보는 mysql에서 관리한다.<pre><code class="language-sql">use mysql;
select host, user from user;   # user 테이블에서 host, user 정보 호출</code></pre>
</li>
<li>create user &#39;id&#39;@&#39;권한&#39; identified by &#39;password&#39;: 권한을 가진 id를 생성하고, 비밀번호는 password이다.
권한은 localhost(현재 pc에서만 접속 가능), %(외부에서 접속 가능)가 있다.</li>
<li>drop user &#39;id&#39;@&#39;권한&#39;: ~권한을 가진 유저(id)를 삭제한다.</li>
</ul>
<blockquote>
<ul>
<li>user name과 권한은 세트다. name이 같더라도 권한이 다르면 다른 유저이다.</li>
</ul>
</blockquote>
<h2 id="user-권한-관리">User 권한 관리</h2>
<ul>
<li>SHOW GRANTS FOR &#39;username&#39;@&#39;localhost&#39;: localhost인 username에게 부여된 모든 권한 목록 확인</li>
<li>GRANT ALL ON dbname.* to &#39;username&#39;@&#39;localhost&#39;: 해당 유저에게 dbname에 관한 모든 권한을 부여</li>
<li>REVOKE ALL ON dbname.* from &#39;username&#39;@&#39;localhost&#39;: 해당 유저의 dbname에 관한 모든 권한 삭제</li>
</ul>
<h1 id="table">Table</h1>
<ul>
<li>DESC mytable: 표의 상세 정보 호출</li>
</ul>
<h2 id="table-생성">Table 생성</h2>
<ul>
<li>CREATE TABLE mytable(id int, name varchar(16))
mytable이란 표를 만든다. 내용은 id에 숫자가 들어가고 name에는 문자(최대16자)가 들어간다.</li>
<li>타입: varchar(문자 최대갯수), int(정수), double(실수), char(문자 1글자), date(날짜) 등</li>
<li>옵션
NOT NULL: 공백 비허용(반드시 값이 입력되어야 함)
DEFAULT ~: 값이 입력되지 않으면 자동으로 ~값으로 입력
AUTO_INCREMENT: 자동으로 값이 증가(일련번호 등에 용이)</li>
</ul>
<h2 id="table-수정">Table 수정</h2>
<ul>
<li>ALTER TABLE mytable RENAME person: mytable의 이름을 person으로 변경</li>
<li>ALTER TABLE person ADD COLUMN agee double: person table에 agee(double타입) 컬럼 추가</li>
<li>ALTER TABLE person MODIFY COLUMN agee int: agee 컬럼의 타입을 int로 변경</li>
<li>ALTER TABLE person CHANGE COLUMN agee age int: agee컬럼의 이름을 age(int타입)로 변경, 이름과 타입을 동시에 바꿀 수 있다.</li>
<li>ALTER TABLE person DROP COLUMN age: age 컬럼 삭제</li>
<li>DROP table mytable: mytable 삭제</li>
</ul>
<h2 id="table-내용-추가insert">Table 내용 추가(INSERT)</h2>
<ul>
<li>INSERT INTO person (id, name, age, sex) VALUES (1, &#39;홍길동&#39;, 43, &#39;M&#39;)
person table의 id, name, age, sex 컬럼에 1, 홍길동, 43, M을 입력한다.
모든 컬럼값을 추가하는 경우에는 컬럼 이름을 지정하지 않아도 된다.(단, 컬럼 순서와 동일하게 입력)</li>
</ul>
<h2 id="table-내용-조회select">Table 내용 조회(SELECT)</h2>
<ul>
<li>SELECT ~ FROM <del>: ~</del>테이블에서 ~컬럼 자료 조회
컬럼에 * 입력시 모든 컬럼 데이터 조회</li>
</ul>
<h3 id="where-조건">WHERE 조건</h3>
<ul>
<li>SELECT ~ FROM <del>~ WHERE \</del>~<del>: \</del>표에서 <del>~</del>조건에 맞는 ~컬럼 조회</li>
</ul>
<h4 id="비교연산자논리연산자">비교연산자/논리연산자</h4>
<ul>
<li>비교연산자 =, !=, &lt;, &gt;, &lt;=, &gt;=, &lt;&gt;</li>
<li>A AND B: A조건과 B조건 모두 참</li>
<li>A OR B: A조건 또는 B조건 참</li>
<li>NOT A: A조건이 거짓인 경우 참</li>
<li>BETWEEN A AND B: A와 B 사이에 있는 경우(A이상 B이하)<blockquote>
<p>기타 연산(+, -, *, /, %(나머지))도 가능</p>
</blockquote>
</li>
<li>LIKE <del>: A패턴에 맞는 경우
%블라: ~블라로 끝나는 데이터
블라%: 블라</del>로 시작하는 데이터
%블라%: 데이터에 블라 문자열을 가지고 있는 데이터</li>
</ul>
<h3 id="order-by-정렬">ORDER BY 정렬</h3>
<ul>
<li>SELECT ~ FROM ~~ (WHERE ~) ORDER BY column1,column2... (ASC/DESC)
입력된 컬럼값에 따라 오름차순/내림차순 정렬(ASC/DESC 미입력시 오름차순)
ORDER BY column1 DESC, column2 ASC 이런 식도 가능</li>
<li>ORDER BY 뒤에는 숫자로 입력할 수도 있다.(SELECT에서 선택한 순서대로)</li>
</ul>
<h2 id="table-내용-수정update--set">TABLE 내용 수정(UPDATE ~ SET)</h2>
<ul>
<li>UPDATE ~ SET <del>: ~테이블에 ~</del>내용을 수정한다.
ex) UPDATE person SET age=20: 모든 컬럼의 age를 20으로 수정, WHERE절을 써서 조건을 붙일 수 있다.</li>
</ul>
<h2 id="table-내용-삭제delete">TABLE 내용 삭제(DELETE)</h2>
<ul>
<li>DELETE FROM ~ WHERE <del>~ : ~ 테이블에서 ~</del> 조건에 해당되는 data 삭제(row)</li>
</ul>
<h1 id="union">UNION</h1>
<ul>
<li>여러 개의 SQL문을 합쳐서 하나의 SQL문으로 만드는 방법(컬럼 개수가 같아야 함)</li>
<li>SELECT ~ FROM <del>~ UNION SELECT ? FROM ??
~</del>테이블의 ~ 데이터와, ??테이블의 ? 데이터를 합쳐서 중복값을 제거하고 보여준다.
UNION ALL인 경우 중복 포함 모든 데이터를 보여준다.</li>
<li>SELECT문 두 개를 하나로 묶는 개념</li>
<li>컬럼 개수만 같으면 되기 때문에 아래와 같은 이슈가 발생할 수 있다.<blockquote>
<p>```sql
mysql&gt; SELECT name, job_title, birthday FROM celeb WHERE job_title LIKE &#39;%가수%&#39;
  -&gt; UNION
  -&gt; SELECT name, birthday, age FROM celeb WHERE birthday BETWEEN &#39;19800101&#39; AND &#39;19891231&#39;;</p>
</blockquote>
</li>
<li>--------+--------------+------------+
| name   | job_title    | birthday   |</li>
<li>--------+--------------+------------+
| 아이유 | 가수, 텔런트 | 1993-05-16 |
| 이미주 | 가수         | 1994-09-23 |
| 이수연 | 가수         | 1999-05-04 |
| 강동원 | 1981-01-18   | 41         |</li>
<li>--------+--------------+------------+
4 rows in set (0.00 sec)<blockquote>
<pre><code>- 앞에 입력한 컬럼을 기준으로, UNION 뒤에서 선택한 컬럼 데이터가 들어간다.(컬럼 일치 여부와 상관없이)</code></pre></blockquote>
</li>
</ul>
<h1 id="join">JOIN</h1>
<ul>
<li>두 개 이상의 테이블을 결합하는 것</li>
<li>FROM, JOIN 구문에서 table을 불러올 때 띄어쓰기로 구분자를 지정할 수 있다.<pre><code class="language-sql">SELECT c.id, c.name, s.id, s.host
FROM celeb c, snl_show s
WHERE c.name=s.host;</code></pre>
<h2 id="join-종류">JOIN 종류</h2>
</li>
</ul>
<h3 id="inner-join">INNER JOIN</h3>
<ul>
<li>교집합<pre><code class="language-sql">SELECT column1, column2, ...
FROM tableA
INNER JOIN table B
ON tableA.column = tableB.column
WHERE condition;</code></pre>
<h3 id="full-outer-join">FULL OUTER JOIN</h3>
</li>
<li>합집합</li>
<li>MYSQL에서는 지원하지 않음. left join, right join을 union으로 합칠 수 있다.</li>
</ul>
<h3 id="left-join">LEFT JOIN</h3>
<ul>
<li>교집합 + 왼쪽에만 있는 데이터<h3 id="right-join">RIGHT JOIN</h3>
</li>
<li>교집합 + 오른쪽에만 있는 데이터<h3 id="self-join">SELF JOIN</h3>
</li>
<li>inner join과 같은 결과</li>
<li>from으로 두 개의 테이블을 불러와 where절에서 조건으로 교집합을 구한다<pre><code class="language-sql">SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb, snl_show
WHERE celeb.name=snl_show.host;</code></pre>
</li>
</ul>
<h1 id="concat">CONCAT</h1>
<ul>
<li>여러 문자열을 하나로 합치거나 연결
ex) SELECT CONCAT(&#39;str1&#39;, &#39;str2&#39;);  -&gt; str1str2</li>
</ul>
<h1 id="alias">ALIAS</h1>
<ul>
<li>컬럼이나 테이블 이름 별칭 생성(약자 or 더 알아보기 쉬운 단어로 설정 가능)
ex) SELECT name as &#39;이름&#39; FROM celeb;  -&gt; 출력시 table 컬럼이 name이 아닌 이름으로 출력된다.</li>
<li>as는 생략 가능하다.</li>
</ul>
<blockquote>
<ul>
<li>CONCAT + ALIAS 혼합 사용 예시</li>
</ul>
</blockquote>
<pre><code class="language-sql">SELECT CONCAT(name, &#39; : &#39;, job_title) as profile FROM celeb;
+---------------------------+
| profile                   |
+---------------------------+
| 아이땡 : 가수, 텔런트     |
| 이미땡 : 가수             |
| 송땡 : 텔런트             |
| 강동땡 : 영화배우, 텔런트 |
| 유재땡 : MC, 개그맨       |
| 차승땡 : 영화배우, 모델   |
| 이수땡 : 가수             |
+---------------------------+</code></pre>
<h1 id="distinct">DISTINCT</h1>
<ul>
<li>중복 제거</li>
</ul>
<h1 id="limit">LIMIT</h1>
<ul>
<li>SELECT문 맨 뒤에 입력시 출력되는 데이터 개수를 제한</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ZB] EDA-3 웹 데이터 분석]]></title>
            <link>https://velog.io/@hugh_y/ZB-EDA-3-%EC%9B%B9-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@hugh_y/ZB-EDA-3-%EC%9B%B9-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Sat, 25 Nov 2023 17:03:16 GMT</pubDate>
            <description><![CDATA[<h1 id="beautiful-soup">Beautiful Soup</h1>
<ul>
<li>html 태그에서 데이터를 추출할 때 쓰는 모듈</li>
</ul>
<pre><code class="language-py">page = open(&quot;../data/03. test_first.html&quot;, &quot;r&quot;).read()
soup = BeautifulSoup(page, &quot;html.parser&quot;)
print(soup.prettify())</code></pre>
<blockquote>
<p>read로 읽은 파일은 str형태로 변수에 저장된다.
prettify() 메서드를 쓰면 보기 좋은 형태로 정렬(줄바꿈, 들여쓰기)해준다. 타입은 그대로 str</p>
</blockquote>
<h2 id="태그-찾기">태그 찾기</h2>
<ul>
<li>soup.head / soup.body / soup.p
해당 태그를 찾아 그 태그가 열리고 닫히는 범위까지의 데이터를 반환한다.
처음으로 나온 태그만 반환한다.</li>
</ul>
<h3 id="find">find</h3>
<ul>
<li>soup.find(태그)
위와 같이 처음 나온 태그를 찾는다.
옵션으로 class, target, id 등 속성값을 조건으로 찾을 수 있다. (dict 형태로 찾는 것도 가능)
텍스트를 찾아 .text로 텍스트만 추출, strip()으로 공백을 제거할 수 있다.</li>
<li>soup.find_all()
soup.find()와 같지만 여러 개를 찾는다.
list형태로 담긴다.(하나만 찾아도 list 형태가 필요한 경우 find_all을 쓸 수 있다.)</li>
</ul>
<h3 id="select">select</h3>
<ul>
<li>select_one(태그): find()와 동일하게 하나만 찾는다.</li>
<li>select(): find_all()과 동일하게 여러 개를 찾는다.</li>
<li>태그를 찾을 때 id는 #, class는 .으로 구분하여 찾는다.</li>
<li>태그가 여러 개일 때 원하는 태그를 찾기 위해 상위부터 하위로 내려가며 찾을 수 있는데, 그럴 땐 꺽쇄괄호 (&gt;)를 쓴다.</li>
</ul>
<pre><code class="language-py">exchangeList = soup.select(&quot;#exchangeList &gt; li&quot;)

title = exchangeList[0].select_one(&quot;.h_lst&quot;).text
exchange = exchangeList[0].select_one(&quot;.value&quot;).text
change = exchangeList[0].select_one(&quot;.change&quot;).text
updown = exchangeList[0].select(&quot;.blind&quot;)[2].text</code></pre>
<blockquote>
<ul>
<li>강의에서는 updown을 찾을 때 상위 클래스인 div.head_info point_dn &gt; .blind로 찾았지만, 내용 중 상승/하락일 때 태그가 달라져(상승일 땐 up, 하락일 땐 dn)으로 구분됐다.</li>
</ul>
</blockquote>
<ul>
<li>상승/하락 구분 없이 원하는 것을 찾기 위해 인덱스를 활용하는 방식으로 수정했다.</li>
</ul>
<h3 id="get">get()</h3>
<ul>
<li>태그 안의 속성값을 찾고자 할 때는 .get(&#39;태그&#39;)를 쓴다.</li>
</ul>
<h2 id="url-접근하기">url 접근하기</h2>
<h3 id="urllibrequest의-urlopen">urllib.request의 urlopen()</h3>
<ul>
<li>urlopen(&#39;url&#39;): 해당 url에 접근하는 코드</li>
</ul>
<pre><code class="language-py">from urllib.request import urlopen 
from bs4 import BeautifulSoup

url = &quot;https://finance.naver.com/marketindex/&quot;
page = urlopen(url)
page.status   # html 상태 코드 반환

soup = BeautifulSoup(page, &quot;html.parser&quot;)
print(soup.prettify())</code></pre>
<ul>
<li>urljoin(a, b): base url과 상대주소가 나누어진 경우 합칠 때 사용</li>
</ul>
<h3 id="requests">requests</h3>
<pre><code class="language-py">import requests
from bs4 import BeautifulSoup

url = &quot;https://finance.naver.com/marketindex/&quot;
response = requests.get(url)
response.status_code   # urlopen의 status와 동일
soup = BeautifulSoup(response.text, &quot;html.parser&quot;) 
print(soup.prettify())</code></pre>
<ul>
<li>request.get()과 request.post()가 있다.
세부 내용은 웹개발에 속하는 내용으로, 현재는 다루지 않는다.</li>
</ul>
<h2 id="크롬-개발자-도구">크롬 개발자 도구</h2>
<h3 id="정보-가져오기">정보 가져오기</h3>
<ul>
<li>f12: 개발자도구 실행</li>
<li>ctrl + shift + c: 원하는 내용 태그(속성값) 확인하기</li>
<li>해당 태그를 활용하여 find_all()로 내용 찾기</li>
<li>찾은 내용 중 원하는 값 인덱스 활용, text/string/get_text()를 통해 원하는 텍스트만 추출</li>
</ul>
<h3 id="원하는-데이터-모두-가져오기">원하는 데이터 모두 가져오기</h3>
<pre><code class="language-py">import requests
from bs4 import BeautifulSoup
import pandas as pd

url = &quot;https://finance.naver.com/marketindex/&quot;
response = requests.get(url)
soup = BeautifulSoup(response.text, &quot;html.parser&quot;) 
exchangeList = soup.select(&quot;#exchangeList &gt; li&quot;)

exchange_datas = [] 
baseUrl = &quot;https://finance.naver.com&quot;

for item in exchangeList:
    data = {
        &quot;title&quot;: item.select_one(&quot;.h_lst&quot;).text,
        &quot;exchnage&quot;: item.select_one(&quot;.value&quot;).text,
        &quot;change&quot;: item.select_one(&quot;.change&quot;).text,
        &quot;updown&quot;: item.select(&quot;.blind&quot;)[2].text,
        &quot;link&quot;: baseUrl + item.select_one(&quot;a&quot;).get(&quot;href&quot;)
    }
    exchange_datas.append(data)
df = pd.DataFrame(exchange_datas)
df.to_excel(&quot;./naverfinance.xlsx&quot;, encoding=&quot;utf-8&quot;)</code></pre>
<ul>
<li>위 코드를 실행하면, 네이버금융(NPay증권)의 시장지표 중 환전 고시 환율 데이터를 엑셀파일로 저장할 수 있다.</li>
<li>위 코드는 파이썬에서도 실행 가능하다.<blockquote>
<ul>
<li>ipynb에서 실행하는 경우와 py에서 실행하는 경우 저장 위치가 달라질 수 있다.</li>
<li>이유를 찾아보니, 저장 위치를 상대주소로 입력한 것이 CWD(Current Working Directory)의 차이로 인해 다른 위치에 저장되는 것이라고 한다.</li>
<li>ipynb파일은 CWD가 해당 파일이 저장된 위치이지만, py파일은 해당 코드가 실행되는 가상환경이다.</li>
</ul>
</blockquote>
</li>
</ul>
<h2 id="한글-url">한글 url</h2>
<ul>
<li>검색 결과 주소는 한글로 되어있는데, 복사-붙여넣기 하면 깨지는 현상이 있다.
이는 인코딩/디코딩 문제로, 구글에서 url decoder를 통해 한글로 복사할 수 있다.</li>
<li>하지만, urllib의 urlopen방식으로는 한글 주소를 입력할 수 없다.
이를 해결하기 위해 urilib.parse.quote()를 쓸 수 있다.<pre><code class="language-py">import urllib
from urllib.request import urlopen, Request
</code></pre>
</li>
</ul>
<p>html = &quot;<a href="https://ko.wikipedia.org/wiki/%7Bsearch_words%7D&quot;">https://ko.wikipedia.org/wiki/{search_words}&quot;</a></p>
<h1 id="httpskowikipediaorgwiki여명의_눈동자"><a href="https://ko.wikipedia.org/wiki/%EC%97%AC%EB%AA%85%EC%9D%98_%EB%88%88%EB%8F%99%EC%9E%90">https://ko.wikipedia.org/wiki/여명의_눈동자</a></h1>
<p>req = Request(html.format(search_words=urllib.parse.quote(&quot;여명의_눈동자&quot;)))   # 글자를 URL로 인코딩 </p>
<h1 id="req--requesthttpskowikipediaorgwiki여명의_눈동자----실행시-에러-발생">req = Request(&quot;<a href="https://ko.wikipedia.org/wiki/%EC%97%AC%EB%AA%85%EC%9D%98_%EB%88%88%EB%8F%99%EC%9E%90&quot;">https://ko.wikipedia.org/wiki/여명의_눈동자&quot;</a>)   # 실행시 에러 발생</h1>
<p>response = urlopen(req)
soup = BeautifulSoup(response, &quot;html.parser&quot;)
print(soup.prettify())</p>
<pre><code>
&gt;- request.get(url)을 쓰면 인코딩 필요없이 한글주소에 접속할 수 있다.

---
# List 자료형
- list는 대괄호로 만든다.
- list[n]으로 slicing할 수 있다. (해당 인덱스 자료만 추출)
list[n:m]: n~m-1 인덱스의 자료를 불러온다.
list[:m] / list[n:]  각각 콜론(:) 앞뒤 빈 자리는 &#39;끝&#39;까지를 의미한다.
list[n:m:t]: n부터 m-1까지 t간격으로
## list 자료형 for문
```py
colors = [&#39;red&#39;, &#39;blue&#39;, &#39;green&#39;]
for color in colors:
    print(color)   # red / blue / green</code></pre><h2 id="in의-조건문-활용">in의 조건문 활용</h2>
<pre><code class="language-py">if &#39;red&#39; in colors:
    print(&#39;red is in list&#39;)</code></pre>
<h2 id="명령어">명령어</h2>
<ul>
<li>append(): list 가장 뒤에 자료 추가
1개의 자료만 추가 가능(list를 넣으면 list 그대로 들어간다.</li>
<li>pop(): 가장 뒤의 자료 제거
제거된 자료가 즉시 반환된다.<pre><code class="language-py">movies = [&quot;라라랜드&quot;, &quot;먼 훗날 우리&quot;, &quot;어벤저스&quot;, &quot;다크나이트&quot;]
print(movies.pop())   # 다크나이트
print(movies)   # [&quot;라라랜드&quot;, &quot;먼 훗날 우리&quot;, &quot;어벤저스&quot;]</code></pre>
</li>
<li>extend(): 가장 뒤에 리스트를 합친다.
인자로 list를 넣어야 한다. (str 데이터를 넣으면 글자가 하나씩 쪼개져서 추가된다)</li>
<li>remove(): 해당 자료를 삭제한다.</li>
<li>insert(a, b): a번째 인덱스에 b자료 추가
기존 a자리에 있던 자료는 a+1인덱스로 옮겨진다(뒤로 밀림)
a에 기존 자료의 맨 뒤보다 큰 값을 입력해도 정상적으로 작동한다.</li>
</ul>
<h2 id="기타">기타</h2>
<ul>
<li>isinstance(a, b): a자료가 b자료형인지 확인하는 함수. b자료형이 맞다면 True를, 아니라면 False를 반환한다.</li>
</ul>
<h1 id="시카고-맛집-데이터-분석">시카고 맛집 데이터 분석</h1>
<ul>
<li><a href="https://www.chicagomag.com/Chicago-Magazine/November-2012/Best-Sandwiches-Chicago/">https://www.chicagomag.com/Chicago-Magazine/November-2012/Best-Sandwiches-Chicago/</a></li>
<li>50개의 맛집 및 대표메뉴 소개 페이지</li>
<li>얻고자 하는 정보
가게 이름
대표메뉴
대표메뉴 가격
가게 주소</li>
</ul>
<h2 id="403-에러">403 에러</h2>
<ul>
<li>앞에서 하던 방법으로 접속하면 403에러가 발생한다.</li>
<li>해당 에러는 서버에서 유저(나)의 접근을 막을 때 나타나는 코드이다.</li>
<li>크롬에서 해당 페이지 접속 후 개발자도구에서 네트워크 정보에 나타나는 &quot;user-agent&quot;부분을 설정해주면 해결할 수 있다.<blockquote>
<p><img src="https://velog.velcdn.com/images/hugh_y/post/08fb91ec-f1e7-4e55-a9dc-cb30a87bc980/image.png" alt=""></p>
<ul>
<li>위 내용을 복사-붙여넣기로 header 옵션에 dict형태로 붙여넣기하면 해결된다.</li>
</ul>
</blockquote>
<pre><code class="language-py">import requests
from bs4 import BeautifulSoup
</code></pre>
</li>
</ul>
<p>url_base = &quot;<a href="https://www.chicagomag.com/&quot;">https://www.chicagomag.com/&quot;</a>
url_sub = &quot;Chicago-Magazine/November-2012/Best-Sandwiches-Chicago/&quot;
url = url_base + url_sub  </p>
<p>response = requests.get(url,headers={&quot;user-agent&quot;: &quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36&quot;})</p>
<h1 id="위-복잡한-내용은-간단하게-chrome만-써도-된다">위 복잡한 내용은 간단하게 &quot;chrome&quot;만 써도 된다.</h1>
<p>html = response.text
soup = BeautifulSoup(html, &quot;html.parser&quot;)
print(soup.prettify())</p>
<p>```</p>
<blockquote>
<ul>
<li>강의에서는 urllib의 urlopen 기능을 썼는데, SSL 오류로 인해 작동하지 않아 requests 모듈을 사용했다.</li>
</ul>
</blockquote>
<h2 id="정규식regular-expression">정규식(Regular Expression)</h2>
<ul>
<li>문자열을 찾을 때</li>
<li>.x: 임의의 한 문자(x가 마지막으로 끝)
x+: x가 1번 이상 반복
x?: x가 0회 이상 존재
x*: x가 0번 이상 반복
x|y: x 또는 y(or연산자)</li>
</ul>
<blockquote>
<p>re.split()과 str.split의 차이
<img src="https://velog.velcdn.com/images/hugh_y/post/447dc738-97ac-4328-a3a6-f0a03a5ee9b8/image.png" alt="">
re.split은 인자를 정규식으로 받아들이기 때문에 결과에 차이가 발생할 수 있다.
str.split은 문자열 그대로를 인식하기 때문에 &#39;특정 문자&#39;만 찾아서 그대로 나눈다.</p>
</blockquote>
<ul>
<li><p>re.search(찾을 문자열, 대상): &#39;대상&#39;에서 &#39;문자열&#39;을 찾아 있으면 어떤 문자를 찾았는지 반환한다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/hugh_y/post/595fd250-7154-4063-8719-5bbfae6d30dd/image.png" alt=""></p>
<ul>
<li>\$ : $로 시작
\d+ : 숫자가 1개 이상
. : .이 있다.
(\d+)?: 숫자가 1개 이상 반복되는 것이 있을 수도 있고 없을 수도 있다.</li>
</ul>
</blockquote>
</li>
<li><p>re.group(): 정규식 찾은 내용을 str로 그룹핑</p>
</li>
</ul>
<h2 id="tqdm">tqdm</h2>
<ul>
<li>반복문이 실행되는 과정을 보여주는 모듈</li>
<li>실행 횟수별로 소요 시간 등이 출력된다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ZB] EDA-2 서울시 범죄 현황 데이터 분석]]></title>
            <link>https://velog.io/@hugh_y/ZB-EDA-2-%EC%84%9C%EC%9A%B8%EC%8B%9C-%EB%B2%94%EC%A3%84-%ED%98%84%ED%99%A9-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@hugh_y/ZB-EDA-2-%EC%84%9C%EC%9A%B8%EC%8B%9C-%EB%B2%94%EC%A3%84-%ED%98%84%ED%99%A9-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Sat, 18 Nov 2023 07:42:30 GMT</pubDate>
            <description><![CDATA[<h1 id="02-analysis-seoul-crime">02. Analysis Seoul Crime</h1>
<h2 id="1-project-개요">1. project 개요</h2>
<p>강남3구의 체감 안전도가 높다는 신문 기사가 있었다.
과연 실제로 강남3구는 범죄로부터 안전하다고 볼 수 있는가?</p>
<h2 id="2-데이터-개요">2. 데이터 개요</h2>
<p>데이터 출처: 공공데이터포털 서울시 관서별 5대 범죄 발생 검거 현황(2016년도)
(세부 분석 내용은 별도 파일에 공유)</p>
<h3 id="pdread_csv">pd.read_csv()</h3>
<ul>
<li>thousands=&quot;,&quot;: 기본적으로 csv는 콤마(,)를 기준으로 데이터를 구분한다. 데이터 중 천 단위 숫자에 콤마로 구분되어 있으면 숫자가 아니라 문자열로 읽기 때문에 해당 옵션을 입력한다.
해당 옵션을 추가해 불러들이면 콤마가 제거된 숫자로 불러온다.</li>
</ul>
<h3 id="데이터-정리null값-삭제">데이터 정리(null값 삭제)</h3>
<p>crime_raw_data = crime_raw_data[crime_raw_data[&quot;죄종&quot;].notnull()]   # NaN값 제거</p>
<h3 id="pivot-table">pivot table</h3>
<ul>
<li>pd.pivot_table(df, index=&#39;&#39;)/df.pivot_table(index=&#39;&#39;)</li>
<li>index를 여러 개 설정할 땐 list 형태로</li>
<li>values 옵션을 통해 산출할 데이터 선택</li>
<li>aggfunc 옵션을 통해 산출 데이터 연산식 선택</li>
<li>columns 옵션을 통해 df의 데이터를 column으로 출력할 수 있음. 데이터가 없는 경우 NaN으로 입력되는데, fill_value= 옵션을 통해 없을 때 입력될 데이터를 선택할 수 있다.</li>
<li>margins=True 옵션으로 총계 표시</li>
</ul>
<h4 id="multi-indexcolumns">multi index/columns</h4>
<ul>
<li>컬럼이 여러 개인 경우 column level이 여러 개가 된다.</li>
<li>droplovel()으로 특정 컬럼 level을 삭제할 수 있다.</li>
<li>get_level_values() 메서드로 레벨별 컬럼을 볼 수 있다. (list 형태)</li>
</ul>
<blockquote>
<ul>
<li>jupyter notebook에서는 ! 명령어를 통해 os 레벨의 명령어를 쓸 수 있다.</li>
</ul>
</blockquote>
<ul>
<li>단, jupyter notebook의 코드를 바로 다른 곳에서 사용할 땐 에러가 날 수 있다.
get_ipython().system(&quot;&quot;)으로 명령어를 사용하면 다른 곳에서도 작동한다.</li>
</ul>
<blockquote>
<ul>
<li>아나콘다는 python에서 유용하게 사용되는 &#39;모듈 관리자&#39;이다.</li>
</ul>
</blockquote>
<ul>
<li>머신러닝 등 여러 가지 패키지가 기본적으로 포함되어 있고, 가상 환경 구축에도 유용하게 사용된다.</li>
<li>pip를 사용하는 경우 conda 환경에서 dependency 관리가 정확하지 않을 수 있으므로 가급적 conda 명령으로 모듈을 관리하는 것이 좋다.</li>
<li>conda 명령어
conda list : 설치된 모듈 list
conda install module_name : 모듈 설치
conda uninstall module_name : 모듈제거
conda install -c channel_name moduel_name: 지정된 배포 채널에서 모듈 설치</li>
<li><blockquote>
<p>특정 환경(맥북 M1 등)에서 설치하는 모듈을 별도로 운영하는 채널이 있다.</p>
</blockquote>
</li>
<li>모든 모듈이 conda로 설치되는 것은 아니다.</li>
</ul>
<h4 id="npmean">np.mean()</h4>
<ul>
<li>np.array 데이터 평균값을 계산할 때, axis 옵션을 통해 행열을 설정할 수 있다.
이때, pandas와 반대로 1이 행, 0이 열 계산이다.</li>
</ul>
<h2 id="google-maps-api">Google Maps API</h2>
<ul>
<li>googlemaps.Client(key=&#39;&#39;): 구글맵 API 불러오기</li>
<li>gmaps.geocode(&#39;검색어&#39;): 구글맵에서 검색어를 검색한 결과값을 list 안의 dict형태로 저장</li>
<li>검색 결과를 tmp 변수에 담아 key-value로 원하는 데이터를 찾을 수 있다.</li>
</ul>
<h2 id="seaborn">Seaborn</h2>
<ul>
<li>matplotlib과 함께 사용되는 모듈</li>
<li>import만 해도 matplotlib 그래프에 영향을 준다</li>
<li>실습용 데이터셋이 내장되어있다(tips, flights, iris, anscombe 등)</li>
</ul>
<h3 id="set_style">set_style()</h3>
<ul>
<li>white, dark, whitegrid, darkgrid 등이 있고, 각각 흰/회색 배경에 격자 유/무로 나타난다.</li>
</ul>
<h3 id="plots">plots</h3>
<ul>
<li>boxplot: 중앙값, 50% 데이터 범위 등등</li>
<li>swarmplot: 분포(점)</li>
<li>lmplot: 두 데이터 사이의 관계 파악
robust옵션으로 경향에서 많이 벗어난 데이터는 제외할 수 있다</li>
<li>heatmap: 전체 데이터 경향 확인
annot 옵션: 값 표현(True)
fmt 옵션: format(f 실수, d 정수)</li>
<li>pairplots: 다수의 컬럼 비교
kind 옵션: scatter(점), kde(지형도), hist(네모), reg(lmplot)</li>
<li>hue 옵션: 카테고리 구분</li>
<li>palatte 옵션: 색상 구분(Set 1~3)</li>
<li>color 옵션(0<del>1): 검정</del>하양 색상(swarmplot)</li>
</ul>
<h2 id="folium">Folium</h2>
<ul>
<li>지도 시각화 도구</li>
<li>위경도 정보 입력시 지도츨 출력한다. (folium.map(location=[lat,lng]))
튜플 또는 리스트 형태로 입력, 북위/동경 기준</li>
</ul>
<h3 id="구글지도에서-좌표-얻기">구글지도에서 좌표 얻기</h3>
<ul>
<li>강의에서는 원하는 지점을 우클릭하면 좌표가 바로 나왔는데, 버전이 달라져서 그런지 좌표를 바로 얻을 수 없었다.</li>
<li>우클릭 후 &#39;이곳이 궁금한가요?&#39;를 클릭하면 포인트가 생성되는데, 해당 포인트를 클릭 후 공유 버튼을 누르면 좌표를 복사할 수 있다.<blockquote>
<ol>
<li>우클릭-&gt;이곳이 궁금한가요? 클릭<img src="https://velog.velcdn.com/images/hugh_y/post/290d6b89-f66e-4f8c-a713-810697267ba9/image.png" alt=""></li>
<li>생성된 포인트 하단의 공유 버튼 클릭<img src="https://velog.velcdn.com/images/hugh_y/post/4577e138-afe1-496f-8986-b4739fa98473/image.png" alt=""></li>
<li>좌표 복사<img src="https://velog.velcdn.com/images/hugh_y/post/256d5425-3774-4080-aa76-335defab50fe/image.png" alt=""></li>
</ol>
</blockquote>
</li>
</ul>
<h3 id="foliummap">folium.Map()</h3>
<ul>
<li>zoom_start: 0~18, 숫자가 커질수록 확대</li>
<li>tiles=&#39;&#39;: 지도 스타일
OpenStreetMap: 기본 지도
Stamen Terrain: 산악 지도
Stamen Watercolor
CartoDBPositron/CartoDBDark_matter: 흐린(회색/검정) 배경 지도</li>
</ul>
<h3 id="save">save()</h3>
<ul>
<li>저장시 html파일로 저장된다.</li>
<li>주피터노트북 외의 환경에서는 지도가 보이지 않을 수 있으므로 저장을 통해 지도를 활용할 수 있다.</li>
</ul>
<h3 id="foliummarker">folium.Marker()</h3>
<ul>
<li>지도에 마커 생성</li>
<li>첫 번째 인자로 location을 입력하고, 뒤에 .add_to(지도)하면 지도에 해당 마커가 표시된다.</li>
<li>옵션
popup: 클릭시 출력되는 문자 입력, html 문법을 따른다. (html 문법을 따르기 때문에  a href를 통해 링크 입력도 가능)
tooltip: 마우스 오버시 출력되는 문자 입력
icon: folium.Icon() 마커를 지정할 수 있다.</li>
<li><blockquote>
<p>color 옵션으로 마커 배경 색상 지정</p>
</blockquote>
</li>
<li><blockquote>
<p>icon 옵션으로 마커 스타일(타입) 지정. info-sign, cloud 등이 있다. 일부 icon은 prefix 값을 지정해줘야 나타난다. (font awesome 아이콘은 fa, plyphicon은 plyphicom 입력)</p>
</blockquote>
</li>
<li><blockquote>
<p>icon_color 옵션으로 마커 색상 지정</p>
</blockquote>
</li>
<li><blockquote>
<p>angle 옵션으로 마커 회전</p>
</blockquote>
</li>
</ul>
<h3 id="foliumclickformarker">folium.ClickForMarker()</h3>
<ul>
<li>클릭시 마커가 생성되는 기능</li>
<li>안에 str 데이터가 없는 경우 위경도 좌표가 나오고, 데이터가 있으면 입력된 데이터가 나온다.</li>
</ul>
<h3 id="foliumlatlngpopup">folium.LatLngPopup()</h3>
<ul>
<li>클릭시 위경도 좌표 생성</li>
<li>ClickForMarker와 다른 점은 마커가 생성되지 않고 좌표만 나온다는 점</li>
</ul>
<h3 id="foliumcircle-foliumcirclemarker">folium.Circle(), folium.CircleMarker()</h3>
<ul>
<li>원</li>
<li>옵션
radius: 원 크기
color: 원 테두리 색
fill: 원 안에 색 채우기 여부(기본 False)
fill_color: 원 채우기 색</li>
<li>기본적으로 Circle과 CircleMarker은 거의 같지만 radius가 다르다.
circle: radius 미터(m) 단위, 확대/축소해도 변하지 않는다.
circlemarker: radius fixel 단위, 해상도(zoom)에 따라 크기가 바뀐다.</li>
</ul>
<h3 id="foliumchoropleth">folium.Choropleth</h3>
<ul>
<li>json 데이터를 통해 영역을 표시</li>
<li>옵션
geo_data: json 파일 경로
data: pandas DF 혹은 series
columns: DF에서 사용할 컬럼
key_on: data와 geo_data를 연결하는 key 설정
fill_color: 색상
fill_opacity: 채우기 불투명도(0-1)
line_opacity: 선 불투명도(0-1)
legend_name: 주석 이름</li>
</ul>
<h4 id="json-데이터">json 데이터</h4>
<ul>
<li>행마다 좌표 데이터를 저장하고 있다. (세부 내용 추후에)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ZB] EDA-1 서울시 CCTV 현황 분석]]></title>
            <link>https://velog.io/@hugh_y/ZB-EDA-1-%EC%84%9C%EC%9A%B8%EC%8B%9C-CCTV-%ED%98%84%ED%99%A9-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@hugh_y/ZB-EDA-1-%EC%84%9C%EC%9A%B8%EC%8B%9C-CCTV-%ED%98%84%ED%99%A9-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Wed, 15 Nov 2023 14:38:17 GMT</pubDate>
            <description><![CDATA[<h1 id="pandas">Pandas</h1>
<ul>
<li>보통 파이썬에서 테이블 데이터(엑셀, csv 등)를 읽을 때 가장 마낳이 사용하는 모듈</li>
<li>python에서 R만큼 강력한 데이터 핸들링 성능을 제공하는 모듈</li>
<li>단일 프로세스에서 최대 효율</li>
<li>코딩 및 응용이 가능한 엑셀, &#39;스테로이드 맞은 엑셀&#39;로 표현되기도 함</li>
</ul>
<blockquote>
<ul>
<li>import [a] as [b]
얼라이어스, &#39;import하는 모듈을 b로 명명하겠다&#39;는 뜻으로 이후 코드 작성을 간소화할 수 있음</li>
</ul>
</blockquote>
<ul>
<li>csv(comma separated values): 쉼표(,)로 구분된 텍스트 데이터</li>
</ul>
<ul>
<li>인코딩 문제가 있어 csv파일을 엑셀로 열면 깨질 수 있다.
pandas를 통해 불러올 때 csv파일의 인코딩을 확인하여 입력해야 한다.</li>
</ul>
<h2 id="pandas-dataframe-구조">Pandas DataFrame 구조</h2>
<ul>
<li>Index: 각 행(row)의 고유 번호
Column Name: 열(세로 방향)의 이름
Column: 각 열의 고유 이름
Values: 각 행, 열에 해당하는 값</li>
</ul>
<h3 id="데이터프레임-읽기">데이터프레임 읽기</h3>
<ul>
<li>pd.read_***() 명령어로 읽어온다.</li>
<li>인자에 header 옵션을 통해 column명을 명명할 수 있다.(어디부터 읽어올지 설정할 수 있다)
usecols 옵션을 통해 불러들일 column을 제한할 수 있다.</li>
<li>df.inplace 옵션을 통해 수정한 내용을 저장한다.(사용하고 있는 변수에, 저장하지 않는 경우 일회성으로 변화된다)</li>
<li>df.rename(columns=[a])을 통해 컬럼명 변경 가능. dict형태로 입력할 수 있다.</li>
<li>df.head(), df.tail()을 통해 데이터의 일부를 불러올 수 있다.(인자로 숫자 입력시 해당 숫자만큼 불러온다. 숫자 미입력시 기본값 5)</li>
<li>df.columns : 해당 DF의 column명을 list형태로 불러온다.</li>
</ul>
<h2 id="pandas-기초">Pandas 기초</h2>
<ul>
<li>Pandas의 데이터형을 구성하는 기본은 Series이다.</li>
</ul>
<h3 id="dataframe">DataFrame</h3>
<ul>
<li>pd.Series(): DF 생성(index, value)</li>
</ul>
<blockquote>
<p>강의 중 series는 한 가지 데이터 타입만 가질 수 있다고 표현했는데, 실제로는 각 value별 데이터타입은 다를 수 있었다.</p>
</blockquote>
<pre><code class="language-py"># 예시
data = pd.Series([1,2,3,4,&#39;5&#39;])   # dtype: object
data[:4] % 2
# 0 1 
# 1 0
# 2 1
# 3 0</code></pre>
<ul>
<li>pd.date_range(&quot;[날짜]&quot;, period=[a]): [날짜]부터 6일(기간)의 데이터 생성(Datetime Index)</li>
<li>데이터프레임 생성 방법
pd.DataFrame([value], index=[a], columns=[b]): 간단한 데이터프레임 생성
pd.DataFrame({&quot;column&quot;: [&#39;values&#39;]}): 딕셔너리 안의 리스트 형태(열 기준)
pd.DataFrame([{&#39;column&#39;: &#39;value&#39;}]): 리스트 안의 딕셔너리 형태(행 기준)</li>
</ul>
<h3 id="정보-탐색">정보 탐색</h3>
<ul>
<li>df.index, df.columns, df.values: 각각의 값 추출</li>
<li>df.info(): DF의 기본 정보 확인, 각 컬럼의 크기와 데이터 형태를 확인할 수 있다.</li>
<li>df.describe(): DF의 통계적 기본 정보(count, 평균, 표준편차 등)</li>
</ul>
<h3 id="정렬">정렬</h3>
<ul>
<li>df.sort_values(by=[a], ascending=[B]): [a]컬럼을 기준으로 [b](오름차순 True/ 내림차순 False) 정렬</li>
</ul>
<h3 id="선택">선택</h3>
<ul>
<li>df[]: 대괄호 안에 컬럼명으로 특정 컬럼만 추출할 수 있음</li>
<li><ul>
<li>df. 뒤에 컬럼명을 써도 선택 가능(단, 컬럼명이 숫자인 경우 불가능. str형식인 숫자도 불가능!)</li>
</ul>
</li>
<li><ul>
<li>두 개 이상의 컬럼을 불러올 땐 리스트에 담아서 df[[&quot;A&quot;, &quot;B&quot;]]</li>
</ul>
</li>
</ul>
<h4 id="slice">slice</h4>
<ul>
<li>df[a:b]: a행(row) ~ b-1행 슬라이싱, a,b에 특정 index나 컬럼명으로 slice하는 경우 a부터 b까지(b포함)</li>
</ul>
<h4 id="loc--iloc-location--integer-location">loc / iloc (location / integer location)</h4>
<ul>
<li>df.loc[a,b]: a행, b열의 데이터 선택, 각각 slice 및 이름으로 사용 가능(여러 개 이름을 입력할 땐 리스트형태)</li>
<li>index/column 이름으로만 가능, slice시 n~m까지(마지막 행/열 포함) 행/열 선택*</li>
<li>df.iloc[a,b]: loc 옵션과 같지만, 번호로만 접근 가능(row, column 모두 번호로)</li>
<li>이 경우에는 각각 n:m으로 slice하는 경우 n~m-1까지(마지막 행/열 불포함) 행/열 선택*</li>
</ul>
<h4 id="조건">조건</h4>
<ul>
<li>df[~]대괄호 안에 특정 조건을 통해 값을 필터링할 수 있음.(조건이 True인 row만 추출)</li>
<li>df[&#39;a&#39;].isin([values]): a컬럼에 value가 있는 경우 True, 없는 경우 False 반환
ex) df[df[&#39;a&#39;] &gt; 0]: &#39;a&#39;컬럼 value가 0보다 큰 데이터 추출
ex) df[df &gt; 0]: 모든 value 중 음수인 값은 NaN처리</li>
</ul>
<h3 id="삭제">삭제</h3>
<ul>
<li>del df[&#39;a&#39;]: 특정 column(컬럼명 입력) 제거</li>
<li>df.drop(): 1개의 인자만 넣으면 해당 행 삭제
axis=0(행), axis=1(열)을 통해 행/열을 삭제할 수 있다.
columns= 옵션을 통해 컬럼을 지정하면 axis 옵션을 주지 않아도 열(column)이 삭제된다.
기본적으로 삭제 후 data에 반영되지 않으므로 inplace=True 옵션을 줘야 data에 반영된다.</li>
</ul>
<h3 id="apply">apply</h3>
<ul>
<li>df[column].apply(): &quot;sum&quot;, &quot;mean&quot;, &quot;max&quot;, &quot;min&quot; 등을 통해 해당 컬럼의 데이터를 연산할 수 있다.</li>
<li>기본적으로 pandas는 numpy 패키지를 기반으로 만들어져있기 때문에 np.sum, np.std 등의 연산도 가능하다.
직접 만든 함수도 입력 가능</li>
</ul>
<h3 id="unique">unique()</h3>
<ul>
<li>해당 컬럼의 값을 중복값 없이 나타낸다.(array 형태)</li>
</ul>
<h3 id="merge">merge()</h3>
<ul>
<li>on 옵션을 통해 기준 설정, 해당 컬럼을 기준으로 데이터가 합쳐진다.</li>
<li>how 병합의 기준 데이터 설정
left: 좌측 데이터 기준, 우측에 없으면 NaN처리
right: 우측 데이터 기준, 좌측에 없으면 NaN처리
outer: 좌우측 상호 간에 없는 데이터는 NaN처리하며 합쳐진다.</li>
</ul>
<h3 id="상관관계corr">상관관계(corr)</h3>
<ul>
<li>두 데이터 사이에서 한 데이터의 증가가 다른 데이터에 영향(증가 또는 감소)을 주는 지표</li>
</ul>
<p>0.2 이하: 상관관계가 없거나 무시해도 좋은 수준
0.4 이하: 약한 상관관계
0.6 이상: 강한 상관관계</p>
<ul>
<li><ul>
<li>상관관계가 있어도 <strong>인과관계</strong>는 아닐 수 있다.</li>
</ul>
</li>
</ul>
<h2 id="matplotlib">matplotlib</h2>
<ul>
<li>matplotlib.pyplot: matlab 프로그램 시각화 기능이 담겨있다.</li>
<li>파이썬의 대표 시각화 도구로, 주로 plt로 naming하여 사용한다.</li>
<li>jupyter notebook을 사용하는 경우 matplotlib 결과를 한 화면에 나타내기 위해 <strong>%matplotlib inline</strong> 옵션을 사용한다.</li>
</ul>
<ul>
<li>2D 그래프 전담</li>
<li>plt.figure()로 열어서 plt.show()로 닫는다.<h3 id="pltfigure">plt.figure()</h3>
</li>
<li>figsize: 그래프 크기 설정</li>
</ul>
<h3 id="pltplot">plt.plot()</h3>
<ul>
<li>선그래프, 기본 인자로 x축과 y축 값을 받는다.</li>
<li>각종 옵션을 통해 디테일을 설정할 수 있다.
color: 색상
linestyle: 선 스타일, ls로 쓸 수 있음
lw: 선 굵기
marker: 마커 모양
markerfacecolor: 마커 색상
markersize: 마커 크기</li>
</ul>
<h3 id="기타-옵션">기타 옵션</h3>
<ul>
<li>plt.grid(): 격자</li>
<li>plt.legend(): 범례
label: 각 그래프별 라벨을 한꺼번에 입력 가능하고, 해당 그래프를 나타내는 식(plt.plot() 등) 안에 label 옵션을 통해 입력할 수도 있다.
loc: 범례 위치, upper right, upper left 등이 있고, 숫자로도 입력할 수 있다.</li>
<li>plt.xlabel(): x축 이름</li>
<li>plt.ylabel(): y축 이름</li>
<li>plt.title(): 그래프 제목</li>
<li>plt.xlim(): x축 범위 설정</li>
<li>plt.ylim(): y축 범위 설정 </li>
<li>plt.text(x, y, t): (x,y) 좌표에 t 텍스트 출력</li>
</ul>
<h3 id="pltscatter">plt.scatter()</h3>
<ul>
<li>점 그래프
c: 색상
marker: 점 모양
s: 마커 크기</li>
</ul>
<h2 id="pandas를-활용해서-그래프-그리기">Pandas를 활용해서 그래프 그리기</h2>
<ul>
<li>Pandas DF는 변수에서 바로 plot 명령을 사용할 수 있다.</li>
<li>데이터(컬럼)가 많은 경우 정렬 후 그리는 것이 효과적일 때가 많다.</li>
</ul>
<h2 id="numpy를-이용한-1차-직선-만들기">numpy를 이용한 1차 직선 만들기</h2>
<ul>
<li>np.polyfit: 직선을 구성하기 위한 계수 계산</li>
<li>np.poly1d: polyfit으로 찾은 계수로 python에서 사용할 함수로 만들어 줌</li>
<li>np.linspace(a,b,n): a부터 b까지 n개의 등간격 데이터 생성</li>
</ul>
<h3 id="오차-데이터">오차 데이터</h3>
<ul>
<li>np.poly1d 함수값과 실 데이터 차이를 통해 경향 대비 오차 값을 구할 수 있다.</li>
</ul>
<h2 id="csv로-저장하기">csv로 저장하기</h2>
<ul>
<li>pd.DataFrame.to_csv(&#39;경로&#39;, sep=&#39;,&#39;, encoding=&#39;utf-8&#39;)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ZB] 파이썬 중급 5]]></title>
            <link>https://velog.io/@hugh_y/ZB-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-5</link>
            <guid>https://velog.io/@hugh_y/ZB-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-5</guid>
            <pubDate>Wed, 01 Nov 2023 07:48:21 GMT</pubDate>
            <description><![CDATA[<h1 id="텍스트파일">텍스트파일</h1>
<h2 id="쓰기">쓰기</h2>
<pre><code class="language-py">file = open(&#39;C:/pythonEx/project/test.txt&#39;, &#39;w&#39;)   # &#39;w&#39;는 쓰기 권한으로 실행

strCnt = file.write(&#39;Hello Python!&#39;)   # 말 그대로 쓰기만 가능(기존 내용 삭제 후 쓰기)
print(f&#39;strCnt: {strCnt}&#39;)   # 13


file.close()</code></pre>
<blockquote>
<p>strCnt에 담으면 문자열의 개수(int)가 담긴다.
변수에 할당하지 않고 실행만 해도 작동한다.
str 형태로 써야 한다(int 입력시 에러)</p>
</blockquote>
<h2 id="읽기">읽기</h2>
<pre><code class="language-py">file = open(&#39;C:/pythonEx/project/test.txt&#39;, &#39;r&#39;)   # &#39;r&#39;은 읽기 권한

read = file.read()
print(read)   #Hello Phthon!&#39;

file.close()</code></pre>
<blockquote>
<p>[str].replace(a, b, c)
-&gt; str에서 a라는 문자열을 찾아 b로 바꾼다.(3회)</p>
</blockquote>
<h2 id="열기">열기</h2>
<ul>
<li>파일모드를 통해 파일을 열 때 어떤 목적으로 열 건지 정하고 연다.
w : 쓰기 전용(기존 내용 덮어쓰기)
a : 쓰기 전용(기존 내용 뒤에 덧붙이기)
x : 쓰기 전용(파일이 있으면 에러)
r : 읽기 전용(파일이 없으면 에러)</li>
</ul>
<h2 id="with--as">with ~ as</h2>
<ul>
<li>close하지 않아도 알아서 닫힌다.<pre><code class="language-py">uri = &#39;[디렉토리]&#39;
with open(uri + &#39;5_037.txt&#39;, &#39;a&#39;) as f:
  f.write(&#39;Hello Python!&#39;)
</code></pre>
</li>
</ul>
<p>with open(uri + &#39;5_037.txt&#39;, &#39;r&#39;) as f:
    print(f.read())    # Hello Python!</p>
<pre><code>&gt;with ~ as 구문으로 파일을 읽을 때, 변수에 저장해두면 with ~ as 구문 밖에서도 활용할 수 있다.

## writelines()
* 리스트, 튜플 데이터를 파일에 쓰기 위한 함수
```py
languages = [&#39;c/c++&#39;, &#39;java&#39;, &#39;c#&#39;, &#39;python&#39;, &#39;javascript&#39;]

with open(uri + &#39;languages.txt&#39;, &#39;a&#39;) as f:
    f.writelines(item + &#39;\n&#39; for item in languages)</code></pre><blockquote>
<p>조건식/조건문처럼 반복문도 한 줄 안에 명령어 사용 가능</p>
</blockquote>
<pre><code class="language-py">scoreDic = {&#39;kor&#39;: 85, &#39;eng&#39;: 85,&#39;mat&#39;: 85,&#39;sci&#39;: 85,&#39;his&#39;: 85}
with open(uri + &#39;scores.txt&#39;, &#39;w&#39;) as f:
    print(scoreDic, file=f)</code></pre>
<blockquote>
<p>print() 함수의 인자로 file= 부분을 추가해 텍스트파일 안에 출력문 그대로 저장할 수 있다.</p>
</blockquote>
<h2 id="readlines--readline">readlines() / readline()</h2>
<ul>
<li>readlines(): 파일 전체를 list에 담음(행마다)</li>
<li>readline(): 한 행을 읽어 문자로 반환, 개행 문자까지 읽으므로 자동개행된다.</li>
</ul>
<blockquote>
<p>[str].split(a) : a라는 문자를 기준으로 str을 나눠 list 형태로 담는다.
[str].strip(a) : str문의 맨 앞뒤에 a 문자를 삭제한다.(맨 앞뒤에 있는 겨우에만 삭제)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ZB] 파이썬 중급 4]]></title>
            <link>https://velog.io/@hugh_y/ZB-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-4</link>
            <guid>https://velog.io/@hugh_y/ZB-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-4</guid>
            <pubDate>Fri, 27 Oct 2023 16:47:02 GMT</pubDate>
            <description><![CDATA[<h2 id="상속">상속</h2>
<h3 id="다중-상속">다중 상속</h3>
<ul>
<li>class [클래스명]([부모클래스1], [부모클래스2]) 형식으로 여러 개의 클래스로부터 상속받을 수 있다.</li>
<li>부모클래스의 메서드명이 동일한 경우 먼저 상속받는 클래스의 메서드가 호출되지만, 헷갈릴 수 있으므로 주의가 필요하다.<blockquote>
<p>super()로 상위 클래스를 불러올 때 먼저 상속받는(앞에 써있는) 클래스가 지정된다.</p>
</blockquote>
</li>
</ul>
<h3 id="오버라이딩">오버라이딩</h3>
<ul>
<li>부모 클래스의 기능(메써드)를 재정의할 수 있다.</li>
</ul>
<h2 id="추상클래스">추상클래스</h2>
<ul>
<li>상위 클래스에서 메서드를 빈 상태로 두고, 하위 클래스에서 구현하도록 강요한다.(구현하지 않으면 에러)</li>
<li>abc 패키지에서 ABCMeta class 호출, abstractmethod 호출<blockquote>
<p>abc : <strong>a</strong>bstract <strong>b</strong>ase <strong>c</strong>lass
@abstractmethod: 추상 메서드 지정</p>
</blockquote>
<pre><code class="language-python">from abc import ABCMeta
from abc import abstractmethod
</code></pre>
</li>
</ul>
<p>class AirPlane(metaclass=ABCMeta):
    @abstractmethod    # 빈 메서드,정의되지 않은 객체 생성시 오류 발생
    def flight(self):
        pass</p>
<pre><code>def forward(self):
    print(&#39;전진&#39;)</code></pre><p>class AirLiner(AirPlane):
    def <strong>init</strong>(self, c):
        self.color = c</p>
<pre><code>def flight(self):
    print(&#39;시속 400km/h 비행&#39;)</code></pre><p>al = AirLiner(&#39;red&#39;)
al.flight()   # 시속 400km/h 비행
al.forward()   # 전진</p>
<pre><code>
## 예외처리
* try ~ except으로 감싼다.
```py
eveList = []; oddList = []; floatList = []; dataLise = []

n = 1
count = 0
while n &lt; 6:
    try:
        data = input(&#39;input number: &#39;)
        num = float(data)

    except:
        print(&#39;오류 발생&#39;)
        continue   # 오류 발생시 아래 else문을 실행하지 않고 위로(try문) 올라가 다시 실행

    else:
        if num - int(num) != 0: 
            floatList.append(num)

        elif num % 2 == 0:
            eveList.append(int(num))

        else:
            oddList.append(int(num))

        n += 1
        dataList.append(data)

    finally:
        count += 1


print(f&#39;eveList: {eveList}&#39;)
print(f&#39;oddList: {oddList}&#39;)
print(f&#39;floatList: {floatList}&#39;)    
print(f&#39;dataList: {dataList}&#39;)
print(f&#39;입력시도: {count}&#39;)</code></pre><ul>
<li><p>~ else 뒤에는 try에서 통과됐을 때 이후 실행된다. (try~except 뒤에 사용)</p>
</li>
<li><p>finally 뒤에는 항상 실행된다!(try에서 오류가 발생해도, else문이 실행된 이후에도)</p>
</li>
</ul>
<h3 id="예외-관련-클래스는-exception-클래스를-상속한다">예외 관련 클래스는 Exception 클래스를 상속한다.</h3>
<ul>
<li>0으로 나눴을 때(ZeroDivisionError), 리스트 등에서 인덱스를 잘못 입력했을 때(IndexError) 등등</li>
</ul>
<h2 id="exception-클래스">Exception 클래스</h2>
<ul>
<li>예외를 담당하는 클래스로, 어떤 예외가 발생했는지 알 수 있다.<pre><code class="language-py">try:
  print(f&#39;{num1} / {num2} = {num1 / num2}&#39;)
except Exception as e:
  print(f&#39;Exception: {e}&#39;)   # 0으로 나눌 시 &#39;Exception: division by zero&#39; 출력</code></pre>
</li>
<li>try문 실패시 Exception 클래스 객체를 생성한다.</li>
</ul>
<hr>
<ul>
<li>raise 키워드를 통해 예외를 발생시킬 수도 있다.<pre><code class="language-py">def divCal(n1, n2):
  if n2 != 0:
      print(f&#39;{n1} / {n2} = {n1 / n2}&#39;)
  else:
      raise Exception(&#39;0으로 나눌 수 없습니다.&#39;)
</code></pre>
</li>
</ul>
<p>num1 = int(input(&#39;num1: &#39;))
num2 = int(input(&#39;num2: &#39;))</p>
<p>try:
    divCal(num1,num2)
except Exception as e:
    print(f&#39;Exception: {e}&#39;)   # 0으로 나눌 시 &#39;Exception: 0으로 나눌 수 없습니다.&#39; 출력</p>
<pre><code>* Exception(&#39;오류내용&#39;, *) \* 위치에 숫자를 표시하여 Exception 내용을 구분할 수 있다.
```py
def sendSMS(msg):
    if len(msg) &gt; 10:
        raise Exception(&#39;길이 초과! MMS 전환 후 발송!!&#39;, 1)

    else:
        print(&#39;SMS 발송!!&#39;)


def sendMMS(msg):
    if len(msg) &lt;= 10:
        raise Exception(&#39;길이 미달! SMS 전환 후 발송!!&#39;, 2)

    else:
        print(&#39;MMS 발송!!&#39;)


msg = input(&#39;input message: &#39;)

try:
    sendSMS(msg)
except Exception as e:
    print(f&#39;e: {e.args[0]}&#39;)   # 오류 내용 출력

    if e.args[1] == 1:   # 오류 구분에 따라 다른 함수 실행
        sendMMS(msg)
    elif e.args[1] == 2:
        sendSMS(msg)</code></pre><h3 id="사용자-예외-클래스">사용자 예외 클래스</h3>
<ul>
<li>Exception 클래스를 상속받아 사용자가 직접 예외 클래스를 만들 수 있다.<pre><code class="language-py">class NotUseZeroException(Exception):
  def __init__(self, n):
      super().__init__(f&#39;{n}은 사용할 수 없습니다.&#39;)

</code></pre>
</li>
</ul>
<p>def div_cal(n1, n2):
    if n2 == 0:
        raise NotUseZeroException(n2)</p>
<pre><code>else:
    print(f&#39;{n1} / {n2} : {n1 / n2}&#39;)</code></pre><p>inputNum1 = int(input(&#39;num1: &#39;))
inputNum2 = int(input(&#39;num2: &#39;))</p>
<p>try:
    div_cal(inputNum1, inputNum2)</p>
<p>except NotUseZeroException as e:
    print(e)
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ZB] 파이썬 중급 3]]></title>
            <link>https://velog.io/@hugh_y/ZB-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-3</link>
            <guid>https://velog.io/@hugh_y/ZB-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-3</guid>
            <pubDate>Wed, 25 Oct 2023 08:19:46 GMT</pubDate>
            <description><![CDATA[<h1 id="객체지향-프로그래밍">객체지향 프로그래밍</h1>
<ul>
<li>class를 통해 객체를 만들고, 속성과 기능을 만들어 사용할 수 있다.</li>
<li>객체를 사용하는 경우 코드 재사용, 모듈화에 좋다.<h2 id="속성">속성</h2>
</li>
<li>객체가 가지는 속성(예를 들어, 자동차 클래스는 색상, 길이, 가격 등등의 속성을 가질 수 있다.)</li>
<li>객체를 만들 때 각각의 속성이 무엇인지 설장할 수 있고, 설정하지 않는 경우 기본값을 지정할 수 있다.</li>
</ul>
<h2 id="기능메서드">기능(메서드)</h2>
<ul>
<li>객체가 할 수 있는 행동(?) 같은 개념 (자동차 클래스 예로 전진, 후진 등의 기능을 가질 수 있다)</li>
<li>그 객체가 가지는 함수라고 볼 수 있다.</li>
</ul>
<hr>
<ul>
<li><p>class 안의 특정 기능은 매개변수로 self를 받는다.</p>
<pre><code class="language-python">class Car:

  def __init__(self, col, len):   # 생성자, Car()와 대응되는 메써드
         self.color = col
         self.length = len

  def doStop(self):
      print(&#39;Stop!!&#39;)

  def doStart(self):
      print(&#39;Start!!&#39;)

  def printCarInfo(self):
      print(f&#39;self.color: {self.color}&#39;)
      print(f&#39;self.length: {self.length}&#39;)</code></pre>
</li>
<li><p>객체는 클래스로부터 생성된다.</p>
</li>
<li><p>클래스를 생성한다는 것은 클래스 이름과 동일한 생성자를 호출해서 객체를 만든다(이때 필요한 매개변수 값을 정확하게 매치해야 한다)</p>
</li>
<li><p>레퍼런스 변수를 이용해서 객체의 기능을 사용할 수 있다.</p>
<pre><code class="language-python">car1 = Car(&#39;red&#39;, 200)
car1.doStop()   # Stop!!
car1.printCarInfo()   # self.color: red \n self.length: 200</code></pre>
<h2 id="객체의-속성-변경">객체의 속성 변경</h2>
</li>
</ul>
<pre><code class="language-python">car1.color = &#39;white&#39;
car1.printCarInfo()   # self.color: white \n self.length: 200</code></pre>
<ul>
<li>객체의 속성은 값을 입력(대응연산자 &#39;=&#39;)함으로써 수정할 수 있다.(변수처럼)</li>
</ul>
<h2 id="객체와-메모리">객체와 메모리</h2>
<ul>
<li>객체를 담는 변수는 실제 객체가 저장된 메모리의 &#39;주소값&#39;을 저장하고 있다.</li>
<li>(객체의 속성을 바꾸는 경우 메모리와 상관없이 실제 객체의 메모리 데이터가 바뀐다)*</li>
</ul>
<h3 id="얕은-복사">얕은 복사</h3>
<ul>
<li>객체 주소를 복사하는 것</li>
</ul>
<h3 id="깊은-복사">깊은 복사</h3>
<ul>
<li><p>객체 자체를 복사하는 것으로, 또 하나의 객체가 만들어진다.(copy 모듈, copy.copy(객체)로 복사 가능)</p>
<pre><code class="language-python">import copy
class Car:

  def __init__(self, color):
      self.color = color

  def printCarInfo(self):
        print(f&#39;{self.color}&#39;)
</code></pre>
</li>
</ul>
<p>car1 = Car(&#39;red&#39;)
car2 = car1                  # 얕은 복사
car3 = copy.copy(car1)         # 깊은 복사</p>
<p>car1.printCarInfo()   # red
car2.printCarInfo()   # red
car3.printCarInfo()   # red</p>
<p>car1.color = &#39;blue&#39;</p>
<p>car1.printCarInfo()   # blue
car2.printCarInfo()   # blue
car3.printCarInfo()   # red</p>
<pre><code>
* 다음과 같은 방법으로 깊은 복사를 할 수 있다.
1. copy.copy() 메서드 활용
2. for문 활용 (빈 리스트 선언 후 for문을 통해 각 값을 append)
3. extend() 메서드 활용
4. 슬라이싱([:]) 활용

&gt;강의에서는 위 방법이 깊은 복사라고 소개되었고, 실제로 각각 복사했을 때 id값이 다른 것을 확인할 수 있었다.
하지만 찾아보니 각 방법에는 그 안의 요소에 대한 매모리값은 고려되지 않아, 리스트 안에 리스트가 있는 경우 등 mutable(가변형) 자료형 안에 mutable 자료가 들어있는 경우 내부 자료의 주소값이 동일하다.
&gt;&gt;```python
a = [[1,2], [3,4]]
b = a[:]
print(id(a))   # 4395624328
print(id(b))   # 4396179592
print(id(a[0]))   # 4396116040
print(id(b[0]))   # 4396116040
&gt;&gt;
print(a)   # [[1,2], [3,4]]
print(b)   # [[1,2], [3,4]]
a[0][0] = 9
print(a)   # [[9,2], [3,4]]
print(b)   # [[9,2], [3,4]]</code></pre><blockquote>
<p>copy.deepcopy() 메서드를 활용해 깊은 복사를 할 수 있다.</p>
</blockquote>
<h2 id="상속">상속</h2>
<ul>
<li>클래스의 기능을 그대로 가져올 수 있다. (부모의 기능 + 상속 클래스 기능 추가 가능)<pre><code class="language-python">class Car:
     def drive(self):
         print(&#39;GO&#39;)
</code></pre>
</li>
</ul>
<p>class Carr(Car):
      def back(self):
           print(&#39;BACK&#39;)</p>
<p>car1 = Carr()
car1.drive()   # GO</p>
<pre><code>
### 생성사 \__init__() 메서드와 super()
* 상속받는 child class는 기본적으로 parent class의 생성자를 호출하지 않는다.
* 강제로 parent class의 생성자를 호출하거나, super() 메서드를 사용해 parent class의 생성자를 호출할 수 있다.
* * P_Class의 생성자를 직접 호출할 땐 self를 써야 하고, super()로 호출할 땐 생략해도 된다.
```python
class P_Class:
    def __init__(self, pNum1, pNum2):
        print(&#39;[P_Class] __init__() called!&#39;)
        self.pNum1 = pNum1
        self.pNum2 = pNum2

class C_Class(P_Class):
    def __init__(self, cNum1, cNum2):
        print(&#39;[C_Class] __init__() called!&#39;)
        # P_Class.__init__(self, cNum1, cNum2)
        super().__init__(cNum1, cNum2)

        self.cNum1 = cNum1
        self.cNum2 = cNum2

cls = C_Class(20, 30)  # [C_Class] __init__() called!, [P_Class] __init__() called!&#39;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[ZB] 파이썬 중급 2]]></title>
            <link>https://velog.io/@hugh_y/ZB-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-2</link>
            <guid>https://velog.io/@hugh_y/ZB-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-2</guid>
            <pubDate>Tue, 24 Oct 2023 15:22:19 GMT</pubDate>
            <description><![CDATA[<h1 id="모듈">모듈</h1>
<h2 id="내부-모듈">내부 모듈</h2>
<ul>
<li>파이썬 설치 시 기본적으로 사용할 수 있는 모듈<h3 id="난수-모듈random">난수 모듈(random)</h3>
<pre><code class="language-python">import random
rNum = random.randint(1,10)  # 1~10</code></pre>
<blockquote>
<p>random 모듈 뜯어보기</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/hugh_y/post/9ece05af-4b02-45dd-8fa6-68bd070441a2/image.png" alt=""></p>
</blockquote>
</blockquote>
</li>
</ul>
<h2 id="외부-모듈">외부 모듈</h2>
<ul>
<li>별도 설치 후 사용할 수 있는 모듈(ex. pandas, numpy 등)</li>
</ul>
<h2 id="사용자-모듈">사용자 모듈</h2>
<ul>
<li>사용자가 직접 만드는 모듈(파이썬 파일에 함수를 정의하고, import로 파이썬 파일을 호출해서 사용 가능)</li>
<li>lambda로 만든 함수도 호출할 수 있다.<blockquote>
<ul>
<li>복합연산자 += 는 문자열도 사용 가능하다.(문자열이 뒤에 붙음)<pre><code class="language-python">sample = &#39;abc&#39;
sample += &#39;d&#39;    # sample = sample + &#39;d&#39;
print(sample)   # abcd </code></pre>
</li>
</ul>
</blockquote>
</li>
</ul>
<h3 id="모듈-사용">모듈 사용</h3>
<ul>
<li>import 키워드로 모듈을 불러온다</li>
<li>as 키워드를 이용해서 모듈 이름을 단축시킬 수 있다.</li>
<li>from ~ import 키워드를 이용해서 특정 기능만 불러올 수 있다.<blockquote>
<ul>
<li>from을 통해서 기능을 불러오는 경우, 모듈명.기능()형식으로 쓸 필요 없이 기능을 바로 쓸 수 있다.</li>
<li>콤마(,)를 통해 여러 개의 기능을 한꺼번에 가져올 수도 있다.</li>
<li>from ~ import * 하면 모든 기능을 다 가져온다.</li>
</ul>
</blockquote>
</li>
</ul>
<h2 id="실행메인-파일">실행(메인) 파일</h2>
<ul>
<li>전역변수 _<em>name_</em> 는 별도로 선언(초기화)하지 않아도 내용을 담고 있다.</li>
<li>실행될 때는 _<em>name_</em> 변수는 _<em>main_</em> 을 담고있고, 실행되지 않을 때(모듈로써 호출될 때)는 해당 모듈명이 _<em>name_</em> 변수에 담긴다.<blockquote>
<p><img src="https://velog.velcdn.com/images/hugh_y/post/236d9564-1fdc-4e0a-86a4-9133c2a78dfd/image.png" alt="">
<img src="https://velog.velcdn.com/images/hugh_y/post/e193dba7-fec2-4dd5-af0b-42b82da26553/image.png" alt=""></p>
<ul>
<li>모듈 안에 실행문이 있는 경우, 호출만 해도 실행문이 실행된다.<blockquote>
<p>모듈이 호출될 때 실행되는 것을 방지하기 위해 조건문을 통해 __name__이 __main__인 경우에만 실행되도록 할 수 있다.</p>
</blockquote>
</li>
</ul>
</blockquote>
</li>
</ul>
<h2 id="패키지">패키지</h2>
<ul>
<li>관련 있는 모듈을 디렉토리(그룹)로 관리<pre><code class="language-python">from [패키지] import [모듈]</code></pre>
</li>
<li>패키지, 모듈은 같은 디렉토리 내 혹은 venv/Lib/site-packages 디렉토리 내에서 불러올 수 있다.<pre><code class="language-python">import sys
</code></pre>
</li>
</ul>
<p>for path in sys.path:
      print(path)</p>
<pre><code>* 위 실행문을 통해 import할 때 불러오는 package Library 디렉토리를 알 수 있다.
* 여러 디렉토리가 보이는데, 그 중 venv환경은 현재 가상환경에서만 불러오는 디렉토리이다.

&gt;가상환경
&gt;* 독립적인 환경 세팅을 통해 충돌을 피할 수 있다.(To be continued...)


## 자주 사용하는 모듈
### math 모듈
#### 절대값 fabs
```python
import math

print(f&#39;math.fabs(-10): {math.fabs(-10)})    # 10.0, float</code></pre><h4 id="올림-ceil--내림-floor--버림-trunc">올림 ceil / 내림 floor / 버림 trunc</h4>
<pre><code class="language-python">import math

print(f&#39;math.ceil(0.1234): {math.ceil(0.1234)}&#39;)   # 1, int
print(f&#39;math.floor(-5.2): {math.floor(-5.2)}&#39;)   # -6, int
print(f&#39;math.trunc(-5.2): {math.trunc(-5.2)}&#39;)   # -5, int</code></pre>
<h4 id="최대공약수-gcd--팩토리얼-factorial--제곱근-sqrt">최대공약수 gcd / 팩토리얼 factorial / 제곱근 sqrt</h4>
<pre><code class="language-python">import math

print(f&#39;math.gcd(14,21): {math.gcd(14,21)}&#39;)   # 7, int
print(f&#39;math.factorial(8): {math.factorial(8)}&#39;)   # 40320, int
print(f&#39;math.sqrt(4): {math.sqrt(4)}&#39;)    # 2.0, float</code></pre>
<h3 id="random-모듈">random 모듈</h3>
<ul>
<li>randint(a, b) : a부터 b까지(a, b 포함)의 숫자 중 랜덤 정수(int) 반환</li>
<li>sample(range(a, b), c) : a부터 b-1까지의 숫자 중 랜덤하게 c 갯수만큼 반환(list형)</li>
<li>random() : 무작위 실수(float) 반환</li>
</ul>
<h3 id="time-모듈">time 모듈</h3>
<ul>
<li>localtime() : 현재 시간</li>
<li><ul>
<li>tm_year : 연도
tm_mon : 월
tm_mday : 일
tm_hour : 시
tm_min : 분
tm_sec : 초
tm_wday : 요일(0 ~ 6 / 일 ~ 토)</li>
</ul>
</li>
</ul>
<blockquote>
<p>localtime()으로 클래스가 생성되고, 위에 언급된 것들 외에도 여러 속성들이 있다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ZB] 파이썬 중급 1]]></title>
            <link>https://velog.io/@hugh_y/ZB-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-1</link>
            <guid>https://velog.io/@hugh_y/ZB-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-1</guid>
            <pubDate>Fri, 20 Oct 2023 08:00:01 GMT</pubDate>
            <description><![CDATA[<h1 id="함수">함수</h1>
<ul>
<li>수학에서의 함수와 동일하게 input을 넣으면 연산(function)을 거쳐 output을 낸다.</li>
<li>함수는 내장함수(파이썬에서 기본으로 제공하는 함수)와 사용자 함수(사용자가 직접 선언)가 있다.</li>
<li>함수의 괄호()안에 들어가는 부분을 &#39;매개변수&#39;라고 한다.</li>
<li>함수를 통해 특정 함수를 작동하게 할 수도 있고, 특정 값을 반환할 수도 있다.</li>
<li><strong>함수를 정의하고 사용하면 특정 기능을 반복해서 사용할 때 효율적으로 코드를 작성할 수 있다.</strong></li>
</ul>
<h2 id="함수-선언">함수 선언</h2>
<pre><code>def 함수명(매개변수):
    내용</code></pre><ul>
<li>함수명의 첫 글자는 소문자로 한다(관례)</li>
<li>변수 선언과 마찬가지로 &#39;어떤 기능인지&#39; 알기 쉽도록 함수명을 정의하고, 주로 동사를 쓴다.</li>
<li>매개변수는 없을 수 있지만, 괄호는 반드시 써야 한다.
(함수를 호출할 때 괄호 안에 넣는 것은 인수라고 한다.)</li>
<li>선언한 함수는 호출해야 작동한다.</li>
<li>실행문이 없는 경우 오류가 발생한다. (pass를 사용하면 오류를 피할 수 있다)</li>
</ul>
<h2 id="함수-호출">함수 호출</h2>
<h3 id="함수명인수">함수명(인수)</h3>
<ul>
<li>함수 내에서 또 다른 함수를 호출할 수 있다.</li>
<li>함수 호출 시 괄호 안에 인수를 입력하면, 해당 인수는 함수에서 정의된 매개변수에 저장되어 함수가 작동된다.</li>
<li>함수 선언 시 인수를 몇 개 받을지 갯수에 맞춰 매개변수를 입력해야 한다.</li>
<li>함수 호출 시에는 선언된 매개변수 갯수체 맞춰 입력해야 한다</li>
<li>받을 인수(매개변수)의 개수가 정해지지 않은 경우 <em>를 이용해서 처리할 수 있다.
(</em>처리된 매개변수는 호출 시 입력하지 않아도 작동하는 데 문제없다.)</li>
</ul>
<pre><code class="language-python">def printNum(*numbers):
    for number in numbers:
        print(number, &#39;, &#39;, end=&quot;&quot;)
    print()


# 출력결과

printNum(1)   # 1,
printNum(1,3)   # 1,3,
printNum(1,3,5)   # 1,3,5,
printNum(1,3,5,7)   # 1,3,5,7,</code></pre>
<blockquote>
<p>여러 개의 매개변수를 받을 떄, 함수에서는 받은 매개변수들을 tuple형태로 사용한다.</p>
</blockquote>
<pre><code class="language-python">def testFunc(*args):
    print(args)
    print(type(args))
&gt;
testfunc(1,2,3)  # (1,2,3) (&lt;class tuple&gt;)
testfunc(&#39;abc&#39;)  # (&#39;abc&#39;,) (&lt;class tuple&gt;)</code></pre>
<h2 id="데이터-반환">데이터 반환</h2>
<pre><code class="language-python">def 함수명(매개변수):
    내용
    return [반환데이터]</code></pre>
<ul>
<li>함수 결과를 반환한다.</li>
</ul>
<h3 id="전역변수지역변수">전역변수/지역변수</h3>
<h4 id="전역변수">전역변수</h4>
<ul>
<li>함수 밖에서 선언된 변수로, 함수 안에서 사용은 가능하지만 수정할 수는 없다.(값을 바꿔도 함수 안에서만 바뀐다)<pre><code class="language-python">num = 10
def printNum():
num = 20
print(num)
</code></pre>
</li>
</ul>
<h1 id="출력결과">출력결과</h1>
<p>printNum()  # 20
print(num)  # 10</p>
<pre><code>* global 키워드를 사용하면 전역변수를 함수 안에서 수정 가능하다.
```python
numOut = 10
def printNum():
    global numOut
    numOut = 20
    print(num)

# 출력결과
printNum()  # 20
print(numOut)  # 20</code></pre><h4 id="지역변수">지역변수</h4>
<ul>
<li>함수 안에서 선언된 변수로, 함수 안에서만 사용 가능하다.<pre><code class="language-python">def printNums():
numIn = 10
print(numIn)
</code></pre>
</li>
</ul>
<p>printNums()   # 10
print(numIn)   # 에러(not defined)</p>
<pre><code>
## 중첩함수
* 함수 안에 다시 함수를 선언할 수 있다. (안에서 선언된 함수는 해당 함수 안에서만 사용 가능)
```python
def calculator(n1, n2, operator):

    def divCal():
        if n2 == 0:
            print(&#39;0으로는 나눌 수 없습니다.&#39;)
        else:
            print(&#39;나눗셈 연산: {}&#39;.format(n1 / n2))

    if operator == 4:
        divCal()</code></pre><p>위와 같은 경우, divCal() 함수는 호출할 수 없다.</p>
<h2 id="lambda-함수">lambda 함수</h2>
<ul>
<li>lambda 매개변수: 반환값
위 형식으로 간단한 사용자함수를 정의할 수 있다. (사용법은 def로 만드는 것과 동일)</li>
</ul>
<pre><code class="language-python">getTriangleArea = lambda n1, n2: n1 * n2 / 2

width = 3
height = 4
triangle = getTriangleArea(width,height)

print(triangle)  # 6.0
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ZB] 파이썬 기초 3]]></title>
            <link>https://velog.io/@hugh_y/ZB-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B4%88-3</link>
            <guid>https://velog.io/@hugh_y/ZB-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B4%88-3</guid>
            <pubDate>Fri, 13 Oct 2023 15:37:17 GMT</pubDate>
            <description><![CDATA[<h1 id="제어문">제어문</h1>
<h2 id="조건문">조건문</h2>
<pre><code class="language-python">if 조건:
    실행문

elif 조건:
    실행문

else 조건:
    실행문</code></pre>
<ul>
<li>콜론(:)은 조건식이 끝나고, 실행문이 시작된다는 의미
실행문은 반드시 들여쓰기(코드블럭)를 해야 한다. (4칸/2칸 등 일관성 있게 띄어쓰기!)
들여쓰기를 통해 실행문을 구분한다.</li>
<li>실행문에 &#39;pass&#39;를 입력하면 그냥 넘어간다. (공백이면 에러)</li>
</ul>
<h3 id="조건식">조건식</h3>
<ul>
<li>문장 뒤에 if [조건]을 입력하면, 조건에 만족하는 경우 문장이 실행된다.
뒤에 else문도 사용 가능</li>
<li>조건식은 조건문으로 바꿀 수 있지만, 조건문은 조건식으로 변환하기 어려울 수 있다 (실행문이 여러 개인 경우 등)</li>
</ul>
<h2 id="반복문">반복문</h2>
<h3 id="횟수에-의한-반복문for">횟수에 의한 반복문(for)</h3>
<pre><code class="language-python">for i in range(a,b,c):
    실행문</code></pre>
<ul>
<li><p>조건문과 마찬가지로 콜론으로 제어문과 실행문을 구분한다.</p>
</li>
<li><p>range(a, b, c)일때</p>
</li>
<li><ul>
<li>a부터 b-1까지 c씩 증가하는 등차수열을 표현한다.</li>
</ul>
</li>
<li><ul>
<li>인자를 두 개만 넣는 경우 c는 자동으로 1로 계산된다.</li>
</ul>
</li>
<li><ul>
<li>인자는 한 개만 넣는 경우 a는 0, c는 1로 계산된다.</li>
</ul>
</li>
</ul>
<h3 id="조건에-의한-반복while">조건에 의한 반복(while)</h3>
<pre><code class="language-python">while 조건:
    수행문</code></pre>
<ul>
<li>조건이 참(True)일 때 수행문을 반복 수행한다.</li>
<li><em>무한 반복이 되지 않도록 조건의 인자를 수행문에서 컨트롤해줄 필요가 있다.*</em></li>
</ul>
<h3 id="반복문-제어">반복문 제어</h3>
<ul>
<li>continue: 다음 실행문을 실행하지 않고 반복문으로 돌아간다.</li>
<li>break: 반복분을 중단시킨다.</li>
<li>반복문 뒤에 else:문을 입력하면 반복문 종료 후 실행되는 수행문을 쓸 수 있다.
else문은 반복문이 &#39;종료&#39;된 후 수행되기 때문에 break로 인해 반복문이 종료되는 경우에는 else문이 실행되지 않는다.</li>
</ul>
<pre><code class="language-python">cnt = 0
for i in range(1, 100):
    if i % 7 != 0:
        continue
    print(&#39;{}는 7의 배수입니다.&#39;.format(i))
    cnt += 1

else:
    print(f&#39;1부터 99까지의 정수 중 7의 배수는 {cnt}개입니다.&#39;)
# 7의 배수 출력 후 99까지의 수 중 7의 배수 갯수 출력</code></pre>
<blockquote>
<ul>
<li>기타 유용한 함수들
len() : 문자열(리스트, 튜플)의 길이를 int로 반환한다.
isdigit() : 숫자 여부를 확인(숫자인 경우 True, 아닌 경우 False를 반환한다)
abs() : 절대값(양수 변환)
datetime 모듈을 사용하면 날짜와 시간을 사용할 수 있다.</li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ZB] 파이썬 기초 2]]></title>
            <link>https://velog.io/@hugh_y/ZB-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B4%88-2</link>
            <guid>https://velog.io/@hugh_y/ZB-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B4%88-2</guid>
            <pubDate>Tue, 10 Oct 2023 14:15:13 GMT</pubDate>
            <description><![CDATA[<h1 id="데이터의-입력출력">데이터의 입력/출력</h1>
<h2 id="데이터-입력">데이터 입력</h2>
<pre><code>input() 함수는 항상 str 자료형으로 입력됨
다른 값으로 입력을 받고 싶을 땐 형 변환(int, float 등) 사용</code></pre><h2 id="데이터-출력">데이터 출력</h2>
<pre><code>print() 함수에는 보이지 않지만, 자동 개행(\n)이 포함되어 있음
-&gt; 자동 개행을 막고 싶을 땐 뒤에 end=&#39;&#39;을 입력(마지막 자동개행을 공란으로 바꿈)
print()함수 안에서 콤마(,), +연산자(str의 경우)를 활용할 수 있다</code></pre><h3 id="특수문자">특수문자</h3>
<pre><code>\t : 탭
\n : 개행(줄바꿈)</code></pre><h3 id="포맷-문자열-출력-방식">포맷 문자열 출력 방식</h3>
<pre><code>1) print(f&#39;텍스트 {변수}&#39;)
2) print(&#39;텍스트 {인덱스}&#39;.format(변수)) - format() 안에 format() 함수를 넣어 형식을 지정할 수 있음
ex) 
3) print(&#39;텍스트 %s/%d/%f&#39; % 변수) - 타입을 정확하게 지정해야 함. %f의 경우 %.3f 이런 식으로 소수점 아래 자리수를 정할 수 있음(반올림)
-&gt; 소수점 이하 반올림은 %.f 으로 입력</code></pre><blockquote>
<p>추가정보</p>
</blockquote>
<ul>
<li>3) 방식은 % operator 방식으로, 파이썬 3.x 이전 버전의 방식이다. 공식 문서에 따르면 % operator를 지원은 하지만 권장하지 않는다고 나와있다고 하는데, 학습해두면 다른 언어를 배울 때 도움이 된다고 한다.</li>
<li>형식 지정자는 %c(문자 1개), %o(8진수), %x(16진수)도 있다.</li>
<li>2) 방식은 str.format 방식으로, 파이썬 3 이후부터 적용되는 방식이다. {:.3f} 이런 식으로 소숫점 아래 자릿수를 정할 수 있다(마찬가지로 반올림)</li>
<li>1) 방식은 f-string 방식으로, 파이썬 3.6 이상 버전만 지원한다. {변수:.4f} 이런 식으로 소숫점 아래 자릿수를 정할 수 있다(마찬가지로 반올림). 연산도 가능하다.</li>
<li>앞에 000을 붙여서 출력 앞자리수를 맞출 수 있다.</li>
</ul>
<h3 id="format-함수">format() 함수</h3>
<pre><code>num = 100000
formattedNum = format(num, &#39;,&#39;)
print(formattedNum)   # 100,000 (str)</code></pre><h1 id="연산자">연산자</h1>
<h2 id="산술-연산자--------">산술 연산자 [+, -, <em>, /, //, %, *</em>]</h2>
<table>
<thead>
<tr>
<th>+</th>
<th>-</th>
<th>*</th>
<th>/</th>
<th>//</th>
<th>%</th>
<th>**</th>
</tr>
</thead>
<tbody><tr>
<td>더하기</td>
<td>빼기</td>
<td>곱하기</td>
<td>나누기</td>
<td>몫</td>
<td>나머지</td>
<td>제곱</td>
</tr>
</tbody></table>
<pre><code>+, * 는 str에도 사용 가능하다.(+는 str끼리만, *는 문자열 * 숫자로)
/ 연산 결과는 float
//, % 연산 결과는 int</code></pre><h2 id="복합-연산자-----">복합 연산자 [+=, -=, /= ...]</h2>
<blockquote>
<p>할당(대입)연산자 [=]
오른쪽의 값을 왼쪽에 할당(대입), 수학에서의 = 기호와는 의미가 다르다.</p>
</blockquote>
<pre><code>산술연산자 뒤에 할당연산자를 붙임으로서 연산 후 변수에 연산된 값을 수정저장한다.</code></pre><h2 id="비교-연산자------">비교 연산자 [&gt;, &gt;=, &lt;, &lt;=, ==, !=]</h2>
<pre><code>비교연산자의 연산결과는 bool이다(True or False)</code></pre><br>

<blockquote>
<p>문자 비교시 아스키 코드값으로 비교
ord(&#39;chr&#39;)을 통해 글자(한글자만 가능)를 숫자로(10진수) 바꿀 수 있다.
chr(int)을 통해 글자를 숫자(10진수)로 바꿀 수 있다.</p>
</blockquote>
<ul>
<li>한글도 ord()함수를 통해 10진수로 바꿀 수 있다. 유니코드를 10진수로 바꾼 값이 나오는데, 표준이 아니라 오류가 발생할 수 있다고 한다.</li>
</ul>
<h3 id="논리-연산자-and-or-not">논리 연산자 [and, or, not]</h3>
<pre><code>and는 참과 참인 경우에만 참
or은 거짓과 거짓인 경우에만 참
not은 참과 거짓을 바꾼다.</code></pre><blockquote>
<p>and, or, not이 모두 있는 경우 not, and, or 순으로 판단한다고 한다. 하지만 헷갈리므로 의도에 맞게 괄호()로 정리하면서 쓰는 게 좋다.</p>
</blockquote>
<h1 id="모듈---이미-만들어진-훌륭한-기능">모듈 - 이미 만들어진 훌륭한 기능</h1>
<p>operator, math 등이 있고, import 모듈명을 통해 불러온다.
사용할 때는 모듈명.함수() 형식으로 쓴다.
기본 모듈은 파이썬이 설치된 폴더 내 Lib 디렉토리에 들어있다.
각 파이썬 파일을 열어보면 해당 모듈을 뜯어볼(?) 수도 있다.</p>
<blockquote>
<ul>
<li>오퍼레이터 모듈 파일
<img src="https://velog.velcdn.com/images/hugh_y/post/d6ae6f84-4c09-47f0-a6ea-2712cceba0a9/image.png" alt=""></li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ZB] 파이썬 기초 1]]></title>
            <link>https://velog.io/@hugh_y/ZB-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B4%88-1</link>
            <guid>https://velog.io/@hugh_y/ZB-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B4%88-1</guid>
            <pubDate>Fri, 06 Oct 2023 07:42:38 GMT</pubDate>
            <description><![CDATA[<h1 id="파이썬">파이썬</h1>
<h2 id="변수">변수</h2>
<blockquote>
<p>파이썬은 변수 선언 시 반드시 초기화가 필요하다.
데이터가 연산되는 과정에서 메모리에 저장되는데, 이 주소를 효율적으로 쓰기 위해 변수를 사용한다.
컴퓨터 입장에서는 그렇고, 사용자 입장에서는 변수를 사용하는 게 코드를 효율적으로 작성하는 데 도움이 된다.</p>
</blockquote>
<ul>
<li>추가로 알아보기 : PEP란?
변수명으로 name을 썼더니 전구 모양이 떴다. 코드 작동은 잘 되는데, 내용상 &#39;헷갈릴 수 있으니 다른 변수명을 사용하는 것을 추천한다&#39; 정도로 보인다.
PEP는 (Python Enhancement Proposals)의 약자로, 파이썬 언어 사용에 관한 가이드 같은 것들이 정리되어있다. 내용이 많고 영어라서 자세히 보진 못했지만, 계속 공부하다 보면 찾아볼 일이 많을 것 같다.
<a href="https://peps.python.org/pep-0000/">https://peps.python.org/pep-0000/</a></li>
</ul>
<h3 id="변수명-규칙">변수명 규칙</h3>
<p>1) &#39;어떤 자료를 담는지&#39; 알 수 있어야 한다.
(포장지에 아무것도 안 써있는 과자는 없다!)
2) 공백이 불가하므로 대문자로 단어를 구분하되, 첫 글자는 소문자로 한다
(가능은 하지만 class와 헷갈릴 수 있다. class는 나중에 배울 예정)
3) 숫자를 사용할 수 있지만, 첫 글자로는 사용할 수 없다
4) 한글도 쓸 수 있지만, 환경에 따라 에러가 발생할 확률이 높으므로 추천하지 않는다.(보안을 위한 목적으로 일부러 한글 변수를 쓰는 건 어떨까?)
5) print 등 예약어는 사용이 불가하다.
(keyword 모듈을 import해서 kwlist를 통해 확인되는 것은 35개이다.)</p>
<h2 id="자료형의-종류">자료형의 종류</h2>
<h3 id="문자열---str">문자(열) - str</h3>
<p>큰따옴표와 작은따옴표를 모두 사용할 수 있지만, 혼용할 수는 없다(작은 따옴표로 열면 작은 따옴표로 닫아야 함)</p>
<h4 id="변환">변환</h4>
<p>숫자로만 된 문자열인 경우 정수, 실수로 변환 가능
논리형으로 변환시, 문자의 &#39;존재여부&#39;에 따라 True, False로 변환
-&gt; True, False라는 문자열 변환시 True, 따옴표 안에 공백이 있어도 True</p>
<h4 id="연산">연산</h4>
<p>str 자료형도 연산이 가능하다(str + str / str * int)</p>
<h3 id="정수---int">정수 - int</h3>
<p>파이썬의 가장 큰 장점, 메모리 허용 범위 내에서 무한 연산 가능</p>
<h4 id="변환-1">변환</h4>
<p>0,1인 경우 논리형으로 변환이 가능하고, 실수(float)나 문자열(str)로 변환이 자유롭다
(실수로 변환시 한계가 생겨 데이터가 소실될 수 있다)</p>
<h3 id="실수---float">실수 - float</h3>
<p>소수점 약 17~18번째 자리에서부터 오류가 발생한다.</p>
<p>float형으로 표현할 수 있는 숫자의 개수 자체가 17~18개 정도인 것 같다. (소수점 위로 숫자가 있는 경우, 소수점 아래에 표현되는 숫자가 줄어드는 것을 확인했다)</p>
<h4 id="변환-2">변환</h4>
<p>정수와 마찬가지로 0, 1.0인 경우 논리형으로 변환 가능
정수로 변환 가능, 변환시 소숫점 아래는 내림(버림)
문자열로 변환 가능
문자열 &#39;1.0&#39;은 실수형으로는 변경 가능하지만, 정수형으로는 불가능(int(float(&#39;0.1&#39;)) 이런 식으로 가능)</p>
<h3 id="논리형---bool">논리형 - bool</h3>
<p>True, False 두 가지로 표현된다.</p>
<h4 id="변환-3">변환</h4>
<p>숫자로 변환시 1, 0으로 변환
문자로 변환시 True, False라는 문자열로 변환
((리스트, 튜플, 딕셔너리는 나중에 배울 예정!))</p>
<h4 id="연산-1">연산</h4>
<p>bool 자료형은 그대로 출력시 True, False로 나오지만, 연산시에는 1, 0으로 연산된다.
연산된 자료의 자료형은 int이다.</p>
<blockquote>
<p>기타 팁</p>
</blockquote>
<ul>
<li>파이썬에서 주석 처리는 #이고, 다행 주석처리는 &#39;&#39;&#39;(작은 따옴표/큰 따옴표 세개)로 열고 닫는다.</li>
<li>큰 따옴표 안에 작은 따옴표를 넣으면 작은 따옴표를 문자로 쓸 수 있다.
ex) print(&#39;그는 내게 &quot;사랑해&quot;라고 말했다&#39;)</li>
<li>ctrl + / 키로 한꺼번에 여러 문장을 주석처리할 수 있다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ZB] 데이터취업스쿨 20기 OT 후기]]></title>
            <link>https://velog.io/@hugh_y/ZB-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%B7%A8%EC%97%85%EC%8A%A4%EC%BF%A8-20%EA%B8%B0-OT-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@hugh_y/ZB-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%B7%A8%EC%97%85%EC%8A%A4%EC%BF%A8-20%EA%B8%B0-OT-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Thu, 05 Oct 2023 14:58:55 GMT</pubDate>
            <description><![CDATA[<p>생명공학 전공, 공군 장교 출신에 인사 관련 업무를 하고 있는 다소 중구난방의 이력이지만 데이터 분석, 시각화를 본격적으로 배우고자 푸트캠프를 신청하게 됐다.
하루하루 할 수 있는 것에 최선을 다하면, 노력은 나를 배신하지 않을 것이다. 오늘의 나는 내일의 나를 만든다!</p>
]]></description>
        </item>
    </channel>
</rss>