#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. Мы не можем видеть странно! Пожалуйста, опубликуйте результирующий запрос и полученные им результаты.