0
0 комментариев

итоговый результатКак для dataframe с помощью apply создать и последовательно наполнить 4 столбца?

новичок в python

сейчас поступаю таким образом.

df['клик на more'] = df['тег'].apply(statMore_list)
df['клик на address'] = df['тег'].apply(statAddress_list)
df['клик на map'] = df['тег'].apply(statMap_list)
df['клик на name'] = df['тег'].apply(statByUrl)

функция statMore_list()
(Функции statAddress_list, statMap_list, statByUr выглядят аналогично, меняется лишь условие в конце цикла):

def statMore_list (i):
 
    API_URL = 'https://api-metrika.yandex.ru/stat/v1/data'
 
    params_func = {
 
                'date1': start_date,
 
                'date2': end_date,
 
                'id': id_metrika,
 
                'dimensions': 'ym:s:paramsLevel2',
 
                'metrics': 'ym:s:visits',
 
                'oauth_token': token,
 
                'filters': "ym:s:paramsLevel1=='listitem' AND ym:s:startURL=@'{}'".format(i)
    }
 
    d = requests.get(API_URL, params = params_func)
    d = d.json()
 
    for i in d['data']:
        if i['dimensions'][0]['name'] == 'more_list':
            more_list = i['metrics'][0]
            print(more_list)
            return more_list

по сути я делаю 3 лишних запроса к api, потому что все данные можно получить при одном ответе и заполнить ими dataframe.
но как это сделать пока не могу сообразить.

Попробовал переделать функцию таким образом:

def checkFunction (i):
    if i['dimensions'][0]['name'] == 'name_list':
        name_list = i['metrics'][0]
        #print(name_list)
        return name_list
 
    if i['dimensions'][0]['name'] == 'more_list':
        more_list = i['metrics'][0]
        #print(more_list)
        return more_list
 
    if i['dimensions'][0]['name'] == 'address_list':
        address_list = i['metrics'][0]
        #print(address_list)
        return address_list
 
    if i['dimensions'][0]['name'] == 'map_list':
        map_list = i['metrics'][0]
        #print(map_list)
        return map_list
 
def statByUrl (i):
 
    API_URL = 'https://api-metrika.yandex.ru/stat/v1/data'
 
    params_func = {
 
                'date1': start_date,
 
                'date2': end_date,
 
                'id': id_metrika,
 
                'dimensions': 'ym:s:paramsLevel2',
 
                'metrics': 'ym:s:visits',
 
                'oauth_token': token,
 
                'filters': "ym:s:paramsLevel1=='listitem' AND ym:s:startURL=@'{}'".format(i)
    }
 
    d = requests.get(API_URL, params = params_func)
    d = d.json()
    pprint(d)
 
    for k in d['data']:
        checkFunction(k)

Но дальше все равно не понимаю как в apply создать 4 столбца и наполнять их.

ответ api:

{'data': [{'dimensions': [{'name': 'position'}], 'metrics': [15741.0]},
          {'dimensions': [{'name': 'referer'}], 'metrics': [15741.0]},
          {'dimensions': [{'name': 'name_list'}], 'metrics': [7322.0]},
          {'dimensions': [{'name': 'more_list'}], 'metrics': [5374.0]},
          {'dimensions': [{'name': 'address_list'}], 'metrics': [4050.0]},
          {'dimensions': [{'name': 'map_list'}], 'metrics': [3361.0]},
          {'dimensions': [{'name': 'icon_price'}], 'metrics': [119.0]},
          {'dimensions': [{'name': 'icon_photo'}], 'metrics': [49.0]},
          {'dimensions': [{'name': 'icon_feedback'}], 'metrics': [30.0]},
          {'dimensions': [{'name': 'icon_comments'}], 'metrics': [23.0]},
          {'dimensions': [{'name': 'icon_videos'}], 'metrics': [1.0]}],
 'data_lag': 86,
 'max': [15741.0],
 'min': [1.0],
 'query': {'attribution': 'Last',
           'auto_group_size': '1',
           'currency': 'RUB',
           'date1': '2018-02-01',
           'date2': '2018-04-16',
           'dimensions': ['ym:s:paramsLevel2'],
           'filters': "ym:s:paramsLevel1=='listitem' AND "
                      "ym:s:startURL=@'/***********/'",
           'group': 'Week',
           'ids': [***********],
           'limit': 100,
           'metrics': ['ym:s:visits'],
           'offline_window': '21',
           'offset': 1,
           'quantile': '50',
           'sort': ['-ym:s:visits']},
 'sample_share': 1.0,
 'sample_size': 767118,
 'sample_space': 767118,
 'sampled': False,
 'total_rows': 11,
 'total_rows_rounded': False,
 'totals': [15741.0]}


Добавить комментарий