In [40]:
# 데이터프레임의 열은 파이썬의 변수와 비슷하다
# melt 메서드 -- 데이터프레임 깔끔한 데이터로 정리하기 / 지정한 열의 데이터 모두 행으로 정리
# metl 메서드 인자
'''
id_vars - 위치 그대로 유지할 열의 이름을 지정
value_vars - 행으로 위치 변경할 열의 이름 지정
var_name - value_vars 위치 변경한 열의 이름 지정
value_name - var_name 위치 변경한 열의 데이터 저장한 열의 이름을 지정
'''
# 피벗 데이블 뜻 -
# 데이터 프레임에서 두 개의 열을 이용하여 행/열 인덱스 reshape 된 테이블
Out[40]:
'\nid_vars - 위치 그대로 유지할 열의 이름을 지정\nvalue_vars - 행으로 위치 변경할 열의 이름 지정\nvar_name - value_vars 위치 변경한 열의 이름 지정\nvalue_name - var_name 위치 변경한 열의 데이터 저장한 열의 이름을 지정\n\n'
1개의 열만 고정하고 나머지 열을 행으로 바꾸기¶
In [41]:
import pandas as pd
pew=pd.read_csv('../data/pew.csv')
pew.head()
Out[41]:
religion | <$10k | $10-20k | $20-30k | $30-40k | $40-50k | $50-75k | $75-100k | $100-150k | >150k | Don't know/refused | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | Agnostic | 27 | 34 | 60 | 81 | 76 | 137 | 122 | 109 | 84 | 96 |
1 | Atheist | 12 | 27 | 37 | 52 | 35 | 70 | 73 | 59 | 74 | 76 |
2 | Buddhist | 27 | 21 | 30 | 34 | 33 | 58 | 62 | 39 | 53 | 54 |
3 | Catholic | 418 | 617 | 732 | 670 | 638 | 1116 | 949 | 792 | 633 | 1489 |
4 | Don’t know/refused | 15 | 14 | 15 | 11 | 10 | 35 | 21 | 17 | 18 | 116 |
In [42]:
# 6개의 열 출력 / 만약 소득 정보 열을 행 데이터로 옮기고 싶다면
pew.iloc[:, 0:6]
Out[42]:
religion | <$10k | $10-20k | $20-30k | $30-40k | $40-50k | |
---|---|---|---|---|---|---|
0 | Agnostic | 27 | 34 | 60 | 81 | 76 |
1 | Atheist | 12 | 27 | 37 | 52 | 35 |
2 | Buddhist | 27 | 21 | 30 | 34 | 33 |
3 | Catholic | 418 | 617 | 732 | 670 | 638 |
4 | Don’t know/refused | 15 | 14 | 15 | 11 | 10 |
5 | Evangelical Prot | 575 | 869 | 1064 | 982 | 881 |
6 | Hindu | 1 | 9 | 7 | 9 | 11 |
7 | Historically Black Prot | 228 | 244 | 236 | 238 | 197 |
8 | Jehovah's Witness | 20 | 27 | 24 | 24 | 21 |
9 | Jewish | 19 | 19 | 25 | 25 | 30 |
10 | Mainline Prot | 289 | 495 | 619 | 655 | 651 |
11 | Mormon | 29 | 40 | 48 | 51 | 56 |
12 | Muslim | 6 | 7 | 9 | 10 | 9 |
13 | Orthodox | 13 | 17 | 23 | 32 | 32 |
14 | Other Christian | 9 | 7 | 11 | 13 | 13 |
15 | Other Faiths | 20 | 33 | 40 | 46 | 49 |
16 | Other World Religions | 5 | 2 | 3 | 4 | 2 |
17 | Unaffiliated | 217 | 299 | 374 | 365 | 341 |
In [43]:
# id_vars 인잣값으로 지정한 열을 제외한 나머지 소득 정보열이 variable 열로 정리되고 소득 정보 열의 행 데이터도 value 열로 정리
# 위 과정을 religion열 고정하여 피벗했다
pew_long= pd.melt(pew, id_vars='religion')
print(pew_long.head())
religion variable value
0 Agnostic <$10k 27
1 Atheist <$10k 12
2 Buddhist <$10k 27
3 Catholic <$10k 418
4 Don’t know/refused <$10k 15
In [44]:
# variable, value 열 이름 바꾸기/ var_name, value_name 인잣값 사용/ variable, value 열 이름을 income, count 로 재설정
pew_long=pd.melt(pew, id_vars='religion', var_name='income', value_name='count')
pew_long.head()
Out[44]:
religion | income | count | |
---|---|---|---|
0 | Agnostic | <$10k | 27 |
1 | Atheist | <$10k | 12 |
2 | Buddhist | <$10k | 27 |
3 | Catholic | <$10k | 418 |
4 | Don’t know/refused | <$10k | 15 |
2개 이상의 열을 고정하고 나머지 열을 행으로 바꾸기¶
In [45]:
# 빌보드 차트에서 데이터프레임이 어떻게 구성되어 있는지 확인
billboard= pd.read_csv('../data/billboard.csv')
print(billboard.iloc[0:5, 0:16])
year artist track time date.entered wk1 wk2 \
0 2000 2 Pac Baby Don't Cry (Keep... 4:22 2000-02-26 87 82.0
1 2000 2Ge+her The Hardest Part Of ... 3:15 2000-09-02 91 87.0
2 2000 3 Doors Down Kryptonite 3:53 2000-04-08 81 70.0
3 2000 3 Doors Down Loser 4:24 2000-10-21 76 76.0
4 2000 504 Boyz Wobble Wobble 3:35 2000-04-15 57 34.0
wk3 wk4 wk5 wk6 wk7 wk8 wk9 wk10 wk11
0 72.0 77.0 87.0 94.0 99.0 NaN NaN NaN NaN
1 92.0 NaN NaN NaN NaN NaN NaN NaN NaN
2 68.0 67.0 66.0 57.0 54.0 53.0 51.0 51.0 51.0
3 72.0 69.0 67.0 65.0 55.0 59.0 62.0 61.0 61.0
4 25.0 17.0 17.0 31.0 36.0 49.0 53.0 57.0 64.0
In [46]:
# year, artist, track, time, date.entered 열 모두 고정 나머지 열 피벗하기
billboard_long= pd.melt(billboard, id_vars=['year', 'artist', 'track', 'time', 'date.entered'], var_name='week', value_name='rating')
print(billboard_long.head())
year artist track time date.entered week rating
0 2000 2 Pac Baby Don't Cry (Keep... 4:22 2000-02-26 wk1 87.0
1 2000 2Ge+her The Hardest Part Of ... 3:15 2000-09-02 wk1 91.0
2 2000 3 Doors Down Kryptonite 3:53 2000-04-08 wk1 81.0
3 2000 3 Doors Down Loser 4:24 2000-10-21 wk1 76.0
4 2000 504 Boyz Wobble Wobble 3:35 2000-04-15 wk1 57.0
ebola 데이터 집합 살펴보기¶
In [47]:
# 0 1 2 3 10 11 / 5개 데이터만 확인
ebola= pd.read_csv('../data/country_timeseries.csv')
ebola.columns
Out[47]:
Index(['Date', 'Day', 'Cases_Guinea', 'Cases_Liberia', 'Cases_SierraLeone',
'Cases_Nigeria', 'Cases_Senegal', 'Cases_UnitedStates', 'Cases_Spain',
'Cases_Mali', 'Deaths_Guinea', 'Deaths_Liberia', 'Deaths_SierraLeone',
'Deaths_Nigeria', 'Deaths_Senegal', 'Deaths_UnitedStates',
'Deaths_Spain', 'Deaths_Mali'],
dtype='object')
In [48]:
ebola.iloc[:5, [0, 1, 2, 3, 10, 11]]
Out[48]:
Date | Day | Cases_Guinea | Cases_Liberia | Deaths_Guinea | Deaths_Liberia | |
---|---|---|---|---|---|---|
0 | 1/5/2015 | 289 | 2776.0 | NaN | 1786.0 | NaN |
1 | 1/4/2015 | 288 | 2775.0 | NaN | 1781.0 | NaN |
2 | 1/3/2015 | 287 | 2769.0 | 8166.0 | 1767.0 | 3496.0 |
3 | 1/2/2015 | 286 | NaN | 8157.0 | NaN | 3496.0 |
4 | 12/31/2014 | 284 | 2730.0 | 8115.0 | 1739.0 | 3471.0 |
In [49]:
# date day 고정하고 나머지를 행으로 피벗/ 그러면 각 나라별 사망자 수 행으로 볼 수있음
ebola_long=pd.melt(ebola, id_vars=['Date', 'Day'])
ebola_long.head()
Out[49]:
Date | Day | variable | value | |
---|---|---|---|---|
0 | 1/5/2015 | 289 | Cases_Guinea | 2776.0 |
1 | 1/4/2015 | 288 | Cases_Guinea | 2775.0 |
2 | 1/3/2015 | 287 | Cases_Guinea | 2769.0 |
3 | 1/2/2015 | 286 | Cases_Guinea | NaN |
4 | 12/31/2014 | 284 | Cases_Guinea | 2730.0 |
열 이름 나누고 데이터 프레임에 추가하기¶
In [50]:
# split 메서드로 열 이름 분리하기 / split 메서드는 공백을 기준으로 문자열 자른다
# split 메서드에 '_' 전달하기
variable_split= ebola_long.variable.str.split('_')
variable_split[:5]
Out[50]:
0 [Cases, Guinea]
1 [Cases, Guinea]
2 [Cases, Guinea]
3 [Cases, Guinea]
4 [Cases, Guinea]
Name: variable, dtype: object
In [51]:
# variable_split 에 저장된 값의 자료형은 시리즈 - 시리즈에 저장된 값의 자료형은 리스트
type(variable_split)
Out[51]:
pandas.core.series.Series
In [52]:
type(variable_split[0])
Out[52]:
list
In [53]:
# 문자열 분리하여 데이터프레임의 새로운 열 추가 - get 메서드 사용해 0, 1 번째 인덱스의 데이터 한 번에 추출
status_values= variable_split.str.get(0)
country_values=variable_split.str.get(1)
print(status_values[:5])
print(status_values[-5:])
print(country_values[:5])
print(country_values[-5:])
0 Cases
1 Cases
2 Cases
3 Cases
4 Cases
Name: variable, dtype: object
1947 Deaths
1948 Deaths
1949 Deaths
1950 Deaths
1951 Deaths
Name: variable, dtype: object
0 Guinea
1 Guinea
2 Guinea
3 Guinea
4 Guinea
Name: variable, dtype: object
1947 Mali
1948 Mali
1949 Mali
1950 Mali
1951 Mali
Name: variable, dtype: object
In [54]:
# 분리한 문자열을 status, country 열 이름의 데이터 프레임에 추가한 코드
ebola_long['status']=status_values
ebola_long['status']=country_values
ebola_long.head()
Out[54]:
Date | Day | variable | value | status | |
---|---|---|---|---|---|
0 | 1/5/2015 | 289 | Cases_Guinea | 2776.0 | Guinea |
1 | 1/4/2015 | 288 | Cases_Guinea | 2775.0 | Guinea |
2 | 1/3/2015 | 287 | Cases_Guinea | 2769.0 | Guinea |
3 | 1/2/2015 | 286 | Cases_Guinea | NaN | Guinea |
4 | 12/31/2014 | 284 | Cases_Guinea | 2730.0 | Guinea |
concat 메서드를 응용하여 데이터프레임에 열 추가하기¶
In [55]:
variable_split=ebola_long.variable.str.split('_', expand=True)
variable_split.columns=['status', 'country']
ebola_parsed=pd.concat([ebola_long, variable_split], axis=1)
ebola_parsed.head()
# status, country 열이 한 번 더 추가 되었음
Out[55]:
Date | Day | variable | value | status | status | country | |
---|---|---|---|---|---|---|---|
0 | 1/5/2015 | 289 | Cases_Guinea | 2776.0 | Guinea | Cases | Guinea |
1 | 1/4/2015 | 288 | Cases_Guinea | 2775.0 | Guinea | Cases | Guinea |
2 | 1/3/2015 | 287 | Cases_Guinea | 2769.0 | Guinea | Cases | Guinea |
3 | 1/2/2015 | 286 | Cases_Guinea | NaN | Guinea | Cases | Guinea |
4 | 12/31/2014 | 284 | Cases_Guinea | 2730.0 | Guinea | Cases | Guinea |
기상 데이터의 여러 열을 하나로 정리하기¶
In [56]:
# 날짜 열을 행 데이터로 피벗
weather= pd.read_csv('../data/weather.csv')
weather.iloc[:5, :]
Out[56]:
id | year | month | element | d1 | d2 | d3 | d4 | d5 | d6 | ... | d22 | d23 | d24 | d25 | d26 | d27 | d28 | d29 | d30 | d31 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | MX17004 | 2010 | 1 | tmax | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 27.8 | NaN |
1 | MX17004 | 2010 | 1 | tmin | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 14.5 | NaN |
2 | MX17004 | 2010 | 2 | tmax | NaN | 27.3 | 24.1 | NaN | NaN | NaN | ... | NaN | 29.9 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
3 | MX17004 | 2010 | 2 | tmin | NaN | 14.4 | 14.4 | NaN | NaN | NaN | ... | NaN | 10.7 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
4 | MX17004 | 2010 | 3 | tmax | NaN | NaN | NaN | NaN | 32.1 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
5 rows × 35 columns
In [57]:
# melt로 일별 온도 측정값 피벗/ day 열에 날짜열 정리 , 날짜 열의 데이터는 temp 열에 정리
weather_melt=pd.melt(weather, id_vars=['id', 'year', 'month', 'element'], var_name='day', value_name='temp')
weather_melt.head()
Out[57]:
id | year | month | element | day | temp | |
---|---|---|---|---|---|---|
0 | MX17004 | 2010 | 1 | tmax | d1 | NaN |
1 | MX17004 | 2010 | 1 | tmin | d1 | NaN |
2 | MX17004 | 2010 | 2 | tmax | d1 | NaN |
3 | MX17004 | 2010 | 2 | tmin | d1 | NaN |
4 | MX17004 | 2010 | 3 | tmax | d1 | NaN |
In [58]:
# pivot_table 메서드 - 행과 열의 위치 다시 바꿔 정리
# index 인자에 위치를 그대로 유지할 열 이름 지정, columns 인자에 피벗할 열 이름 지정, values 인자에 새로운 열의 데이터 될 열 이름 지정
weather_tidy=weather_melt.pivot_table(
index=['id', 'year', 'month', 'day'],
columns='element',
values='temp'
)
weather_tidy
Out[58]:
element | tmax | tmin | |||
---|---|---|---|---|---|
id | year | month | day | ||
MX17004 | 2010 | 1 | d30 | 27.8 | 14.5 |
2 | d11 | 29.7 | 13.4 | ||
d2 | 27.3 | 14.4 | |||
d23 | 29.9 | 10.7 | |||
d3 | 24.1 | 14.4 | |||
3 | d10 | 34.5 | 16.8 | ||
d16 | 31.1 | 17.6 | |||
d5 | 32.1 | 14.2 | |||
4 | d27 | 36.3 | 16.7 | ||
5 | d27 | 33.2 | 18.2 | ||
6 | d17 | 28.0 | 17.5 | ||
d29 | 30.1 | 18.0 | |||
7 | d3 | 28.6 | 17.5 | ||
d14 | 29.9 | 16.5 | |||
8 | d23 | 26.4 | 15.0 | ||
d5 | 29.6 | 15.8 | |||
d29 | 28.0 | 15.3 | |||
d13 | 29.8 | 16.5 | |||
d25 | 29.7 | 15.6 | |||
d31 | 25.4 | 15.4 | |||
d8 | 29.0 | 17.3 | |||
10 | d5 | 27.0 | 14.0 | ||
d14 | 29.5 | 13.0 | |||
d15 | 28.7 | 10.5 | |||
d28 | 31.2 | 15.0 | |||
d7 | 28.1 | 12.9 | |||
11 | d2 | 31.3 | 16.3 | ||
d5 | 26.3 | 7.9 | |||
d27 | 27.7 | 14.2 | |||
d26 | 28.1 | 12.1 | |||
d4 | 27.2 | 12.0 | |||
12 | d1 | 29.9 | 13.8 | ||
d6 | 27.8 | 10.5 |
In [59]:
# reset_index
weather_tidy_flat= weather_tidy.reset_index()
weather_tidy_flat.head()
Out[59]:
element | id | year | month | day | tmax | tmin |
---|---|---|---|---|---|---|
0 | MX17004 | 2010 | 1 | d30 | 27.8 | 14.5 |
1 | MX17004 | 2010 | 2 | d11 | 29.7 | 13.4 |
2 | MX17004 | 2010 | 2 | d2 | 27.3 | 14.4 |
3 | MX17004 | 2010 | 2 | d23 | 29.9 | 10.7 |
4 | MX17004 | 2010 | 2 | d3 | 24.1 | 14.4 |
빌보드 차트의 중복 데이터 처리하기¶
In [60]:
# artist track time date.entered 열의 데이터 반복
# 빌보드 데이터 불러오기
billboard=pd.read_csv('../data/billboard.csv')
billboard_long= pd.melt(billboard, id_vars=['year', 'artist', 'track', 'time', 'date.entered'], var_name='week', value_name='rating')
billboard_long.shape
Out[60]:
(24092, 7)
In [61]:
billboard_long.head()
Out[61]:
year | artist | track | time | date.entered | week | rating | |
---|---|---|---|---|---|---|---|
0 | 2000 | 2 Pac | Baby Don't Cry (Keep... | 4:22 | 2000-02-26 | wk1 | 87.0 |
1 | 2000 | 2Ge+her | The Hardest Part Of ... | 3:15 | 2000-09-02 | wk1 | 91.0 |
2 | 2000 | 3 Doors Down | Kryptonite | 3:53 | 2000-04-08 | wk1 | 81.0 |
3 | 2000 | 3 Doors Down | Loser | 4:24 | 2000-10-21 | wk1 | 76.0 |
4 | 2000 | 504 Boyz | Wobble Wobble | 3:35 | 2000-04-15 | wk1 | 57.0 |
In [62]:
# 노래제목 loser 인 데이터만 모아 / 가수는 고유값으로 따로 관리- 데이터 일관성
billboard_long[billboard_long.track == 'Loser'].head()
Out[62]:
year | artist | track | time | date.entered | week | rating | |
---|---|---|---|---|---|---|---|
3 | 2000 | 3 Doors Down | Loser | 4:24 | 2000-10-21 | wk1 | 76.0 |
320 | 2000 | 3 Doors Down | Loser | 4:24 | 2000-10-21 | wk2 | 76.0 |
637 | 2000 | 3 Doors Down | Loser | 4:24 | 2000-10-21 | wk3 | 72.0 |
954 | 2000 | 3 Doors Down | Loser | 4:24 | 2000-10-21 | wk4 | 69.0 |
1271 | 2000 | 3 Doors Down | Loser | 4:24 | 2000-10-21 | wk5 | 67.0 |
In [63]:
# 중복 데이터 가지고 있는 열은 year artisti track time date 임-- 이 열을 따로 모아 새로운 데이터 프레임에 저장
billboard_songs=billboard_long[['year', 'artist', 'track', 'time']]
billboard_songs.shape
Out[63]:
(24092, 4)
In [64]:
# drop_duplicates 중복 데이터 제거
billboard_songs=billboard_songs.drop_duplicates()
billboard_songs.shape
Out[64]:
(317, 4)
In [65]:
# 중복 제거 데이터프레임에 아이디 추가 -- 데이터 쉽게 조회 및 구분 위해
billboard_songs['id']=range(len(billboard_songs))
billboard_songs.head(n=10)
Out[65]:
year | artist | track | time | id | |
---|---|---|---|---|---|
0 | 2000 | 2 Pac | Baby Don't Cry (Keep... | 4:22 | 0 |
1 | 2000 | 2Ge+her | The Hardest Part Of ... | 3:15 | 1 |
2 | 2000 | 3 Doors Down | Kryptonite | 3:53 | 2 |
3 | 2000 | 3 Doors Down | Loser | 4:24 | 3 |
4 | 2000 | 504 Boyz | Wobble Wobble | 3:35 | 4 |
5 | 2000 | 98^0 | Give Me Just One Nig... | 3:24 | 5 |
6 | 2000 | A*Teens | Dancing Queen | 3:44 | 6 |
7 | 2000 | Aaliyah | I Don't Wanna | 4:15 | 7 |
8 | 2000 | Aaliyah | Try Again | 4:03 | 8 |
9 | 2000 | Adams, Yolanda | Open My Heart | 5:30 | 9 |
In [66]:
# merge- 노래정보 주간 순위 데이터 합치기
billboard_ratings= billboard_long.merge(billboard_songs, on=['year', 'artist', 'track', 'time'])
billboard_ratings.shape
Out[66]:
(24092, 8)
In [67]:
billboard_ratings.head()
Out[67]:
year | artist | track | time | date.entered | week | rating | id | |
---|---|---|---|---|---|---|---|---|
0 | 2000 | 2 Pac | Baby Don't Cry (Keep... | 4:22 | 2000-02-26 | wk1 | 87.0 | 0 |
1 | 2000 | 2 Pac | Baby Don't Cry (Keep... | 4:22 | 2000-02-26 | wk2 | 82.0 | 0 |
2 | 2000 | 2 Pac | Baby Don't Cry (Keep... | 4:22 | 2000-02-26 | wk3 | 72.0 | 0 |
3 | 2000 | 2 Pac | Baby Don't Cry (Keep... | 4:22 | 2000-02-26 | wk4 | 77.0 | 0 |
4 | 2000 | 2 Pac | Baby Don't Cry (Keep... | 4:22 | 2000-02-26 | wk5 | 87.0 | 0 |
뉴욕 택시 데이터 준비¶
In [68]:
'''
import os
import urllib.request
with open('../data/raw_data_urls.txt', 'r')as data_urls:
for line, url in enumerate(data_urls):
if line ==5:
break
fn=url.split('/')[-1].strip()
fp=os.path.join('', '../data', fn)
print(url)
print(fp)
urllib.request.urlretrieve(url,fp)
'''
Out[68]:
"\nimport os\nimport urllib.request\n\nwith open('../data/raw_data_urls.txt', 'r')as data_urls:\n for line, url in enumerate(data_urls):\n if line ==5:\n break\n fn=url.split('/')[-1].strip()\n fp=os.path.join('', '../data', fn)\n print(url)\n print(fp)\n urllib.request.urlretrieve(url,fp)\n "
In [70]:
import os
import urllib.request
with open('../data/raw_data_urls.txt', 'r') as data_urls:
for line, url in enumerate(data_urls):
if line == 5:
break
fn = url.split('/')[-1].strip()
fp=os.path.join('', '../data', fn)
print(url)
print(fp)
urllib.request.urlretrieve(url, fp)
https://s3.amazonaws.com/nyc-tlc/trip+data/fhv_tripdata_2015-01.csv
../data\fhv_tripdata_2015-01.csv
---------------------------------------------------------------------------
HTTPError Traceback (most recent call last)
C:\Users\Public\Documents\ESTsoft\CreatorTemp\ipykernel_16012\3615890487.py in <module>
10 print(url)
11 print(fp)
---> 12 urllib.request.urlretrieve(url, fp)
~\anaconda3\lib\urllib\request.py in urlretrieve(url, filename, reporthook, data)
237 url_type, path = _splittype(url)
238
--> 239 with contextlib.closing(urlopen(url, data)) as fp:
240 headers = fp.info()
241
~\anaconda3\lib\urllib\request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)
212 else:
213 opener = _opener
--> 214 return opener.open(url, data, timeout)
215
216 def install_opener(opener):
~\anaconda3\lib\urllib\request.py in open(self, fullurl, data, timeout)
521 for processor in self.process_response.get(protocol, []):
522 meth = getattr(processor, meth_name)
--> 523 response = meth(req, response)
524
525 return response
~\anaconda3\lib\urllib\request.py in http_response(self, request, response)
630 # request was successfully received, understood, and accepted.
631 if not (200 <= code < 300):
--> 632 response = self.parent.error(
633 'http', request, response, code, msg, hdrs)
634
~\anaconda3\lib\urllib\request.py in error(self, proto, *args)
559 if http_err:
560 args = (dict, 'default', 'http_error_default') + orig_args
--> 561 return self._call_chain(*args)
562
563 # XXX probably also want an abstract factory that knows when it makes
~\anaconda3\lib\urllib\request.py in _call_chain(self, chain, kind, meth_name, *args)
492 for handler in handlers:
493 func = getattr(handler, meth_name)
--> 494 result = func(*args)
495 if result is not None:
496 return result
~\anaconda3\lib\urllib\request.py in http_error_default(self, req, fp, code, msg, hdrs)
639 class HTTPDefaultErrorHandler(BaseHandler):
640 def http_error_default(self, req, fp, code, msg, hdrs):
--> 641 raise HTTPError(req.full_url, code, msg, hdrs, fp)
642
643 class HTTPRedirectHandler(BaseHandler):
HTTPError: HTTP Error 403: Forbidden
반복문으로 데이터 준비하기¶
In [ ]:
'판다스' 카테고리의 다른 글
판다스 9장 문자열 처리하기 (0) | 2023.03.13 |
---|---|
판다스 8장 - 자료형변환/ 카테고리 자료형 (0) | 2023.03.10 |
판다스 6장 누락값 처리 (0) | 2023.03.09 |
판다스 5장 데이터 연결하기 - concat/ merge (0) | 2023.03.08 |
판다스 입문 4장 데이터 시각화- 그래프 그리기 (0) | 2023.03.04 |