使用Python构建Web应用程序以可视化Google My Business Discovery数据

来源:Memegenerator

数据可视化是分析过程中不可或缺的一部分,它允许您以易于与所有业务单位进行通信的方式讲述有关数据的故事,并概述业务的不同方面的表现。它类似于电影;有时,传达信息的最佳方式是通过视觉上吸引人的调制解调器,能够吸引人们的注意力并增加召回。

不准确的信息

不言而喻,与上图不同,所产生的可视化必须准确,特别是如果这些可视化通知用于指导业务和营销决策的报告。

最近,我被聘为一家大银行部门的分析师。虽然我很失望地发现他们实际上并没有在建筑物中留下大量现金,但我发现这项工作非常有趣。我必须完成的任务之一涉及开发报告以可视化数字营销数据。其中一份报告没有透露太多,涉及可视化来自Google My Business(GMB)的数据。

根据这个任务,让我们创建一个场景。想象一下,你在一家大公司工作,在一个国家/地区拥有多个分支机构。所有实体分支机构都列在GMB上,因为您希望人们轻松找到您的分支机构,并且您希望吸引潜在的新客户,这些客户来自与您的行业相关的搜索查询。每个月您都希望获得与您的分支相关的搜索,操作和视图的摘要,例如;通过用户执行的搜索和操作,总地图视图,总操作,总浏览量,热门浏览位置和前10个位置。您可以在Excel,Google Data Studio和Tableau上创建这些可视化,但出于本博客的目的,我决定使用Flask创建一个Web应用程序,允许用户上传从GMB中提取的发现CSV,清理CSV只需单击一下即可创建可视化效果。

从未在Python上创建过网络应用程序,我决定使用烧瓶,因为从我的研究来看,它似乎相对容易理解。

为应用程序创建文件夹

Flask文档有一个非常容易理解的教程,介绍如何设置虚拟环境和安装依赖项以启动项目。第一步涉及在我的Jupyter终端上创建项目文件夹和虚拟环境(我的默认shell是bash)。设置完并激活我的虚拟环境后,我继续创建一个requirements.txt文件。此文件包含我运行应用程序时需要安装的所有库。这背后的想法是允许另一个想要与我的应用程序交互的最终用户在他/她的机器上重新创建虚拟环境以及应用程序运行所需的库。

#requirements.txt Flask == 0.12.3
点击== 6.7
gunicorn == 19.7.1
itsdangerous == 0.24
Jinja2的== 2.9.6
MarkupSafe == 1.0
pytz == 2017.2
请求== 2.13.0
WERKZEUG == 0.12.1
大熊市猫== 0.23.0
matplotlib == 1.4.2
numpy的= 1.8.2

需求文件是在我刚刚创建的同一文件夹中创建的。创建此文件后,我使用pip安装了我的需求文件中列出的库。

pip install -r requirements.txt

构建Web应用程序

加载相关库后。第一步是允许用户上传报告。

UPLOAD_FOLDER ='./Downloads/gmbreports'
如果不是os.path.exists(UPLOAD_FOLDER):
os.makedirs(UPLOAD_FOLDER)

ALLOWED_EXTENSIONS ='csv'
app = Flask(__ name__)
app.config('UPLOAD_FOLDER')= UPLOAD_FOLDER
def allowed_file(filename):
返回'。'在文件名和
filename.rsplit('。',1)(1).lower()in ALLOWED_EXTENSIONS

使用此代码,我限制了允许CSV格式文件的上传,并指定上传的文件将保存在本地计算机的downloads / gmbreports文件夹下。我添加了一个条件,如果路径不存在,则必须创建它。

然后我为我的网络应用程序创建了一个Flask类的实例,这个'开始'我的烧瓶网络应用程序。

接口

由于应用程序的目的是以CSV的形式接收输入并生成报告,因此我创建了一个提示用户上传CSV的功能。

