220502 코딩 테스트 문제 리스트 Web crawling해보기

Web crawling

이번 포스팅에서는 코테준비를 하기 위해서 코테문제를 풀다가 집중도 안되고, 원래 체크리스트를 만들어 놓고 하나씩 지워나가면서 하면 뭔가 성취감도 느끼고 해서 프로그래머스의 연습문제 페이지에 있는 문제 리스트를 Selenium + BeautifulSoup + Pandas + Python의 조합으로 빠르게 크롤링을 해서 엑셀파일로 뽑아보았다.

Read more

220330 Pandas TIL (작성예정...)

판다스 복습하기

이번 포스팅에서는 본격적으로 Pandas 학습한 내용을 나중에 복습하기 위한 목적에서 간단하게 정리해보려고 한다.

Index 설정하고 재설정하기

  • 판다스는 csv파일을 읽거나 데이터를 DataFrame의 형태로 저장하는데 사용된다. (numeric index는 기본적으로 설정된다)
1
2
3
4
5
import pandas as pd

bank_df = pd.read_csv('bank_client_information.csv') # 자동으로 index를 숫자로 지정

bank_df
  • 특정 column을 index column으로 할당
1
bank_df.set_index('First Name', inplace = True) # inplace = True로 원본 데이터 업데이트
  • 다시 numeric index를 index값으로 되돌릴때에는 reset_index메소드를 사용한다.
1
bank_df.reset_index(inplace = True)
  • 열을 판다스 데이터 프레임의 인덱스로 사용하고 싶을 때
1
2
3
bank_df = pd.read_csv('bank_client_information.csv', index_col = 'First Name')

