from pymongo import MongoClient

client = MongoClient(
    "mongodb://mongodb.dobest.io:27017/"
)

client.database_names()

client2 = MongoClient(
    "mongodb://kipoy:rlarlvy@ds013024.mlab.com:13024/kkpoy"
    # username: kipoy
    # password: rlarlvy
    # database name: kkpoy
)

client2

client2.database_names()   #관리자 권한이 없기 때문에 안된다.

client2.kkpoy.collection_names()

client2.kkpoy.users.find_one()   #원래는 JSON인데 dict형태로 뽑혔다. pymongo가 다 바꾸어주었다.

"""
Explanation: 1T_접속하기
End of explanation
"""


db = client2.kkpoy
# db = client["kkpoy"]
#위 아래 같은 의미

users = db.users
# users = db["usres"]
#위 아래 같은 의미

users   #users가 collection

users.find_one()

MONGO_QUERY = {} # json 으로 query 를 날린다. ( dict => json; pymongo )

users.find_one(MONGO_QUERY)

MONGO_QUERY = {}
users.find(MONGO_QUERY)

MONGO_QUERY = {}
cursor = users.find(MONGO_QUERY)

for user in cursor:
    print(user)

[
    user
    for user
    in cursor
]

MONGO_QUERY = {"name": "Dani Kim"}

users.find_one(MONGO_QUERY)

"""
Explanation: 2T_데이터 추가하기, 검색하기
End of explanation
"""


user = {
    "name": "이동규",
    "email": "milk@gmail.com",
}
users.insert_one(user)

users_list = [
    {
        "name": "이영은",
        "phone": "01022706512",
    },
    {
        "name": "유영수",
        "email": "yskk@naver.com"
    }
]
users.insert_many(users_list)

watcha = client2.kipoy["watcha"]

watcha = db.watcha

import requests

response = requests.get("https://watcha.net/home/news.json?page=1&per=300")

watcha_news = response.json().get("news") # List

watcha.insert_many(watcha_news)

"""
Explanation: find_찾을 때
insert_넣을 때
End of explanation
"""


import pandas as pd
import requests
import json

zigbang = client2.kipoy["zigbang"]

zigbang = db.zigbang

zigbang

response = requests.get("https://api.zigbang.com/v1/items?detail=true&item_ids=4620292&item_ids=4366382&item_ids=4566963&item_ids=4585208&item_ids=4560308&item_ids=4552724&item_ids=4344484&item_ids=4612042&item_ids=4574810&item_ids=4588687&item_ids=4387287&item_ids=4538842&item_ids=4557985&item_ids=4579464&item_ids=4607349&item_ids=4603203&item_ids=4341393&item_ids=4575315&item_ids=4350877&item_ids=4538375&item_ids=4616443&item_ids=4281504&item_ids=4556024&item_ids=4550034&item_ids=4512172&item_ids=4507118&item_ids=4606156&item_ids=4457169&item_ids=4526327&item_ids=4407071&item_ids=4582264&item_ids=4607937&item_ids=4395275&item_ids=4568603&item_ids=4569329&item_ids=4564865&item_ids=4551098&item_ids=4617261&item_ids=4536918&item_ids=4614718&item_ids=4614198&item_ids=4610604&item_ids=4578711&item_ids=4593621&item_ids=4612621&item_ids=4518874&item_ids=4533169&item_ids=4409063&item_ids=4617602&item_ids=4477945&item_ids=4249606&item_ids=4560223&item_ids=4570020&item_ids=4517907&item_ids=4530774&item_ids=4525210&item_ids=4596138&item_ids=4588994&item_ids=4612357&item_ids=4411862")

zigbang_dict = response.json()

len(zigbang_dict)

zigbang_dict.keys()

zigbang_items_list = zigbang_dict.get("items")

len(zigbang_items_list)

zigbang.insert_many(zigbang_items_list)

MONGO_QUERY = {}
zigbang.find(MONGO_QUERY).count()
#SELECT COUNT(*) FROM ____;

"""
Explanation: 직방 Collection => 데이터를 100개 정도 넣어보기
End of explanation
"""


MONGO_QUERY = {}
cursor = zigbang.find(MONGO_QUERY)
items_list = [
    document
    for document
    in cursor
    if document.get("item").get("deposit") == 1000
]

len(items_list)

MONGO_QUERY = {"title": "서울시 관악구 신림동"}
zigbang.find_one(MONGO_QUERY)

MONGO_QUERY = {"item.deposit": 1000}   #관계형 DB의 관점에서는 말도 안되는 기능. 쉽게 찾을 수 있다.
zigbang.find(MONGO_QUERY).count()

"""
Explanation: 보증금이 딱 1000만원인 매물 리스트를 출력해보자
End of explanation
"""


MONGO_QUERY = {}
cursor = zigbang.find(MONGO_QUERY)

items_list = [
    document
    for document
    in cursor
    if document.get("item").get("deposit") >= 1000
]
len(items_list)

MONGO_QUERY = {"item.deposit": {"$gte": 1000}}   #1000보다 크거나 같다. greater than equal
zigbang.find(MONGO_QUERY).count()

MONGO_QUERY = {"item.deposit": {"$gte": 1000, "$lte": 2000}} 
zigbang.find(MONGO_QUERY).count()

"""
Explanation: 보증금이 1000만원 이상인 매물 가져오기
End of explanation
"""


MONGO_QUERY = {}
cursor = zigbang.find(MONGO_QUERY)

