Python pandas и сюжетно. Возникли проблемы с датами и отображением - PullRequest
0 голосов
/ 04 марта 2020

Извините, я новичок в заговоре.
У меня есть четкий pd.DataFrame с датами в порядке.

Начальная дата имеет следующий формат: ГГГГММДД.
Когда я пытался преобразовать ее, в графическом виде дата отображалась бы как то, что я могу описать только как случайные числа (в тексте при наведении). После долгих поисков я нашел мой обходной путь (см. Код) как единственное решение.

Но к реальной проблеме: Как видите, каждый месяц имеет разное количество записей. Когда я опускаю день, графически помещает все записи месяца в одно и то же место.
Когда я использую x = df.index, я получаю лучший результат, но у меня нет визуализации даты. Я хотел бы, чтобы между каждой записью были четные промежутки и чтобы была четкая визуальная подсказка, показывающая, какой записи принадлежит какой месяц.
Я добавлю изображение в конец поста, чтобы лучше объяснить мои проблемы (engli sh не мой родной язык ..)

Код:

import pandas as pd
import plotly.express as px

columns = ["date", "farts"]
df = pd.read_csv('test.csv', sep=',', engine='python', names=columns)

# Using a smaller made up csv file for testing. It looks like this:
# 20200119, 50
# 20200115, 40
# 20200105, 30
# 20191215, 40
# 20191120, 35
# 20191115, 12

print(df)

df["date"] = pd.to_datetime(df["date"], format="%Y%m%d")

df["date"] = df["date"].dt.strftime('%Y-%m')

print(df)

#works very well so far:

# before:

#        date  farts
# 0  20200119     50
# 1  20200115     40
# 2  20200105     30
# 3  20191215     40
# 4  20191120     35
# 5  20191115     12

# after:

#       date  farts
# 0  2020/01     50
# 1  2020/01     40
# 2  2020/01     30
# 3  2019/12     40
# 4  2019/11     35
# 5  2019/11     12

fig = px.bar(df, x="date", y='farts', width=1000, height=350)
fig.show()

У вас есть какие-нибудь идеи, что я могу сделать, чтобы получить более привлекательный график?

картинка, чтобы помочь понять: https://i.imgur.com/3Vi9xFi.png

Редактировать: Попробовал немного вокруг, и я становлюсь все более и более разочарованным. Либо не отображается, дата меняется на противоположную, и т.д. place.
Если я go с df.index, я не могу назвать записи по оси x в соответствии со столбцом даты.

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

IIU C Вы можете просто построить и затем обновить макет для имени xtick.

import pandas as pd
import plotly.graph_objs as go
import plotly.express as px

from io import StringIO

df = """date,farts
20200119, 50
20200115, 40
20200105, 30
20191215, 40
20191120, 35
20191115, 12"""

df = pd.read_csv(StringIO(df))

df["date"] = pd.to_datetime(df["date"], format="%Y%m%d")\
               .dt.strftime('%Y-%m')
df = df.sort_values("date").reset_index(drop=True)

plotly.graph_objs

fig =  go.Figure()
fig.add_trace(go.Bar(x=df.index,y=df["farts"]))
fig.update_layout(
    xaxis = dict(
        tickmode = 'array',
        tickvals = df.index,
        ticktext = df["date"]
    )
)
fig.show()

plotly.express

px.bar(df,x=df.index,y="farts")
fig.update_layout(
    xaxis = dict(
        tickmode = 'array',
        tickvals = df.index,
        ticktext = df["date"]
    )
)

Выход такой же enter image description here

0 голосов
/ 04 марта 2020

У вас есть 2 варианта в зависимости от того, что вы хотите

Сначала давайте создадим данные для примера:

data = [
    ["20200119", 50],
    ["20200115", 40],
    ["20200105", 30],
    ["20191215", 40],
    ["20191120", 35],
    ["20191115", 12],
]

1. Отобразить в виде категорий

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

df = pd.DataFrame(data, columns=["date", "farts"])
df["date"] = "D" + df["date"] # Add a string so that plotly won't transform to date

fig = px.bar(df, x="date", y='farts')

2. Ежемесячная повторная выборка

Если вы хотите построить месячную дату, вам следует избегать дубликатов. Для этого вы можете выполнить повторную выборку и сделать mean или sum всех записей каждого месяца:

df = pd.DataFrame(data, columns=["date", "farts"])
df["date"] = pd.to_datetime(df["date"], format="%Y%m%d")
df = df.resample('MS', on='date').mean() # You should not have duplicates
df = df.reset_index() # You need date as a column with plotly express

fig = px.bar(df, x="date", y='farts')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...