可视化分析三
一.今日内容
1、 编程,在一个折线图中,画出影片A、B、C各自的周票房(文件中的所有涉及地区总周票房)收入变化,要求将输出的折线图保存成图像文件ans0303.jpg,程序源代码保存成ans0303.py,Y轴表示票房收入,单位为“万元”;X轴表示时间,以“0、1、2、3…n”的非负整数作为刻度值,单位为“周”,要求:
1) 折线图中含图例;
2) 三部电影用不同的颜色和线型表达;
3) 将电影A第一周的票房收入,电影B第二周的票房收入,电影C第三周的票房收入顺序存入ans0304.dat文件中,注意ans0303.dat只包含3个浮点型票房数据,以万元为单位,保留6位小数,数据以英文逗号分隔,不换行,文件样例如下:
23.123456,20.654321,18.123456
4) 对本题周票房的说明如下:若某部电影从某月2日开始上映,则从当月2日到8日为其第一周票房,9日至15日为其第2周票房,以此类推。
二.内容源码
import pandas as pd
import numpy as np
import datetime,sys
import matplotlib.pyplot as plt
csv_file = pd.read_csv(r"C:\Users\liu\Desktop\arg\film_log3.csv",sep=';',header=None)
csv_file.fillna(0,inplace=True)
csv_file = csv_file.drop_duplicates()
def get_movie(str):
return csv_file[csv_file[0].isin([str])]
def real_data(movie_name):
data = get_movie(movie_name)
index = np.arange(data.index.size)
return data.set_index(index)
def get_dt(data):
start_time = datetime.datetime.strptime(data[1][0], '%Y.%m.%d')
end_time = datetime.datetime.strptime(data[2][0], '%Y.%m.%d')
c_days = (end_time - start_time).days + 1
return c_days
def a_week_total(data,days):
total = data[7].str.replace('票房(万)','').astype(float).sum()
return total
def main(name):
data = real_data(name)
days = get_dt(data)
total = a_week_total(data,days)
week = divmod(days,7)
a_day = total / days
total_weeks = [float('%.6f'%(a_day*7)) for i in range(week[0])]
total_weeks.append(float('%.6f'%(a_day * week[1])))
return total_weeks
movie_a = main("《简单爱》")
movie_b = main("《少年班》")
movie_c = main( "《冲上云霄》")
l1, = plt.plot(np.arange(len(movie_a)),movie_a,'r')
l2, = plt.plot(np.arange(len(movie_b)),movie_b,'g')
l3, = plt.plot(np.arange(len(movie_c)),movie_c,'b')
plt.ylabel('周平均票房(万元)')
plt.xlabel('周')
plt.legend([l1,l2,l3],['《简单爱》',"《少年班》" ,"《冲上云霄》"],loc=0)
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False #这两行需要手动设置
plt.savefig('ans0303.jpg')
plt.show()
f = open('ans0303.dat','w')
f.write('%f,%f,%f'%(movie_a[0],movie_b[1],movie_c[2]))
f.close()
三.遇到问题
- 折线图的画法
- 各个电影数据的获取以及数据分析等
四.解决方案
折线图可以根据matplotlib中的简单例子来进行模拟,关键是里边的各个参数所代表的含义