336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

두번째 프로젝트 순서

1. 프로젝트 주제 정하기

2. 기획 및 데이터 수집, 전처리

3. 데이터 저장(판다스 열/행 관련 정리)

4. 시각화 및 자동화


데이터를 어떤 식으로 저장할지에 대해서 고민이 많았다. 구글링을 엄청 많이 했는데 잘 나오지 않아서, 영어로도 검색을 많이 했다. 한 열 안에 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

 

 

 

 

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]
    
= '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

이런 식으로 특정 시간이 되면 새로운 폴더와 파일을 생성 하는 코드입니다.

 

 

 

+ Recent posts