|
13 | 13 | from importlib import import_module |
14 | 14 | from itertools import chain, repeat |
15 | 15 | from math import isnan |
16 | | -from numbers import Number |
| 16 | + |
17 | 17 | from os import path, remove |
18 | 18 | from tempfile import NamedTemporaryFile |
19 | 19 | from urllib.parse import urlparse, urlsplit, urlunsplit, unquote as urlunquote |
@@ -805,15 +805,28 @@ def write_data(cls, write, data): |
805 | 805 | data.domain.attributes, |
806 | 806 | data.domain.class_vars, |
807 | 807 | data.domain.metas)) |
| 808 | + |
| 809 | + def formatter(var): |
| 810 | + # type: (Variable) -> Callable[[Variable], Any] |
| 811 | + # Return a column 'formatter' function. The function must return |
| 812 | + # something that `write` knows how to write |
| 813 | + if var.is_time: |
| 814 | + return var.repr_val |
| 815 | + elif var.is_continuous: |
| 816 | + return lambda value: "" if isnan(value) else value |
| 817 | + elif var.is_discrete: |
| 818 | + return lambda value: "" if isnan(value) else var.values[int(value)] |
| 819 | + elif var.is_string: |
| 820 | + return lambda value: value |
| 821 | + else: |
| 822 | + return var.repr_val |
| 823 | + |
| 824 | + formatters = [formatter(v) for v in vars] |
808 | 825 | for row in zip(data.W if data.W.ndim > 1 else data.W[:, np.newaxis], |
809 | 826 | data.X, |
810 | 827 | data.Y if data.Y.ndim > 1 else data.Y[:, np.newaxis], |
811 | 828 | data.metas): |
812 | | - write(['' if isinstance(val, Number) and isnan(val) else |
813 | | - var.values[int(val)] if var.is_discrete else |
814 | | - var.repr_val(val) if isinstance(var, TimeVariable) else |
815 | | - val |
816 | | - for var, val in zip(vars, flatten(row))]) |
| 829 | + write([fmt(v) for fmt, v in zip(formatters, flatten(row))]) |
817 | 830 |
|
818 | 831 | @classmethod |
819 | 832 | def qualified_name(cls): |
|
0 commit comments