Python 数据分析 git 工具使用 & flask学习

1. git

软件控制管理 ------> 版本控制 ------> 管理产品文件(代码、文档、脚本、设计稿等)的各个历史版本

1990s —> CVS / VSS —> 锁定模式

2000 —> Subversion —> SVN —> 合并模式 —> 中央服务器

2005 —> Git —> 去中心化的版本控制系统 —> 分布式版本控制系统
Unix —> Oracle
服务器操作系统:Linux —> Linus Torvalds —> 1991 —> Minix
BitKeeper —> Git

Bash —> Linux系统的人机交互环境(壳程序 - 人机接口),命令跟Windows命令行提示符相差很远。

Bash命令:
ls - list directory contents —> 列出文件夹下的内容 —> %ls
-l / -a
pwd - print working directory —> 打印当前工作目录 —> %pwd
cd - change directory —> 切换目录
mkdir - make directory —> 创建文件夹
-p —> --parents
touch —> 创建空文件或者修改文件的最后访问时间
clear —> 清除屏幕上的输出
cat —> 查看文件的内容
-n —> 给每一行添加行号

使用Git:
软件安装百度搜索git,找到官网安装即可,除了自定义下载路径外,其他都默认配置,安装结束后最后一个页面的其它安装推荐也不用勾选

如果第一次使用Git,再做第一次提交前要配置用户名和邮箱
~ git config --global user.email "jackfrued@126.com"
~ git config --global user.name "jackfrued"

~ git init ---> 将一个普通的文件夹变成版本控制的仓库
~ git status ---> 查看状态(工作区、暂存区、本地仓库是否同步)
~ git add ---> 将文件从工作区同步到暂存区

~ git commit -m "..." ---> 提交,将暂存区同步到本地仓库
~ git log ---> 查看提交日志(历史)
~ git restore ---> 用暂存区的内容恢复工作区
~ git reset ---> 重置版本
    - --hard:让工作区、暂存区、仓库保持同步
    - --mixed:让仓库和暂存区重置,但工作区保持不变
    - --soft:让仓库重置,暂存区和工作区保持不变
~ git reflog ---> 查看到所有的提交日志(历史和未来)

在这里插入图片描述

Git私服 ---->

GitHub:全球最大的代码托管平台(相当于是Git服务器,可以同步文件)

国内:

  • 码云 —> gitee.com
  • coding.net
  • 行云

git remote add origin 服务器仓库地址 —> 添加远端仓库(服务器)

git remote -v —> 查看远端仓库(服务器)

git remote rmeove origin —> 删除远端仓库

git push -u origin master —> 将本地的master分支上推到服务器

git clone 仓库地址 —> 克隆(下载)项目

git pull —> 从远端仓库(服务器)下拉文件

工作成果有冲突如何解决???
1. git pull ---> 将服务器上的代码拿下来 ---> CONFLICT ---> merge conflict
2. git diff ---> 查看有冲突的代码
3. 当面协商解决冲突代码,重新本地提交(git add / git commit)
4. git push ---> 解决冲突以后重新push到服务器

git 基本操作简易

2. gitee 免密登录

参考链接
桌面右键–> Git Bush Here

–> ssh-keygen -t rsa -C “xxxxxx@qq.com” 命令。连续3次回车

–> cd ~/.ssh

–> ls

–> cat id_rsa.pub

–> 复制公钥到这里
在这里插入图片描述
测试是否成功:
git clone git@gitee.com:four-wings-act-recklessly/heiheihei.git

弹出:Are you sure you want to continue connecting (yes/no/[fingerprint])?

选择 yes

如果没有让输入密码即为成功

3. pycharm 上使用git

从版本控制系统获取代码
在这里插入图片描述
点击上图按钮,粘贴项目 ssh 路径(做过免密登录的前提条件下)到 git 选项框 开始clone;或者也可以先右键 -->Git Bush here --> git clone ‘ssh路径’ 先把工程弄下来再放到pycharm中

先创建虚拟环境:注意虚拟环境路径最好是: ./工程名/venv
在这里插入图片描述
.gitignore文件

.idea

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# celery beat schedule file
celerybeat-schedule

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

虚拟环境创建好之后导入库

pip install flask
pip install pymysql
pip install freeze
pip freeze > requirements.txt
注意后面导入新库的时候都需要执行这句:pip freeze > requirements.txt

pip install requests
pip freeze > requirements.txt

4. 绘制数据看板前的预热(给数据/数据接口在前端页面进行渲染)

后端渲染:

在服务器端把动态页面生成出来,然后把渲染好的HTML页面给到浏览器。
后端渲染的方式在服务器并发访问量较大的时候,会增加服务器的开销,导致服务器效率低下,响应较慢。

from flask import Flask

app = Flask(__name__)

