1.  flex-direction

🐰  flex-direction이 row인 경우 컨테이너의 자식 요소에 넓이를 지정하지 않으면 내부 컨텐츠에 따라 넓이가 정해짐
         ▶️  inline-block 속성과 유사
      

🐰  flex-direction이 column인 경우 넓이를 지정하지 않으면 자동으로 넓이가 100%로 정해짐.
        ▶️  block 속성과 유사

    <style>
        #container {
            margin-top: 10px;
            border: 3px solid #af94de;
            display: flex;
            flex-direction: column | row;
        }

        .item {
            padding: 10px;
            margin: 10px;
            background: #fcfc9e;
            color: #525d73;
        }
    </style>
</head>
<body>
    <div id="container">
        <div class="item">Item 1</div>
        <div class="item">Item 2</div>
        <div class="item">Item 3</div>
        <div class="item">Item 4</div>
        <div class="item">Item 5</div>
        <div class="item">Item 6</div>
        <div class="item">Item 7</div>
        <div class="item">Item 8</div>
    </div>
</body>

 

flex-direction: row

 

flex-direction:column

 

 


 

2. flex-wrap

🐰  flex-direction: column 일 때 속성 적용 안 됨

     /* 위 예제 스타일과 똑같이 적용하고 flex-wrap 속성만 추가 */
     #container {
            display: flex;
            flex-direction: row;
            flex-wrap: wrap | wrap-reverse;
        }

    </style>
</head>
<body>
    <div id="container">
        <div class="item">Item 1</div>
        <div class="item">Item 2</div>
        <div class="item">Item 3</div>
        <div class="item">Item 4</div>
        <div class="item">Item 5</div>
        <div class="item">Item 6</div>
        <div class="item">Item 7</div>
        <div class="item">Item 8</div>
        <div class="item">Item 9</div>
        <div class="item">Item 10</div>
        <div class="item">Item 11</div>
        <div class="item">Item 12</div>
    </div>

</body>

 

주축이 row인 경우, flex-wrap 속성의 wrap과 wrap-reverse를 적용했을 때
주축이 column인 경우 적용 안됨

 


 

3.  justify-content

🐰  flex-direction: column 일 때 속성 적용 안 됨

flex-start : 줄의 시작 지점에 배치. 왼쪽 맞춤. 기본 값
flex-end : 줄의 끝 지점에 배치. 오른쪽 맞춤.
center : 가운데 맞춤
space-between : 왼쪽과 오른쪽 끝에 있는 요소를 끝에 붙이고, 남은 부분들은 균등한 공간을 형성한 상태로 배치.
space-around : 항목들 간에 동일한 간격

space-evenly : 왼쪽과 오른쪽 끝에 있는 공간도 포함해서 균등한 여백을 형성한 상태로 배치
<head>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        #container {
            margin-top: 10px;
            border: 3px solid #af94de;
            display: flex;
            justify-content: flex-start | flex-end | center |
                             spac-between | space-around | space-evenly;
        }

        .item {
            padding: 10px;
            background: #fcfc9e;
            color: #525d73;
        }
    </style>
</head>
<body>
    <div id="container">
        <div class="item">Item 1</div>
        <div class="item">Item 2</div>
        <div class="item">Item 3</div>
        <div class="item">Item 4</div>
        <div class="item">Item 5</div>
        <div class="item">Item 6</div>
        <div class="item">Item 7</div>
        <div class="item">Item 8</div>
    </div>

</body>

 

flex-start
flex-end
center
space-between
space-around
space-evenly

 


 

4.  align-itmes

🐰  수직방향 맞춤. 부모 요소에 빈공간이 있으면 자식 요소에 수직 방향으로 어떻게 맞출지 지정

 

flex-start       - 부모 요소의 윗부분에 맞춰 배치
flex-end         - 부모 요소의 아랫부분에 맞춰 배치
center             - 중앙에 배치
stretch            - 부모 요소의 높이 또는 콘텐츠의 가장 높이가 높은 자식 요소에 맞춰 늘어남. 초기값
baseline          -  문자 기준선에 맞춰 배치

 

