数据基本处理源程序
def get_num():
num = []
numstr = input("请输入数字,回车键结束:")
while numstr != "":
num.append(eval(numstr))
numstr = input("请输入数字,回车键结束:")
return num
# 求平均值
def mean(num):
sum = 0.0
for number in num:
sum += number
return sum/len(num)
#求中位数
def median(num):
sorted(num)
size = len(num)
if size%2 ==0:
med = (num[size//2-1] + num[size//2])/2
else:
med = num[size//2]
return med
#求方差
def dev(num,med):
sdev = 0.0
for number in num:
sdev = sdev + (number - med)**2
return pow(sdev/(len(num)-1), 0.5)
n = get_num()
m = mean(n)
d = dev(n, m)
print("平均值为{:.2f},中位数为:{},方差为:{:.2f}".format(m, median(n), d))
ls = [‘P’, ‘Y’, ‘P’, ‘Y’, 123]
s = set(ls)
lt = list(s)
输出 [‘P’, ‘Y’, 123]
寻找哈姆雷特高频词汇源程序
def getText():
txt = open("hamlet.txt", "r").read()# 打开文件
txt = txt.lower()# 全部转化为小写字母
for i in '!#$%^&*()_-+=/`~{}[]:;"?<>,.':#去掉全部标点符号用空格代替
txt = txt.replace(i, " ")
return txt
hamletTxt = getText()
words = hamletTxt.split()# split 默认用空格将字符串分隔并以列表形式返回
counts = {}
for i in words:
# 计算单词出现的次数,get函数就是寻找i这个键,如果在字典中找到了就返回对应的值,后面那个参数就是default值
counts[i] = counts.get(i, 0) + 1
# item函数即以列表返回可遍历的(键, 值) 元组数组([key:value],[key:value],[key:value])
# 再次使用list函数将元祖转化为列表
items = list(counts.items())
#对列表按照键值对的第二个元素进行从大到小的排列
items.sort(key=lambda x:x[1], reverse=True)
for i in range(10):
word, count = items[i]
print("{:10}{:5}".format(word, count))#{:10}指定了该域的宽度为10,避免单词与次数打印效果重复
寻找三国演义人物出场次数源程序
import jieba
txt = open("threekingdoms.txt", "r", encoding="utf-8").read()# 打开文件
excludes = {'将军', '却说', '荆州', '二人', '不可', '不能', '如此', '商议', '如何', '主公','军士', '左右', '军马', '引兵',\
'次日', '大喜', '天下', '东吴', '于是', '今日', '不敢', '魏兵', '陛下', '一人', '都督', '人马', '不知' }
words = jieba.lcut(txt)# 以列表的形式返回
counts = {}
for word in words:
if len(word) == 1:
continue
elif word == "诸葛亮" or word == "孔明曰":
reword = "孔明"
elif word == "关公" or word == "云长":
reword = "关羽"
elif word == "玄德" or word == "玄德曰":
reword = "刘备"
elif word == "孟德" or word == "丞相":
reword = "曹操"
else:
reword = word
# 计算单词出现的次数,get函数就是寻找i这个键,如果在字典中找到了就返回对应的值
counts[reword] = counts.get(reword, 0) + 1
for word in excludes:
del counts[word]
# item函数即以列表返回可遍历的(键, 值) 元组数组([key:value],[key:value],[key:value])
# 再次使用list函数将元祖转化为列表
items = list(counts.items())
#对列表按照键值对的第二个元素进行从大到小的排列
items.sort(key=lambda x:x[1], reverse=True)
for i in range(10):
word, count = items[i]
print("{:10}{:5}".format(word, count))# {:10}指定了该域的宽度为10
明明已经下载jieba库但是pycha提示没找到怎么办?
file-settings-project-project interpreter,找到右边的绿色加号,把jieba添加进来就可以了
提示TXT文件无法读取怎么办?
把文件另存为uf-8格式就行了
一行代码太长怎么办?
用“\”符号就行了!
文件关闭:<变量名>.close()
文件一旦被打开,如果没有对应的关闭语句就是在程序中一直被打开,只有在程序退出时才会被自动关闭
2. 文件内容读取
操作方法 | 描述 |
---|---|
<文件名>.read(size=-1) | 读入全部内容,如果给出参数,读入前size长度,size为2,就是读前两个字符 |
<文件名>.readline(size=-1) | 读入一行内容,如果给出参数,读入改行前size长度,size为2,就是读改行前两个字符 |
<文件名>.readlines(hint=-1) | 读入文件所有行,以每行行为元素形成列表,如果给出参数,读入前hint行 |
fo = open(“ls.txt”,"w+)# 打开文件,文本形式,覆盖写模式+读文件
fo.writelines(ls)# 读入文件所有行
fo.seek(0)# 将指针退回到文件开头
for line on fo:# 逐行打印
print(line)
fo.close#文件关闭
fo.seek(0)# 将指针退回到文件开头这一步非常重要,如果没有退回指针,那么打印出来的就没有结果。
上面这个程序也给出了遍历全文的一种常用的代码模板,要牢记。
文件驱动绘图程序
import turtle
turtle.title("数据驱动绘图")
turtle.color("red")
turtle.setup(800,800)
turtle.pensize(5)
# 数据获取,一组五个参数
# 300,0,144,1,0,0
# 前进距离,(0:左转,1:右转),转向的绝对角度,rgb对应的三个参数(0-1之间的小数)
data = []
f = open("datals.txt")
for line in f:
line = line.replace("\n", " ")
data.append(list(map(eval,line.split(","))))
f.close()
# 绘图
for i in range(len(data)):
turtle.fd(data[i][0])
turtle.color(data[i][3], data[i][4], data[i][5])
if data[i][1]:
turtle.right(data[i][2])
else:
turtle.left(data[i][2])
首次使用文件驱动程序,将数据与程序分离,创建接口大大提高了代码的适应性。麻烦的是需要将输入的数据进行处理。该程序中数据处理关键语句:
for line in f:
line = line.replace("\n", " ")
data.append(list(map(eval,line.split(","))))
数据传输进来,首先就将该行的换行符换为空格。然后数据是以字符串的形式传进来,使用spilt()函数将整个大的字符串数据,使用逗号“,”进行分隔成小的字符串。然后为了程序处理的数据均为数字,再使用eval函数将每个小的字符串去掉引号变成数字。(map(a,b)函数就是使用a函数对b中的每个元素进行函数操作。)再使用list将转化为数字的数据变成一个列表。最后使用append函数将输入文件的每一行进行拼接。最后形成的就是类似这种结构[[],[],[],[],[]]的一个列表。
list=[‘1’,‘2’,‘3’,‘4’,‘5’]
print(’’.join(list))
12345
class wordcloud.WordCloud(font_path=None, width=400, height=200, margin=2, ranks_only=None, prefer_horizontal=0.9, mask=None, scale=1, color_func=None, max_words=200, min_font_size=4, stopwords=None, random_state=None, background_color=‘black’, max_font_size=None, font_step=1, mode=‘RGB’, relative_scaling=0.5, regexp=None, collocations=True, colormap=None, normalize_plurals=True)
参数 | 类型 | 描述 |
---|---|---|
font_path | string | 指定字体的位置(可以在网上下载OTF或者TTF格式),默认使用DroidSansMono path |
width | int(default=400) | 图片宽度,越大越精细 |
height | int (default=200) | 图片高度,越大越精细 |
prefer_horizontal | float (default=0.90) | 越接近1说明越喜欢水平的字,则字就不会为了适合展示而翻转成水平的 |
mask : | nd-array or None (default=None) | 将词云画在遮罩上 |
scale : | float (default=1) | 计算和画图的比例,当做大图的时候使用scale代替height和width速度会快,但会影响词之间的拟合度 |
min_font_size : | int (default=4) | 最小频率词的大小 |
font_step : | int (default=1) | 字体步长,如果大于1,可以增快计算速度,但是拟合度会下降 |
max_words : | number (default=200) | 图片容纳词语的上限 |
stopwords : | set of strings or None | 设置停用词,如果不设置则使用默认的停用词 |
background_color : | color value (default=”black”) | 背景颜色设置 |
max_font_size : | int or None (default=None) | 最大的词语的大小 |
mode : | string (default=”RGB”) | 当使用”RGBA”时,背景将变成透明的 |
relative_scaling : | float (default=.5) | 当relative_scaling=0时,词的大小是按照排名计算的,当relative_scaling=1时候则会按词频的倍数计算大小。 |
color_func : | callable, default=None | 根据每个词的font_size, position, orientation, font_path, random_state等属性为词语生成特定的颜色,具体参考matplotlib colormap |
regexp : | string or None (optional) | |
collocations : | bool, default=True | 是否考虑词语的搭配 |
colormap : | string or matplotlib colormap, default=”viridis” | Matplotlib colormap,如果color_func参数被指定,则此参数无效 |
normalize_plurals : | bool, default=True | 是否忽略复数 |
words_ | (dict of string to float) | 返回词频 |
layout_ | (list of tuples (string, int, (int, int), int, color))) | 词云词的属性信息 |
词云源程序
import jieba
import wordcloud
from scipy.misc import imread
mask = imread("china.png")
f = open("新时代中国特色社会主义.txt","r",encoding="utf-8")
t = f.read()
f.close()
# 将输入的词用空格分隔,才能被识别
ls = jieba.lcut(t)
txt = " ".join(ls)
# 设置参数
w = wordcloud.WordCloud(font_path="msyh.ttc",mask=mask,\
width=1000, height=700, background_color = "white")
w.generate(txt)# 生成词云
w.to_file("grwordcloud.png")# 输出生成的词云图片
只实现了最最基本的内容,而且scrip这个库需要导入,且遇到了版本太低的问题,而且图片的导入方式也不好,使用image库可能处理更加规范方便。
于是自行编写了以下程序:
import jieba
import wordcloud
from matplotlib import pyplot as plt
from PIL import Image
import numpy as np
# 文本输入格式化
def word_txt(txt):
f = open(txt, "r" ,encoding="utf-8")# 打开文件
t = f.read()
f.close()
ls = jieba.lcut(t)# 将输入的词用空格分隔,才能被识别
txt = " ".join(ls)
return txt
# 读入背景图片
def image_deal(img):
img = Image.open(img)
img_array = np.array(img)# 将图片转化成数组
return img_array
# 设置词云的参数
def wordcloud_set():
word = wordcloud.WordCloud( font_path="simsun.ttc",\
mask = image_deal('wade6.jpg'),\
width=800, height=800,\
background_color = "black",\
stopwords=[],\
max_words=1000, \
min_font_size=5,\
max_font_size=200,\
scale=10,\
random_state=50)
return word
word = wordcloud_set()
word.generate(word_txt('新时代中国特色社会主义.txt')) # 生成词云
word.to_file("grwordcloud.png")# 输出生成的词云图片
plt.imshow(word)
plt.axis('off')
plt.show()
1 Python库安装
第三方安装库网站:http://pypi.org/
三种方法:
方法一(主要方法,需要联网):使用pip命令
电脑自带cmd命令下进行操作:
作用 | 操作方法 |
---|---|
安装库 | pip install <第三方库名> |
更新库 | pip install -U<第三方库名> |
卸载库 | pip uninstall <第三方库名> |
查看库的详细信息 | pip show <第三方库名> |
根据关键词在名称和介绍中搜索第三方库 | pip search <关键词> |
方法二:集成安装方法
*Anaconda :https//www.continuum.io
*支持800个第三方库
*包含多个主流工具
*适合数据计算领域开发
方法三:文件安装方法
对于有些库可以用pip下载,但是不能安装,为什么?
由于某些第三方库下载后,需要编译再安装,如果操作系统没有编译环境,则能下载但不能安装。
解决办法:
模拟比赛源程序
import random
import time
def printInformation():
print("程序模拟A和B两个运动员之间的竞技比赛")
print("程序输入为A、B选手的能力值(0至1之间的小数)及模拟场数N")
def getvalue():
player_a = eval(input("请输入A选手能力值:"))
player_b = eval(input("请输入B选手能力值:"))
N = eval(input("请输入模拟场数:"))
return player_a, player_b, N
def play_one_game(ability_a, ability_b, star_game):
time.sleep(0.0001)
a_win, b_win = 0, 0
random_num = random.random()
if star_game == "a" and (random_num < ability_a):
a_win = 10.
nx_star_game = "a"
elif star_game == "a" and (random_num > ability_a):
a_win = 0
nx_star_game = "b"
elif star_game == "b" and (random_num < ability_b):
b_win = 1
nx_star_game = "b"
elif star_game == "b" and (random_num > ability_b):
b_win = 0
nx_star_game = "a"
return a_win, b_win, nx_star_game
def play_n_game(ability_a, ability_b, n):
num_a, num_b = 0, 0
star_game = "a"
while num_a + num_b != n :
a_win, b_win, nx_star_game = play_one_game(ability_a, ability_b, star_game)
num_a += a_win
num_b += b_win
star_game = nx_star_game
return num_a, num_b
def result(num_a, num_b):
n = num_a + num_b
print("共模拟{}场比赛".format(n))
print("选手A赢得{}场,胜率为:{:.1f}%".format(num_a, num_a*100/n))
print("选手B赢得{}场,胜率为:{:.1f}%".format(num_b, num_b*100/n))
def main():
printInformation()
ability_a, ability_b, n = getvalue()
num_a, num_b = play_n_game(ability_a, ability_b, n)
result(num_a, num_b)
main()
代码与视频中的代码存在不同,是我自己看完写的,没有用视频的。
值得注意的是random()函数在最开始使用的for循环中出现了产生相同随机数的情况。也就是第四周中提到的伪随机数,我的解决办法是在函数中插入time.sleep(time),由于在不指定随机数种子的情况下,random()使用的是系统时间作为种子,时间精度为微秒。因此我进行sleep一定时间后再取随机数即可。看网上大神有更专业的处理方式或者不将其放到for循环之中,但是由于程序比较简单那就用简单一些的方式处理吧。