боке годишна линейна графика процедура

кой е най-добрият начин за правене на линейни диаграми година след година с ежедневни данни в боке?

в момента добавям дата (произволно за 2016 г.) и колона за година към първоначалната рамка с данни на дневните стойности. След това преминаване към широки данни по години, попълване на NA (липсващите данни варират през годините) и след това изграждане на боке графика ред по ред през колоните за годината:

Да кажем, че имам таблица с данни за три години:

Колона: Дата и стойност

df = df.set_index('Date')

df['dateline'] = df.index.to_series().dt.strftime('%d-%b-2016')
df['year'] = df.index.to_series().dt.strftime('%Y')

pv = pd.pivot_table(df, index=df['dateline'], columns=df.index.year,
                    values='value', aggfunc='sum')

pv.index = pd.to_datetime(pv.index, format = '%d-%b-%Y' )
pv.sort_index(inplace=True)
pv = pv.apply(lambda x: x.fillna(method = 'ffill' , limit = 4))


p.line(x= pv.index , y = pv[2017], line_width=1.5, line_color = "red" ,legend = '2017')
p.line(x= pv.index , y = pv[2016], line_width=1.5, line_color = "blue" ,legend = '2016')
p.line(x= pv.index , y = pv[2015], line_width=1.5, line_color = "green" , legend = '2015')
p.line(x= pv.index , y = pv[2014], line_width=1.5, line_color = "orange" ,legend = '2014')

Въпросът, който имам, е може ли това да бъде допълнително оптимизирано? Бих искал да използвам задържане на мишката в бъдеще, така че каква би била най-добрата настройка? Следващата стъпка ще бъде колона за цикли през годините, но трябва ли да вървя по този път?

Идвайки от R, бих искал да запазя данните в дълъг формат и да направя нещо като:

p.line(df, x='dateline' , y = 'value' , color = 'year')

Благодаря за съветите


person python_analysis    schedule 17.04.2017    source източник


Отговори (1)


Едно решение е да вземете вашите дати и да създадете колона за година и колона за ден от годината, като използвате .dt инструментите за достъп

Уверете се, че df['date'] е колона за дата и час.

df['year'] = df['date'].dt.year
df['dayofyear'] = df['date'].dt.dayofyear

df.head()

            year     value  dayofyear
date                                 
2014-01-31  2014  1.964372         31
2014-02-28  2014  2.386228         59
2014-03-31  2014  2.695743         90
2014-04-30  2014  2.712133        120
2014-05-31  2014  2.033271        150


from bokeh.charts import Line
p = Line(df,x='dayofyear', y='value',color='year')
show(p)

въведете описание на изображението тук

person Scott Boston    schedule 18.04.2017
comment
голямо благодаря ти. Ще бъде ли възможно тогава да форматирате оста x от dayofyear до „%d-%b“ (ден, месец) и да направите същия формат достъпен за инструмента за задържане? - person python_analysis; 18.04.2017
comment
Да, трябва да можете да етикетирате тези отметки, както сметнете за добре. Ако нямате нищо против и намирате това за полезно, бихте ли приели този отговор. - person Scott Boston; 18.04.2017
comment
@python_analysis вижте тази SO публикация. - person Scott Boston; 18.04.2017
comment
след приемане на отговора виждам следната грешка: line() получи множество стойности за аргумент 'x'. Същата грешка, която получих, когато опитах същото решение като вашето, но с дата (%d-%b) вместо dayofyear. Това ли е защото нямам еднакъв брой стойности за всяка група? В този случай трябва да отида по пътя на обобщената таблица и да чертая през колоните - person python_analysis; 18.04.2017
comment
съжалявам, датата е (%d-%b-2016) вместо ден от годината - person python_analysis; 18.04.2017
comment
ще започна нов въпрос - person python_analysis; 18.04.2017