데이터 분석/판다스

[Pandas] 시애틀 강수량 데이터 분석

eunnys 2023. 11. 13. 15:43

 

Seattle2014.csv
0.04MB

 


- 데이터 로딩
- 필요하지 않은 컬럼 삭제 (STATION, STATION_NAME)
- DATE를 날짜 형식으로 수정 : 기존 DATE 컬럼의 타입 int -> str로 변경 후 날짜 형식으로 변경
- 날짜 컬럼을 인덱스로 변경
- 강수량('PRCP')이 많은 날 상위 10일 출력
- 1월 강수량만 출력
- 1년동안 강수량이 40미만으로 내린 날이 몇일인가?
- 1월에 내린 강수량의 합과 평균 강수량
- 2월에 내린 강수량의 합과 평균 강수량

 

import pandas as pd
import numpy as np
df = pd.read_csv('Seattle2014.csv')

df.shape
df.head()
df.tail()
df.sample()
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 365 entries, 0 to 364
Data columns (total 17 columns):
 #   Column        Non-Null Count  Dtype 
---  ------        --------------  ----- 
 0   STATION       365 non-null    object
 1   STATION_NAME  365 non-null    object
 2   DATE          365 non-null    int64 
 3   PRCP          365 non-null    int64 
 4   SNWD          365 non-null    int64 
 5   SNOW          365 non-null    int64 
 6   TMAX          365 non-null    int64 
 7   TMIN          365 non-null    int64 
 8   AWND          365 non-null    int64 
 9   WDF2          365 non-null    int64 
 10  WDF5          365 non-null    int64 
 11  WSF2          365 non-null    int64 
 12  WSF5          365 non-null    int64 
 13  WT01          365 non-null    int64 
 14  WT05          365 non-null    int64 
 15  WT02          365 non-null    int64 
 16  WT03          365 non-null    int64 
dtypes: int64(15), object(2)
memory usage: 48.6+ KB

np.sum(df.isna()) # 결측치(True값) 개수
STATION         0
STATION_NAME    0
DATE            0
PRCP            0
SNWD            0
SNOW            0
TMAX            0
TMIN            0
AWND            0
WDF2            0
WDF5            0
WSF2            0
WSF5            0
WT01            0
WT05            0
WT02            0
WT03            0
dtype: int64

# 컬럼 삭제 (STATION, STATION_NAME)
df.drop(['STATION','STATION_NAME'], axis=1, inplace=True)
df


# (1) DATE를 날짜 형식으로 수정 (format 지정)
df2 = df.copy()
df2['DATE'] = pd.to_datetime(df2['DATE'], format='%Y%m%d')
# (2) DATE를 날짜 형식으로 수정 : 기존 DATE 컬럼의 타입 int -> str로 변경 후 날짜 형식으로 변경
df['DATE'] = df['DATE'].astype('str')
df['DATE'] = pd.to_datetime(df['DATE'])
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 365 entries, 0 to 364
Data columns (total 15 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   DATE    365 non-null    datetime64[ns]
 1   PRCP    365 non-null    int64         
 2   SNWD    365 non-null    int64         
 3   SNOW    365 non-null    int64         
 4   TMAX    365 non-null    int64         
 5   TMIN    365 non-null    int64         
 6   AWND    365 non-null    int64         
 7   WDF2    365 non-null    int64         
 8   WDF5    365 non-null    int64         
 9   WSF2    365 non-null    int64         
 10  WSF5    365 non-null    int64         
 11  WT01    365 non-null    int64         
 12  WT05    365 non-null    int64         
 13  WT02    365 non-null    int64         
 14  WT03    365 non-null    int64         
dtypes: datetime64[ns](1), int64(14)
memory usage: 42.9 KB

# 날짜 컬럼을 인덱스로 변경
df.set_index('DATE', inplace=True)
df.head()


# 강수량('PRCP')이 많은 날 상위 10일 출력
# 강수량을 기준으로 내림차순 후 상위 10개만 출력
df.sort_values(by='PRCP', ascending=False)[['PRCP']].head(10)


# 1월 강수량만 출력
df[['PRCP']][df.index.month == 1]


# 1년동안 강수량이 40미만으로 내린 날이 몇일인가? (277일)
len(df[df['PRCP'] < 40])

np.sum(df['PRCP'] < 40)

df[df['PRCP'] < 40].shape[0]

# not null 포함하지 않는 개수
df[df['PRCP'] < 40]['PRCP'].count()

# 1월에 내린 강수량의 합과 평균 강수량 (반올림, 소수점 이하 2자리까지)
df['PRCP'][df.index.month == 1].agg(['sum', 'mean']).apply(lambda x: np.round(x, 2))
sum     940.00
mean     30.32
Name: PRCP, dtype: float64

# 2월에 내린 강수량의 합과 평균 강수량
df['PRCP'][df.index.month == 2].agg(['sum','mean']).apply(lambda x:np.round(x, 2))
sum     1552.00
mean      55.43
Name: PRCP, dtype: float64