본문 바로가기
Python

알쓸코드 - 데이터 분석

by yu901 2023. 11. 4.

데이터 분석에 사용하는 패키지, 함수들

계속 추가예정

 


OS 관련

 

  • os.listdir

디렉토리 리스트 가져오기

# 폴더 경로가 있는지 확인 후, 없으면 생성
if  f'{dir_name}' in os.listdir(f'{base_path}'):
    print('{dir_name} 폴더가 이미 존재합니다.')
else:
    os.mkdir(f'{base_path}/{dir_name}')
 
# 파일 명의 일부를 사용하여 파일 경로 불러오기
dir_path = f'{base_path}/{dir_name}'
# file_name에 해당하는 파일이 한 개 있을 때
file_path = [x for x in os.listdir(f'{dir_path}') if file_name in x][0]
# file_name에 해당하는 파일이 여러개 있을 때
file_paths = [x for x in os.listdir(f'{dir_path}') if file_name in x]

 

  • os.path.exists

경로가 있는지 확인

if not os.path.exists(dir_path):
    os.makedirs(dir_path)

 

  • except OSError

OS 관련 예외처리

try:
    df.to_csv(f'{dir_path}/test.csv')
except OSError:
    os.makedirs(f'{dir_path}')
    df.to_csv(f'{dir_path}/test.csv')

 


DataFrame 관련

 

  • describe
# using percentile
df = df.groupby('activity')['worktime'].describe(percentiles=[.25, .5, .75])

 

  • groupby agg
# agg dict
dfg = df.groupby('activity').agg({'start_timestamp':'min', 'end_timestamp':'max'}).reset_index()

# agg list
dfg = df.groupby('case')['timestamp'].agg(['first', 'last'])

 

  • string join
# join columns values as newline(\n)
description = df.agg('\n'.join, axis=1)
description.name = 'description'
df = pd.concat([df, pd.DataFrame(description).transpose()])

# get trace as activity
df_trace = df.groupby(['case'])['activity'].apply('>'.join).reset_index()
df_trace = df_trace.rename(columns={'activity':'trace'})

# multi columns to single column
df.columns = ['_'.join(col) for col in df.columns.values]

 

  • pd.merge
df = pd.merge(df_i, df_s, on='activity', how='outer', suffixes=['_i', '_s'])

 

  • add summary row
df_sum = df.sum()
df_sum.name = 'Sum'
df = pd.concat([df, pd.DataFrame(df_sum).transpose()])

 

  • value_count

count value frequncy in column

value_count = df['category'].value_counts().reset_index()
value_count.columns = ['value', 'count']

 

  • astype
col_types = {
    "col1" : "str",
    "col2" : "str",
    "col3" : "number",
}
df = df.astype(col_types)

 


 

Time 관련

 

  • datetime.now
date_info = datetime.now().date().strftime("%y%m%d")

 

  • pd.to_datetime / parse_dates
# pd.to_datetime
df = pd.read_csv(f'{file_path}')
df['timestamp'] = pd.to_datetime(df['timestamp'])

# parse_dates
df = pd.read_csv(f'{file_path}', parse_dates=['timestamp'])

 

  • pd.to_timedelta

number to timedelta

df['worktime'] = pd.to_timedelta(df['worktime'], unit='ms')

 

 

  • np.datetime64

string to datetime

df = df.loc[df['date'] == np.datetime64('2023-11-02')].copy()

 

  • np.timedelta64 / astype('timedelta[ms]')

timedelta to number

# divide np.timedelta64
df['worktime'] = (df['end_timestamp'] - df['start_timestamp']) / np.timedelta64(1, 'ms')

# astype
df['worktime'] = (df['end_timestamp'] - df['start_timestamp']).astype('timedelta64[ms]')

 

  • dt.date / dt.time

split datetime 

df['date'] = df['timestamp'].dt.date
df['time'] = df['timestamp'].dt.time

 

  • datetime.time
lunch_start = datetime.time(12, 30, 00)
lunch_end = datetime.time(13, 30, 00)

cond_lunch = (df['time'].dt.time >= lunch_start) & (df['time'].dt.time < lunch_end)
df['is_lunch'] = np.where(cond_lunch, True, False)

댓글