2016-09-28 3 views
0

배경 : 개인의 이름과 주소가있는 데이터 프레임이 있습니다. 데이터 프레임에있는 각 사람과 관련된 사람들을 카탈로그로 만들려고합니다. 따라서 개인과 관련된 사람들의 목록을 반환하는 외부 API를 통해 데이터 프레임의 각 행/레코드를 실행하고 있습니다. API를 호출하고 친척 목록을 반환하며 목록의 각 이름을 원본 데이터 프레임의 고유 한 열에 추가하는 일련의 함수를 작성하는 것이 아이디어입니다. 코드는 결국 병렬 처리됩니다.목록의 각 요소를 팬더 데이터 프레임의 다른 열에 매핑합니다.

dataframe : API를 호출하고 이름의 목록을 반환

import pandas as pd 

df = pd.DataFrame({ 
'first_name': ['Kyle', 'Ted', 'Mary', 'Ron'], 
'last_name': ['Smith', 'Jones', 'Johnson', 'Reagan'], 
'address': ['123 Main Street', '456 Maple Street', '987 Tudor Place', '1600 Pennsylvania Avenue']}, 
columns = ['first_name', 'last_name', 'address']) 

첫 번째 기능 :이 기능은 잘 작동

import requests 
import json 
import numpy as np 
from multiprocessing import Pool 

def API_call(row): 
    api_key = '123samplekey' 
    first_name = str(row['First_Name']) 
    last_name = str(row['Last_Name']) 
    address = str(row['Street_Address']) 
    url = 'https://apiaddress.com/' + '?first_name=' + first_name + '?last_name=' + last_name + '?address' = address + '?api_key' + api_key 
    response = requests.get(url) 
    JSON = response.json() 
    name_list = [] 
    for index, person in enumerate(JSON['people']): 
     name = JSON['people'].get('name') 
     name_list.append(name) 
    return name_list 

. 데이터 프레임의 각 사람에 대해 가족/친구 목록이 반환됩니다. 따라서 Kyle Smith의 경우 함수는 [Heather Smith, Dan Smith]을 반환하고 Ted Jones의 경우 함수는 [Al Jones, Karen Jones, Tiffany Jones, Natalie Jones]을 반환하며 데이터 프레임의 각 행/레코드에 대해서도 마찬가지입니다.

문제점 : 나는 반환 된 목록을 반복하고 각 값을 데이터 프레임의 검색된 이름에 해당하는 고유 한 열에 추가하는 후속 함수를 작성하는 데 어려움을 겪고 있습니다.

First_Name | Last_Name | Street_Address   | relative1_name | relative2_name | relative3_name | relative4_name 
----------------------------------------------------------------------------------------------------------------------------- 
Kyle  | Smith  | 123 Main Street   | Heather Smith | Dan Smith  |     | 
Ted  | Jones  | 456 Maple Street   | Al Jones  | Karen Jones  | Tiffany Jones | Natalie Jones 
Mary  | Johnson | 987 Tudor Place   | Kevin Johnson |     |     | 
Ron  | Reagan  | 1600 Pennsylvania Avenue | Nancy Reagan | Patti Davis  | Michael Reagan | Christine Reagan 

참고 : 나는 기능은 다음과 같습니다 데이터베이스를 반환 할 목표는 내가 apply 방법을 사용하고 결국 병렬로 전체를 실행할 수 있도록, 모든 벡터화하는 것입니다. 다음 코드의 라인을 따라 뭔가 과거에 나를 위해 일했다은 "API_call"기능 대신 매핑/반복 될 필요가 목록의 단일 개체를 반환 할 때 :

def API_call(row): 
    # all API parameters 
    url = 'https//api.com/parameters' 
    response = request.get(url) 
    JSON = response.json() 
    single_object = JSON['key1']['key2'].get('key3') 
    return single_object 

def second_function(data): 
    data['single_object'] = data.apply(API_call, axis =1) 
    return data 

def parallelize(dataframe, function): 
    df_splits = np.array_split(dataframe, 10) 
    pool = Pool(4) 
    df_whole = pd.concat(pool.map(function, df_splits)) 
    pool.close() 
    pool.join() 
    return df_whole 

parallelize(df, second_function) 

문제는 I입니다 API에서 반환 한 목록의 이름을 원래 데이터 프레임의 고유 한 열로 매핑하는 벡터화 가능한 함수 (second_function)를 작성할 수 없습니다. 어떤 도움을 주셔서 미리 감사드립니다!

답변

0
import pandas as pd 


def make_relatives_frame(relatives): 

    return pd.DataFrame(data=[relatives], 
         columns=["relative%i_name" % x for x in range(1, len(relatives) + 1)]) 

# example output from an API call 
df_names = pd.DataFrame(data=[["Kyle", "Smith"]], columns=["First_Name", "Last_Name"]) 
relatives = ["Heather Smith", "Dan Smith"] 
df_relatives = make_relatives_frame(relatives) 
df_names[df_relatives.columns] = df_relatives 

# example output from another API Call with more relatives 
df_names2 = pd.DataFrame(data=[["John", "Smith"]], columns=["First_Name", "Last_Name"]) 
relatives2 = ["Heath Smith", "Daryl Smith", "Scott Smith"] 
df_relatives2 = make_relatives_frame(relatives2) 
df_names2[df_relatives2.columns] = df_relatives2 

# example of stacking the outputs 
total_df = df_names.append(df_names2) 

print total_df 

위 코드를 시작해야합니다. 분명히 대표적인 예일 뿐이지 만 특정 유스 케이스에 맞게 리펙토링 할 수 있어야합니다.

관련 문제