Хотите автоматизировать повторяющийся процесс в python - PullRequest
0 голосов
/ 05 мая 2020

Ниже приведен процесс загрузки данных api. Это нормально и выполняет свою работу, хотя я новичок в программировании и чувствую, что есть гораздо более чистый способ сделать это, а не повторять код 4 раза. как это автоматизировать, чтобы избежать повторяющегося кода?

import requests
headers = {'user-agent': 'abc'}
_api_token = 'api key'
 r1 = requests.get('website',workspace_id=xyz&since=2017-01-01&until=2017-12-31&user_agent=abc,auth= 
 (_api_token, 'api_token'),headers=headers)

r2 = requests.get('website',workspace_id=xyz&since=2018-01-01&until=2018-12-31&user_agent=abc,auth= 
 (_api_token, 'api_token'),headers=headers)

r3 = requests.get('website',workspace_id=xyz&since=2019-01-01&until=2019-12-31&user_agent=abc,auth= 
 (_api_token, 'api_token'),headers=headers)

r4 = requests.get('website',workspace_id=xyz&since=2020-01-01&until=2020-05-05&user_agent=abc,auth= 
 (_api_token, 'api_token'),headers=headers)

     x1 = r1.json()
     x2 = r2.json()
     x3 = r3.json()
     x4 = r4.json()
     x1.keys()
     import pandas as pd
     df1 = pd.DataFrame(x1['data'])
     df2 = pd.DataFrame(x2['data'])
     df3 = pd.DataFrame(x3['data'])
     df4 = pd.DataFrame(x4['data'])

Прикрепить python Изображение

1 Ответ

0 голосов
/ 05 мая 2020

Это скорее вопрос проверки / улучшения кода, как я указал в вопросах. Так что я, вероятно, задам такие вопросы там в будущем.

Однако, поскольку я вижу, что они время от времени возникают, я решил, что поделюсь тем, как вам (вероятно) следует думать в таких ситуациях. Итак, первое, что вам нужно сделать, это использовать свои человеческие сверхспособности для поиска закономерностей. Мы, люди (пока) неплохо умеем замечать закономерности в больших коллекциях данных. В вашем случае очевидные из них:

enter image description here

(я преобразовал ваш псевдокод в нечто более реалистичное c, опять же, опубликуйте свой реальный код и замаскируйте только важные вещи.Например, поля запроса GET не должны быть замаскированы там, где должен быть ключ / токен. Я пропустил исправление ваших шаблонов даты, которые не работали, поскольку они лучше выделялись цветом таким образом, чтобы выделить шаблон видел).

Вот минимальный рабочий пример:

import requests
import pandas as pd

headers = {'user-agent': 'abc'}
_api_token = 'api key'

r1 = requests.get('http://url/json.php',
                    params={"workspace_id" : "xyz", "since" : "2017-01-01", "until" : "2017-12-31"},
                    auth= (_api_token, 'api_token'),
                    headers=headers)

r2 = requests.get('http://url/json.php',
                    params={"workspace_id" : "xyz", "since" : "2018-01-01", "until" : "2018-12-31"}, 
                    auth= (_api_token, 'api_token'),
                    headers=headers)

r3 = requests.get('http://url/json.php',
                    params={"workspace_id" : "xyz", "since" : "2019-01-01", "until" : "2019-12-31"},
                    auth=(_api_token, 'api_token'),
                    headers=headers)

r4 = requests.get('http://url/json.php',
                    params={"workspace_id" : "xyz", "since" : "2020-01-01", "until" : "2020-05-05"},
                    auth= (_api_token, 'api_token'),
                    headers=headers)

x1 = r1.json()
x2 = r2.json()
x3 = r3.json()
x4 = r4.json()

df1 = pd.DataFrame(x1['data'])
df2 = pd.DataFrame(x2['data'])
df3 = pd.DataFrame(x3['data'])
df4 = pd.DataFrame(x4['data'])

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

Итак, первый шаблон можно сократить до:

def get_data(since, until):
    return = requests.get('http://url/json.php',
                    params={"workspace_id" : "xyz", "since" : since, "until" : until},
                    auth= (_api_token, 'api_token'),
                    headers=headers)

dates = [
    {"since" : "2017-01-01", "until" : "2017-12-31"},
    {"since" : "2018-01-01", "until" : "2018-12-31"},
    {"since" : "2019-01-01", "until" : "2019-12-31"},
    {"since" : "2020-01-01", "until" : "2020-05-05"}
]

for date_pair_dict in dates:
    r = get_data(**date_pair_dict) # We can use dictionary->parameter expansion this way
                                   # which equals doing get_data(since=date_pair_dict['since'], ...)

Это сокращение не очень велико, но оно уже решает / подсказывает, что мы будем делать дальше.
Это значит включить шаблоны 2 и 3 в этот новый синтаксис и использовать тот факт, что мы уже перебираем since и until, и там можно работать с данными вместо того, чтобы сохранять их, а затем работать с ними.

Это будет сводиться к:

import requests
import pandas as pd

headers = {'user-agent': 'abc'}
_api_token = 'api key'

def get_data(since, until):
    return = requests.get('http://url/json.php',
                    params={"workspace_id" : "xyz", "since" : since, "until" : until},
                    auth= (_api_token, 'api_token'),
                    headers=headers)

dates = [
    {"since" : "2017-01-01", "until" : "2017-12-31"},
    {"since" : "2018-01-01", "until" : "2018-12-31"},
    {"since" : "2019-01-01", "until" : "2019-12-31"},
    {"since" : "2020-01-01", "until" : "2020-05-05"}
]

for date_pair_dict in dates:
    r = get_data(**date_pair_dict) # We can use dictionary->parameter expansion this way
                                   # which equals doing get_data(since=date_pair_dict['since'], ...)

    x = r.json()
    df = pd.DataFrame(x['data'])

Теперь, потому что это только частичное код, который вы указали.
Мы понятия не имеем, для чего вы на самом деле используете эти фреймы данных в pandas. Но вы можете поместить df = pd.DataFrame(...) в свою get_data функцию, а затем сохранить и работать над ними позже.

Но это, надеюсь, даст вам представление о том, как создавать повторно используемый код и как бороться с ними. с шаблонами в коде и, возможно, написать код, который можно использовать повторно, а не копировать.


Заключительное примечание

Пожалуйста, опубликуйте рабочий код в будущем, мы потратим много времени помогать людям. Последнее, что нам нужно сделать, это помочь людям создать рабочий пример проблемы, чтобы затем мы могли помочь людям с их реальной проблемой. Мы работаем бесплатно и хотим помочь, упростите нам помощь :)

Удачи в вашем проекте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...