<head>
    <style>
        #container {
            margin-top: 10px;
            border: 3px solid #af94de;
            
            display: flex;
            align-items: flex-start | flex-end | center | stretch | baseline;
        }

        .item {
            padding: 10px;
            margin: 10px;
            background: #fcfc9e;
            color: #525d73;
        }
        
        .item:nth-child(2) { /* 두번째 박스만 지정 */
            padding: 20px;
        }
    </style>
</head>
<body>
    <div id="container">
        <div class="item">Item 1</div>
        <div class="item">Item 2</div>
        <div class="item">Item 3</div>
        <div class="item">Item 4</div>
        <div class="item">Item 5</div>
        <div class="item">Item 6</div>
    </div>
</body>

flex-start
flex-end
center
stretch
baseline

 


 

5.  align-content

🐰  여러 줄이 될 때의 맞춤. 자식 요소가 여러 줄이 됐을 때의 수직 방향 맞춤을 지정
🐰  flex-wrap: nowrap 이 적용 되어 있다면 자식 요소가 한 줄이 되므로 align-content 속성 의미가 없음

 

flex-start : 부모 요소의 윗부분에 맞춰 배치
flex-end : 부모 요소의 아랫부분에 맞춰 배치
center : 중앙에 배치
space-between : 위아래 끝에 있는 요소를 끝에 붙이고, 남은 부분들은 균등한 공간을 형성한 상태로 배치
space-around : 위아래 끝에 있는 여백도 포함해서 균등한 공간을 형성한 상태로 배치
space-evenly : 항목들 간에 동일한 간격
stretch : 부모 요소의 높이에 맞게 자식 요소의 높이를 늘여서 배치

 

 
        #container {
            width: 400px;
            height: 300px;

            display: flex;
            flex-wrap: wrap;
            align-content: flex-start | flex-end | center | space-between
                           space-around | space-evenly | stretch ;
        }

    </style>
</head>
<body>
    <div id="container">
        <div class="item">Item 1</div>
        <div class="item">Item 2</div>
        <div class="item">Item 3</div>
        <div class="item">Item 4</div>
        <div class="item">Item 5</div>
        <div class="item">Item 6</div>
        <div class="item">Item 7</div>
        <div class="item">Item 8</div>
        <div class="item">Item 9</div>
        <div class="item">Item 10</div>
        <div class="item">Item 11</div>
        <div class="item">Item 12</div>
    </div>

</body>

flex-start / flex-end
center / space-between
space-around / space-evenly

 

stretch

 

 

 

 

[ 내용 참고 : IT 학원 강의 및 책 'Do it HTML+CSS+자바스크립트 웹 표준의 정석' ]


 

1.  선 그래프 - 시간에 따라 달라지는 데이터 표현하기

🐰  선 그래프 line chart : 데이터를 선으로 표현한 그래프, 시간에 따라 달라지는 데이터를 표현할 때 자주 사용
🐰  환율, 주가지수 등 경제 지표가 시간에 따라 변하는 양상을 '선 그래프'로 표현

    🥕  시계열 데이터 time series data  : 일별 환율처럼, 일정 시간 간격을 두고 나열된 데이터
    🥕  시계열 그래프 time series chart : 시계열 데이터를 선으로 표현한 그래프

 


 

1) 시계열 그래프 만들기

 

🐰  economics는 미국의 여러 가지 경제 지표를 월별로 나타낸 데이터
🐰  economics를 이용해 시간에 따라 실업자 수가 어떻게 변하는지 나타낸 시계열 그래프를 생성

🐰  sns.lineplot()을 이용하면 선 그래프를 만들 수 있다

 

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

# economics 데이터(시계열 데이터) 불러오기
economics = pd.read_csv('../input/economics.csv')

'''
         date    pce       pop  psavert  uempmed  unemploy
0  1967-07-01  506.7  198712.0     12.6      4.5      2944
1  1967-08-01  509.8  198911.0     12.6      4.7      2945
2  1967-09-01  515.6  199113.0     11.9      4.6      2958
3  1967-10-01  512.2  199311.0     12.9      4.9      3143
4  1967-11-01  517.4  199498.0     12.8      4.7      3066
'''
# x축에는 시간을 나타낸 date, y축에는 실업자 수를 나타낸 uneploy를 지정
sns.lineplot(data=economics, x='date', y='unemploy')
plt.show()

 

 