bank_df
  • (CHALLENGE #4) 판다스 데이터 프레임 인덱스 설정하고 재 설정하기
1
2
3
4
5
6
# 방법1
bank_df = pd.read_csv('bank_client_information.csv')
bank_df.set_index('Last Name', inplace = True)

# 방법2
bank_df = pd.read_csv('bank_client_information.csv', index_col = 'Last Name')
Read more

220314 Pandas DataFrame Fundamentals

이번 포스팅에서는 본격적으로 Pandas의 DataFrame에 대한 학습을 하면서 학습한 내용들을 정리해보려고 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import pandas as pd

bank_client_df = pd.DataFrame({'Bank Client ID':[111, 222, 333, 444],
'Bank Client Name':['Laila Aly', 'Kate Steve', 'Nicole Mitch', 'Francis Morris'],
'Net Worth [$]':[35000, 3000, 100000, 2000],
'Years with Bank':[4, 7, 10, 15]})

bank_client_df

type(bank_client_df) #pandas.core.frame.DataFrame

#DataFrame의 상위 3개 값 출력
bank_client_df.head(3)

#DataFrame의 하위 1개 값 출력
bank_client_df.tail(1)

#DataFrame의 shape
bank_client_df.shape #(4, 4)

#DataFrame의 정보 출력
bank_client_df.info()

# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 4 entries, 0 to 3
# Data columns (total 4 columns):
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 Bank Client ID 4 non-null int64
# 1 Bank Client Name 4 non-null object
# 2 Net Worth [$] 4 non-null int64
# 3 Years with Bank 4 non-null int64
# dtypes: int64(3), object(1)
# memory usage: 256.0+ bytes

Pandas series는 pd.Series constructor method의 parameter로 data를 넘겨주어 Pandas series를 정의하였다. Pandas DataFrame도 마찬가지로 위와같이 pd.DataFrame constructor method의 parameter로 python의 dictionary data를 넘겨주어 정의한다.
Dictionary의 key/value에서 key값이 DataFrame의 column명이 되며, value의 리스트 타입의 값이 각 row의 값이 된다.

Pandas DataFrame example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# Challenge#1

# 이번 챌린지에서는 Pandas DataFrame에서 보유 주식 수와 각 주식의 가격을 곱해서 합한 결과를 구하는 문제이다.

portfolio_df = pd.DataFrame({
'stocker ticker symbols': ['NVDA','MSFT','FB', 'AMZN'],
'number of shares': [3, 4, 9, 8],
'price per share[$]': [3500, 200, 300, 400]
})

portfolio_df

portfolio_df['price per share[$]']
portfolio_df['number of shares']

stocks_dollar_value = portfolio_df['price per share[$]'] * portfolio_df['number of shares']
print(stocks_dollar_value)

stocks_dollar_value.sum()

print('Total Portfolio Value = {}'.format(stocks_dollar_value.sum()))


1. DEFINE A PANDAS DATAFRAME
[2]
1
import pandas as pd
[3]
0
# Let's define a two-dimensional Pandas DataFrame
# Note that you can create a pandas dataframe from a python dictionary
bank_client_df = pd.DataFrame({'Bank Client ID':[111, 222, 333, 444],
'Bank Client Name':['Laila Aly', 'Kate Steve', 'Nicole Mitch', 'Francis Morris'],
'Net Worth [$]':[35000, 3000, 100000, 2000],
'Years with Bank':[4, 7, 10, 15]})
bank_client_df

[4]
0
# Let's obtain the data type
type(bank_client_df)
pandas.core.frame.DataFrame
[7]
0
# you can only view the first couple of rows using .head()
bank_client_df.head(3)

[8]
0
# you can only view the last couple of rows using .tail()
bank_client_df.tail(1)

[9]
0
# You can obtain the shape of the DataFrame (#rows, #columns)
bank_client_df.shape
(4, 4)
[10]
0
# Obtain DataFrame information
bank_client_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Bank Client ID 4 non-null int64
1 Bank Client Name 4 non-null object
2 Net Worth [$] 4 non-null int64
3 Years with Bank 4 non-null int64
dtypes: int64(3), object(1)
memory usage: 256.0+ bytes

MINI CHALLENGE #1:

A porfolio contains a collection of securities such as stocks, bonds and ETFs. Define a dataframe named 'portfolio_df' that holds 3 different stock ticker symbols, number of shares, and price per share (feel free to choose any stocks)
Calculate the total value of the porfolio including all stocks
[20]
portfolio_df = pd.DataFrame({
'stocker ticker symbols': ['NVDA','MSFT','FB', 'AMZN'],
'number of shares': [3, 4, 9, 8],
'price per share[$]': [3500, 200, 300, 400]
})

portfolio_df

portfolio_df['price per share[$]']

# 0 3500
# 1 200
# 2 300
# 3 40
# Name: price per share[$], dtype: int64

portfolio_df['number of shares']

# 0 3
# 1 4
# 2 9
# 3 8
# Name: number of shares, dtype: int64

stocks_dollar_value = portfolio_df['price per share[$]'] * portfolio_df['number of shares']
print(stocks_dollar_value)

# 0 10500
# 1 800
# 2 2700
# 3 320
# dtype: int64

stocks_dollar_value.sum() # 14320

print('Total Portfolio Value = {}'.format(stocks_dollar_value.sum()))

# 0 10500
# 1 800
# 2 2700
# 3 3200
# dtype: int64
# Total Portfolio Value = 17200

2022/03/24(목) 추가 기록

INPUTS(CSV와 HTML DATA 읽기)

이번 파트에서는 Pandas를 활용하여 CSV, HTML 데이터를 읽고 해당 데이터를 DataFrame의 형태로 저장하는 부분에 대해서 정리해보겠다.
1
2
3
import pandas as pd

bank_df = pd.read_csv('bank_client_information.csv')
은행 고객 정보 DataFrame
1
2
3
import pandas as pd

house_prices_df = pd.read_html('https://www.livingin-canada.com/house-prices-canada.html')
은행 고객 정보 DataFrame

CSV에 데이터 프레임 쓰기

1
2
3
bank_df.to_csv('sample_output_noindex.csv', index = False)
bank_df.to_csv('sample_output_noindex.csv', index = False, compression='gzip') # 용량을 줄인다.(압축 파일 *.csv.gz)

220312 Pandas DataFrame으로 넘어가기 전 Pandas Series 최종복습 및 실습

(Kaggle dataset)Google playstore

이번 포스팅에서는 학습했던 Pandas series에 대한 내용에 대해서 복습 및 실습을 하고, 그에 대한 내용을 정리해보고자 한다.

우선 Pandas란 데이터를 분석하고 각종 처리를 할 때 이용하는 파이썬 언어 기반의 라이브러리이다.Pandas로 데이터를 표현하는 두 가지 방법이 있는데 바로 여지까지 학습했던 시리즈(Series)라는 녀석과 데이터프레임(DataFrame)이란 놈이다.

이전 포스팅에서 두 개념(시리즈/데이터프레임)에 대해서 간단하게 다뤄보았지만, 아주간단하게 요약을 하자면,

시리즈(Series)란, 표(table)로 포멧팅되지 않은 리스트 형태로만 표현된 것으로, 열(Column)이 하나인 데이터 프레임이라고 생각하면 된다. 즉, 데이터 프레임은 여러 column의 series를 dictionary형태로 묶은 것이라고 볼 수 있다.

1
2
3
4
5
6
7
# DataFrame 예시

import pandas as pad

# DataFrame 생성
# 각 행과 열에들어가는 값은 숫자는 물론, 문자나 boolean 형태도 가능하다.
pd.DataFrame({ 'Nanun' : [0, 3], 'Zoey' : [4, 2]}, index=['Apple', 'Banana'])

그래서 왜 Pandas를 사용하는데?

실제로 실무에서 분석하고 처리해야되는 데이터는 위에서 예시로 든 데이터와는 비교도 안 될 정도로 엄청 크고 방대할 것이다.
따라서 한눈에 보기 어려운 많은 양의 데이터가 어떤 개요(Overview)와 성향(Features)를 가지고 있고, 그 성향을 좀 더 잘 해석하기 위해서는 어떻게 데이터가 그룹화되어 표현되어야 하는지에 대한 남다른 해석능력도 필요하다. 그리고 데이터 중에서 유독 튀는 이상한 값은 없는지, 항상 확인하고 조작하는데 이 Pandas를 활용한다.

(Kaggle dataset)구글 플레이 스토어 앱 다운로드

CSV 파일을 Pandas를 이용해서 읽어보고 직접 조작해보도록 하겠다. dataset은 kaggle에서 제공해주는 데이터 중에서 개인적인 흥미에 따라 구글 플레이 스토어 앱 다운로드와 관련된 데이터셋 데이터 정보를 다운받았다.

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd

gpstore = pd.read_csv('./googleplaystore.csv', index_col=0)
#vscode에서 DataViewer로 DataFrame의 데이터 리스트를 확인하기 위해서는 데이터가 출력되는 부분에 Break Point를 두고,
#"실행 및 버그"에서 활성화 세션의 "변수" 영역에서 Break Point영역 변수명에 마우스 우측클릭해서 "View Value in Data Viewer" 항목을 선택한다.
print(gpstore)

#.shape를 통해 (rows x columns)를 확인할 수 있다.
print(gpstore.shape) #[10841 rows x 12 columns]

print(gpstore.head(n)) #DataFrame의 상단에서부터 n개까지 출력해준다.

Data viewer in VS Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 구글플레이 스토어에서 다운받은 앱들 중에서 평점이 4.0 이상인 것들만 Genres, Rating, Installs, Size 항목으로 분류해서 나타낼 수 있도록 DataFrame 구성
best_app = gpstore.loc[gpstore.Rating > 4.0, ['Genres', 'Rating', 'Installs', 'Size']]

print(best_app)

# 평점이 4.0이 넘는 구글 플레이스토어의 앱의 수 (6801)
print(best_app.count())

# Genres 6801
# Rating 6801
# Installs 6801
# Size 6801
# dtype: int64

print(best_app.groupby(['App']).count())
DataFrame filtered data

220308 AI를 위한 Pandas (Pandas series에서 특정 요소 찾기, Pandas series slicing)

pandas

Parantheses() 그리고 Brackets[]

  • 속성을 조회할때에는 Parantheses()를 사용하지 않는다.
    ex)my_series.values, my_series.shape

  • Parantheses()를 사용하는 경우에는 arguments(인자)를 포함하거나 Pandas series를 대체하거나 바꾼다.
    ex)my_series.tail(), my_series.head(), my_series.drop_duplicates()

  • Brackets[]를 사용하는 경우에는 Pandas series나 DataFrame에서 특정 요소에 접근하기 위함이다.
    ex)

