temp/실습
데이터 분석 실전연습: 날짜데이터(따릉이)
시송
2025. 1. 8. 09:09
1. all code of bike file processing
더보기
import pandas as pd
import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import folium
bikes_temp = {} #빈 데이터 프레임
for i in range(1, 7):
bikes_temp[i] = pd.read_csv(f'data/bike_rent_{i}.csv', encoding='cp949', parse_dates=['대여일시'])
bikes = pd.concat(bikes_temp, ignore_index=True)
pd.options.display.float_format = '{:.2f}'.format
bikes['일자'] = bikes['대여일시'].dt.day
bikes['대여시간대'] = bikes['대여일시'].dt.hour
#bikes['분'] = bikes['대여일시'].dt.minute
bikes['요일'] = bikes['대여일시'].dt.dayofweek.apply(lambda i: '월화수목금토일'[i])
bikes['주말구분'] = bikes['대여일시'].dt.dayofweek.apply(lambda x: '평일' if x < 5 else '주말')
bike_shop = pd.read_csv('data/bike_shop.csv', encoding='cp949')
bike_gu = bike_shop[['구분','대여소번호','대여소명','위도','경도']]
bikes = pd.merge(bikes, bike_gu, left_on='대여 대여소번호', right_on='대여소번호')
bikes.drop(columns=['대여소번호', '대여소명'], axis=1, inplace=True)
bikes.rename(columns={'구분':'대여구', '위도':'대여점위도', '경도':'대여점경도'}, inplace=True)
1) csv 파일 가져오기
bike_imsi = pd.read_csv('bike_rent_1.csv', encoding='cp949', parse_dates=['대여일시']) #parse_dates: 시간으로 다루고 싶은 컬럼
bikes_temp = pd.concat([temp1, temp2, temp3, temp4, temp5, temp6]) #빈 데이터 프레임
bikes_temp = {} #빈 dict 프레임에 추가 {n:df.csv
for i in range(6):
bikes_temp[i] = pd.read_csv(f'bike_rent_{i+1}.csv', encoding='cp949', parse_dates=['대여일시']) # csv에도 f-string 적용가능
#ignore_index 기존 인덱스를 무시하고 다시 순서를 0부터 정한다.
bikes = pd.concat(bikes_temp, ignore_index=True) #value만 연결
- read_csv('파일명.csv', encoding='cp949): 한글코드 오류 방지
- 함수 안에 인자도 f-string 사용 가능
2) 날짜-요일 변환
bikes['일자'] = bikes['대여일시'].dt.day
bikes['대여시간대'] = bikes['대여일시'].dt.hour
bikes['요일'] = bikes['대여일시'].dt.dayofweek
#0
weeks = {0:'월', 1:'화', 2:'수', 3:'목', 4:'금', 5:'토', 6:'일'}
bikes['요일'] = bikes['요일'].map(weeks) #key-value와 형태가 비슷하다.
#1
week = ['월', '화', '수','목', '금', '토', '일']
bikes['대여일시'].dt.dayofweek.apply(lambda x: week[x])
#2
bikes['대여일시'].dt.dayofweek.apply(lambda i: '월화수목금토일'[i])
if bikes['요일'] in ['토', '일']:
bikes['주말구분'] = '주말'
else:
bikes['주말구분'] = '평일'
- dt.day
- dt.hour
- dt.dayofweek : int로 변환(0~6)
- map( dict{key:value} ) : key를 value로 변환
- list[n]의 list는 결국 특정 list(type.list)를 받아오는 변수이다. 이는 스트링도 마찬가지
- '가나다'[1], [1,2,3,4][1] 모두 잘 작동한다.
3) left/right join by merge
# bikes 데이터 프레임에 bike_gu 데이터프레임 합치기, 기준은 대여소 번호
bikes = pd.merge(bikes,bike_gu, left_on='대여 대여소번호', right_on='대여소번호' )
4) ect.
pd.options.display.float_format = '{:.2f}'.format # 지수 삭제
bikes.describe(include=['object', 'datetime64']) #특정 dtype도 포함
# 프레임의 행 확인하기
bikes.shape[0]
#프레임의 열 확인하기
bikes.shape[1]
2. 시각화
pivot table(index= , columns= , values= 매개변수, aggfunc= 적용할 연산)
hourly_dayofweek_ride = bikes.pivot_table(index='대여시간대', columns='요일',values='자전거번호', aggfunc='count')
1) plt.plot
import matplotlib.pyplot as plt
plt.rc('font', family='Malgun Gothic', size=15)
plt.title('한글 폰트 테스트')
plt.plot([1,2,3,4])
plt.xlabel('시간')
plt.ylabel('거리')
plt.show()
# weekdays_hourly_ride를 이용하여 대여시간대 X 주말이용건수 선그래프 그리기
weekdays_hourly_ride.plot(kind='line', title='대여시간대 X 주말여부 이용건수', figsize=(15, 4))
# weekdays_hourly_ride를 이용하여 대여시간대 X 주말이용건수 막대그래프 그리기
weekdays_hourly_ride.plot(kind='bar', title='대여시간대 X 주말여부 이용건수', figsize=(15, 4))
# 구별자전거이용건수 수평막대그래프 그리기
구별자전거이용건수.plot(kind='barh', figsize=(15, 8), title='대여구별 자전거 이용건수')
2) sns.countplot
plt.figure(figsize=(10,4))
sns.countplot(data=bikes, x='요일', hue='요일', order =['월', '화', '수', '목', '금', '토', '일'] )
plt.show()
3) sns.heatmap
plt.figure(figsize=(10,8))
sns.heatmap(data=hourly_dayofweek_ride, annot=True, fmt='d' )
4) sns.boxplot
plt.figure(figsize=(10,8))
sns.boxplot(data=)
3. folium
import json
with open('data/seoul.json','r', encoding='utf-8') as f:
서울시지도 = json.load(f)
lat = bikes['대여점위도'].mean()
lon = bikes['대여점경도'].mean()
map1 = folium.Map(location=[lat, lon], zoom_start=11)
folium.Choropleth(geo_data=서울시지도,
data=구별자전거이용건수,
columns=['대여구', '자전거번호'],
key_on='feature.properties.name',
fill_color='YlGnBu').add_to(map1)
folium.Marker(location=[위도, 경도], popup=대여점명).add_to(map1)