Skip to content

Commit

Permalink
Merge branch 'main' into feat-cron-scripts
Browse files Browse the repository at this point in the history
  • Loading branch information
keonly authored Dec 1, 2023
2 parents e4fa754 + 15575aa commit 5c99558
Show file tree
Hide file tree
Showing 8 changed files with 521 additions and 44 deletions.
2 changes: 1 addition & 1 deletion API/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
"4": CouncilType.LOCAL_LEADER,
"5": CouncilType.METROPOLITAN_COUNCIL,
"6": CouncilType.LOCAL_COUNCIL,
"7": CouncilType.NATIONAL_COUNCIL_GLOBAL,
"7": CouncilType.NATIONAL_COUNCIL,
"8": CouncilType.METROPOLITAN_COUNCIL,
"9": CouncilType.LOCAL_COUNCIL,
}
Expand Down
5 changes: 5 additions & 0 deletions API/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,15 @@ def save_to_mongo(data: List[dict], sgTypecode: str, where: str) -> None:
# TODO: Support other types of councils
if sgTypecode in ["8", "5", "2", "6", "9"]:
for entry in data:
if entry["wiwName"] == None:
print(entry)
entry["wiwName"] = change_local_name(entry["sdName"], entry["wiwName"])
district_id = get_district_id(entry["sdName"], entry["wiwName"])

if district_id:
main_collection.update_one(
{
"year": entry["year"],
"name": entry["name"],
"localId": district_id["localId"],
"metroId": district_id["metroId"],
Expand All @@ -62,8 +65,10 @@ def save_to_mongo(data: List[dict], sgTypecode: str, where: str) -> None:
)
elif sgTypecode in ["7"]:
for entry in data:
entry["wiwName"] = "전국"
main_collection.update_one(
{
"year": entry["year"],
"name": entry["name"],
"localId": 0,
"metroId": 0,
Expand Down
44 changes: 24 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# 다양성 평가 리포트 웹사이트 - 뉴웨이즈

<!-- # 깃헙은 최종일에 제출 필요!
- 팀별 GitHub repository 링크 및 발표 자료 Slack으로 제출
- GitHub 포함 사항
Expand All @@ -9,44 +10,47 @@
- 설치 및 실행 과정 설명
- 팀 및 팀원 소개
- (선택 사항) 데모 영상 -->

## 프로젝트 개요
프로젝트 이름 다양성 평가 리포트 웹사이트 - 뉴웨이즈
기간 23 가을-겨울

프로젝트 이름 다양성 평가 리포트 웹사이트 - 뉴웨이즈
기간 23 가을-겨울

## 설치 및 실행 과정

1. 파이썬 가상환경 생성
- 아래 명령을 실행하여 파이썬 가상환경을 생성합니다.
```bash
cd ~ && virtualenv newways --python=3.10
```
- 아래 명령을 실행하여 파이썬 가상환경을 생성합니다.
```bash
cd ~ && virtualenv newways --python=3.10
```
2. 가상환경 활성화
- 아래 명령을 실행하여 가상환경을 활성화합니다.
```bash
source ~/newways/bin/activate
```
- 아래 명령을 실행하여 가상환경을 활성화합니다.
```bash
source ~/newways/bin/activate
```
3. 레포지토리 클론
- 아래 명령을 실행하여 레포지토리를 클론합니다.
```bash
```bash
git clone https://github.com/NewWays-TechForImpactKAIST/API-scrap-and-analysis.git
```
4. 필요한 패키지 설치
- requirements.txt에 명시된 패키지를 설치합니다.
```bash
pip install -r requirements.txt
```
```
5. 환경 변수 설정
- `.env.example` 파일을 복사하여 `.env` 파일을 생성합니다.
```bash
cp .env.example .env
```
- `.env` 파일을 열어 환경 변수의 값을 필요에 따라 바꾸어줍니다.
```
- `.env` 파일을 열어 환경 변수의 값을 필요에 따라 바꾸어줍니다.
6. 예제 코드 실행
- 이 프로젝트는 여러 개의 파이썬 패키지로 구성되어 있습니다.
- 각각의 패키지는 독립적으로 실행할 수 있습니다. 단, 실행 시 python -m 옵션(module을 의미)을 사용해야 합니다.
- 크롤링 및 데이터베이스 저장 예제 코드를 실행하려면, 아래 명령을 실행합니다.
```bash
# scrap/local_councils/seoul/junggu.py 파일을 실행합니다.
python -m scrap.local_councils.seoul.junggu
# scrap/examples/database.py 파일을 실행합니다.
python -m scrap.examples.database
```
```bash
# scrap/local_councils/seoul/junggu.py 파일을 실행합니다.
python -m scrap.local_councils.seoul.junggu
# scrap/examples/database.py 파일을 실행합니다.
python -m scrap.examples.database
```
134 changes: 113 additions & 21 deletions analysis/diversity_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ def shannon(data, stair=0, opts=True):
# ====================================


def save_to_mongo_local(localId: int, factor: str, stair=0, opts=False) -> None:
def save_to_mongo_local(localId: int, factor: str, stair=0, opts=True) -> None:
factor_field = {"age": "age", "gender": "gender", "party": "jdName"}
data = [
councilor[factor_field[factor]]
Expand Down Expand Up @@ -166,7 +166,7 @@ def calculate_age_diversity_rank_history_local() -> None:
# ====================================


def save_to_mongo_metro(metroId: int, factor: str, stair=0, opts=False) -> None:
def save_to_mongo_metro(metroId: int, factor: str, stair=0, opts=True) -> None:
factor_field = {"age": "age", "gender": "gender", "party": "jdName"}
data = [
councilor[factor_field[factor]]
Expand Down Expand Up @@ -267,23 +267,115 @@ def calculate_age_diversity_rank_history_metro() -> None:
)


if __name__ == "__main__":
# for localId in range(1, 227):
# save_to_mongo_local(localId, "age", stair=10)
# save_to_mongo_local(localId, "gender")
# save_to_mongo_local(localId, "party")
# calculate_rank_local("age")
# calculate_rank_local("gender")
# calculate_rank_local("party")
# calculate_age_diversity_rank_history_local()

# for metroId in range(1, 18):
# if metroId in [8, 17]:
# continue
# save_to_mongo_metro(metroId, "age", stair=10)
# save_to_mongo_metro(metroId, "gender")
# save_to_mongo_metro(metroId, "party")
# calculate_rank_metro("age")
# calculate_rank_metro("gender")
# calculate_rank_metro("party")
# =====================================
# National council diversity statistics
# =====================================


def save_to_mongo_national(factor: str, stair=0, opts=True) -> None:
factor_field = {"age": "age", "gender": "gender", "party": "jdName"}
data = [
councilor[factor_field[factor]]
for councilor in client["council"]["national_councilor"].find()
] + [
councilor[factor_field[factor]]
for councilor in client["council"]["national_councilor_global"].find()
]
print(f"National {factor}")
print(data)
client["stats"].get_collection("diversity_index").update_one(
{"national": True},
{"$set": {f"{factor}DiversityIndex": gini_simpson(data, stair, opts)}},
upsert=True,
)


def calculate_age_diversity_rank_history_national() -> None:
for is_elected in [True, False]:
docs = client["stats"]["age_hist"].find(
{
"councilorType": "national_councilor",
"method": "equal",
"is_elected": is_elected,
}
)
for doc in docs:
diversity_index = gini_simpson(
[
group["minAge"]
for group in doc["data"]
for _ in range(group["count"])
],
stair=10,
)
client["stats"]["age_hist"].find_one_and_update(
{
"councilorType": "national_councilor",
"method": "equal",
"is_elected": is_elected,
"year": doc["year"],
},
{"$set": {"diversityIndex": diversity_index}},
)

years = list({doc["year"] for doc in client["stats"]["age_hist"].find()})

for year in years:
result = client["stats"]["age_hist"].aggregate(
[
{
"$match": {
"councilorType": "national_councilor",
"method": "equal",
"is_elected": is_elected,
"year": year,
}
},
{"$sort": {"diversityIndex": -1}},
{"$group": {"_id": "", "items": {"$push": "$$ROOT"}}},
{"$unwind": {"path": "$items", "includeArrayIndex": "items.rank"}},
{"$replaceRoot": {"newRoot": "$items"}},
{"$addFields": {"rank": {"$add": ["$rank", 1]}}},
]
)
for doc in result:
client["stats"]["age_hist"].find_one_and_update(
{
"councilorType": "national_councilor",
"method": "equal",
"is_elected": is_elected,
"year": year,
},
{"$set": {"diversityRank": int(doc["rank"])}},
)


def main():
for localId in range(1, 227):
save_to_mongo_local(localId, "age", stair=10)
save_to_mongo_local(localId, "gender")
save_to_mongo_local(localId, "party")
calculate_rank_local("age")
calculate_rank_local("gender")
calculate_rank_local("party")
calculate_age_diversity_rank_history_local()

for metroId in range(1, 18):
if metroId in [17]:
continue
save_to_mongo_metro(metroId, "age", stair=10)
save_to_mongo_metro(metroId, "gender")
save_to_mongo_metro(metroId, "party")
calculate_rank_metro("age")
calculate_rank_metro("gender")
calculate_rank_metro("party")
calculate_age_diversity_rank_history_metro()

save_to_mongo_national("age", stair=10)
save_to_mongo_national("gender")
save_to_mongo_national("party")
calculate_age_diversity_rank_history_national()


if __name__ == "__main__":
main()
Loading

0 comments on commit 5c99558

Please sign in to comment.