精华内容
下载资源
问答
  • python做数据分析实例

    千次阅读 热门讨论 2017-10-08 19:02:24
    本文用到的数据在评论区留下邮箱即可。 本文通过对美国枪杀数据的探索,综合运用python做一些数据的提取和统计

    本文用到的数据,可以加QQ跟群主获取:
    群名称:PYTHONERS-数据
    群 号:663468799
    学习python和数据分析推荐地方: www.datacamp.com
    获取datacamp官网会员的方式:get_datacamp()


    本文用到的数据在评论区留下邮箱即可。或者点击这里可以拿到: guns.csv

    第一步:

    使用csv模块以列表形式读取数据集。

    导入csv模块。
    
    使用open()函数打开文件。
    
    使用csv.reader()函数加载打开的文件。
    

    在结果上调用list()以获取文件中所有数据的列表。

    将结果分配给变量data。
    

    显示第一5行data以验证一切。

    import csv 
    with open("guns.csv", "r") as file:
        data = list(csv.reader(file))
    data[:5]
    
    
    [['',
      'year',
      'month',
      'intent',
      'police',
      'sex',
      'age',
      'race',
      'hispanic',
      'place',
      'education'],
     ['1',
      '2012',
      '01',
      'Suicide',
      '0',
      'M',
      '34',
      'Asian/Pacific Islander',
      '100',
      'Home',
      '4'],
     ['2', '2012', '01', 'Suicide', '0', 'F', '21', 'White', '100', 'Street', '3'],
     ['3',
      '2012',
      '01',
      'Suicide',
      '0',
      'M',
      '60',
      'White',
      '100',
      'Other specified',
      '4'],
     ['4', '2012', '02', 'Suicide', '0', 'M', '64', 'White', '100', 'Home', '4']]
    

    第二步:

    提取第一行data,并将其分配给变量headers。
    
    删除第一行data。
    
    显示headers。
    
    显示第一5行data以验证是否正确删除了标题行。
    
    headers = data[0]
    data = data[1:]
    print(headers)
    print(data[:5])
    
    ['', 'year', 'month', 'intent', 'police', 'sex', 'age', 'race', 'hispanic', 'place', 'education']
    [['1', '2012', '01', 'Suicide', '0', 'M', '34', 'Asian/Pacific Islander', '100', 'Home', '4'], ['2', '2012', '01', 'Suicide', '0', 'F', '21', 'White', '100', 'Street', '3'], ['3', '2012', '01', 'Suicide', '0', 'M', '60', 'White', '100', 'Other specified', '4'], ['4', '2012', '02', 'Suicide', '0', 'M', '64', 'White', '100', 'Home', '4'], ['5', '2012', '02', 'Suicide', '0', 'M', '31', 'White', '100', 'Other specified', '2']]
    

    第三步:

    使用列表推导从中提取year列data。

    因为year列是数据中的第二列,您需要1在每行的索引中获取元素。
    
    将结果分配给变量years。
    

    创建一个空的字典year_counts。

    循环遍历每个元素years。

    如果元素不是键year_counts,创建它,并将值设置为1。
    
    如果元素是键year_counts,则将值增加1。
    

    显示year_counts每年发生多少枪死亡事件。

    years = [row[1] for row in data]
    year_counts = {}
    for year in years:
        if year in year_counts:
            year_counts[year] += 1
        else:
            year_counts[year] = 1
    year_counts
    
    {'2012': 33563, '2013': 33636, '2014': 33599}
    

    第四步:

    使用list comprehension datetime.datetime为每行创建一个对象。将结果分配给dates。

    year在每个行中的第二元件列。
    
    该month柱是在每行中的第三个元素。
    
    确保使用int()转换year和month整数。
    
    通过year,month并day=1进入datetime.datetime()功能。
    

    显示第一5行dates以验证一切正常。

    计数每个唯一日期发生的次数dates。将结果分配给date_counts。

    这跟我们在最后一个屏幕中做了类似的过程year_counts。
    

    显示date_counts。

    import datetime
    
    dates = [datetime.datetime(year=int(row[1]), month=int(row[2]), day=1)  for row in data]
    date_counts = {}
    dates[:5]
      
    for date in dates:
        if date in date_counts:
            date_counts[date] +=1
        else:
            date_counts[date] = 1
    date_counts
    
    {datetime.datetime(2012, 1, 1, 0, 0): 2758,
     datetime.datetime(2012, 2, 1, 0, 0): 2357,
     datetime.datetime(2012, 3, 1, 0, 0): 2743,
     datetime.datetime(2012, 4, 1, 0, 0): 2795,
     datetime.datetime(2012, 5, 1, 0, 0): 2999,
     datetime.datetime(2012, 6, 1, 0, 0): 2826,
     datetime.datetime(2012, 7, 1, 0, 0): 3026,
     datetime.datetime(2012, 8, 1, 0, 0): 2954,
     datetime.datetime(2012, 9, 1, 0, 0): 2852,
     datetime.datetime(2012, 10, 1, 0, 0): 2733,
     datetime.datetime(2012, 11, 1, 0, 0): 2729,
     datetime.datetime(2012, 12, 1, 0, 0): 2791,
     datetime.datetime(2013, 1, 1, 0, 0): 2864,
     datetime.datetime(2013, 2, 1, 0, 0): 2375,
     datetime.datetime(2013, 3, 1, 0, 0): 2862,
     datetime.datetime(2013, 4, 1, 0, 0): 2798,
     datetime.datetime(2013, 5, 1, 0, 0): 2806,
     datetime.datetime(2013, 6, 1, 0, 0): 2920,
     datetime.datetime(2013, 7, 1, 0, 0): 3079,
     datetime.datetime(2013, 8, 1, 0, 0): 2859,
     datetime.datetime(2013, 9, 1, 0, 0): 2742,
     datetime.datetime(2013, 10, 1, 0, 0): 2808,
     datetime.datetime(2013, 11, 1, 0, 0): 2758,
     datetime.datetime(2013, 12, 1, 0, 0): 2765,
     datetime.datetime(2014, 1, 1, 0, 0): 2651,
     datetime.datetime(2014, 2, 1, 0, 0): 2361,
     datetime.datetime(2014, 3, 1, 0, 0): 2684,
     datetime.datetime(2014, 4, 1, 0, 0): 2862,
     datetime.datetime(2014, 5, 1, 0, 0): 2864,
     datetime.datetime(2014, 6, 1, 0, 0): 2931,
     datetime.datetime(2014, 7, 1, 0, 0): 2884,
     datetime.datetime(2014, 8, 1, 0, 0): 2970,
     datetime.datetime(2014, 9, 1, 0, 0): 2914,
     datetime.datetime(2014, 10, 1, 0, 0): 2865,
     datetime.datetime(2014, 11, 1, 0, 0): 2756,
     datetime.datetime(2014, 12, 1, 0, 0): 2857}
    

    第五步:

    计数sex列中每个项目的次数。

    将结果分配给sex_counts。
    

    计数race列中每个项目的次数。

    将结果分配给race_counts。
    

    显示race_counts和sex_counts验证您的工作,并查看是否可以发现任何模式。

    写一个降价细胞,详细说明你迄今为止学到的内容,你认为可能需要进一步检查。

    sex_counts = {}
    race_counts = {}
    sexs = [row[5] for row in data[1:]]
    races = [row[7] for row in data[1:]]
    def count(items):
        item_counts = {}
        for item in items:
            if item in item_counts:
                item_counts[item] += 1
            else:
                item_counts[item] = 1
        return item_counts
    sex_counts = count(sexs)
    race_counts = count(races)
    
    sex_counts
    race_counts
    
    {'Asian/Pacific Islander': 1326,
     'Black': 23296,
     'Hispanic': 9022,
     'Native American/Native Alaskan': 917,
     'White': 66237}
    

    用到的知识点:

    1. 利用CSV模块导入CSV文件,将数据转化成数据列表
    2. 利用列表切片,删除表头
    3. 利用datetime模块,列表推导式,统计年份数量
    4. 统计性别和种族数量

    第六步:

    读入census.csv并转换为列表列表。将结果分配给census变量。
    
    显示census以验证您的工作。
    
    with open("census.csv") as file:
        census = list(csv.reader(file))
        
    
    
    ['Id', 'Year', 'Id', 'Sex', 'Id', 'Hispanic Origin', 'Id', 'Id2', 'Geography', 'Total', 'Race Alone - White', 'Race Alone - Hispanic', 'Race Alone - Black or African American', 'Race Alone - American Indian and Alaska Native', 'Race Alone - Asian', 'Race Alone - Native Hawaiian and Other Pacific Islander', 'Two or More Races']
    ['cen42010', 'April 1, 2010 Census', 'totsex', 'Both Sexes', 'tothisp', 'Total', '0100000US', '', 'United States', '308745538', '197318956', '44618105', '40250635', '3739506', '15159516', '674625', '6984195']
    

    第七步:

    手动创建一个字典,mapping将每个键映射race_counts到比赛的人口数census。

    在字典中的键应该是Asian/Pacific Islander,Black,Native
    
    American/Native Alaskan,Hispanic,和White。
    
    在这种情况下Asian/Pacific Islander,您需要添加来自censusfor Race
    Alone - Asian和... 的计数Race Alone - Native Hawaiian and Other Pacific Islander。
    

    创建一个空字典,race_per_hundredk。

    循环通过每个键race_counts。

    将与键相关联的值除以与键race_counts相关联的值mapping。
    
    通过乘法100000。
    
    将结果分配给相同的键race_per_hundredk。
    

    当你完成后,race_per_hundredk应该包含每个100000人种族种族枪支死亡率。

    打印race_per_hundredk以验证您的工作。

    mapping = {
        "Asian/Pacific Islander": 15159516 + 674625,
        "Native American/Native Alaskan": 3739506,
        "Black": 40250635,
        "Hispanic": 44618105,
        "White": 197318956
    }
    
    race_per_hundredk = {}
    for item in race_counts:
        race_per_hundredk[item] = race_counts[item]/mapping[item]*100000
    
    race_per_hundredk
    
    
    
    
    
    {'Asian/Pacific Islander': 8.374309664161762,
     'Black': 57.8773477735196,
     'Hispanic': 20.220491210910907,
     'Native American/Native Alaskan': 24.521955573811088,
     'White': 33.56849303419181}
    

    第八步:

    intent使用列表解析提取列。该intent柱是在第四列中data。

    将结果分配给intents。
    

    race使用列表解析提取列。该race柱是在第八列data。

    将结果分配给races。
    

    创建一个空的字典 homicide_race_counts

    使用该enumerate()功能循环遍历每个项目races。应将该位置分配给循环变量i,并将值分配给循环变量race。

    检查在位置值i在intents。
    
    如果在位置值i的intents是Homicide:
    
        如果密钥race不存在homicide_race_counts,创建它。
        
        添加1到相关联的价值race在homicide_race_counts。
    

    完成后,homicide_race_counts应该为每个种族分类中的一个键data。相关的价值应该是该次种族的凶杀枪死亡人数。

    执行我们在最后一个屏幕使用也做了同样的程序mapping上homicide_race_counts得到从原始数据到每个率100000。

    显示homicide_race_counts以验证您的工作。

    将你的发现写在一个降价单元格中。

    使用降价单元格中的数据编写您要追求的任何后续步骤。

    intents = [row[3] for row in data[1:]]
    
    races = [row[7] for row in data[1:]]
    
    homicide_race_counts = {}
    
    for i, race in enumerate(races):
        if intents[i] == "Homicide":
            if race in homicide_race_counts:
                homicide_race_counts[race] += 1
            else:
                homicide_race_counts[race] = 1
    homicide_race_counts
    
    {'Asian/Pacific Islander': 559,
     'Black': 19510,
     'Hispanic': 5634,
     'Native American/Native Alaskan': 326,
     'White': 9147}
    
    hm_race_per_hundredk = {}
    
    for item in homicide_race_counts:
        hm_race_per_hundredk[item] = homicide_race_counts[item]/mapping[item]*100000
    
    hm_race_per_hundredk   
    
    
    {'Asian/Pacific Islander': 3.530346230970155,
     'Black': 48.471284987180944,
     'Hispanic': 12.627161104219914,
     'Native American/Native Alaskan': 8.717729026240365,
     'White': 4.6356417981453335}
    

    1

    展开全文
  • Python数据分析实例

    万次阅读 多人点赞 2019-06-14 22:13:37
    Python数据分析 Python爬取网页数据

    Python数据分析

    Python爬取网页数据

    // An highlighted block
    import requests
    if __name__=="__main__":
        response = requests.get("https://book.douban.com/subject/26986954/")
        content = response.content.decode("utf-8")
        print(content)
    
    // An highlighted block
    import requests
    url="https://pro.jd.com/mall/active/4BNKTNkRMHJ48QQ5LrUf6AsydtZ6/index.html"
    try:
        r=requests.get(url)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        print(r.text[:100])
    except:
        print("爬取失败")
    

    Python生成柱状图

    // An highlighted block
    import matplotlib.pyplot as plt  
      
    num_list = [1.5,0.6,7.8,6]  
    plt.bar(range(len(num_list)), num_list,color='rbgy')  
    plt.show()  
    

    在这里插入图片描述
    Python生成堆状柱状图

    // An highlighted block
    import matplotlib.pyplot as plt  
      
    name_list = ['Monday','Tuesday','Friday','Sunday']  
    num_list = [1.5,0.6,7.8,6]  
    num_list1 = [1,2,3,1]  
    plt.bar(range(len(num_list)), num_list, label='boy',fc = 'y')  
    plt.bar(range(len(num_list)), num_list1, bottom=num_list, label='girl',tick_label = name_list,fc = 'r')  
    plt.legend()  
    plt.show()  
    

    在这里插入图片描述
    Python生成竖状柱状图

    // An highlighted block
    import matplotlib.pyplot as plt  
      
    name_list = ['Monday','Tuesday','Friday','Sunday']  
    num_list = [1.5,0.6,7.8,6]  
    num_list1 = [1,2,3,1]  
    x =list(range(len(num_list)))  
    total_width, n = 0.8, 2  
    width = total_width / n  
      
    plt.bar(x, num_list, width=width, label='boy',fc = 'y')  
    for i in range(len(x)):  
        x[i] = x[i] + width  
    plt.bar(x, num_list1, width=width, label='girl',tick_label = name_list,fc = 'r')  
    plt.legend()  
    plt.show()  
    

    在这里插入图片描述
    Python生成折线图

    // An highlighted block
    import pandas as pd
    import numpy as np
     
    df = pd.DataFrame(np.random.rand(15, 4), columns=['a', 'b', 'c', 'd'])
    df.plot.area() 
    

    在这里插入图片描述
    Python生成柱状图

    // An highlighted block
    import pandas as pd
    import numpy as np
     
    df = pd.DataFrame(3 * np.random.rand(5), index=['a', 'b', 'c', 'd','e'], columns=['x'])
    df.plot.pie(subplots=True)
    

    在这里插入图片描述
    Python生成箱型图

    // An highlighted block
    #首先导入基本的绘图包
    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    
    #添加成绩表
    plt.style.use("ggplot")
    plt.rcParams['axes.unicode_minus'] = False
    plt.rcParams['font.sans-serif']=['SimHei'] 
    
    #新建一个空的DataFrame
    df=pd.DataFrame()
    
    // An highlighted block
    df["英语"]=[76,90,97,71,70,93,86,83,78,85,81]
    df["经济数学"]=[65,95,51,74,78,63,91,82,75,71,55]
    df["西方经济学"]=[93,81,76,88,66,79,83,92,78,86,78]
    df["计算机应用基础"]=[85,78,81,95,70,67,82,72,80,81,77]
    df
    
    // An highlighted block
    plt.boxplot(x=df.values,labels=df.columns,whis=1.5)
    plt.show()
    

    在这里插入图片描述

    // An highlighted block
    #用pandas自带的画图工具更快
    df.boxplot()
    plt.show()
    

    在这里插入图片描述
    Python生成正态分布图

    // An highlighted block
    # -*- coding:utf-8 -*-
    # Python实现正态分布
    # 绘制正态分布概率密度函数
    import numpy as np
    import matplotlib.pyplot as plt
    import math
    
    u = 0  # 均值μ
    u01 = -2
    sig = math.sqrt(0.2)  # 标准差δ
    
    x = np.linspace(u - 3 * sig, u + 3 * sig, 50)
    y_sig = np.exp(-(x - u) ** 2 / (2 * sig ** 2)) / (math.sqrt(2 * math.pi) * sig)
    print(x)
    print("=" * 20)
    print(y_sig)
    plt.plot(x, y_sig, "r-", linewidth=2)
    plt.grid(True)
    plt.show()
    

    在这里插入图片描述
    喜欢的小伙伴可以尝试一下哦

    这是小编公众号,请动动您可爱的小手手,关注一下💓😘
    在这里插入图片描述

    展开全文
  • Python进行数据分析的好处是,它的数据分析库目前已经很全面了,有NumPy、pandas、SciPy、scikit-learn、StatsModels,还有深度学习、神经网络的各类包。基本上能满足大部分的企业应用。用Python的好处是从数据...

    用Python进行数据分析的好处是,它的数据分析库目前已经很全面了,有NumPy、pandas、SciPy、scikit-learn、StatsModels,还有深度学习、神经网络的各类包。基本上能满足大部分的企业应用。用Python的好处是从数据抽取、数据收集整理、数据分析挖掘、数据展示,都可以在同一种Python里实现,避免了开发程序的切换。

    这里就和大家分享我做的一个应用实例。解决问题:自动进行销售预测,提高准确率,减少人工一个一个SKU进行预测分析。最终的效果如下图:

    20171208220919_49342.png

    1、用到的工具

    当然我们只需要用Python和一些库就可以了。

    pandas:数据整理

    numpy:pandas的前提,科学计算

    MySQLdb:mysql数据库链接

    statsmodels:统计建模

    pylab:图形处理

    flask:web框架

    2、Flask的安装

    请参考 http://docs.jinkan.org/docs/flask/,在Flask的app目录下建立一个forecasting.py的python文件,在Flask的app的templates目录下建立一个forecastin.html的模版文件,两个文件的内容如下:

    forecasting.py

    # -*- coding: utf-8 -*-

    from app import app

    from flask import render_template

    @app.route('/forecasting/')

    def forecasting(item=None):

    return render_template("forecasting.html")

    forecastin.html

    Hello World

    Hello World

    在DOS窗口运行

    python d:pyflaskrun.py

    在浏览器打开http://127.0.0.1:5000/就可以看到forecasting.html模版的内容显示了。

    20171208221016_31673.png

    接下来我们从头建一个预测模型。

    3、建立数据库并填写数据

    CREATE TABLE `sale` (

    `SaleMonth` datetime DEFAULT NULL,

    `Sale` float DEFAULT NULL

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    数据自己录入啦。

    4、相关库的引入

    我们现在在之前第2点建立的文件的基础上进行修改,

    在forecasting.py的头部引入以下库

    # -*- coding: utf-8 -*-

    from app import app

    from flask import render_template

    import pylab

    import pandas as pd

    import numpy as np

    from pandas import Series,DataFrame

    import MySQLdb

    import pandas.io.sql as sql

    import statsmodels.api as sm

    import time

    import datetime

    from dateutil.relativedelta import relativedelta

    import random

    5、定义路由

    @app.route('/forecasting/')

    意思就是我们访问例如http://127.0.0.1:5000/forecasting/2的地址对于就是解析到forecasting.py文件,其中是可变的URL部分,如上面的URL的2

    6、定义函数

    def forecasting(lag=None):

    其中lag就是接受URL中的参数,我们定义lag是自回归函数的滞后期数

    7、数据库链接

    conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='123456',db='bi',charset='utf8')

    str_sql = "select SaleMonth as Month,Sale from sale order by SaleMonth"

    sale=sql.read_sql(str_sql,conn)

    8、数据处理

    我们整理数据以适合使用。

    ##//数据处理

    #转换数据中的月份为日期类型,并把它定义为pandas索引

    sale.Month = pd.to_datetime(sale.Month)

    sale = sale.set_index("Month")

    ##//提取最大月份和最小月份

    start = min(sale.index)

    end = max(sale.index)

    ##定义预测的月份,在最大月份的基础上加1-4

    pre_start =end+relativedelta(months=1)

    pre_end =end+relativedelta(months=4)

    #必要的转换

    pre_start =pre_start.strftime('%Y-%m-%d')

    pre_end =pre_end.strftime('%Y-%m-%d')

    #生成时间序列,从最小月份到最大月份

    i = pd.date_range(start, end, freq='MS')

    df = DataFrame(i,i)

    #定义列、定义索引index名

    df.columns = ['T']

    df.index.names =['Month']

    #把sale与df合并,通过索引

    rs = pd.merge(sale,df,left_index=True,right_index=True,how='outer')

    #删除临时列T,并把rs转换为html,方便后面输出到模版中

    del rs['T']

    data = rs.to_html()

    9、数据预测

    ##预测

    #对rs进行对数变换

    rs = np.log(rs)

    #对rs进行自回归,lag是自回归的滞后因子,来自函数的lag参数,即来自RUL的参数

    r = sm.tsa.AR(rs).fit(maxlag=lag, method='mle', disp=-1)

    #对未来四个月进行预测

    fcst_lg = r.predict(start,pre_end)

    #对预测的结果进行指数变换,因为之前做了对数变换

    fcst = np.exp(fcst_lg)

    #转换fcst为pandas的DataFrame格式

    fcst = DataFrame(fcst)

    #定义列名和索引,用于和原来的rs合并

    fcst.columns=['fcst']

    fcst.index.names =['Month']

    #合并fcst和rs到rs_out

    rs_out = pd.merge(sale,fcst,left_index = True,right_index = True,how='outer')

    #rs_out转换为记录格式,再转换为html格式,以方便输出到模版中显示

    #取得最后的4行作为预测的显示输出,不知道为什么rs_out[-4:-1]这个输出漏了最后一行

    rs_fcst = rs_out[-4:-1]

    rs_fcst = rs_fcst.to_html()

    rs2 = rs_out.to_records()

    rs_out = rs_out.to_html()

    10、数据整理

    我使用了echart web图标框架进行显示。

    ##以下是处理表格数据输出到echart的json格式

    tmp=u""

    tmp1=""

    tmp2=""

    tmp3=""

    for t in rs2:

    #tmp1 += "{'label':'" + str(t.Month.year)+"/"+str(t.Month.month) + "','value':'" + str(t.Qty) + "'},"

    #tmp1 += ""

    tmp1 += "'"+str(t.Month.year)+"/"+str(t.Month.month)+"',"

    #tmp2 += ""

    tmp2 += str('%.0f' % t.Sale) +","

    #tmp3 += ""

    tmp3 += str('%.0f' % t.fcst) +","

    tmp +=""+tmp1+""

    tmp +=u""+tmp2+""

    tmp +=u""+tmp3+""+""

    tmp1 = tmp1[:-1]

    tmp2 = tmp2[:-1]

    tmp2 = tmp2.replace('nan',''-'')

    tmp3 = tmp3[:-1]

    tmp=u'''{

    title : {text: '测试',subtext: '纯属虚构'},

    tooltip : {trigger: 'axis'},

    legend: {data:['实际销售','预测销售']},

    toolbox: {

    show : true,

    feature : {

    mark : {show: false},dataView : {show: true, readOnly: false},

    magicType : {show: true, type: ['line', 'bar']},

    restore : {show: true},saveAsImage : {show: false}

    }

    },

    calculable : true,

    dataZoom : {show : true,realtime : true,start : 0,end : 100},

    xAxis : [{type : 'category',data : [%s]}],

    yAxis : [{type : 'value',min : 5000,scale : true}],

    series : [

    {

    name:'实际销售',type:'bar',data:[%s],

    markPoint : {

    data : [{type : 'max', name: '最大值'},{type : 'min', name: '最小值'}]

    },

    markLine : {data : [{type : 'average', name: '平均值'}]}

    },

    {

    name:'预测销售',type:'line',data:[%s],

    }

    ]

    };''' %(tmp1,tmp2,tmp3)

    11、生成公式

    生成一个公式能更直观显示变量之间的关系。

    #生成动态公式图片

    rp = r.params

    ftext=''

    i=0

    for rp1 in rp:

    if (i==0) and (rp1>0) :const = '+' + str(("%.4f" % rp1))

    if (i==0) and (rp1<0) :const = str(("%.4f" % rp1))

    if (i==1):ftext = ftext + str(("%.4f" % rp1))+'y_{t-'+str(i)+'}'

    if (i>1) and (rp1>0):ftext = ftext + '+' + str(("%.4f" % rp1))+'y_{t-'+str(i)+'}'

    if (i>1) and (rp1<0):ftext = ftext + str(("%.4f" % rp1))+'y_{t-'+str(i)+'}'

    i +=1

    f = r'$y_{t}='+ftext+const + '$'

    f2 = r'$y=ln(w_{t})$'

    fig = pylab.figure()

    #设置背景为透明

    fig.patch.set_alpha(0)

    text = fig.text(0, 0, f)

    # 把公式用公式图片的方式保存

    dpi = 300

    fig.savefig('d:/py/formula.png', dpi=dpi)

    # Now we can work with text's bounding box.

    bbox = text.get_window_extent()

    width, height = bbox.size / float(dpi/4) + 0.005

    # Adjust the figure size so it can hold the entire text.

    fig.set_size_inches((width, height))

    # Adjust text's vertical position.

    dy = (bbox.ymin/float(dpi))/height

    text.set_position((0, -dy))

    # Save the adjusted text.

    url = 'D:/py/Flask/app/static/images/1.png'

    fig.savefig(url, dpi=dpi)

    12、输出到模版

    把py程序中的在模版中用到的结果输出到模版。

    return render_template("forecasting.html",r=r,rs_out=rs_out,tmp=tmp,lag=lag,f=f,f2=f2,rs_fcst=rs_fcst)

    13、设计模版

    我们可以用{{变量名}}来接受来自py程序的变量。

    分析结果

    // 路径配置

    require.config({

    paths:{

    'echarts' : '/static/ECharts/build/echarts',

    'echarts/chart/bar' : '/static/ECharts/build/echarts',

    'echarts/theme/macarons':'/static/ECharts/src/theme/macarons',

    }

    });

    require(

    [

    'echarts',

    'echarts/theme/macarons',

    'echarts/chart/bar', // 使用柱状图就加载bar模块,按需加载

    'echarts/chart/line' // 使用柱状图就加载bar模块,按需加载

    ],

    function (ec,theme) {

    // 基于准备好的dom,初始化echarts图表

    var myChart = ec.init(document.getElementById('main'),theme);

    var option = {{tmp | safe}}

    myChart.setOption(option);

    }

    );

    .right{text-align: right}

    body{font-size: 12px;background:white}

    Summary of AR Results

    Lag length:

    {{r.k_ar}}

    Samples:

    {{r.nobs}}

    Model:

    AR

    -----------------------------------------

    AIC:

    {{'%.4f' % r.aic}}

    BIC:

    {{'%.4f' % r.bic}}

    FPE:

    {{'%.4f' % r.fpe}}

    HQIC:

    {{'%.4f' % r.hqic}}

    ----------------------------------------------------------

    Results for equation

    ==========================================================

    X

    coefficient

    std.error

    t-stat

    p-value

    {% for i in range(lag+1) %}

    {% if i==0 %}

    const

    {% else %}

    Y(t-{{i}})

    {% endif %}

    {{'%.4f' % r.params[i]}}

    {{'%.4f' % r.bse[i]}}

    {{'%.4f' % r.tvalues[i]}}

    {{'%.4f' % r.pvalues[i]}}

    {% endfor %}

    ----------------------------------------------------------

    预测

    ==========================================================

    {{rs_fcst | safe}}

    1.png?"

    14、实际应用

    在这各例子中,我们只是对一个产品、一个模型、一个参数进行了预测。

    在实际应用中,可以批量对产品、多个模型、多种参数进行预测,写一个判定预测模型好坏的算法,自动确定每种产品的最优模型和参数,定期自动计算各产品的预测值。

    希望这个思路能帮到大家。

    展开全文
  • 对Excel数据进行读取并重新整理至新Excel,并绘制Excel中数据为图表
  • python进行数据分析实例数据
  • 分享知识要点:lubridate包拆解时间 | POSIXlt利用决策树分类,利用随机森林预测利用对数进行fit,和exp函数还原训练集来自Kaggle华盛顿自行车共享计划中的自行车租赁数据分析共享自行车与天气、时间等关系。数据...

    编辑推荐:

    来源于cnblogs,介绍了利用决策树分类,利用随机森林预测,

    利用对数进行fit,和exp函数还原等。

    分享

    2018080741.png

    知识要点:

    lubridate包拆解时间 | POSIXlt

    利用决策树分类,利用随机森林预测

    利用对数进行fit,和exp函数还原

    训练集来自Kaggle华盛顿自行车共享计划中的自行车租赁数据,分析共享自行车与天气、时间等关系。数据集共11个变量,10000多行数据。

    https://www.kaggle.com/c/bike-sharing-demand

    首先看一下官方给出的数据,一共两个表格,都是2011-2012年的数据,区别是Test文件是每个月的日期都是全的,但是没有注册用户和随意用户。而Train文件是每个月只有1-20天,但有两类用户的数量。

    求解:补全Train文件里21-30号的用户数量。评价标准是预测与真实数量的比较。

    2018080742.png

    1.png

    首先加载文件和包

    library (lubridate)

    library (randomForest)

    library (readr)

    setwd ("E:")

    data <-read_csv ("train.csv")

    head (data)

    这里我就遇到坑了,用r语言缺省的read.csv死活读不出来正确的文件格式,换成xlsx更惨,所有时间都变成43045这样的怪数字。本来之前试过as.Date可以正确转换,但这次因为有时分秒,就只能用时间戳,但结果也不行。

    最后是下载了"readr"包,用read_csv语句,顺利解读。

    因为test比train日期完整,但缺少用户数,所以要把train和test合并。

    test$registered=0

    test$casual=0

    test$count=0

    data<-rbind(train,test)

    摘取时间:可以用时间戳,这里的时间比较简单,就是小时数,所以也可以直接截字符串。

    data$hour1<-substr

    (data$datetime,12,13)

    table(data$hour1)

    统计一下每个小时的使用总数,是这样(为什么介么整齐):

    2018080749.png

    6-hour1.png

    接下来是运用箱线图,看一下使用者和时间,周几这些的关系。为什么用箱线图而不用hist直方图,因为箱线图有离散点表达,下面也因此运用对数求fit

    从图中可以看出,在时间方面,注册用户和非注册用户的使用时间有很大不同。

    2018080743.png

    5-hour-regestered.png

    2018080744.png

    5-hour-casual.png

    2018080745.png

    4-boxplot-day.png

    接下来用相关系数cor检验用户,温度,体感温度,湿度,风速的关系。

    相关系数:变量之间的线性关联度量,检验不同数据的相关程度。

    取值范围[-1,1],越接近0越不相关。

    从运算结果可以看出,使用人群与风速呈负相关,比温度影响还大。

    2018080746.png

    cor.png

    接下来就是将时间等因素用决策树分类,然后用随机森林来预测。随机森林和决策树的算法。听起来很高大上,其实现在也很常用了,所以一定要学会。

    决策树模型是 一种简单易用的非参数分类器。它不需要对数据有任何的先验假设,计算速度较快,结果容易解释,而且稳健性强,不怕噪声数据和缺失数据。

    决策树模型的基本计 算步骤如下:先从n个自变量中挑选一个,寻找最佳分割点,将数据划分为两组。针对分组后数据,将上述步骤重复下去,直到满足某种条件。

    在决策树建模中需要解决的重要问题有三个:

    如何选择自变量

    如何选择分割点

    确定停止划分的条件

    做出注册用户和小时的决策树,

    train$hour1<-as.integer(train$hour1)

    d<-rpart (registered~hour1,data=train)

    rpart .plot(d) >

    2018080747.png

    3-raprt-hour1.png

    然后就是根据决策树的结果手动分类,所以还满占代码的...

    train$hour1

    <-as.integer(train$hour1)

    data$dp_reg=0

    data$dp_reg[data$hour1 <7.5]=1

    data$dp_reg[data$hour1> =22]=2

    data$dp_reg[data$hour1 >=9.5 & data$hour1<18]=3

    data$dp_reg[data$hour1> =7.5 & data$hour1<18]=4

    data$dp_reg[data$hour1> =8.5 & data$hour1<18]=5

    data$dp_reg[data$hour1> =20 & data$hour1<20]=6

    data$dp_reg[data$hour1> =18 & data$hour1<20]=7

    同理,做出 (小时 | 温度) X (注册 | 随意用户) 等决策树,继续手动分类....

    2018080748.png

    3-raprt-temp.png

    年份月份,周末假日等手动分类

    data$year_part=0

    data$month <-month(data$datatime)

    data$year_part [data$year=='2011']=1

    data$year_part [data$year=='2011' & data $month>3]

    = 2

    data$year_part[data$year=='2011' & data $month>6]

    = 3

    data$year_part[data$year=='2011' & data $month>9]

    = 4

    data$day_type=""

    data$day _type [data$holiday ==0 & data$workingday==0]

    ="weekend"

    data$day_type[data$holiday==1] ="holiday"

    data$day_type[data$holiday ==0 & data$workingday==1]

    ="working day"

    data$weekend=0

    data$weekend [data$day= ="Sunday"|data$day=

    =" Saturday "] =1

    接下来用随机森林语句预测

    在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。

    随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,再在其中选取最优的特征。这样决策树都能够彼此不同,提升系统的多样性,从而提升分类性能。

    ntree指定随机森林所包含的决策树数目,默认为500,通常在性能允许的情况下越大越好;

    mtry指定节点中用于二叉树的变量个数,默认情况下数据集变量个数的二次方根(分类模型)或三分之一(预测模型)。一般是需要进行人为的逐次挑选,确定最佳的m值―摘自datacruiser笔记。这里我主要学习,所以虽然有10000多数据集,但也只定了500。就这500我的小电脑也跑了半天。

    train<-data

    set.seed (1234)

    train$logreg <-log(train$registered+1)

    test$logcas <-log(train$casual+1)

    fit1 <-randomForest (logreg~hour1+ workingday

    + day + holiday + day_ type+ temp_reg+ humidity

    + atemp + windspeed + season+ weather+ dp_ reg+

    weekend + year+year _part ,train ,importance =

    TRUE , ntree = 250)

    pred1 <-predict (fit1,train)

    train $logreg <-pred1

    这里不知道怎么回事,我的day和day_part加进去就报错,只有删掉这两个变量计算,还要研究修补。

    然后用exp函数还原

    train$registered<-exp(train$logreg)-1

    train$casual<-exp(train$logcas)-1

    train$count<-test$casual+train$registered

    最后把20日后的日期截出来,写入新的csv文件上传。

    train2<-train[as.integer

    (day(data$datetime))> = 20 ,]

    submit_final <-data.frame (datetime= test$

    datetime ,count= test$count)

    write.csv(submit _final,"submit_ final.csv

    ", row .names = F)

    展开全文
  • 基于python数据分析实例表格i_nuc.xls,代码中所用到的资源,便于实际进行操作。涉及到基于python的大数据抽取,修改,增加等相关操作。
  • 实例内容来自《利用python进行数据分析》。 本文中可能使用的数据集来自:《利用python进行数据分析》数据集。 MovieLens 1M数据集 由GroupLens实验室从MoviesLens收集,内容是20世纪90年代末带21世纪初的电影评分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 105,849
精华内容 42,339
关键字:

python做数据分析实例

python 订阅