2017-01-12 11 views
1

私は、APIへのリクエストを作っています。そして、バッチ処理でエンコードの問題が発生していますか?

def get_data(text, url='api.com'): 
    r = requests.get(url, 
        params={'key': '<My KEY>', 
          'hj': text 
          'oi': 'm'}) 

    json_data = json.dumps(r.json()) 
    data = yaml.load(json_data)     
    return data 

私のデータは、パンダのデータフレームであることから、次のように私は関数を適用しています。そして、

data 
0 The quick fox jumps over the lazy 
1 The quick fox over the lazy dog 
2 The quick brown fox jumps over the lazy dog 
.... 

n The brown fox jumps over the dog 

df['col'] = df[['data']].apply(get_data, axis=1) 

リクエストで送受信しているデータのサイズがかなり大きいので、上記のリクエストをチャンクで作るにはどうすればいいですか?4 by 4?:

for chunk in r.iter_content(chunk_size=5): 
     json_data = json.dumps(r.json()) 
     data = yaml.load(json_data) 
     return data 

しかし、それはうまくいきませんでしたが、チャンクで分割したり、分割して分割したり、すべて連結したりすることができますか?しかし

----> 7  df = pd.concat(g.data.apply(get_data) for _, g in df2.groupby(np.arange(len(df2))//4)) 
     8 df 

/usr/local/lib/python3.5/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds) 
    2290    else: 
    2291     values = self.asobject 
-> 2292     mapped = lib.map_infer(values, f, convert=convert_dtype) 
    2293 
    2294   if len(mapped) and isinstance(mapped[0], Series): 

pandas/src/inference.pyx in pandas.lib.map_infer (pandas/lib.c:63307)() 

<ipython-input-28-329dbdbb7cdb> in get_data(data) 
    62 
    63  r = requests.get('http://api.example.com/api', params=payload, stream = True) 
---> 64  json_data = json.dumps(r.json()) 
    65  data = yaml.load(json_data) 
    66 

/usr/local/lib/python3.5/site-packages/requests/models.py in json(self, **kwargs) 
    848      # used. 
    849      pass 
--> 850   return complexjson.loads(self.text, **kwargs) 
    851 
    852  @property 

/usr/local/lib/python3.5/site-packages/simplejson/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, use_decimal, **kw) 
    514    parse_constant is None and object_pairs_hook is None 
    515    and not use_decimal and not kw): 
--> 516   return _default_decoder.decode(s) 
    517  if cls is None: 
    518   cls = JSONDecoder 

/usr/local/lib/python3.5/site-packages/simplejson/decoder.py in decode(self, s, _w, _PY3) 
    368   if _PY3 and isinstance(s, binary_type): 
    369    s = s.decode(self.encoding) 
--> 370   obj, end = self.raw_decode(s) 
    371   end = _w(s, end).end() 
    372   if end != len(s): 

/usr/local/lib/python3.5/site-packages/simplejson/decoder.py in raw_decode(self, s, idx, _w, _PY3) 
    398    elif ord0 == 0xef and s[idx:idx + 3] == '\xef\xbb\xbf': 
    399     idx += 3 
--> 400   return self.scan_once(s, idx=_w(s, idx).end()) 

JSONDecodeError: Expecting value: line 1 column 1 (char 0) 

:うち

df.groupby(np.arange(len(df))//10) 
for k,g in df.groupby(np.arange(len(df))//10): 
    [g.data.apply(get_data) for _, g in df.groupby(np.arange(len(df))//10)] 

で:私もチャンクでデータフレームを分割しようとした、それだけでdoesntの仕上がり

UPDATE

私はすべてを一緒につなぐことを理解していないチャンクで分割した後

+0

おそらく 'df.data'をチャンクに分割することはできますか? – Psidom

+0

@Psidom、私はより詳細な私の質問を更新しました..私は実際にそれを試みた! –

+0

更新のために、gは新しいデータフレームになりますが、より小さなサイズの 'g.data.apply(get_data)'がチャンクの1つになります。 – Psidom

答えて

1

あなたがgここで、受信したファイルを保存するために、リスト内包表記を行うことができますが、元のデータフレームが、小さいサイズと同じになります:

あなたが本当に探しているものを
[g.data.apply(get_data) for _, g in df.groupby(np.arange(len(df))//10)] 

それとも、あなたはdata直列に各テキストの応答を持つようにしたい場合:df[["data"]]はデータフレーム、Sを返すこと

df.data.apply(get_data) 

注意o df[["data"]].apply(get_data, axis = 1)は、列全体をget_data関数に渡します。

+0

私は後者を試して、それは決して終わった! –

+0

'get_data(df.data.iloc [1])'はまもなく終了しますか?これは1つのテキストフィールドのみを渡し、応答を取得しようとします。 – Psidom

+0

更新されました! –

関連する問題