|
1 | 1 | # coding: utf-8
|
2 | 2 | import logging
|
3 | 3 | import os
|
| 4 | +import re |
4 | 5 | from collections import defaultdict
|
5 | 6 | from datetime import timedelta
|
6 | 7 | from enum import Enum
|
| 8 | +from functools import reduce |
| 9 | +from itertools import chain |
7 | 10 | from random import random
|
8 | 11 | from time import sleep
|
9 | 12 | from typing import Union, List, Any
|
@@ -307,6 +310,20 @@ def _itertuples(self, data_frame):
|
307 | 310 | cols = [data_frame.iloc[:, k] for k in range(len(data_frame.columns))]
|
308 | 311 | return zip(data_frame.index, *cols)
|
309 | 312 |
|
| 313 | + def _replace(self, data_frame): |
| 314 | + from ..extras import np |
| 315 | + obj_cols = {k for k, v in dict(data_frame.dtypes).items() if v is np.dtype('O')} |
| 316 | + other_cols = set(data_frame.columns) - obj_cols |
| 317 | + obj_nans = (f'{k}="nan"' for k in obj_cols) |
| 318 | + other_nans = (f'{k}=nani?' for k in other_cols) |
| 319 | + replacements = [ |
| 320 | + ('|'.join(chain(obj_nans, other_nans)), ''), |
| 321 | + (',{2,}', ','), |
| 322 | + ('|'.join([', ,', ', ', ' ,']), ' '), |
| 323 | + ] |
| 324 | + |
| 325 | + return replacements |
| 326 | + |
310 | 327 | def _data_frame_to_list_of_points(self, data_frame, precision, **kwargs):
|
311 | 328 | from ..extras import pd, np
|
312 | 329 | if not isinstance(data_frame, pd.DataFrame):
|
@@ -352,7 +369,16 @@ def _data_frame_to_list_of_points(self, data_frame, precision, **kwargs):
|
352 | 369 | ' ', ','.join(fields), ' {p[0].value}')
|
353 | 370 | f = eval("lambda p: f'{}'".format(''.join(fmt)))
|
354 | 371 |
|
355 |
| - return list(map(f, self._itertuples(data_frame))) |
| 372 | + isnull = data_frame.isnull().any(axis=1) |
| 373 | + |
| 374 | + if isnull.any(): |
| 375 | + lp = map(f, self._itertuples(data_frame[~isnull])) |
| 376 | + rep = self._replace(data_frame) |
| 377 | + lp_nan = (reduce(lambda a, b: re.sub(*b, a), rep, f(p)) |
| 378 | + for p in self._itertuples(data_frame[isnull])) |
| 379 | + return list(chain(lp, lp_nan)) |
| 380 | + else: |
| 381 | + return list(map(f, self._itertuples(data_frame))) |
356 | 382 |
|
357 | 383 | def _http(self, batch_item: _BatchItem):
|
358 | 384 |
|
|
0 commit comments