📍 출력된 그래프를 보면 x축에 굵은 선이 표시
      ▶️  date 변수에는 '1967-07-01' 처럼 '연월일'을 나타낸 문자가 있는데 이 값이 x축에 가로로 여러 번 겹쳐 표시되어서 굵은 선으로 보임

 

 

 

 

 

 


 

(1)  x축에 연도 표시하기

 

🥕  x축에 연도를 표시하려면 변수 타입을 날짜 시간 타입 datetime64으로 바꿔야
       ( economics 데이터의 date가 문자 object 타입으로 되어 있음 )

🥕  pd.to_datetime()을 이용하면 변수의 타입을 날짜 시간 타입으로 바꿀 수 있음

        ⚡️  변수의 타입을 날짜 시간 타입으로 바꾸더라도 값이 달라지지 않음

🥕  날짜 시간 타입은 df.dt를 이용해 연, 월, 일을 추출할 수 있음

# 날짜 시간 타입 변수 만들기
# date 타입을 날짜 시간 타입으로 변경해서 date2 변수 추가
economics['date2'] = pd.to_datetime(economics['date'])

# 변수 타입 확인
economics.info()
'''
RangeIndex: 574 entries, 0 to 573
Data columns (total 7 columns):
 #   Column    Non-Null Count  Dtype         
---  ------    --------------  -----         
 0   date      574 non-null    object        
... 생략...    
 6   date2     574 non-null    datetime64[ns]
 '''
# 연도 변수 추가
economics['year'] = economics['date2'].dt.year
economics.head()
# 연도를 나타낸 변수를 sns.lineplot()의 x에 입력하면 x축에 연도가 표시
sns.lineplot(data=economics, x='year', y='unemploy')
plt.show()

출력 결과

 

 

📍 선의 위아래에 표시된 면적은 신뢰구간 confidence interval
📍 신뢰 구간을 표시하지 않으려면 errorbar = None을 입력

 

 

 

 

 

 

 

 

 

# 신뢰구간 제거
sns.lineplot(data=economics, x='year', y='unemploy', errorbar=None)
plt.show()

신뢰구간 제거 결과

 

# date2로 그래프 바로 생성
sns.lineplot(data=economics, x='date2', y='unemploy')
plt.show()

 

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


출처 : 위키독스 (https://wikidocs.net/92083)

 

1.  선 그래프

 

🚀  연속적으로 변하는 데이터를 시각화할 때 사용
🚀  일반적으로 선 그래프는 시간에 따라 데이터의 연속적인 변화량을 관찰할 때 자주 사용
       ⚡️  예를 들어 시간에 따른 온도 변화량, 수출액 변화량, 교통 사고량 등을 시각화 할 때 유용하게 사용
🚀  선 그래프는 수량을 점으로 표시하면서 선으로 이어 그리기 때문에 증가와 감소 상태를 쉽게 확인할 수 있음

    📌  선 그래프는 plot()에 x축, y축 데이터를 선택하여 출력
    📌  x축에 시간 변수를 지정하여 시간 변화량을 나타내는 시계열 데이터를 표현하는 그래프에도 많이 사용

# 2001년 ~ 2019년까지의 미세먼지 데이터 'fine_dust.xlsx'를 이용하여 선 그래프로 표현.

import pandas as pd
import matplotlib.pyplot as plt

# 1) 2019년 데이터 읽기
data = pd.read_excel('../input/fine_dust.xlsx', index_col='area')
data

출력 결과

# 2019 데이터 가져오기
data2019 = data[2019]
data2019.head()

'''
area
Seoul       42.0
Gyeonggi    46.0
Incheon     43.0
Busan       36.0
Daegu       39.0
Name: 2019, dtype: float64
'''
# 2) 2019년 지역별 미세먼지 선 그래프
plt.figure(figsize=(15, 4))
plt.plot(data2019, color='b', marker='o')  # 파란색 선과 원형 마커 지정
plt.title('2019 Fine Dust Line Graph')  # 제목 설정
plt.xlabel('area')  # x축 명칭
plt.ylabel('micrometer')  # y축 명칭
plt.grid()  # 격자 표시
plt.show()

출력 결과

 

# 3) 2016 ~ 2019년 미세먼지 선 그래프
# 2016년 데이터를 가져와 chartdata에 저장하고 마커 및 이름을 지정하는 과정을 2019년까지 반복.
plt.figure(figsize=(15, 4))
for year in range(2016, 2020):
    plt.plot(data[year], marker='o', label=year)
plt.title('2016~2019 Fine Dust Line Graph')
plt.xlabel('area')
plt.ylabel('micrometer')
plt.legend()
plt.grid()
plt.show()

출력 결과

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1. 결측 데이터 처리

👩🏻‍🚀  판다스는 누락된 데이터를 표시할 때 NaN (Not a Number)로 표기하며, 연산에는 표함되지 않음

 

 

1) 결측 데이터 확인

 