items_list = [
    document
    for document
    in cursor
    if document.get("item").get("deposit") <= 2000 and document.get("item").get("rent") <= 50
]
len(items_list)

MONGO_QUERY = {
    "item.deposit": {"$lte": 2000},
    "item.rent": {"$lte": 50},
    }
zigbang.find(MONGO_QUERY).count()

zigbang_list = zigbang_dict.get("items")

len(zigbang_list)

new_zigbang_list = [
    item.get("item")
    for item
    in zigbang_list
]

new_zigbang_list[0]

zigbang.insert_many(new_zigbang_list)

MONGO_QUERY = {"deposit": {"$lte": 1000}}
zigbang.find(MONGO_QUERY).count()

"""
Explanation: 보증금이 2000만원 이하이고 월세가 50만원 이하인 매물 출력하기
End of explanation
"""


import pymongo

#GROUP BY
cursor = zigbang.aggregate([
        {
            "$group": {
                "_id": "$address1",
            }
        }
    ])
for document in cursor:
    print(document)

cursor = zigbang.aggregate([
        {
            "$group": {
                "_id": "$address1",
                "count": {"$sum": 1}
            }
        }
    ])
for document in cursor:
    print(document)

cursor = zigbang.aggregate([
        {
            "$group": {
                "_id": "$address1",
                "count": {"$sum": 1},
                "total deposit": {"$sum": "$deposit"}
            }
        }
    ])
for document in cursor:
    print(document)

cursor = zigbang.aggregate([
        {
            "$group": {
                "_id": "$address1",
                "count": {"$sum": 1},
                "average rent": {"$avg": "$rent"},
            }
        }
    ])
for document in cursor:
    print(document)

cursor = zigbang.aggregate([
        {
            "$group": {
                "_id": "$address1",
                "count": {"$sum": 1},
                "average rent": {"$avg": "$rent"},
                "average deposit": {"$avg": "$deposit"}
            }
        }
    ])
for document in cursor:
    print(document)

db = client.dobestan

db.collection_names()

restaurants = db.restaurants   #MONGO DB에서 제공하는 데이터

restaurants.find().count()

cursor = restaurants.aggregate([
    {
       "$group": {
            "_id": "$borough",
        }     
    }
])
for document in cursor:
    print(document)

cursor = restaurants.aggregate([
    {
       "$group": {
            "_id": "$borough",
                "count": {"$sum": 1},
        }     
    }
])
for document in cursor:
    print(document)

"""
Explanation: 비정형데이터에서 중요한 것은 어떤 데이터를 잘 넣을까 하는 부분에 대해서 고민해보아야 한다.
왜냐하면 있는 그대로 넣었을 경우에 비효율적인 부분이 발생하기 때문이다.

3T_Aggregate ( GROUP BY )

GROUP BY ... 지역별 숫자 세기 / 지역별 평균 보증금,월세 ( MongoDB )

World => MongoDB ( 데이터 전처리 ... )


aggregate ( GROUP BY )

zigbang ... address1을 기준으로 나누어보자(그룹을 나누어보자)
End of explanation
"""


import pandas as pd
import pymysql

db = pymysql.connect(
    "db.fastcamp.us",
    "root",
    "dkstncks",
    "world",
    charset='utf8',
)

# db = MySQLdb.connect(
#     "192.168.0.199",
#     "root",
#     "rlarlvy",
#     "sakila",
#     charset='utf8',
# )
# => 이거 왜 안되는지 모르겠다.

country_df = pd.read_sql("SELECT * FROM Country;", db)
city_df = pd.read_sql("SELECT * FROM City;", db)

country_df.columns

city_df.columns

# List of countries.
[
    {
        "Name": "Republic of Korea",
        "cities": [ #List of cities
            {
                "Name": "Seoul",
                "Population": "100000000",
            },
            {
                "Name": "Busan",
            }
            
        ]
    }
]

country_df.to_json()

country_df.to_dict()

city_groups = city_df.groupby("CountryCode")

country_list = []


for index, row in country_df.iterrows():
    country_dict = {}
    
    country_code = row["Code"]
#     city_group_df = city_groups.get_group(country_code) 위랑 같아
    country_dict["name"] = row["Name"]
    country_dict["population"] = row["Population"]
    country_dict["cities"] = []  # cities 라는 key 로 빈 리스트를 초기화 한다.
        
    if country_code in city_df["CountryCode"].unique():
        city_group_df = city_groups.get_group(country_code)
        
        for city_index, city_row in city_group_df.iterrows():
            city_dict = {}
            city_dict["name"] = city_row["Name"]
            city_dict["population"] = city_row["Population"]
            country_dict["cities"].append(city_dict)
            
    country_list.append(country_dict)

country_list

len(country_list)

world = client.kipoy["world"]

world

world.insert_many(country_list)

"""
Explanation: 관계형 DB를 몽고DB로 옮길 때 어떻게 옮기는 것이 가장 좋을까?
pandas로 country city df 옮겨보자
End of explanation
"""


city = {
    "name": "Seoul",
    "population" = 10000000,
    "country": {
        "name": "Korea",
        "population": 50000000
    }
}

"""
Explanation: Document 의 기준을 무엇으로 보는가? 우리는 아까 몽고DB에서 Country로 보았다


인구가 10만 이상인 도시 리스트를 뽑아올 수 있는가? 몽고 DB 쿼리 만으로는 안 된다.

왜냐하면 다큐먼트 하나하나의 기준이 country이기 때문에. 만약에 city를 기준으로 하려고 했다면 몽고 DB에서 차라리
이게 더 좋은 방법이다.
End of explanation
"""


