jackfrued 4 жил өмнө
parent
commit
b67ed793e3

+ 97 - 0
Day21-30/code/垃圾分类查询/index-2.html

@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>垃圾分类查询助手</title>
+    <style>
+        .search, .result {
+            width: 720px;
+            margin: 50px auto;
+        }
+        .search > input {
+            width: 520px;
+            border: none;
+            outline: none;
+            text-align: center;
+            font-size: 36px;
+            line-height: 36px;
+            border-bottom: 1px solid gray;
+            margin: 0 20px;
+        }
+        .search button {
+            background-color: red;
+            color: white;
+            font-size: 28px;
+            border: none;
+            outline: none;
+            width: 120px;
+        }
+        .result > p, .result > div {
+            width: 640px;
+            margin: 0 auto;
+        }
+        .result > p, .result span {
+            text-align: left;
+            font-size: 28px;
+        }
+        .result img {
+            vertical-align: middle;
+        }
+        .explain {
+            font-size: 12px;
+            color: darkgray;
+        }
+        .result .pre {
+            font-size: 16px;
+        }
+    </style>
+</head>
+<body>
+    <div id="app">
+        <div class="search">
+            <input type="text" placeholder="请输入垃圾名字" v-model.trim="word" @keydown.enter="search()">
+            <button @click="search()">查询</button>
+        </div>
+        <div class="result">
+            <p v-if="searched && !results">没有对应的查询结果</p>
+            <div v-for="result in results">
+                <p>
+                    <img :src="'images/' + pictures[result.type]" width="56" :alt="types[result.type]">
+                    &nbsp;&nbsp;
+                    <span>{{ result.name }}</span>
+                    &nbsp;&nbsp;
+                    <span class="pre" v-if="result.aipre == 1">(预测结果)</span>
+                </p>
+                <p class="explain">说明:{{ result.explain }}</p>
+            </div>
+        </div>
+    </div>
+    <script src="https://cdn.bootcss.com/vue/2.6.10/vue.min.js"></script>
+    <script>
+        new Vue({
+            el: '#app', 
+            data: {
+                word: '',
+                searched: false,
+                types: ['可回收物', '有害垃圾', '厨余垃圾', '其他垃圾'],
+                pictures: ['recyclable.png', 'harmful-waste.png', 'kitchen-waste.png', 'other-waste.png'],
+                results: []
+            },
+            methods: {
+                search() {
+                    if (this.word.trim().length > 0) {
+                        let key = 'e8c5524dd2a365f20908ced735f8e480'
+                        let url = `http://api.tianapi.com/txapi/lajifenlei/?key=${key}&word=${this.word}`
+                        fetch(url)
+                            .then(resp => resp.json())
+                            .then(json => {
+                                this.searched = true
+                                this.results = json.newslist
+                            })
+                    }
+                }
+            }
+        })
+    </script>
+</body>
+</html>

+ 0 - 1
Day41-55/46.日志和调试工具栏.md

