0%

修改matplotlib以支持中文

1. 打开以下路径

使用资源管理器打开以下路径:

C:\Python27\Lib\site-packages\matplotlib\mpl-data

修改上面图片中框出的文件。

2. 打开matplotlibrc文件

在选择打开工具的时候,我们选择常用的记事本。

3. 修改文件

  1. 首先去掉font.family前面用于注释的“#”号。
  2. 再去掉font.sans-serif前面的“#”号。
  3. font.sans-serif那一行添加本机存在的中文字体。(在此用黑体演示,一般电脑都存在黑体。)
  4. axes.unicode_minus删去前面的#,并修改为False
  5. 保存当前文档。

可以按照下体修改。(axes.unicode_minus未体现)

数据分析练习(2018)

  • 数据为自己生成的练习数据

任务三、本阶段的任务是:film_log3.csv中包含了来自不同城市中多个影院的电影票房信息, 你的小组通过编程完成对文件film_log3.csv中电影信息数据的清洗和整理,并完成数据计算、分析 和表达任务。(20分) 本竞赛任务的赛前抽取参数是:电影名称A、B、C 和地名M市、N市以及数据文件 film_log3.csv,选手可在竞赛环境的arg0300.txt文件中获得A、B、C、M、N的值。本阶段任 务,需要参赛学生提交每个小题涉及到的所有ansXXXX.jpg、ansXXXX.py、ansXXXX.dat文件 (XXXX相关指数字,xx任务编码:03.第3、4位编码XX为賽题的编码01、02、03、04等)。

电影:A:大世界、B:捉妖记2、C:红海行动
城市:M:北京、N:苏州

Q1

  1. 编程统计并输出影片A的上映天数和日平均票房(日平均票房指文件中的所有涉及城市总平 均票房),程序源代码保存成ans0301.py,并将结果保存于ans0301.dat,要求ans0301.dat只包 含1个long型数据和一个1个浮点型数据,浮点数据以万元为单位,保留6位小数,2个数以英文逗 号分隔,不换行,文件样例如下:

    123, 23.123456

解题过程:

#encoding:utf-8
import numpy as np
import pandas as pd

if __name__=="__main__":
    name=["time","filmName","place","dyy","pf"]  #列名
    data=pd.read_csv("film.csv",names=name)      #读取CSV并设置列名
    days=len(data[data.filmName=="大世界"].time.unique())  #获取大世界这本电影的上映的日期(去重)
    average_money=data[data.filmName=="大世界"].sum()["pf"]/float(days) #求出大世界这部电影的日平均票房(单位:元)
    average_money=average_money/10000.0  #将单位元转化为万元
    result="{},{:.6f}".format(days,average_money)  #准备插入的文本
    f=open("ans0301.dat","w")  #新建文件
    f.write(result)   #写入准备的字符串
    f.close()
生成文件效果图:

Q2

2、利用Bar函数编程输出影片A、B、C的周平均票房(周平均票房指文件中的所有涉及城市周 票房总平均),Y轴表示票房收入,单位万元;X轴表示电影名称,电影名称的排列从左至右以A、 B、C为准,要求将输出的直方图保存成图像文件ans0302.jpg,程序源代码保存成ans0302.py, 另外,将三部电影各自的票房总收入按自高到低的顺序存入ans0302.dat文件中,要求 ans0302.dat中只包含3个浮点型票房数据,以万元为单位,保留6位小数,数据以英文逗号分隔, 不换行,文件样例如下:

23.123456,20.654321,18.123456

对本题周票房的说明如下:若某部电影从某月2日开始上映,则从当月2日到8日为其第1周票 房,9日至15日为其第2周票房,不满1周按1周计算以此类推。

解题过程:

#encoding:utf-8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

def get_weeks(days):
    weeks_tmp=days // 7
    if days % 7 != 0:
        weeks = weeks_tmp + 1
        return weeks*1.0
    return weeks_tmp*1.0

