<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>auden_9.log</title>
        <link>https://velog.io/</link>
        <description>🙂</description>
        <lastBuildDate>Tue, 07 Mar 2023 04:04:20 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. auden_9.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/auden_9" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[MYSQL_001_기초]]></title>
            <link>https://velog.io/@auden_9/MYSQL001%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@auden_9/MYSQL001%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Tue, 07 Mar 2023 04:04:20 GMT</pubDate>
            <description><![CDATA[<p><a href="https://dev.mysql.com/downloads/mysql/">https://dev.mysql.com/downloads/mysql/</a></p>
<p>관계형 데이터베이스란? Realational Database
서로 간에 관계가 있는 데이터 테이블들을 모아둔 데이터 저장공간</p>
<blockquote>
<p>SQL이란? Structured Query Language
데이터베이스에서 <strong>데이터를 정의, 조작 제어하기 위해 사용하는 언어</strong></p>
</blockquote>
<blockquote>
</blockquote>
<p>데이터 정의 언어 (DDL : Data Definition Language)
→ CREATE, ALTER, DROP 등의 명령어</p>
<blockquote>
</blockquote>
<p>데이터 조작 언어 (DML : Data Manipulation Language) ★
→ INSERT, UPDATE, DELETE, SELECT 등의 명령어</p>
<blockquote>
</blockquote>
<p>데이터 제어 언어 (DCL: Data Control Language)
→ GRANT, REVOKE, COMMIT, ROLLBACK 등의 명렁어</p>
<hr>
<h2 id="mysql-접속">MYSQL 접속</h2>
<p>터미널 실행 mysql </p>
<p>현재 데이터 목록 확인</p>
<blockquote>
<p>데이터베이스 생성
<strong>create</strong> database dbname;
create하고 show 하면 만든거 확인 가능</p>
</blockquote>
<blockquote>
<p>데이터 베이스들 보여줘
<strong>show</strong> database;</p>
</blockquote>
<blockquote>
<p>해당 데이터 베이스로 이동(사용)
<strong>use</strong> dbname;</p>
</blockquote>
<blockquote>
<p>삭제 명령어
<strong>drop database</strong> dbname;</p>
</blockquote>
<hr>
<h2 id="user-관리">User 관리</h2>
<p>use mysql;</p>
<blockquote>
<p>유저 조회
<strong>SELECT</strong> host, user <strong>FROM</strong> user;</p>
</blockquote>
<blockquote>
<p>현재 PC에서만 접속 가능한 사용자를 비밀번호와 함께 생성
<strong>CREATE USER</strong> &#39;username&#39;@&#39;localhost&#39; <strong>identified BY</strong> &#39;password&#39;;</p>
</blockquote>
<p>ex) 현재 PC에서 접속가능한 사용자 (noma,1234)생성
create user &#39;noma&#39;@&#39;<strong>localhost&#39;</strong> identified by &#39;1234&#39;;</p>
<blockquote>
</blockquote>
<p>ex) 외부에서 접속 가능한 사용자 (noma,5678)생성
create user &#39;noma&#39;@<strong>&#39;%&#39;</strong> indentified by &#39;5678&#39;;</p>
<blockquote>
<p>유저 삭제
<strong>DROP</strong> USER &#39;username&#39;@&#39;localhost&#39;
DROP USER &#39;username&#39;@&#39;%&#39;</p>
</blockquote>
<hr>
<h2 id="user-권한-관리">user 권한 관리</h2>
<p>권한 관리 실습을 위해 database 생성
CREATE DATABASE testdb;</p>
<p>SHOW DATABASES;</p>
<blockquote>
<p><strong>유저만들기</strong>
use mysql; 이동 후★
<strong>CREATE USER</strong> &#39;noma&#39;@&#39;localhost&#39; <strong>IDENTIFIED BY</strong> &#39;1234&#39;;</p>
</blockquote>
<blockquote>
<p>사용자에게 특정 데이터베이스의 모든 권한을 부여
<strong>GRANTS ALL ON dbname.* to</strong> &#39;username&#39;@&#39;localhost&#39;;</p>
<p>현재 pc에서 접근 가능한 noma에게 testdb의 모든 권한을 부여
grants all on testdb.* to &#39;noma&#39;@&#39;localhost&#39;;</p>
</blockquote>
<blockquote>
<p>그 다음 사용자에게 부여된 모든 권한 목록을 확인</p>
</blockquote>
<p><strong>SHOW GRANTS FOR</strong> &#39;username&#39;@&#39;localhost&#39;;</p>
<blockquote>
</blockquote>
<p>ex) 노마 권한 확인
show grants for &#39;noma&#39;@&#39;localhost&#39;;</p>
<p>💡 내용이 적용 안될때 FLUSH PRIVILEGES;</p>
<blockquote>
<p>사용자에게 특정 데이터베이스의 모든 권한을 삭제</p>
</blockquote>
<p><strong>REVOKE ALL ON dbname.* FROM</strong> &#39;username&#39;@&#39;localhost&#39;;</p>
<hr>
<h2 id="table-사용">table 사용</h2>
<p>데이터베이스 먼저 생성
<strong>create database zerobase DEFAULT CHARACTER SET uft8mb4;</strong>
이 데이터베이스에서 기본으로 사용할 설정은 utf8mb4 다국어, 이모지 사용할 것이다.</p>
<p>show databases;</p>
<h3 id="테이블-생성">테이블 생성</h3>
<blockquote>
<p><strong>CREATE TABLE</strong> tablename
<strong>(</strong>
 columname datatype,
 columname datatype, 
 ...
<strong>);</strong></p>
</blockquote>
<p>테이블 생성 예제
id(int)와 name(varchar(16)) 칼럼을 가지는 mytable이라는 이름의 테이블 생성
create table mytable
(
id int, 
name varchar(16)
);</p>
<blockquote>
<p>테이블 목록보기
<strong>show</strong> tables;</p>
</blockquote>
<blockquote>
<p><strong>테이블 구조까지 확인하기</strong>
<strong>DESC</strong> tablename;</p>
</blockquote>
<h3 id="colunm-설정">colunm 설정</h3>
<blockquote>
<p>테이블 이름 변경
<strong>ALTER TABLE</strong> tablename <strong>RENAME</strong> new_tablename</p>
</blockquote>
<blockquote>
<p>컬럼추가
<strong>ALTER TABLE</strong> tablename <strong>ADD COLUMN</strong> columnname datatype;</p>
</blockquote>
<p>ex) person 테이블에 agee(double)컬럼 추가
alter table person add column agee double;</p>
<blockquote>
</blockquote>
<p>desc tablename;
으로 컬럼추가 확인</p>
<blockquote>
<p>컬럼 데이터타입 변경
<strong>AlTER TABLE</strong> tablename <strong>MODIFY COLUMN</strong> columnname datatype;</p>
</blockquote>
<blockquote>
<p>컬럼명 바꾸기 <strong>(데이터 타입도 같이 변경가능함)</strong>
<strong>ALTER TABLE</strong> tablename <strong>CHANGE COLUMN</strong> old_columnname new_columnname new_datatype;</p>
</blockquote>
<blockquote>
<p>컬럼삭제
<strong>ALTER table</strong> tablename** DROP COLUMN** columname;</p>
</blockquote>
<blockquote>
<p>테이블 삭제
DROP TABLE tablename;</p>
</blockquote>
<hr>
<p><strong>실습환경 만들기</strong></p>
<p>create database zerobase;</p>
<p>use zerobase;</p>
<p>create table person(
    id int,
    name varchar(16),
    age int,
    sex char
);</p>
<p>desc person;</p>
<h2 id="insert-데이터-추가">Insert 데이터 추가</h2>
<blockquote>
<p><strong>INSERT INTO</strong> tablename<strong>(column1, column2, ...)</strong>
<strong>VALUES (values1, values2, ... );</strong></p>
</blockquote>
<p>입력한 컬럼이름의 순서와 값의 순서가 일치하도록 주의!</p>
<blockquote>
<p>셀 입력 후 입력값 확인
select * from tablename;</p>
</blockquote>
<blockquote>
<p>모든 컬럼값을 추가하는 경우에는 <strong>다음과 같이 컬럼 이름을 지정하지 않아도 되지만,
입력하는 값의 순서가 테이블의 컬럼 순서와 일치하도록 주의★★</strong></p>
</blockquote>
<p>INSERT INTO tablename
VALUES(value1, value2, ...)</p>
<hr>
<h2 id="select-데이터-조회">select 데이터 조회</h2>
<blockquote>
<p><strong>SELECT</strong> column1, column2, ...
<strong>FROM</strong> tablename;</p>
</blockquote>
<p>ex) select name,age from person;</p>
<blockquote>
</blockquote>
<p><strong>SELECT *
FROM tablename;</strong></p>
<blockquote>
</blockquote>
<p>전부 다 조회~!</p>
<blockquote>
</blockquote>
<p><strong>WHERE 특정 조건에 것만 가져온다</strong>
<strong>SELECT</strong> column1, column2, ...
<strong>FROM</strong> tablename
<strong>WHERE</strong> condition;</p>
<blockquote>
</blockquote>
<p>예시
person 테이블에서 성별이 여자인 데이터 조회
select * from person where sex=&#39;F&#39;</p>
<hr>
<h2 id="updata-tablename">UPDATA tablename</h2>
<p>내용 업데이트, 수정</p>
<blockquote>
<p><strong>UPDATA</strong> tablename
<strong>SET</strong> colum1 = value1, column2 = value2, ...
<strong>WHERE</strong> codition;
한 번에 컬럼1=내용1, 컬럼2=내용2 이런식으로 바꾼다
조건에 맞는!</p>
</blockquote>
<p>예시)
update person set age=23 where name=&#39;이효리&#39;</p>
<h2 id="delete">DELETE</h2>
<blockquote>
<p>데이터 삭제
<strong>DELETE FROM</strong> tablename
<strong>WHERE</strong> codition;</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[EDA_인구분석]]></title>
            <link>https://velog.io/@auden_9/EDA%EC%9D%B8%EA%B5%AC%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@auden_9/EDA%EC%9D%B8%EA%B5%AC%EB%B6%84%EC%84%9D</guid>
            <pubDate>Sun, 05 Mar 2023 11:33:38 GMT</pubDate>
            <description><![CDATA[<h1 id="목표">목표</h1>
<blockquote>
<ol>
<li>인구 소멸 위기 지역 파악<ol start="2">
<li>인구 소멸 위기 지역의 지도 표현</li>
<li>지도 표현에 대한 카르토그램 표현</li>
</ol>
</li>
</ol>
</blockquote>
<h2 id="데이터-읽고-인구-소멸-지역-계산하기">데이터 읽고 인구 소멸 지역 계산하기</h2>
<p>선언 </p>
<pre><code class="language-python">import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import platform
from matplotlib import font_manager, rc
import warnings

warnings.filterwarnings(action=&quot;ignore&quot;)

%matplotlib inline

path = &quot;C://Windows/Fonts/malgun.ttf&quot;

if platform.system() == &quot;Darwin&quot;:
    rc(&quot;font&quot;,family=&quot;Arial Unicode MS&quot;)

elif platform.system() == &quot;Windows&quot;:
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc(&quot;font&quot;,family=font_name)

else:
    print(&quot;Unknown system. sorry&quot;)</code></pre>
<blockquote>
<h3 id="fillnamethod">fillna(method=&quot;&quot;)</h3>
<p>빈 값 채워주는 함수</p>
</blockquote>
<img src="https://velog.velcdn.com/images/auden_9/post/8751b4f9-01aa-41cf-b9c7-df44112f8289/image.png">
A열 - C열까지의 빈 값이 있다고 가정을 해보자
그럴때 fillna()함수로 
>
<img src= "https://velog.velcdn.com/images/auden_9/post/190c323a-91eb-4614-8e77-9e3e6ded5593/image.png">
>
이렇게 채워줄 수가 있따.
>
**method : 'backfill', 'bfill','pad','ffill', None
pad/ffill : 앞에 값으로 빈값 채움
backfill/bfill : 다음 값으로 빈값 채움**
>
>
```python
population = pd.read_excel("../../data/07.population/07_population_raw_data.xlsx", header=1)
population.fillna(method="pad", inplace=True)
population
```
[출력]
>
![](https://velog.velcdn.com/images/auden_9/post/2d44ee40-0561-4efc-8b22-427fe6e916a6/image.png)
>
header로 첫번째 날려서 읽고, fill_na로 빈 값은 빈 값전에 데이터로 채워준다.

<p><strong>컬럼 이름 변경</strong></p>
<pre><code class="language-python">population.rename(
    columns={
      &quot;행정구역(동읍면)별(1)&quot; : &quot;광역시도&quot;,
      &quot;행정구역(동읍면)별(2)&quot; : &quot;시도&quot;,
      &quot;계&quot; : &quot;인구수&quot;
    }, inplace=True
)
population.tail()</code></pre>
<p>변경 전
<img src="https://velog.velcdn.com/images/auden_9/post/edfe43e9-2746-4b10-b106-c9a7ab883804/image.png" alt=""></p>
<p>변경 후 
<img src="https://velog.velcdn.com/images/auden_9/post/8b119ebe-4600-4411-833f-4bca62974800/image.png" alt=""></p>
<p>** 필요없는 소계 데이터 삭제 **</p>
<pre><code>population = population[population[&quot;시도&quot;] != &quot;소계&quot;]
population</code></pre><p>항목 컬럼명 변경</p>
<pre><code>population.is_copy = False
population.rename(
    columns={&quot;항목&quot;:&quot;구분&quot;},
    inplace=True
)</code></pre><blockquote>
<p>** 데이터 내용 변경 **</p>
</blockquote>
<pre><code>population.loc[population[&quot;구분&quot;] == &quot;총인구수 (명)&quot;, &quot;구분&quot;]  = &quot;합계&quot;
population.loc[population[&quot;구분&quot;] == &quot;남자인구수 (명)&quot;, &quot;구분&quot;]  = &quot;남자&quot;
population.loc[population[&quot;구분&quot;] == &quot;여자인구수 (명)&quot;, &quot;구분&quot;]  = &quot;여자&quot;
population</code></pre><p>변경 전
<img src="https://velog.velcdn.com/images/auden_9/post/2dadb8b9-c547-431d-9c14-10f85b0306e2/image.png" alt=""></p>
<blockquote>
<p>변경 후
<img src="https://velog.velcdn.com/images/auden_9/post/04137e4d-2144-4a04-8e28-8eac77938b83/image.png" alt=""></p>
</blockquote>
<p><strong>* 소멸지역을 조사하기 위한 데이터 *</strong></p>
<pre><code>population[&quot;20~39세&quot;] = (
    population[&quot;20 - 24세&quot;] + population[&quot;25 - 29세&quot;] + population[&quot;30 - 34세&quot;] + population[&quot;35 - 39세&quot;]
)
population[&quot;65세이상&quot;] = (

    population[&quot;65 - 69세&quot;] +population[&quot;70 - 74세&quot;] + population[&quot;75 - 79세&quot;] +population[&quot;80 - 84세&quot;] + population[&quot;85 - 89세&quot;] + population[&quot;90 - 94세&quot;] +population[&quot;95 - 99세&quot;]+population[&quot;100+&quot;]
)
population</code></pre><p>인구분석을 위한 중요한 데이터인 20-39세와 65세이상 데이터를 합산해줌.</p>
<p><img src="https://velog.velcdn.com/images/auden_9/post/dbceed6a-4c5e-4caa-b6f5-0063222743e6/image.png" alt=""></p>
<p>데이터 맨 뒤에 합쳐져있다.</p>
<hr>
<h3 id="피봇테이블">피봇테이블</h3>
<blockquote>
<pre><code>pop = pd.pivot_table(
    data = population,
    index = [&quot;광역시도&quot;,&quot;시도&quot;],
    columns=[&quot;구분&quot;],
    values=[&quot;인구수&quot;,&quot;20~39세&quot;,&quot;65세이상&quot;]
)
pop</code></pre></blockquote>
<pre><code>
![](https://velog.velcdn.com/images/auden_9/post/69174859-98fd-4045-bbda-8981605df7cf/image.png)

### 필요한 데이터 추가

** 소멸 비율 계산 **</code></pre><p>pop[&quot;소멸비율&quot;] = pop[&quot;20~39세&quot;,&quot;여자&quot;]/ (pop[&quot;65세이상&quot;,&quot;합계&quot;]/2)</p>
<pre><code>** 소멸위기 지역 컬럼 생성 **</code></pre><p>pop[&quot;소멸위기지역&quot;] = pop[&quot;소멸비율&quot;] &lt; 1.0
pop</p>
<pre><code>
![](https://velog.velcdn.com/images/auden_9/post/b9eb3800-d204-4ddd-8558-cdc6a3cec01b/image.png)

소멸 위기 지역 조회</code></pre><p>pop[pop[&quot;소멸위기지역&quot;] == True].index.get_level_values(1)</p>
<pre><code>
&gt;** 인덱스 재정렬 **</code></pre><p>pop.reset_index(inplace=True)
pop.head()</p>
<pre><code>
&gt;### 2줄짜리 인덱스 한줄로 만들기
```python
tmp_columns = [
    pop.columns.get_level_values(0)[n] + pop.columns.get_level_values(1)[n]
    for n in range(0, len(pop.columns.get_level_values(0)))
]
pop.columns = tmp_columns</code></pre><blockquote>
</blockquote>
<p>적용 전 </p>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/auden_9/post/c4648e11-bdc3-4eaf-b43d-74ccbc0a203e/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>적용 후 
<img src="https://velog.velcdn.com/images/auden_9/post/65701cee-cc18-4132-9e8a-f2025bf0408d/image.png" alt=""></p>
<hr>
<h2 id="지도-시각화를-위한-지역별-id-만들기">지도 시각화를 위한 지역별 ID 만들기</h2>
<p>pop.info()
pop[&#39;시도&#39;].unique</p>
<p>ID 값으로 쓸만한 데이터 확인.</p>
<p>행정시와 구로 나누기 위해 데이터 만듦</p>
<blockquote>
<p>1)</p>
</blockquote>
<pre><code>si_name = [None] * len(pop) # 264 길이
si_name </code></pre><p>pop길이 만큼의 None값의 변수 만들어줌</p>
<blockquote>
</blockquote>
<p>2)</p>
<pre><code>tmp_gu_dict = {
    &quot;수원&quot;: [&quot;장안구&quot;, &quot;권선구&quot;, &quot;팔달구&quot;, &quot;영통구&quot;],
    &quot;성남&quot;: [&quot;수정구&quot;, &quot;중원구&quot;, &quot;분당구&quot;],
    &quot;안양&quot;: [&quot;만안구&quot;, &quot;동안구&quot;],
    &quot;안산&quot;: [&quot;상록구&quot;, &quot;단원구&quot;],
    &quot;고양&quot;: [&quot;덕양구&quot;, &quot;일산동구&quot;, &quot;일산서구&quot;],
    &quot;용인&quot;: [&quot;처인구&quot;, &quot;기흥구&quot;, &quot;수지구&quot;],
    &quot;청주&quot;: [&quot;상당구&quot;, &quot;서원구&quot;, &quot;흥덕구&quot;, &quot;청원구&quot;],
    &quot;천안&quot;: [&quot;동남구&quot;, &quot;서북구&quot;],
    &quot;전주&quot;: [&quot;완산구&quot;, &quot;덕진구&quot;],
    &quot;포항&quot;: [&quot;남구&quot;, &quot;북구&quot;],
    &quot;창원&quot;: [&quot;의창구&quot;, &quot;성산구&quot;, &quot;진해구&quot;, &quot;마산합포구&quot;, &quot;마산회원구&quot;],
    &quot;부천&quot;: [&quot;오정구&quot;, &quot;원미구&quot;, &quot;소사구&quot;],
}</code></pre><p>추가데이터는 수작업</p>
<blockquote>
</blockquote>
<p>3) </p>
<ul>
<li>만들고자 하는 ID의 형태<ul>
<li>서울 중구</li>
<li>서울 서초</li>
<li>통영</li>
<li>남양주</li>
<li>포항 북구</li>
<li>인천 남동</li>
<li>안양 만안</li>
<li>안양 동안</li>
<li>안산 단원
...<h4 id="1-일반-시-이름과-세종시-광역시도-일반-구-정리">(1) 일반 시 이름과 세종시, 광역시도 일반 구 정리</h4>
<blockquote>
</blockquote>
만들기 전 test<blockquote>
</blockquote>
<img src="https://velog.velcdn.com/images/auden_9/post/322aaed8-eeee-43fb-beaa-244130f6c52a/image.png">
>
<img src="https://velog.velcdn.com/images/auden_9/post/5443ec58-0c00-4ec0-ab81-69f155129a0c/image.png">
>
> ** 행정구 1차 나누기 작업 **
```
for idx, row in pop.iterrows():
if row["광역시도"][-3:] not in ["광역시","특별시","자치시"]:
    si_name[idx] = row["시도"][:-1]
>
elif row["광역시도"] == "세종특별자치시":
    si_name[idx] = "세종"
>
else:
    if len(row["시도"]) == 2:
        si_name[idx] = row["광역시도"][:2] + " "+ row["시도"]
    else:
        si_name[idx] = row["광역시도"][:2] + " " + row["시도"][:-1]
```
> ** 행정구 데이터 추가2 (수작업) **
```
for idx, row in pop.iterrows():
if row["광역시도"][-3:] not in ["광역시","특별시","자치시"]:
    for keys, values in tmp_gu_dict.items():
        if row["시도"] in values:
            if len(row["시도"]) == 2:
                si_name[idx] = keys + " " + row["시도"]
            elif row["시도"] in ["마산합포구" , "마산회원구"]:
                si_name[idx] = keys+" "+ row["시도"][2:-1] 
>
            else:
                si_name[idx] = keys + " " + row["시도"][:-1]
>```
>
> ** 행정구 데이터 추가3 (고성) **
>
```
for idx, row in pop.iterrows():
if row["광역시도"][-3:] not in ["광역시","특별시","자치시"]:
    if row["시도"][:-1] == "고성" and row["광역시도"] == "강원도":
        si_name[idx] = "고성(강원)"
    elif row["시도"][:-1] == "고성" and row["광역시도"] == "경상남도":
        si_name[idx] = "고성(경남)"
```
본 데이터의 추가
```
pop["ID"] = si_name
pop
```
![](https://velog.velcdn.com/images/auden_9/post/7f32fc25-56a5-485b-bd38-93ee4f10557f/image.png)
></li>
</ul>
</li>
<li><ul>
<li>필요없는 데이터 열 제거 **<pre><code>del pop[&quot;20~39세남자&quot;]
del pop[&quot;65세이상남자&quot;]
del pop[&quot;65세이상여자&quot;]
pop.head()</code></pre><img src="https://velog.velcdn.com/images/auden_9/post/9ff9628f-01e2-4e7d-baa5-db7d9d56f4a7/image.png" alt=""></li>
</ul>
</li>
</ul>
<hr>
<h2 id="4-지도-그리기-카르토그램">4. 지도 그리기 (카르토그램)</h2>
<p>민형기 담임교수님이 한땀 한땀 만든 엑셀파일 불러오기</p>
<pre><code>draw_korea_raw = pd.read_excel(&quot;../../data/07.population/07_draw_korea_raw.xlsx&quot;)
draw_korea_raw</code></pre><blockquote>
<p>** .stack()**
위에 컬럼을 인덱스로 보내주기</p>
</blockquote>
<pre><code>draw_korea_raw_stacked = pd.DataFrame(draw_korea_raw.stack())
draw_korea_raw_stacked</code></pre><p>.stack() 적용 전</p>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/auden_9/post/b805ff4f-a380-486b-b392-4a557b29a94d/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>.stack() 적용 후</p>
<blockquote>
</blockquote>
<img src="https://velog.velcdn.com/images/auden_9/post/f98c581f-75e7-4512-9e09-5c0e98fe7ee0/image.png">
> 지도의 X,Y축을 .stack()을 이용해 인덱스로 정렬해 옆으로 보냄
>
** ↔ 반대의 개념으로 .unstack()은 인덱스를 컬럼으로 보낼때 쓰임! **

<pre><code>draw_korea_raw_stacked.reset_index(inplace=True)
draw_korea_raw_stacked</code></pre><p>리셋 인덱스로 다시 열을 재정렬해줌</p>
<pre><code>draw_korea_raw_stacked.rename(
    columns={
    &quot;level_0&quot; : &quot;y&quot;,
    &quot;level_1&quot; : &quot;x&quot;,
    0 : &quot;ID&quot;

    },
    inplace=True

)
draw_korea_raw_stacked</code></pre><p>컬럼명 이름 바꾸기</p>
<img src="https://velog.velcdn.com/images/auden_9/post/9c838b0a-f88e-4a15-a2e8-2f74f780b8fe/image.png">

<p>draw_korea = draw_korea_raw_stacked</p>
<hr>
<h2 id="지도-윤곽선-그리기">지도 윤곽선 그리기</h2>
<img src="https://velog.velcdn.com/images/auden_9/post/e8047d81-1c6e-4f92-877c-f15b47d5446d/image.png">


<pre><code>def plot_text_simple(draw_korea):
    for idx, row in draw_korea.iterrows():

         if len(row[&quot;ID&quot;].split()) == 2:
            dispname= &quot;{}\n{}&quot;.format(row[&quot;ID&quot;].split()[0], row[&quot;ID&quot;].split()[1])
         elif row[&quot;ID&quot;][:2] == &quot;고성&quot;:
            dispname = &quot;고성&quot;
         else:
            dispname = row[&quot;ID&quot;]


         if len(dispname.splitlines()[-1]) &gt;= 3:
            fontsize,linespacing = 7.5,0.9
         else:
            fontsize, linespacing = 8, 0.7

         plt.annotate(
            dispname, 
            (row[&quot;x&quot;]+0.5, row[&quot;y&quot;]+0.5),
            weight = &quot;bold&quot;,
            fontsize = fontsize,
            linespacing = linespacing,
            ha=&quot;center&quot;, # 수평정렬
            va=&quot;center&quot;, # 수직정렬
         )

def simpleDraw(draw_korea):
    plt.figure(figsize=(8,11))

    plot_text_simple(draw_korea)
    for path in BORDER_LINES:
        ys, xs = zip(*path)
        plt.plot(xs,ys, c=&quot;black&quot;, lw=1.5)
    plt.gca().invert_yaxis()  # 지도방향 바꾸기 (상하)
    plt.axis(&quot;off&quot;)
    plt.tight_layout()
    plt.show()</code></pre><p>이 두 함수로 윤곽선과 글자 배치조정</p>
<p><img src="https://velog.velcdn.com/images/auden_9/post/11cbc3d1-7b71-4f48-b78a-9478100163e4/image.png" alt=""></p>
<hr>
<h4 id="그림을-그리기-위한-데이터를-계산하는-함수">그림을 그리기 위한 데이터를 계산하는 함수</h4>
<ul>
<li>색상을 만들 때 최소값을 흰색</li>
<li>blockedMap : 인구현황</li>
<li>targetData : 그리고 싶은 컬럼</li>
</ul>
<blockquote>
</blockquote>
<pre><code>def get_data_info (targetData, blockedMap):
    whitelabelmin = (
        max(blockedMap[targetData]) - min(blockedMap[targetData])
    ) * 0.25 + min(blockedMap[targetData])
    vmin = min(blockedMap[targetData])
    vmax = max(blockedMap[targetData])
&gt;
    mapdata = blockedMap.pivot(index=&quot;y&quot;,columns=&quot;x&quot;,values=targetData)
    return mapdata, vmax, vmin, whitelabelmin

&gt;</code></pre><p>def get_data_info_for_zero_center(targetData,blockedMap):
    whitelabelmin = 5
    tmp_max = max(
        np.abs(min(blockedMap[targetData])),np.abs(max(blockedMap[targetData]))
    )
    vmin,vmax = -tmp_max, tmp_max
    mapdata = blockedMap.pivot(index=&quot;y&quot;,columns=&quot;x&quot;,values=targetData)
    return mapdata, vmax, vmin, whitelabelmin</p>
<blockquote>
</blockquote>
<pre><code>def plot_text_simple(targetData, blockedMap, Whitelablemin):
&gt;    for idx, row in blockedMap.iterrows():
&gt;        
         if len(row[&quot;ID&quot;].split()) == 2:
            dispname= &quot;{}\n{}&quot;.format(row[&quot;ID&quot;].split()[0], row[&quot;ID&quot;].split()[1])
         elif row[&quot;ID&quot;][:2] == &quot;고성&quot;:
            dispname = &quot;고성&quot;
         else:
            dispname = row[&quot;ID&quot;]
&gt;           
&gt;      
         if len(dispname.splitlines()[-1]) &gt;= 3:
            fontsize,linespacing = 7.5,0.9
         else:
            fontsize, linespacing = 8, 0.7
&gt;         
         annocolor = &quot;white&quot; if np.abs(row[targetData]) &gt; Whitelablemin else &quot;black&quot;
         plt.annotate(
            dispname, 
            (row[&quot;x&quot;]+0.5, row[&quot;y&quot;]+0.5),
            weight = &quot;bold&quot;,
            color = annocolor,
            fontsize = fontsize,
            linespacing = linespacing,
            ha=&quot;center&quot;, # 수평정렬
            va=&quot;center&quot;, # 수직정렬
         )

&gt;
&gt;</code></pre><p>def drawKorea(targetData, blockedMap, cmapname, zeroCenter=False):
    if zeroCenter:
        masked_mapdata,vmax,vmin,whitelabelmin = get_data_info_for_zero_center(targetData,blockedMap)</p>
<blockquote>
</blockquote>
<pre><code>if not zeroCenter:
    masked_mapdata, vmax,vmin,whitelabelmin = get_data_info(targetData,blockedMap)</code></pre><blockquote>
</blockquote>
<pre><code>plt.figure(figsize=(8,11))
plt.pcolor(masked_mapdata, vmin=vmin, vmax=vmax, cmap = cmapname, edgecolor=&quot;#aaaaaa&quot;, linewidth=0.5)
plot_text_simple(targetData,blockedMap,whitelabelmin)</code></pre><blockquote>
</blockquote>
<pre><code>for path in BORDER_LINES:
    ys, xs = zip(*path)
    plt.plot(xs,ys, c=&quot;black&quot;, lw=1.5)
plt.gca().invert_yaxis()  # 지도방향 바꾸기 (상하)
plt.axis(&quot;off&quot;)
plt.tight_layout()
cb = plt.colorbar(shrink= 0.1 , aspect=10)
cb.set_label(targetData)
plt.show()</code></pre><img src="https://velog.velcdn.com/images/auden_9/post/dd7c54b6-7d65-418e-8c98-3427529c9628/image.png" width="80%">
]]></description>
        </item>
        <item>
            <title><![CDATA[EDA_주가분석]]></title>
            <link>https://velog.io/@auden_9/EDA%EC%A3%BC%EA%B0%80%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@auden_9/EDA%EC%A3%BC%EA%B0%80%EB%B6%84%EC%84%9D</guid>
            <pubDate>Thu, 02 Mar 2023 11:21:39 GMT</pubDate>
            <description><![CDATA[<p>beautiful soup으로 해결할 수 없는 것</p>
<ul>
<li>접근할 웹주소를 알 수 없을때</li>
<li>자바스크립트를 사용하는 웹 페이지 경우</li>
<li>웹브라우저로 접근하지 않으면 안될 때</li>
</ul>
<blockquote>
<h1 id="selenium">Selenium</h1>
</blockquote>
<p>웹브라우저를 원격 조작하는 도구
자동으로 URL을 열고 클릭 등이 가능
스크롤, 문자의 입력, 화면 캡처 등등 </p>
<h2 id="설치하기">설치하기</h2>
<p>conda install selenium</p>
<p>크롬 버전을 확인해야함</p>
<p>크롬드라이버 검색 후 최상단 페이지에서
버전 맨 앞자리 3개 같은 걸 눌러 다운로드 받고
작업환경에 크롬드라이버 옮긴다.
(ds_study/driver폴더)</p>
<blockquote>
<p>from selenium import webdriver</p>
</blockquote>
<p><strong>driver = webdriver.Chrome(&quot;크롬드라이버 저장경로&quot;)
driver.get(&quot;링크주소&quot;)</strong></p>
<blockquote>
<p>링크주소는 꼭 http:// 넣어주기
새창이 뜨면 성공</p>
</blockquote>
<p>💡 작업이 끝나면 꼭
driver.quit()
으로 창을 닫아줘야한다.</p>
<hr>
<blockquote>
<p>✍</p>
</blockquote>
<ul>
<li>화면 최대 크기 설정
driver.maximize_window()<blockquote>
</blockquote>
</li>
<li>화면 최소 크기 설정
driver.minimize_window()<blockquote>
</blockquote>
</li>
<li>화면 크기 설정
driver.set_window_size(600,600)<blockquote>
</blockquote>
💡 데이터 가져올 때 화면에 보이는 기준으로 가져오기때문에 
화면이 최대한 큰 게 좋을 수 있다. (정보가 많이 보이기 때문에)<blockquote>
</blockquote>
</li>
<li>새로고침
driver.refresh()<blockquote>
</blockquote>
</li>
<li>뒤로가기
driver.back()<blockquote>
</blockquote>
</li>
<li>앞으로가기
driver.forward()<blockquote>
</blockquote>
</li>
<li>새 탭 생성하기
driver.execute_script(&#39;window.open(&quot;<a href="http://naver.com&quot;)&#39;">http://naver.com&quot;)&#39;</a>)</li>
<li><em>execute_script(&#39;&#39;) 자바스크립트를 쓰겠단 이야기.
window.open(&quot;열고 싶은 주소&quot;)*</em><blockquote>
</blockquote>
</li>
<li>탭 이동
driver.switch_to.window(driver.window_handles[0])
화면창은 0번부터<blockquote>
</blockquote>
</li>
<li>현재 탭 닫기
driver.close()<blockquote>
</blockquote>
💡 방금 막 닫으면, 탭 지정을 새로 해줘야함. 
한번 닫으면 탭 이동 되기 전까지 더 안닫음.<blockquote>
</blockquote>
</li>
<li>전체창 닫기
driver.quit()<blockquote>
</blockquote>
</li>
<li>스크롤 가능한 높이(길이)
driver.execute_script(&#39;return document.body.scrollHeight&#39;)
자바스크립트 이용<blockquote>
</blockquote>
</li>
<li>화면 스크롤 하단 이동
driver.execute_script(&#39;window.scrollTo(0,document.body.scrollHeight);&#39;)
스크롤을 최하단까지 내려달라.<blockquote>
</blockquote>
</li>
<li>화면 스크롤 상단이동
driver.execute_script(&#39;window.scrollTo(0,0)&#39;)<blockquote>
</blockquote>
</li>
<li>window.scrollTo(x축,y축)
좌표값으로 이동<blockquote>
</blockquote>
</li>
<li>현재 보이는 화면 스크린샷 저장</li>
<li>driver.save_screenshot(&#39;./last_height.png&#39;)<blockquote>
</blockquote>
</li>
</ul>
<blockquote>
</blockquote>
<ul>
<li>💡** ActionChains 클래스**
마우스로 할 수 있는 대부분에 동작들
mouse hover, drag and drop, scoll 등을 해줌<pre><code>from selenium.webdriver import ActionChains
&gt;
some_tag = driver.find_element(By.CSS_SELECTOR, &#39;copy selector&#39;)
action = ActionChains(driver)
action.move_to_element(some_tag).perform()</code></pre>ActionChains 모듈을 호출하고
이동할 요소를 잡아 변수에 담고
ActionChains(driver) 현재 내 드라이버를 지정해 ActionChains에 담고<blockquote>
</blockquote>
.move_to_element()
내가 지정한 곳으로 이동하겠다.<blockquote>
</blockquote>
.perform()
실행<blockquote>
</blockquote>
&lt;&lt;&lt;  ActionChains 예제 &gt;&gt;&gt;<blockquote>
</blockquote>
동작페이지의 버튼 누를 때! ActionChains를 이용<blockquote>
</blockquote>
from selenium.webdriver import ActionChains<blockquote>
</blockquote>
search_tag = driver.find_element(By.CSS_SELECTOR,&#39;.search&#39;)
action = <strong>ActionChains(driver)</strong>
action.click(search_tag)</li>
<li><em>action.perform()*</em></li>
</ul>
<hr>
<h2 id="요소찾기">요소찾기</h2>
<blockquote>
<p><strong>from selenium.webdriver.common.by import By</strong></p>
</blockquote>
<p><strong>first_content = driver.find_element(By.CSS_SELECTOR, &#39;요소&#39;)</strong>
first_content.click()</p>
<blockquote>
</blockquote>
<p>💡 찾는 요소는 개발자도구를 통해 태그 찾고, 오른쪽 마우스로 copy - copy selector </p>
<blockquote>
</blockquote>
<p>keyword = driver.find_element(By.CSS_SELECTOR,&#39;copy selector&#39;)
<strong>keyword.send_keys(&#39;검색어&#39;)</strong>
검색하고, 검색어 입력</p>
<blockquote>
<p>keyword.clear()
입력값 지우기</p>
</blockquote>
<hr>
<p>[주가분석 ] _ 추가내용</p>
<blockquote>
<p>열었는데 팝업창 떴을때 </p>
</blockquote>
<p>팝업창 화면 전환 후 닫아주기
driver.switch_to_window(driver.window.handles[-1])
driver.close()</p>
<blockquote>
<p>** time.sleep() **
원하는 주소 목표페이지로 바로 안가고 메인으로 갈때
import time
파일열고
time.sleep()으로 인터벌을 주고 열기실행하면 목표페이지로 간다.</p>
<pre><code>import time
</code></pre></blockquote>
<p>url = &quot;<a href="https://www.opinet.co.kr/searRgSelect.do&quot;">https://www.opinet.co.kr/searRgSelect.do&quot;</a>
driver = webdriver.Chrome(&quot;../driver/chromedriver.exe&quot;) 
driver.get(url)</p>
<blockquote>
</blockquote>
<p>time.sleep(3)</p>
<blockquote>
</blockquote>
<p>driver.get(url)</p>
<blockquote>
</blockquote>
<p>sido_list[1].get_attribute(&quot;value&quot;)</p>
<blockquote>
</blockquote>
<p>get_attiribute(&#39;&#39;)
속성값 가져오기</p>
<blockquote>
</blockquote>
<p>** glob(&quot;가져올 파일&quot;)  **
파일목록 한번에 가져오기
from glob import glob</p>
<blockquote>
</blockquote>
<p>glob(&quot;../data/04.self_oil/지역_*.xls&quot;)</p>
<blockquote>
</blockquote>
<p>지역_ 로 끝나는 전부
*를 붙여주면 모두</p>
<blockquote>
<p><strong>pd.concat(합칠데이터)</strong>
형식이 동일하고 연달아 붙이기만 하면 될 때 에는 concat으로 데이터 병합가능.</p>
</blockquote>
<blockquote>
<p>가격정보가 - 이 되어있어 타입변환</p>
</blockquote>
<p>stations = stations[stations[&quot;가격&quot;]!=&quot;-&quot;]
-로 되지 않은 데이터만 담아서 
stations[&quot;가격&quot;] = stations[&quot;가격&quot;].astype(&quot;float&quot;)
변환!</p>
<blockquote>
<p><strong>matplotlib 한글설정</strong></p>
</blockquote>
<pre><code>import platform
from matplotlib import font_manager, rc
&gt;
%maplotlib inline
&gt;
path = &quot;C://Windows/Fonts/malgun.ttf&quot;
&gt;
if platform.system() == &quot;Darwin&quot;:
    rc(&quot;font&quot;,family=&quot;Arial Unicode MS&quot;)
&gt;
elif platform.system() == &quot;windows&quot;:
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc(&quot;font&quot;,family=font_name)
&gt;
else:
    print(&quot;Unknown system. sorry&quot;)




</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[EDA_ 웹데이터]]></title>
            <link>https://velog.io/@auden_9/EDA-%EC%9B%B9%EB%8D%B0%EC%9D%B4%ED%84%B0</link>
            <guid>https://velog.io/@auden_9/EDA-%EC%9B%B9%EB%8D%B0%EC%9D%B4%ED%84%B0</guid>
            <pubDate>Thu, 02 Mar 2023 08:20:19 GMT</pubDate>
            <description><![CDATA[<h1 id="beautifulsoup">BeautifulSoup</h1>
<blockquote>
</blockquote>
<p><strong>선언</strong>
import 
from bs4 import BeautifulSoup</p>
<blockquote>
<p>page = open(&quot;../../data/03.web_data/03.testfile.html&quot;,&quot;r&quot;).read()
page</p>
</blockquote>
<h3 id="html-문서-열기">html 문서 열기</h3>
<p>read()로 읽어오면 문자를 막 뿌려줌.</p>
<p>html 방식 그대로 보려면 </p>
<p>1) print()</p>
<p>2)
soup = BeautifulSoup(page, &quot;html.parser&quot;)
print(soup.prettify())</p>
<p>오픈 파일 상태 확인</p>
<p>변수로 많이 쓰는 page, response,res </p>
<p>response = urlopen(url)
<strong>response.status</strong></p>
<blockquote>
<p>파일 오픈 시 문제가 생기면 response.status를 통해
HTML 상태코드 검색하면 위키백과에 어떤 오류인지 확인 가능함.</p>
</blockquote>
<blockquote>
<p><strong>request 모듈 이용시</strong>
!pip install requests</p>
</blockquote>
<p>import requests
from urllib.requests.Request
from bs4 import BeautifulSoup</p>
<blockquote>
</blockquote>
<p>url = &quot;주소&quot;
response = requests.get(url,headers=headers)
soup = BeautifulSoup(response.text,&quot;html.parser&quot;)
response</p>
<blockquote>
<p>🚫<strong>파일소환 시 403에러 대책</strong></p>
</blockquote>
<p>접속 방법
1)
req = Request(url<strong>, headers={&quot;User-Agent&quot;:&quot;Chrome&quot;}</strong>)
response = urlopen(req)
response.status</p>
<blockquote>
</blockquote>
<p>2)</p>
<blockquote>
</blockquote>
<p><strong>pip install fake-useragent</strong> 설치 후 </p>
<blockquote>
</blockquote>
<p>from fake_useragent import UserAgent</p>
<blockquote>
</blockquote>
<p>ua = UserAgent()
ua.ie
req = Request(url, headers={&quot;User-Agent&quot;:ua.ie})
response= urlopen(req)
response.status
로 우회접속도 가능</p>
<blockquote>
<p><strong>주소지가 영어일때
인코딩 하는 법</strong></p>
</blockquote>
<p>import urllib
from urllib.request import urlopen, Request</p>
<blockquote>
</blockquote>
<p>html = &quot;<a href="https://ko.wikipedia.org/wiki/%7Bsearch_words%7D&quot;">https://ko.wikipedia.org/wiki/{search_words}&quot;</a></p>
<blockquote>
</blockquote>
<p>req = Request(html.format(search_words=urllib.parse.quote(&quot;여명의_눈동자&quot;))) 
response=urlopen(req)
response.status</p>
<blockquote>
</blockquote>
<p><strong>urllib.parse.quote()</strong>
글자를 url로 인코딩하는 매서드</p>
<blockquote>
</blockquote>
<p><strong>상대주소 절대주소로 만들기</strong>
from urllib.parse import urljoin</p>
<blockquote>
</blockquote>
<p><strong>urljoin(url_base,상대주소)</strong></p>
<blockquote>
</blockquote>
<p>기본주소+상대주소로 반환해줌
기본주소가 있을 시 무시하고 정상 구동시켜줌</p>
<hr>
<h2 id="데이터-읽어오기"><strong>데이터 읽어오기</strong></h2>
<blockquote>
<h4 id="코드명">.코드명</h4>
<p>e.g&gt; soup.head
가장 상위에 있는 head 코드가 나온다</p>
</blockquote>
<blockquote>
<h4 id="find코드">.find(&quot;코드&quot;)</h4>
<p>위에랑 실행결과가 같음</p>
</blockquote>
<blockquote>
<h4 id="find_all코드">.find_all(&quot;코드&quot;)</h4>
<p>안에 있는 모든 해당 코드를 가져온다</p>
</blockquote>
<blockquote>
<p><strong>조건 좁히기</strong>
.find(&quot;태그&quot;, class_=&quot;클래스명&quot;)
.find(&quot;태그&quot;,&quot;클래스명&quot;)
.find(&quot;태그&quot;,{&quot;class&quot;:&quot;클래스명&quot;})</p>
</blockquote>
<p>id 찾기
.find(&quot;태그&quot;,id=&quot;아이디&quot;)
.find(&quot;태그&quot;, {&quot;id&quot;:&quot;아이디&quot;})</p>
<blockquote>
<p><strong>텍스트만 가져오고 싶을때.</strong>
좁혀 놓은 구간에서 .text.strip() 붙인다.</p>
</blockquote>
<p>.text 텍스트 추출
.strip() 불필요한 문자 제거</p>
<blockquote>
</blockquote>
<p>e.g&gt; soup.find(&quot;p&quot;,{&quot;id&quot;:&quot;second&quot;}).text.strip()</p>
<blockquote>
</blockquote>
<ul>
<li>다중조건
.find(&quot;p&quot;,{&quot;class&quot;:&quot;inner-text first-item&quot;,&quot;id&quot;:&quot;first&quot;})</li>
</ul>
<blockquote>
<p><strong>a 태그에서 href 속성값에 있는 값 추출</strong></p>
</blockquote>
<p>1&gt; links[0].get(&quot;href&quot;)
2&gt; links[1][&quot;href&quot;]</p>
<p><strong>💡 조건에 맞춰 여러개를 읽어온 후에는 꼭!!
len()으로 감싸 정상적으로 다 읽어왔는지 확인한다!</strong></p>
<p>*<em>💡 웹 크롤링시 이상 작동이라고 판단되어 차단 될 수 있으니
time.sleep(0.5) 넣어주기
*</em></p>
<pre><code class="language-python">import time
from tqdm import tqdm

movie_data = []
movie_name = []
movie_point = []

for today in tqdm(date):
    url = &quot;주소.date={date}&quot;
    response = urlopen(url.format(date=today.strftime(&quot;%Y%m%d&quot;)))
    soup = BeautifulSoup(response,&quot;html.parser&quot;)

    end = len(soup.find_all(&quot;td&quot;,&quot;point&quot;))
    movie_data.extend([today for _ in range(0,end)])
    movie_name.extend(soup.select(&quot;div.tit5&quot;)[n].a.text for n in range(0,end))
    movie_point.extend(soup.find_all(&quot;td&quot;,&quot;point&quot;)[n].string for n in range(0, end))

    time.sleep(0.5)</code></pre>
<hr>
<blockquote>
<p>li 태그가 클래스없이 막 섞여 있을 때 위치를 찾기 위해
for문으로 순번 찾기</p>
</blockquote>
<p>n = 0
for each in soup.find_all(&quot;ul&quot;):
    print(&quot;=&gt;&quot;+str(n)+&quot;=================&quot;)
    print(each.text)
    n += 1</p>
<blockquote>
</blockquote>
<p>가게이름 출력 후 다른 문자열이 섞여 있을 시
**
import re 모듈을 열어
re.split(&quot;나눌문자기준&quot;,문자열)**</p>
<blockquote>
<p>e.g&gt;
import re
tmp_string = tmp_one.find(class_=&quot;sammyListing&quot;).get_text()
<strong>re.split((&quot;\n|\r\n&quot;),tmp_string)</strong></p>
</blockquote>
<p>출력
[&#39;BLT&#39;, &#39;Old Oak Tap&#39;, &#39;Read more &#39;]</p>
<blockquote>
</blockquote>
<p><strong>날짜 가져오기</strong>
date = <strong>pd.date_range(&quot;2021.01.01&quot;, periods=100, freq=&quot;D&quot;)</strong>
21년 1월 1일 기준으로 100일치를 가져옴</p>
<blockquote>
</blockquote>
<p><strong>날짜 표현 형식 지정</strong>
<strong>.strftime(&quot;%Y-%m-%d&quot;)</strong></p>
<blockquote>
</blockquote>
<p>&#39;2021-01-01&#39;</p>
<blockquote>
<p><strong>matplotlib의 한글설정</strong></p>
</blockquote>
<pre><code class="language-python">from matplotlib import font_manager, rc
&gt;
path = &quot;C:/Windows/Fonts/malgun.ttf&quot;
&gt;
if platform.system() == &quot;Darwin&quot;:
    rc(&quot;font&quot;, family=&quot;Arial Unicode MS&quot;)
&gt;    
elif platform.system() == &quot;Windows&quot;:
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc(&quot;font&quot;,family=font_name)
&gt;    
else:
    print(&quot;Unknown sysyem.sorry&quot;)</code></pre>
<h1 id="💬코멘트">💬코멘트</h1>
<p>배운 수업 중 가장 재밌고 쉽게 따라갈 수 있는 수업이였던 편
BeautifulSoup으로 웹 크롤링하고 원하는 데이터를 추출, 그걸 다시 피봇테이블로 만들어 시각화까지 하니 너무 재미있었다. 이런 실습이 계속 되었으면 하는데, 다음주 테스트 생각하니 걱정이 앞선다.......😂</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[EDA_범죄_002]]></title>
            <link>https://velog.io/@auden_9/EDA%EB%B2%94%EC%A3%84002</link>
            <guid>https://velog.io/@auden_9/EDA%EB%B2%94%EC%A3%84002</guid>
            <pubDate>Wed, 01 Mar 2023 10:55:17 GMT</pubDate>
            <description><![CDATA[<h1 id="seaborn">seaborn</h1>
<blockquote>
<p><strong>.set_style(&quot;darkgrid&quot;)</strong>
옵션 : white, whitegrid, dark, darkgrid, ticks(pairplot에서만 쓰임★)</p>
</blockquote>
<blockquote>
<p><strong>.boxplot(x축, y축,data)</strong></p>
</blockquote>
<p>&lt; boxplot의 옵션 &gt;
hue = &quot;카테고리로 나뉠 수 있는 컬럼&quot;
palette = &quot;Set3&quot;
Set1~3 들어갈 수 있는 컬러명</p>
<blockquote>
<blockquote>
<p>e.g&gt;</p>
</blockquote>
</blockquote>
<pre><code class="language-plt.figure(figsize=(10,6))">sns.boxplot(x=&quot;day&quot;, y=&quot;total_bill&quot;,data=tips, hue=&quot;smoker&quot;,palette=&quot;Set3&quot;)
plt.show()```
(캡쳐)

&gt;
**.swarmplot(x축, y축,data)**
&gt;
swarmplot 옵션
color = &quot;0.5&quot;
0~1로 흑백진하기 정할 수 있음.
&gt;
&gt;
&gt;&gt;e.g&gt;
```plt.figure(figsize=(8,6))
sns.swarmplot(x=&quot;day&quot;,y=&quot;total_bill&quot;,data=tips, color=&quot;0.5&quot;)
plt.show()</code></pre>
<p>(캡쳐)</p>
<h4 id="boxplot-with-swarmplot">boxplot with swarmplot</h4>
<pre><code>plt.figure(figsize=(8,6))
sns.boxplot(x=&quot;day&quot;,y=&quot;total_bill&quot;,data=tips)
sns.swarmplot(x=&quot;day&quot;,y=&quot;total_bill&quot;,data=tips, color=&quot;0.25&quot;)
plt.show()</code></pre><p>이렇게 같이 쓰기도한다 (캡쳐)</p>
<blockquote>
<p><strong>.lmplot(x축, y축,data) : total_bill과 tip 사이 관계 파악</strong></p>
</blockquote>
<p>옵션
height=숫자
표의 사이즈</p>
<blockquote>
<blockquote>
<pre><code class="language-sns.set_style(&quot;darkgrid&quot;)">sns.lmplot(
    x=&quot;x&quot;,
    y=&quot;y&quot;, 
    data=anascombe.query(&quot;dataset == &#39;III&#39;&quot;), 
    robust=True,
    ci=None, 
    height=7, 
    scatter_kws={&#39;s&#39;:50}) # ci 신뢰구간 선택
plt.show()</code></pre>
</blockquote>
</blockquote>
<p>ci=None
신뢰구간?</p>
<p>scatter_kws={&#39;s&#39;:50}
표에 그려진 점에 사이즈 조정</p>
<p>hue = &quot;카테고리&quot;
카테고리 옵션을 넣어 더 시각화하여 비교</p>
<p>robust=True</p>
<blockquote>
<p><strong>.heatmap(x축, y축,data)</strong></p>
</blockquote>
<p>&lt;옵션&gt;</p>
<blockquote>
</blockquote>
<p>annot=True
데이터 정보 보이기
imt = &quot;d&quot;
정수형으로 f는 실수형
cmap=&quot;YlGnBu&quot;
컬러 옵션
linewidth = 숫자
컬러바들끼리의 간격</p>
<pre><code>    plt.figure(figsize=(10,10))
    sns.heatmap(
        data=crime_anal_norm_sort[target_col],
        annot=True,
        fmt = &quot;f&quot; ,
        linewidth = 0.5,
        cmap=&quot;RdPu&quot;
    )</code></pre><blockquote>
</blockquote>
<p><strong>.pairplot(데이터)</strong>
데이터에 대해 모든 경우의 수의 그래프를 시각화해줌
옵션</p>
<blockquote>
</blockquote>
<p>vars=[&quot;분석하고싶은 컬럼명&quot;,&quot;컬럼2&quot;]</p>
<blockquote>
</blockquote>
<p>king=&quot;reg&quot;
&#39;scatter&#39;
&#39;kde&#39;
&#39;hist&#39;
&#39;reg&#39; 회귀분석</p>
<blockquote>
</blockquote>
<p>height = 숫자</p>
<pre><code>sns.pairplot(data=crime_anal_norm, vars=[&quot;살인&quot;,&quot;강도&quot;,&quot;폭력&quot;], kind=&quot;reg&quot;, height=3);</code></pre><hr>
<h1 id="folium">folium</h1>
<blockquote>
<p><strong>선언</strong>
import folium
import pandas as pd
import json</p>
</blockquote>
<blockquote>
<p><strong>기본사용</strong>
folium.Map(location=[위도,경도], zoom_start=15)
zoom_startsms # 0~18
tiles=&quot;옵션&quot;
옵션으로는 Stamen Toner, 디폴트는 OpenStreetMap</p>
</blockquote>
<blockquote>
<p>.save()
m.save(&quot;./folium(2).html&quot;)</p>
</blockquote>
<blockquote>
<h3 id="foliummarker">folium.Marker()</h3>
</blockquote>
<ul>
<li>지도에 마커 생성<pre><code>folium.Marker(
  location=(37.5449834,127.0552657),    : 위치
  popup=&quot;성수역&quot;,    : 마커 클릭시 뜨는 팝업
  tooltip=&quot;Icon custom&quot;,    : 마커에 마우스 올릴 시 뜨는 툴팁
  icon=folium.Icon(    : 아이콘 매서드
      color=&quot;purple&quot;,    : 마커 색깔
      icon_color=&quot;white&quot;,    : 아이콘 색깔
      icon=&quot;amazon&quot;,    : 아이콘 모양
      anle=50,        : 아이콘 각도
      prefix=&quot;fa&quot;        : 아이콘 모양지정
  )
).add_to(m);        : 지도에 추가사항 보내주는 매서드</code></pre><blockquote>
</blockquote>
.add_to(지도)
지도에 추가사항 넣어주기</li>
</ul>
<blockquote>
</blockquote>
<p>folium.ClickForMarker()</p>
<ul>
<li>지도 위에 마우스로 클릭 했을 때 마커를 생성해 줍니다<blockquote>
</blockquote>
<pre><code class="language-m">  location=[37.5449834,127.0552657],
  zoom_start=15,
  tiles=&quot;OpenStreetMap&quot;
)
m.add_child(folium.ClickForMarker())</code></pre>
<blockquote>
</blockquote>
m.add_child(folium.ClickForMarker(popup=&quot;wow!&quot;))
이렇게 내부에 popup 넣을 수 있음 (얘만 된다)</li>
</ul>
<blockquote>
</blockquote>
<p>m.add_child(folium.LatLngPopup())
누르는 그곳에 위도, 경도를 보여줌.. (캡쳐)</p>
<blockquote>
</blockquote>
<h3 id="circle">Circle</h3>
<pre><code>folium.Circle(
    location=[ 37.5221, 127.0420],    : 위치
    radius=100,            : 반지름
    fill = True,            : 채움
    color = &quot;darkred&quot;,        : 테두리 색
    fill_color=&quot;red&quot;,            : 원 안 색
    popup=&quot;circle&quot;,            
    tooltip=&quot;Circle&quot;,
   &gt; 
).add_to(m)</code></pre><blockquote>
<p>.CircleMarker는 같은 기능을함. 사이즈가 Circle보다 큰 정도</p>
</blockquote>
<blockquote>
</blockquote>
<p>제이슨파일 불러오기
geo_path=&quot;../data/02. skorea_municipalities_geo_simple.json&quot;
geo_str = json.load(open(geo_path,encoding=&quot;utf-8&quot;))</p>
<blockquote>
<p><strong>numpy axis = 1 행, pandas 에서는 axis = 1이 열</strong>
crime_anal_station[&quot;검거&quot;] = np.mean(tmp, axis=1) </p>
</blockquote>
<blockquote>
<p>피봇테이블과 멀티인덱스 제거
crime_loc = crime_loc_raw.pivot_table(
    crime_loc_raw, index=&quot;장소&quot;, columns=&quot;범죄명&quot;, aggfunc=[np.sum]
)
crime_loc.columns = crime_loc.columns.droplevel([0,1])</p>
</blockquote>
<h1 id="💬코멘트">💬코멘트</h1>
<p>그래프 그리기는 너무 재밌다.
그래프 그리는 것만 한 10일 했으면 좋겠다...
유용한 피봇테이블과도 친해져야 그래프도 그릴 수 있으니 골고루 연습해야할텐데</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[EDA_범죄_1]]></title>
            <link>https://velog.io/@auden_9/EDA%EB%B2%94%EC%A3%841</link>
            <guid>https://velog.io/@auden_9/EDA%EB%B2%94%EC%A3%841</guid>
            <pubDate>Sun, 26 Feb 2023 13:09:06 GMT</pubDate>
            <description><![CDATA[<h1 id="밑줄">밑줄</h1>
<blockquote>
<p><strong>.read_확장자()</strong>
옵션 thousands=&quot;,&quot;
천 단위 구분이라고하면 콤마를 제거하고 숫자형으로 읽는다.
콤마가 들어가있으면 포함하여 문자열로 인식이 되기에 쓴다 쓰는 옵션!</p>
</blockquote>
<blockquote>
<p><strong>.head() 와 .info() 로 데이터 확인</strong>
인덱스 값과 컬럼 옆 non-null count와의 수를 비교.
차이가 심하면 .unique()로 체크</p>
</blockquote>
<blockquote>
<p><strong>.isnull()</strong>
데이터프레임의 빈 값을 확인해본다.
빈 값을 제외해야한다는 판단을 내려야함.
e.g&gt; crime_raw_data[crime_raw_data[&quot;죄종&quot;].isnull()]
이런식으로 한번 다시 감싸면 가시적으로 빈 값이 보여짐.</p>
</blockquote>
<blockquote>
<p><strong>.notnull()</strong>
값이 있는 데이터 확인
값이 있는 데이터를 다시 확인 후에 변수에 다시 담아줌
e.g&gt; crime_raw_data = crime_raw_data[crime_raw_data[&quot;죄종&quot;].notnull()]</p>
</blockquote>
<blockquote>
<h3 id="멀티인덱스-정리">멀티인덱스 정리</h3>
<p>멀티 인덱스 접근
data[&quot;index1&quot;,&quot;index2&quot;,&quot;index3&quot;]</p>
</blockquote>
<p>data.columns.droplevel([0,1])
0번과 1번 레벨에 해당하는 index를 날려달라.
레벨은 보이는 위쪽부터 0,1,2, ... 이렇게 나감</p>
<blockquote>
<h3 id="데이터-저장">데이터 저장</h3>
<p>crime_station.to_csv(&quot;../data/02.crime_in_seoul_raw.csv&quot;, sep=&quot;,&quot;, encoding=&quot;utf-8&quot;)</p>
</blockquote>
<hr>
<h1 id="pandas-pivot_table">Pandas pivot_table</h1>
<p>pd.viot_table(
    df,
    index = [&quot;Manager&quot;,&quot;Rep&quot;],
    values = [&quot;price&quot;],
    columns = [&quot;product&quot;],
    aggfunc = [np.sum],
    fill_value = 0
)</p>
<blockquote>
<p><strong>pd.pivot_table(데이터, index=[&quot;정렬기준&quot;])</strong>
피봇테이블로 인덱스로 두고 재정렬 명령</p>
</blockquote>
<blockquote>
<p><strong>pd.pivot_table(데이터, index=[&quot;기준1&quot;,&quot;기준2&quot;,&quot;기준3&quot;])</strong>
여러 기준으로도 정렬 가능!</p>
</blockquote>
<blockquote>
<p><strong>pd.pviot_table(데이터,index=[&quot;기준1&quot;,&quot;기준2&quot;], values = [&quot;가격&quot;])</strong>
기준1,기준2로 정렬한 후 원하는 가격 값만 가져오기.
values 지정하여 원하는 값만 출력가능</p>
</blockquote>
<blockquote>
<h4 id="addfunc">addfunc=</h4>
<p>값은 중복데이터가 있을 시 평균으로 계산하여 가져와서 .33333 이런식으로 보여질 수 있음!
그럴 때 다른 함수를 적용하여 보고싶을 때 
aggfunc을 추가해준다!!</p>
</blockquote>
<p>e.g&gt; 
pd.pivot_table(df, index=[&quot;manager&quot;,&quot;Rep&quot;], values=[&quot;price&quot;], aggfunc=[np.sum])</p>
<blockquote>
<h4 id="aggfunc-2개-이상-적용-가능">aggfunc 2개 이상 적용 가능</h4>
<p>df.pivot_table(index=[&quot;Manager&quot;,&quot;Rep&quot;], values=&quot;Price&quot;, aggfunc=[np.sum, len])</p>
</blockquote>
<blockquote>
<h4 id="nan-값-설정--fill_value">Nan 값 설정 : fill_value</h4>
<p>df.pivot_table(index=[&quot;Manager&quot;,&quot;Rep&quot;],values=&quot;Price&quot;,columns=&quot;Product&quot;, aggfunc=np.sum, fill_value=0)</p>
</blockquote>
<blockquote>
<h4 id="총계-추가">총계 추가</h4>
<p>margins = True</p>
</blockquote>
<p>df.pivot_table(
    index=[&quot;Manager&quot;,&quot;Rep&quot;,&quot;Product&quot;], 
    values=[&quot;Price&quot;,&quot;Quantity&quot;],
    aggfunc=[np.sum,np.mean], 
    fill_value=0,
    margins = True
)
(결과 화면 캡쳐 처리 전- 후)</p>
<p>[실습 ]</p>
<p>+++ 엑셀파일 열리지 않을때..!!
!pip install openpyxl 
추가</p>
<p>!pip install panas --upgrade
pivot-table 열리지 않을 시 판다스 버전 업 해준다..</p>
<p>pd.pivot_table(df,index=&quot;Name&quot;)
에러가 계속 생김..
aggfunc 디폴트가 mean 평균이여서 그런가봄..?
그래서 ,aggfunc=&#39;first&#39;를 추가해 셀의 첫번째 값을 그냥 가져오게끔 해주면 됌..</p>
<hr>
<h2 id="구글-맵스-연동">구글 맵스 연동</h2>
<p>geocod API 설치후</p>
<blockquote>
<p>import googlemaps</p>
</blockquote>
<p>gmaps_key = &quot;API KEY&quot;
gmaps = googlemaps.Client(key=gmaps_key)</p>
<blockquote>
<p>gmaps.geocode(&quot;서울영등포경찰서&quot;, language=&quot;ko&quot;)</p>
</blockquote>
<p>구글 데이터는 리스트형으로 나온다.<br>리스트 안에는 딕셔너리형태로 나온다.</p>
<p>.get() 검색
데이터 얻어오는 명령</p>
<p>구글로 원하는 지역을 가져온다.
주소를 변수에 넣고, 
필요한 정보가져온다. </p>
<p>.split()
주소지 슬라이싱</p>
<p>저장할 컬럼을 만든다.
e.g&gt; crime_station[&quot;구별&quot;] = np.nan
       crime_station[&quot;lat&quot;] = np.nan
       crime_station[&quot;lng&quot;] = np.nan</p>
<p>반복문으로 주소지를 할당해준다.</p>
<blockquote>
<ul>
<li>for문
for n in range(0,10):
  print(n**2)</li>
</ul>
</blockquote>
<ul>
<li>[n **2 for n in range(0,10)]
이렇게 가능..!<blockquote>
</blockquote>
</li>
</ul>
<h3 id="iterrows-옵션">.iterrows() 옵션</h3>
<blockquote>
</blockquote>
<p>Pandas에 잘 맞춰진 반복문용 명령 iterrows()
Pandas 데이터 프레임은 대부분 2차원
이럴 때 for문을 사용하면, n번째라는 지정을 반복해서 가독률이 떨어짐
Pandas 데이터 프레임으로 반복문을 만들때 itterow()옵션을 사용하는게 좋음.
받을 때, 인덱스와 내용으로 나누어 받는 것만 주의</p>
<blockquote>
<pre><code class="language-python">for idx, rows in crime_station.iterrows():
    station_name = &quot;서울&quot;+idx+&quot;경찰서&quot;
    tmp = gmaps.geocode(station_name, language=&quot;ko&quot;)

    tmp_gu = tmp[0].get(&quot;formatted_address&quot;)

    lat = tmp[0].get(&quot;geometry&quot;)[&quot;location&quot;][&quot;lat&quot;]
    lng = tmp[0].get(&quot;geometry&quot;)[&quot;location&quot;][&quot;lng&quot;]

    crime_station.loc[idx,&quot;lat&quot;] = lat
    crime_station.loc[idx,&quot;lng&quot;] = lng
    if idx == &quot;관악&quot;:
        crime_station.loc[idx,&quot;구별&quot;] = &quot;관악구&quot;
    else:
        crime_station.loc[idx,&quot;구별&quot;] = tmp_gu.split()[2]
</code></pre>
</blockquote>
<pre><code>print(count)
count +=1</code></pre><p>+
crime_station.loc[idx,&quot;구별&quot;] = tmp_gu.split()
였으나..! 계속 에러가 나와 for문이 어디서 걸리는 지 확인 후 걸리는 구간의 구를 검색해보니
관악경찰서가 서울특별시로만 주소가 지정되어있었다..
다 수기로 할순 없고 어쩌지 고민에 빠졌다가
많은 도움을 주시는 수강생분에게 도움을 받아 해쳐나왔다.
아예 관악구를 지정해, 구를 수기로 넣어주는 방식</p>
<h1 id="💬-코멘트">💬 코멘트</h1>
<p>EDA는 진짜 스터디노트 정리하기가 힘들다.
이론과 실습파트가 아예 다른 강사님이시고 설명 방식이 다르다.
그래도 실습파트서 꼼꼼히 챙겨주시기는 하나..
실습을 하고 이론을 다시 챙겨듣는 방식으로 해야하는지..
일단 보여주며 가르쳐주는건 좋은데.. 진도 따라갈 시간도 부족하고 복습할 시간이 절대적으로 부족해서 깊이 있는 공부가 될까 계속 의문이 든다 오늘은 많이 지쳐서 여기까지</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[EDA_25일차_학습일지]]></title>
            <link>https://velog.io/@auden_9/EDA25%EC%9D%BC%EC%B0%A8%ED%95%99%EC%8A%B5%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@auden_9/EDA25%EC%9D%BC%EC%B0%A8%ED%95%99%EC%8A%B5%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Sat, 25 Feb 2023 07:23:50 GMT</pubDate>
            <description><![CDATA[<h1 id="📖추가내용">📖추가내용</h1>
<blockquote>
<h3 id="조건-condition">조건 condition</h3>
</blockquote>
<p>A 컬럼에서 0보다 큰 숫자 (양수)만 선택
df[&quot;A&quot;] &gt; 0</p>
<blockquote>
</blockquote>
<p>*<em>결과 출력은 논리로 나옴
1번 데이터 False
2번 데이터 True *</em></p>
<blockquote>
</blockquote>
<p><strong>전체 데이터 적용 가능
df[df[&quot;A&quot;] &gt; 0]</strong>
데이터 전체의 0보다 큰 데이터를 보여줘라</p>
<blockquote>
<h3 id="column-데이터-추가">column 데이터 추가</h3>
</blockquote>
<p>df[&quot;E&quot;] = [&quot;one&quot;, &quot;two&quot;,&quot;three&quot;,&quot;four&quot;,&quot;five&quot;,&quot;six&quot;]</p>
<blockquote>
<h3 id="컬럼-삭제">컬럼 삭제</h3>
</blockquote>
<p>방법1)
del df[&quot;E&quot;]
df</p>
<blockquote>
</blockquote>
<p>방법2)
df.drop([&quot;D&quot;], axis=1) # 기본 값이 axis=0 가로, axis =  1 세로
<strong>axis가 0일때는 위처럼 명시 안해도됌</strong></p>
<blockquote>
</blockquote>
<p>df.drop([&quot;20230228&quot;])</p>
<blockquote>
<h3 id="isin">isin()</h3>
<p>특정 요소가 있는지 확인</p>
</blockquote>
<p>df[&quot;E&quot;].isin([&quot;two&quot;, &quot;five&quot;])</p>
<blockquote>
</blockquote>
<p>True , False로 반환됌</p>
<blockquote>
</blockquote>
<p>df[df[&quot;E&quot;].isin([&quot;two&quot;, &quot;five&quot;])]
전체로 조회하면
조건에 맞는 애들 데이터프레임 타입으로 반환됌</p>
<blockquote>
<h3 id="dfapply">df.apply()</h3>
</blockquote>
<p>알고싶은 기능을 구해줌</p>
<blockquote>
</blockquote>
<p>df[&quot;A&quot;].apply(&quot;sum&quot;)
a열의 합</p>
<blockquote>
</blockquote>
<p>df[&quot;A&quot;].apply(&quot;mean&quot;)
a열의 평균</p>
<blockquote>
</blockquote>
<p>df[&quot;A&quot;].apply(&quot;min&quot;),df[&quot;A&quot;].apply(&quot;max&quot;)
최소값과, 최대값 (이렇게 2개도 동시에 가능)</p>
<blockquote>
</blockquote>
<p>df[[&quot;A&quot;,&quot;B&quot;]].apply(&quot;sum&quot;)
이렇게 두 개 행선택도 가능</p>
<blockquote>
</blockquote>
<p>df[&quot;A&quot;].apply(np.sum)
넘파이 기능도 가능!</p>
<blockquote>
</blockquote>
<p>함수도 호출 가능.!!
df[&quot;A&quot;].apply(lambda num: &quot;plus&quot; if num&gt; 0 else &quot;minus&quot;)</p>
<blockquote>
</blockquote>
<p>람다함수도 가능!
apply에 들어가는 기능들 검색..!</p>
<h1 id="✏️-밑줄">✏️ 밑줄</h1>
<p>CCTV 복습</p>
<blockquote>
<p>.read_파일확장자(&quot;../경로/파일명.확장자&quot;, encoding=&quot;utf-8&quot;)
데이터파일 열기</p>
</blockquote>
<blockquote>
<p>.rename(요소={바꿀 위치:&quot;바꿀 이름&quot;}, inplace=True)
데이터 요소 이름 바꾸기</p>
</blockquote>
<blockquote>
<p>.date_range(&quot;날짜&quot;, period=숫자)
지정날짜부터 숫자만큼의 날짜 데이터를 가져온다.</p>
</blockquote>
<blockquote>
<p>.DataFrame(data1, index=각 행 제목, columns=열 제목)
e.g&gt; .DataFrame(np.random.randn(6,4), index=dates, columns=[&quot;A&quot;,&quot;B&quot;,&quot;C&quot;])</p>
</blockquote>
<blockquote>
<p>.head()
데이터 상위 5줄 보이기</p>
</blockquote>
<blockquote>
<p>.tail()
데이터 최하단 5줄 보이기</p>
</blockquote>
<blockquote>
<p>.index
DataFrame의 index 확인</p>
</blockquote>
<blockquote>
<p>.columns
DataFrame의 컬럼 확인</p>
</blockquote>
<blockquote>
<p>.columns[인덱스]
인덱스의 컬럼만 호출</p>
</blockquote>
<blockquote>
<p>.values
DataFrame의 값 확인</p>
</blockquote>
<blockquote>
<p>DataFrame[&quot;컬럼명&quot;]
특정컬럼명만 읽기</p>
</blockquote>
<blockquote>
<p>DataFrame.loc[인덱스,컬럼]
인덱스,컬럼 지정하여 읽기
e.g&gt; df.loc[:,[&quot;A&quot;,&quot;B&quot;]]
    : 인덱스 전부, A,B 컬럼만</p>
</blockquote>
<blockquote>
<p>DataFrame.iloc[인덱스번호]
iloc는 컴퓨터가 정한 가상의 인덱스번호 0부터 시작함
+) 열까지 지정가능
  e.g&gt; df.iloc[3:5, 0:2]
         행(인덱스) 3,4 / 열(컬럼) 0,1   </p>
</blockquote>
<blockquote>
<p>DataFrame[n:m]
인덱스 n부터 m-1가지 읽어줌
직접 &quot;인덱스명&quot;으로도 읽을 수 있음!</p>
</blockquote>
<blockquote>
<p>DataFrame
이 자체로도 호출가능, 보통 변수에 담아 변수를 호출함.</p>
</blockquote>
<blockquote>
<p>.info()
DataFrame의 기본 정보확인
여기서는 각 컬럼의 크기와 데이터형태를 확인하는 경우가 많다.</p>
</blockquote>
<blockquote>
<p>.describe()
DataFrame의 통계적 기본 정보를 확인
최소값, 최대값,평균 등 정보가 나온다.</p>
</blockquote>
<blockquote>
<p>.sort_values(by=&quot;기준 컬럼&quot; ascending=True)
ascending이 True면 오름차순, False면 내림차순</p>
</blockquote>
<blockquote>
<p>.merge(left,right,on=&quot;key&quot;)
key컬럼을 기준으로 2개의 DataFrame 병합</p>
</blockquote>
<blockquote>
<p>.merge(left,right,how=&quot;left&quot;, on=&quot;key&quot;)
left에 key를 기준으로 병합</p>
</blockquote>
<ul>
<li>how에는 기본 inner(교집합-그래서 지정없을 시 공통사항만 병합됌.), outer이 있다.</li>
</ul>
<blockquote>
<p>.set_index(&quot;컬럼명&quot;, inplace=True)
데이터 정리하며 데이터 재지정.
.unique로 겹치는 정보가 없는 데이터로 index 지정!</p>
</blockquote>
<h1 id="💬-코멘트">💬 코멘트</h1>
<p>늘 그 지난 주간이 바빴다고 느끼지만 이번주는 시간과의 싸움(X) - 전쟁(O)이였다. 파이썬 테스트가 가장 크게 자리했고, 실습으로 진행을 나가서 따라잡기에는 복습 밖에 없는데 복습 또한 시간 아닌가.... 진도도 나가야하는데 팀스터디에 스터디노트도 신경써야한다...</p>
<p>테스트 문제 풀면서 이런걸 배웠나 싶은게 지금 스터디노트 작성하면서 지난 자료 보는데.. 배웠네....... 내 노트라도 잘 봐야겠다..
휘발성 공부가 되지않게.........</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[EDA_CCTV_2]]></title>
            <link>https://velog.io/@auden_9/EDACCTV2</link>
            <guid>https://velog.io/@auden_9/EDACCTV2</guid>
            <pubDate>Fri, 24 Feb 2023 05:15:55 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>CCTV 2편 요약</p>
</blockquote>
<ol start="5">
<li>그래프를 그릴 수 있는 능력 [Matplotlib]</li>
<li>전체적인 경향을 파악할 수 있는 능력 [Regression using Numpy]</li>
<li>그 경향에서 벗어난 데이터를 강조하는 능력 [Insight and Visualization]</li>
</ol>
<hr>
<h2 id="matplotlib-기초">matplotlib 기초</h2>
<p>파이썬의 대표 시각화 도구
matplotlib</p>
<p>실행
import matplotlib.pyplot as plt
from matplotlib import rc</p>
<p>한글설정
rc(&quot;font&quot;, family=&quot;Malgun Gothic&quot;)</p>
<p>%matplotlib inline
또는
get_ipython().run_line_magic(&quot;matplotlib&quot;,&quot;inline&quot;)
plt.rcParmas[&quot;axes.unicode_minus&quot;] = False
★★ 그래프에서 마이너스로 깨짐현상 잡기</p>
<hr>
<h2 id="그래프-그리기">그래프 그리기</h2>
<blockquote>
<p>matplotlib 그래프 기본형태</p>
</blockquote>
<pre><code>plt.figure(figsize=(10,6))
plt.plot(x,y)
plt.show()</code></pre><p>figure는 그래프를 그리기 위한 도화지
figsize 도화지 사이즈</p>
<p>plt.plot(X축,Y축) 
그릴 표 데이터 X축, Y축</p>
<h3 id="예제1--그래프-기초">예제1 : 그래프 기초</h3>
<blockquote>
</blockquote>
<h4 id="삼각함수-그리기">삼각함수 그리기</h4>
<ul>
<li>np.arange(a,b,s) : a부터 b까지 s의 간격으로 만듦</li>
<li>np.sin(value)</li>
</ul>
<pre><code class="language-python">**import numpy as np**
t = np.arange(0, 12, 0.01)
y = np.sin(t)

plt.figure(figsize=(10,6))
plt.plot(t, np.sin(t))
plt.plot(t, np.cos(t))
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/auden_9/post/5da43577-4d96-40c1-8b06-368d7a619e43/image.png" alt=""></p>
<ul>
<li>추가 </li>
</ul>
<blockquote>
<ol>
<li>격자무늬 추가</li>
</ol>
</blockquote>
<p><strong>plt.grid(True)</strong>
격자무늬 생성</p>
<blockquote>
</blockquote>
<p><strong>plt.grid(False)</strong>
격자무늬 없앰</p>
<blockquote>
<ol start="2">
<li>그래프 제목 추가</li>
</ol>
</blockquote>
<p><strong>plt.title(&quot;Example of sinwave&quot;)</strong></p>
<blockquote>
<ol start="3">
<li>x축,y축 제목 추가</li>
</ol>
</blockquote>
<p><strong>plt.xlabel(&quot;time&quot;)
plt.ylabel(&quot;Amlitude&quot;)</strong></p>
<blockquote>
<ol start="4">
<li>주황색, 파랑색 선 데이터 의미구분</li>
</ol>
</blockquote>
<p><strong>plt.legend(labels=[&quot;sin&quot;,&quot;cos&quot;])</strong></p>
<blockquote>
</blockquote>
<p>또는</p>
<blockquote>
</blockquote>
<p><strong>plt.plot(t, np.sin(t), label=&quot;sin&quot;)
plt.plot(t, np.cos(t), label=&quot;cos&quot;)
plt.legend()</strong></p>
<blockquote>
<p>덤)
라벨 위치 바꾸기
<strong>plt.legend(loc=&quot;upper left&quot;)</strong></p>
</blockquote>
<p>위치 : upper left/ upper right/ lower left / lower right</p>
<p>위 4가지 추가하여 완성한 그래프</p>
<p><img src="https://velog.velcdn.com/images/auden_9/post/336760b8-591e-4405-be76-1b96e201f0db/image.png" alt=""></p>
<hr>
<h3 id="예제2-그래프커스텀">예제2: 그래프커스텀</h3>
<blockquote>
</blockquote>
<pre><code>t = [0,1,2,3,4,5,6]
t = list(range(0,7))
y = [1,4,5,8,9,5,3]
&gt;
plt.figure(figsize=(10,6))
plt.plot(
    t,
    y,
    color=&quot;green&quot;,
    linestyle=&quot;--&quot;, # - 실선 -- 점선
    marker= &quot;o&quot;,  # ^, s,d ...
    markerfacecolor=&quot;blue&quot;,
    markersize=15,
)
plt.xlim([ -0.5, 6.5])
plt.ylim([ 0.5, 9.5])
plt.show()</code></pre><p><img src="https://velog.velcdn.com/images/auden_9/post/bb0673bf-bfbe-441b-bb7f-2cca8504aa9a/image.png" alt=""></p>
<blockquote>
<p> plt.Xlim 과 plt.Ylim은 데이터 크기에 맞춰 도화지 사이즈 좀 조정한 코드.</p>
</blockquote>
<hr>
<h3 id="예제3-scatter-plot">예제3: scatter plot</h3>
<blockquote>
<pre><code>t = np.array(range(0,10))
y = np.array([9,8,7,9,8,3,2,4,3,4])
</code></pre></blockquote>
<p>colormap = t</p>
<blockquote>
</blockquote>
<p>def drawGraph():</p>
<blockquote>
</blockquote>
<pre><code>plt.figure(figsize=(15,6))
plt.scatter(t,y, s=100, c=colormap, marker=&quot;&gt;&quot;)
plt.colorbar()
plt.show()</code></pre><blockquote>
<p>drawGraph()</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/auden_9/post/a27a43bf-5805-4487-98a6-c421ce3aa117/image.png" alt=""></p>
<h3 id="예제4-pandas에서-plot-그리기">예제4: Pandas에서 plot 그리기</h3>
<ul>
<li>matplotlib 기능을 가져와서 사용합니다</li>
</ul>
<p>data_result.head()</p>
<p>data_result[&quot;인구수&quot;].plot(kind=&quot;bar&quot;,figsize=(10,10))
세로 막대기
<img src="https://velog.velcdn.com/images/auden_9/post/e1b6731c-3e44-4f45-81ce-839b2ed1b940/image.png" alt=""></p>
<p>data_result[&quot;인구수&quot;].plot(kind=&quot;barh&quot;,figsize=(10,10))
가로 막대기
<img src="https://velog.velcdn.com/images/auden_9/post/b281ae3a-ec60-4b52-a03b-228c664b124d/image.png" alt=""></p>
<hr>
<h2 id="6-데이터의-경향표시">6. 데이터의 경향표시</h2>
<h4 id="소계-컬럼-시각화">소계 컬럼 시각화</h4>
<p>data_result[&quot;소계&quot;].plot(kind=&quot;barh&quot;, grid=True, figsize=(10,10))</p>
<p>데이터 정렬
data_result[&quot;소계&quot;].sort_values().plot(kind=&quot;barh&quot;, grid=True, figsize=(10,10))</p>
<p>plot 안에 표 데이터 정보를 추가
title=&quot;제목&quot;</p>
<p><img src="https://velog.velcdn.com/images/auden_9/post/a75f3073-e6d6-42ae-aeab-7651d6468c79/image.png" alt=""></p>
<hr>
<h4 id="인구수와-소계-컬럼으로-scatter-plot-그리기">인구수와 소계 컬럼으로 scatter plot 그리기</h4>
<blockquote>
<pre><code>def drawGraph():
    plt.figure(figsize=(14,10))
    plt.scatter(data_result[&quot;인구수&quot;], data_result[&quot;소계&quot;], s = 50)
    plt.xlabel(&quot;인구수&quot;)
    plt.ylabel(&quot;CCTV&quot;)
    plt.grid(True)
    plt.show()
drawGraph()</code></pre></blockquote>
<p><img src="https://velog.velcdn.com/images/auden_9/post/8a40fe1a-1fc9-48f0-a3f4-bb25259ceba4/image.png" alt=""></p>
<h4 id="numpy를-이용한-1차-직선만들기">Numpy를 이용한 1차 직선만들기</h4>
<blockquote>
<p><strong>- np.polyfit(): 직선을 구성하기 위한 계수를 계산</strong>
<strong>- np.poly1d() : polyfit으로 찾은 계수로 파이썬에서 사용할 수 있는 함수로 만들어주는 기능</strong></p>
</blockquote>
<blockquote>
<pre><code>import numpy as np
</code></pre></blockquote>
<p>fp1 = np.polyfit(data_result[&quot;인구수&quot;], data_result[&quot;소계&quot;], 1)
fp1</p>
<blockquote>
</blockquote>
<p>f1 = np.poly1d(fp1)
f1</p>
<blockquote>
</blockquote>
<p>f1(400000)</p>
<ul>
<li>인구가 40만인 구에서 서울시의 전체 경향에 맞는 적당한 CCTV 수 
(계산해준거임.. 위에 식을 토대로)</li>
</ul>
<p>fx = np.linspace(100000,700000,100)
fx</p>
<blockquote>
<ul>
<li>경향선을 그리기 위한 x 데이터 생성</li>
<li><em>- np.linspace(a,b,n) : a부터 b까지 n개의 등간격 데이터 생성*</em></li>
</ul>
</blockquote>
<hr>
<h2 id="오차값">오차값</h2>
<p>그 경향에서 벗어난 데이터를 강조하는 능력
Insight and vIsualization</p>
<blockquote>
</blockquote>
<p>경향선과 실제값 같으면 오차율 0
그 외에는 오차값,</p>
<blockquote>
</blockquote>
<p>오차가 벗어난 데이터 = 경향에서 벗어난 데이터
그걸 찾자</p>
<blockquote>
</blockquote>
<p><strong>오차 = 실제값 - 예측값</strong></p>
<blockquote>
</blockquote>
<p>내림차, 오름차로 정리
내림차 - 오차가 가장 많은 것부터 순으로</p>
<p><img src="https://velog.velcdn.com/images/auden_9/post/573251ae-0a19-4011-bfbc-94b78ce2fda9/image.png" alt=""></p>
<hr>
<h2 id="💬-코멘트">💬 코멘트</h2>
<p>재밌지만 강사님 말씀처럼 배울 양은 방대하고 시간은 없고,
그렇기에 효율있게 가벼운 이론과 실습위주로 가서 어버버 하고있다.
시간 부족하단 얘길 달고 살 줄이야.. 현재로썬 계속 친숙해지는 수 밖에!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[EDA_CCTV_1]]></title>
            <link>https://velog.io/@auden_9/EDACCTV1</link>
            <guid>https://velog.io/@auden_9/EDACCTV1</guid>
            <pubDate>Fri, 24 Feb 2023 04:11:06 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>CCTV 1편 요약</p>
</blockquote>
<ol>
<li>서울시 구별 cctv 현황 데이터 확보</li>
<li>인구현황 데이터 확보</li>
<li>cctv 데이터와 인구현황 데이터 합치기</li>
<li>데이터를 정리하고 정렬하기<blockquote>
<p> *<em>pandas + python 영역  *</em></p>
</blockquote>
</li>
</ol>
<hr>
<h2 id="pandas">Pandas</h2>
<blockquote>
<ul>
<li>데이터 조작 및 분석을 위한 파이썬 프로그래밍 언어 용으로 작성된 소프트웨어 라이브러리이다. (위키백과)</li>
<li>이름이 판다여서 귀엽다고 생각했는데, 경제학 용어인 패널 데이터에서 파생되었다고한다. </li>
<li>파이썬에서 R만큼의 강력한 데이터 핸들링 성능을 제공하는 모듈</li>
</ul>
</blockquote>
<ul>
<li>단일 프로세스에서는 최대 효율</li>
<li>코딩 가능하고 응용 가능한 엑셀로 받아들여도 됌</li>
<li>원하는 모듈이 설치되어 있따면</li>
<li>import pandas as pd</li>
</ul>
<hr>
<h2 id="자료수집">자료수집</h2>
<blockquote>
</blockquote>
<ul>
<li>구글 검색 [ 서울시 자치구 연도별 cctv 설치 현황 ]</li>
<li>서울시 자료 받은 열린데이터 광장으로 이동하여 오픈 API 서비스 선택하여 다운로드</li>
<li>파일명은 seoul_Population.xls<blockquote>
</blockquote>
구글 검색으로 통해 대용량 데이터를 얻어 여러가지 실습을 해볼 수 있다.</li>
</ul>
<hr>
<h2 id="파일-열기">파일 열기</h2>
<blockquote>
</blockquote>
<p><strong>import 모듈 as pd</strong>
<strong>변수 = pd.read_파일확장자(&quot;../파일경로/파일명.csv&quot;, encoding=&quot;utf-8&quot;)</strong>
변수.head()</p>
<blockquote>
</blockquote>
<ul>
<li>한글은 encoding 필수</li>
<li>head()는 데이터가 긴 경우 앞부분 5줄만 보여달라란 뜻</li>
</ul>
<blockquote>
<p>+) 엑셀의 경우 
엑셀의 경우 윗 부분 섹션이 <strong>병합되어있는 경우가 많은데, 판다스는 이를 읽지 못한다.</strong>
pd.read_excel(&quot;경로&quot;, <strong>header=2, usecols =&quot;B,D,G,J,N&quot;</strong>)
이런식으로 써주는게 눈에 잘 들어온다</p>
</blockquote>
<p><strong>header = 2</strong> 
병합되어있는 맨윗 두줄을 날려라
<strong>usecols = &quot;&quot;</strong>
필요한 열만 가져옴</p>
<hr>
<h2 id="pandas의-데이터프레임-구조">Pandas의 데이터프레임 구조</h2>
<img src="https://velog.velcdn.com/images/auden_9/post/7665833f-a24c-4169-8417-8360daf6820d/image.png">


<hr>
<h2 id="데이터-프레임의-이름바꾸기">데이터 프레임의 이름바꾸기</h2>
<blockquote>
<p><strong>변수명.rename(바꿀요소={위치:&quot;바꿀이름&quot;}, inplace=True)</strong></p>
<pre><code>예시)
    변수명.rename(
        colums={
            변수명.colums[0] : &quot;구별&quot;,
            변수명.colums[1] : &quot;인구수&quot;,
            변수명.colums[2] : &quot;한국인&quot;, ....},
        inplace=True,
    )
    변수명.head()</code></pre></blockquote>
<blockquote>
<p><strong>inplace=&quot;True&quot;</strong>
데이터도 바꾸는 명령어, 디폴트는 False값임.</p>
</blockquote>
<hr>
<h2 id="데이터프레임-정보-탐색">데이터프레임 정보 탐색</h2>
<blockquote>
</blockquote>
<ul>
<li><strong>파일담은 변수명.head()</strong> : 데이터의 상위 5줄 보이기. 디폴트는 5. 수량을 넣어 보이는 데이터 조절 가능하다.
e.g &gt; CCTV_seoul.head()<blockquote>
</blockquote>
</li>
<li><strong>파일담은 변수명.tail()</strong> : .head()와 반대로 최하단 5줄 보임. <strong>전체데이터 수량 파악하기 수월함</strong><blockquote>
</blockquote>
</li>
<li><strong>변수명.colums</strong> : colums 전체 값 보여짐</li>
<li><strong>변수명.colums[0]</strong> : colums 첫번째 해당하는 값<blockquote>
</blockquote>
</li>
<li><strong>변수명.index</strong> : 데이터프레임의 인덱스 값만 보여짐</li>
<li><strong>변수명.values</strong> : 데이터프레임의 값만 보여짐</li>
<li><strong>변수명.describe()</strong>  : 데이터프레임의 기술통계 정보확인</li>
</ul>
<hr>
<h2 id="데이터-선택">데이터 선택</h2>
<blockquote>
</blockquote>
<ul>
<li><strong>데이터변수명 [&quot;컬럼이름&quot;]</strong>
그 컬럼 내용이 인덱스와 함께 나옴
그러나 나오는건 Series 형태로 나옴!<blockquote>
</blockquote>
</li>
<li>*<em>데이터변수명.컬럼이름 *</em>
컬럼이름이 문자열일때 이렇게 조회 가능 (숫자는 안됌)<blockquote>
</blockquote>
</li>
<li><strong>데이터변수명[ [&quot;A&quot;, &quot;B&quot;] ]</strong>
2개 이상의 컬럼 선택 시는 리스트 형태로<blockquote>
</blockquote>
</li>
<li>** offset index**
[n:m] : n부터 m-1까지 선택
인덱스나 컬럼의 이름으로 slice 하는 경우 끝을 포함합니다<blockquote>
</blockquote>
</li>
<li><strong>df.loc[:, [&quot;A&quot;, &quot;B&quot;]]</strong>
모든 자료 a,b행만 보여줘 적은 데이터는 Series로 보여줌<blockquote>
</blockquote>
</li>
<li><strong>df.iloc[인덱스,열]</strong>
iloc : inter location
컴퓨터가 인식하는 인덱스 값으로 선택
e.g&gt;
df.iloc[3] 
컴퓨터가 인식한 3번째 인덱스의 값을 보여줌
df.iloc[3:5, 0:2]
행 3<del>4, 열 0</del>1번째 데이터 출력됌
df.iloc[[1,2,4],[0,2]]
행 1,2,4 / 열 0,2 데이터 출력</li>
</ul>
<hr>
<h2 id="데이터-추가">데이터 추가</h2>
<p><strong>병합 전 두 데이터를 살펴보며 추가할 데이터가 있는지 본다.</strong></p>
<p>필요한 데이터를 추가작업함.</p>
<blockquote>
</blockquote>
<h4 id="딕셔너리-안의-리스트-형태--열-값-기준으로-들어감-">딕셔너리 안의 리스트 형태 ( 열 값 기준으로 들어감 )</h4>
<pre><code class="language-python">left = pd.DataFrame({
    &quot;key&quot; : [&quot;K0&quot;,&quot;k4&quot;,&quot;K2&quot;,&quot;k3&quot;],
    &quot;A&quot; : [&quot;A0&quot;,&quot;A1&quot;,&quot;A2&quot;,&quot;A3&quot;],
    &quot;B&quot; : [&quot;B0&quot;,&quot;B1&quot;,&quot;B2&quot;,&quot;B3&quot;]
})
left</code></pre>
<blockquote>
</blockquote>
<h4 id="리스트-안의-딕셔너리-형태--행-하나씩-">리스트 안의 딕셔너리 형태 ( 행 하나씩 )</h4>
<pre><code class="language-python">pd.DataFrame([
    {&quot;key&quot;:&quot;k0&quot;,&quot;C&quot;:&quot;C0&quot;,&quot;D&quot;:&quot;D0&quot;},
    {&quot;key&quot;:&quot;k1&quot;,&quot;C&quot;:&quot;C0&quot;,&quot;D&quot;:&quot;D0&quot;},
    {&quot;key&quot;:&quot;k2&quot;,&quot;C&quot;:&quot;C0&quot;,&quot;D&quot;:&quot;D0&quot;},
    {&quot;key&quot;:&quot;k2&quot;,&quot;C&quot;:&quot;C0&quot;,&quot;D&quot;:&quot;D0&quot;}
])</code></pre>
<p>이번 CCTV 작업에서는 cctv의 최근 증가율을 추가함</p>
<pre><code class="language-python">CCTV_seoul[&quot;최근 증가율&quot;] = (
    (CCTV_seoul[&quot;2016년&quot;] +
    CCTV_seoul[&quot;2015년&quot;] + 
    CCTV_seoul[&quot;2014년&quot;]) / CCTV_seoul[&quot;2013년도 이전&quot;] * 100 
)
CCTV_seoul.sort_values(by=&quot;최근 증가율&quot;, ascending=False).head()</code></pre>
<hr>
<h2 id="데이터-정렬">데이터 정렬</h2>
<blockquote>
</blockquote>
<p><strong>데이터변수명.sort_values(by=&quot;기준&quot;, ascending=True)</strong>
데이터 정렬 True면 오름차순, False면 내림차순</p>
<p>데이터 정렬하며 삭제할 것, 삭제하고 데이터를 정리한다.</p>
<p>pop_seoul.drop([0], axis = 0) 로 cctv 데이터와 행 열수 맞춰줌
만약 행이라면 pop_seoul.drop([&quot;구별&quot;], axis = 1)</p>
<blockquote>
<p><strong>pop_seoul[&quot;구별&quot;].unique()</strong>
중복값 제외하고 한번씩만 출력하기</p>
</blockquote>
<p><strong>len(pop_seoul[&quot;구별&quot;].unique())</strong>
데이터 양 확인</p>
<hr>
<h2 id="병합">병합</h2>
<p>병합 전 두 데이터 Data Frame 잘 맞춰주기</p>
<p><strong>병합 전 두 데이터의 key가 될 부분을 정하고 그 컬럼을 기준으로 병합!</strong></p>
<p>how를 지정하면 그 기준으로 지정 안한 데이트를 병합함 
( 지정한 데이터는 다 가져오고 다른 데이터는 왼쪽에 없는 자료면 NaN 직혀버림)</p>
<blockquote>
</blockquote>
<h4 id="pandas에서-데이터프레임을-병합하는-방법">Pandas에서 데이터프레임을 병합하는 방법</h4>
<ul>
<li>pd.concat()</li>
<li>pd.merge()</li>
<li>pd.join()<blockquote>
</blockquote>
<h4 id="pandas에서-데이터프레임을-병합하는-방법-1">Pandas에서 데이터프레임을 병합하는 방법</h4>
</li>
<li>pd.concat()</li>
<li>pd.merge()</li>
<li>pd.join()</li>
</ul>
<blockquote>
</blockquote>
<p><strong>pd.merge(left,right,on=&quot;key&quot;)</strong></p>
<blockquote>
</blockquote>
<p>how 값을 안쓰면 공통의 데이터가 나옴. 디폴트값 how=&quot;inner&quot;
반대의 값은 how=&quot;outer&quot; 합집합, 모든 데이터 나옴</p>
<blockquote>
<p>pd.merge(left,right,how=&quot;left&quot;,on=&quot;key&quot;)</p>
</blockquote>
<p>left 기준으로 표 보임.
right가 없는 값음 NaN처리되고
left가 없는건 걍 짤림</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[EDA_000_환경설정]]></title>
            <link>https://velog.io/@auden_9/EDA000%ED%99%98%EA%B2%BD%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@auden_9/EDA000%ED%99%98%EA%B2%BD%EC%84%A4%EC%A0%95</guid>
            <pubDate>Wed, 22 Feb 2023 08:21:02 GMT</pubDate>
            <description><![CDATA[<h2 id="미니콘다">미니콘다</h2>
<p>미니콘다 - 파이선3.8기준으로 설치
설치 후 <strong>Anaconda Prompt (miniconda3)</strong> 실행</p>
<blockquote>
<p>1.　
conda env list 친 후 뜨는 거 확인
conda --version 으로 버전 확인
conda update conda 해서 최신 버전으로 유지하는게 좋음</p>
</blockquote>
<p>conda create -n ds_study python=3.8
(우리 배우는 콘다의 버젼 정함)</p>
<blockquote>
<p>2.　
conda activate ds_study 
앞에 (base)가 (ds_study)로 바뀜 (가상환경 활성화)</p>
</blockquote>
<p>만약 가상환경 삭제하고 싶다면
conda env remove -n ds_study 이런식으로 하면됌.</p>
<p>본 강의는 항상!! ds_study 모드에서함!</p>
<hr>
<h2 id="jupyter-notebook-및-패키지-설치">Jupyter NoteBook 및 패키지 설치</h2>
<p><strong>conda install jupyter</strong> 하면 주피터 설치됌.</p>
<blockquote>
<p>1.　
그 이후에
conda install ipython
conda install matplotlib
conda install seaborn
conda install pandas
conda install sklearn
conda install xlrd</p>
</blockquote>
<p>y 미리 누르고 싶으면
conda install -y 프로그램이름 써도 됌</p>
<blockquote>
<p>2.　
설치 이후
jupyter notebook 치면 사이트 나오면 성공!
그러고 맨 오른쪽 상단에 New 누르고 python3누르면 됌</p>
</blockquote>
<p><strong>import this 적고 shift + enter 눌러서 작동하면 성공!</strong></p>
<hr>
<h3 id="matplotlib-한글설정-그래프-시각화-라이브러리">matplotlib 한글설정! (그래프 시각화 라이브러리)</h3>
<blockquote>
<p>1.　
from matplotlib import font_manager
f_path = &#39;C:\WINDOWS\FONTS\MALGUNSL.TTF&#39;
font_manager.FontProperties(fname=f_path).get_name()</p>
</blockquote>
<p>from matplotlib import rc
rc(&#39;font&#39;, family = &#39;Arial Unicode MS&#39;)</p>
<blockquote>
<p>2.　
그 다음 다시
import matplotlib.pyplot as plt
from matplotlib import rc
%matplotlib inline
rc(&#39;font&#39;, family=&#39;Malgun Gothic&#39;)</p>
</blockquote>
<p>치고 엔터 다음줄에
plt.title(&quot;데이터 사이언스&quot;)</p>
<p>esc키 누르고 b 누르면 밑에 줄 생김</p>
<blockquote>
<p>3.　
주피터 노트북 실행 시 
<strong>import matplotlib.pyplot as plt
from matplotlib import rc
%matplotlib inline
rc(&#39;font&#39;, family=&#39;Malgun Gothic&#39;)</strong></p>
</blockquote>
<p><strong>plt.title(&quot;데이터 사이언스&quot;)</strong></p>
<p>이 두줄은 필수 실행을 해야 한글이 제대로 출력됌★★</p>
<hr>
<h2 id="vs코드">VS코드</h2>
<p><strong>아나콘다 프롬프트에 code 쳐서 vs코드 나오면 설치 완료된거임.</strong></p>
<blockquote>
<p>1.　
vscode에 파이썬 설치 후 
test.ipnb와
test.py 만들기</p>
</blockquote>
<blockquote>
<p>2.　
vscode
ctrl + shift + p
select interpreter 검색 후 python:select interpreter 선택
python 3.8.10 64-bit (&#39;ds_study&#39;:conda)선택</p>
</blockquote>
<blockquote>
<p>3.　
test.ipnb 코드 작성 후 shif+enter 작동 확인
test.py 코드 작성 후 ctrl+f5 작동확인</p>
</blockquote>
<hr>
<h2 id="colaboratory-환경설정">Colaboratory 환경설정</h2>
<p>google colaboratory 사용하기</p>
<blockquote>
<p>1.　
<a href="http://colab.research.google.com">http://colab.research.google.com</a> 접속
파일 -  새 노트
print(&quot;hello world!&quot;) shift + enter</p>
</blockquote>
<p>런타임 메뉴
모두 실행 - 코드 전부 다 실행
실행 중단 - 무한루프 빠질 때와 같이 멈춰야할때
런타임 다시 시작 - 초기화됨</p>
<p>도구
명령팔레트 - 모든 출력 지우기
(코드의 결과값만 모두 삭제됌)</p>
<blockquote>
<p><strong>colab 한글설정</strong></p>
<p>2.　</p>
</blockquote>
<p>설정 후 껐다 켜야함...
colab은 매번 한글설정 해야함
!apt-get update -qq
!apt-get install fonts-nanum* -qq
실행</p>
<blockquote>
</blockquote>
<p>import matplotlib.pyplot as plt
import matplotlib as mpl
%matplotlib inline</p>
<blockquote>
</blockquote>
<p>plt.rcParams[&#39;axes.unicode_minus&#39;] = False</p>
<blockquote>
</blockquote>
<p>path = &#39;/usr/share/fonts/truetype/nanum/NanumGothic.ttf&#39;
font_name = mpl.font_manager.FontProperties(fname=path).get_name()
mpl.rc(&#39;font&#39;,family=font_name)
mpl.font_manager._rebuild()
실행</p>
<blockquote>
</blockquote>
<p>plt.title(&quot;데이터 사이언스&quot;)</p>
<blockquote>
</blockquote>
<p>colaboratory 문서화 작업</p>
<p>목차 - 섹션 - 작업창이 만들어짐 
아니면 위에 텍스트를 눌러도됌
아니면 경계선에 코드 or 텍스트 추가 가능</p>
<p>텍스트는 벨로그 마냥
#제목1
##제목2
###제목3 등으로 보일 수 있음
html태그를 써서 링크를 걸수 있고 그럼..ㅋ</p>
<p>구글 드라이브 연동
연동 안하면 12시간 이후 사라짐
코랩에 폴더 모양 </p>
<p>*<em>from google.colab import drive
drive.mount(&#39;/content/drive&#39;)
*</em></p>
<h1 id="💬-코멘트">💬 코멘트</h1>
<p>대망의 코딩테스트의 날.... 하노이.....
EDA 환경설정은 생각보다 재밌었다 같은 파이썬 기반임에도 툴이 달라진다고 다른 공부를 하는 것마냥 설레고 재밌었다
또한 개념을 꽉 잡으려했던 이제까지의 공부법과 달리 배울 양이 많으니 실습을 통해 
문맥의 흐름을 이해하고 어려운 단어는 추후 다시 공부하는 태도로 임해달라는 것도 이해가 가면서도 정말 마음을 놓으면 안되겠구나 느꼈다. 테스트는 기일까지..하나라도 더 풀 수 있을까..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬_알고리즘_008 문제풀이2]]></title>
            <link>https://velog.io/@auden_9/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98008-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B42</link>
            <guid>https://velog.io/@auden_9/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98008-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B42</guid>
            <pubDate>Tue, 21 Feb 2023 06:57:26 GMT</pubDate>
            <description><![CDATA[<h1 id="👀-다시보기">👀 다시보기</h1>
<h3 id="근사값-딕셔너리에-들어있는-값을-비교">근사값 (딕셔너리에 들어있는 값을 비교)</h3>
<blockquote>
<pre><code class="language-python">class NearAlgorithm:
    def __init__(self,d):
        self.temps = {0:24, 5:22, 10:20, 15:16, 20:13, 25:10, 30:6}
        self.depth = d
        self.nearNum = 0
        self.minNum = 24
</code></pre>
</blockquote>
<pre><code>def getNearNumbers(self):</code></pre><blockquote>
</blockquote>
<pre><code>    for n in self.temps.keys():
        absNum = abs(n-self.depth)
        if absNum &lt; self.minNum:
            self.minNum = absNum
            self.nearNum = n</code></pre><blockquote>
</blockquote>
<pre><code>    return self.temps[self.nearNum]</code></pre><pre><code>&gt;
&gt;1 \__init__메서드 속성값으로 수온을 깊이대비 수온을 딕셔너리로 넣고,
 &gt;  비교치가 될 최저값은 가장 높은 온도인 24도로 설정.
&gt;
2. for문에 키값을 돌려 깊이(키 값) - 입력깊이를 뺀 값을 절대값으로 구해줌
&gt;
3. 그 절대값이 minNum보다 적으면 가장 적은차이임으로 nearNum에 할당
&gt;
4. nearNum을 인덱스값으로 temps[nearNum]으로 value값인 온도를 뽑아줌!

---

BMI = 몸무게 / 키^2
### BMI 구하기 코드
&gt;```python
class BmiAlgorithm:
    def __init__(self,w,h):
        self.BMISection = {18.5:[&#39;저체중&#39;,&#39;정상&#39;],
                           23:[&#39;정상&#39;,&#39;과체중&#39;],
                           25:[&#39;과체중&#39;,&#39;비만&#39;]}
        self.userWeight = w
        self.userHeight= h
        self.userBMI = 0
        self.userCondition = &#39;&#39;
        self.nearNum = 0
        self.minNum = 25</code></pre><blockquote>
</blockquote>
<p>__init__매서드에는</p>
<ol>
<li>BMI section을 딕셔너리로 담음. 범위는 값으로서 리스트로 2개씩 문자열로 담음.</li>
<li>bmi section, 받는 값인 사용자 무게,키
그리고 구할 값인 bmi,사용자의 bmi섹션에 해당하는 값, 근사치, 비교대상인 최저값<blockquote>
<pre><code class="language-python"> def calculatorBMI(self):
     self.userBMI = round(self.userWeight / (self.userHeight * self.userHeight),2)
     print(f&#39;self.user BMI : {self.userBMI}&#39;)</code></pre>
</blockquote>
<pre><code>&gt;
bmi 구하기
&gt;```python
 def printUserCondition(self):
&gt;
     for n in self.BMISection.keys():
         absNum = abs(n - self.userBMI)
         if absNum &lt; self.minNum:
             self.minNum = absNum
             self.nearNum = n
&gt;
     print(f&#39;근사치 : {self.nearNum}&#39;)
&gt;
     if self.userBMI &lt;= self.nearNum:
         self.userCondition = self.BMISection[self.nearNum][0]
     else:
         self.userCondition = self.BMISection[self.nearNum][1]
&gt;
     print(f&#39;self.userCondition : {self.userCondition}&#39;)</code></pre><blockquote>
<p>★★ 요게 가장 핵심</p>
</blockquote>
</li>
<li>bmi섹션의 키값인 기준치랑 근사값 비교해줄 miNum과의 차이에 절대값</li>
<li>절대값이 적을 시 minNum 할당하여 nearNum 구하기 
+ 더 나아가
사용자 bmi가 근사치보다 적을 시</li>
</ol>
<p>-&gt; 섹션 값 앞값을 내보냄.  self.BMISection[self.nearNum][0]
근사치보다 클시
-&gt; 섹션 값 뒷값을 내보냄 self.BMISection[self.nearNum][1]</p>
<hr>
<h3 id="근사값">근사값</h3>
<blockquote>
<pre><code class="language-python">def setAlignScore(self):
    nearIdx = 0
    minNum = 10.0
</code></pre>
</blockquote>
<pre><code>for i, s in enumerate(self.currentScores):
    absNum = abs(self.newScore - s)</code></pre><blockquote>
</blockquote>
<pre><code>    if absNum &lt; minNum:
        minNum = absNum
        nearIdx = i</code></pre><pre><code>1. 구할 값인 nearIdx, 구할 때 기준이되고 도와줄 minNum 초기화
(여기서 minNum은 차이가 가장 적은 값을 가져와야하기에, 최대값을 넣어야한다. 그래야 minNum보다 차이가 다들 작아진다.)
&gt;
2. 구할 데이터 for문에 enumerate로 돌리기.
3. absNum에 근사치 찾을 값과 s(self.currentScores의 데이터,값)을 빼고 절대값처리.
4. 그게 minNum보다 작으면 minNum 새로 담아주고, nearIdx는 그 값의 i(인덱스자리)가 됌.


---
### 근사치 사이에 숫자 삽입

&gt;
    if self.newScore &gt;= self.currentScores[nearIdx]:
        for i in range(len(self.currentScores)-1),nearIdx,-1):
            self.currentScores[i] = self.currentScores[i-1]
        self.currentScores[nearIdx] = self.newScore
&gt;
    else:
        for i in range(len(self.currentScores)-1),nearIdx+1,-1):
            self.currentScores[i] = self.currentScores[i-1]
        self.currentScores[nearIdx+1] = self.newScore




---
**재귀함수**

&gt;```python
sales = [1200,1300,12500,11000,10500,98000,91000,91500,10500,11500,12000,12500]
&gt;
def salesUpAndDown(ss):
    print(f&#39;sales : {ss}&#39;)
    if len(sales) == 1:
        return ss
&gt;
    currentSales = ss.pop(0)
    nextSales = ss[0]
    increase = nextSales - currentSales
    if increase &gt; 0:
        increase = &#39;+&#39; + str(increase)
&gt;
    print(f&#39;매출 증감액 : {increase}&#39;)
&gt;
    return salesUpAndDown(ss)</code></pre><blockquote>
</blockquote>
<ol>
<li>가격을 받아서 길이가 1이면 비교할게 없기때문에 retrun</li>
<li>그 외에는 현재 가격에 가격에 첫번째 값을 pop으로 자르고 currentSales의 담음
 → next sales의 잘린 전체가격의 첫번째 인덱스 호출
 → increase에 nextSales에 currentSale를 뺀 값을 넣기
 → 만약 increase가 0보다 크다면 increase는 문자 +와 increase(데이터형 변환)</li>
<li>return 으로 마무리</li>
</ol>
<h1 id="💬-코멘트">💬 코멘트</h1>
<p>알고리즘의 대장정 마무리.
진짜 어려웠다가 컴퓨터 붙잡고 여기저기 검색하고
공부 범위 나눠서 조절해서 공부하고
이제 아주 조큼 이해가고 코드가 보이려는데 다음 진도가 기다리고있다...ㅎ...
내일 테스트를 앞두고 좀 어려웠던 부분, 몇가지 더 따라해봐야겠다..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 알고리즘_007 문제풀이]]></title>
            <link>https://velog.io/@auden_9/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98007-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4</link>
            <guid>https://velog.io/@auden_9/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98007-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4</guid>
            <pubDate>Mon, 20 Feb 2023 10:48:53 GMT</pubDate>
            <description><![CDATA[<h1 id="👀-다시보기">👀 다시보기</h1>
<h3 id="선형검색">선형검색</h3>
<blockquote>
</blockquote>
<pre><code>n = 0
while True:
    if n == len(ns):
        print(&#39;search Fail!!&#39;)
        break</code></pre><blockquote>
</blockquote>
<pre><code>    if ns[n] == sn:
        searchResultIdx = n
        print(&#39;search Success!&#39;)
        print(f&#39;searchResultIdx : {searchResultIdx}&#39;)
        break</code></pre><blockquote>
<ul>
<li><strong>추가 (보초법)</strong></li>
</ul>
</blockquote>
<pre><code class="language-python">def serachBinary(ns,sn):
    searchIdx = -1
    ns.append(sn)
&gt;
    n = 0
    while True:
        if ns[n] == sn:
            if n != len(ns)-1:
                searchIdx = n
            break
&gt;
        n += 1
&gt;
    return searchIdx</code></pre>
<hr>
<h3 id="이진검색-while문-조건부">이진검색 while문 조건부</h3>
<blockquote>
</blockquote>
<p> while sn &gt;= ns[0] and sn &lt;= ns[len(ns)-1]:</p>
<blockquote>
</blockquote>
<p>시작 인덱스와 끝 인덱스가 같을지 무한루프 방지</p>
<blockquote>
</blockquote>
<pre><code>    if starIdx + 1 == endIdx:
        if ns[starIdx] != sn and ns[endIdx] != sn:break</code></pre><hr>
<h3 id="순위를-정하고-순위별로-sort">순위를 정하고 순위별로 sort</h3>
<blockquote>
<pre><code class="language-python">def rankAlgorithm(ns):
    ranks = [0 for i in range(len(ns))]
    for idx, n1 in enumerate(ns):
        for n2 in ns:
            if n1 &lt; n2:
                ranks[idx] += 1
</code></pre>
</blockquote>
<pre><code>print(f&#39;nums : {ns}&#39;)
print(f&#39;순위 : {ranks}&#39;)</code></pre><blockquote>
</blockquote>
<pre><code>for i, n in enumerate(ns):
    print(f&#39;num : {n} \t rank : {ranks[i]+1}&#39;)</code></pre><blockquote>
</blockquote>
<pre><code>sortedNums = [0 for n in range(len(ns))]</code></pre><blockquote>
</blockquote>
<pre><code>for idx, rank in enumerate(ranks):
    sortedNums[rank] = ns[idx]</code></pre><blockquote>
</blockquote>
<pre><code>return sortedNums</code></pre><blockquote>
<p><strong>순위에 맞게 ns의 값을 보내는 것...!</strong>
    for idx, rank in enumerate(ranks):
        sortedNums[rank] = ns[idx]</p>
</blockquote>
<hr>
<h3 id="버블정렬-기본">버블정렬 (기본)</h3>
<blockquote>
</blockquote>
<pre><code class="language-python">for i in range(length):
   for j in range(length-i):
        if cns[j] &gt; cns[j+1]:
            cns[j],cns[j+1] = cns[j+1],cns[j]



---

### 삽입정렬 (기본)

&gt;```python
for i1 in range(1, len(c_ns)):
    i2 = i1 -1
    cNum = c_ns[i1]
&gt;
    while c_ns[i2] &gt; cNum and i2 &gt;= 0:
        c_ns[i2+1] = c_ns[i2]
        i2 -= 1
    c_ns[i2+1] = cNum



---

### 선택 정렬 (기본)
&gt;```python
for i in range(len(c_ns)-1):
    minIdx = i
    for j in range(i+1,len(c_ns)):
        if c_ns[minIdx] &gt; c_ns[j]:
            minIdx = j
&gt;
    c_ns[i],c_ns[minIdx] = c_ns[minIdx],c_ns[i]



---
### 병합정렬 (기본)


&gt;```python
    if len(cns) &lt; 2:
        return cns
&gt;
    midIdx = cns(ns) // 2
    leftNums = sort(cns[0:midIdx])
    rightNums = sort(cns[midIdx:])
&gt;
    mergedNums = []
    leftIdx = 0; rightIdx = 0
    while leftIdx &lt; len(leftNums) and rightIdx &lt; len(rightNums):
        if leftNums[leftIdx] &lt; rightNums[rightIdx]:
            mergedNums.append(leftNums[leftIdx])
            leftIdx += 1
&gt;
        else:
            mergedNums.append(rightNums[rightIdx])
            rightIdx += 1
&gt;
    mergedNums = mergedNums + leftNums[leftIdx:]
    mergedNums = mergedNums + rightNums[rightIdx:]
&gt;
    return mergedNums
&gt; ```
재귀이기에 if 조건!
while문 조건부...!
while leftIdx &lt; len(leftNums) and rightIdx &lt; len(rightNums):
&gt;
재귀의 논리값은 asc=asc ★

---

### 최대값에서 빈도수 추가
&gt;```python
class MaxAlgorithm:
    def __init__(self,ns):
        self.nums = ns
        self.maxNum = 0
        self.maxNumCnt = 0
&gt;
    def setMaxNum(self):
        self.maxNum = 0
&gt;
        for n in self.nums:
            if self.maxNum &lt; n:
                self.maxNum = n
&gt;
        return self.maxNum
&gt;
    def getMaxNum(self):
        self.setMaxNum()
        return self.maxNum
&gt;
    def setMaxNumCnt(self):
        self.setMaxNum()
        for n in self.nums:
            if self.maxNum == n:
                self.maxNumCnt += 1
&gt;
    def getMaxNumCnt(self):
        self.setMaxNumCnt()
        return self.maxNumCnt
&gt;

---
&gt;**중복 허용 난수**
```python
    for n in range(30):
        nums.append(random.randint(1,50))

---

&gt;**가뿐히 끝낸 최대값 편차구하기.**
```python
def getDeviation(n1,n2):
    return abs(n1-n2)</code></pre>
<hr>
<h3 id="최대최소값-한번에-거르는-함수">최대,최소값 한번에 거르는 함수</h3>
<blockquote>
<pre><code class="language-python">def getMaxNin(ns,maxFlag=True):
    result = ns[0]
</code></pre>
</blockquote>
<pre><code>for n in ns:
    if maxFlag:
        if result &lt; n:
            result = n
    else:
        if result &gt; n:
            result = n</code></pre><blockquote>
</blockquote>
<pre><code>return result</code></pre><pre><code>&gt;
&gt;인수도 다르게 넣어야함
최대값이다** getMaxNin(scores) or getMaxNin(scores,maxFlag=True)**
최소값이다 **getMaxNin(scores,maxFlag=False)**

---

### **총합, 평균, 편차, 최대값, 최소값 한번에 끝내기**

&gt;```python
class ScoreManagement:
    def __init__(self,ss):
        self.scores = ss
        self.score_tot = 0
        self.score_avg = 0
        self.score_min = 0
        self.score_max = 0
&gt;
    def getMinScore(self):
        if self.scores == None or len(self.scores) == 0:
            return None
&gt;
        self.score_min = self.scores[0]
        for score in self.scores:
            if self.score_min &gt; score:
                self.score_min = score
&gt;
        return self.score_min
&gt;
    def getMaxScore(self):
        if self.scores == None or len(self.scores) == 0:
            return None
&gt;
        self.score_max = self.scores[0]
        for score in self.scores:
            if self.score_max &lt; score:
                self.score_max = score
&gt;
        return self.score_max
&gt;
    def getTotalScore(self):
        if self.scores == None or len(self.scores) == 0:
            return None
&gt;
        self.score_tot = 0
        for score in self.scores:
            self.score_tot += score
&gt;
        return self.score_tot
&gt;
    def getAvgScore(self):
        if self.scores == None or len(self.scores) == 0:
            return None
&gt;
        self.score_avg = round(self.score_tot / len(self.scores),2)
        return self.score_avg
&gt;
    def getMaxDeviation(self):
        result = abs(self.getAvgScore() - self.score_max)
&gt;
        return round(result,2)
&gt;
    def getMixDeviation(self):
        result = abs(self.getAvgScore() - self.score_min)
&gt;
        return round(result,2)</code></pre><p>변형해야하는 인수가 없어 초기화가 안되었을 경우</p>
<blockquote>
</blockquote>
<pre><code>    if self.scores == None or len(self.scores) == 0:
        return None</code></pre><hr>
<h3 id="최빈값">최빈값</h3>
<blockquote>
<pre><code class="language-python">def printAges(self):
    n = 1
    while True:
        maxAlo = maxMod3.MaxAlgorithm(self.idexes)
        maxAlo.setMaxIdxAndNum()
        maxNum = maxAlo.getMaxNum()
        maxNumIdx = maxAlo.getMaxIdx()
</code></pre>
</blockquote>
<pre><code>    if maxNum == 0:
           break</code></pre><blockquote>
</blockquote>
<pre><code>   print(f&#39;{n:0&gt;3} {maxNumIdx}세 빈도수 : {maxNum}\t&#39;, end=&#39;&#39;)
   print(&#39;*&#39;*maxNum)
   self.idexes[maxNumIdx] = 0</code></pre><blockquote>
</blockquote>
<pre><code>   n += 1</code></pre><p>```</p>
<blockquote>
</blockquote>
<p>가장 최대값을 비워줘서 그 다음 순서 오게끔 만드는 코드...★ 
활용도가 좋을거같다.</p>
<blockquote>
</blockquote>
<p>n:0&gt;3
출력 숫자 셋팅</p>
<h1 id="💬-코멘트">💬 코멘트</h1>
<p>늘 흥미롭지만 힘든 문제풀이의 날!
그래도 개념을 위해 좀 반복한 부분이 있어서 다른 때보다는 수월했지만..
그래도 어려운건 사실이여서 강의도 듣고 중간에 팀스터디도 하다보니 체력소진이 좀 되어 일부분 못들었다. 코딩테스트 앞두고...긴장감도 더해져 전략상 2강은 내일로 미루고
오늘 학습한 코딩 다시 필사의 길로</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬_알고리즘_006 최대값-하노이탑]]></title>
            <link>https://velog.io/@auden_9/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98006-%EC%B5%9C%EB%8C%80%EA%B0%92-%ED%95%98%EB%85%B8%EC%9D%B4%ED%83%91</link>
            <guid>https://velog.io/@auden_9/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98006-%EC%B5%9C%EB%8C%80%EA%B0%92-%ED%95%98%EB%85%B8%EC%9D%B4%ED%83%91</guid>
            <pubDate>Sun, 19 Feb 2023 09:15:05 GMT</pubDate>
            <description><![CDATA[<h1 id="최대값">최대값</h1>
<p>자료구조에서 가장 큰 값을 찾는다.
<strong>maxNum이라는 변수를 첫번째 데이터를 넣어</strong> for문으로 계속 비교하며 찾기</p>
<p>코드쓰고</p>
<blockquote>
</blockquote>
<pre><code class="language-python">class MaxAlgorithm:
&gt;
    def __init__(self, ns):
        self.nums = ns
        self.maxNum = 0
&gt;
    def getMaxNum(self):
        self.maxNum = self.nums[0]
&gt;
        for n in self.nums:
            if self.maxNum &lt; n:
                self.maxNum = n
&gt;
        return self.maxNum;
&gt;
ma = MaxAlgorithm([-2, -4, 5, 7, 10, 0, 8, 20, -11])
maxNum = ma.getMaxNum()
print(f&#39;maxNum: {maxNum}&#39;)</code></pre>
<blockquote>
<p>이 코드에서 변형된게 최소 값, 활용한게 최빈값이니
잘 알아두자!</p>
</blockquote>
<hr>
<h1 id="최소값">최소값</h1>
<p>자료구저에서 가장 작은 값을 찾는 것.
minNum이라는 변수를 첫번째 데이터를 넣어 for문으로 계속 비교하며 찾기</p>
<blockquote>
<p>라진 점은
담는 변수가 miNum이라는 것
그리고 판별하는 등호가 최대값
if self.maxNum &lt; n: 에서
if self.minNum &gt; n: 이라는 것외엔 동일!</p>
</blockquote>
<hr>
<h1 id="최빈값">최빈값</h1>
<p>빈도가 가장 잦은 데이터를 찾아보자!</p>
<blockquote>
<p>최대값 maxNum만 할당하는 데서 <strong>enumerate를 이용해서 index와 값을 나눔</strong>.
그러면서 index도  변수로 담아서  </p>
</blockquote>
<ol>
<li>최대값을 찾는다</li>
<li>최대값의 갯수만큼 0을 담은 indexes변수를 만든다</li>
<li>indexes에 나온 숫자에 자리에 +1이 쌓이게끔 for을 돌린다.<pre><code class="language-python">for n in nums:
 indexes[n] = indexes[n] + 1</code></pre>
</li>
<li>반대로 최대값을 만든 객체에 indexes를 보내 maxNum을 활용해 어떤 숫자인지 찾음</li>
</ol>
<p><strong>자리수는 maxIdx(자리 값이 곧 숫자)를 호출, 
빈도수는 maxNum(쌓인 포인트만큼이 빈도수)을 호출</strong></p>
<blockquote>
</blockquote>
<p>해서 최대값을 2번 호출하여 사용하기에 class를 만들어 활용한다.</p>
<pre><code class="language-python">class MaxAlgorithm:
    def __init__(self,ns):
        self.nums = ns
        self.maxNum = 0
        self.maxNumIdx = 0
&gt;
    def setMaxIdxAndNum(self):
        self.maxNum = self.nums[0]
        self.maxNumIdx = 0
&gt;
        for i, n in enumerate(self.nums):
            if self.maxNum &lt; n :
                self.maxNum = n
 &gt;               self.maxNumIdx = i
&gt;
    def getMaxNum(self):
        return self.maxNum
&gt;
    def getMaxNumIdx(self):
        return self.maxNumIdx
&gt;
nums = [1, 3, 7, 6, 7, 7, 7, 12, 12, 17]
&gt;
maxAlo = MaxAlgorithm(nums)
maxAlo.setMaxIdxAndNum()
maxNum = maxAlo.getMaxNum()
print(f&#39;num의 최대값: {maxNum}&#39;)
&gt;
indexes = [0 for i in range(maxNum+1)]
&gt;
print(f&#39;indexes : {indexes}&#39;)
print(f&#39;indexes 길이 : {len(indexes)}&#39;)
&gt;
for n in nums:
    indexes[n] = indexes[n] + 1
print(f&#39;indexes : {indexes}&#39;)
&gt;
ma =MaxAlgorithm(indexes)
ma.setMaxIdxAndNum()
maxNum = ma.getMaxNum()
maxIdx = ma.maxNumIdx
&gt;
print(f&#39;따라서 {maxIdx}의 빈도수가 {maxNum}으로 가장 높다&#39;)</code></pre>
<p>결과 출력</p>
<blockquote>
</blockquote>
<img src="https://velog.velcdn.com/images/auden_9/post/42821a29-3726-48ec-afc2-34dddc344868/image.png">

<hr>
<h1 id="근사값">근사값</h1>
<p>가장 가까운 값을 찾자!** (차이가 적은 숫자 찾기)**
절대값이 작은 숫자</p>
<blockquote>
<pre><code class="language-python">import random
nums = random.sample(range(0,50),5)
print(f&#39;nums : {nums}&#39;)
inputNum = int(input(&#39;input number : &#39;))
print(f&#39;input number : {inputNum} &#39;)
</code></pre>
</blockquote>
<p>nearNum = 0
minNum = 50</p>
<blockquote>
</blockquote>
<p>for n in nums:
    absNum = abs(n - inputNum)
    print(f&#39;absNum : {absNum}&#39;)</p>
<blockquote>
</blockquote>
<pre><code>if absNum &lt; minNum:
    minNum = absNum
    nearNum = n</code></pre><blockquote>
<p>print(f&#39;{nearNum} 근사값이다.&#39;)</p>
</blockquote>
<pre><code>&gt;
결과 출력
&gt;
&lt;img src=&quot;https://velog.velcdn.com/images/auden_9/post/8d26b3e2-6ad5-4063-86cc-650f78d128cf/image.png&quot;&gt;
&gt;
**차이를 구하고 그 차이가 가장 적은 걸 최소값으로 담아 
최종 최소값의 자리번호인 n을 구함(근사값)**

---
# 평균

너무 자주 예제에서 썼던 평균
전체합
&gt;```python
for n in nums:
    nums += n
&gt;
total = 0
for n in nums:
    if n - int(n) == 0:
        total += n
        targetNums.append(n)</code></pre><p>++) 실수는 if 조건 안에 n - int(n) != 0: 으로 끝</p>
<hr>
<h1 id="재귀">재귀</h1>
<p>나 자신을 호출하자
<img src="https://velog.velcdn.com/images/auden_9/post/9dc02ebb-489d-49e8-9e6d-bed5defb716c/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>1 .팩토리얼</p>
<pre><code>def factorial(num):
    if num &gt; 0:
        return num * factorial(num-1)
    else:
        return 1
&gt;
print(f&#39;factorial(10) : {factorial(10)}&#39;)</code></pre><blockquote>
</blockquote>
<ol start="2">
<li>유클리드 호제법
1)  for문<pre><code>def greatestCommonDevide(n1,n2):
 maxNum = 0
 for i in range(1,(n1+1)):
     if n1 % i == 0 and n2 % i == 0:
         maxNum = i
&gt;
 return maxNum</code></pre>2) 재귀함수<pre><code>def gcd(n1, n2):
&gt;
 if n1 % n2 == 0:
     return n2
 else:
     return gcd(n2, n1 % n2)</code></pre></li>
</ol>
<hr>
<h2 id="하노이의-탑-재귀-활용">하노이의 탑 (재귀 활용)</h2>
<p>게임으로 많이 하던 하노이탑....
유튜브로도 복습하는데
매개변수를 계속 바꿔가며 이동을 하는데 쉽지않아서 당분간 매일 봐야할듯...</p>
<pre><code>def moveDisc(discCnt, fromBar, toBar, viaBar):                    # 원판 개수, 출발 기둥, 도착 기둥, 경유 기둥
    if discCnt == 1:
        print(f&#39;{discCnt}disc: {fromBar}에서 {toBar}(으)로 이동!&#39;)

    else:
        moveDisc(discCnt-1, fromBar, viaBar, toBar)              # (discNo-1)개들을 경유 기둥으로 이동
        print(f&#39;{discCnt}disc: {fromBar}에서 {toBar}(으)로 이동!&#39;) # discNo를 도착 기둥으로 이동
        moveDisc(discCnt-1, viaBar, toBar, fromBar)              # (discNo-1)개들을 도착 기둥으로 이동

moveDisc(3, 1, 3, 2)</code></pre><hr>
<h2 id="병합-정렬-재귀활용-2">병합 정렬 (재귀활용 2)</h2>
<p>자료구조를 분할하고 각각의 분할된 자료구조를 정렬한 후 다시 병합하여 정렬</p>
<p><strong>쪼개고 - 정렬 - 병합 - 다시 쪼개고 - 정렬 - 병합 (정렬이 끝날때 까지)</strong></p>
<blockquote>
<pre><code>def mSort(ns):
    if len(ns) &lt; 2:
        return ns
</code></pre></blockquote>
<pre><code># 분할
midIdx = len(ns) // 2
leftNums = mSort(ns[0:midIdx])
rightNums = mSort(ns[midIdx:len(ns)])</code></pre><blockquote>
</blockquote>
<pre><code>mergeNums = []
leftIdx = 0; rightIdx = 0
while leftIdx &lt; len(leftNums) and rightIdx &lt; len(rightNums):
    if leftNums[leftIdx] &lt; rightNums[rightIdx]:
        mergeNums.append(leftNums[leftIdx])
        leftIdx += 1</code></pre><blockquote>
</blockquote>
<pre><code>    else:
        mergeNums.append(rightNums[rightIdx])
        rightIdx += 1</code></pre><blockquote>
</blockquote>
<pre><code>mergeNums = mergeNums + leftNums[leftIdx:]
mergeNums = mergeNums + rightNums[rightIdx:]</code></pre><blockquote>
</blockquote>
<pre><code>return mergeNums</code></pre><blockquote>
</blockquote>
<p>nums = [8, 1, 4, 3, 2, 5, 10, 6]
print(mSort(nums))</p>
<pre><code>동작원리를 log를 찍어보면
&gt;
&lt;img src=&quot;https://velog.velcdn.com/images/auden_9/post/5ca0252d-1a7e-4304-8e57-041355537ab5/image.png&quot;&gt;



💡 응용문제서는 내림차순+ 오름차순
매개변수 asc=True값을주고 
재귀 호출될 시도 같은 값을 주기 위해
(인수, asc=asc)로 추가해줘야한다.
안그러면 한번 호출이면 기본값이 True로되어 숫자가 뒤섞임.


---
## 퀵정렬 (재귀 활용3)
기준보다 작은 값과 큰 값을 분리하다

&gt;
**1. 기준값 정함 (인덱스 가운데)
2. 그 다음 그 기준 기준으로 작냐 크냐 가름
3. 그 다음 왼쪽 그룹도 가운데 정해서 크고 작냐 거름 - 나뉠때 까지 반복 (재귀)**
&gt;
```Python
def qSort(ns):
&gt;
    if len(ns) &lt; 2:
        return ns
&gt;
    midIdx = len(ns) // 2
    midVal = ns[midIdx]
&gt;
    smallNums = []; sameNums = []; bigNums = []
&gt;
    for n in ns:
        if n &lt; midVal :
            smallNums.append(n)
        elif n == midVal:
            sameNums.append(n)
        else:
            bigNums.append(n)
&gt;
    return qSort(smallNums) + sameNums + qSort(bigNums)</code></pre><p>사이에 로그를 보기 위해서</p>
<blockquote>
</blockquote>
<pre><code>    print(f&#39;smallNums: {smallNums} &#39;)
    print(f&#39;sameNums: {sameNums} &#39;)
    print(f&#39;bigNums: {bigNums} &#39;)
    return qSort(smallNums) + sameNums + qSort(bigNums)
&gt;
nums= [8, 1, 4, 3, 2, 5, 4, 10, 8, 6]
&gt;
print(f&#39;퀵정렬: {qSort(nums)}&#39;)</code></pre><p>위에를 return 직전에 추가하여</p>
<blockquote>
</blockquote>
<p>출력 결과 보기</p>
<blockquote>
</blockquote>
<img src="https://velog.velcdn.com/images/auden_9/post/0cc7bb47-7a4e-46b8-8e3a-ade6a31bfafd/image.png">

<hr>
<h1 id="💬-코멘트">💬 코멘트</h1>
<p>...개념강의가 금방 끝난 재귀가 이렇게 눈덩이처럼 돌아올 줄이야.
병합정렬, 퀵정렬은 설명도 이해가 갔고 코드도 그리 어렵지 않게 받아들여졌다.
하노이탑....진짜 코드 배우기 이전에 재밌게하던 놀이가 코드로 오니까
지금 유튜브를 보고 ..아 조콤 알겠는데?? 하면서도 코드 다시보면 도루묵이라
이게 공부가 연계가 되고 그게 심화가 되니까 그냥 아 좀 알겠다로 넘길수가 없다..
계속 들여다보면 또 전체적인게 안보일 수 있으니 매일 좀 보며 익숙해지는 수 밖에 없을 것..같다.....</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬_알고리즘_005 정렬]]></title>
            <link>https://velog.io/@auden_9/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98005-%EC%A0%95%EB%A0%AC</link>
            <guid>https://velog.io/@auden_9/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98005-%EC%A0%95%EB%A0%AC</guid>
            <pubDate>Sat, 18 Feb 2023 08:47:14 GMT</pubDate>
            <description><![CDATA[<h1 id="정렬">정렬</h1>
<h2 id="버블정렬">버블정렬</h2>
<p>맨 앞에 있는 숫자부터 인접한 숫자와 비교하여 점점 뒤로 보내는 정렬
<strong>뒤에 정렬부터 완성된다.</strong></p>
<blockquote>
<pre><code class="language-python">nums = [10, 2, 7, 21, 0]
print(f&#39; not sorted nums: {nums}&#39;)
</code></pre>
</blockquote>
<p>length = len(nums)-1</p>
<blockquote>
</blockquote>
<p>for i in range(length):
    for j in range(length-i):
        if nums[j] &gt; nums[j+1]:
           nums[j], nums[j+1] = nums[j+1], nums[j]
        print(nums)</p>
<blockquote>
</blockquote>
<pre><code>print()</code></pre><blockquote>
</blockquote>
<p>print(f&#39;sorted num : {nums}&#39;)</p>
<p>가장 쉬웠던 개념 1:1로 비교해서 더 크면 뒷자리랑 자리바꾸기</p>
<hr>
<h2 id="삽입-정렬">삽입 정렬</h2>
<p>이미 정렬되어 있는 부분에** 내 위치를 찾아 들어가기!**
들어간 위치에서 앞에 있는 숫자들이랑 나를 비교하여 순서찾아감</p>
<blockquote>
<pre><code class="language-python">nums = [15,10,2,1,0]
</code></pre>
</blockquote>
<p>for i1 in range(1, len(nums)):
    i2 = i1 - 1
    cNum = nums[i1]</p>
<blockquote>
</blockquote>
<pre><code>while nums[i2] &gt; cNum and i2 &gt;=0 :
    nums[i2 + 1] = nums[i2]
    i2 -= 1</code></pre><blockquote>
</blockquote>
<pre><code>nums[i2 + 1] = cNum
print(f&#39;nums: {nums}&#39;)</code></pre><p>제일 이해가 늦었던 삽입정렬
버블정렬이랑 차이점을 몰라 헤멨는데
어디든 카드와 비유해서 설명이 되어있고 해도 이해 안가던걸 코드를 보면서
cNum을 어떠한 바가지라고 생각하고 크면 옮겨담는다고 계속 생각하면서 봤다.
그러자 이해가 점차 되었던 삽입정렬.
다른 정렬은 내 뒤에 숫자랑 비교한다면, 앞이랑 비교하니 더 헷갈렸던 것 같다.</p>
<hr>
<h2 id="선택정렬">선택정렬</h2>
<p>가장 작은 데이터를 찾아 자리 바꾸자..!</p>
<blockquote>
</blockquote>
<pre><code class="language-python">nums = [4,2,5,1,3]
print(f&#39;nums: {nums}&#39;)
&gt;
for i in range(len(nums)-1):
    minIdx = i
&gt;
    for j in range(i+1, len(nums)):
        if nums[minIdx] &gt; nums[j]:
            minIdx = j
&gt;
    nums[i],nums[minIdx] =  nums[minIdx],nums[i]
    print(f&#39;nums: {nums}&#39;)

print(f&#39;final nums: {nums}&#39;)


최소 값을 바가지(변수)에 담아 가장 작은 최소 값에 위치로 정렬.
첫번째 for문은 nums 안에 원소들의 반복
두번째 for문은 담아올 최소값을 비교하기 위한 반복
찾아오면 처음 i값과 최소값의 위치 바꿔치기

---

# 👀 다시보기


## 변수 바꿔 담기

&gt;
1)
```python
temp = nums[j]
nums[j] = nums[j+1]
nums[j+1] = temp</code></pre>
<blockquote>
</blockquote>
<p>2) </p>
<p>```python
nums[j], nums[j+1] = nums[j+1], nums[j]</p>
<h3 id="정렬-시-원본을-지키기-위해-기억해야하는-깊은-복사">정렬 시 원본을 지키기 위해 기억해야하는 깊은 복사</h3>
<blockquote>
</blockquote>
<p>1) 매개변수로 들어오자마자 복사</p>
<blockquote>
</blockquote>
<img src="https://velog.velcdn.com/images/auden_9/post/d7a1e1a8-6241-4768-9e03-46787307be79/image.png">
>
import copy 선언 후
def bubblesort(ns)에 매개변수 deepcopy=True 추가하고
ns 부분을 cns으로 고친다
>
**< 실행 파일 서의 추가방법 >**
>
<img src=https://velog.velcdn.com/images/auden_9/post/3a827b27-b4a8-4160-a8e9-71ebbb36136d/image.png">
>
인수 값에 깊은 복사를 원하면 원래대로 숫자만 보내고 싫으면
bb.bubbleSort(students, deepCopy=False)
라고 적어주면 된다.
>
2) 카피데이터를 인수로 보내기
>
<img src="https://velog.velcdn.com/images/auden_9/post/3232d2fa-12f3-4d3a-81f0-7734aa0142cf/image.png">
>
**import copy** 선언 후
복사하고 싶은 데이터 인수자리에
**copy.deepcopy(복사 하고싶은 데이터))**
>
>> **적용화면**
![](https://velog.velcdn.com/images/auden_9/post/4ec9e62e-2509-49fa-8473-547bf9fdefca/image.png)
- 오름차순을 거쳤어도 학생성적(본 데이터)은 그대로 유지되어있다.



<h1 id="💬-코멘트">💬 코멘트</h1>
<p>느꼈다. 요새 나에게 부족한건 절대적인 학습시간이라는거.
이제껏 했던 복습들이 더 시간을 들였어야 했다고 너무 느꼈다..</p>
<p>제로베이스에서 짜준 5시간이 짧다고 보이지만 깊은 학습까지는 +a 이다.
그리고 강의도 5시간이라 하지만 내가 이해하고 넘어가는 시간까지 하면 더 추가가 되고
복습은 다시 강의 듣는걸로 하는데 이걸로는 깊이있는 학습은 불가하다.
계속 째려보고 되짚어보고 검색을 통한 학습시간이 부족하다...................</p>
<p>그래서 주말에도 투자를 하고있는 실정인데, 개강OT서 나온 말처럼 아무래도 전공자의 4년을 축약하다보니 더 그런거겠지.. 
넋두리 이만큼 정리한거 토대로 다시 코드를 째려보고, 따라쓰고 해봐야겠다.....😂😂😂</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[검색 실습 (복기용)]]></title>
            <link>https://velog.io/@auden_9/%EA%B2%80%EC%83%89-%EC%8B%A4%EC%8A%B5-%EB%B3%B5%EA%B8%B0%EC%9A%A9</link>
            <guid>https://velog.io/@auden_9/%EA%B2%80%EC%83%89-%EC%8B%A4%EC%8A%B5-%EB%B3%B5%EA%B8%B0%EC%9A%A9</guid>
            <pubDate>Fri, 17 Feb 2023 07:47:36 GMT</pubDate>
            <description><![CDATA[<h1 id="선형검색">선형검색</h1>
<p><img src="https://velog.velcdn.com/images/auden_9/post/9b50b628-f9ea-48aa-a9cf-0e9b7e14adad/image.png" alt=""></p>
<img src="https://velog.velcdn.com/images/auden_9/post/e69787cc-268b-41c4-b3b0-ed68e3a05c86/image.png">


<h1 id="이진검색">이진검색</h1>
<p><img src="https://velog.velcdn.com/images/auden_9/post/3b2f4943-c379-4a73-8ccb-d39a5ed35245/image.png" alt=""></p>
<h1 id="순위검색">순위검색</h1>
<p><img src="https://velog.velcdn.com/images/auden_9/post/ad5ccdbc-e401-441c-a144-514e7c24508c/image.png" alt=""></p>
<h2 id="순서거르기-모듈">순서거르기 모듈</h2>
<p><img src="https://velog.velcdn.com/images/auden_9/post/f6917d92-8a5f-42a0-950a-574b42daa637/image.png" alt=""></p>
<h2 id="실행파일">실행파일</h2>
<img src="https://velog.velcdn.com/images/auden_9/post/f48f40a3-8158-48d9-bfa8-ab330776a85a/image.png">

]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬_알고리즘_004 검색]]></title>
            <link>https://velog.io/@auden_9/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98004-%EA%B2%80%EC%83%89</link>
            <guid>https://velog.io/@auden_9/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98004-%EA%B2%80%EC%83%89</guid>
            <pubDate>Fri, 17 Feb 2023 07:34:55 GMT</pubDate>
            <description><![CDATA[<h1 id="검색">검색</h1>
<h2 id="선형-검색">선형 검색</h2>
<p>말그대로 선형으로 나열되어 있는 <strong>데이터를 순차적으로 스캔하면서 원하는 값을 찾는다</strong>.
인덱스 0 부터 순차적으로 검색한다.</p>
<p><strong>검색 성공 or 검색 실패</strong></p>
<p><img src="https://velog.velcdn.com/images/auden_9/post/58937a4f-4115-4b2d-b3ec-69ee18e54623/image.png" alt=""></p>
<blockquote>
<p>&lt; 선형검색 기본코드&gt;</p>
</blockquote>
<pre><code class="language-python">datas = [3,2,5,7,9,1,0,8,6,4]
print(f&#39;datas: {datas}&#39;)
print(f&#39;datas length: {len(datas)}&#39;)
&gt;
searchData = int(input(&#39;찾으려는 숫자입력: &#39;))
searchResultIdx = -1
&gt;
n = 0
while True:
    if n == len(datas):
        searchResultIdx = -1
        break
&gt;
    if datas[n] == searchData:
        searchResultIdx = n
        break
    n += 1
&gt;
print(f&#39;searchResultIdx:{searchResultIdx}&#39;)</code></pre>
<p>근데 여기서 또하나의 개념이 등장한다. 
바로 <em><strong>보초법!!!!!!</strong></em>
보초법은 <strong>맨 끝에 판별할 수 있는 보초(문제에서는 사용자 입력 숫자)를 세워두고
그 숫자가 등장했을때 판단 없이 없다고 판별해줌!</strong></p>
<p>그냥 들었을 때는 아니 어차피 끝까지가서 비교해주는 데, 결국 보초법도 보초한테까지 가는데 뭐가 다르다고??? 
그렇게 검색을 한 결과 내 생각에는!</p>
<p>코드가 말해준다.</p>
<blockquote>
<p>&lt;보초법을 쓸 코드&gt;</p>
</blockquote>
<pre><code class="language-python">n = 0
while True:
    if datas[n] == searchData:
        if n != len(datas)-1:
            searchIdx = n
        break</code></pre>
<p>!!!!!!
보초 하나로 while문이 이렇게 간결해질 수가 있다니...! 
(그래서 더 빠르다는 것)</p>
<p>위에 코드는
n과 search 데이터가 일치하면 True
근데 거기서 인덱스로는 마지막(len(datas)-1)이 올때까지 찾았다면 자료가 있으니까 True
없으면 False이기에 없는 거임.</p>
<p><strong>위에보다 판단이 짧은 명령문으로 되어있기때문에 판독이 빠르다.</strong></p>
<hr>
<h2 id="이진검색">이진검색</h2>
<p>다른 수강생분들도 그랬는지 모르겠지만 이진검색이 훨-씬 이해도 빠르고 그만큼 코드 이해도 금방 따라갔다.</p>
<p>이진검색이란?</p>
<p><strong>★정렬되어★</strong> 있는 자료구조에서 <strong>중앙 값과의 크고 작음을 이용해서 데이터를 검색한다</strong>.</p>
<p>중앙 값보다 작다 
↓
그럼 다시 그 구간에서 중앙값과 비교
↓
검색될 때까지 반복</p>
<p><img src="https://velog.velcdn.com/images/auden_9/post/0796ed17-89c9-4c35-a671-3319d22d1386/image.png" alt=""></p>
<blockquote>
<p>&lt;이진검색 코드&gt;</p>
</blockquote>
<pre><code class="language-python">&gt;
datas = [1,2,3,4,5,6,7,8,9,10,11]
&gt;
print(datas)
print(len(datas))
&gt;
searchData = int(input(&#39;searchData : &#39;))
serachResultIdx = -1
&gt;
staIdx = 0
endIdx = len(datas)-1
midIdx = (staIdx+endIdx) // 2
midVal = datas[midIdx]
&gt;
print(f&#39;midIdx : {midIdx}&#39;)
print(f&#39;midVal : {midVal}&#39;)
&gt;
while searchData &lt;= datas[len(datas)-1] and searchData &gt;= datas[0]:
    if searchData == datas[len(datas)-1]:
        serachResultIdx = len(datas)-1
        break
&gt;
    if searchData &gt; midVal:
        staIdx = midVal
        midIdx = (staIdx+endIdx) // 2
        midVal = datas[midIdx]
        print(f&#39;midIdx : {midIdx}&#39;)
        print(f&#39;midVal : {midVal}&#39;)
&gt;
    elif searchData &lt; midVal:
        endIdx = midIdx
        midIdx = (staIdx+endIdx) // 2
        midVal = datas[midIdx]
        print(f&#39;midIdx : {midIdx}&#39;)
        print(f&#39;midVal : {midVal}&#39;)
&gt;
    elif searchData == midVal:
        serachResultIdx = midIdx
        break
&gt;
print(f&#39;serachResultIdx:{serachResultIdx}&#39;)
&gt;
staIdx = 0
endIdx = len(datas)-1
midIdx = (staIdx+endIdx) // 2
midVal = datas[midIdx]</code></pre>
<p>4가지 개념을 잘만 이해하면 다른건 따라온다.
<strong>시작값, 끝값, 중간값의 인덱스, 중간값 설정</strong></p>
<blockquote>
<p><strong>+++ 내가 쉽게 놓치는 while문의 조건부</strong>
searchData &lt;= datas[len(datas)-1] and searchData &gt;= datas[0]
찾는 데이터가 그 리스트 안에서만 돌 수 있게 명시하는 부분
datas[len(datas]-1] 끝과 같거나 작을때 그리고 datas[0] 처음보다는 크거나 같을때
조건식 안으로 들어온다!</p>
</blockquote>
<hr>
<h2 id="순위-검색">순위 검색</h2>
<p><strong>수의 크고 작음을 이용해서 수의 순서를 정하는 것을 순위라고 한다.</strong>
자료구조 내부에 있는 데이터끼리 비교를 해서 인덱스를 하나씩 올려줘서 순위를 매김.
개념은 쉬운데, 이렇게 활용해서 순위를 매길 수 있구나 놀랬다.</p>
<blockquote>
</blockquote>
<pre><code class="language-python">import random
&gt;
nums = random.sample(range(50,101),20)
ranks = [0 for i in range(20)]
&gt;
print(nums)
print(ranks)
&gt;
for idx, num1 in enumerate(nums):
    for num2 in nums:
        if num1 &lt; num2:
            ranks[idx] += 1</code></pre>
<blockquote>
</blockquote>
<pre><code>**ranks = [0 for i in range(20)]**</code></pre><p>변수 담기를 for문을 이용할 수 있음..!
rank는 점수를 담기위한 변수그릇 (활용도 上)★★</p>
<blockquote>
</blockquote>
<pre><code>if num1 &lt; num2:
    ranks[idx] += 1</code></pre><p>비교하여 작으면 idx값을 하나먹여 (마치 랭크의 순위가 올라가듯) 뒤로 보냄
데이터를 담는 곳과 순서 담는 곳을 달리해서 순서매김</p>
<hr>
<h1 id="💬-코멘트">💬 코멘트</h1>
<p>제로베이스 데이터취업반 3주차
알고리즘..! 유튜브 알고리즘만 듣던 나에게는 새롭고도 어려운 개념이였다.
그래도 제로베이스의 장점이라함은 개념수업과 실습수업이 나뉘어서 한번 더 활용이 들어간다는 것.</p>
<p>그래도 오늘은 생소한 개념의 이야기라 거의 따라쓰는 건 고사하고 이해없이 떠밀려가다간 더 크게 넘어질 수 있겠다 싶어. 목표 수강치는 다 듣고 복습을 좀 나눴다. 이해 안되는건 추가 검색도 해가면서 이제야 조큼 큰 구조내에서 오늘 배운게 이렇게 나뉘는 거구나 싶었다. (그래도..더 깊은 이해를 위해 토요일에는 정렬을 좀 더 공부해야지)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 자료구조_003 문제풀이]]></title>
            <link>https://velog.io/@auden_9/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0003-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4</link>
            <guid>https://velog.io/@auden_9/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0003-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4</guid>
            <pubDate>Thu, 16 Feb 2023 12:06:21 GMT</pubDate>
            <description><![CDATA[<h1 id="👀-다시보기">👀 다시보기</h1>
<blockquote>
<p>변수를 한번에 여러개 생성할때
<strong>group1,group2,group3,group4,group5 = 0,0,0,0,0</strong>
이런식으로 가능</p>
</blockquote>
<hr>
<blockquote>
<p><strong>리스트 반복하여 추가</strong></p>
</blockquote>
<pre><code class="language-python">friend[0] = 유재석
&gt;
for n in range(5):
    friend.append(input(&#39;친구 이름: &#39;))</code></pre>
<hr>
<blockquote>
<p><strong>내부 컨테이너 있을 시 조회방법</strong></p>
</blockquote>
<pre><code class="language-python">for s1 in scores :
    for s2 in s1 :
        total += s2</code></pre>
<hr>
<blockquote>
<p><strong>튜플로 된 딕셔너리를 분해하여 조회</strong></p>
</blockquote>
<pre><code class="language-python">for idx, dic in enumerate(studentCnt):
    for k, v in dic.items():
        total = total + v</code></pre>
<hr>
<blockquote>
<p><strong>딕셔너리 생성</strong></p>
</blockquote>
<pre><code class="language-python">subject = [&#39;국어&#39;,&#39;영어&#39;,&#39;수학&#39;,&#39;과학&#39;,&#39;국사&#39;]
scores = {}
&gt;
for s in subject:
    score = input(s+&#39;점수 입력: &#39;)
    scores[s] = score
&gt;
print(f&#39;과목별 점수 : {scores}&#39;)</code></pre>
<hr>
<blockquote>
<p><strong>중복숫자 제거</strong></p>
</blockquote>
<pre><code class="language-python">number = [2,22,7,8,9,2,7,3,5,2,7,1,3]
print(f&#39;number : {number}&#39;)
&gt;
idx = 0
while True:
    if idx &gt;= len(number):
        break
&gt;
    if number.count(number[idx]) &gt;= 2:
        number.remove(number[idx])
        continue
&gt;
    idx += 1
&gt;
print(f&#39;number: {number}&#39;)</code></pre>
<hr>
<blockquote>
<p><strong>가장 간결히 해결해서 놀랐던 합집합, 교집합 문제</strong></p>
</blockquote>
<pre><code class="language-python">tuple1 = (1,3,2,6,12,5,7,8)
tuple2 = (0,5,2,9,8,6,17,3)
&gt;
tempHap = list(tuple1)
tempGyo = list()
&gt;
for n in tuple2:
    if n not in tempHap:
        tempHap.append(n)
&gt;
    else:
        tempGyo.append(n)
&gt;</code></pre>
<hr>
<blockquote>
<p><strong>자료 생성 후 삭제</strong></p>
</blockquote>
<pre><code class="language-python">members = {}
n = 1
while n &lt; 4:
    mail= input(&#39;아이디 입력: &#39;)
    pw = input(&#39;비밀번호 입력: &#39;)
&gt;
    if mail in members:
        print(&#39;이미 사용 중인 메일 계정입니다.&#39;)
&gt;
    else:
        members[mail] = pw
        n+=1
&gt;
for key in members.keys():
    print(f&#39;{key} : {members[key]}&#39;)
&gt;
while True:
    delMail = input(&#39;삭제할 메일주소 : &#39;)
    if delMail in members:
        delPw = input(&#39;비번입력: &#39;)
        if members[delMail] == delPw:
            del members[delMail]
            print(&#39;삭제되었습니다.&#39;)
            break
        else:
            print(&#39;비밀번호 오류&#39;)
&gt;
    else:
        print(&#39;계정을 확인해주세요.&#39;)
&gt;
for key in members.keys():
    print(f&#39;{key} : {members[key]}&#39;)</code></pre>
<hr>
<h1 id="💬-코멘트">💬 코멘트</h1>
<p>딕셔너리가 가장 활용도도 좋은 컨테이너 구조인데
활용만 들어가면 왤케 이해를 못하고 허덕이고 있을까..
한번씩 다시 써보고 자야겠다..!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 자료구조_002 튜플과 딕셔너리]]></title>
            <link>https://velog.io/@auden_9/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0002-%ED%8A%9C%ED%94%8C%EA%B3%BC-%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC</link>
            <guid>https://velog.io/@auden_9/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0002-%ED%8A%9C%ED%94%8C%EA%B3%BC-%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC</guid>
            <pubDate>Wed, 15 Feb 2023 08:37:57 GMT</pubDate>
            <description><![CDATA[<h1 id="튜플">튜플</h1>
<p><strong>리스트와 비슷하지만 아이템 변경 불가!!!!</strong></p>
<p><img src="https://velog.velcdn.com/images/auden_9/post/bd5581d5-e5e9-4e9b-856b-47cd0f3e969f/image.png" alt=""></p>
<blockquote>
<p>선언은 <strong>() *<em>구분은 *</em>,</strong></p>
</blockquote>
<p>리스트와 같이 숫자, 문자, 논리형 등 모든 기본 데이터를 같이 저장할 수 있다.
튜플에 또 다른 컨테이너 자료형 데이터를 저장할 수 있다.</p>
<blockquote>
</blockquote>
<p>다만, 아이템 변경불가..!</p>
<h3 id="아이템-조회">아이템 조회</h3>
<p>튜플도 리스트와 같이 <strong>인덱스 조회가 가능.</strong>
** 0부터 인덱스가 붙음**</p>
<h3 id="in-not-in">in, not in</h3>
<blockquote>
<p><strong>in 존재하면 True , 없으면 not in
not in 존재하면 False, 없으면 in</strong></p>
</blockquote>
<p>아이템 외에 문자열에서 글자찾기도 가능함! 
(대소문자까지 구분함)</p>
<p>random 모듈에 sample함수는 리스트로 결과값을 냄.
sample(range(),몇가지)</p>
<h3 id="튜플-길이-len">튜플 길이 len()</h3>
<p>for문(or while문)과 만나 range에 들어가 아이템 조회가 가능함</p>
<h2 id="튜플-결합">튜플 결합</h2>
<blockquote>
<p><strong>extend() 는 튜플은 형태변환이 불가해서 사용 못함. XXXX</strong>
튜플은 변경이 불가한데, 확장은 원래 갖고있는 튜플에 추가되기에 불가.</p>
<p>*<em>+덧셈결합만 가능.
A + B = C *</em>
C 는 원본과 다른 변수기에 가능!</p>
</blockquote>
<pre><code class="language-python">vegetables = (&#39;토마토&#39;,&#39;가지&#39;,&#39;애호박&#39;,&#39;당근&#39;,&#39;감자&#39;,&#39;양파&#39;)
fruits = (&#39;딸기&#39;,&#39;블루베리&#39;,&#39;키위&#39;,&#39;망고&#39;,&#39;포도&#39;,&#39;바나나&#39;)
print(vegetables)
print(fruits)

basket = vegetables + fruits

print(basket)</code></pre>
<p>💻출력
<img src="https://velog.velcdn.com/images/auden_9/post/ac9c5dd8-2ebf-43fc-9891-5c1ea0eaca4c/image.png" alt=""></p>
<p>(number, ) -&gt; 튜플로 저장하기..!</p>
<h3 id="슬라이싱">슬라이싱</h3>
<blockquote>
</blockquote>
<p>[n:m]
n부터 m-1까지 뽑아낼 수 있음!</p>
<img src="https://velog.velcdn.com/images/auden_9/post/2b84ef5b-e40c-4813-bfd5-6f36054e2641/image.png">

<p>💻출력</p>
<img src="https://velog.velcdn.com/images/auden_9/post/ebaf0449-b2a9-4ca0-a190-b09a801dd8f1/image.png">


<p>맨 위 print 값 무시하고 2번째 print부터의 출력값은
인덱스 2부터 3까지 출력
인덱스 처음(0)부터 3까지 출력
인덱스 4부터 끝까지 출력
인덱스 2부터 뒤에서 3자리까지 출력
인덱스 뒤에서 5자리서부터 뒤에서 3자리까지 출력</p>
<ul>
<li>단계도 설정 가능
[시작점:끝점:단계]</li>
</ul>
<p><strong>슬라이싱으로 아이템 변경 불가</strong>
<strong>리스트에 있는 아이템을 튜플형태의 변경은 가능..!</strong></p>
<p>튜플명(slice(시작,끝))
시작부터 끝 미만까지</p>
<hr>
<img src="https://velog.velcdn.com/images/auden_9/post/95b884e3-515e-44d8-af8b-019ac0c637d4/image.png">


<p><strong>튜플은 선언시 괄호 생략 가능!!!</strong>
vegetables = (&#39;토마토&#39;,&#39;가지&#39;,&#39;애호박&#39;,&#39;당근&#39;,&#39;감자&#39;,&#39;양파&#39;) 와
vegetables = &#39;토마토&#39;,&#39;가지&#39;,&#39;애호박&#39;,&#39;당근&#39;,&#39;감자&#39;,&#39;양파&#39;
같은 튜플임</p>
<h3 id="-자료형-변환">+++ 자료형 변환</h3>
<p>정렬이 필요하거나 할때 리스트로 타입변환하여 적용 후 다시 튜플로 변환.</p>
<blockquote>
</blockquote>
<p>리스트 -&gt; 튜플
vegetables = <strong>tuple</strong>(vegetables)</p>
<blockquote>
</blockquote>
<p>튜플 -&gt; 리스트
vegetables = <strong>list</strong>(vegetables)</p>
<blockquote>
</blockquote>
<p>정렬 시 <strong>리스트로 변환 후</strong> sort(), sort(reverse=True)</p>
<blockquote>
</blockquote>
<p>+)
sorted() 함수로 튜플도 오름차순 정렬이 가능함!
내장함수라 바로 sorted(튜플명)
그러나 결과값은 리스트 자료형으로 반환해서 출력됌.</p>
<hr>
<p><strong>튜플과 for문 - 이 이후로는 list의 for문과 내용이 동일.</strong></p>
<pre><code class="language-python">for i in range(len(fruits)):
    print(fruits[i])


for fruit in fruits:
    print(fruit)</code></pre>
<p>내부 컨테이너가 있을 시에</p>
<pre><code class="language-python">students = (1,19), (2,20), (3,22), (4,18), (5,21),

방법 1&gt; 
for i in range(len(students)):
    print(&#39;{}학급 학생수: {}명&#39;.format(students[i][0],students[i][1]))

방법2&gt;
for classNo, cnt in students:
    print(&#39;{}학급 학생수: {}명&#39;.format(classNo,cnt))</code></pre>
<p><strong>튜플과 while문으로 아이템 조회</strong></p>
<pre><code class="language-python">
첫번째) len활용

n = 0
while n &lt; len(튜플명):
    print(cars[n])
    n += 1


두번째 ) flag변수

n = 0
flag = True

while flag:
    print(cars[n])
    n += 1

    if n == len(cars):
        flag = False


세번째 ) break

n = 0
while True:
    print(cars[n])
    n += 1

    if n == len(cars):
        break</code></pre>
<hr>
<h1 id="딕셔너리-키값">딕셔너리 {키:값}</h1>
<blockquote>
<p><strong>키(key)</strong>와 <strong>값(value)</strong>를 이용해서 자료를 관리한다.
<strong>키는 인덱스의 개념과 같은데</strong>, 키는 작성자가 정함</p>
</blockquote>
<p><strong>딕셔너리는 키와 구분하는 유일한 값이기때문에, 키는 중복안됌. (값은 가능)</strong></p>
<p>선언은** {}** 구분은 <strong>키:값</strong> 형태로 들어간다.</p>
<p><img src="https://velog.velcdn.com/images/auden_9/post/3823126d-8539-43d2-9372-e98b4819c700/image.png" alt=""></p>
<p>키값으로 아이템 호출함</p>
<p>key와 value에는 숫자, 문자(열), 논치형 뿐만 아니라 컨테이너 자료형도 올 수 있다.</p>
<p><strong>단 key에는 변경 불가의 데이터만 올 수 있다. 변경 가능할만한 것은 안된다 ( 튜플 가능, 리스트는 불가)</strong></p>
<h2 id="키값을-이용해-조회하자">키값을 이용해 조회하자!</h2>
<h3 id="딕셔너리명키-값"><strong>딕셔너리명[&#39;키 값&#39;]</strong></h3>
<p>없는 키 값을 찾으면 에러가 발생함</p>
<h3 id="get">get()</h3>
<p><strong>딕셔너리명.get(&#39;키값&#39;)</strong>
없는 키 값을 찾으면 none을 내보냄</p>
<img src="https://velog.velcdn.com/images/auden_9/post/e629a64e-a583-4631-ab4a-81839b5b97cd/image.png">

<p>ㅡ</p>
<h3 id="딕셔너리추가">딕셔너리추가</h3>
<img src="https://velog.velcdn.com/images/auden_9/post/1e44ffb5-8535-4c74-86a0-ca708ebb9c46/image.png">


<blockquote>
<p><strong>딕셔너리명[&#39;key값&#39;] = &#39;value값&#39;</strong></p>
</blockquote>
<img src="https://velog.velcdn.com/images/auden_9/post/3a96f6cc-21c3-4611-8ea7-4afceb7c281e/image.png">


<blockquote>
<p>추가하려는 키 값이 이미 있다면 기존 값이 수정된다.</p>
</blockquote>
<h2 id="keys-와-value">keys() 와 Value</h2>
<blockquote>
</blockquote>
<p><strong>keys()</strong>  <strong>전체 key를 리스트 형식으로 출력</strong>
리스트 형식으로 나오고 type은 dict_keys 라고 나옴</p>
<blockquote>
</blockquote>
<p><strong>values()</strong>   <strong>전체 value값을 리스트 형식으로 출력</strong>
리스트 형식으로 나오고 type은 dict_value 라고 나옴</p>
<blockquote>
</blockquote>
<p><strong>items()</strong> 키와 <strong>value를 튜플 형식으로 출력</strong>
튜플 형식으로 나오고 type은 dict_items라고 나옴</p>
<p>for key in myInfo.keys():
    print(f&#39;{key}: {myInfo[key]}&#39;)</p>
<blockquote>
</blockquote>
<h4 id="del-딕셔너리명키값">del 딕셔너리명[&#39;키값&#39;]</h4>
<p>해당 아이템 삭제됌</p>
<blockquote>
</blockquote>
<h4 id="딕셔너리명pop키값">딕셔너리명.pop(&#39;키값&#39;)</h4>
<p>해당 아이템 삭제됌</p>
<blockquote>
</blockquote>
<p>★ pop은 함수라 버린 값을 출력하면 볼수 있음!</p>
<blockquote>
</blockquote>
<h4 id="in-not-in-1">in, not in</h4>
<p>키 값 기준으로 있는지 없는지 판단</p>
<blockquote>
</blockquote>
<h4 id="len">len()</h4>
<p>딕셔너리 길이(아이템개수)를 알아 낼수 있따.</p>
<blockquote>
</blockquote>
<h4 id="clear">clear()</h4>
<p>모든 아이템을 삭제한다.
딕셔너리명.clear()</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 자료구조_001 리스트]]></title>
            <link>https://velog.io/@auden_9/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0001</link>
            <guid>https://velog.io/@auden_9/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0001</guid>
            <pubDate>Tue, 14 Feb 2023 10:19:52 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>자료구조란?</strong>
여러 개의 데이터가 묶어있는 자료형을 컨테이너 자료형이라고 하고,
이러한 컨테이너 자료형의 데이터 구조를 자료구조라고 한다.</p>
</blockquote>
<p>데이터를 묶어 관리하는 것.
보통 담는 변수가 여러가지라 변수명을 복수명으로 적어주면 관리에 좋음.</p>
<h1 id="리스트">리스트</h1>
<blockquote>
<p>배열과 같이 여러 개의 데이터를 나열한 자료구조.
데이터는 ** , ** 로 구분한다
데이터 하나하나는 <strong>요소, element, item</strong>이라 한다.</p>
</blockquote>
<p>리스트 안에 데이터가 섞어서도 넣을 수 있음.
strs = [3.14, &#39;십&#39;, 20, &#39;one&#39;]</p>
<p>컨테이너 안에 또 따른 컨테이너가 들어갈 수 있음.
datas = [10,20,30, [40,50,60] ]</p>
<p>리스트는 출력 시 
print(&#39;students : {}&#39;.format(students))</p>
<blockquote>
</blockquote>
<p>students : [&#39;알라딘&#39;, &#39;자스민&#39;, &#39;이아고&#39;, &#39;자파&#39;]</p>
<p>**[ ]안에 담겨서 나온다.
**</p>
<h2 id="아이템-조회">아이템 조회</h2>
<h3 id="인덱스">인덱스</h3>
<blockquote>
<p>리스트 안에 들어가있는 데이터에 자동으로 부여되는 번호표
<strong>번호표는 0번부터 부여된다.</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/auden_9/post/c8238076-0d3b-4390-8644-7a9a9e88d5b2/image.png" alt=""></p>
<p>데이터를 담은 변수는 list라 나오지만 그 요소 하나는 성격에 맞는 걸로 나옴
글자면 str, 정수면 int ..</p>
<blockquote>
<ul>
<li>리스트의 길이 == 아이템 갯수
len()을 이용하여 리스트 변수를 담아주면 됌.
len()을 이용하여 for문 range에 담을 수 있음.</li>
</ul>
</blockquote>
<h3 id="리스트-조회">리스트 조회</h3>
<h4 id="1-for문">1. for문</h4>
<pre><code class="language-python">for i in range(len(mySport)):
    print(&#39;mySport[{}]: {}&#39;.format(i,mySport[i]))</code></pre>
<h4 id="2-while문">2. while문</h4>
<pre><code class="language-python">n = 0
while n &lt; len(mySport):
    print(&#39;mySport[{}]: {}&#39;.format(n,mySport[n]))
    n += 1</code></pre>
<h4 id="3-item">3. item</h4>
<pre><code class="language-python">for item in mySport:
    print(item)</code></pre>
<hr>
<h1 id="내부-리스트">내부 리스트</h1>
<pre><code class="language-python">studentCnts = [[1,19], [2,20], [3,22], [4,18], [5,21]]

for classNo, cnt in studentCnts:
    print(&#39;{}학급 학생수: {}&#39;.format(classNo,cnt))</code></pre>
<blockquote>
<p>** classNo는 1,2,3,4를 가리킴
  cnt는 19,20,22,18를 가리킴**</p>
</blockquote>
<ul>
<li>출력값<pre><code>1학급 학생수 : 19
2학급 학생수 : 20
3학급 학생수 : 22
4학급 학생수 : 18
5학급 학생수 : 21</code></pre><h3 id="내부리스트-조회">내부리스트 조회</h3>
</li>
</ul>
<ol>
<li>for문을 활용하여  idex 출력<pre><code class="language-python">minScore = 60
scores = [[&#39;국어&#39;,58],
       [&#39;영어&#39;,77],
       [&#39;수학&#39;,89],
       [&#39;과학&#39;,99],
       [&#39;국사&#39;,50]]
</code></pre>
</li>
</ol>
<p>for item in scores:
    if item[1] &lt; minScore:
        print(&#39;과락 과목: {}, 점수: {}&#39;.format(item[0],item[1]))</p>
<p>for subject, score in scores:
    if score &lt; minScore:
        print(&#39;과락 과목: {}, 점수: {}&#39;.format(subject, score))</p>
<p>for subject, score in scores:
    if score &gt;= minScore: continue
    print(&#39;과락 과목: {}, 점수: {}&#39;.format(subject, score))</p>
<p>-----출력
과락 과목: 국어, 점수: 58
과락 과목: 국사, 점수: 50</p>
<pre><code>
2. while문 활용하여 idex 출력
```python
minScore = 60
scores = [[&#39;국어&#39;,58],
          [&#39;영어&#39;,77],
          [&#39;수학&#39;,89],
          [&#39;과학&#39;,99],
          [&#39;국사&#39;,50]]
n = 0
while n &lt; len(scores):
    if scores[n][1] &lt; minScore:
        print(&#39;과락 과목: {}, 점수: {}&#39;.format(scores[n][0],scores[n][1]))
    n += 1

---

n = 0
while n &lt; len(scores):
    if scores[n][1] &gt;= minScore:
        n += 1
        continue

    print(&#39;과락 과목: {}, 점수: {}&#39;.format(scores[n][0], scores[n][1]))
    n += 1


---
n = 0
while True:
    print(cars[n])
    n += 1

    if n == len(cars):
        break

```

+ ) 007 예제~!
while문은 변수를 이용하여 전체학급수를 구함

---
## enumerate() 함수 ★
```python
sports = [&#39;탁구&#39;,&#39;배구&#39;,&#39;양궁&#39;,&#39;축구&#39;,&#39;테니스&#39;]


for idx, value in enumerate(sports):
    print(&#39;{} : {}&#39;.format(idx, value))

-----출력

0 : 탁구
1 : 배구
2 : 양궁
3 : 축구
4 : 테니스</code></pre><p>리스트 외에 문자열에도 사용 가능</p>
<hr>
<h2 id="아이템-추가-append">아이템 추가 .append()</h2>
<p><strong>리스트명.append(&#39;아이템&#39;)</strong></p>
<p>리스트에 맨 마지막에 들어가게된다!
<img src="https://velog.velcdn.com/images/auden_9/post/b96c9d20-2455-4f4d-a638-04b6cd1d8c3a/image.png" alt=""></p>
<blockquote>
<p>예시코드</p>
</blockquote>
<img src="https://velog.velcdn.com/images/auden_9/post/8a5d1a66-93a8-47f5-9652-a648c39275eb/image.png">
>
💻출력
>
<img src="https://velog.velcdn.com/images/auden_9/post/cc0e5c92-c094-4471-b80d-7aa51ac3f109/image.png">


<hr>
<h2 id="추가-아이템-위치-지정--insert자리위치아이템">추가 아이템 위치 지정:  insert(자리위치,&#39;아이템&#39;)</h2>
<p>사이에 들어가면 그 뒤에 아이템들은 index자리수가 하나씩 추가된다.</p>
<p><img src="https://velog.velcdn.com/images/auden_9/post/79c0b2a8-093a-44ad-9b4c-81d0972c9abb/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>예시코드</p>
<blockquote>
</blockquote>
<img src="https://velog.velcdn.com/images/auden_9/post/644edd8b-247a-4ecc-aaaa-5001ce121aa8/image.png">
>
💻출력
>
<img src="https://velog.velcdn.com/images/auden_9/post/cbd1cba2-a5c4-4bd8-af73-54041fb27366/image.png">


<hr>
<h2 id="아이템-삭제--pop">아이템 삭제 : pop()</h2>
<p><strong>마지막 인덱스에 해당하는 아이템 삭제
기본자리는 마지막 자리</strong>
<strong>자리 지정하고싶으면 자리번호 넣으면 됌!</strong></p>
<blockquote>
</blockquote>
<p>&lt;기본&gt;</p>
<blockquote>
</blockquote>
<img src="https://velog.velcdn.com/images/auden_9/post/028b6ddf-5f1d-4bd5-b745-78d1167fc72c/image.png">
>
<img src="https://velog.velcdn.com/images/auden_9/post/567b0a77-974c-4d9b-8e4c-519257fba64e/image.png">
>
<인덱스로 삭제하고싶은 곳 지정>
>
<img src="https://velog.velcdn.com/images/auden_9/post/b7a1ce6a-7a0d-4b71-8e72-908a34333146/image.png">
>
<img src="https://velog.velcdn.com/images/auden_9/post/e435129b-ee92-4e9f-9dad-3ca530f6a056/image.png">
> 
+ 인덱스 1번인 자스민이 삭제됌!


<hr>
<h2 id="아이템-삭제-2--remove아이템">아이템 삭제 2 : remove(&#39;아이템&#39;)</h2>
<blockquote>
<p>1가지 아이템을 삭제하려면 <strong>리스트명.remove(&#39;아이템&#39;)</strong>
삭제하려는 데이터가 2개 이상이면 <strong>while문을 이용하자</strong></p>
<p><strong>&#39;아이템 &#39; in 리스트
리스트 안에 아이템이 있으면 True</strong></p>
</blockquote>
<img src="https://velog.velcdn.com/images/auden_9/post/758790a4-acdb-4607-ab75-e3314a519191/image.png">
💻출력
<img src="https://velog.velcdn.com/images/auden_9/post/73db223e-2581-4822-ad59-d32ddec00a32/image.png">


<hr>
<h2 id="리스트연결">리스트연결</h2>
<h3 id="확장-extend">확장 extend()</h3>
<p><strong>리스트에 또 다른 리스트를 연결(확장) 할 수 있다.</strong></p>
<blockquote>
<pre><code class="language-python">vegetable = [&#39;감자&#39;,&#39;토마토&#39;,&#39;애호박&#39;]
fruit = [&#39;수박&#39;,&#39;딸기&#39;,&#39;바나나&#39;]
</code></pre>
</blockquote>
<p>[&#39;감자&#39;,&#39;토마토&#39;,&#39;애호박&#39;] extend() [&#39;수박&#39;,&#39;딸기&#39;,&#39;바나나&#39;]</p>
<blockquote>
</blockquote>
<p>vegetable.extend(fruit)</p>
<blockquote>
</blockquote>
<p>vegetable = [&#39;감자&#39;,&#39;토마토&#39;,&#39;애호박&#39;,&#39;수박&#39;,&#39;딸기&#39;,&#39;바나나&#39;]</p>
<pre><code>
### + 덧셈연산자
덧셈연산자를 이용해서 리스트를 연결할 수도 있다.

**A리스트 + B 리스트 = C리스트    **
&gt;
```python
result = students1 + students2
&gt;
reslut :[&#39;알라딘&#39;, &#39;자파&#39;, &#39;자스민&#39;, &#39;이아고&#39;, &#39;자파&#39;, 
        &#39;아부&#39;, &#39;자파&#39;, &#39;버즈&#39;, &#39;우디&#39;, &#39;포키&#39;, &#39;햄&#39;, &#39;포테이토헤드&#39;]</code></pre><hr>
<h2 id="리스트-아이템-정렬">리스트 아이템 정렬</h2>
<h3 id="오름차순으로-정렬-sort">오름차순으로 정렬: sort()</h3>
<h3 id="내림차순으로-정렬-sortreversetrue"><strong>내림차순으로 정렬: sort(reverse=True)</strong></h3>
<blockquote>
</blockquote>
<p>&lt;예시 코드&gt;</p>
<blockquote>
<pre><code class="language-python">korea = [&#39;가&#39;,&#39;다&#39;,&#39;바&#39;,&#39;마&#39;,&#39;라&#39;,&#39;나&#39;]
print(&#39;한글: {}&#39;.format(korea))
</code></pre>
</blockquote>
<p>korea.sort()
print(&#39;오름차순 정렬: {}&#39;.format(korea))</p>
<blockquote>
</blockquote>
<p>korea.sort(reverse=True)
print(&#39;내림차순 정렬: {}&#39;.format(korea))</p>
<blockquote>
<pre><code>💻출력
</code></pre></blockquote>
<img src="https://velog.velcdn.com/images/auden_9/post/066d1855-f096-4452-a639-60355e8523c9/image.png">




<h3 id="아이템-순서-뒤집기-reverse">아이템 순서 뒤집기: reverse()</h3>
<pre><code class="language-python">students = [&#39;버즈&#39;,&#39;우디&#39;,&#39;포키&#39;,&#39;햄&#39;,&#39;포테이토헤드&#39;]
print(&#39;정렬 : {}&#39;.format(students))

students.reverse()
print(f&#39;뒤집기: {students}&#39;)
</code></pre>
<p>💻출력</p>
<img src="https://velog.velcdn.com/images/auden_9/post/78890750-f091-46b5-b5f3-c966a09d546c/image.png">


<hr>
<h2 id="리스트-슬라이싱">리스트 슬라이싱</h2>
<p>원하는 아이템 뽑아내기</p>
<blockquote>
<p><strong>리스트명 [n:m]</strong>
인덱스 n 이상 m 미만까지 추출함</p>
</blockquote>
<blockquote>
<p><strong>리스트명 [:m]</strong>
인덱스 처음부터 m미만까지 추출</p>
</blockquote>
<ul>
<li>음수값까지 지정됌. (뒤에서부터 간다)</li>
</ul>
<p>문자열도 슬라이싱 가능함!
str = &#39;가나다&#39;</p>
<p><strong>슬라이싱 단계를 정할 수도 있다.</strong></p>
<pre><code class="language-python">members = [&#39;토끼&#39;,&#39;강아지&#39;,&#39;고양이&#39;,&#39;병아리&#39;,&#39;말&#39;,&#39;송아지&#39;]
print(&#39;member:{}&#39;.format(member[1:5:2]))</code></pre>
<p>인덱스 1~5는 [&#39;강아지&#39;, &#39;고양이&#39;, &#39;병아리&#39;, &#39;말&#39;] 이지만
<strong>추출은 2씩 건너뛴 강아지, 병아리만 추출됌</strong></p>
<h2 id="아이템-변경">아이템 변경</h2>
<pre><code class="language-python">numbers = [1,2,3,4,5]
print(numbers)
print(&#39;일부분: {}&#39;.format(numbers[1:3]))
numbers[1:3] = [&#39;two&#39;,&#39;three&#39;,&#39;four&#39;]
print(numbers)</code></pre>
<p>💻출력</p>
<img src="https://velog.velcdn.com/images/auden_9/post/fc9b718d-36bb-46b7-b1f9-6136f6a430ae/image.png">


<p>+
슬라이싱 갯수가 모자라면 끝부분 그대로 잘림</p>
<p>slice()함수
변수명[slice(시작자리,끝자리)]</p>
<h3 id="💬-코멘트">💬 코멘트</h3>
<p>파이썬 기초공부만큼이나 재밌었던 수업이였다.
실습도 하나하나 다 따라하다보니 시간이 금세가서 놀랐지만..!
재밌었던 만큼 활용도가 높은 기본기 수업이라 잘 다져놔야겠다👊👊👊</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[기초수학_13일차_학습일지]]></title>
            <link>https://velog.io/@auden_9/%EA%B8%B0%EC%B4%88%EC%88%98%ED%95%9913%EC%9D%BC%EC%B0%A8%ED%95%99%EC%8A%B5%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@auden_9/%EA%B8%B0%EC%B4%88%EC%88%98%ED%95%9913%EC%9D%BC%EC%B0%A8%ED%95%99%EC%8A%B5%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Mon, 13 Feb 2023 09:08:43 GMT</pubDate>
            <description><![CDATA[<h2 id="👀-다시보기">👀 다시보기</h2>
<p>오늘은 문제풀이의 날이라 코드 위주의 학습이였다.
다시 한번보며 상기시킬 코드들 적었다.</p>
<ol>
<li>약수 and 소수 and 소인수 한번에 구하기.</li>
</ol>
<img src="https://velog.velcdn.com/images/auden_9/post/7dbf54e7-dfe2-41a4-b156-b37d398e87c0/image.png">


<blockquote>
<p>변수를 담아 숫자를 추가하여 조건문을 달아 소인수 구해내기 (약간 포인트 쌓는 게임같아서 재밌었다.  이렇게도 활용할 수 있다는게 참 파이썬은 활용하는 것에 따라 무궁무진하구나)</p>
</blockquote>
<ol start="2">
<li>소인수분해하여 지수 담아내기<img src="https://velog.velcdn.com/images/auden_9/post/24b8a111-89db-4d9e-a1d3-7db57fcc3ce6/image.png">

</li>
</ol>
<blockquote>
<p>자료구조에서 나올 리스트에 담아 append()와 count()과 tempNum 변수를 활용하여 지수 뽑아냄..!</p>
</blockquote>
<p>💬 코멘트</p>
<p>아직 기본 개념 정립에도 여념이 없음에도
쉽게 활용하여 코드를 짜는걸 보면 난 언제 그 수준에 도달할 수 있을까 생각하게 된다.
할 수 있는건 묵묵히 기본을 다하는 것 (그래도 잘하고싶다😂😂)</p>
<p>오늘은 1주차 첫 팀스터디도 있는 날이라 조큼 정신이 없었다.
우리 팀원분들은 미팅 시각 정할 때도 느꼈지만 빠르게 반응하고, 열심히이다(팀을 잘만난 것 같다😊)
그게 발표시간에도 드러나 가장 미흡했던 내가 배울 점이 참 많아 의미있는 시간이였다.</p>
<p>제로베이스가 비대면 학습이라 아무래도 지루할 수 있고 쉽게 그만둘 수 있는데.
모니터링을 잘 하고 연구한 덕인지 서로 독려하며 나아갈 수 있게끔한 좋은 시스템이라고 느꼈다.
더 의미있는 시간을 위해 건의사항을 낸게 있었는데, 모두 적극 수용해주셔서 감사했다.
다음주엔 나도 좀 침착하게 발표했음 좋겠다👊</p>
]]></description>
        </item>
    </channel>
</rss>