@app.route('/test') #可以写成 @app.route('/') 我这里不这样写,因为这部分笔记是后来补充的,不能和已经有的@app.route('/')一样
def show_index():
    books = [
        "Python1",
        "Python2",
        "Python3",
        "Python4",
        "Python5",
        "Python6"
    ]
    content = '<h1 style="color: red">hello ,world!</h1>'
    content += '<hr>'
    content += f'<p>今天推荐阅读的书籍是: </p>'
    content += '<ul>'
    for book in books:
        content += f'<li>《{book}》</li>'
    content += '</ul>'
    return content


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000, debug=True)

在这里插入图片描述

前端渲染:

前端渲染︰不在服务器端渲染页面,服务器只负责提供数据,渲染页面的操作交给浏览器中的JavaScript来完成。

前端渲染也称为前后端分离的开发,后端开发者不需要有前端知识,因为他们只需要把提供数据的服务做好;同理,前端开发者也不需要有任何后端的知识,他们只需要调用后端提供的数据接口获取数据,
然后通过JavaScript将动态内容渲染到页面上。

下图是相关文件需要移动到新的位置
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<!--
标签–承载内容- content
css -层叠样式表–渲染页面- display
JavaScript - s -交互行为- behavior
-->
<h1>
    <ul>
    <li>{{ jitang }}</li>
    </ul>
</h1>
<hr>
<p>今天推荐阅读的书籍:</p>
<ul>
    <li>{{ book }}</li>
</ul>
<img src="/static/images/guido.jpg" width="150">
</body>
</html>

静态页面运行时,不能直接点运行

http://127.0.0.1:8000/static/html/index.html

改进:main.py 加入重定向之后可以直接访问了

import random
import requests
from flask import Flask, redirect

app = Flask(__name__)


# http://127.0.0.1:8000/
@app.route('/')
def show_index():
	# 请求首页,重定向到 /static/html/index.html
    return redirect('/static/html/index.html')

if __name__ == '__main__':
    app.run(port=8000, debug=True)

下一步前端请求自己写的接口,申请数据渲染

main.py

import random
import requests
from flask import Flask, redirect

app = Flask(__name__)


# http://127.0.0.1:8000/
@app.route('/')
def show_index():
    # 请求首页,重定向到 /static/html/index.html
    return redirect('/static/html/index.html')
@app.route('/api/recs')
def get_recommendations():
    books = [
        "Python1",
        "Python2",
        "Python3",
        "Python4",
        "Python5",
        "Python6"
    ]
    n = random.randint(2, 5)
    selected_books = random.sample(books, n)

    resp = requests.get('http://api.tianapi.com/txapi/dujitang/index?key=d116541b64b5ec7f0b93996ec485a7c3')
    jitang = '今天没有毒鸡汤'
    if resp.status_code == 200:
        result = resp.json()
        if result['code'] == 200:
            jitang = result['newslist'][0]['content']
    return {'books':selected_books,'jitang':jitang}

if __name__ == '__main__':
    app.run(port=8000, debug=True)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<!--

标签–承载内容- content
css -层叠样式表–渲染页面- display
JavaScript - s -交互行为- behavior

前端渲染︰通过JavaScript向服务器发起异步请求获取SON数据,通过DOM操作对页面进行局部刷新
通过DOM(document对象)可以在页面上创建新标签、删除标签、更新标签内容、修改标签样式等....

Vue.js -前端渲染框架 - 简化原生JavaScript

-->
<div id="app">
   <h3>{{ jitang }}</h3>
<hr>
<p>今天推荐阅读的书籍:</p>
<ul>
    <li v-for="book in books">{{ book }}</li>
</ul> 
</div>

<img src="/static/images/guido.jpg" width="150">
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
<script>
    let app = new Vue({
        el:'#app',
        data:{
            jitang:'',
            books:[]
        },
        created:function(){
            //Promise 对象
            fetch('/api/recs')
            .then(resp => resp.json())
            .then(json=>{
                this.jitang = json.jitang
                this.books = json.books
            })
        }
    })
</script>
</body>
</html>

打开浏览器刷新

http://127.0.0.1:8000/static/html/index.html

利用echars 绘制图像(数据写死的)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <style>
        #main {
            width: 400px;
            height: 300px;
            border: 1px solid black;
        }
    </style>
</head>
<body>
<!--

标签–承载内容- content
css -层叠样式表–渲染页面- display
JavaScript - s -交互行为- behavior

前端渲染︰通过JavaScript向服务器发起异步请求获取SON数据,通过DOM操作对页面进行局部刷新
通过DOM(document对象)可以在页面上创建新标签、删除标签、更新标签内容、修改标签样式等....

Vue.js -前端渲染框架 - 简化原生JavaScript

-->
<div id="app">
   <h3>{{ jitang }}</h3>
<hr>
<p>今天推荐阅读的书籍:</p>
<ul>
    <li v-for="book in books">{{ book }}</li>
</ul> 
</div>

<div id="main"></div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
<script>
    let app = new Vue({
        el:'#app',
        data:{
            jitang:'',
            books:[]
        },
        created:function(){
            //Promise 对象
            fetch('/api/recs')
            .then(resp => resp.json())
            .then(json=>{
                this.jitang = json.jitang
                this.books = json.books
            })
        }
    })