@ app.route('/',methods =('GET','POST'))
def upload_file():
如果request.method =='POST':
如果'file'不在request.files中:
flash('无文件部分')
return redirect(request.url)
file = request.files('file')
如果file.filename =='':
flash('你需要上传一个csv文件')
return redirect(request.url)
if file和allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config('UPLOAD_FOLDER'),filename))
return redirect(url_for('uploaded_file',
文件名=文件名))
返回'''

Google我的商家发现报告生成器

Google我的商家发现报告生成器

此Web应用程序允许您根据从Google我的商家帐户中提取的发现csv构建报告,根据Google My Business上列出的分支机构的每个位置,为您提供有关搜索量和操作的可视化信息。



“””

我的代码的@ app.route部分是一个装饰器,它告诉flask应该触发upload_file函数运行的URL。此函数检查上载的文件是否采用允许的格式(CSV),将文件保存在指定的文件夹中,并返回带有应用程序前端界面的HTML。

HTML本质上是一个上传表单,它运行我命名为transform的函数。此功能可清理CSV并根据文档中的数据创建可视化。

清理和创建可视化的功能

由于此应用程序的核心功能是采用从特定格式的GMB中提取的CSV,清理它并根据显示的数据返回大约8个可视化,我的下一步涉及创建将执行此转换的“主要功能”

def transform():
disc = open('clean.csv')
disc2 = open('clean_two.csv','w')
#cleaning up csv
对于盘中的行:
row = row.strip()
row = row(1:-1)
row = row.replace('“”','“')
disc2.write(行+” n”)
disc2.close()
disc.close()
discovery = pd.read_csv('clean_two.csv')
discovery_clean = discovery.iloc(1 🙂
cols = list(discovery_clean.columns(4 :))
discovery_clean(cols)= discovery_clean(cols).apply(pd.to_numeric,errors ='coerce')

最初,CSV返回一行中应该是多个列的内容(不分为列),但是,一个共同特征是每个列名称都用双引号括起来。为了清理它,我将双引号转换为单引号 – 通过这样做,我可以利用pd.read_csv将引号中的每个文本作为列名读取,然后将每个新行作为列下的行。

作为清理的一部分,我删除了出现在第二行中的值,因为这些值无法归类为可归于每列的列或值,这些是列的描述。

使用PdfPages('plots.pdf')作为pdf:
#first figure
plt.figure(figsize =(20,10))
ax = discovery_clean(cols).sum()。plot.bar(figsize =(20,10))
ax.axes.get_yaxis()。set_visible(假)
ax.set_title( '概览 N',字体大小= '15',颜色= '黑')
ax.xaxis.set_tick_params(labelsize = 15)
对于ax.patches中的x:
ax.text(x.get_x() – 。09,x.get_height()+ 20,
F '{INT(x.get_height()):,}',字体大小= 15,颜色= '黑')
plt.rcParams( 'figure.figsize')=(20,10)
pdf.savefig(bbox_inches = '紧')
plt.close()

继续转换功能,我希望以pdf格式返回可视化,每个可视化创建自己的页面。使用PdfPages函数,我创建了盘点器/框架来创建多个pdf页面,并开始创建一个可视化,总结了在文档所代表的期间内在GMB上所有位置执行的关键操作。

plt.figure(figsize =(16,8))
mpl.rcParams('font.size')= 12
disc_plot = discovery_clean.groupby('Business name')('Total views')。sum()。nlargest(10)
labels = list(disc_plot.index)
nums =(disc_plot.values).astype(int)
def actual_nums(vals):
a = np.round(vals / 100. * nums.sum())
回来一个
爆炸=()
for n in nums:
如果v == max(nums):
explode.append(0.3)
其他:
explode.append(0)
plt.pie(NUMS,标签=标签,autopct = actual_nums,爆炸=爆炸,半径= 0.50)
plt.tight_layout()
plt.title(“每个位置前10个视图 n”,fontsize = 15,color ='black')
plt.axis( '等于')
pdf.savefig(bbox_inches = '紧')
plt.close()

第二个可视化返回一个饼图,显示具有最高视图的顶部位置,并以最大值展开饼图。由于饼图默认返回百分比,因此我创建了一个函数来将百分比转换为它们的等价数字。我确保以这样的方式调整此K线走势图和后续K线走势图的大小,以便将它们保存为pdf,每个K线走势图都是一个页面而不会被切断。

创建报告

在我的报告中总共创建了8个K线走势图。

@ app.route( '/变换',方法=( “POST”))
def transform_view():
request_file = request.files( '文件')
request_file.save( 'clean.csv')
如果不是request_file:
返回“没有文件”
result = transform()
打印(结果)
return send_file('plots.pdf',as_attachment = True)

我想要的一件事是报告是pdf格式的,并保存为附件,当我在我的网络应用程序上按下上传按钮时会自动下载。将as_attachment设置为true允许我的函数将报表保存为在创建报表后在本地计算机上下载的附件。

输出样本

在bash上运行应用程序

通过引用文件名(main.py)在bash上运行应用程序会生成指向Web应用程序的链接,单击链接后,我的浏览器将打开Web应用程序。

Google我的商家发现报告生成器网络-app

没有向应用程序添加任何CSS,然后返回相对简单的Web应用程序,我可以上传从Google我的商家中提取的发现CSV文件,并使用摘要可视化创建报告。

Google我的商家搜索和操作摘要 基于Google我的业务视图的前10个位置

该函数生成的输出是一个易于理解和生成的报告,无需在每次从Google我的商家中提取发现CSV时生成新的可视化。

鳍。

随意与任何评测,批评或只是跟随我无争议的推文@emmoemm接触。

资讯来源:由0x资讯编译自HACKERNOON。版权归作者所有,原文链接:https://hackernoon.com/building-a-web-app-to-visualise-google-my-business-discovery-data-4d7c7f510e6?source=collection_category—4——0———————。未经许可,不得转载
提示:投资有风险,入市需谨慎,本资讯不作为投资理财建议。请理性投资,切实提高风险防范意识;如有发现的违法犯罪线索,可积极向有关部门举报反映。
你可能还喜欢