### Python 宿
#### 221 èªå¨ç¾¤åé®ä»¶
Pythonèªå¨ç¾¤åé®ä»¶
```python
import smtplib
from email import (header)
from email.mime import (text, application, multipart)
import time
def sender_mail():
smt_p = smtplib.SMTP()
smt_p.connect(host='smtp.qq.com', port=25)
sender, password = '[email protected]', "**************"
smt_p.login(sender, password)
receiver_addresses, count_num = [
'[email protected]', '[email protected]'], 1
for email_address in receiver_addresses:
try:
msg = multipart.MIMEMultipart()
msg['From'] = "zhenguo"
msg['To'] = email_address
msg['subject'] = header.Header('è¿æ¯é®ä»¶ä¸»é¢éç¥', 'utf-8')
msg.attach(text.MIMEText(
'è¿æ¯ä¸å°æµè¯é®ä»¶ï¼è¯·å¿å夿¬é®ä»¶~', 'plain', 'utf-8'))
smt_p.sendmail(sender, email_address, msg.as_string())
time.sleep(10)
print('第%d次åéç»%s' % (count_num, email_address))
count_num = count_num + 1
except Exception as e:
print('第%d次ç»%såéé®ä»¶å¼å¸¸' % (count_num, email_address))
continue
smt_p.quit()
sender_mail()
```
注æï¼
åéé®ç®±æ¯qqé®ç®±ï¼æä»¥è¦å¨qqé®ç®±ä¸è®¾ç½®å¼å¯SMTPæå¡ï¼è®¾ç½®å®ææ¶ä¼çæä¸ä¸ªææç ï¼å°è¿ä¸ªææç èµå¼ç»æä¸ç`password`åé
#### 222 äºåæç´¢
äºåæç´¢æ¯ç¨åºåå¿
å¤çç®æ³ï¼æ 论ä»ä¹åºåï¼é½è¦é常çç»å°ååºæ¥ã
å°ä¾åæè¿°ï¼
å¨**æåºæ°ç»**`arr`ä¸ï¼æå®åºé´`[left,right]`èå´å
ï¼æ¥æ¾å
ç´ `x`
妿ä¸åå¨ï¼è¿å`-1`
äºåæç´¢`binarySearch`å®ç°ç主é»è¾
```python
def binarySearch(arr, left, right, x):
while left <= right:
mid = int(left + (right - left) / 2); # æ¾å°ä¸é´ä½ç½®ãæ±ä¸ç¹åæ(left+right)/2æ´å®¹ææº¢åºï¼æä»¥ä¸å»ºè®®è¿æ ·å
# æ£æ¥xæ¯å¦åºç°å¨ä½ç½®mid
if arr[mid] == x:
print('found %d å¨ç´¢å¼ä½ç½®%d å¤' %(x,mid))
return mid
# åå¦xæ´å¤§ï¼åä¸å¯è½åºç°å¨å·¦åé¨å
elif arr[mid] < x:
left = mid + 1 #æç´¢åºé´å为[mid+1,right]
print('åºé´ç¼©å°ä¸º[%d,%d]' %(mid+1,right))
# åçï¼åå¦xæ´å°ï¼åä¸å¯è½åºç°å¨å³åé¨å
elif x
```python
import requests
from lxml import etree
import pandas as pd
import re
url = 'http://www.weather.com.cn/weather1d/101010100.shtml#input'
with requests.get(url) as res:
content = res.content
html = etree.HTML(content)
```
éè¿lxml模åæåå¼
lxmlæ¯beautifulsoupè§£æå¨æäºåºåæ´é«æ
```python
location = html.xpath('//*[@id="around"]//a[@target="_blank"]/span/text()')
temperature = html.xpath('//*[@id="around"]/div/ul/li/a/i/text()')
```
ç»æï¼
```python
['馿²³', 'æ¶¿å·', 'åå±±', 'æ²§å·', '天津', 'å»å', '太å', 'ç³å®¶åº', '涿鹿', 'å¼ å®¶å£', 'ä¿å®', '䏿²³', 'å京ååº', 'å京å½åç', 'ä¸å½å°è´¨åç©é¦', 'æåå
¬
å', 'æåå¢éåå
¬å', 'å京å¸è§åå±è§é¦', 'ä»å¹æµ·', 'åé£é¼å··', '天åå
¬å', 'åæµ·å
¬å', 'æ¯å±±å
¬å', 'å京海æ´é¦']
['11/-5°C', '14/-5°C', '12/-6°C', '12/-5°C', '11/-1°C', '11/-5°C', '8/-7°C', '13/-2°C', '8/-6°C', '5/-9°C', '14/-6°C', '11/-4°C', '13/-3°C'
, '13/-3°C', '12/-3°C', '12/-3°C', '13/-3°C', '12/-2°C', '12/-3°C', '13/-3°C', '12/-2°C', '12/-2°C', '12/-2°C', '12/-3°C']
```
æé DataFrame对象
```python
df = pd.DataFrame({'location':location, 'temperature':temperature})
print('温度å')
print(df['temperature'])
```
æ£åè§£ææ¸©åº¦å¼
```python
df['high'] = df['temperature'].apply(lambda x: int(re.match('(-?[0-9]*?)/-?[0-9]*?°C', x).group(1) ) )
df['low'] = df['temperature'].apply(lambda x: int(re.match('-?[0-9]*?/(-?[0-9]*?)°C', x).group(1) ) )
print(df)
```
详ç»è¯´æåå符åæè·
é¤äºç®åå°å¤ææ¯å¦å¹é
ä¹å¤ï¼æ£å表达å¼è¿ææåå串ç强大åè½ãç¨`()`表示çå°±æ¯è¦æåçåç»ï¼groupï¼ãæ¯å¦ï¼`^(\d{3})-(\d{3,8})$`åå«å®ä¹äºä¸¤ä¸ªç»ï¼å¯ä»¥ç´æ¥ä»å¹é
çåç¬¦ä¸²ä¸æååºåºå·åæ¬å°å·ç
```python
m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
print(m.group(0))
print(m.group(1))
print(m.group(2))
# 010-12345
# 010
# 12345
```
妿æ£å表达å¼ä¸å®ä¹äºç»ï¼å°±å¯ä»¥å¨`Match`对象ä¸ç¨`group()`æ¹æ³æååºå串æ¥ã
注æå°`group(0)`æ°¸è¿æ¯åå§å符串ï¼`group(1)`ã`group(2)`â¦â¦è¡¨ç¤ºç¬¬1ã2ãâ¦â¦ä¸ªå串ã
æç»ç»æ
```kepython
Name: temperature, dtype: object
location temperature high low
0 馿²³ 11/-5°C 11 -5
1 æ¶¿å· 14/-5°C 14 -5
2 åå±± 12/-6°C 12 -6
3 æ²§å· 12/-5°C 12 -5
4 天津 11/-1°C 11 -1
5 å»å 11/-5°C 11 -5
6 太å 8/-7°C 8 -7
7 ç³å®¶åº 13/-2°C 13 -2
8 涿鹿 8/-6°C 8 -6
9 å¼ å®¶å£ 5/-9°C 5 -9
10 ä¿å® 14/-6°C 14 -6
11 䏿²³ 11/-4°C 11 -4
12 å京ååº 13/-3°C 13 -3
13 å京å½åç 13/-3°C 13 -3
14 ä¸å½å°è´¨åç©é¦ 12/-3°C 12 -3
15 æåå
¬å 12/-3°C 12 -3
16 æåå¢éåå
¬å 13/-3°C 13 -3
17 å京å¸è§åå±è§é¦ 12/-2°C 12 -2
18 ä»å¹æµ· 12/-3°C 12 -3
19 åé£é¼å·· 13/-3°C 13 -3
20 天åå
¬å 12/-2°C 12 -2
21 åæµ·å
¬å 12/-2°C 12 -2
22 æ¯å±±å
¬å 12/-2°C 12 -2
23 å京海æ´é¦ 12/-3°C 12 -3
```
### åãæ°æ®åæ
æ¬é¡¹ç®åºäºKaggleçµå½±å½±è¯æ°æ®éï¼éè¿è¿ä¸ªç³»åï¼ä½ å°å¦å°å¦ä½è¿è¡æ°æ®æ¢ç´¢æ§åæ(EDA)ï¼å¦ä¼ä½¿ç¨æ°æ®åæå©å¨`pandas`ï¼ä¼ç¨ç»å¾å
`pyecharts`ï¼ä»¥åEDAæ¶å¯è½éå°çåç§å®é
é®é¢åä¸äºå¤çæå·§ã
æ¬é¡¹ç®éè¦å¯¼å
¥çå
ï¼
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pyecharts.charts import Bar,Grid,Line
import pyecharts.options as opts
from pyecharts.globals import ThemeType
```
#### 1 å建DataFrame
pandasä¸ä¸ä¸ªdataFrameå®ä¾ï¼
```python
Out[89]:
a val
0 apple1 1.0
1 apple2 2.0
2 apple3 3.0
3 apple4 4.0
4 apple5 5.0
```
æä»¬ç**ç®æ **æ¯å为å¦ä¸ç»æï¼
```python
a apple1 apple2 apple3 apple4 apple5
0 1.0 2.0 3.0 4.0 5.0
```
ä¹çå¯ä½¿ç¨`pivot`ï¼ä½å¾é¾ä¸æ¥å°ä½ã
æä»¥å¦è¾è¹å¾ï¼æä¾ä¸ç§ç®åä¸å¥½çè§£çæ¹æ³ï¼
```python
In [113]: pd.DataFrame(index=[0],columns=df.a,data=dict(zip(df.a,df.val)))
Out[113]:
a apple1 apple2 apple3 apple4 apple5
0 1.0 2.0 3.0 4.0 5.0
```
以䏿¹æ³æ¯éæ°å建ä¸ä¸ªDataFrame,ç´æ¥æ`df.a`ææå¯è½åå¼ä½ä¸ºæ°dataframeçåï¼indexè°æ´ä¸º`[0]`ï¼æ³¨æç±»åå¿
é¡»æ¯æ°ç»ç±»å(array-like æè
Index)ï¼ä¸¤ä¸ªè½´ç¡®å®åï¼`data`å¡«å
æ°æ®åã
```python
In [116]: dict(zip(df.a,df.val))
Out[116]: {'apple1': 1.0, 'apple2': 2.0, 'apple3': 3.0, 'apple4': 4.0, 'apple5': 5.0}
```
#### 2 导å
¥æ°æ®
æ°æ®æ¥èªkaggleï¼å
±å
æ¬ä¸ä¸ªæä»¶ï¼
1. movies.dat
2. ratings.dat
3. users.dat
`movies.dat`å
æ¬ä¸ä¸ªå段ï¼['Movie ID', 'Movie Title', 'Genre']
使ç¨pandas导å
¥æ¤æä»¶ï¼
```python
import pandas as pd
movies = pd.read_csv('./data/movietweetings/movies.dat', delimiter='::', engine='python', header=None, names = ['Movie ID', 'Movie Title', 'Genre'])
```
导å
¥åï¼æ¾ç¤ºå5è¡ï¼
```python
Movie ID Movie Title \
0 8 Edison Kinetoscopic Record of a Sneeze (1894)
1 10 La sortie des usines Lumiç«re (1895)
2 12 The Arrival of a Train (1896)
3 25 The Oxford and Cambridge University Boat Race ...
4 91 Le manoir du diable (1896)
5 131 Une nuit terrible (1896)
6 417 Le voyage dans la lune (1902)
7 439 The Great Train Robbery (1903)
8 443 Hiawatha, the Messiah of the Ojibway (1903)
9 628 The Adventures of Dollie (1908)
Genre
0 Documentary|Short
1 Documentary|Short
2 Documentary|Short
3 NaN
4 Short|Horror
5 Short|Comedy|Horror
6 Short|Action|Adventure|Comedy|Fantasy|Sci-Fi
7 Short|Action|Crime|Western
8 NaN
9 Action|Short
```
次导å
¥å
¶ä»ä¸¤ä¸ªæ°æ®æä»¶
`users.dat`:
```python
users = pd.read_csv('./data/movietweetings/users.dat', delimiter='::', engine='python', header=None, names = ['User ID', 'Twitter ID'])
print(users.head())
```
ç»æï¼
```python
User ID Twitter ID
0 1 397291295
1 2 40501255
2 3 417333257
3 4 138805259
4 5 2452094989
5 6 391774225
6 7 47317010
7 8 84541461
8 9 2445803544
9 10 995885060
```
`rating.data`:
```python
ratings = pd.read_csv('./data/movietweetings/ratings.dat', delimiter='::', engine='python', header=None, names = ['User ID', 'Movie ID', 'Rating', 'Rating Timestamp'])
print(ratings.head())
```
ç»æï¼
```python
User ID Movie ID Rating Rating Timestamp
0 1 111161 10 1373234211
1 1 117060 7 1373415231
2 1 120755 6 1373424360
3 1 317919 6 1373495763
4 1 454876 10 1373621125
5 1 790724 8 1374641320
6 1 882977 8 1372898763
7 1 1229238 9 1373506523
8 1 1288558 5 1373154354
9 1 1300854 8 1377165712
```
**read_csv 使ç¨è¯´æ**
说æï¼æ¬æ¬¡å¯¼å
¥`dat`æä»¶ä½¿ç¨`pandas.read_csv`彿°ã
第ä¸ä¸ªä½ç½®åæ°`./data/movietweetings/ratings.dat` 表示æä»¶çç¸å¯¹è·¯å¾
第äºä¸ªå
³é®ååæ°ï¼`delimiter='::'`ï¼è¡¨ç¤ºæä»¶åé符使ç¨`::`
åé¢å 个å
³é®ååæ°åå«ä»£è¡¨ä½¿ç¨çå¼æï¼æä»¶æ²¡æè¡¨å¤´ï¼æä»¥`header`为`None;`
导å
¥ådataframeçåå使ç¨`names`å
³é®å设置ï¼è¿ä¸ªåæ°å¤§å®¶å¯ä»¥è®°ä½ï¼æ¯è¾æç¨ã
Kaggleçµå½±æ°æ®é第ä¸èï¼æä»¬ä½¿ç¨æ°æ®å¤çå©å¨ `pandas`ï¼ å½æ°`read_csv` 导å
¥ç»å®çä¸ä¸ªæ°æ®æä»¶ã
```python
import pandas as pd
movies = pd.read_csv('./data/movietweetings/movies.dat', delimiter='::', engine='python', header=None, names = ['Movie ID', 'Movie Title', 'Genre'])
users = pd.read_csv('./data/movietweetings/users.dat', delimiter='::', engine='python', header=None, names = ['User ID', 'Twitter ID'])
ratings = pd.read_csv('./data/movietweetings/ratings.dat', delimiter='::', engine='python', header=None, names = ['User ID', 'Movie ID', 'Rating', 'Rating Timestamp'])
```
ç¨å°ç`read_csv`ï¼æäºéè¦çåæ°ï¼å¦ä½ä½¿ç¨å¨ä¸ä¸è乿ææå°ãä¸é¢å¼å§æ°æ®æ¢ç´¢åæ(EDA)
> æ¾åºå¾åå10åå§(comedy)
#### 3 å¤çç»åå¼
表`movies`åæ®µ`Genre`表示çµå½±çç±»åï¼å¯è½æå¤ä¸ªå¼ï¼åé符为`|`ï¼åå¼ä¹å¯è½ä¸º`None`.
é对è¿ç±»å段åå¼ï¼å¯ä½¿ç¨Pandasä¸Seriesæä¾ç`str`å䏿¥è½¬åï¼**注æå®æ¯åé级ç**ï¼ä¸ä¸æ¥ï¼å¦Pythonåçç`str`类似ï¼ä½¿ç¨`contains`夿æ¯å¦å«æ`comedy`å符串ï¼
```python
mask = movies.Genre.str.contains('comedy',case=False,na=False)
```
注æä½¿ç¨çä¸¤ä¸ªåæ°ï¼`case`, `na`
case为 Falseï¼è¡¨ç¤ºå¯¹å¤§å°å䏿æï¼
na Genreåæä¸ªåå
æ ¼ä¸º`NaN`æ¶ï¼æä»¬ä½¿ç¨çå
å¡«å¼ï¼æ¤å¤å¡«å
为`False`
è¿åç`mask`æ¯ä¸ç»´ç`Series`ï¼ç»æä¸ movies.Genreç¸åï¼åå¼ä¸ºTrue æ False.
è§å¯ç»æï¼
```python
0 False
1 False
2 False
3 False
4 False
5 True
6 True
7 False
8 False
9 False
Name: Genre, dtype: bool
```
#### 4 è®¿é®æå
å¾å°æ©ç maskåï¼pandasé常æ¹ä¾¿å°è½æååºç®æ è®°å½ï¼
```python
comedy = movies[mask]
comdey_ids = comedy['Movie ID']
```
以ä¸ï¼å¨pandasä¸è¢«æé¢ç使ç¨ï¼ä¸åè§£éãçç»æ`comedy_ids.head()`ï¼
```python
5 131
6 417
15 2354
18 3863
19 4099
20 4100
21 4101
22 4210
23 4395
25 4518
Name: Movie ID, dtype: int64
```
1-4ä»ç»`æ°æ®è¯»å
¥`ï¼`å¤çç»åå¼`ï¼`ç´¢å¼æ°æ®`ç, pandasä¸ä½¿ç¨è¾å¤ç彿°ï¼åºäºKaggleçå®çµå½±å½±è¯æ°æ®éï¼æåå¾å°ææ`åå§ ID`ï¼
```python
5 131
6 417
15 2354
18 3863
19 4099
20 4100
21 4101
22 4210
23 4395
25 4518
Name: Movie ID, dtype: int64
```
ä¸é¢ç»§ç»æ°æ®æ¢ç´¢ä¹æ
~
#### 5 è¿æ¥ä¸¤ä¸ªè¡¨
æ¿å°ææåå§çIDåï¼è¦æ³æ¾åºå
¶ä¸å¹³åå¾åæé«çå10åå§ï¼éè¦å
³èå¦ä¸å¼ 表ï¼`ratings`:
åå顾ä¸ratingsè¡¨ç»æï¼
```python
User ID Movie ID Rating Rating Timestamp
0 1 111161 10 1373234211
1 1 117060 7 1373415231
2 1 120755 6 1373424360
3 1 317919 6 1373495763
4 1 454876 10 1373621125
5 1 790724 8 1374641320
6 1 882977 8 1372898763
7 1 1229238 9 1373506523
8 1 1288558 5 1373154354
9 1 1300854 8 1377165712
```
pandas ä¸ä½¿ç¨`join`å
³èä¸¤å¼ è¡¨ï¼è¿æ¥å段æ¯`Movie ID`ï¼å¦æé¡ºå
¶èªç¶è¿ä¹ä½¿ç¨`join`ï¼
```python
combine = ratings.join(comedy, on='Movie ID', rsuffix='2')
```
左峿»å¨ï¼æ¥ç宿´ä»£ç
大家å¯éªè¯è¿ç§åæ³ï¼ä»ç»ä¸çï¼ä¼åç°ç»æé常诡å¼ã
ç©¶å
¶åå ï¼è¿æ¯pandas join彿°ä½¿ç¨çä¸ä¸ªç®æ¯åç¹ï¼å®å¨å®æ¡£ä¸ä»ç»ï¼è¿æ¥å³è¡¨æ¶ï¼æ¤å¤å³è¡¨æ¯`comedy`ï¼å®ç`index`è¦æ±æ¯è¿æ¥å段ï¼ä¹å°±æ¯ `Movie ID`.
左表çindexä¸è¦æ±ï¼ä½æ¯è¦å¨åæ° `on`ä¸ç»å®ã
**以䏿¯è¦æ³¨æçä¸ç¹**
ä¿®æ¹ä¸ºï¼
```python
combine = ratings.join(comedy.set_index('Movie ID'), on='Movie ID')
print(combine.head(10))
```
以䏿¯OKçåæ³
è§å¯ç»æï¼
```python
User ID Movie ID Rating Rating Timestamp Movie Title Genre
0 1 111161 10 1373234211 NaN NaN
1 1 117060 7 1373415231 NaN NaN
2 1 120755 6 1373424360 NaN NaN
3 1 317919 6 1373495763 NaN NaN
4 1 454876 10 1373621125 NaN NaN
5 1 790724 8 1374641320 NaN NaN
6 1 882977 8 1372898763 NaN NaN
7 1 1229238 9 1373506523 NaN NaN
8 1 1288558 5 1373154354 NaN NaN
9 1 1300854 8 1377165712 NaN NaN
```
Genreå为`NaN`表æï¼è¿ä¸æ¯åå§ãéè¦çéåºæ¤åä¸ä¸º`NaN` çè®°å½ã
#### 6 æåçé
pandasææ¹ä¾¿çå°æ¹ï¼å°±æ¯åéåè¿ç®ï¼å°½å¯è½åå°äºfor循ç¯çåµå¥ã
æåçéè¿ç§å¸¸è§éæ±ï¼èªç¶å¯ä»¥è½»æ¾åºå¯¹ã
为äºç
§é¡¾å次æ¥è§¦ pandas çæåï¼å两æ¥å»åï¼
```python
mask = pd.notnull(combine['Genre'])
```
ç»ææ¯ä¸ååªå«`True æ False`çå¼
```python
result = combine[mask]
print(result.head())
```
ç»æä¸ï¼Genreåæ®µä¸è³å°å«æä¸ä¸ªComedyå符串ï¼è¡¨æéªè¯äºæä»¬ä»¥ä¸æä½æ¯OKçã
```python
User ID Movie ID Rating Rating Timestamp Movie Title \
12 1 1588173 9 1372821281 Warm Bodies (2013)
13 1 1711425 3 1372604878 21 & Over (2013)
14 1 2024432 8 1372703553 Identity Thief (2013)
17 1 2101441 1 1372633473 Spring Breakers (2012)
28 2 1431045 7 1457733508 Deadpool (2016)
Genre
12 Comedy|Horror|Romance
13 Comedy
14 Adventure|Comedy|Crime|Drama
17 Comedy|Crime|Drama
28 Action|Adventure|Comedy|Sci-Fi
```
æªæ¢ç®åå·²ç»æ±åºææåå§çµå½±`result`ï¼å5è¡å¦ä¸ï¼Genreä¸é½å«æ`Comedy`å符串ï¼
```python
User ID Movie ID Rating Rating Timestamp Movie Title \
12 1 1588173 9 1372821281 Warm Bodies (2013)
13 1 1711425 3 1372604878 21 & Over (2013)
14 1 2024432 8 1372703553 Identity Thief (2013)
17 1 2101441 1 1372633473 Spring Breakers (2012)
28 2 1431045 7 1457733508 Deadpool (2016)
Genre
12 Comedy|Horror|Romance
13 Comedy
14 Adventure|Comedy|Crime|Drama
17 Comedy|Crime|Drama
28 Action|Adventure|Comedy|Sci-Fi
```
#### 7 æç
§Movie ID åç»
resultä¸ä¼æå¾å¤è§ä¼å¯¹åä¸é¨çµå½±çæåï¼æä»¥è¦æ±å¾åå10çåå§ï¼å
æç
§`Movie ID`åç»ï¼ç¶åæ±åºå¹³åå¼ï¼
```python
score_as_movie = result.groupby('Movie ID').mean()
```
å5è¡æ¾ç¤ºå¦ä¸ï¼
```python
User ID Rating Rating Timestamp
Movie ID
131 34861.000000 7.0 1.540639e+09
417 34121.409091 8.5 1.458680e+09
2354 6264.000000 8.0 1.456343e+09
3863 43803.000000 10.0 1.430439e+09
4099 25084.500000 7.0 1.450323e+09
```
#### 8 æç
§çµå½±å¾åæåº
```python
score_as_movie.sort_values(by='Rating', ascending = False,inplace=True)
score_as_movie
```
å5è¡æ¾ç¤ºå¦ä¸ï¼
```python
User ID Rating Rating Timestamp
Movie ID
7134690 30110.0 10.0 1.524974e+09
416889 1319.0 10.0 1.543320e+09
57840 23589.0 10.0 1.396802e+09
5693562 50266.0 10.0 1.511024e+09
5074 43803.0 10.0 1.428352e+09
```
齿¯æ»¡åï¼è¿æç¹å¥æªï¼ä¼ä¸ä¼è¿äºçµå½±é½åªæå 个人è¯åï¼çè³åªæ1个ï¼è¯åæ ·æ¬ä¸ªæ°å¤ªå°ï¼æ¾ç¶æç»çå¹³ååæ°ä¸å
·æå¤ªå¼ºç说æåã
æä»¥ï¼ä¸é¢è¦è¿è¡æ¯é¨çµå½±çè¯å人æ°ç»è®¡
#### 9 åç»å使ç¨èå彿°
æ ¹æ®`Movie ID`åç»åï¼ä½¿ç¨`count`彿°ç»è®¡`æ¯ç»ä¸ªæ°`ï¼åªä¿çcountåï¼æåå¾å°`watchs2`:
```python
watchs = result.groupby('Movie ID').agg(['count'])
watchs2 = watchs['Rating']['count']
```
æå°å20è¡ï¼
```python
print(watchs2.head(20))
```
ç»æï¼
```python
Movie ID
131 1
417 22
2354 1
3863 1
4099 2
4100 1
4101 1
4210 1
4395 1
4518 1
4546 2
4936 2
5074 1
5571 1
6177 1
6414 3
6684 1
6689 1
7145 1
7162 2
Name: count, dtype: int64
```
æç¶ï¼ç«ç¶æè¿ä¹å¤çµå½±çè¯è®ºæ°åªæ1æ¬¡ï¼æ ·æ¬ä¸ªæ°å¤ªå°ï¼è¯è®ºçå¹³åå¼ä¹å°±æ²¡æä»ä¹è¯´æåã
æ¥ç`watchs2`ä¸äºéè¦ç»è®¡éï¼
```python
watchs2.describe()
```
ç»æï¼
```python
count 10740.000000
mean 20.192086
std 86.251411
min 1.000000
25% 1.000000
50% 2.000000
75% 7.000000
max 1843.000000
Name: count, dtype: float64
```
å
±æ10740é¨**åå§**çµå½±è¢«è¯åï¼å¹³åæå次æ°20æ¬¡ï¼æ åå·®86ï¼75%ççµå½±æ ·æ¬æå次æ°å°äº7æ¬¡ï¼æå°1æ¬¡ï¼æå¤1843次ã
#### 10 é¢çåå¸ç´æ¹å¾
ç»å¶è¯è®ºæ°çé¢çåå¸ç´æ¹å¾ï¼ä¾¿äºæ´ç´è§çè§å¯çµå½±è¢«è¯è®ºçå叿
åµãä¸é¢åæå°ï¼75%ççµå½±æå次æ°å°äº7æ¬¡ï¼æä»¥ç»å¶æå次æ°å°äº20次çç´æ¹å¾ï¼
```python
fig = plt.figure(figsize=(12,8))
histn = plt.hist(watchs2[watchs2 <=19],19,histtype='step')
plt.scatter([i+1 for i in range(len(histn[0]))],histn[0])
```

`histn`å
ç¥è¡¨ç¤ºä¸ªæ°å对åºç被åå²çåºé´ï¼æ¥ç`histn[0]`:
```python
array([4383., 1507., 787., 541., 356., 279., 209., 163., 158.,
118., 114., 90., 104., 81., 80., 73., 62., 65.,
52.])
```
```python
sum(histn[0]) # 9222
```
çå°çµå½±è¯è®ºæ¬¡æ°1å°19次çåå§çµå½±9222é¨ï¼å
±æ10740é¨åå§çµå½±ï¼å¤§çº¦`86%`çåå§çµå½±è¯è®ºæ¬¡æ°`å°äº20次`ï¼æ`1518`é¨çµå½±è¯è®ºæ°ä¸å°äº20次ã
æä»¬è¯å®å¸ææéåºè¢«è¯è®ºæ¬¡æ°å°½å¯è½å¤ççµå½±ï¼å 为é¾å
ä¼ææ°´ååæ»¥ç«½å
æ°ç`å¼å¸¸è¯è®º`è¡ä¸ºãé£ä¹ï¼å¦ä½åç¡®çéåæå°æ½æ ·éå¢ï¼
#### 11 æå°æ½æ ·é
æ ¹æ®ç»è®¡å¦çç¥è¯ï¼æå°æ½æ ·éåZå¼ãæ ·æ¬æ¹å·®åæ ·æ¬è¯¯å·®ç¸å
³ï¼ä¸é¢ç»åºå
·ä½çæ±è§£æå°æ ·æ¬éçè®¡ç®æ¹æ³ã
éç¨å¦ä¸è®¡ç®å
¬å¼ï¼
$$ n = \frac{Z^2\sigma^2}{E^2} $$
æ¤å¤ï¼$Z$ å¼å为95%ç置信度对åºçZå¼ä¹å°±æ¯1.96ï¼æ ·æ¬è¯¯å·®å为åå¼ç2.5%.
æ ¹æ®ä»¥ä¸å
¬å¼ï¼ç¼åä¸é¢ä»£ç ï¼
```python
n3 = result.groupby('Movie ID').agg(['count','mean','std'])
n3r = n3[n3['Rating']['count']>=20]['Rating']
```
åªè®¡ç®å½±è¯è¶
è¿20次ï¼ä¸æ»¡è¶³æå°æ ·æ¬éççµå½±ã计ç®å¾å°ç`n3r`å5è¡ï¼
```python
count mean std
Movie ID
417 22 8.500000 1.263027
12349 68 8.485294 1.227698
15324 20 8.350000 1.039990
15864 51 8.431373 1.374844
17925 44 8.636364 1.259216
```
è¿ä¸æ¥æ±åºæå°æ ·æ¬éï¼
```python
nmin = (1.96**2*n3r['std']**2) / ( (n3r['mean']*0.025)**2 )
```
`nmin`å5è¡ï¼
```python
Movie ID
417 135.712480
12349 128.671290
15324 95.349276
15864 163.434005
17925 130.668350
```
çéåºæ»¡è¶³æå°æ½æ ·éçåå§çµå½±ï¼
```python
n3s = n3r[ n3r['count'] >= nmin ]
```
ç»ææ¾ç¤ºå¦ä¸ï¼å æ¤å
±æ`173`é¨çµå½±æ»¡è¶³æå°æ ·æ¬æ½æ ·éã
```python
count mean std
Movie ID
53604 129 8.635659 1.230714
57012 207 8.449275 1.537899
70735 224 8.839286 1.190799
75686 209 8.095694 1.358885
88763 296 8.945946 1.026984
... ... ... ...
6320628 860 7.966279 1.469924
6412452 276 7.510870 1.389529
6662050 22 10.000000 0.000000
6966692 907 8.673649 1.286455
7131622 1102 7.851180 1.751500
173 rows à 3 columns
```
#### 12 å»éåè¿è¡¨
æç
§å¹³åå¾åä»å¤§å°å°æåºï¼
```python
n3s_sort = n3s.sort_values(by='mean',ascending=False)
```
ç»æï¼
```python
count mean std
Movie ID
6662050 22 10.000000 0.000000
4921860 48 10.000000 0.000000
5262972 28 10.000000 0.000000
5512872 353 9.985836 0.266123
3863552 199 9.010050 1.163372
... ... ... ...
1291150 647 6.327666 1.785968
2557490 546 6.307692 1.858434
1478839 120 6.200000 0.728761
2177771 485 6.150515 1.523922
1951261 1091 6.083410 1.736127
173 rows à 3 columns
```
ä»
é `Movie ID`è¿æ¯ä¸ç¥éåªäºçµå½±ï¼è¿æ¥`movies`表ï¼
```python
ms = movies.drop_duplicates(subset=['Movie ID'])
ms = ms.set_index('Movie ID')
n3s_final = n3s_drops.join(ms,on='Movie ID')
```
#### 13 ç»æåæ
åå§æ¦åå50åï¼
```python
Movie Title
Five Minutes (2017)
MSG 2 the Messenger (2015)
Avengers: Age of Ultron Parody (2015)
Be Somebody (2016)
Bajrangi Bhaijaan (2015)
Back to the Future (1985)
La vita é?bella (1997)
The Intouchables (2011)
The Sting (1973)
Coco (2017)
Toy Story 3 (2010)
3 Idiots (2009)
Green Book (2018)
Dead Poets Society (1989)
The Apartment (1960)
P.K. (2014)
The Truman Show (1998)
Amé¼å¨ie (2001)
Inside Out (2015)
Toy Story 4 (2019)
Toy Story (1995)
Finding Nemo (2003)
Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb (1964)
Home Alone (1990)
Zootopia (2016)
Up (2009)
Monsters, Inc. (2001)
La La Land (2016)
Relatos salvajes (2014)
En man som heter Ove (2015)
Snatch (2000)
Lock, Stock and Two Smoking Barrels (1998)
How to Train Your Dragon 2 (2014)
As Good as It Gets (1997)
Guardians of the Galaxy (2014)
The Grand Budapest Hotel (2014)
Fantastic Mr. Fox (2009)
Silver Linings Playbook (2012)
Sing Street (2016)
Deadpool (2016)
Annie Hall (1977)
Pride (2014)
In Bruges (2008)
Big Hero 6 (2014)
Groundhog Day (1993)
The Breakfast Club (1985)
Little Miss Sunshine (2006)
Deadpool 2 (2018)
The Terminal (2004)
```
å10åè¯è®ºæ°å¾ï¼

代ç ï¼
```python
x = n3s_final['Movie Title'][:10].tolist()[::-1]
y = n3s_final['count'][:10].tolist()[::-1]
bar = (
Bar()
.add_xaxis(x)
.add_yaxis('è¯è®ºæ°',y,category_gap='50%')
.reversal_axis()
.set_global_opts(title_opts=opts.TitleOpts(title="åå§çµå½±è¢«è¯è®ºæ¬¡æ°"),
toolbox_opts=opts.ToolboxOpts(),)
)
grid = (
Grid(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add(bar, grid_opts=opts.GridOpts(pos_left="30%"))
)
grid.render_notebook()
```
å10åå¾åå¾ï¼

代ç ï¼
```python
x = n3s_final['Movie Title'][:10].tolist()[::-1]
y = n3s_final['mean'][:10].round(3).tolist()[::-1]
bar = (
Bar()
.add_xaxis(x)
.add_yaxis('å¹³åå¾å',y,category_gap='50%')
.reversal_axis()
.set_global_opts(title_opts=opts.TitleOpts(title="åå§çµå½±å¹³åå¾å"),
xaxis_opts=opts.AxisOpts(min_=8.0,name='å¹³åå¾å'),
toolbox_opts=opts.ToolboxOpts(),)
)
grid = (
Grid(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))
.add(bar, grid_opts=opts.GridOpts(pos_left="30%"))
)
grid.render_notebook()
```
#### 14 çæååé
åç±»åéçæ°å¼åï¼æ¯æå°æä¸¾ç±»åé转å为indicatoråéæç§°dummyåéã
é£ä¹ä»ä¹æ¯`indicatoråé`ï¼ççå¦ä¸ä¾åï¼Aåéè§£æä¸ºï¼`[1,0,0]`, Bè§£æä¸ºï¼`[0,1,0]`, Cè§£æä¸ºï¼`[0,0,1]`
```python
In [8]: s = pd.Series(list('ABCA'))
In [9]: pd.get_dummies(s)
Out[9]:
A B C
0 1 0 0
1 0 1 0
2 0 0 1
3 1 0 0
```
妿è¾å
¥çå符æ4个å¯ä¸å¼ï¼çå°å符a被解æä¸º[1,0,0,0]ï¼åéé¿åº¦ä¸º4.
```python
In [5]: s = pd.Series(list('abaccd'))
In [6]: pd.get_dummies(s)
Out[6]:
a b c d
0 1 0 0 0
1 0 1 0 0
2 1 0 0 0
3 0 0 1 0
4 0 0 1 0
5 0 0 0 1
```
ä¹å°±æ¯è¯´dummyåéçé¿åº¦çäºè¾å
¥å符串ä¸ï¼å¯ä¸å符ç个æ°ã
#### 15 讨åçSettingWithCopyWarningï¼ï¼ï¼
Pandas å¤çæ°æ®ï¼å¤ªå¥½ç¨äºï¼è°ç¨è°ç¥éï¼
使ç¨è¿ Pandas çï¼å ä¹é½ä¼éå°ä¸ä¸ªè¦åï¼
*SettingWithCopyWarning*
é常ç¦äººï¼
å°¤å
¶æ¯åæ¥è§¦ Pandas çï¼å®å
¨ä¸ç解为ä»ä¹å¼¹åºè¿ä¹ä¸ä¸²ï¼
```python
d:\source\test\settingwithcopy.py:9: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
```
彿 ¹ç»åºï¼æ¯å 为代ç ä¸åºç°`é¾å¼æä½`...
æäººå°±é®äºï¼ä»ä¹æ¯`é¾å¼æä½`?
è¿æ ·çï¼
```python
tmp = df[df.a<4]
tmp['c'] = 200
```
å
è®°ä½è¿ä¸ªæå
¸åçæ
åµï¼å³å¯ï¼
æç人就é®äºï¼åºç°è¿ä¸ª Warning, éè¦çä¼å®åï¼
å¦æç»æä¸å¯¹ï¼å½ç¶è¦çä¼ï¼å¦æç»æå¯¹ï¼ä¸care.
举个ä¾å~~
```python
import pandas as pd
df = pd.DataFrame({'a':[1,3,5],'b':[4,2,7]},index=['a','b','c'])
df.loc[df.a<4,'c'] = 100
print(df)
print('it\'s ok')
tmp = df[df.a<4]
tmp['c'] = 200
print('-----tmp------')
print(tmp)
print('-----df-------')
print(df)
```
è¾åºç»æï¼
```python
a b c
a 1 4 100.0
b 3 2 100.0
c 5 7 NaN
it's ok
d:\source\test\settingwithcopy.py:9: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
tmp['c'] = 200
-----tmp------
a b c
a 1 4 200
b 3 2 200
-----df-------
a b c
a 1 4 100.0
b 3 2 100.0
c 5 7 NaN
```
it's ok è¡åé¢çåçé¾å¼èµå¼ï¼å¯¼è´ç»æé误ãå 为 tmp åäºï¼df 没èµä¸å¼åï¼æä»¥å¿
é¡»çä¼ã
it's ok è¡åçæ¯æ£è§£ã
以ä¸ï¼é¾å¼æä½å°½éé¿å
ï¼å¦ä½é¿å
ï¼å¤ä½¿ç¨ `.loc[row_indexer,col_indexer]`ï¼æç¤ºåè¯æä»¬ç~
#### 16 NumPy æ°æ®å½ä¸åãåå¸å¯è§å
ä»
ä½¿ç¨ `NumPy`ï¼ä¸è½½æ°æ®ï¼å½ä¸åï¼ä½¿ç¨ `seaborn` å±ç¤ºæ°æ®åå¸ã
**ä¸è½½æ°æ®**
```python
import numpy as np
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
wid = np.genfromtxt(url, delimiter=',', dtype='float', usecols=[1])
```
ä»
æå `iris` æ°æ®éç第äºå `usecols = [1]`
**å±ç¤ºæ°æ®**
```python
array([3.5, 3. , 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3. ,
3. , 4. , 4.4, 3.9, 3.5, 3.8, 3.8, 3.4, 3.7, 3.6, 3.3, 3.4, 3. ,
3.4, 3.5, 3.4, 3.2, 3.1, 3.4, 4.1, 4.2, 3.1, 3.2, 3.5, 3.1, 3. ,
3.4, 3.5, 2.3, 3.2, 3.5, 3.8, 3. , 3.8, 3.2, 3.7, 3.3, 3.2, 3.2,
3.1, 2.3, 2.8, 2.8, 3.3, 2.4, 2.9, 2.7, 2. , 3. , 2.2, 2.9, 2.9,
3.1, 3. , 2.7, 2.2, 2.5, 3.2, 2.8, 2.5, 2.8, 2.9, 3. , 2.8, 3. ,
2.9, 2.6, 2.4, 2.4, 2.7, 2.7, 3. , 3.4, 3.1, 2.3, 3. , 2.5, 2.6,
3. , 2.6, 2.3, 2.7, 3. , 2.9, 2.9, 2.5, 2.8, 3.3, 2.7, 3. , 2.9,
3. , 3. , 2.5, 2.9, 2.5, 3.6, 3.2, 2.7, 3. , 2.5, 2.8, 3.2, 3. ,
3.8, 2.6, 2.2, 3.2, 2.8, 2.8, 2.7, 3.3, 3.2, 2.8, 3. , 2.8, 3. ,
2.8, 3.8, 2.8, 2.8, 2.6, 3. , 3.4, 3.1, 3. , 3.1, 3.1, 3.1, 2.7,
3.2, 3.3, 3. , 2.5, 3. , 3.4, 3. ])
```
è¿æ¯ååé(univariate)é¿åº¦ä¸º 150 çä¸ç»´ NumPy æ°ç»ã
**å½ä¸å**
æ±åºæå¤§å¼ãæå°å¼
```python
smax = np.max(wid)
smin = np.min(wid)
In [51]: smax,smin
Out[51]: (4.4, 2.0)
````
å½ä¸åå
¬å¼ï¼
```python
s = (wid - smin) / (smax - smin)
```
åªæå°å°æ°ç¹åä¸ä½è®¾ç½®ï¼
```python
np.set_printoptions(precision=3)
```
å½ä¸åç»æï¼
```markdown
array([0.625, 0.417, 0.5 , 0.458, 0.667, 0.792, 0.583, 0.583, 0.375,
0.458, 0.708, 0.583, 0.417, 0.417, 0.833, 1. , 0.792, 0.625,
0.75 , 0.75 , 0.583, 0.708, 0.667, 0.542, 0.583, 0.417, 0.583,
0.625, 0.583, 0.5 , 0.458, 0.583, 0.875, 0.917, 0.458, 0.5 ,
0.625, 0.458, 0.417, 0.583, 0.625, 0.125, 0.5 , 0.625, 0.75 ,
0.417, 0.75 , 0.5 , 0.708, 0.542, 0.5 , 0.5 , 0.458, 0.125,
0.333, 0.333, 0.542, 0.167, 0.375, 0.292, 0. , 0.417, 0.083,
0.375, 0.375, 0.458, 0.417, 0.292, 0.083, 0.208, 0.5 , 0.333,
0.208, 0.333, 0.375, 0.417, 0.333, 0.417, 0.375, 0.25 , 0.167,
0.167, 0.292, 0.292, 0.417, 0.583, 0.458, 0.125, 0.417, 0.208,
0.25 , 0.417, 0.25 , 0.125, 0.292, 0.417, 0.375, 0.375, 0.208,
0.333, 0.542, 0.292, 0.417, 0.375, 0.417, 0.417, 0.208, 0.375,
0.208, 0.667, 0.5 , 0.292, 0.417, 0.208, 0.333, 0.5 , 0.417,
0.75 , 0.25 , 0.083, 0.5 , 0.333, 0.333, 0.292, 0.542, 0.5 ,
0.333, 0.417, 0.333, 0.417, 0.333, 0.75 , 0.333, 0.333, 0.25 ,
0.417, 0.583, 0.458, 0.417, 0.458, 0.458, 0.458, 0.292, 0.5 ,
0.542, 0.417, 0.208, 0.417, 0.583, 0.417])
```
**åå¸å¯è§å**
```python
import seaborn as sns
sns.distplot(s,kde=False,rug=True)
```
é¢çåå¸ç´æ¹å¾ï¼

```python
sns.distplot(s,hist=True,kde=True,rug=True)
```
另髿¯å¯åº¦æ ¸å½æ°çç´æ¹å¾ï¼

**åå¸ fit å¾**
æ¿ `gamma` åå¸å» fit ï¼
```python
from scipy import stats
sns.distplot(s, kde=False, fit = stats.gamma)
```

æ¿å `gamma` å» fitï¼
```python
from scipy import stats
sns.distplot(s, kde=False, fit = stats.dgamma)
```

#### 17 Pandas ä½¿ç¨æå·§
对äºå¨è¾å°±å åæå ç¾ä¸ª G çæ°æ®ï¼å¨è¯»åçè¿ä¹å¤§æ°æ®çæ¶åï¼æä»¬ææ²¡æåæ³éæºéåä¸å°é¨åæ°æ®ï¼ç¶å读å
¥å
åï¼å¿«éäºè§£æ°æ®åå¼å± EDA ï¼
ä½¿ç¨ Pandas ç skiprows å æ¦çç¥è¯ï¼å°±è½åå°ã
ä¸é¢è§£éå
·ä½æä¹åã
å¦ä¸æç¤ºï¼è¯»åæ 100 G 大å°ç big_data.csv æ°æ®
1) ä½¿ç¨ skiprows åæ°ï¼
2) x > 0 ç¡®ä¿é¦è¡è¯»å
¥ï¼
3) np.random.rand() > 0.01 表示 99% çæ°æ®é½ä¼è¢«éæºè¿æ»¤æ
è¨å¤ä¹æï¼åªæå
¨é¨æ°æ®ç 1% æææºä¼éå
¥å
åä¸ã
```python
import pandas as pd
import numpy as np
df = pd.read_csv("big_data.csv",
skiprows =
lambda x: x>0 and np.random.rand() > 0.01)
print("The shape of the df is {}.
It has been reduced 100 times!".format(df.shape))
```
使ç¨è¿ç§æ¹æ³ï¼è¯»åçæ°æ®éè¿
é缩åå°åæ¥ç 1% ï¼å¯¹äºè¿
éå±å¼æ°æ®åææä¸å®ç帮å©ã
### åä¸ã䏿¥ä¸æ¥ææ¡Flask webå¼å
#### 1 Flaskç hello world
Flaskæ¯Pythonè½»é级webæ¡æ¶ï¼å®¹æä¸æï¼è¢«å¹¿å¤§Pythonå¼åè
æåç±ã
ä»å¤©æä»¬å
ä»hello worldå¼å§ï¼ä¸æ¥ä¸æ¥ææ¡Flask webå¼åãä¾å忝Flaskæ¡æ¶çå°ç½ï¼æ¥ä¸æ¥ä¸è¯»è
æå们ï¼ä¸èµ·å¦ä¹ è¿ä¸ªå¯¹æèè¨çæ°æ¡æ¶ï¼å¤§å®¶å¤å¤æå¯¼ã
é¦å
`pip install Flask`,å®è£
Flaskï¼ç¶åimport Flaskï¼åæ¶å建ä¸ä¸ª `app`
```python
from flask import Flask
App = Flask(__name__)
```
åä¸ä¸ªindex页çå
¥å£å½æ°ï¼è¿åhello world.
éè¿è£
饰å¨ï¼App.route('/')å建index页çè·¯ç±æå°åï¼ä¸ä¸ª`/`表示index页ï¼ä¹å°±æ¯ä¸»é¡µã
```python
@App.route('/')
def index():
return "hello world"
```
è°ç¨ `index`彿°:
```python
if __name__ == "__main__":
App.run(debug=True)
```
ç¶åå¯å¨ï¼ä¼å¨consoleä¸çå°å¦ä¸å¯å¨ä¿¡æ¯ï¼è¡¨æ`æå¡å¯å¨æå`ã
```python
* Debug mode: on
* Restarting with stat
* Debugger is active!
* Debugger PIN: 663-788-611
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```
æ¥ä¸æ¥ï¼æå¼ä¸ä¸ªç½é¡µï¼ç¸å½äºå¯å¨å®¢æ·ç«¯ï¼å¹¶å¨Urlæ ä¸è¾å
¥ï¼`http://127.0.0.1:5000/`ï¼çå°é¡µé¢ä¸çåºåº`hello world`ï¼è¯ææå¡è®¿é®æåã
忶卿å¡ç«¯åå°çå°å¦ä¸ä¿¡æ¯ï¼è¡¨ç¤ºå¤ç䏿¬¡æ¥èªå®¢æ·ç«¯ç`get`请æ±ã
```python
27.0.0.1 - - [03/Feb/2020 21:26:50] "GET / HTTP/1.1" 200 -
```
以ä¸å°±æ¯flaskçhello world ç
#### 2 Flask乿°æ®å
¥åºæä½
æ°æ®æä¹
åå°±æ¯å°æ°æ®åå
¥å°æ°æ®åºåå¨çè¿ç¨ã
æ¬ä¾å使ç¨`sqlite3`æ°æ®åºã
1)导å
¥`sqlite3`ï¼æªå®è£
å使ç¨å½ä»¤`pip install sqlite3`
å建ä¸ä¸ª`py`æä»¶ï¼`sqlite3_started.py`ï¼å¹¶åä¸ç¬¬ä¸è¡ä»£ç ï¼
```python
import sqlite3
```
2)æå¨å建ä¸ä¸ªæ°æ®åºå®ä¾`db`, å½å`test.db`
3)åå»ºä¸æ°æ®åºå®ä¾`test.db`çè¿æ¥:
```python
conn = sqlite3.connect("test.db")
```
4)æ¿å°è¿æ¥`conn`çcursor
```python
c = conn.cursor()
```
5)å建第ä¸å¼ 表`books`
å
±æåä¸ªåæ®µï¼`id`,`sort`,`name`,`price`ï¼ç±»ååå«ä¸ºï¼`int`,`int`,`text`,`real`. å
¶ä¸`id`为`primary key`. 主é®çåå¼å¿
é¡»æ¯å¯ä¸ç(`unique`)ï¼å¦å伿¥éã
```python
c.execute('''CREATE TABLE books
(id int primary key,
sort int,
name text,
price real)''')
```
ç¬¬ä¸æ¬¡æ§è¡ä¸é¢è¯å¥ï¼è¡¨`books`åå»ºå®æãå½å次æ§è¡æ¶ï¼å°±ä¼æ¥`éå¤å»ºè¡¨`çé误ãéè¦ä¼åèæ¬ï¼æ£æ¥è¡¨æ¯å¦åå¨`IF NOT EXISTS books`ï¼ä¸åå¨åå建ï¼
```python
c.execute('''CREATE TABLE IF NOT EXISTS books
(id int primary key,
sort int,
name text,
price real)''')
```
6)æå
¥ä¸è¡è®°å½
å
±ä¸º4ä¸ªåæ®µèµå¼
```python
c.execute('''INSERT INTO books VALUES
(1,
1,
'computer science',
39.0)''')
```
7)䏿¬¡æå
¥å¤è¡è®°å½
å
å建ä¸ä¸ªlist:`books`ï¼ä½¿ç¨`executemany`䏿¬¡æå
¥å¤è¡ã
```python
books = [(2, 2, 'Cook book', 68),
(3, 2, 'Python intro', 89),
(4, 3, 'machine learning', 59),
]
c.executemany('INSERT INTO books VALUES (?, ?, ?, ?)', books)
```
8)æäº¤
æäº¤åæä¼çæ£çæï¼åå
¥å°æ°æ®åº
```python
conn.commit()
```
9)å
³éæå建ç«çè¿æ¥conn
å¡å¿
è®°ä½æå¨å
³éï¼å¦åä¼åºç°å
åæ³æ¼
```python
conn.close()
print('Done')
```
10)æ¥çç»æ
ä¾åå使ç¨`vs code`ï¼å¨æ©å±åºä¸éæ©ï¼`SQLite`å®è£
ã

