Страницы

Поиск по вопросам

Показаны сообщения с ярлыком jupyter-notebook. Показать все сообщения
Показаны сообщения с ярлыком jupyter-notebook. Показать все сообщения

суббота, 11 января 2020 г.

Pandas: добавляется лишняя ячейка при назначении индексного столбца

#python #pandas #dataframe #jupyter_notebook


В датасете уже есть индексная колонка. Фрагмент файла:

Index,Height,Weight
1,65.78331,112.9925
2,71.51521,136.4873
3,69.39874,153.0269
4,68.2166,142.3354
5,67.78781,144.2971


Ни одного лишнего символа.

Когда я пытаюсь сделать первую колонку индексной

data = pandas.read_csv('0030_dataset_weights_heights.csv', index_col="Index")
data


То при выводе таблицы почему-то добавляется лишняя ячейка сверху, из-за этого происходит
смещение



Если не назначать индексную колонку, то pandas ожидаемо назначит ее сам, при этом
по строкам все будет отображаться нормально без смещений

data = pandas.read_csv('0030_dataset_weights_heights.csv')
data




Как мне правильно назначить индексную колонку? Спасибо!
    


Ответы

Ответ 1



Это просто имя индекса - не обращайте на него внимания. При желании от него можно избавиться: In [13]: df Out[13]: Height Weight Index 1 65.78331 112.9925 2 71.51521 136.4873 3 69.39874 153.0269 4 68.21660 142.3354 5 67.78781 144.2971 In [14]: df.index.name Out[14]: 'Index' In [15]: df = df.rename_axis(None) In [16]: df Out[16]: Height Weight 1 65.78331 112.9925 2 71.51521 136.4873 3 69.39874 153.0269 4 68.21660 142.3354 5 67.78781 144.2971 In [17]: df.index.name UPDATE: не делайте так: In [20]: df = df.rename_axis('Index', axis=1) In [21]: df Out[21]: Index Height Weight 1 65.78331 112.9925 2 71.51521 136.4873 3 69.39874 153.0269 4 68.21660 142.3354 5 67.78781 144.2971 In [22]: df.columns.name # <--- NOTE: we've named column's axis as "Index"! Out[22]: 'Index'

воскресенье, 29 декабря 2019 г.

Python (jupyter) анимированный график

#python #matplotlib #jupyter_notebook


Подскажите есть ли возможность в jupyter рисовать анимированные графики, вроде графика
загрузки процессора в реальном времени? Пытаюсь сделать мониторинг времени ответа сервера
на пинг.
Разбираюсь с matplotlib, но то ли он такого не умеет, то ли я не нашел. 

import subprocess
import re
from matplotlib import pyplot as plt

def ping(adress):
    p = subprocess.Popen(["ping.exe",adress], stdout = subprocess.PIPE)
    out = p.communicate()[0]
    t = re.search(r'time=(\d*)',str(out))
    time = t.group().replace('time=','') if t else '0'
    return (time)

x=[0]

%matplotlib inline

for i in range(0,10):
    x.append(ping('ya.ru'))
    plt.plot(x)


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


Ответы

Ответ 1



Можно так сделать: import psutil from datetime import datetime as dt from collections import deque import matplotlib.pyplot as plt from matplotlib.dates import date2num import matplotlib.animation as animation %matplotlib notebook N=600 x = deque([date2num(dt.now())], maxlen=N) y = deque([0], maxlen=N) fig, ax = plt.subplots(figsize=(8,3)) line, = ax.plot_date(x, y, marker="") ax.spines['left'].set_visible(False) ax.spines['bottom'].set_visible(False) ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) def get_data(): # return ping('ya.ru') return psutil.cpu_percent(.15) def animate(i): x.append(date2num(dt.now())) y.append(get_data()) ax.relim(visible_only=True) ax.autoscale_view(True) line.set_data(x, y) ax.fill_between(x, -0.5, y, color='lightgrey') return line, ani = animation.FuncAnimation(fig, animate, interval=300) #ani.save("d:/temp/test.gif", writer='imagemagick', fps=10) plt.show() Результат:

Ответ 2



в jupyter рисовать анимированные графики, вроде графика загрузки процессора в реальном времени? Рисуем фон и оси графика: %matplotlib inline import matplotlib.pyplot as plt fig, ax = plt.subplots() line, = ax.plot([], [], color='g') time_template = 'time = %s' time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes) Создаём функцию, которая генерирует текущие значения (x, y): import time import psutil # !pip install psutil def frames(): while True: yield time.time(), psutil.cpu_percent(.15) # CPU % over the second обновляем график и экран, используя значения полученные из frames(): import datetime as DT from collections import deque n = 1000 yy = deque([], maxlen=n) xx = deque([], maxlen=n) display_handle = display(None, display_id=True) def animate(args): xx.append(args[0]) yy.append(args[1]) line.set_data(xx, yy) time_text.set_text(time_template % DT.datetime.fromtimestamp(args[0])) ax.relim() # update axes limits ax.autoscale_view(True, True, True) display_handle.update(fig) for x_y in frames(): animate(x_y) Если вам не нужна поддержка Jupyter Lab или достаточно конечный цикл, который как видео можно добавить, то вместо явного display_handler.update() и явного цикла, где вручную animate() вызывается, можно использовать: %matplotlib notebook from matplotlib import animation ani = animation.FuncAnimation(fig, animate, frames=frames) и/или (конечное число кадров): from IPython.display import HTML HTML(ani.to_html5_video())

пятница, 27 декабря 2019 г.

Работа с пулом процессов приводит к зависанию в Jupyter Notebook

#python #python_3x #jupyter_notebook


