<jupyter_start><jupyter_text>Questions---- ระหว่างประเทศ US และ TH แต่ละประเทศนิยม Video หมวดหมู่ใดบ้าง---แหล่งข้อมูล:* Youtube API: https://developers.google.com/youtube/v3/docs* Kaggle: https://www.kaggle.com/datasnaek/youtube-new ___ Import___<jupyter_code>import pickle
import numpy as np
import pandas as pd

from time import sleep
from pandas import DataFrame
from pymongo import MongoClient
from pymongo import MongoClient
from apiclient.discovery import build

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns

sns.set_style('darkgrid')<jupyter_output><empty_output><jupyter_text>___ Connect DB___<jupyter_code>client = MongoClient("localhost", 27017)
db = client["DataEngineer"]<jupyter_output><empty_output><jupyter_text>___ Function Description___``` pythondef get_videos_info(input_id):    """    id: หมายเลข videoID ที่จะให้ในการหาข้อมูลรายละเอียดของวิดีโอนั้น        หน้าที่:        ใช้ในการ resquest api จาก videoID และบันทึกข้อมูลลง Database: view    """    def get_data_th(after, before):    """    after: วิดีโอที่ถูกปล่อยหลังจาก (Datetime)    before: วิดีโอที่ถูกปล่อยก่อนหน้า (Datetime)        หน้าที่:        ใช้ในการ resquest api จากช่วงเวลาและบันทึกข้อมูลลง Database: search_logs    """    def json_to_csv(x):    """    x: นำข้อมูลที่ได้จาก Database: view มาเตรียมความพร้อม        หน้าที่:        ใช้ในการสร้างรูปแบบและเพิ่มข้อมูลเข้า DataFrame    """    def join_str(x):    """    x: นำข้อมูลที่ได้จากข้อมูล tags        หน้าที่:        ใช้ในการแปลงรูปแบบให้เป็น String รูปแบบเดียวกับข้อมูลจาก Kaggle    """``` ___ CSV___**Data from Kaggle:**แหล่งข้อมูล: https://www.kaggle.com/datasnaek/youtube-new<jupyter_code>df = pd.read_csv("Data/Kaggle/CSV/USvideos.csv").sort_values("publish_time",
                                                             ascending=True)
df.head(2)
df.tail(2)<jupyter_output><empty_output><jupyter_text>___ API___แหล่งข้อมูล: https://developers.google.com/youtube/v3/docs  Popular search in Thailand (2006 -> 2018)  Connect Youtube API<jupyter_code>youtube_api_key = "<KEY>"

youtube = build(
    "youtube",
    "v3",
    developerKey=youtube_api_key
)<jupyter_output><empty_output><jupyter_text>หาค่า Search จากช่วงเวลา<jupyter_code>def get_data_th(after, before):
    req = youtube.search().list(
        part='snippet',
        location='13.736717, 100.523186',
        locationRadius='500mi',
        maxResults=50,
        order='date',
        publishedAfter= after,
        publishedBefore= before,
        type='video',
        pageToken=None
    )
    res = req.execute()

    # เก็บข้อมูลจาก api และเก็บ log_files
    logs_pages = []
    while True:
        sleep(1)
        try:
            logs_pages.append(res['nextPageToken'])
            db.search_logs.insert_one({
                "next_token": res['nextPageToken'],
                "response": res
            })

            print(f"กำลังเก็บข้อมูลรอบที่ {len(logs_pages)}")

            api = youtube.search().list_next(req, res)
            req, res = api, api.execute()
            # raise AttributeError
        except KeyError:
            logs_pages.append('-')
            print(f"กำลังเก็บข้อมูลรอบที่ {len(logs_pages)}")

            db.search_logs.insert_one({
                "response": res
            })

            print("เสร็จสิ้น (หาข้อมูลถัดไปไม่เจอ)")
            break
        except AttributeError as e:
            print("เสร็จสิ้น")
            break

    print(f"Logs: {', '.join(logs_pages)}")
after = '2006-07-23T08:24:11.000Z'
before = "2006-08-10T16:42:57Z"
get_data_th(after, before)<jupyter_output>กำลังเก็บข้อมูลรอบที่ 1
เสร็จสิ้น (หาข้อมูลถัดไปไม่เจอ)
Logs: -<jupyter_text>ดึงข้อมูล Search จากฐานข้อมูล<jupyter_code>search_db = db.search_logs.find()
data = list(search_db)

df = DataFrame(data)
df<jupyter_output><empty_output><jupyter_text>ดูข้อมูลสมาชิกแต่ละตัว<jupyter_code>tmp = []
for item in  df['response'].values:
    try:
        tmp.append(DataFrame(item['items']))
    except KeyError:
        (print(item['items']))

df_tmp = pd.concat(tmp, ignore_index=True)
df_tmp<jupyter_output><empty_output><jupyter_text>ค้นหารายละเอียดและข้อมูลเชิงสถิติของ Video ID ของ Video ในฐานข้อมูล<jupyter_code>video_ids = df_tmp.id.apply(lambda x: x['videoId']).values
video_ids<jupyter_output><empty_output><jupyter_text>ฟังก์ชันดึงข้อมูลรายละเอียด<jupyter_code>def get_videos_info(input_id):
    req = youtube.videos().list(
        id=input_id,
        part=['snippet','contentDetails','statistics'],
        maxResults=1,
    )

    res = req.execute()

    data = {
        "video_id": input_id,
        "response": res
    }

    db.view.insert_one(data)
count = 0
for id in video_ids:
    try:
        get_videos_info(id)
    except Exception as e:
        print(f"ID: {id} เกิด {e}")
        count += 1
        if count >= 10:
            break