✏️  isna() 메서드는 값이 NaN일 때 True, 아닌 경우엔 False 반환

✏️  isnull() 메서드는 결측 데이터이면 True 반환, 유효한 데이터가 존재하면 False를 반환
      ⚡️  isna(), isnull()은 기능적으로 동일

import pandas as pd

df = pd.read_csv('../input/weather.csv', index_col='date')
# 두 개다 결과가 같다.
df['max_wind'].isna()
df['max_wind'].isnull()

'''
출력 결과)
2010-08-01,False
2010-08-02,False
2010-08-03,False
2010-08-04,False
2010-08-05,False
2010-08-06,False
2010-08-07,False
2010-08-08,False
2010-08-09,False
2010-08-10,False
'''

 


 

①  결측 데이터 개수 확인

df.isnull().sum()

'''
temp         0
max_wind     4
mean_wind    6
dtype: int64
'''
df.isnull().value_counts()

'''
temp   max_wind  mean_wind
False  False     False        3646
                 True            3
       True      True            3
                 False           1
Name: count, dtype: int64
'''

 

✏️  notnull()은 유효한 데이터가 존재하면 True를 반환, 결측 데이터면 False를 반환

df.notnull().sum()

'''
temp         3653
max_wind     3649
mean_wind    3647
dtype: int64
'''

 


 

2) 결측 데이터 삭제

 

✏️  결측 데이터를 다루는 가장 간단한 방법은 결측 데이터를 가진 행이나 열을 삭제
✏️  판다스에서 dropna()를 이용하여 삭제 할 수 있다.

✏️  행 데이터 중 어느 한 변수에도 결측치가 있는 경우 삭제되므로 향후 제거한 데이터프레임을 사용하려면 다른 이름으로 저장해야 함

 DataFrame.dropna(axis, how, thresh, subset, inplace)

 

 

  📍 axis : 축을 행 또는 열로 결정
         ➡️  0 또는 'index'이면 누락된 값이 포함된 행을 삭제
         ➡️  1 또는 'columns'이면 누락된 값이 포함된 열을 삭제
         ➡️  기본값은 0
  📍 how any는 null 값이 있는 경우 행 또는 열을 삭제
                    all은 모든 값이 누락된 경우 행 또는 열을 삭제
                    기본값은 any
  📍 inplace : 데이터프레임에 나온 값을 저장할 것인지를 설정하는 변수로 기본적으로 값은 False

 

# 결측 데이터가 있는 행 삭제 후 확인
df2 = df.dropna()  # 옵션을 지정하지 않아서 행기준, NaN가 하나라도 있는 경우에 삭제.
df2.isnull().sum()

'''
temp         0
max_wind     0
mean_wind    0
dtype: int64
'''

 

# 원본 데이터는 변경 x
df.isnull().sum()
'''
temp         0
max_wind     4
mean_wind    6
dtype: int64
'''

 


 

3)  결측 데이터 대체

 

✏️  fillna() : 결측 데이터를 특정 값으로 채움. inplace를 True로 설정해 원본 데이터를 수정

# 결측 데이터 대체하기 : 평균값으로 대체
df['max_wind'].fillna(df['max_wind'].mean(), inplace=True)
df['mean_wind'].fillna(df['mean_wind'].mean(), inplace=True)

