Построение строки matplotlib с использованием цикла for из базы данных MySQL

#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()