두번째 프로젝트 순서
데이터를 어떤 식으로 저장할지에 대해서 고민이 많았다. 구글링을 엄청 많이 했는데 잘 나오지 않아서, 영어로도 검색을 많이 했다. 한 열 안에 2개의 정보(멀티인덱스)가 들어가야 했고, 새로운 행이 생성될 때 계속 새로운 열이 생성됐기 때문에 쉽지 않았다. 그래서 판다스(pandas) 관련 개념을 정리해보려고 한다.
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
|
#pandas 개념 정리
'''
df_review_one_sentence는 컬럼이 titles(제목), reviews(리뷰)로 구성이 됐다.
[info]
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 titles 3498 non-null object
1 reviews 3498 non-null object
[head]
titles reviews
0 13시간 (13 Hours: The Secret Soldiers of Benghazi) 토요일 내리다 황사 몰아치다 일요일 오전 난생 처음 홍대 찾다 파괴 마이클 베이 형...
1 1942: 최정예특수부대 스페츠나츠 (The Dawns Here Are Quiet) 처음 리뷰 킬링타임 용이 땡기다 빠지다 듭니 처음 부분 별로 여군 샤워 커버 해주다...
2 33 (The 33) 패트리시아 리건 출연 안토니오 라스 로드 산토 줄리엣 비노 미국 칠레 평점 리뷰 예...
3 400번의 구타 (The 400 Blows) 달리기 어딘에선 달아나다 모습 기억 남다 처음 만난 우산 가지 오지 내리다 기다 흡...
4 45년 후 (45 Years) 압구정 괜찮다 거짓말 괜찮다 괜찮다 괜찮다 살아가다 많다 괜찮다 외치다 괜찮다 괜찮...
iloc => 행번호로 선택
loc => 라벨이나 조건으로 선택
'''
print(df_review_one_sentence.iloc[0]) # 첫번째 행만 추출 => 제목, 리뷰 다나옴
print(df_review_one_sentence.iloc[0,1]) #첫번째 행, 1번 열 / 요소 1개 뽑기 - 리뷰만 나옴
print(df_review_one_sentence.iloc[0:5,0]) # 1~5번째 행의 제목 5개
print(df_review_one_sentence.loc[:, 'titles']) #컬럼명으로 보겠다 / 모든 제목이 출력된다.
print(df_review_one_sentence['titles'][0]) #타이틀에 0번째
df.iloc[row,col] 숫자로
df.loc['Tom','math'] 컬럼명으로
|
cs |
1
2
3
4
5
6
7
8
9
|
# enumerate 정리
ls = ['겨울왕국','라이온킹','알라딘']
print(list(enumerate(ls))) #튜플 리스트로 보여줌 / [(0, '겨울왕국'), (1, '라이온킹'), (2, '알라딘')]
for idx,i in enumerate(ls) : #0 겨울왕국, 1 라이온킹, 2 알라딘 출력 / 인덱스 값 같이 보여줌
print(idx, i)
for idx, i in enumerate(ls):
if i == '라이온킹':
print(idx)
|
cs |
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif)
1-4. 파이썬 EDA 데이터 분석 팀 프로젝트 판다스, 시각화 (Matplotlib, Json)
- 첫 프로젝트 글 순서 - 1. 파이썬(python) EDA 데이터분석 주제 정하기 2. 실패한 여기어때 후기 웹스크래핑(web scraping) 3. 데이터 수집 방법 & 데이터 추출, 정제 4. 판다스(pandas) 데이터 처리 / Matpl.
0goodmorning.tistory.com
특정 값을 추출하고 groupbpy를 통해서 묶거나 더하는 것이 필요하다면 이전 코드를 한 번 참조해주세요! 와 근데 지금 다시 보니까 진짜 코드가 엉망진창인 것 같습니다.. 첫번째에 비해 두번째 프로젝트 코드가 훨씬 나아진 것 같고, 현재는 더 나아졌다고 생각이 든다.
이제부터는 안 됐던 코드들을 같이 첨부하려고 합니다. 보시면서 여러분들은 같은 실수는 하지 말아주세요 ㅠㅠㅠ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
##### 엑셀파일 생성될 때 기본 틀 갖추기 ####
import pandas as pd
import numpy as np
from itertools import chain
def frame(key_list, day1, day2, path2) :
key_lists = list(chain.from_iterable(zip(key_list,key_list))) #key_list_1로 설정해서 기준을 만들어줘야 함
multi_key = ['조회수','서브키워드']
multi_keys = ['조회수','서브키워드'] * len(key_list)
range = pd.date_range(f'{day1} 19:00:00',f'{day2} 18:50:00', freq='10min')
df = pd.DataFrame(columns = [key_lists, multi_keys],index = range)
df.to_csv(f'{path2}', index=False, encoding='UTF-8-sig')
print('저장완료')
|
cs |
처음에는 이런 식으로 먼저 19시부터 익일 18시 50분(def 함수 만들기 전 사진이라 19시까지 들어갔네요. 19시 기준은 퇴근 시간 기준으로 집에 가는 길이나 집에서 하루 이슈를 마무리할 수 있게 잡았습니다.)까지 데이터를 만들어서 저장을 하는 방식인데 고려할 것이 여러개 생겼습니다.
파일을 불러올 경우에 멀티인덱스가 제대로 안 보여지는 것 같습니다. 한강 한강이 병합돼서 하나의 한강 밑에 조회수/ 서브키워드가 있어야 하는데 Unnamed: 0, Unnamed: 2, Unnamed: 4 이런 식으로 생성되는 것을 확인할 수 있습니다. 그리고 시간 마다 새로운 열이 추가되고, 기존 열은 또 사용을 해서 기존 열에 있으면 새로운 열을 생성하는 식의 코드를 짜봤는데 계속 에러가 떠서 포기했습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
import pandas as pd
import numpy as np
df1 = pd.read_excel(path2, header=[0,1], index_col=[0] )
# 조회수, 서브 키워드 입력
def jos(i, t) :
df.loc[t][(i,'조회수')] = sum_search[i]
df.loc[t][(i,'서브키워드')] = sub_key[i]
t = '2021-05-04 19:20:00' #현재 시간 설정
for i in sum_search :
if i not in key_list_1 : # 기준이 되는 key_list 값에 없을 경우 열 추가
a = [i]
df = df.join(pd.DataFrame(columns=pd.MultiIndex.from_product([a, multi_key]),index=df.index))
jos(i, t)
else :
jos(i, t)
df.to_csv(path2)
|
cs |
이런 식으로 진행을 하려고 했는데 조회만 추가가 되고 서브키워드는 추가가 안 되는 문제가 발생했습니다.
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
|
import pandas as pd
import numpy as np
#복제
from itertools import chain
key_lists = list(chain.from_iterable(zip(key_list,key_list))) #key_list_1로 설정해서 기준을 만들어줘야 함
multi_key = ['조회수','서브키워드']
multi_keys = ['조회수','서브키워드'] * len(key_list)
# 조회수, 서브 키워드 입력
def jos(i, time) :
df.loc[time][(i,'조회수')] = sum_search[i]
df.loc[time][(i,'서브키워드')] = sub_key[i]
# generate time series index
range = pd.date_range('05-03-21', '05-04-21', freq='10min') # if문 7~ +1 6시50분 시간을 기준으로 삼아서
df = pd.DataFrame(columns = [key_lists, multi_keys],index = range)
time = "2021-05-03 00:10:00" #현재 시간 설정
for i in sum_search :
if i not in key_lists :
a = [i]
df = df.join(pd.DataFrame(columns=pd.MultiIndex.from_product([a, multi_key]),index=df.index))
jos(i, time)
else :
jos(i, time)
df
|
cs |
코드를 바꿔서 진행했는데 이제는 조회수와 서브키워드에 채워지는 것을 확인할 수 있습니다. 그런데 또 시간이 바뀌고 새로운 데이터를 크콜링하게 되면 오류가 나가너 코드가 복잡해져서 방법을 더 찾았습니다.
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
|
#### 행 생성 ####
import pandas as pd
import numpy as np
from itertools import chain
#복제
key_lists = list(chain.from_iterable(zip(key_list,key_list))) #멀티 인덱스를 위해서 [a,b,c] => [a,a,b,b,c,c] 로 만들어줌
multi_keys = ['조회수','서브키워드'] * len(key_list)
# 조회수, 서브 키워드 입력
def hit_sub(i, time) :
df1.loc[time][(i,'조회수')] = sum_search[i]
df1.loc[time][(i,'서브키워드')] = sub_key[i]
# generate time series index
time = nowDatetime #현재 시간 설정
df1 = pd.DataFrame(columns = [key_lists, multi_keys],index = [time])
for i in sum_search :
hit_sub(i, time)
#### 다음 행에 추가 ####
df = pd.read_excel(path2, header=[0,1], index_col=[0] ) #number 해결
df = df.append(df1, sort=False) #컬럼 수가 다를 때 NaN 값을 넣고 행 추가
|
cs |
if 문을 사용하지 않고 멀티 인덱스가 있는 상황에서, 새로운 행과 열이 생성되고, 기존 열은 유지되는 함수
=> append를 사용하시면 됩니다!!!
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
|
#subject 디렉토리내 파일 삭제하기
import shutil
pathTest = r"C:/Workspace/project2_final/output/temp"
try:
shutil.rmtree(pathTest)
except OSError as e:
print(e)
else:
print("The directory is deleted successfully")
#### 새로운 파일 생성 ###
import os
from datetime import datetime, date, time, timedelta
import datetime
import openpyxl
import pickle
#디렉토리 폴더 생성
path = "C:/Workspace/project2_final/output"
if not os.path.isdir(path):
os.mkdir(path)
today =datetime.datetime.now()
hms = today.strftime('%H:%M:%S') #시분초
ymd = today.strftime('%Y-%m-%d') #년월일 - 오늘 날짜
yesterday = (today - datetime.timedelta(1)).strftime('%Y-%m-%d') #어제날짜
wb = openpyxl.Workbook()
if hms < '19:00:00':
file_name = yesterday
path2 = f"C:/Workspace/project2_final/output/{file_name}.xlsx"
if not os.path.isfile(path2):
wb.save(path2)
print('파일 생성완료1')
else :
print('파일을 작업중입니다....')
else :
file_name = ymd
path2 = f"C:/Workspace/project2_final/output/{file_name}.xlsx"
if not os.path.isfile(path2):
wb.save(path2)
print('파일 생성완료2')
else :
print('파일을 작업중입니다....')
|
cs |
이런 식으로 특정 시간이 되면 새로운 폴더와 파일을 생성 하는 코드입니다.
'도전하자. 프로젝트' 카테고리의 다른 글
3-1 파이썬 팀프로젝트 CNN 식물 병충해 분류 (0) | 2021.07.31 |
---|---|
2-4 파이썬 팀프로젝트 : matplotlib, smtplib 메일 자동화 (0) | 2021.07.19 |
2-2 파이썬 프로젝트 : BS4 웹크롤링, 형태소 분석, (0) | 2021.07.17 |
2-1 파이썬 팀프로젝트 : 네이버 실시간검색 대체 이슈 예측 기획 (0) | 2021.07.16 |
1-5. 파이썬 EDA 데이터 분석 팀 프로젝트 간단 정리 (2) | 2021.06.26 |