Я сохраняю таблицу 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».
@terrylynch Я новичок в QPython, как вы думаете, вы могли бы указать мне правильное направление, чтобы сделать это, или дайте мне знать, как - я, естественно, просто использую панд, где могу, из-за знакомства
Вы можете найти решение для панд здесь: stackoverflow.com/questions/53884308/…
Спасибо Рахул, это тоже было полезно
Я бы ожидал, что строки в 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))
Первое предложение работает отлично. Большое спасибо. Итак, я предполагаю, что мне придется создать цикл, чтобы применить это к каждому столбцу?
Да, приятель, для всех колонок, у которых есть эта проблема. Чтобы взять молоток, вы можете просто применить лямбда ко всему кадру данных вдоль оси столбца, что-то вроде строк df.apply(lambda s: s.decode('utf-8'), axis=1)
Это то, что я пытался сделать, однако выдает ошибку: AttributeError: ("Объект "Серия" не имеет атрибута "декодировать"", "произошло по индексу 0"). Любые мысли?
Некоторые столбцы уже расшифрованы. Попробуйте цикл for с попыткой, кроме catch, с исключением того, что возвращает исходную серию.
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. Было бы намного проще!
Может быть глупый вопрос, но почему бы не писать напрямую в csv из kdb? Зачем делать это через фреймворк данных?