안녕하세요.
오늘은 파이썬을 이용해 아이디 기반 추첨 프로그램을 만들어보겠습니다.
1. 들어가기에 앞서
해당 프로그램에 대해 간단히 말씀드리자면 인스타그램 아이디를 기준으로
댓글, 스토리공유, 팔로우, 좋아요를 할때마다 당첨확률을 가중시킵니다.
이렇게 취합된 아이디 정보를 랜덤 함수를 이용하여 순서를 섞어준 후
당첨자 수만큼 출력합니다.
참고로 이 포스팅은 VSCode를 기준으로 작성되었습니다!
코딩 초보시라면 제 글을 따라 하실때 VSCode를 사용하시는게 편할거예요.
생각보다 간단하죠? 그럼 이 프로그램을 만들고, 실행시키기 위해 필요한 준비물들을 알아보겠습니다.
(1) 라이브러리
- random : 파이썬에 내장된 기본 라이브러리입니다.
- pandas : 데이터를 가공하기 위해 필요한 라이브러리입니다.
라이브러리 설치 방법은 터미널에서 아래 명령어를 따라해주시면 됩니다.
// 'lotto'라는 이름의 가상환경을 만들어줍니다.
conda create --name lotto
// 만들어준 가상환경을 활성화합니다.
conda activate lotto
// pandas를 설치합니다.
conda install pandas
// 가상환경을 비활성화 합니다.
conda deactivate
가상환경은 패키지를 설치할때만 활성화해주시면 됩니다.
VSCode에서 코드를 돌릴때 가상환경을 선택해주시면 해당 가상환경으로 코드 실행이 가능합니다.
(2) 엑셀 파일
인스타그램 아이디와 댓글, 스토리 공유, 팔로우, 좋아요 여부가 저장되어있는 엑셀 파일이 필요합니다.
제가 작게 만들어놓은 예제 파일을 업로드하겠습니다.
2. 전체 코드
코드 분석에 앞서 전체 코드와 기본적인 코드의 구성을 알려드리겠습니다.
- 우선 추첨할 아이디가 저장되어있는 엑셀 파일이 필요합니다.
- 엑셀파일을 파이썬으로 불러온 후 데이터 프레임에 집어넣습니다.
- 데이터프레임에서 조건에 맞는 아이디를 중복시킵니다.
- 아이디 리스트의 순서를 섞어준 후 당첨자 수만큼 뽑아 출력합니다.
글로 보니까 생각보다 간단합니다.
from random import *
import pandas as pd
# 데이터가 저장된 엑셀 파일 로드
df = pd.read_excel('엑셀파일경로.xlsx', usecols='A:E')
#print(df)
# 각 작업을 진행한 사람을 찾는 조건 생성
comments = df['댓글'] == 'o'
follow = df['팔로우'] == 'o'
likes = df['좋아요'] == 'o'
story = df['스토리'] == 'o'
noncomments = df['댓글'] == 'x'
nonfollow = df['팔로우'] == 'x'
nonlikes = df['좋아요'] == 'x'
nonstory = df['스토리'] == 'x'
# 각 기준별로 데이터 분류하기
# 추려낸 데이터에서 아이디만 뽑아낸다
# 팔로우, 좋아요는 모두 된 상태
dfName = df['아이디']
#print('dfName')
#print(dfName)
# 댓글, 스토리 모두 단 사람 찾기
CS = df[comments & story]
#print('CS')
#print (CS)
CSName = CS['아이디']
#print('CSName')
#print(CSName)
# 댓글만 단 사람 찾기
C = df[comments & nonstory]
#print('C')
#print(C)
CName = C['아이디']
#print('CName')
#print(CName)
# 스토리만 한 사람 찾기
S = df[noncomments & story]
#print('S')
#print(S)
SName = S['아이디']
#print('SName')
#print(SName)
# 각 기준으로 추려낸 데이터프레임을 중복 포함하여 병합
last = pd.concat([dfName, CSName, CName, SName])
#print('last')
#print(last)
# 데이터프레임을 리스트 형태로 변환
lastlist = last.values.tolist()
#print('lastlist')
#print(lastlist)
# 순서 섞기
shuffle(lastlist)
# 아무나 4명 추출
cong = sample(lastlist, 4)
#print(sample(lastlist, 4))
# 당첨자 출력
print('---------당첨자 발표----------')
print('당첨자 : {}'.format(cong))
print('---------축하드립니다----------')
(1) 라이브러리 불러오기
앞서 말씀드린 2가지 라이브러리를 불러옵니다.
random 라이브러리는 파이썬에 기본 내장되어 있는 라이브러리이므로 따로 설치하지 않아도 되지만,
pandas은 기본 라이브러리가 아니므로 꼭 설치해줘야 합니다.
라이브러리를 설치하지 않고 불러오면 No module named 'pandas' 같은 오류가 발생합니다.
from random import *
import pandas as pd
(2) 엑셀 파일 불러오기
read_excel이라는 함수를 이용해서 엑셀 파일을 불러온 후에
데이터 프레임에 넣어줍니다.
이때 우리는 아이디, 좋아요, 댓글, 스토리, 팔로우의 데이터만 사용하므로
usecols라는 옵션을 사용하여 A열부터 E열까지의 데이터만 불러옵니다.
df라는 변수에 데이터를 저장하게 됩니다.
# 데이터가 저장된 엑셀 파일 로드
df = pd.read_excel('/경로/예제파일.xlsx', usecols='A:E')
#print(df)
데이터프레임에 엑셀 데이터를 불러오면 아래와 같이 출력됩니다.
(3) 가중치를 부여하기 위한 조건 설정하기
저는 댓글과 팔로우, 좋아요, 스토리 공유를 한 사람들에게 각각 가산점을 부여했습니다.
가산점이라고 해서 거창한 수식이 필요한건 아니고
아이디를 한번씩 중복시켜 당첨 확률을 높여주었습니다.
df 변수에 저장된 데이터 중에서 비교가 필요한 속성의 데이터를 ==연산자를 이용해 체크해줍니다.
# 각 작업을 진행한 사람을 찾는 조건 생성
comments = df['댓글'] == 'o'
follow = df['팔로우'] == 'o'
likes = df['좋아요'] == 'o'
story = df['스토리'] == 'o'
noncomments = df['댓글'] == 'x'
nonfollow = df['팔로우'] == 'x'
nonlikes = df['좋아요'] == 'x'
nonstory = df['스토리'] == 'x'
예를 들어 아래와 같이 df변수에 저장된 데이터 중에서
'댓글' 이라는 속성에 있는 값 중에 'o'값을 갖고 있는 데이터를 골라줍니다.
골라낸 데이터를 comments라는 변수에 저장해줍니다.
comments = df['댓글'] == 'o'
(4) 기준별로 데이터 분류하기
결국 우리가 구현하려는 기능의 핵심은 아이디를 추첨하는 것이기 때문에,
아이디만 추출해서 별도로 저장해줘야 합니다.
특히 좋아요, 팔로우 등 조건에 따라 아이디를 중복시켜서 저장해야 하므로
몇몇 과정을 더 거쳐주어야 합니다.
- df['아이디']를 이용해 데이터프레임에서 아이디를 추출해 dfName이라는 변수에 저장해줍니다.
- df[comments & story]를 이용해 데이터프레임에서 조건을 만족하는 데이터를 추출해 CS라는 데이터프레임에 저장해줍니다.
- CS['아이디']를 이용해 데이터프레임에서 아이디를 추출해 CSName이라는 변수에 저장해줍니다.
# 팔로우, 좋아요는 모두 된 상태
dfName = df['아이디']
#print('dfName')
#print(dfName)
# 댓글, 스토리 모두 단 사람 찾기
CS = df[comments & story]
#print('CS')
#print (CS)
CSName = CS['아이디']
#print('CSName')
#print(CSName)
# 댓글만 단 사람 찾기
C = df[comments & nonstory]
#print('C')
#print(C)
CName = C['아이디']
#print('CName')
#print(CName)
# 스토리만 한 사람 찾기
S = df[noncomments & story]
#print('S')
#print(S)
SName = S['아이디']
#print('SName')
#print(SName)
우선 예를 들어서, C라는 데이터 프레임에 [댓글을 달았고, 스토리는 공유하지 않은] 조건의 데이터만 필터링 하여 출력하면 아래와 같이 출력됩니다.
다음으로 CName이라는 데이터 프레임에 데이터프레임C로부터 아이디만 골라내어 출력하면 아래와 같이 출력됩니다.
이 과정을 조건별로 반복해줍니다.
제가 갖고있던 데이터에는 모든 아이디가 팔로우와 좋아요를 한 상태였기 때문에
좋아요와 팔로우 조건은 스킵하였습니다.
(5) 조건에 따라 가중치를 부여한 아이디 리스트를 중복 허용하여 last라는 데이터 프레임에 저장하기
각 조건에 맞춰 아이디를 출력한 데이터프레임을 중복 허용하여 합쳐줍니다.
이때 중복을 허용하여 데이터프레임을 합쳐주는 concat이라는 함수를 사용하게 됩니다.
# 각 기준으로 추려낸 데이터프레임을 중복 포함하여 병합
last = pd.concat([dfName, CSName, CName, SName])
#print('last')
#print(last)
last라는 변수에 저장된 데이터프레임을 출력하면 아래와 같이 표시됩니다.
(6) 데이터 프레임을 리스트 형태로 변환하기
파이썬에 내장된 random 라이브러리를 사용하기 위해서는 리스트 형태의 데이터가 필요합니다.
그러므로 values.tolist() 함수를 이용해서 데이터프레임에 있는 데이터들을 리스트에 담아줍니다.
# 데이터프레임을 리스트 형태로 변환
lastlist = last.values.tolist()
#print('lastlist')
#print(lastlist)
리스트에 담긴 데이터를 출력하면 아래와 같이 표시됩니다.
(7) 리스트에 담긴 데이터의 순서를 섞기
이제 shuffle 함수를 이용해 리스트에 담긴 데이터의 순서를 섞어줍니다.
# 순서 섞기
shuffle(lastlist)
print('shuffledlastlist')
print(lastlist)
shuffle을 진행한 후 다시 리스트를 출력해보면
아래와 같이 기존의 리스트와는 데이터의 순서가 다른 것을 확인할 수 있습니다.
(8) 당첨자 출력하기
아이디가 잘 섞인 lastlist라는 리스트에서 앞에서부터 4명을 뽑아줍니다.
아래에 4라고 적힌 부분을 바꿔주면 원하는 수만큼 당첨자를 뽑아줄 수 있습니다.
# 아무나 4명 추출
cong = sample(lastlist, 4)
#print(sample(lastlist, 4))
당첨자를 출력하면 아래와 같이 표시됩니다.
(9) 양식에 맞춰 당첨자 출력하기
당첨자를 양식에 맞춰 출력해보겠습니다.
저는 간단하게 만들었습니다만, print함수를 이용해 원하는 양식대로 꾸며주시면 됩니다.
아래 당첨자 부분은 {}와 .format()을 이용해 문자열을 출력해줍니다.
.format()에서 괄호안에 있는 데이터들이 텍스트 영역의 {} 부분에 들어가게 됩니다.
# 당첨자 출력
print('---------당첨자 발표----------')
print('당첨자 : {}'.format(cong))
print('---------축하드립니다----------')
출력결과는 아래와 같습니다.
참고로 아래와 같은 코드를 입력하면 여러개의 값을 출력할수도 있습니다.
print('내 이름은 {}이고, 나이는 {}살 입니다.'.format("댕댕이", 30))
출력값은 아래와 같이 나옵니다.
3. 실행하기
VSCode에서 [Ctrl + Shift + p]를 누르시면 아래와 같이 ">" 표시와 함께 검색참이 뜹니다.
그럼 검색창에 "Python: Select Interpreter"를 검색해줍니다.
그럼 아래와 같이 인터프리터의 리스트가 뜹니다.
그 중에서 우리가 아까 아나콘다를 이용해 만들어준
가상환경의 이름이 적힌 인터프리터를 선택해줍니다.
우린 아까 "lotto" 라는 가상환경을 만들어줬었죠?
그 다음에 F5를 눌러서 코드를 실행해주시면 됩니다.
4. 마치며
이번엔 간단한 파이썬 추첨 프로그램을 만들어봤습니다.
저는 인스타그램에서 이벤트를 진행하였고, 결과값을 직접 엑셀파일에 입력했지만
다음에는 크롤링을 통해서 아이디와 좋아요 정보, 팔로우 정보 등을 긁어올 수 있으면 더 편할 것 같네요.
코드가 깔끔하지 않은 부분은 감안해서 봐주시면 감사하겠습니다.
'코딩 > 파이썬' 카테고리의 다른 글
Do it! 파이썬 생활프로젝트 후기 (0) | 2022.05.25 |
---|---|
파이썬 - for 문 사용하는 방법 (0) | 2022.05.23 |
파이썬 - 구글에서 이미지 대량 다운로드 하기 (0) | 2022.04.02 |
파이썬 - 파일 확장자 한번에 변경하기 (0) | 2022.04.01 |
진입장벽이 가장 낮은 언어, 파이썬 (0) | 2022.01.24 |