</script>
<script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.1.0/echarts.min.js"></script>
<script>
    //初始化绘图使用的div标签
    let myChart =echarts.init(document.querySelector('#main'))
    //
    let option = {
            //图例
            legend: {
                data: ['A组销量','B组销量']
            },
            //x
            xAxis: {
                data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
            },
            //y
            yAxis: {},
            //数据系列
            series: [{
                name: 'A组销量',
                type: 'bar',
                data: [5, 20, 36, 10, 10, 20]
            },
            {
                name: 'B组销量',
                type: 'bar',
                data: [5, 23, 26, 19, 8, 20]
            }
            ]
        }
        myChart.setOption(option)
</script>
</body>
</html>

output:
在这里插入图片描述

利用echars 绘制图像(数据通过自己写的数据接口导入)

main.py

import random

import requests
from flask import Flask, redirect

app = Flask(__name__)


@app.route('/')
def show_index():
    # 请求首页,重定向到/static/html/index.html
    return redirect('/static/html/index.html')


@app.route('/api/sales')
def get_sales_data():
    group_a = [random.randint(5, 50) for _ in range(6)]
    group_b = [random.randint(5, 50) for _ in range(6)]
    return {
        'legend': ['销售A组', '销售B组'],
        'xData': ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子'],
        'yData': [group_a, group_b]
    }


@app.route('/api/recs')
def get_recommendations():
    books = [
        'Python从入门到实践',
        'MySQL必知必会',
        '数据思维',
        '人工智能导论',
        'PyTorch实战',
        '利用Python做数据分析'
    ]
    n = random.randint(2, 5)
    selected_books = random.sample(books, n)
    # 通过request请求三方服务获取毒鸡汤数据
    resp = requests.get('http://api.tianapi.com/txapi/dujitang/index?key=d116541b64b5ec7f0b93996ec485a7c3')
    jitang = '今天没有毒鸡汤'
    if resp.status_code == 200:
        result = resp.json()
        if result['code'] == 200:
            jitang = result['newslist'][0]['content']
    return {'books': selected_books, 'jitang': jitang}


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000, debug=True)

index.py

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <style>
        #main {
            width: 400px;
            height: 300px;
            border: 1px solid black;
        }
    </style>
</head>
<body>
    <!--
        标签 - 承载内容 - content
        CSS - 层叠样式表 - 渲染页面 - display
        JavaScript - JS - 交互行为 - behavior

        前端渲染:通过JavaScript向服务器发起异步请求获取JSON数据,通过DOM操作对页面进行局部刷新
        通过DOM(document对象)可以在页面上创建新标签、删除标签、更新标签内容、修改标签样式等……

        Vue.js - 前端渲染框架 - 简化原生JavaScript代码
    -->
    <div id="app">
        <h3>{{ jitang }}</h3>
        <hr>
        <p>今天推荐阅读的书籍是:</p>
        <ul>
            <li v-for="book in books">{{ book }}</li>
        </ul>
    </div>
    <div id="main"></div>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
    <script>
        // JavaScript
        let app = new Vue({
            el: '#app',
            data: {
                jitang: '',
                books: []
            },
            created() {
                fetch('/api/recs')
                    .then(resp => resp.json())
                    .then(json => {
                        this.jitang = json.jitang
                        this.books = json.books
                    })
            }
        })
    </script>
    <script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.1.0/echarts.min.js"></script>
    <script>
        // 初始化绘图使用的div标签(初始化绘图用的画布对象)
        let myChart = echarts.init(document.querySelector('#main'))
        // 创建图表选项对象(绘图时需要使用的数组)
        let option = {
            // 图例
            legend: {
                data: []
            },
            // x轴
            xAxis: {
                data: []
            },
            // y轴
            yAxis: {},
            // 数据系列
            series: [
                {
                    name: '',
                    type: 'bar',
                    data: []
                },
                {
                    name: '',
                    type: 'bar',
                    data: []
                }
            ]
        }

        function refreshData() {
            // 发起获取数据的异步请求
            fetch('/api/sales')
                .then(resp => resp.json())
                .then(json => {
                    option.legend.data = json.legend
                    option.xAxis.data = json.xData
                    for (let i = 0; i < option.series.length; ++i) {
                        option.series[i].name = json.legend[i]
                        option.series[i].data = json.yData[i]
                    }
                    // 数据准备就绪,将数据渲染到echarts图表上
                    myChart.setOption(option)
                    // 5秒钟以后再次调用这个函数
                    setTimeout(refreshData, 5000)
                })
        }

        refreshData()
    </script>
</body>
</html>

output:
在这里插入图片描述

数据接口:

http://127.0.0.1:8000/api/sales
在这里插入图片描述

5.补充:vs code 好用的插件

在这里插入图片描述
在vscode 上编辑代码
在这里插入图片描述
找到改文件,拖到VS code 中
在这里插入图片描述
之后就可以编辑了,pycham可以同步
在这里插入图片描述
作业:

1.连数据库画折线图

2,数据库里建表,所有内容均从数据库里读出来,销售组,类别,销售信息

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值