<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Typeform Data API Test
ทดสอบการใช้งาน Data API ของ Typeform
Step1:  เปลี่ยน rating ให้กลายเป็น integer เนื่องจากตอนที่ดึงข้อมูลจาก API ข้อมูลส่วนของ rating จะมาเป็น string
Step2:  แสดงคำตอบของแต่ละคนเพื่อเช็คว่าค่า rating ที่ได้มาเป็น integer แล้ว
Step3:  ใช้ Pandas เข้ามาช่วยจัดการข้อมูล
Step4:  กลุ่มคำถามทั้งหมด
Step5:  คะแนน "โดยรวมทุกสาขา" จากคำตอบของแต่ละกลุ่มคำถาม
Step6:  สาขาทั้งหมด
Step7:  คะแนน "แยกแต่ละสาขา" จากคำตอบของแต่ละกลุ่มคำถาม
Step8:  ส่งข้อมูลออกไปเป็น group ของ questions จะ render ได้ง่ายกว่า
ส่ง list ของ branches ออกไปแยก
Step9:  ถ้าจัดข้อมูลแบบตัวแปร b ได้ เราสามารถ transpose และส่งออกไป render ได้ง่าย
Step10:  หลังจากา loop แต่ละ question group แล้ว ให้ loop แต่ละ สาขา (branch) เพื่อสร้าง list ของคำถามของสาขานั้นๆ มาก่อน
Step11:  [IGNORE] ทดลองโค้ดบางอย่าง
<ASSISTANT_TASK:>
Python Code:
form_uid = 'HQnDRM'
#form_uid = 'iSEGWq'
typeform_api_key = '_API_KEY_'
url = 'https://api.typeform.com/v1/form/' + form_uid + '?key=' + typeform_api_key
import requests
response = requests.get(url)
results = response.json()
results
questions = results.get('questions')
questions
responses = results.get('responses')
responses
print('Total Responses: ' + str(len(responses)))
Explanation: Typeform Data API Test
ทดสอบการใช้งาน Data API ของ Typeform
End of explanation
answers = [each['answers'] for each in responses]
for answer in answers:
    for each in answer:
        if 'rating_' in each:
            answer[each] = int(answer[each])
Explanation: เปลี่ยน rating ให้กลายเป็น integer เนื่องจากตอนที่ดึงข้อมูลจาก API ข้อมูลส่วนของ rating จะมาเป็น string
End of explanation
print(answers)
print('Completion rate: ' + str(len(list(filter(lambda x: x, answers))) / len(answers)))
Explanation: แสดงคำตอบของแต่ละคนเพื่อเช็คว่าค่า rating ที่ได้มาเป็น integer แล้ว
End of explanation
import pandas as pd
df = pd.DataFrame(answers)
df
df[df['list_53368385_choice'] == 'จตุจักร']
df[df['list_53368385_choice'] == 'คลองสาน']
df_questions = pd.DataFrame(questions)
df_questions
Explanation: ใช้ Pandas เข้ามาช่วยจัดการข้อมูล
End of explanation
question_groups = list(filter(lambda x: type(x) == str, df_questions.group.unique()))
question_groups
Explanation: กลุ่มคำถามทั้งหมด
End of explanation
for each_question_group in question_groups:
    print('--- ' + df_questions[df_questions['id'] == each_question_group]['question'].iloc[0] + ' ---')
    questions_in_group = df_questions[df_questions['group'] == each_question_group][['id', 'question']]
    for idx, question in zip(questions_in_group.id, questions_in_group.question):
        print(question + ': ' + str(df[idx].mean()))
    print()