if __name__=="__main__":
    name = ["time", "filmName", "place", "dyy", "pf"]
    data = pd.read_csv("film.csv", names=name)
    # A电影的周平均票房
    days_A = len(data[data.filmName=="大世界"].time.unique())
    zpf_A = data[(data.filmName == "大世界")].sum()["pf"]
    weekpf_A = zpf_A / get_weeks(days_A)
    weekpf_A=weekpf_A/10000.0
    # B电影的周平均票房
    days_B = len(data[data.filmName=="捉妖记2"].time.unique())
    zpf_B = data[data.filmName == "捉妖记2"].sum()["pf"]
    weekpf_B = zpf_B / get_weeks(days_B)
    weekpf_B=weekpf_B/10000.0
    # C电影的周平均票房
    days_C = len(data[data.filmName=="红海行动"].time.unique())
    zpf_C = data[data.filmName == "红海行动"].sum()["pf"]
    weekpf_C = zpf_C / get_weeks(days_C)
    weekpf_C=weekpf_C/10000.0

    dy_names = ["大世界", "捉妖记2", "红海行动"]
    dy_data = [weekpf_A, weekpf_B, weekpf_C]
    # A画图并保存
    plt.bar(dy_names, dy_data)
    plt.savefig("ans0302.jpg")  #此处需要安装pillow,如果没有安装,保存成jpg会直接报错。
    #可以先保存成png,然后用画图工具保存成jpg
    dy_data=sorted(dy_data,reverse=True)
    # 将结果写入文件
    result_string = "%.6f,%.6f,%.6f"%tuple(dy_data)
    print result_string
    f = open("ans0302.dat", "w")
    f.write(result_string)
    f.close()
绘制的图片:

注,因为暂时没有修改matplotlib的配置文件支持中文。

ans0302.dat数据展示:

Q3

3、编程,利用折线图,画出影片A、B、C各自的周票房(周票房指文件中的所有涉及城市总周 票房)收入变化,要求将输出的折线图保存成图像文件ans0303.jpg,程序源代码保存成 ans0303.py,Y轴表示票房收入,单位为“万元”;X轴表示时间,以“0、1、2、3…n”的非负 整数作为刻度值,单位为“周”,要求: 1)折线图中含图例; 2)三部电影用不同的颜色和线型表达; 3)将电影A第一周的票房收入,电影B第二周的票房收入,电影C第三周的票房收入顺序存入 ans0303.dat文件中,注意ans0303.dat只包含3个浮点型票房数据,以万元为单位,保留6位小数,数据以英文逗号分隔,不换行,文件样例如下:

23.123456,20.654321,18.123456

4)对本题周票房的说明如下:若某部电影从某月2日开始上映,则从当月2日到8日为其第一周 票房,9日至15日为其第2周票房,以此类推.

解答过程:

#encoding:utf-8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

name = ["time", "filmName", "place", "dyy", "pf"]
data=pd.read_csv("film.csv",names=name)
data.time=data.time.apply(lambda x:pd.to_datetime(x,format="%Y-%m-%d"))
data["weekofyear"]=data.time.apply(lambda x:x.weekofyear)
filmlist=["大世界","捉妖记2","红海行动"]
tmp_A=data[data.filmName=="大世界"].groupby(["weekofyear"]).sum()/10000.0
tmp_B=data[data.filmName=="捉妖记2"].groupby(["weekofyear"]).sum()/10000.0
tmp_C=data[data.filmName=="红海行动"].groupby(["weekofyear"]).sum()/10000.0

tmp_A.reset_index(inplace=True)
tmp_B.reset_index(inplace=True)
tmp_C.reset_index(inplace=True)

A1=np.array(tmp_A)[0][1]
B1=np.array(tmp_B)[1][1]
C1=np.array(tmp_C)[2][1]

l1,=plt.plot(tmp_A.index,tmp_A.pf,ls="-")
l2,=plt.plot(tmp_B.index,tmp_B.pf,ls="-.")
l3,=plt.plot(tmp_C.index,tmp_C.pf,ls=":")
plt.legend(handles=[l1,l2,l3],labels=[u"电影A",u"电影B",u"电影C"])
plt.xlabel("weeks")
plt.ylabel("Money")
plt.savefig("ans0303.jpg")
# #此处需要安装pillow,如果没有安装,保存成jpg会直接报错。
# #可以先保存成png,然后用画图工具保存成jpg
plt.show()


result_string="{:.6f},{:.6f},{:.6f}".format(A1,B1,C1)
f=open("ans0303.dat","w")
f.write(result_string)
f.close()
绘制的图片

注:因为数据为生成的,图片有些许奇怪。

ans0303.dat内容展示:

pandas分块读取

