def hello():
    """
    주석입니다, docstring => 파이썬 코드를 문서화
    """
    pass

# 샵 이것도 주석

a = """

"""   #Multiline String입니다.

a = "여러줄
텍스트"

a = "여러줄\
텍스트"

a

a = """
    안녕하세요.
    저는 김기표입니다.
"""

a

a.strip()

a.replace("\n", " ")

a.replace("\n", " ").strip()

import pymysql

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

SQL_QUERY = """
    SELECT *
    FROM Country
    ;
"""

country_df = pd.read_sql(SQL_QUERY, db)

# pd.read_sql("SELECT * FROM Country;", db)
# 사실 이렇게 문장을 줄여서 쓸 수 있다.

"""
Explanation: 1T_Pandas로 배우는 SQL 시작하기 (1) - WHERE, ORDER BY
갯수 세기 (COUNT)
칼럼명 변경하기 (AS)
정렬 (ORDER BY)
특정 조건에 대한 필터링(WHERE)
Pandas에서는

JOIN ( merge ) ( * )
GROUP BY ( * )

잠시 주석에 대해서
End of explanation
"""


SQL_QUERY = """
    SELECT ____   #어떤 Column, 혹은 어떤 값을 DB로 가져올까
    FROM   ____   #어떤 Table (Excel, Sheet) 에서 정보를 가져올까
    ;
"""

SQL_QUERY = """
    SELECT *
    FROM Country
    ;
"""

# "select * from Country"   =>  똑같이 동작을 하겠지만 대문자로 쓰는 것이 약속
# ;(세미콜론) 있으나 없으나 이제는 동작하지만 그래도 끝났다는 것을 명시하기 위해 쓰는 게 낫다.

"""
Explanation: SQL(Structured Query Language; 구조화된 질의 언어 == Python Programming Language)
정규표현식 같은 경우에는 하나의 약속이지 프로그래밍 언어라고 할 순 없다.
그래서 내부적으로 함수 같은 기능이 있다. count, sum, mean...



연산에 대한 부분이 아니다, SQL 이런 연산에 굉장히 최적화 => 빠르게
대신 느린 부분은 DATA가 100만개라면 Name, Population을 뽑아서 다운로드 받게 되면 네트워크에 대한 비용이 크게 부담된다. 그래서 10초 이상 걸리게 된다. DATA가 다 받아와 질 때까지. 그런데 만약에 COUNT를 쓰게 되면 이미 연산은 서버에서 되고 숫자만 바로 날아오는 것이다. 그러면 바로 정보를 받을 수 있는 것이다. 그래서 가능하면 SQL에서 연산이 가능한 것은 SQL에서 돌리고 pandas에서만 편하게 할 수 있는 것은 pasdas에서. 하지만 pandas가 편하기 때문에 csv로 받아와서 처리해도 되긴 하지만 계산된 데이터만 받아오는 것이 편할 경우에는 SQL에서
End of explanation
"""


SQL_QUERY = """
    SELECT Name, Population, Continent
    FROM Country
    ;
"""

df = pd.read_sql(SQL_QUERY, db)

df.head()

country_df[["Name", "Population", "Continent"]].head()

"""
Explanation: Country => Name, Population, Continent
End of explanation
"""


npc_df = country_df[["Name", "Population", "Continent"]]

npc_df.rename(columns={"Name": "이름", "Population": "인구", "Continent": "대륙"})

SQL_QUERY = """
    SELECT Name AS "이름", Population AS "인구수", Continent AS "대륙"
    FROM Country
    ;
"""

pd.read_sql(SQL_QUERY, db)

SQL_QUERY = """
    SELECT Name "이름", Population "인구수", Continent "대륙"
    FROM Country
    ;
"""
# AS가 없어도 동일하게 동작한다. 이건 없이 써도 됩니다.
pd.read_sql(SQL_QUERY, db)

country_df.count()

len(country_df)

SQL_QUERY = """
    SELECT COUNT(*)
    FROM Country;
"""

pd.read_sql(SQL_QUERY, db)

SQL_QUERY = """
    SELECT COUNT(*) "count"
    FROM Country;
"""

pd.read_sql(SQL_QUERY, db)

SQL_QUERY = """
    SELECT SUM(Population)
    FROM Country;
"""
#SQL에는 SUM, AVG 등 다양한 내장함수가 있다.
pd.read_sql(SQL_QUERY, db)

"""
Explanation: Name => 이름
Poplation => 인구
Continent = > 대륙으로 변경
End of explanation
"""


import time

start_time = time.time()

#여기서부터 시작
count = len(pd.read_sql("SELECT * FROM Country;", db))
print(count)

end_time = time.time()

excute_time = end_time - start_time
print(excute_time)

start_time = time.time()

#여기서부터 시작
pd.read_sql("SELECT COUNT(*) FROM Country;", db)

end_time = time.time()

excute_time = end_time - start_time
print(excute_time)

"""
Explanation: 만약 어떤 데이터의 숫자만을 세야 하는 상황이라면? Pandas or SQL? SQL이 좋다.
End of explanation
"""


is_europe = country_df["Continent"] == "Europe" 
is_population = country_df["Population"] > 10000000

country_df[is_europe][is_population]

# AND => 유럽에 있고, 인구가 1000만 이상인 애들
# OR => 유럽에 있거나, 인구가 1000만 이상인 애들 
# country_df[is_europe & is_population]
# country_df[is_europe | is_population]

SQL_QUERY = """
    SELECT *
    FROM Country
    WHERE 
        Continent = "Europe"
        AND Population > 10000000
    ;
"""

pd.read_sql(SQL_QUERY, db)

"""
Explanation: SQL은 이런 연산에 굉장히 최적화 되어 있기 때문에 다른 언어보다 빠르다.
대신에 느린 부분은?
데이터가 100만개라면. Name, Population 등을 뽑을 때 다운로드 받아야 한다.
네트워크에 대한 비용이 걸린다. 다운 받는 속도 때문에 오래 걸린다.
그래서 빠르게 하는 방법은? SQL에서 가능한 연산은 SQL에서 돌리고 받는 것이 좋다.

조건에 따른 Filtering

Continent == Europe
Population > 10,000,000 데이터를 뽑아라
End of explanation
"""


is_asia = country_df["Continent"] == "Asia"
is_europe = country_df["Continent"] == "Europe"

country_df[is_asia | is_europe]

"""
Explanation: Asia나 혹은 Europe에 속하는 국가를 1.pandas 2.sql 둘 다 뽑아보기
정답 4가지
1. pandas (1)
End of explanation
"""


is_asia_or_europe = country_df["Continent"].isin(["Asia", "Europe"])
country_df[is_asia_or_europe].head(3)

# df["Continent"].str.contains("Asia")  =>  이건 텍스트마이닝 방법

"""
Explanation: 2. pandas (2)
End of explanation
"""


SQL_QUERY = """
    SELECT *
    FROM Country
    WHERE
        Continent = "Asia"
        OR Continent = "Europe"
"""

pd.read_sql(SQL_QUERY, db)

"""
Explanation: 3. sql (1)
End of explanation
"""


SQL_QUERY = """
    SELECT *
    FROM Country
    WHERE
        Continent IN ("Asia", "Europe")
    ;
"""

pd.read_sql(SQL_QUERY, db)

"""
Explanation: 4. sql (2)
End of explanation
"""


country_df.sort_values("Population", ascending=False)[["Name", "Population"]]

"""
Explanation: 정렬
Pandas에서 인구수 내림차순으로 정렬(즉, 인구가 많은 순서대로)
End of explanation
"""


country_df.sort("Population")

"""
Explanation: sort() - deprecated(중요도가 떨어져 더 이상 사용되지 않고 앞으로는 사라지게 될 (컴퓨터 시스템 기능 등))
End of explanation
"""


SQL_QUERY = """
    SELECT Name, Population
    FROM Country
    ORDER BY Population DESC
    ;
"""
# 기본값으로 ASC
pd.read_sql(SQL_QUERY, db)

"""
Explanation: 인구수가 1억 명 이상이면서, 아시아나 유럽에 포함된 국가들을 인구수 내림차순으로 출력하라 와 같은 문제도 풀 수 있다.
End of explanation
"""