# 결측 데이터 대체 후 확인
df.isna().sum()
'''
temp         0
max_wind     0
mean_wind    0
dtype: int64
'''

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1.  데이터 선택

1) 열 선택하기

 

👩🏻‍🚀  df['컬럼명'] = df.컬럼명

       ⚡️ 단, 이 방법을 사용하려면 열 이름이 숫자로 시작하지 않고 공백이나 특수 문자 등을 포함하지 않는 등의 조건을 만족해야 함
👩🏻‍🚀  iloc() 및 loc() 메서드를 사용하여 여러 열을 선택할 수도 있음

👩🏻‍🚀  DataFrame의 하나의 열을 선택하면 하나의 Series로 결과 추출

 

a. 단일 컬럼 선택

# 단일 컬럼 선택하기
df = pd.read_csv('../input/weather.csv')
df['temp'] 
# df.temp와 같다

'''
출력 결과)
0       28.7
1       25.2
2       22.1
3       25.3
4       27.2
        ... 
3648    22.1
3649    21.9
3650    21.6
3651    22.9
3652    25.7
Name: temp, Length: 3653, dtype: float64
'''

 

b. 여러 컬럼 선택

# 추출할 열 이름을 리스트에 저장한 다음 []에 전달하면 여러 열을 선택할 수 있음.
df[['date', 'temp']]
# 열 이름을 사용하여 열을 선택하려는 경우 loc를 사용
# df.loc[행 인덱싱 값, 열 인덱싱 값]
df.loc[:, ['date', 'temp']]
# 열 인덱스를 사용하여 추출
# df.iloc[행 인덱스, 열 인덱스]
df.iloc[:, [0,1]]

 

  📌  세 방법 모두 같은 결과 추출

 


 

2) 행 선택하기 

👩🏻‍🚀  인덱스 숫자를 사용하면 행을 슬라이싱할 수 있음

df[0:3]

출력 결과

 


 

3)  레이블로 선택하기  df.loc

 

# 특정 날짜에 해당하는 열을 인덱스 열로 지정
df.index = df['date']
df

출력 결과

 

df.loc['2010-08-01', ['temp', 'mean_wind']]

'''
출력결과)
temp         28.7
mean_wind     3.4
Name: 2010-08-01, dtype: object
'''

 

4)  위치로 선택하기  df.iloc

 

👩🏻‍🚀  iloc[n]과 같이 정수를 입력하면 해당 행을 선택

# 숫자 3은 (위에서 0부터 시작) 4번째 행이라는 뜻.
df.iloc[3]

'''
처리 결과)
date         2010-08-04
temp               25.3
max_wind            6.6
mean_wind           4.2
Name: 2010-08-04, dtype: object
'''
# 특정 행과 열 선택 : 슬라이싱
df.iloc[1:3, 0:2]
# 1~2 행과 0~1열

 

📌  맨 앞의 열은 인덱싱 열이라 해당 x

 

 

 

 


 

5)  불 인덱싱

 

👩🏻‍🚀  하나의 열의 값을 기준으로 데이터를 선택할 수 있음
👩🏻‍🚀  df[df.A > 0]은 df로 부터 A열이 0보다 큰 데이터를 보여줌

 

# 조건에 맞는 데이터를 추출
w = df['temp'] > 30
w

'''
출력 결과)
date
2010-08-01    False
2010-08-02    False
2010-08-03    False
2010-08-04    False
2010-08-05    False
              ...  
2020-07-27    False
2020-07-28    False
2020-07-29    False
2020-07-30    False
2020-07-31    False
Name: temp, Length: 3653, dtype: bool
'''

 

df[w]

출력 결과

 

 

📌  기온이 30도 이상인 데이터만 추출

 

 

 

 


# 최고로 더웠던 날의 모든 정보를 추출
w = df['temp'] == df['temp'].max()
df[w]
# df[df['temp'] == df['temp'].max()]로 써도 된다.


# 조건이 2개 이상인 경우
# 기온이 30도 이상이고, 최대 풍속이 9이상인 데이터
w = (df['temp'] >= 30) & (df['max_wind'] >= 9)
df[w]


 

1. 통계  메서드

