#python #mysql #numpy #matplotlib #plot
#python #mysql #numpy #matplotlib #построение
Вопрос:
Я хочу загрузить данные из моей базы данных MySQL с помощью запроса, который возвращает SUM()
число смертей от COVID-19 в месяц с использованием for
цикла.
january = february = march = april = may = june = july = august = september = october = november = december = 0
meses = [january, february, march, april, may, june, july, august, september, october, november, december]
for i, m in enumerate(meses):
c.execute(f'SELECT SUM(deaths) FROM covid WHERE month = {i 1} AND countriesAndTerritories = "United_States_of_America";')
m = c.fetchall()
print(f'i = {i 1} / c = {m}')
x = np.array(['JANUARY','FEBRUARY','MARCH','APRIL','MAY','JUNE','JULY','AUGUST','SEPTEMBER','OCTUBER','NOVEMBER','DECEMBER'])
y = np.array([january, february, march, april, may, june, july, august, september, october, november, december])
plt.title("Deaths per Month - 2020")
plt.bar(x,y, color = "indigo")
plt.show()
Внутри for
цикла я делаю print
проверку информации, извлеченной из базы данных, и она возвращает ее следующим образом:
i = 1 / c = [(0.0,)]
i = 2 / c = [(0.0,)]
i = 3 / c = [(3170.0,)]
i = 4 / c = [(57796.0,)]
i = 5 / c = [(42815.0,)]
i = 6 / c = [(22359.0,)]
i = 7 / c = [(25930.0,)]
i = 8 / c = [(30999.0,)]
i = 9 / c = [(22929.0,)]
i = 10 / c = [(23710.0,)]
i = 11 / c = [(37165.0,)]
i = 12 / c = [(32304.0,)]
Это print
подтверждает, что данные были записаны в базу данных. По какой причине информация на гистограмме должна быть обнулена, как показано ниже?
Ответ №1:
Я думаю, что ваш подход можно было бы значительно упростить без зацикливания, если бы вы GROUP BY
SQL
вводили и использовали read_sql
его без необходимости передавать параметры.
Затем просто позвоните plt.bar()
и передайте столбцы. Оттуда вы можете использовать plt.xticks
для изменения формата месяцев из 0,1,2,etc.
month_format
списка желаемых названий месяцев.
ПРИМЕЧАНИЕ: я не mysql
пользователь, но я думаю month
, что имя столбца можно спутать с SQL
функцией month
, поэтому я включил как «месяц», поскольку я прочитал, что это SQL Server
эквивалентно [month]
.
# c = your connection
sql='''
SELECT `month`, SUM(deaths) as deaths FROM covid WHERE countriesAndTerritories = "United_States_of_America" GROUP BY `month` ORDER BY `month`;
'''
df = pd.read_sql(sql, c)
month_format = np.array(['JANUARY','FEBRUARY','MARCH','APRIL','MAY','JUNE','JULY','AUGUST','SEPTEMBER','OCTUBER','NOVEMBER','DECEMBER'])
plt.bar(df['month'],df['deaths'], color="indigo")
plt.title("Deaths per Month - 2020")
plt.xticks(x_data, month_format)
plt.show()