pandas или numpy форматирование элементов массива данных - PullRequest
2 голосов
/ 24 апреля 2020

Среды: Python 3.7.6 с библиотеками numpy==1.18.2 и pandas==1.0.3

import numpy as np
import pandas as pd


np.set_printoptions(suppress=True)
pd.set_option('display.float_format', lambda x: '%.2f' % x)
# does not work ?

data = pd.read_csv("test.csv")

"""
# here is test.csv sample data
at,price
1587690840,15.25
1587690900,15.24
1587690960,15.23
---
"""
x = np.asarray(data)
print(x)

"""
# result:

[[1.58769084e+09 1.52500000e+01]
 [1.58769090e+09 1.52400000e+01]
 [1.58769096e+09 1.52300000e+01]]
"""

Я хочу, чтобы 1-й элемент был приведен как int32 без научной нотации c, а 2-й элемент - as float32 %.2f.

Как мне изменить код с результатом x, как показано ниже:

[[1587690840 15.25]
[1587690900 15.24]
[1587690960 15.23]]

Ответы [ 3 ]

0 голосов
/ 24 апреля 2020

Традиционный массив numpy не может хранить несколько типов, если вам нужно иметь несколько типов dtypes, пожалуйста, обратитесь к структурированным массивам

array_f = np.zeros(3, dtype={'names':('integers', 'floats'),
                      'formats':(np.int32, np.float32)})

array_f['integers'] = x[:,0]
array_f['floats'] = x[:,1]

array_f

# array([(1587690840, 15.25), (1587690900, 15.24), (1587690960, 15.23)],
# dtype=[('integers', '<i4'), ('floats', '<f4')])

Но если честно, я думаю pandas более способен в этих ситуациях.

0 голосов
/ 24 апреля 2020

Ваши данные как структурированные dtype:

In [166]: txt = """at,price 
     ...: 1587690840,15.25 
     ...: 1587690900,15.24 
     ...: 1587690960,15.23"""                                                                          
In [167]: data = np.genfromtxt(txt.splitlines(), delimiter=',', names=True, dtype=None, encoding=None) 
In [168]: data                                                                                         
Out[168]: 
array([(1587690840, 15.25), (1587690900, 15.24), (1587690960, 15.23)],
      dtype=[('at', '<i8'), ('price', '<f8')])

Имеет одно поле типа int и одно поле с плавающей точкой.

То же самое, что и число с плавающей точкой

In [170]: data = np.genfromtxt(txt.splitlines(), delimiter=',', skip_header=1, encoding=None)          
In [171]: data                                                                                         
Out[171]: 
array([[1.58769084e+09, 1.52500000e+01],
       [1.58769090e+09, 1.52400000e+01],
       [1.58769096e+09, 1.52300000e+01]])

Я не очень много работал set_printoptions, но похоже, что suppress=True не имеет эффекта с помощью float (1.58e9). Два столбца, отображаемые отдельно:

In [176]: data[:,0]                                                                                    
Out[176]: array([1.58769084e+09, 1.58769090e+09, 1.58769096e+09])
In [177]: data[:,1]                                                                                    
Out[177]: array([15.25, 15.24, 15.23])

и большие числа с плавающей точкой, преобразованные в int:

In [178]: data[:,0].astype(int)                                                                        
Out[178]: array([1587690840, 1587690900, 1587690960])

Что производит pd.read_csv?

In [189]: pd.DataFrame(data, dtype=None)                                                               
Out[189]: 
              0      1
0  1.587691e+09  15.25
1  1.587691e+09  15.24
2  1.587691e+09  15.23

In [190]: pd.DataFrame(Out[168], dtype=None)                                                           
Out[190]: 
           at  price
0  1587690840  15.25
1  1587690900  15.24
2  1587690960  15.23

Преобразование кадр данных обратно в массив:

In [191]: Out[190].to_numpy()                                                                          
Out[191]: 
array([[1.58769084e+09, 1.52500000e+01],
       [1.58769090e+09, 1.52400000e+01],
       [1.58769096e+09, 1.52300000e+01]])

In [193]: Out[190].to_records(index=False)                                                             
Out[193]: 
rec.array([(1587690840, 15.25), (1587690900, 15.24), (1587690960, 15.23)],
          dtype=[('at', '<i8'), ('price', '<f8')])

suppress действительно действует, если самые большие числа меньше:

In [201]: with np.printoptions(suppress=True): 
     ...:     print(data/[100,1]) 
     ...:                                                                                              
[[15876908.4        15.25]
 [15876909.         15.24]
 [15876909.6        15.23]]
0 голосов
/ 24 апреля 2020

Не думаю, что это возможно с опцией formatter метода set_printoptions. Не могли бы вы сделать это после с apply_over_axes?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...