@@ -212,4 +212,3 @@ queryset = Teacher.objects.values('subject__name').annotate(good=Avg('good_count
 ```
 
 可见,Django的ORM框架允许我们用面向对象的方式完成关系数据库中的分组和聚合查询。
-

+ 0 - 1
Day41-55/48.前后端分离开发入门.md

@@ -175,4 +175,3 @@ class SubjectMapper(ModelMapper):
 前后端分离的开发需要将前端页面作为静态资源进行部署,项目实际上线的时候,我们会对整个Web应用进行动静分离,静态资源通过Nginx或Apache服务器进行部署,生成动态内容的Python程序部署在uWSGI或者Gunicorn服务器上,对动态内容的请求由Nginx或Apache路由到uWSGI或Gunicorn服务器上。
 
 在开发阶段,我们通常会使用Django自带的测试服务器,如果要尝试前后端分离,可以先将静态页面放在之前创建的放静态资源的目录下,具体的做法可以参考[项目完整代码](https://gitee.com/jackfrued/django19062)。
-

+ 2 - 2
Day66-70/67.NumPy的应用.md

@@ -852,7 +852,7 @@ plt.imshow(guido_image[30:350, 90:300])
 
 #### 统计方法
 
-`ndarray`对象的统计方法主要包括:`sum`、`mean`、`std`、`var`、`min`、`max`、`argmin`、`argmax`、`cumsum`等,分别用于对数组中的元素求和、求平均、求标准差、求方差、找最大、找最小、求累积和等,请参考下面的代码。
+`ndarray`对象的统计方法主要包括:`sum()`、`mean()`、`std()`、`var()`、`min()`、`max()`、`argmin()`、`argmax()`、`cumsum()`等,分别用于对数组中的元素求和、求平均、求标准差、求方差、找最大、找最小、求累积和等,请参考下面的代码。
 
 ```Python
 array28 = np.array([1, 2, 3, 4, 5, 5, 4, 3, 2, 1])
@@ -920,7 +920,7 @@ print(array28.cumsum())
 
     > **说明**:可以看出,二维数组的点积就是矩阵乘法运算。
 
-4. `dump()`方法:保存数组到文件中,可以通过NumPy中的`load`函数从保存的文件中加载数据创建数组。
+4. `dump()`方法:保存数组到文件中,可以通过NumPy中的`load()`函数从保存的文件中加载数据创建数组。
 
     代码:
 

+ 147 - 31
Day66-70/68.Pandas的应用.md

@@ -261,7 +261,7 @@ Series对象的常用属性如下表所示。
 
     > **提示**:因为`describe()`返回的也是一个`Series`对象,所以也可以用`ser2.describe()['mean']`来获取平均值。
 
-    如果`Series`对象有重复的值,我们可以使用`unique()`方法获得去重之后的`Series`对象;如果想要统计每个值重复的次数,可以使用`value_counts()`方法,这个方法会返回一个`Series`对象,它的索引就是原来的`Series`对象中的值,而每个值出现的次数就是返回的`Series`对象中的数据,在默认情况下会按照出现次数做降序排列。
+    如果`Series`对象有重复的值,我们可以使用`unique()`方法获得去重之后的`Series`对象;可以使用`nunique()`方法统计不重复值的数量;如果想要统计每个值重复的次数,可以使用`value_counts()`方法,这个方法会返回一个`Series`对象,它的索引就是原来的`Series`对象中的值,而每个值出现的次数就是返回的`Series`对象中的数据,在默认情况下会按照出现次数做降序排列。
 
     代码:
 
@@ -280,14 +280,62 @@ Series对象的常用属性如下表所示。
     dtype: int64
     ```
 
+    代码:
+
+    ```Python
+    ser3.nunique()
+    ```
+
+    输出:
+
+    ```
+    4
+    ```
+
 - 数据处理的方法
 
-    `Series`对象的`dropna`和`fillna`方法分别用来删除空值和填充空值,具体的用法如下所示。
+    `Series`对象的`isnull()`和`notnull()`方法可以用于空值的判断,代码如下所示。
 
     代码:
 
     ```Python
     ser4 = pd.Series(data=[10, 20, np.NaN, 30, np.NaN])
+    ser4.isnull()
+    ```
+
+    输出:
+
+    ```
+    0    False
+    1    False
+    2     True
+    3    False
+    4     True
+    dtype: bool
+    ```
+
+    代码:
+
+    ```Python
+    ser4.notnull()
+    ```
+
+    输出:
+
+    ```
+    0     True
+    1     True
+    2    False
+    3     True
+    4    False
+    dtype: bool
+    ```
+
+    `Series`对象的`dropna()`和`fillna()`方法分别用来删除空值和填充空值,具体的用法如下所示。
+
+    代码:
+
+    ```Python
     ser4.dropna()
     ```
 
@@ -337,9 +385,9 @@ Series对象的常用属性如下表所示。
     dtype: float64
     ```
 
-    需要提醒大家注意的是,`dropna`和`fillna`方法都有一个名为`inplace`的参数,它的默认值是`False`,表示删除空值或填充空值不会修改原来的`Series`对象,而是返回一个新的`Series`对象来表示删除或填充空值后的数据系列,如果将`inplace`参数的值修改为`True`,那么删除或填充空值会就地操作,直接修改原来的`Series`对象,那么方法的返回值是`None`。后面我们会接触到的很多方法,包括`DataFrame`对象的很多方法都会有这个参数,它们的意义跟这里是一样的。
+    需要提醒大家注意的是,`dropna()`和`fillna()`方法都有一个名为`inplace`的参数,它的默认值是`False`,表示删除空值或填充空值不会修改原来的`Series`对象,而是返回一个新的`Series`对象来表示删除或填充空值后的数据系列,如果将`inplace`参数的值修改为`True`,那么删除或填充空值会就地操作,直接修改原来的`Series`对象,那么方法的返回值是`None`。后面我们会接触到的很多方法,包括`DataFrame`对象的很多方法都会有这个参数,它们的意义跟这里是一样的。
 
-    `Series`对象的`mask`和`where`方法可以将满足或不满足条件的值进行替换,如下所示。
+    `Series`对象的`mask()`和`where()`方法可以将满足或不满足条件的值进行替换,如下所示。
 
     代码:
 
@@ -393,7 +441,44 @@ Series对象的常用属性如下表所示。
     dtype: int64
     ```
 
-    `Series`对象的`apply`和`map`方法非常重要,它们可以用于数据处理,把数据映射或转换成我们期望的样子,这个操作在数据分析的数据准备阶段非常重要。
+    `Series`对象的`duplicated()`方法可以帮助我们找出重复的数据,而`drop_duplicates()`方法可以帮我们删除重复数据。
+
+    代码:
+
+    ```Python
+    ser3.duplicated()
+    ```
+
+    输出:
+
+    ```
+    0    False
+    1    False
+    2     True
+    3    False
+    4     True
+    5     True
+    6    False
+    dtype: bool
+    ```
+
+    代码:
+
+    ```Python
+    ser3.drop_duplicates()
+    ```
+
+    输出:
+
+    ```
+    0     apple
+    1    banana
+    3    pitaya
+    6    durian
+    dtype: object
+    ```
+
+    `Series`对象的`apply()`和`map()`方法非常重要,它们可以用于数据处理,把数据映射或转换成我们期望的样子,这个操作在数据分析的数据准备阶段非常重要。
 
     代码:
 
@@ -492,7 +577,7 @@ Series对象的常用属性如下表所示。
 
 - 排序和取头部值的方法
 
-    `Series`对象的`sort_index`和`sort_values`方法可以用于对索引和数据的排序,排序方法有一个名为`ascending`的布尔类型参数,该参数用于控制排序的结果是升序还是降序;而名为`kind`的参数则用来控制排序使用的算法,默认使用了`quicksort`,也可以选择`mergesort`或`heapsort`;如果存在空值,那么可以用`na_position`参数空值放在最前还是最后,默认是`last`,代码如下所示。
+    `Series`对象的`sort_index()`和`sort_values()`方法可以用于对索引和数据的排序,排序方法有一个名为`ascending`的布尔类型参数,该参数用于控制排序的结果是升序还是降序;而名为`kind`的参数则用来控制排序使用的算法,默认使用了`quicksort`,也可以选择`mergesort`或`heapsort`;如果存在空值,那么可以用`na_position`参数空值放在最前还是最后,默认是`last`,代码如下所示。
 
     代码:
     
@@ -536,7 +621,7 @@ ser8 = pd.Series(
     dtype: int64
     ```
     
-    如果要从`Series`对象中找出元素中最大或最小的“Top-N”,实际上是不需要对所有的值进行排序的,可以使用`nlargest`和`nsmallest`方法来完成,如下所示。
+    如果要从`Series`对象中找出元素中最大或最小的“Top-N”,实际上是不需要对所有的值进行排序的,可以使用`nlargest()`和`nsmallest()`方法来完成,如下所示。
     
     代码:
     
@@ -690,40 +775,61 @@ plt.show()
     输出:
 
     ```
-         name   birthday    company    score
+         name   birthday    company       score
     id				
-    1    杨效丰  1972-12    北京利德华福电气技术有限公司	 122.59
-    2    纪丰伟  1974-12    北京航天数据股份有限公司	   121.25
-    3    王永    1974-05	  品牌联盟(北京)咨询股份公司    118.96
-    4    杨静    1975-07	  中科专利商标代理有限责任公司  118.21
-    5    张凯江  1974-11	 北京阿里巴巴云计算技术有限公司 117.79
-    ...  ...    ...         ...        ...
-    6015 孙宏波  1978-08	 华为海洋网络有限公司北京科技分公司	 90.75
-    6016 刘丽香  1976-11	 福斯(上海)流体设备有限公司北京分公司  90.75
-    6017 周崧    1977-10	  赢创德固赛(中国)投资有限公司    90.75
-    6018 赵妍	   1979-07	  澳科利耳医疗器械(北京)有限公司  90.75
-    6019 贺锐	   1981-06	  北京宝洁技术有限公司    90.75
+    1    杨x    1972-12    北京利德xxxx	  122.59
+    2    纪x    1974-12    北京航天xxxx	  121.25
+    3    王x    1974-05	  品牌联盟xxxx    118.96
+    4    杨x    1975-07	  中科专利xxxx    118.21
+    5    张x    1974-11	  北京阿里xxxx    117.79
+    ...  ...    ...        ...            ...
+    6015 孙x    1978-08	  华为海洋xxxx	  90.75
+    6016 刘x    1976-11	  福斯流体xxxx    90.75
+    6017 周x    1977-10	  赢创德固xxxx    90.75
+    6018 赵x	   1979-07	  澳科利耳xxxx    90.75
+    6019 贺x	   1981-06	  北京宝洁xxxx    90.75
     6019 rows × 4 columns
     ```
 
-    > **说明**:如果需要上面例子中的CSV文件,可以通过下面的百度云盘地址进行获取。
-    >
-    > 链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g,提取码:e7b4。
-
+    > **说明**:如果需要上面例子中的CSV文件,可以通过下面的百度云盘地址进行获取。链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g,提取码:e7b4。
+    
 4. 读取Excel文件创建`DataFrame`对象。
 
-    可以通过`pandas` 模块的`read_excel`函数来读取Excel文件,该函数与上面的`read_csv`非常相近,多了一个`sheet_name`参数来指定数据表的名称,但是不同于CSV文件,没有`sep`或`delimiter`这样的参数。
+    可以通过`pandas` 模块的`read_excel`函数来读取Excel文件,该函数与上面的`read_csv`非常相近,多了一个`sheet_name`参数来指定数据表的名称,但是不同于CSV文件,没有`sep`或`delimiter`这样的参数。下面的代码中,`read_excel`函数的`skiprows`参数是一个Lambda函数,通过该Lambda函数指定只读取Excel文件的表头和其中10%的数据,跳过其他的数据。
 
     代码:
 
     ```Python
     import random
     
-    # 读取Excel文件并随机获取其中约5%的数据
     df4 = pd.read_excel(
-        io='某视频网站运营数据.xlsx',
-        skiprows=lambda x: x > 0 and random.random() > 0.05
+        io='小宝剑大药房2018年销售数据.xlsx',
+        usecols=['购药时间', '社保卡号', '商品名称', '销售数量', '应收金额', '实收金额'],
+        skiprows=lambda x: x > 0 and random.random() > 0.1
     )
+    df4
+    ```
+
+    > **说明**:如果需要上面例子中的Excel文件,可以通过下面的百度云盘地址进行获取。
+    >
+    > 链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g,提取码:e7b4。
+
+    输出:
+
+    ```
+        购药时间			社保卡号	    商品名称    销售数量	应收金额	实收金额
+    0	2018-03-23 星期三	10012157328		强力xx片	 1			13.8		13.80
+    1	2018-07-12 星期二	108207828	    强力xx片	 1	        13.8		13.80
+    2	2018-01-17 星期日	13358228	    清热xx液	 1		    28.0		28.00
+    3	2018-07-11 星期一	10031402228		三九xx灵	 5			149.0		130.00
+    4	2018-01-20 星期三	10013340328		三九xx灵	 3			84.0		73.92
+    ...	...					...				...		...			...			...
+    618	2018-03-05 星期六	10066059228		开博xx通	 2			56.0		49.28
+    619	2018-03-22 星期二	10035514928		开博xx通	 1			28.0		25.00
+    620	2018-04-15 星期五	1006668328	    开博xx通	 2			56.0		50.00
+    621	2018-04-24 星期日	10073294128		高特xx灵	 1			5.6			5.60
+    622	2018-04-24 星期日	10073294128		高特xx灵	 10			56.0		56.0
+    623 rows × 6 columns
     ```
 
 5. 通过SQL从数据库读取数据创建`DataFrame`对象。
@@ -743,7 +849,7 @@ plt.show()
     df5
     ```
 
-    > **提示**:执行上面的代码需要先安装`pymysql`库,如果尚未安装,可以先在Notebook的单元格中先执行`!pip install pymysql`,然后再运行上面的代码。上面的代码连接的是我部署在阿里云上的MySQL数据库,公网IP地址:`47.104.31.138`,用户名:`guest`,密码:`Guest.618`。
+    > **提示**:执行上面的代码需要先安装`pymysql`库,如果尚未安装,可以先在Notebook的单元格中先执行`!pip install pymysql`,然后再运行上面的代码。上面的代码连接的是我部署在阿里云上的MySQL数据库,公网IP地址:`47.104.31.138`,用户名:`guest`,密码:`Guest.618`,数据库:`hrs`,表名:`tb_emp`,字符集:`utf8mb4`
 
     输出:
 
@@ -808,11 +914,18 @@ dtypes: float64(2), int64(2), object(2)
 memory usage: 1.3+ KB
 ```
 
+如果需要查看`DataFrame`的头部或尾部的数据,可以使用`head()`或`tail()`方法,这两个方法的默认参数是`5`,表示获取`DataFrame`最前面5行或最后面5行的数据。如果需要获取数据的描述性统计信息,可以使用`describe()`方法,该方法跟`Series`对象的`describe()`方法类似,只是默认会作用到`DataFrame`所有数值型的列上。
+
 #### 获取数据
 
 1. 索引和切片
 2. 数据筛选
 
+#### 重塑数据
+
+1. `concat`函数
+2. `merge`函数
+
 #### 数据处理
 
 1. 数据清洗
@@ -823,9 +936,6 @@ memory usage: 1.3+ KB
     - `apply`和`applymap`方法
     - 字符串向量
     - 时间日期向量
-3. 数据合并
-    - `concat`函数
-    - `merge`函数
 
 #### 数据分析
 
@@ -840,7 +950,13 @@ memory usage: 1.3+ KB
 1. 用`plot`方法出图
 2. 其他方法
 
+#### 其他方法
+
+1. 独热编码
+2. 窗口计算
+3. 相关性
 
+### Index的应用
 
 
 

+ 1 - 1
Day91-100/98.项目部署上线和性能调优.md

@@ -59,7 +59,7 @@
 1. 安装底层依赖库。
 
    ```Shell
-   yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel libdb4-devel libpcap-devel xz-devel libffi-devel
+   yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel libdb4-devel libpcap-devel xz-devel libffi-devel libxml2
    ```
 
 2. 下载Python源代码。