æ°å»ºä¸ä¸ª`sq`æä»¶ï¼`a.sql`ï¼å
容å¦ä¸ï¼
```sql
SELECT * from books
```
å³é®`run query`ï¼å¾å°è¡¨`books`æå
¥ç4è¡è®°å½å¯è§åå¾ï¼

以ä¸åæ¥å°±æ¯sqlite3åå
¥æ°æ®åºçä¸»è¦æ¥éª¤ï¼ä½ä¸ºFlaskç³»åç第äºç¯ï¼ä¸ºåé¢çå端讲解æä¸åºç¡ã
#### 3 Flaskåå±è°ç¨å
³ç³»
è¿ç¯ä»ç»FlaskåB/S模å¼ï¼å³æµè§å¨/æå¡å¨æ¨¡å¼ï¼æ¯æ¥ä¸æ¥å¿«éçè§£Flask代ç çå
³é®ç论ç¯ï¼**çè§£Viewsãmodels忏²ææ¨¡æ¿å±çè°ç¨å
³ç³»**ã
1) ååºè¯·æ±
彿们卿µè§å¨å°åæ ä¸è¾å
¥æä¸ªå°åï¼æå车åï¼å®æç¬¬ä¸æ¥ã
2) è§å¾å± viewsæ¥æ¶1)æ¥ååºç请æ±ï¼Flaskä¸ä½¿ç¨è§£éå¨çæ¹å¼å¤çè¿ä¸ªæ±æ
ï¼å®ä¾ä»£ç å¦ä¸ï¼å®é常æ¶åå°è°ç¨modelså±åæ¨¡æ¿æä»¶å±
```python
@main_blue.route('/', methods=['GET', 'POST'])
def index():
form = TestForm()
print('test')
```
3) modelså±ä¼è´è´£åå»ºæ°æ®æ¨¡åï¼æ§è¡CRUDæä½
4) æ¨¡æ¿æä»¶å±å¤çhtml模æ¿
5) ç»ååè¿åhtml
6) modelså±åhtml模æ¿ç»ååè¿åç»viewså±
7ï¼æåviewså±ååºå¹¶æ¸²æå°æµè§å¨é¡µé¢ï¼æä»¬å°±è½çå°è¯·æ±ç页é¢ã
宿´è¿ç¨å¾å¦ä¸æç¤ºï¼