reader=pd.read_csv("test.csv",encoding="gbk",chunksize=5000,names=["UID","Date","Numb"])
  1. chunksize设置过后reader变为迭代,在循环中不断调用next()方法。

  2. 还有一个参数iterator,当为True时候,也可以生成一个可迭代对象

    reader=pd.read_csv(“test.csv”,encoding=”gbk”,iterator=True,names=[“UID”,”Date”,”Numb”])

多进程运行

1. 导入模块

from multiprocessing import freeze_support,Pool

2. 多进程调用

def SayHello():
    print("Hello")

if __name__=="__main__":
    freeze_support()
    with Pool() as p:
        for i in range(12):
            p.apply_async(SayHello)
        p.close()
        p.join()

数据分析中的运用

计算test.csv中每个员工,在2016年的输入代码总量。点击下载数据

1. 导入库

import pandas as pd
from multiprocessing import freeze_support,Pool
import time

2. 调用函数处理数据部分

def cl(read):

    read = pd.DataFrame(read)
    read.Date = read.Date.apply(lambda x: pd.to_datetime(x, format="%Y-%m-%d"))
    read["Year"] = read.Date.apply(lambda x: x.year)
    read.drop("Date", axis=1, inplace=True)
    read = read[read.Year == 2016]
    read.drop("Year", inplace=True, axis=1)
    c = read.groupby(by="UID", axis=0).sum()
    print c.head()
    c.sort_values(by="Numb", ascending=False, inplace=True)
    c.to_csv("temp.csv", encoding="gbk", mode="a+", header=None)

3. 主体代码

if __name__=="__main__":
    st=time.time()
    p=Pool()
    reader=pd.read_csv("test.csv",encoding="gbk",chunksize=5000,names=["UID","Date","Numb"])
    f=open("temp.csv","w")
    f.close()
    for read in reader:
        p.apply_async(cl,(read,))
    p.close()
    p.join()
    datare=pd.read_csv("temp.csv",encoding="gbk",names=["UID","Numb"])
    datare=datare.groupby(by="UID").sum()
    datare.sort_values(by="Numb",ascending=False,inplace=True)
    datare=datare.head(5)
    datare.to_csv("result.csv",encoding="gbk",header=None)
    print("已结束")
    eT=time.time()
    print(eT-st)

4. 运行结果

5. 总结

  1. 较单线程而言,多进程可以合理分配cpu,加快程序的执行效率。
  2. 缩短执行用时,经过测试,程序成功的从10s的执行时长,降低到1.66s。降幅达8秒多。

sklearn学习记录(01)

1. 一般流程

获取数据 -> 数据预处理 -> 训练建模 -> 模型评估 -> 预测,分类

2. 安装sklearn

pip install sklearn

3. 使用sklearn

3.1 导入模块

import numpy as np   #导入numpy基础模块
from sklearn import datasets  #导入内置数据
from sklearn.cross_validation import train_test_split   #导入分离训练集与测试集数据方法
from sklearn.neighbors import KNeighborsClassifier  #导入模型算法

3.2 数据准备

iris=datasets.load_iris()  #加载数据集
iris_X=iris.data
iris_y=iris.target
#将数据集中的数据与标签分开

3.3 划分训练集与测试集

X_train,X_test,y_train,y_test=train_test_split(iris_X,iris_y,train_size=0.8)

3.4 模型选择与训练

knn=KNeighborsClassifier()
knn.fit(X_train,y_train)

3.5 输出预测结果并与标签比较

print("predict result:",knn.predict(X_test))
print("True    result:",y_test)

  • 由于机器学习是预测,并不能达到100%的正确率因此,会有部分与实际不一致的情况

练习绘制饼图

绘制标签为”SH”,”BJ”,”SZ”,”GD”的饼图,按以下比例绘制。20,10,30,25

1. 导入相关库

import numpy as np
import matplotlib.pyplot as plt

2. 代码

labels=["SH","BJ","SZ","GD"]
frace=[20,10,30,25]
ex=[0,0,0.05,0]
plt.pie(x=frace,labels=labels,explode=ex,labeldistance=0.8)
plt.show()

3. 代码参数说明

参数

说明

形式

labels

标签

列表

explode

设置分块距离中心点的距离,传入的为一个列表

列表

labeldistance

标签距离中心的距离,当小于1时,在图片内部,大于1时,在外部

数值