График Боке с датой и периодом времени (месяц-год) по оси X - PullRequest
0 голосов
/ 04 ноября 2018

Я новичок в bokeh / pandas и пытаюсь построить линию тренда, используя месяц-год для оси x и целочисленные значения для оси y.

Мои данные выглядят так:

year_month  emp_count
0   2015-09     1450425
1   2015-10     3093811
2   2015-11     3316241
3   2015-12     3308658
4   2016-01     3402191

Для построения графика с использованием боке я конвертирую оба столбца в ndarray. Когда я конвертирую столбец год-месяц в ndarray, он показывает каждое значение как период. Я использовал метод to_period ('M'), чтобы получить year_month из столбца даты.

    temp_df.year_month.values
>>output
    array([Period('2015-09', 'M'), Period('2015-10', 'M'),
           Period('2015-11', 'M'), Period('2015-12', 'M'),
           Period('2016-01', 'M'), Period('2016-02', 'M'),

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

TypeError: Объект типа 'Period' не поддерживает сериализацию в формате JSON

Чтобы избежать этой ошибки, я преобразовал тип столбца year_month в строку, но я все еще получаю ту же ошибку. Мой полный код выглядит следующим образом:

temp_df.year_month = temp_df.year_month.astype(str)
output_file('trend1.html')
p = figure(title='Employee trend', 
           plot_width=800, 
           plot_height=350,
           x_axis_label='Month-Year', y_axis_label='No of Employees', 
          x_axis_type='datetime')

p.line(x= temp_df.year_month, 
       y = temp_df.emp_count)

show(p)

Кто-нибудь знает, как изобразить год-месяц по оси абсцисс с помощью боке?

Ответы [ 2 ]

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

Я решил проблему альтернативным подходом. Спасибо @Samira за вдохновение.

Я извлек год-месяц из объекта даты и установил день по умолчанию равным 1.

    df = df.join(df.as_of_date.apply(lambda x : pd.Series({
    'day': x.day, 
    'year':x.year, 
    'month': x.month, 
    'year_month': x.to_period('M'),
    'year_month_01': pd.datetime(x.year,x.month,1)
})))

После этого используется 'year_month_01' на оси, и график боке выглядит как ожидалось.

график боке

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

Я думаю, я нашел проблему. Вы должны преобразовать столбец в дату и время.

df['year_month']=pd.to_datetime(df['year_month'])

Это должно изменить значения столбца на следующие (день по умолчанию равен 01):

   year_month      emp_count
0   2015-09-01     1450425
1   2015-10-01     3093811
2   2015-11-01     3316241
3   2015-12-01     3308658
4   2016-01-01     3402191

Тогда сюжет будет работать. Я проверил это на фиктивном значении, поскольку выходные данные ниже.

Value   month_year
2   2018-11-01
3   2018-01-01
4   2018-02-01
5   2018-05-01


sample=pd.DataFrame(pd.read_csv('sample.csv'))
sample['month_year']=pd.to_datetime(sample['month_year'])
p = figure(title='Employee trend', 
           plot_width=800, 
           plot_height=350,
           x_axis_label='Month-Year', y_axis_label='No of Employees', 
          x_axis_type='datetime')

p.scatter(x= sample.month_year, 
       y = sample.Value)

show(p)

Output

Дайте мне знать, если это работает. Спасибо

...