Pandas series에서 특정 요소 찾기

1
2
sp500 = pd.read_csv('S&P500_Prices.csv', squeeze=True)
sp500[n-1] #n번째 index 값

Pandas series 슬라이싱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pandas as pd

sp500 = pd.read_csv('S&P500_Prices.csv', squeeze=True)

# index 0 ~ 4 까지 슬라이싱
# 오른쪽 숫자는 범위에서 포함되지 않는다. N-1
sp500[0:5]

# index 0 ~ 9 까지 슬라이싱
# 가장 처음 index부터 시작이기 때문에 아래와 같이 생략할 수 있다.
sp500[:10]

# index 5 ~ end 슬라이싱
sp500[5:]

# Challenge#13 마지막 세 개 요소를 제외한 Pandas series 출력
sp500[:-3]

220307 AI를 위한 Pandas (Pandas series의 method, Pandas를 활용한 csv파일 읽기, Pandas 빌트인 함수, Pandas series 정렬(index, values 기준), Pandas series 연산)

pandas

이번 포스팅에서는 Pandas series의 method에 대한 내용을 정리해보고자 한다.

Pandas series의 method

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pandas as pd

#Series.sum() : 합계
my_series = pd.Series(data = [100, 200, 500, 1000, 5000])

#Series.product(): 곱
my_series.product()