读è
æå们ï¼å¦æä½ åä¾åå䏿 ·é½æ¯åå¦Flaskç¼ç¨ï¼éè¦å¥½å¥½çè§£ä¸é¢çè¿ç¨ãçè§£è¿äºå¯¹äºæ¥ä¸æ¥çç¼ç¨ä¼æä¸å®çç论æå¯¼ï¼æ¹åæ§æå¯¼ä»·å¼ã
### Python é®ç
#### Python å¦ä½çæäºç»´ç ï¼
## qrcode
ä»å¤©å
æ¥è§£çå¦ä½çæäºç»´ç ãPythonç`qrcode`å
æ¯æçæäºç»´ç ã
ç¨æ³ä¹å¾ç®åï¼
```python
import qrcode
# äºç»´ç å
容
data = "http://www.zglg.work/wp-content/uploads/2020/10/image-3.png"
# çæäºç»´ç
img = qrcode.make(data=data)
# ç´æ¥æ¾ç¤ºäºç»´ç
img.show()
# ä¿åäºç»´ç 为æä»¶
img.save("æç微信.jpg")
```
çæçäºç»´ç å¦ä¸ï¼

å¤§å®¶å¾®ä¿¡æ«æåï¼ä¼åºç°æçäºç»´ç ã
å¦å¤ï¼è¿å¯ä»¥è®¾ç½®äºç»´ç çé¢è²çæ ·å¼ï¼
```python
import qrcode
# å®ä¾åäºç»´ç çæç±»
qr = qrcode.QRCode(border=2)
# 设置äºç»´ç æ°æ®
data = "http://www.zglg.work/wp-content/uploads/2020/10/image-3.png"
qr.add_data(data=data)
# å¯ç¨äºç»´ç é¢è²è®¾ç½®
qr.make(fit=True)
img = qr.make_image(fill_color="orange", back_color="white")
# æ¾ç¤ºäºç»´ç
img.show()
```
çæä¸ä¸ªorangeçäºç»´ç ï¼