print("เพิ่มข้อมูลลงฐานข้อมูลเสร็จสิ้น")<jupyter_output>เพิ่มข้อมูลลงฐานข้อมูลเสร็จสิ้น<jupyter_text>ดึงข้อมูลมาทำรูปแบบเดียวกันกับข้อมูลที่ต้องการเปียบแทียบ<jupyter_code>json_view = list(db.view.find())
json_view[0]
def json_to_csv(x):
    json_view = x
    item_tmp = json_view['response']['items'][0]['snippet']
    statistic_tmp = json_view['response']['items'][0]['statistics']
    
    
    prepare_df = {
        "video_id": json_view.get('video_id', np.nan),
        "title": item_tmp.get('title', np.nan),
        "channel_title": item_tmp.get('channelTitle', np.nan),
        "category_id": item_tmp.get('categoryId', np.nan),
        'publish_time': item_tmp.get('publishedAt', np.nan),
        'tags': item_tmp.get('tags', np.nan),
        'views': statistic_tmp.get('viewCount', np.nan),
        'likes': statistic_tmp.get('likeCount', np.nan),
        'dislikes': statistic_tmp.get('dislikeCount', np.nan),
        'comment_count': statistic_tmp.get('commentCount', np.nan),
        'thumbnail_link': item_tmp['thumbnails']['standard']['url'] if not item_tmp['thumbnails'].get('standard', np.nan) else item_tmp['thumbnails'].get('standard', np.nan) ,
        'description': item_tmp.get('description', np.nan)
    }

    df_videos = pd.DataFrame([prepare_df])
    return df_videos

prepare_df_view = []
print("Strat:", end=" ")
for j in json_view:
    try:
        print(len(prepare_df_view), end=" ")
        prepare_df_view.append(json_to_csv(j))
    except KeyError as e:
        print(e, j)
    

df_view = pd.concat(prepare_df_view)
def join_str(x):
    try:
        len(x)
        return "|".join(x)
    except TypeError:
        return np.nan

df = df_view.copy()
df['tags'] =  df_view.tags.apply(join_str)
print("เสร็จสิ้น")
df.to_csv("Data/Database/CSV/df_view.csv", index=False)<jupyter_output><empty_output><jupyter_text>Cleaning<jupyter_code>df_us = pd.read_csv("Data/Kaggle/CSV/USvideos.csv").sort_values("publish_time",
                                                                 ascending=True)
df_th = pd.read_csv("Data/Database/CSV/df_view.csv").sort_values("publish_time",
                                                                 ascending=True)
df_us
df_th<jupyter_output><empty_output><jupyter_text>ทำให้ Columns เท่ากัน<jupyter_code>set(df_us) - set(df_th)
df_us.drop(columns=list(set(df_us) - set(df_th)), inplace=True)
set(df_us) == set(df_th)<jupyter_output><empty_output><jupyter_text>เพิ่มควาหมายของ Category ให้สามารถเข้าใจได้โดยข้อมูลมาจาก: https://gist.github.com/dgp/1b24bf2961521bd75d6c``` python 2 - Autos & Vehicles1 -  Film & Animation10 - Music15 - Pets & Animals17 - Sports18 - Short Movies19 - Travel & Events20 - Gaming21 - Videoblogging22 - People & Blogs23 - Comedy24 - Entertainment25 - News & Politics26 - Howto & Style27 - Education28 - Science & Technology29 - Nonprofits & Activism30 - Movies31 - Anime/Animation32 - Action/Adventure33 - Classics34 - Comedy35 - Documentary36 - Drama37 - Family38 - Foreign39 - Horror40 - Sci-Fi/Fantasy41 - Thriller42 - Shorts43 - Shows44 - Trailers```<jupyter_code>category_desc = pickle.load(open("Data/cate.p", 'rb'))
df_us['category'] = df_us.category_id.apply(lambda x: category_desc[x])
df_th['category'] = df_th.category_id.apply(lambda x: category_desc[x])
df_us.head(1)
df_th.head(1)<jupyter_output><empty_output><jupyter_text>___ Answer___* ระหว่างประเทศ US และ TH แต่ละประเทศนิยม Video หมวดหมู่ใดบ้าง หา Category ทั้งหมด 5 อันดับ<jupyter_code>top_us = df_us.category.value_counts()
top_us
top_th = df_th.category.value_counts()
top_th<jupyter_output><empty_output><jupyter_text>แสดงกราฟความนิยมสูงสุด 5 อันดับของทั้ง 2 ประเทศ<jupyter_code>fig, (ax1, ax2) = plt.subplots(
    nrows=1,
    ncols=2,
    figsize=(16,6)
)

ax1.bar(
    x=top_th.head().index,
    height=top_th.head().values,
    color=["gray", "palevioletred", "deepskyblue", "yellowgreen", "Salmon"]
)
           
ax2.bar(
    x=top_us.head().index,
    height=top_us.head().values,
    color=["Salmon", "yellowgreen", "deepskyblue", "gray", "palevioletred"]
)

fig.suptitle("Category", fontsize=20)
ax1.set_title('Thailand')
ax2.set_title('United States');<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1516735238518848, 'fraction_numerical': 0.01934838207494718, 'mean_word_length': 3.716308337703199, 'pattern_counts': {'":': 9, '<': 60, '<?xml version=': 0, '>': 62, 'https://': 5, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 6, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '15', 'dir': 'jupyter-structured-clean-dedup', 'id': '219457', 'license': 'MIT', 'n_tokens_mistral': 3928, 'n_tokens_neox': 3925, 'n_words': 498, 'path': 'Youtube API.ipynb', 'repo_name': 'chonsawat/Data-Engineer', 'size': '9027'}