sum() 원소의 합
mean()  평균
std() 표준편차
var() 분산
min() 최솟값
max() 최댓값
cumsum() 원소의 누적 합
cumprod() 원소의 누적 곱

 

# 2012년 부터 2016년 까지 우리나라의 계절별 강수량(단위 mm).
table_data3 = {'봄': [256.5, 264.3, 215.9, 223.2, 312.8],
               '여름': [770.6, 567.5, 599.8, 387.1, 446.2],
               '가을': [363.5, 231.2, 293.1, 247.7, 381.6],
               '겨울': [139.3, 59.9, 76.9, 109.1, 108.1]}
columns_list = ['봄', '여름', '가을', '겨울']
index_list = ['2012', '2013', '2014', '2015', '2016']
df3 = pd.DataFrame(table_data3, columns=columns_list, index=index_list)
df3

df3 출력 결과

 

# 2012년에서 2016년에 걸쳐 계절별로 강수량의 평균(mean)과 표준 편차(std)를 구함.
df3.mean()
'''
봄     254.54
여름    554.24
가을    303.42
겨울     98.66
dtype: float64
'''

df3.std()  # 계절별 강수량 표준편차
'''
봄      38.628267
여름    148.888895
가을     67.358496
겨울     30.925523
dtype: float64
'''

 

    📌  연도별로 평균 강수량과 표준 편차를 구할 경우엔 연산의 방향 설정을 위해 axis인자를 추가
    📌  인자 axis가 0이면 DataFrame의 values에서 열별로 연산을 수행하고, 1이면 행별로 연산

    📌  axis 인자를 설정하지 않으면 기본값을 0으로 설정

 

df3.mean(axis=1)
'''
2012    382.475
2013    280.725
2014    296.425
2015    241.775
2016    312.175
dtype: float64
'''

df3.std(axis=1)
'''
2012    274.472128
2013    211.128782
2014    221.150739
2015    114.166760
2016    146.548658
dtype: float64
'''

💡  df.describe()

 

  -  평균, 표준편차, 최솟값과 최댓값 등을 한 번에 구할 수 있는 메서드
  -  25%, 50%, 75% : 백분위수의 각 지점으로, 분포를 반영해 평균을 보완하는 목적으로 사용

df3.describe()

 

출력 결과


 

2.  판다스 데이터  읽기

1) 표 형식 데이터 읽기

🍯  판다스에서 csv파일을 읽을 때는 read_csv() 메서드 이용

🍯  파이썬에서 텍스트파일을 생성하면 기본 문자 인코딩이 ’utf-8’이고, 메모장의 경우 기본 문자 인코딩이 ‘cp949’

DataFrame_data = pd.read_csv(file_name [, options])

 

import pandas as pd

df1 = pd.read_csv('../input/sea_rain1.csv')
df1

 

출력 결과

df1.dtypes
'''
연도      int64
동해    float64
남해    float64
서해    float64
전체    float64
dtype: object
'''

pd.read_csv('../input/sea_rain1_from_notepad.csv')
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: 
# invalid start byte

 

    📌  sea_rain1_from_notepad.csv 파일을 메모장으로 생성해서, 인코딩이 'cp949'이므로 에러가 남

            ▶️  메소드 안에 encoding='cp949' 를 붙여주면 된다.

# 올바른 실행 예
pd.read_csv('../input/sea_rain1_from_notepad.csv', encoding='cp949')

 

🍯  txt 파일의 경우 콤마가 아니라 공백(빈칸)으로 구분된 경우 sep 옵션을 이용해서 구분자가 콤마가 아니라 공백임을 지정
🍯  아래 처럼 확장자가 txt라도 read_csv()로 읽을 수 있음.

pd.read_csv('../input/sea_rain1_space.txt', sep=' ')

 

📌  read_csv()로 텍스트 파일을 읽어오면 index가 자동으로 지정
📌  이 때 특정 열 column을 index로 선택하려면

       'index_col=열_이름'을 추가

 

 

pd.read_csv('../input/sea_rain1.csv', index_col='연도')

출력 결과

 

 

 

 

 

[ 내용 참고 :  IT 학원 강의 ]

+ Recent posts