График после округления столбца данных не работает - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь прочитать значения, разделенные пробелами, применить фильтр Савицкого-Голея к одному из столбцов, округлить столбец до 6 десятичных цифр, построить график и экспортировать данные в новый файл. Вот рабочий код, где я закомментировал строку, которая делает окно графика «Не отвечающим»:

import pandas as pd
from datetime import datetime
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import savgol_filter

df = pd.read_csv('data.txt', delim_whitespace = True)

plt.plot(df.index, df.rotram, '-', lw=4)
#plt.plot(df.index, savgol_filter(df.rotram, 21, 3), 'r-', lw=2)

# smooth the 'rotram' column using Savitzky-Golay filter
df.rotram = savgol_filter(df.rotram, 21, 3)

# round to 6 decimal digits
#df.rotram = df.rotram.map('{:.6f}'.format)         # <-- not responding when plotting
#df["rotram"] = df["rotram"].map('{:,.6f}'.format)  # the same as above (not responding when plotting)

# When plot is removed then above rounding works well
plt.plot(df.index, df.rotram, 'r-', lw=2)

df.to_csv('filtered.txt', sep='\t')

plt.show()

print "End"

Пример данных выглядит так:

otklon       rotram      lakat           rotnad
-6.240000    -3.317000   -34.445000      16.805000 
-6.633000    -3.501000   -34.519000      17.192000 
-5.099000    -2.742000   -34.456000      15.059000 
-6.148000    -3.396000   -34.281000      17.277000 
-4.797000    -3.032000   -34.851000      16.052000 
-5.446000    -2.964000   -34.459000      15.677000 
-6.341000    -3.490000   -34.934000      17.300000 
-6.508000    -3.465000   -35.030000      16.722000 
-6.513000    -3.505000   -35.018000      16.845000 
-6.455000    -3.501000   -35.302000      16.896000
.
.
.
(more than 20000 lines)

Разделитель во входном файле: space + TAB + space.

Если я раскомментирую строку df.rotram = df.rotram.map('{:.6f}'.format), программа зависает (не отвечает) с пустым графиком , хотя сохраненные данные верны .

Если я затем удалю строку plt.plot(df.index, df.rotram, 'r-', lw=2), тогда программа завершится нормально.

Несмотря на то, что сохранение данных в файл после округления работает хорошо, построение графиков не работает: - /

1 Ответ

0 голосов
/ 11 ноября 2018

Если вы хотите округлить столбец до десятого знака после запятой, используйте pd.Series.round или np.around:

df.rotram = df.rotram.round(decimals=6)
# Or,
# df.rotram = np.around(df.rotram, decimals=6)

Однако мне все равно хотелось бы знать, почему приведенный выше код не работает как ожидается.

Когда вы вызываете map, вы преобразуете числовой столбец в строку. Панды будут строить эти данные без каких-либо предположений. Для ваших образцов данных график выглядит отвратительно:

enter image description here

По сравнению с последним случаем используется round:

enter image description here

Графики совершенно разные (в первом случае каждая строка сортировалась лексикографически и имела свой тик по оси Y).

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