Как я могу сделать столбцы даты более привлекательными для исследования данных в postgres вместо Python?

#python #postgresql

#python #postgresql

Вопрос:

У меня есть график данных фондового рынка, выполненный с использованием Plotly-Dash. Я отображаю x для дат, y для цены. При отображении x-данных в виде дат метки всегда выглядят шаткими и странными для исследования данных.

Например: введите описание изображения здесь

Как вы можете видеть, ось x представляет собой ряд месяцев января и июля на протяжении многих лет. Это, естественно, генерируется автоматически и выглядит не очень хорошо для пользовательского интерфейса. Было бы намного лучше, если бы 1 квартал 2015 года, 2 квартал 2015 года или Зима 2016, лето 2016 и т. Д…

В Python я могу сделать это, отредактировав фрейм данных аналогичным образом:

 for column in lst:
    column.loc[column["month_int"] == 1, "month"] = "January"
    column.loc[column["month_int"] == 2, "month"] = "February"
    column.loc[column["month_int"] == 3, "month"] = "March"
    column.loc[column["month_int"] == 4, "month"] = "April"
    column.loc[column["month_int"] == 5, "month"] = "May"
    column.loc[column["month_int"] == 6, "month"] = "June"
    column.loc[column["month_int"] == 7, "month"] = "July"
    column.loc[column["month_int"] == 8, "month"] = "August"
    column.loc[column["month_int"] == 9, "month"] = "September"
    column.loc[column["month_int"] == 10, "month"] = "October"
    column.loc[column["month_int"] == 11, "month"] = "November"
    column.loc[column["month_int"] == 12, "month"] = "December"
    
# Or like this     

for column in lst2:
    column.loc[(column['month_int'] > 2) amp; (column['month_int'] <= 5), 'Season'] = 'Spring'
    column.loc[(column['month_int'] > 5) amp; (column['month_int'] <= 8), 'Season'] = 'Summer'
    column.loc[(column['month_int'] > 8) amp; (column['month_int'] <= 11), 'Season'] = 'Autumn'
    column.loc[column['month_int'] <= 2, 'Season'] = 'Winter'
    column.loc[column['month_int'] == 12, 'Season'] = 'Winter
  

Что эквивалентно этому, но для Postgres? Я пытаюсь изучить больше приемов SQL и заменить ненужный код python. Для справки, вот мой запрос

 SELECT symbol, date, adj_close 
FROM api.security_price 
WHERE security_price.symbol IN %s AND date > (SELECT MAX(date) FROM api.security_price) - interval '5 years' 
ORDER by date;
  

Ответ №1:

Для получения месяца вы можете использовать TO_CHAR функцию в postgres.

 select symbol, date, to_char(date, 'Month') as month, adj_close from api.security_price 
WHERE security_price.symbol IN %s AND date > (SELECT MAX(date) FROM api.security_price) - interval '5 years' 
ORDER by date;
  

Ссылка: https://www.postgresql.org/docs/current/functions-formatting.html

Аналогичным образом, вы также можете определить свои собственные функции sql-запросов для особых случаев. Ссылка: https://www.postgresql.org/docs/current/xfunc-sql.html .

Для season другим простым способом сделать это было бы иметь другой столбец, содержащий сопоставление month_int с season, и выполнять левое соединение с этой таблицей в ваших выходных данных.

Комментарии:

1. Есть ли заметная причина, по которой добавление вашего нового дополнения отбросило мой запрос? Я получаю странное значение для своих лет?

2. попробуйте поместить все ссылки date в двойные кавычки. Устраняет ли это проблему?

3. Мы не можем видеть странно! Пожалуйста, опубликуйте результирующий запрос и полученные им результаты.