Подскажите, как реализовать многопоточность в Jupyter Notebook. Например, я хочу
обработать некоторые данные, и записать результат в массив или в файл.

Делаю например так: 

def test_this(elem, test_list):
    test_list.append(elem)

procs = []
test_list = []
for elem in ["one", "two", "tree"]:
    proc = Process(target=test_this, args=(elem,test_list))
    procs.append(proc)
    proc.start()

for proc in procs:
    proc.join()


test_list получается пустой

делаю вот так: 

with Pool(20) as p:
    p.map(test_this, ["one", "two", "tree"])


ячейка зависает навечно.

Что я делаю не так?
    


Ответы

Ответ 1



Чтобы обойти известные проблемы с multiprocessing.Pool в интерактивном случае (таком как работа в jupyter notebook), можно использовать multiprocess модуль: #!/usr/bin/env python3 # from multiprocessing import Pool, set_start_method # hangs on Windows and/or with spawn, forkserver methods from multiprocess import Pool, set_start_method #! pip install multiprocess def double(s): return s*2 if __name__ == "__main__": # set_start_method('fork') # works # set_start_method('spawn') # XXX hangs with stdlib multiprocessing # set_start_method('forkserver') #XXX hangs with stdlib multiprocessing with Pool() as pool: print(*pool.map(double, ["one", "two", "tree"])) Чтобы заработал пример с stdlib multiprocessing, необходимо double функцию сделать pickable, к примеру, поместив её в отдельный модуль (см. Jupyter notebook never finishes processing using multiprocessing (Python 3)): #!/usr/bin/env python3 from multiprocessing import Pool, set_start_method from mp_functions import double if __name__ == "__main__": with Pool() as pool: print(*pool.map(double, ["one", "two", "tree"])) Первый пример с multiprocess вероятно работает так как он использует dill вместо pickle для сериализации.

пятница, 1 марта 2019 г.

Pandas: добавляется лишняя ячейка при назначении индексного столбца

В датасете уже есть индексная колонка. Фрагмент файла:
Index,Height,Weight 1,65.78331,112.9925 2,71.51521,136.4873 3,69.39874,153.0269 4,68.2166,142.3354 5,67.78781,144.2971
Ни одного лишнего символа.
Когда я пытаюсь сделать первую колонку индексной
data = pandas.read_csv('0030_dataset_weights_heights.csv', index_col="Index") data
То при выводе таблицы почему-то добавляется лишняя ячейка сверху, из-за этого происходит смещение

Если не назначать индексную колонку, то pandas ожидаемо назначит ее сам, при этом по строкам все будет отображаться нормально без смещений
data = pandas.read_csv('0030_dataset_weights_heights.csv') data

Как мне правильно назначить индексную колонку? Спасибо!


Ответ

Это просто имя индекса - не обращайте на него внимания.
При желании от него можно избавиться:
In [13]: df Out[13]: Height Weight Index 1 65.78331 112.9925 2 71.51521 136.4873 3 69.39874 153.0269 4 68.21660 142.3354 5 67.78781 144.2971
In [14]: df.index.name Out[14]: 'Index'
In [15]: df = df.rename_axis(None)
In [16]: df Out[16]: Height Weight 1 65.78331 112.9925 2 71.51521 136.4873 3 69.39874 153.0269 4 68.21660 142.3354 5 67.78781 144.2971
In [17]: df.index.name

UPDATE: не делайте так:
In [20]: df = df.rename_axis('Index', axis=1)
In [21]: df Out[21]: Index Height Weight 1 65.78331 112.9925 2 71.51521 136.4873 3 69.39874 153.0269 4 68.21660 142.3354 5 67.78781 144.2971
In [22]: df.columns.name # <--- NOTE: we've named column's axis as "Index"! Out[22]: 'Index'

среда, 12 декабря 2018 г.

Python (jupyter) анимированный график

Подскажите есть ли возможность в jupyter рисовать анимированные графики, вроде графика загрузки процессора в реальном времени? Пытаюсь сделать мониторинг времени ответа сервера на пинг. Разбираюсь с matplotlib, но то ли он такого не умеет, то ли я не нашел.
import subprocess import re from matplotlib import pyplot as plt
def ping(adress): p = subprocess.Popen(["ping.exe",adress], stdout = subprocess.PIPE) out = p.communicate()[0] t = re.search(r'time=(\d*)',str(out)) time = t.group().replace('time=','') if t else '0' return (time)
x=[0]
%matplotlib inline
for i in range(0,10): x.append(ping('ya.ru')) plt.plot(x)
График просчитывается весь и отрисовывается весь сразу, подскажите как сделать анимацию и возможно ли вообще такое?


Ответ

Можно так сделать:
import psutil from datetime import datetime as dt from collections import deque import matplotlib.pyplot as plt from matplotlib.dates import date2num import matplotlib.animation as animation
%matplotlib notebook
N=600 x = deque([date2num(dt.now())], maxlen=N) y = deque([0], maxlen=N)
fig, ax = plt.subplots(figsize=(8,3)) line, = ax.plot_date(x, y, marker="")
ax.spines['left'].set_visible(False) ax.spines['bottom'].set_visible(False) ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False)
def get_data(): # return ping('ya.ru') return psutil.cpu_percent(.15)
def animate(i): x.append(date2num(dt.now())) y.append(get_data()) ax.relim(visible_only=True) ax.autoscale_view(True) line.set_data(x, y) ax.fill_between(x, -0.5, y, color='lightgrey') return line,
ani = animation.FuncAnimation(fig, animate, interval=300) #ani.save("d:/temp/test.gif", writer='imagemagick', fps=10) plt.show()
Результат: