# 1. 조회
# invest_id=228 인 투자자가 투자한 포트폴리오를 모두 조회한다
# PK=228, SK=portfolio#
import boto3
import json
import decimal
from elasticsearch import Elasticsearch
import json
from collections import defaultdict
# elastic 연결
cloud_id = 'univ=============================='
username = 'e==========='
password = 'wNl==========='
dynamodb = boto3.resource('dynamodb', region_name='ap-northeast-2')
table = dynamodb.Table('LUCK4_INNOFOREST_DB')
total = 0
investments = defaultdict(list)
investments_price = defaultdict(list)
investment_amounts = {}
investment_dates = []
for x in range(0,338): # invest_id를 차례로 조회한다
############ (1) SORT KEY - INSIGHT 에서 데이터 가져오기 ############
partition_key_value = str(x)
sort_key_prefix = 'insight'
# 쿼리 실행
insight_response = table.query(
KeyConditionExpression="#pk = :pkval AND begins_with(#sk, :skval)",
ExpressionAttributeNames={
"#pk": "invest_id",
"#sk": "sort_key"
},
ExpressionAttributeValues={
":pkval": partition_key_value,
":skval": sort_key_prefix
}
)
insight_items = insight_response.get('Items', [])
for item in insight_items:
### 데이터 전처리 : 투자 금액, 날짜 전처리 + 가중치 계산 ###
if '총 투자 횟수' in item:
threeyear_num = item['창업 3년미만기업'] if item['창업 3년미만기업'] != '' else 0
startup_num = item['스타트업이 첫 투자'] if item['스타트업이 첫 투자'] != '' else 0
investor_name = item['투자사 이름']
mbti4 = int(threeyear_num) + int(startup_num)
print(mbti4)
############ (2) Sort Key: MBTI 에서 이미 올린 MBTI_1 과 MBTI_3 정보도 가져온다 ############
# mbti는 별도로 sort key 설정
# ** x번째 투자사의 mbti를 조회한다
# 쿼리 조건 설정
partition_key_value = investor_name
sort_key_prefix = 'mbti#'+str(x)
# 쿼리 실행
mbti_response = table.query(
KeyConditionExpression="#pk = :pkval AND begins_with(#sk, :skval)",
ExpressionAttributeNames={
"#pk": "invest_id",
"#sk": "sort_key"
},
ExpressionAttributeValues={
":pkval": partition_key_value,
":skval": sort_key_prefix
}
)
# 가져온 데이터 확인
mbti_items = mbti_response.get('Items', [])
for item in mbti_items:
### 투자 금액, 날짜 전처리 + 가중치 계산 ###
if 'MBTI_1' in item:
mbti1 = item['MBTI_1']
mbti3 = item['MBTI_3']
############ (3) Sort Key: PORTFOLIO 에서 ############
# 쿼리 조건 설정
partition_key_value = str(x)
sort_key_prefix = 'portfolio#'
# 쿼리 실행
response = table.query(
KeyConditionExpression="#pk = :pkval AND begins_with(#sk, :skval)",
ExpressionAttributeNames={
"#pk": "invest_id",
"#sk": "sort_key"
},
ExpressionAttributeValues={
":pkval": partition_key_value,
":skval": sort_key_prefix
}
)
# 가져온 데이터 확인
items = response.get('Items', [])
for item in items:
### 투자 금액, 날짜 전처리 + 가중치 계산 ###
if '투자일' in item:
invest_date = item['투자일'].replace("[", "").replace("]", "").replace("'", "").replace("-","").replace(",", "")
investment_amount = item['투자 금액'].replace("[", "").replace("]", "").replace("'", "").replace(",", "").replace("만", "").replace("억", '0000').replace('비공개', '0')
invest_id = item['invest_id']
#### 가중치 계산 ####
dates = []
amounts = []
for i in invest_date.split():
dates.append(i)
for j in investment_amount.split():
if "." in j:
j = j.replace(".","")
j = j[:-1]
amounts.append(j)
for k in range(len(dates)):
year = int(dates[k][2:4])
month = int(dates[k][4:])
weight_price = int(amounts[k])*year*month
investments_price[invest_id].append(weight_price)
for add in investments_price[invest_id]:
total += add
investments[invest_id] = total
############## DyanamoDB에 저장
# dynamodb = boto3.resource('dynamodb')
# table = dynamodb.Table('LUCK4_INNOFOREST_DB')
new_item = {
'invest_id': investor_name, # 기본 키 값
'sort_key': "mbti#"+ str(x),
'투자사 이름': investor_name,
'MBTI_1':mbti1,
'MBTI_2': investments[invest_id],
'MBTI_3':mbti3,
'MBTI_4': mbti4
}
# response_end = table.put_item(Item=new_item)
# if response_end['ResponseMetadata']['HTTPStatusCode'] == 200:
# print("새로운 항목이 성공적으로 생성되었습니다.")
# else:
# print("항목 생성에 실패했습니다.")
es = Elasticsearch(
cloud_id=cloud_id,
basic_auth=(username, password),
)
es.index(index='investor_mbti_luck4', id=str(x), document=new_item)
break