æ´å¤æ ·å¼ï¼å¤§å®¶å¯ä»¥èªå·±å»ç©èã
## Pythonå°é¡¹ç®ï¼å¥åKWICæ¾ç¤º
ä¸ä¸æå
³é®åï¼KWIC, Key Word In Contextï¼æ¯æå¸¸è§çå¤è¡åè°æ¾ç¤ºæ ¼å¼ã
æ¤å°é¡¹ç®æè¿°ï¼è¾å
¥ä¸ç³»åå¥åï¼ç»å®ä¸ä¸ªç»å®åè¯ï¼æ¯ä¸ªå¥åä¸è³å°ä¼åºç°ä¸æ¬¡ç»å®åè¯ãç®æ è¾åºï¼ç»å®åè¯æç
§KWICæ¾ç¤ºï¼KWICæ¾ç¤ºçåºæ¬è¦æ±ï¼å¾
æ¥è¯¢åè¯å±
ä¸ï¼åé¢`pre`åºåå³å¯¹é½ï¼åé¢`post`åºå左对é½ï¼å¾
æ¥è¯¢åè¯åååé¿åº¦ç¸çï¼è¥è¾å
¥å¥åæ æ³æ»¡è¶³è¦æ±ï¼ç¨ç©ºæ ¼å¡«å
ã
è¾å
¥åæ°ï¼è¾å
¥å¥åsentences, å¾
æ¥è¯¢åè¯selword, æ»å¨çªå£é¿åº¦`window_len`
举ä¾ï¼è¾å
¥å¦ä¸å
个å¥åï¼ç»å®åè¯`secure`ï¼è¾åºå¦ä¸å符串ï¼
```python
pre keyword post
welfare , and secure the blessings of
nations , and secured immortal glory with
, and shall secure to you the
cherished . To secure us against these
defense as to secure our cities and
I can to secure economy and fidelity
```
请补å
å®ç°ä¸é¢å½æ°ï¼
```python
def kwic(sentences: List[str], selword: str, window_len: int) -> str:
"""
:type: sentences: input sentences
:type: selword: selected word
:type: window_len: window length
"""
```
æ´å¤KWICæ¾ç¤ºåèå¦ä¸ï¼
http://dep.chs.nihon-u.ac.jp/english_lang/tukamoto/kwic_e.html
宿´ä»£ç å·²ç»å
¬å¸å¨ï¼http://www.zglg.work/Python-20-topics/python-project1-kwic/

