Как построить график на основе данных из html-таблицы со сложной структурой?
Есть таблица
import pandas as pd
dfs = pd.read_html('https://en.wikipedia.org/wiki/Template:COVID-19_pandemic_data/Russia_medical_cases')
Надо получить выборку столбцов 'Date.Date.1' и 'Confirmed.New'.

Выборку получаю так:
data = dfs[0].loc[:99, pd.IndexSlice[["Confirmed", "Date"], ["Date", "New"]]]
Надо вывести Date на ось X, а значения New на ось Y.
Пытаюсь вывести данные следующим образом:
import matplotlib.pyplot as plt
data.plot.line()
Но получаю ошибку.
Подскажите, пожалуйста, как построить график?
Ответы (1 шт):
Автор решения: strawdog
→ Ссылка
Например, так:
import pandas as pd
import matplotlib.pyplot as plt
dfs = pd.read_html('https://en.wikipedia.org/wiki/Template:COVID-19_pandemic_data/Russia_medical_cases')
data = dfs[0].loc[:99, pd.IndexSlice[["Confirmed", "Date"], ["Date", "New"]]]
plt.figure(figsize=(10,10))
X = pd.to_datetime(data["Date"]["Date"]+' 2020')
Y = pd.to_numeric(data["Confirmed"]["New"], errors="coerce").fillna(0)
plt.figure(figsize=(10,10))
plt.plot(X, Y)
Вам, однако, надо решить, что делать с отсутствующими данными в столбце New - я пока заменил их на 0. Кроме того, по оси x временная шкала у вас довольно условная, поскольку даты у вас заданы весьма дискретно.
UPDATE
После уточнений автора вопроса, предлагаю сделать так:
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
dfs = pd.read_html('https://en.wikipedia.org/wiki/Template:COVID-19_pandemic_data/Russia_medical_cases')
data = dfs[0].loc[:99, pd.IndexSlice[["Confirmed", "Date"], ["Date", "New"]]]
data.columns = data.columns.droplevel()
data["Date"] = pd.to_datetime(data["Date"]+' 2020')
data["New"] = pd.to_numeric(data["New"], errors="coerce")
data.set_index("Date", inplace=True)
idx = pd.date_range(start = data.index.min(), end = data.index.max(), freq="D")
data = data.reindex(idx)
fig = plt.figure(figsize=(15,10))
ax = fig.add_subplot(111)
ax.xaxis.set_major_locator(mdates.DayLocator(interval=10))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))
ax.scatter(data.index, data["New"])
ax.plot(data.index, data["New"])
ax.grid(True)
plt.xticks(rotation=45)
plt.show()

