shiny自动更新数据的例子

通常,我们用shiny做的可视化界面,数据在一开始读入后,即使数据源的数据有变动,也往往需要手动进行刷新操作。若希望数据能定时自动刷新,则可以通过在实时表达式中添加invalidateLater()来实现。

invalidateLater函数是使对象在指定时间后无效化并重新执行,如invalidateLater(20000)可实现每2秒钟自动刷新数据。

invalidateLater(millis, session = getDefaultReactiveDomain())

下面的例子是展示每秒自动更新的实时时间。可以运行试试

library(shiny)

# ui ------------------------------------------
ui <- shinyUI(fluidPage(
textOutput("currentTime")
))

# server ----------------------------------------
server <- shinyServer(function(input, output) {

t <- reactive({
invalidateLater(1000)  #1000毫秒之后重新执行
paste("当前时间是:", Sys.time())
})

output$currentTime <- renderText({
t()
})
})

# Run the application
shinyApp(ui = ui, server = server)

谈谈沉没成本

沉没成本是什么?沉没成本是指由于过去的决策已经发生了的,而不能由现在或将来的任何决策改变的成本。沉没成本是相对可变成本而言,沉没成本不能被改变的,从这个意义上讲,我们在经济活动中做决策时,应该尽量排除沉没成本的干扰。

对于理性人来说,应该更多的考虑边际量。一个教科书式的例子是,航空公司对等退票的乘客的票价问题。假设,一个100个座位的飞机飞行一次,航空公司的成本是10万,于是,每个座位的平均成本是1000元。当飞机即将起飞前,有乘客退票,这时,用人愿意用500元购买这张票,航空公司应该卖给他吗?当然卖咯,因为10万基本是沉没成本,而增加一位乘客的边际成本很低,这里不应被沉没成本干扰,只要边际收入大于边际成本,理性的决策者就应该考虑采取这项行动。

沉没成本又叫“协和效应”。20世纪60年代,英法两国政府联合投资开发大型超音速客机。即协和飞机。该种飞机机身大、装饰豪华并且速度快.其开发可以说是一场豪赌,单是设计一个新引擎的成本就可能高达数亿元。过程中,已经发现问题,但由于考虑到之前的巨大投入,并未终止。最终,研发完成时,却是经济损失惨重。这就是受沉没成本干扰的典型例子,我们在决策时应该尽量避免。

继续阅读“谈谈沉没成本”

贝叶斯算法进行负面微博识别的python实现

负面微博的识别,实际上可以理解为是文本分类的问题,正面还是负面微博?贝叶斯是文本分类的常用算法,对于中文文本来说,分词也是必不可少的步骤。python可以非常方便的实现,以下是具体过程及代码。

# -*- coding: utf-8 -*-
from __future__ import division
from __future__ import unicode_literals
import pandas as pd
import numpy as np
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.cross_validation import cross_val_predict
from sklearn.metrics import classification_report
from sklearn.pipeline import Pipeline
from random import shuffle
from sklearn.externals import joblib

# 读取标记数据-----------
# 微博文本在weibo.xlsx文件中,一行一条微博。
# 字段content为微博内容文本,
# 字段isaction为微博标识,1为负面微博,否则为0
s1 = pd.read_excel('weibo.xlsx')
s1['isaction'] = s1['isaction'].fillna(0)

# 分类数量
# 查看微博类别分布,发现数据不平衡,负面微博占比不到1/10
print(s1.groupby('isaction').size())

# 不平衡数据过采样处理----------
# 处理不平衡数据,以提升模型质量
s1_1 = s1[s1['isaction'] == 1]
# 将正类复制扩大至4份,不宜过大,否则容易过拟合
for n in range(0, 3):
s1 = pd.concat([s1, s1_1], ignore_index=True)

# 打乱数据-------------
r = np.arange(0, s1.shape[0])
shuffle(r)
s1 = s1.iloc[r, :]

#分词,使用jieba分词----------
s1['class'] = s1['content'].apply(lambda x: " ".join(jieba.cut(x)))

#词袋-----------------------
# 首先统计词频,再进行Tf-idf转换,TfidfVectorizer()封装了这两步
vectorizer = TfidfVectorizer()
vec = vectorizer.fit(s1['class'])
t1 = vec.transform(s1['class'])

# 算法-------------------
# 朴素贝叶斯常见的有高斯贝叶斯、多项式贝叶斯、伯努利贝叶斯,这里显然多项式贝叶斯更合适
nb = MultinomialNB()

# 训练及评估------------
# 这里简化处理,仅通过5折交叉验证。
# 在数据量足够的情况下,还是建议将数据集分为训练集、验证集和测试集,仅在最后检验时使用测试集
# 调节算法的alpha值,并通过循环自动评估
for n in np.arange(0.1, 1.1, 0.1):
pre = cross_val_predict(
nb.set_params(alpha=n), t1.toarray(), s1['isaction'], cv=5, n_jobs=-1)
print(nb.alpha)
print(classification_report(s1['isaction'], pre))

# 生成最终模型管道-----------
# 经过验证,alpha=0.6时效果最好,用这个参数对全部数据进行训练,生成最终模型
nb = MultinomialNB(alpha=0.6)
nb.fit(t1.toarray(), s1['isaction'])
vec_nb = Pipeline([('vec', vec), ('nb', nb)])

# 保存模型管道,下次可以直接载入使用-------
joblib.dump(vec_nb, 'vec_nb.pkl')

如何开始设计微博舆情监控系统

舆情监控对于企业来说,至少有如下三个作用:
1、了解用户的关注点;
2、了解行业热点及竞品动态;
3、快速呈现企业的负面消息,并了解原因,以便快速处理;

大体来说,舆情系统构建的流程包括:数据收集、数据处理、舆情分析、结果呈现。下面以微博信息挖掘为例,快速说明一下舆情系统的构建步骤,每一个步骤内容都有很多学问,这里仅抛砖引玉。

首先,定义问题。微博上时常有对其公司的负面消息,需要对其进行有效地回复以处理。但是,之前人工在网上逐条排查的方式,不仅较消耗人力,而且时而完成处理的时间较晚,造成负面的进一步传播。于是,我们希望能将负面微博自动识别,并将结果第一时间提供给运营或客服团队。

继续阅读“如何开始设计微博舆情监控系统”