Explanation: คะแนน "โดยรวมทุกสาขา" จากคำตอบของแต่ละกลุ่มคำถาม
End of explanation
branch_column_name = 'list_53368385_choice'
branches = list(filter(lambda x: type(x) == str, df[branch_column_name].unique()))
branches
df[df[branch_column_name] == 'จตุจักร']
df_questions
questions_in_no_group = df_questions[
    df_questions['group'].isnull() &
    df_questions['id'].str.contains('rating_')
][['id', 'question']]
questions_in_no_group
df_questions[df_questions['group'] == 'group_53368461']
df_questions[df_questions['group'] == 'group_53368461'].shape[0]
Explanation: สาขาทั้งหมด
End of explanation
charts = {}
for each_branch in branches:
    branch = []
    df_branch = df[df[branch_column_name] == each_branch]
    for each_question_group in question_groups:
        chart = {'data': []}
        chart['id'] = each_question_group
        chart['label'] = df_questions[df_questions['id'] == each_question_group]['question'].iloc[0] + '...'
        
        questions_in_group = df_questions[df_questions['group'] == each_question_group][['id', 'question']]
        for idx, question in zip(questions_in_group.id, questions_in_group.question):
            chart['data'].append(
                [
                    question,
                    df_branch[idx].mean()
                ]
            )
        branch.append(chart)
    
    chart = {'data': []}
    chart['id'] = 'group_others'
    chart['label'] = 'Others'
    
    questions_in_no_group = df_questions[df_questions['group'].isnull() & df_questions['id'].str.contains('rating_')][['id', 'question']]
    for idx, question in zip(questions_in_no_group.id, questions_in_no_group.question):
        chart['data'].append(
            [
                question,
                df_branch[idx].mean()
            ]
        )
    branch.append(chart)
    
    charts[each_branch] = branch
    
charts
#for each_question_group in question_groups:
#    count = df_questions[df_questions['group'] == each_question_group].shape[0]
for each_branch in branches:
    #for idx in range(count):
    print(charts[each_branch][2]['data'])
print('------')
for idx, _ in enumerate(charts):
    for each_branch in branches:
        print(charts[each_branch][idx]['id'])
    print('------')
scores = []
for each_branch in branches:
    score_each_branch = []
    for each in charts[each_branch][0]['data']:
        score_each_branch.append(each[1])
    scores.append(score_each_branch)
scores
list(zip(*scores))
list(map(list, zip(*scores)))
import numpy as np
np_scores = np.array(scores)
np_scores.T
Explanation: คะแนน "แยกแต่ละสาขา" จากคำตอบของแต่ละกลุ่มคำถาม
End of explanation
a = [['xx', 8.0, 9.0],
['yy', 5.0, 7.0]]
a
b = list(zip(*a))
b
Explanation: ส่งข้อมูลออกไปเป็น group ของ questions จะ render ได้ง่ายกว่า
ส่ง list ของ branches ออกไปแยก
End of explanation
list(zip(*b))
Explanation: ถ้าจัดข้อมูลแบบตัวแปร b ได้ เราสามารถ transpose และส่งออกไป render ได้ง่าย
End of explanation
x = [
    ('คำตอบคำถาม1-สาขา1', 'คำตอบคำถาม2-สาขา1', 'คำตอบคำถาม3-สาขา1'), 
    ('คำตอบคำถาม1-สาขา2', 'คำตอบคำถาม2-สาขา2', 'คำตอบคำถาม3-สาขา2'),
    ('คำตอบคำถาม1-สาขา3', 'คำตอบคำถาม2-สาขา3', 'คำตอบคำถาม3-สาขา3'),
    ('คำตอบคำถาม1-สาขา4', 'คำตอบคำถาม2-สาขา4', 'คำตอบคำถาม3-สาขา4'),
]
x = [('คำถาม 1', 'คำถาม 2', 'คำถาม 3'), ] + x
list(map(list, zip(*x)))
df_answers = df
df_questions
df_answers
question_groups
branches
df_questions[df_questions['group'] == 'group_53368461'][['id', 'question']]
df_answers[df_answers[branch_column_name] == 'บางนา']
charts = []
# for each question group
# for questions in each question group
filtered_questions = df_questions[df_questions['group'] == 'group_53368461'][['id', 'question']]
for question_id, question in zip(filtered_questions.id, filtered_questions.question):
    for idx, each in enumerate(branches):
        if idx == 0:
            chart = [question]
        df_branch = df_answers[df_answers[branch_column_name] == each]
        chart.append(df_branch[question_id].mean())
        
    charts.append(chart)
charts
filtered_questions
df_branch
Explanation: หลังจากา loop แต่ละ question group แล้ว ให้ loop แต่ละ สาขา (branch) เพื่อสร้าง list ของคำถามของสาขานั้นๆ มาก่อน
End of explanation
prefixes = ['list_', 'rating_', 'textfield_']
for each in questions:
    if any([each['id'].startswith(prefix) for prefix in prefixes]):
        try:
            print(df[each['id']])
        except KeyError:
            print('No one answers..')
form_uid = 'iSEGWq'
typeform_api_key = '__API_KEY__'
url = 'https://api.typeform.com/v1/forms?key=' + typeform_api_key
response = requests.get(url)
results = response.json()
results
Explanation: [IGNORE] ทดลองโค้ดบางอย่าง
End of explanation
<END_TASK>