数据分析练习(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内容展示: