Neople Open API wrapper for data analyst
pip install pyneople
from pyneople.character import CharacterSearch
api_key = "Neople Open API ์์ ๋ฐ๊ธ๋ฐ์ API key"
character_search = CharacterSearch(api_key)
data = character_search.get_data("์๋ฒ์ด๋ฆ", "์บ๋ฆญํฐ์ด๋ฆ")
character_search.parse_data(data)
print(character_search.server_id)
print(character_search.character_name)
- Neople Open API ์ ์ ํ ๋ก๊ทธ์ธ
- ์ฐ์ธก ์๋จ์ ๋ง์ดํ์ด์ง ํด๋ฆญ
- ์ดํ๋ฆฌ์ผ์ด์ ๋ฑ๋ก
pyneople.character ๋ด๋ถ์ ํด๋์ค๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
from pyneople.character import CharacterInformation
api_key = "Neople Open API ์์ ๋ฐ๊ธ๋ฐ์ API key"
# api_key๋ฅผ ์ด์ฉํด ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค
character_info = CharacterInformation(api_key)
# get_data ๋ฉ์๋๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค
data = character_info.get_data("cain", "d018e5f7e7519e34b8ef21db0c40fd98")
print(data)
๊ฐ์ฒด์ ํ์ ์์ฑ์ ์์ฑํ๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
์ํ๋ ๋ฐ์ดํฐ๋ง ํ์ ์์ฑ์ผ๋ก ์์ฑํ๋ ํด๋์ค ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ ํด๋์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. CharacterSearch, CharacterInformation, Status, GrowInfo, BaseEquipment, Equipment, Weapon, Equipments, Avatar, PlatinumAvatar, Avatars
# parse_data ๋ฉ์๋๋ฅผ ์ด์ฉํด ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ ์์ฑ์ ์์ฑํฉ๋๋ค.
character_info.parse_data(data)
# ์ด์ character_info ๊ฐ์ฒด์ ํ์ ์์ฑ์ด ์์ฑ๋์ด ํ์ธํ ์ ์์ต๋๋ค.
print(character_info.character_name)
# pyneople.functions ๋ด์ attr_flatten ํจ์๋ฅผ ์ด์ฉํด์ ๋ชจ๋ ํ์ ์์ฑ์ ์ด๋ฆ์ ๋ฆฌ์คํธ๋ก ํ์ธํ ์ ์์ต๋๋ค.
from pyneople.functions import attr_flatten
print(attr_flatten(character_info))
# pyneople.functions ๋ด์ value_flatten ํจ์๋ฅผ ์ด์ฉํด์ ๋ชจ๋ ํ์ ์์ฑ์ ๊ฐ์ ๋ฆฌ์คํธ๋ก ํ์ธํ ์ ์์ต๋๋ค.
from pyneople.functions import value_flatten
print(value_flatten(character_info))
# python ๋ด์ฅํจ์๋ฅผ ์ด์ฉํ๋ฉด ํ์ ์์ฑ์ ์ด๋ฆ์ key, ๊ฐ์ value๋ก ๊ฐ์ง๋ dictionary๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
character_info_dict = dict(zip(attr_flatten(character_info), value_flatten(character_info)))
print(character_info_dict)
๋ค์๊ณผ ๊ฐ์ ํด๋์ค๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. CharacterSearch, CharacterInformation, Status, GrowInfo, BaseEquipment, Equipment, Weapon, Equipments, Avatar, PlatinumAvatar, Avatars
# ํด๋์ค ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์ํ๋ ๋ฐ์ดํฐ๋ง ํ์ ์์ฑ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
# set_sub_attributes ์ดํ ๋ชจ๋ character_infous class ๊ฐ์ฒด๋ parse_data ๋ฉ์๋ ์ฌ์ฉ์ ์ง์ ํ ์ ๋ณด๋ง ํ์ ์์ฑ์ผ๋ก ์์ฑํฉ๋๋ค.
CharacterInformation.set_sub_attributes(["character_name", 'level', 'job_grow_name'])
del character_info
character_info = CharacterInformation(api_key)
character_info.parse_data(data)
print(attr_flatten(character_info))
# ํ์ ์์ฑ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํ ํ๋ ค๋ฉด init_sub_attributes ํด๋์ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
CharacterInformation.init_sub_attributes()
del character_info
character_info = CharacterInformation(api_key)
character_info.parse_data(data)
print(attr_flatten(character_info))
pymongo์ MongoClient๊ฐ์ฒด๋ฅผ ํ๋ณด ํ ์งํํด์ผ ํฉ๋๋ค.
from pyneople.database_connecter import store_fame_data_to_mongodb
from pymongo import MongoClient
mongo_client = MongoClient('mongodb://localhost:27017/')
store_fame_data_to_mongodb(mongo_client, 'dnf', 'fame_tb_20240508', [api_key])
ํด๋น ํจ์๊ฐ ์คํ๋๋ฉด ๋ก์ปฌ MongoDB์ 'dnf'๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ 'fame_tb_20240508'๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง๋ collection์ ์ต๊ทผ 90์ผ๊ฐ ์ ์๊ธฐ๋ก์ด ์๋ 110๋ ๋ฒจ ์บ๋ฆญํฐ ์ ๋ถ๋ฅผ ์ ์ฅํฉ๋๋ค.
๋ํ api_key๋ฅผ ์ฌ๋ฌ๊ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ค๋ง CPU์ ์ฝ์ด ์์ ๋ฐ๋ผ ๋ฐ์ดํฐ ์์ง ์๋ ํฅ์์ด ์ด๋ฃจ์ด ์ง ์ ์๋ ๊ฒฝ์ฐ๋ ์๊น๋๋ค.
CPU ์ฝ์ด์ ์ด์์ api key๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
pyneople.database_connecter์์ PostgreSQL ์กฐ์์ ํ ์ ์์ต๋๋ค.
from pyneople.database_connecter import PostgreSQLConnecter
# ์์ฑ์ ํจ์์ ๋งค๊ฐ๋ณ์๋ก psycopg2 connectํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉ๋ dict๋ฅผ ์
๋ ฅํฉ๋๋ค
# ํด๋น dict๋ ์์์
๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ํฉํ๊ฒ ์์ ํ ์ด์ฉํด์ผ ํฉ๋๋ค.
pg_dict = {
'host' : 'localhost',
'user' : 'dnfdba',
'password':'1557',
'database':'dnf'
}
pg_connecter = PostgreSQLConnecter(pg_dict)
# ์ํ๋ ์ฟผ๋ฆฌ๋ฌธ์ ์
๋ ฅํ๋ฉด ์คํ์์ผ์ฃผ๋ ๋ฉ์๋์
๋๋ค.
query = \
"""
์ํ๋ ์ฟผ๋ฆฌ๋ฌธ์ ์
๋ ฅํฉ๋๋ค.
;"""
pg_connecter.excute(query)
# ์ํ๋ ์ฟผ๋ฆฌ๋ฌธ(SELCT)์ ์
๋ ฅํ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๋ฉ์๋์
๋๋ค.
query = \
"""
SELECT *
FROM table_name
LIMIT 10
;"""
data = pg_connecter.fetch(query)
print(data)
# table์ ์์ฑํ๋ ๋ฉ์๋์
๋๋ค.
pg_connecter.create_table("timeline_tb_20240502",
["total_id VARCHAR(43)",
"timeline_code SMALLINT",
"timeline_date TIMESTAMP",
"timeline_data TEXT"
],
arg_drop=True)
# table์ ์์ฑํ๋ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉ ๋ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ ๋ฉ์๋์
๋๋ค.
CharacterInformation.set_sub_attributes(["character_name", 'level', 'job_grow_name'])
del character_info
character_info = CharacterInformation(api_key)
data = character_info.get_data("cain", "d018e5f7e7519e34b8ef21db0c40fd98")
character_info.parse_data(data)
pg_connecter.create_table_query(character_info, ['VARCHAR(16)', 'SMALLINT', "VARCHAR(16)"])
# table์ ํ๋ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ ๋ฉ์๋์
๋๋ค.
print(pg_connecter.get_column_names("table_name"))
# table ์ด๋ฆ์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ ๋ฉ์๋์
๋๋ค.
print(pg_connecter.get_table_name_list())
# table์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ๋ ํจ์์
๋๋ค.
pg_connecter.insert_into_table(
pg.cursor,
"table_name",
["character_name", "level", "job_grow_name"],
[("์ค๋จ", "110", "์คํธ๋ผ์ด์ปค")]
)
from pyneople.database_connecter import mongodb_to_postgresql
# ์ ์ฒ๋ฆฌ ํจ์๋ฅผ ๋ฏธ๋ฆฌ ์ ์ํด์ผ ํฉ๋๋ค
# ์ ์ฒ๋ฆฌ ํจ์๋ ๋ฐ๋์ tuple ๋๋ tuple์ ์์๋ก ๊ฐ์ง๋ list๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
def prepro(document):
document = document['rows']
data = []
for character in document:
cs.parse_data(character)
value_flatten(cs)
data.append(tuple(
[f"{cs.server_id} {cs.character_id}",
cs.character_name,
cs.level,
cs.job_name,
cs.job_grow_name,
cs.fame]
))
return data
mongodb_to_postgresql(pg_connecter, 'fame_tb_20240501', mongo_client, 'dnf', 'fame_tb_20240502', prepro)