#Series.mean(): 평균
my_series.mean()

#Series.head(n): 위에서부터 n개 출력
my_series.head(2) #최 상단에서 2개까지 출력

#Series.tail(n): 아래에서부터 n개 출력
my_series.tail(2) #최 하단에서 2개까지 출력

#Series.memory_usage(): Pandas series가 사용하고 있는 용량 확인(bytes)
my_series.memory_usage() #example:168(bytes)

Pandas 활용해서 CSV 파일 읽기

1
2
3
4
5
6
7
8
9
10
11
12
#Pandas의 read_csv method를 활용해서 csv파일을 읽기 위해서는 squeeze=True option은 필수이다.
#squeeze=True : One dimentional table data를 읽기 위한 옵션
sp500 = pd.read_csv('S&P500_Prices.csv', squeeze=True)
type(sp500) #pandas.core.series.Series



#squeeze=False : Multi dimentional(다차원) table data를 읽기 위한 옵션이다.
sp500 = pd.read_csv('S&P500_Prices.csv', squeeze=False)
#squeeze=False or default
type(sp500) #pandas.core.frame.DataFrame

위의 각 결과를 보면 알 수 있듯이, Pandas series의 경우에는 formatting 없이 단순하게 (1차원의)하나의 열로 테이블화 된 형태로 데이터가 출력이 되고, DataFrame의 경우에는 각 셀에 스타일이 적용되어 테이블이 formatting되어 데이터가 출력된다.
데이터 프레임(DataFrame)이란 1개의 열이 아닌, 여러 행과 열을 가진 다차원 데이터 테이블이다.

Pandas 빌트인 함수

Pandas는 이미 존재하는 python의 수 많은 함수들과 상호동작한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
sp500 = pd.read_csv('S&P500_Prices.csv', squeeze=True)

#Pandas의 Data type을 얻을 때
type(sp500)

#Pandas series의 data길이를 얻을 때
len(sp500)

#Pandas series에서 최대값을 얻을 때
max(sp500)

#Pandas series에서 최소값을 얻을 때
min(sp500)

# 주어진 Pandas series type의 데이터(리스트)에서 모든 양의 값은 음의 값으로 Python의 built-in function을 활용하여 구하시오.
# 주어진 Pandas series의 값에서 중복되지 않은 Unique한 값을 Python의 built-in function을 활용하여 구하시오.
my_series = pd.Series(data = [-10, 100, -30, 50, 100])

result = [ -i for i in my_series ]

set(result)

#solution
#모든 값을 양의 값으로 치환하는 문제였다.
abs(my_series)

set(my_series)

Pandas series sorting(ascending order)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import pandas as pd

sp500 = pd.read_csv('S&P500_Prices.csv', squeeze=True)
print(sp500)

#sort the values in the dataframes
#최솟값 ~ 최대값 순으로 정렬
sp500.sort_values()

#sort_values()의 결과값은 별도로 변수에 저장해줘야한다. (메모리 정렬)
sp500.sort_values(inplace = True)


#index 순으로 정렬
sp500.sort_index(inplace = True)

#challenge#8 (descending sorting)
sp500.sort_values(ascending=False, inplace=True)

