Az adatelemzéseknél az excell kimenet a preferált. Itt már az is szempont, hogy a megfelelően formázott táblázatos eredmények mellé a diagramok is odakerüljenek.
Ezt lehet python csomagból létrehozás vagy az excel funkcionalitásból generálás is. Ekkor nem kell külön egyéb csomag, csak a külső meghívás paraméterezésének ismerete kell és a pandas csomag
Több módszer is lehet tehát most csak az alábbi kettőt emelem ki:
- Pandas és matplotlib csomaggal diagram generálás és képfile be mentés majd excelbe töltés
- Pandas csomaggal excel diagram generálás
Excel és pandas objektumok
pandas Excel
DataFrame worksheet
Series column
Index row headings
row row
NaN empty cell
Az excelből generált eset rugalmasabb mivel ilyenkor a formázási lehetőség teljes tárháza rendelkezésre áll:
Hogyan néz ki egy ilyen kód:
## Diagram generállás közvetlenül excelből
import pandas as pd
import numpy as np
## adat generálás
data = pd.DataFrame(
{'A': [np.random.uniform(0.1*i, 0.1*i + 1) for i in range(100)],
'B': [np.random.uniform(0.1*i, 0.1*i + 1) for i in range(100)]}
)
## pandas excel beállítások
excel_file = r'c:\Users\User\Downloads\kl_plot2.xlsx'
sheet_name = 'Munka1'
writer = pd.ExcelWriter(excel_file, engine='xlsxwriter')
data.to_excel(writer, sheet_name=sheet_name)
## excel munkafuzet munkalap beállítás
workbook = writer.book
worksheet = writer.sheets[sheet_name]
## autószűrős
max_row = global_num.shape[0]
max_col = 3
worksheet.set_column(0, max_col - 1, 12)
worksheet.autofilter(0, 0, max_row, max_col - 1)
## diagram előkészítés
chart = workbook.add_chart({'type': 'scatter'})
## sor és oszlop generálás/töltés (táblázat)
max_row = len(data)
col_x = data.columns.get_loc('A') + 1
col_y = data.columns.get_loc('B') + 1
## diagram feltöltés
chart.add_series({
'name': "Samples",
'categories': [sheet_name, 1, col_x, max_row, col_x],
'values': [sheet_name, 1, col_y, max_row, col_y],
'marker': {'type': 'circle', 'size': 4},
'trendline': {'type': 'linear'},
})
## felíratok elkészítése
chart.set_x_axis({'name': 'Concentration'})
chart.set_y_axis({'name': 'Measured',
'major_gridlines': {'visible': False}})
## diagra beszúrás D2 cellába
worksheet.insert_chart('D2', chart)
## mentés és lezárás
writer.save()
writer.handles.close()
A képként beillesztett diagram sokkal szűkösebben szerkeszthető tovább:
Hogyan néz ki egy ilyen kód:
#diagram generálás matplotlib-ből és beszúrás
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import (
FormatStrFormatter,
AutoMinorLocator,
FuncFormatter,
)
import matplotlib.dates as mdates
from matplotlib.dates import DateFormatter
from pandas.plotting import register_matplotlib_converters
# https://github.com/CSSEGISandData/COVID-19
df = pd.read_csv(r'c:\Users\User\Downloads\time_series_covid19_confirmed_global.csv')
df = df[df["Country/Region"] == 'Hungary'] ## magyarországra szűrés
df = df.iloc[:,4:] ## első 5 oszlop kihagyása
global_num = df.sum()
global_num.filter(like='2/22')
result = global_num.filter(like = '/1/22' and '/2/22')
print(result)
# global_num['kldate1'] = pd.to_datetime(global_num.index)
print (global_num.index[0] )
global_num.index.name = 'date'
#global_num.to_frame(name='date').query('date >= "2022-01-01"').reset_index()
print (global_num.head() )
fig, ax = plt.subplots()
ax.set(title = 'Hungary Covid Confirmed Cases',
xlabel = 'Time',
ylabel = 'Number of cases')
## formázások
ax.yaxis.set_major_formatter(FuncFormatter(lambda x, p: format(x/1000000) +'M'))
date_form = DateFormatter("%m-%d")
ax.xaxis.set_major_formatter(date_form)
locator = mdates.DayLocator()
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_locator(mdates.WeekdayLocator(interval=3))
ax.yaxis.grid()
dates = pd.to_datetime(global_num.index)
## diagram előállítása
plt.plot(dates, global_num)
plt.savefig(r'c:\Users\User\Downloads\kl_plot.png') ## generált diagram mentés kép állományba
plt.show()
## diagram kép xls-be beszúrás
writer = pd.ExcelWriter(r'c:\Users\User\Downloads\kl_plot1.xlsx', engine = 'xlsxwriter')
global_num.to_excel(writer, sheet_name='Munka1')
## autószűrős
workbook = writer.book
worksheet = writer.sheets['Munka1']
max_row = global_num.shape[0]
max_col = 2
worksheet.set_column(0, max_col - 1, 12)
worksheet.autofilter(0, 0, max_row, max_col - 1)
worksheet = writer.sheets['Munka1']
worksheet.insert_image('C2', r'c:\Users\User\Downloads\kl_plot.png')
## mentés és lezárás
writer.save()
writer.handles.close()
Pandas csomag
Link:
https://github.com/klajosw/python/blob/master/kl_py_xls_chart.ipynb
Megjegyzések
Megjegyzés küldése