Сохранение таблицы kdb в фрейме данных, а затем сохранение фрейма данных в csv. нулевые и строковые значения выводятся в csv неправильно?

Я сохраняю таблицу kdb в фрейме данных, а затем сохраняю фрейм данных в csv. Однако это работает с файлом csv, и если я печатаю (dataframe); Нулевые значения отображаются как "b" ", а все остальные строковые значения отображаются как " b'STRING' ".

Запуск Python 3.7, pandas 0.24.2 и qpython 2.0.0.

df = pandas.DataFrame(qpython query)
df.to_csv(path_or_buf = "",
          sep = ",", na_rep='',
          float_format=None,
          columns=None,
          header=True, index=False,
          index_label=None, mode='w+', compression=None, quoting=None, quotechar='"',
          line_terminator = "\n", chunksize=50, tupleize_cols=None, date_format=None,
          doublequote=True,
          escapechar=None, decimal='.', encoding='utf-8')

Я ожидал, что таблица KDB будет правильно выводить в csv, при этом нули будут пустым столбцом, а строки просто покажут строку без «b'STRING'».

Любые советы или помощь будут очень признательны. Если кому нужна дополнительная информация, буду рад предоставить.

Пример в csv:

Пустые ячейки отображаются как: b"

Ячейки, содержащие строки, отображаются как: «b'Euro», хотя на самом деле должно отображаться просто «Euro».

Может быть глупый вопрос, но почему бы не писать напрямую в csv из kdb? Зачем делать это через фреймворк данных?

terrylynch 30.07.2019 11:54

@terrylynch Я новичок в QPython, как вы думаете, вы могли бы указать мне правильное направление, чтобы сделать это, или дайте мне знать, как - я, естественно, просто использую панд, где могу, из-за знакомства

breddie forden 30.07.2019 12:06

Вы можете найти решение для панд здесь: stackoverflow.com/questions/53884308/…

Rahul 30.07.2019 12:10

Спасибо Рахул, это тоже было полезно

breddie forden 30.07.2019 12:21
2
4
657
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я бы ожидал, что строки в kdb будут обрабатываться нормально, поскольку QPYTHON должен преобразовывать нулевые строки в нулевые строки python. Однако нулевые символы преобразуются в _QNULL_SYM. В этом случае я думаю, что префикс «b» указывает на байтовый литерал. Вы можете попробовать декодировать байтовые объекты перед сохранением в csv

Обычно в python я бы сделал что-то вроде следующего

df['STRINGCOL'] = df['STRINGCOL'].apply(lambda s: s.decode('utf-8'))

У меня нет большого опыта работы с QPYTHON, но я считаю, что использование qnull() преобразует нулевое значение в питоническое значение.

df['STRINGCOL'] = df['STRINGCOL'].apply(lambda s: qnull(s))

Первое предложение работает отлично. Большое спасибо. Итак, я предполагаю, что мне придется создать цикл, чтобы применить это к каждому столбцу?

breddie forden 30.07.2019 12:19

Да, приятель, для всех колонок, у которых есть эта проблема. Чтобы взять молоток, вы можете просто применить лямбда ко всему кадру данных вдоль оси столбца, что-то вроде строк df.apply(lambda s: s.decode('utf-8'), axis=1)

Callum Biggs 30.07.2019 12:33

Это то, что я пытался сделать, однако выдает ошибку: AttributeError: ("Объект "Серия" не имеет атрибута "декодировать"", "произошло по индексу 0"). Любые мысли?

breddie forden 30.07.2019 13:26

Некоторые столбцы уже расшифрованы. Попробуйте цикл for с попыткой, кроме catch, с исключением того, что возвращает исходную серию.

Callum Biggs 30.07.2019 13:33

qPython имеет некоторые функции для преобразования таблицы kdb в фрейм данных pandas. Я начинаю с создания таблицы в kdb «t», которая имеет 4 столбца, где третий столбец — это столбец символов, а четвертый — столбец символов. Записи в первой строке полностью нулевые.

t:([] a: 0N, til 99; b: 0Nf, 99?1f; c: `, 99?`3; d: " ", 99?" ")
a b         c   d
-----------------

0 0.4123573 iee x
1 0.8397208 app l
2 0.3392927 ncm w
3 0.285506  pjn c

Затем таблицу можно прочитать в Python с помощью QConnection. Если мы преобразуем таблицу в фрейм данных после ее чтения, мы увидим, что символы и символы преобразуются в байты, а нули преобразуются неправильно.

df=pandas.DataFrame(q('t'))
df.head()
                       a           b         c     d
0   -9223372036854775808         NaN       b''  b' '
1                      0    0.412357    b'iee'  b'x'
2                      1    0.839721    b'app'  b'l'
3                      2    0.339293    b'ncm'  b'w'
4                      3    0.285506    b'pjn'  b'c'

Однако, если мы используем аргумент pandas=True с нашим запросом q, тогда большая часть таблицы преобразуется соответствующим образом:

df=q('t', pandas=True)
df.head()
      a        b         c  d
0   NaN      NaN       b''  
1   0.0 0.412357    b'iee'  x
2   1.0 0.839721    b'app'  l
3   2.0 0.339293    b'ncm'  w
4   3.0 0.285506    b'pjn'  c

Однако обратите внимание, что записи, хранящиеся как символы в kdb, не преобразуются должным образом. В этом случае следующий код будет вручную декодировать любые столбцы, указанные в string_cols, из байтов в строки, используя метод, аналогичный тому, который предложил Каллум.

string_cols = ['c']
df[string_cols] = df[string_cols].applymap(lambda s : s.decode('utf-8')) 

дает конечный результат:

df.head()
      a        b      c d
0   NaN      NaN        
1   0.0 0.412357    iee x
2   1.0 0.839721    app l
3   2.0 0.339293    ncm w
4   3.0 0.285506    pjn c

Который можно легко преобразовать в файл csv.

Надеюсь это поможет

Спасибо, Джейми, это было познавательно. Я определенно должен использовать этот метод для начала, а затем использовать функции декодирования Callums. Было бы намного проще!

breddie forden 31.07.2019 15:18

Другие вопросы по теме