Pandas Series Math operation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
sp500 = pd.read_csv('S&P500_Prices.csv', squeeze=True)

#Sum method on Pandas series
sp500.sum()

#Count method on Pandas series
sp500.count()

#Obtain the maximum value
sp500.max()

#Obtain the minimum value
sp500.min()

#새로운 dataset을 다룰때 describe method를 사용한다.
# count, mean, std(표준편차), min, 25%, 50%, 75%, max 정보의 summary 정보를 알 수 있다.
sp500.describe()

#Challenge#9 Obtain the average price of the S&P500 using two different method
sp500.mean()
sp500.sum()/sp500.count()


#주어진 요소가 값으로 존재하는지 체크
1295.500000 in sp500.values

#주어진 요소가 인덱스로 존재하는지 체크
1295.500000 in sp500.index

#주어진 요소가 값이 아닌 인덱스로 존재하는지 체크 (in 은 기본적으로 index를 기준으로 찾는다)
1295.500000 in sp500

#Challenge#10
3349 in sp500.values

#sp500의 values를 반올림한다.
rounded_sp500 = round(sp500)

#반올림된 값 리스트에서 3349가 값이 존재하는지 확인한다.
3349 in rounded_sp500.values

210204 Plotly + Pandas Practice

Pandas

1
2
import pandas as pd
df = pd.read_csv("data/time_confirmed.csv")

Table에서 Column 특정 Column 제거하기

  • 제거할 Column은 drop()을 사용해서 제거해준다.

    1
    2
    3
    4
    5
    # 제거할 column명을 column 속성을 명시해서 제거하거나
    df = df.drop(column=["Column1","Column2","Column3","Column4"]).sum().reset_index(name="total")
    # 명시하지 않고 axis=1를 추가해서 제거할 수 있다.
    df = df.drop(["Column1","Column2","Column3","Column4"], axis=1).sum().reset_index(name="total")
    # 제거된 column을 제외한 column을 기준으로 합계(sum)를 구하고 series를 data frame으로 바꿔준다. 바꾼 후에 새로 추가된 합계 column의 이름은 "total"로 지정해준다. (.reset_index("total"))
Read more

210203 Plotly + Pandas Practice

Plotly+Pandas

Pandas를 사용해서 csv파일을 읽어보는 간단한 실습을 해보았다.

1
2
3
4
# -*- coding: utf-8 -*-
import pandas as pd

read_csv = pd.read_csv("data/test.csv")

Excel sheet의 head(Column title)만 추출하기

1
print(read_csv.head())

특정 Column name에 해당하는 데이터를 출력

1
print(read_csv["Column name"])

Column name(1), Column name(2), Column name(3)에 해당하는 데이터를 출력

1
2
3
4
read_csv = read_csv[["Column name(1)", "Column name(2)", "Column name(3)"]]

# Column이름과 함께 지정한 특정 Column들의 데이터들이 출력된다.
print(read_csv)
Read more

210203 [SyntaxError] Non-ASCII Character

Resolve error

Python과 Pandas를 활용하여 csv파일을 읽는 간단한 처리를 하던 중에 Non-ASCII Character 에러가 발생했다.

1
SyntaxError: Non-ASCII character '\xec' in file /Users/hyungilee/Documents/dev/side-projects/corona-dashboard/pandas_practice.py on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

Python의 경우, 기본적인 설정 상태에서 코드내에 한글이 있는 경우 코드 내의 한글을 Python 코드를 읽어들이지 못해서 위의 에러가 발생한다.

해결방법은 아래와 같이 파이썬 코드 맨 위 첫번째 혹은 두번째 줄에 한글 인코딩을 하도록 명령해주면 된다.

1
2
# -*- coding: utf-8 -*-
# -*- coding: euc-kr -*-
Read more

210202 Plotly + Pandas Project

Plotly+Pandas

  • Pandas

    • 방대한 양의 데이터를 가져와서 데이터를 깔끔하게 만들고, 처리하고, 구조를 변경(데이터 가공)하는데 사용된다.

    • 데이터 분석과 처리를 쉽게 할 수 있도록 도와준다.

    1
    $ pip install pandas

  • Plotly

    • 모든 그래픽(그래프)를 만드는데에 사용된다.
    • No JavaScript required
    1
    $ pip install dash==1.14.0
Read more