楼主: hy32gt
992 6

[编程问题求助] 统计分析数据处理求助 [推广有奖]

  • 1关注
  • 2粉丝

硕士生

93%

还不是VIP/贵宾

-

威望
0
论坛币
431 个
通用积分
4.7204
学术水平
2 点
热心指数
2 点
信用等级
0 点
经验
1891 点
帖子
83
精华
0
在线时间
279 小时
注册时间
2012-7-13
最后登录
2020-11-11

楼主
hy32gt 学生认证  发表于 2018-3-19 11:40:42 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
还是举个例子吧data1.dta

date       id       amount
20180301  1     5
20180301  1     15
20180301  2    17
20180303  1    17
20180303  2    19
在做每天统计时,如果
bysort date:egen totalamt=total(amount)
bysort date:egen totalcnt=count(1)
得到的结果必然是
date totalcnt  totalamt
20180301 3  37
20180303  2  36
由于原始数据中缺少20180302的数据所以结果中就没有该行
请问大神,有什么简单点的方法可以实现(一年中有好多天有这样的数据,而且业务也有这样的要求,需要展示)
date totalcnt  totalamt
20180301 3  37
20180302 0  0
20180303  2  36

简单讲就是插入缺失日期
我想到的方法是,做一张全量的时间数据data2.dta从统计日期开始到结束

date
20180301
20180302
20180303
用data1 merge data2 的方法补充这一条,在统计记录totalcnt的时候小心一些不要出错就行
请问下各位大神,有简单点的方法么?按照我的方法,如果数据每天都有更新,我每天还需要做这个data2,想尽可能写成do文件,一步到位,减少手工步骤和出错概率。有没有办法譬如我猜的,定义个连续时间序列什么的,自动填充?或者有啥好办法么,谢谢各位了。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:数据处理求助 统计分析 数据处理 计分析 amount

回帖推荐

蓝色 发表于6楼  查看完整内容

沙发
蓝色 发表于 2018-3-19 12:50:41
1、看看下面帖子,学习怎么提问
https://bbs.pinggu.org/thread-272681-1-1.html
https://bbs.pinggu.org/thread-5048204-1-1.html, 与
https://bbs.pinggu.org/thread-5917273-1-1.html

2、先执行下面命令安装dataex命令:  ssc install dataex。
3、用 dataex 命令,可以从你使用的数据中随机抽取一部分数据,
这样提供的数据就是你使用的有”代表性”的数据,别人才容易回答,
4、同时,列出你所使用的命令和结果。 别人才能好判断和修正

藤椅
hy32gt 学生认证  发表于 2018-3-19 13:33:30
恩恩,感谢楼上提醒啊,我改改
  1. clear
  2. input long debit_id str19 basic_time double initial_applyamount
  3. 19211016 "2016-09-01 16:04:20" 20000
  4. 19211018 "2016-09-02 16:02:14" 41000
  5. 19211019 "2016-09-05 17:00:57" 33600
  6. 19211021 "2016-09-05 18:14:50" 17000
  7. 19211037 "2016-09-08 11:46:19" 34080
  8. 19211040 "2016-09-08 19:23:16" 20000
  9. 19211046 "2016-09-09 14:42:39" 47000
  10. 19211049 "2016-09-09 16:17:47" 60000
  11. 19211050 "2016-09-09 16:50:42" 46000
  12. 19211051 "2016-09-09 17:19:29" 24000
  13. 19211053 "2016-09-10 12:12:26" 20000
  14. 19211055 "2016-09-10 13:03:08" 21000
  15. 19211056 "2016-09-10 14:55:16" 27600
  16. 19211057 "2016-09-10 15:59:44" 54000
  17. 19211058 "2016-09-10 16:17:38" 55000
  18. 19211060 "2016-09-10 16:38:44" 30000
  19. 19211062 "2016-09-10 18:29:20" 24400
  20. end
复制代码

  1. *打算按天汇总统计initial_applyamount及统计记录数
  2. gen date=substr( basic_time,1,10)
  3. bysort date:egen totalamt=total(initial_applyamount)
  4. bysort date:egen totalcnt=count(1)
  5. bysort date:drop if date==date[_n-1]
复制代码


结果如下
  1. clear
  2. input str10 date float(totalamt totalcnt)
  3. "2016-09-01"  20000 1
  4. "2016-09-02"  41000 1
  5. "2016-09-05"  50600 2
  6. "2016-09-08"  54080 2
  7. "2016-09-09" 177000 4
  8. "2016-09-10" 232000 7
  9. end
复制代码


想获得的数据
  1. clear
  2. input str10 date float(totalamt totalcnt)
  3. "2016-09-01"  20000 1
  4. "2016-09-02"  41000 1
  5. "2016-09-03"      0 0
  6. "2016-09-04"      0 0
  7. "2016-09-05"  50600 2
  8. "2016-09-06"      0 0
  9. "2016-09-07"      0 0
  10. "2016-09-08"  54080 2
  11. "2016-09-09" 177000 4
  12. "2016-09-10" 232000 7
  13. end
复制代码


简单讲就是得在原来的统计结果中插入空缺的日期,谢谢各位了

板凳
hy32gt 学生认证  发表于 2018-3-19 13:45:27
蓝色 发表于 2018-3-19 12:50
1、看看下面帖子,学习怎么提问
https://bbs.pinggu.org/thread-272681-1-1.html
https://bbs.pinggu.org/t ...
恩恩,感谢提醒啊,学习了

报纸
hy32gt 学生认证  发表于 2018-3-19 13:57:24
我暂时想到的做法
生成一个data2
  1. clear
  2. input str10 date
  3. "2016-09-01"
  4. "2016-09-02"
  5. "2016-09-03"
  6. "2016-09-04"
  7. "2016-09-05"
  8. "2016-09-06"
  9. "2016-09-07"
  10. "2016-09-08"
  11. "2016-09-09"
  12. "2016-09-10"
  13. end
复制代码

  1. save "C:\Users\user\Desktop\data2.dta"
复制代码


然后在原数据data1中
  1. merge 1:1 date using "C:\Users\user\Desktop\data2.dta"
  2. replace totalamt=0 if totalamt==.
  3. replace totalcnt=0 if totalcnt==.
  4. drop _merge
  5. sort date
复制代码


该做法虽然可以解决问题,但如果每天需要出这样的数据的话,每天都得更新这个data2以确保区间长度正确,是否有减少人工处理的方法,以减少差错,感谢感谢

地板
蓝色 发表于 2018-3-19 14:47:33
  1.                   
  2. clear
  3. input str10 date
  4. "2016-09-01"
  5. "2016-09-02"
  6. "2016-09-03"
  7. "2016-09-07"
  8. "2016-09-08"
  9. "2016-09-10"
  10. end               

  11. gen time=date(date,"YMD")
  12. format time %tdCCYY-NN-DD
  13. tsset time
  14. tsfill

  15. list
复制代码


7
hy32gt 学生认证  发表于 2018-3-19 14:52:03
蓝色 发表于 2018-3-19 14:47
感谢感谢,是这个目的,谢谢大神

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-20 03:50