Python数据分析之共享单车及建模探索(CLV建模、可视化)
开发环境

4.3【开发平台及环境】
Windons 10 教育版
Python 3.7
IntelliJ IDEA 2018.2.1 / PyCharm
Googe Chrome
数据清洗 分析模块pandas,numpy
可视化模块matplotlib

上期原创:
Python数据分析之智联招聘职位分析完整项目(数据爬取,数据分析,数据可视化)
链接: https://blog.csdn.net/weixin_46205203/article/details/104187696

一:数据格式

中文字段:

订单ID,用户ID,单车类型,开始时间,开始定位,结束定位

注释:后续会通过geohash模块计算经纬度转换成具体距离

数据大小:

180M

前言

数据涵盖了48万 + 的单车,涵盖了近35W的骑,通过导入Geohash脚本中的decode函数,获取经纬度,用haversine公式计算球面两点间的距离。并计算和预估每个用户的消费和统计单车骑行公里数超过多少提示报修

代码

控制台输出显示所有行
from DPM_File.showed import show
import datetime# show()
import pandas as pd
import geohash
import seaborn as sns
from math import radians, cos, sin, asin, sqrt
import matplotlib.pyplot as pltfile = 'F:/数据集/国内摩拜共享单车数据集/train.csv'
df = pd.read_csv('%s' % file, sep=',', parse_dates=['starttime'])# 数据涵盖了48万 + 的单车,涵盖了近35W的骑
bikeid_size, userid_size = df['bikeid'].unique().size, df.userid.unique().size
print(bikeid_size, '辆单车 ', userid_size, '用户')# 抽取1%的数据
df = df.sample(frac=0.002)
print('抽取20%的数据:', len(df))
# 通过导入Geohash脚本中的decode函数,获取经纬度
df["start_lat_lng"] = df["geohashed_start_loc"].apply(lambda s: geohash.decode(s))
df["end_lat_lng"] = df["geohashed_end_loc"].apply(lambda s: geohash.decode(s))
# # 获取出发地点所在区块周围的8个相邻区块编码
# df['start_neighbors'] = df['geohashed_start_loc'].apply(lambda s: mzgeohash.neighbors(s))
# # 提取区块对应的6位Geohash编码
# df["geohashed_start_loc_6"] = df["geohashed_start_loc"].apply(lambda s: s[0:6])
# df["geohashed_end_loc_6"] = df["geohashed_end_loc"].apply(lambda s: s[0:6])
# # 获取出发地点所在区块周围的8个相邻区块的6位Geohash编码
# df["start_neighbors_6"] = df["geohashed_start_loc_6"].apply(lambda s: mzgeohash.neighbors(s))
# print(df.head(5))
print("Geohash编码处理完毕!")
# 判断目的地是否在当前区块或相邻区块内
print('一阶完成!!!')
# 用haversine公式计算球面两点间的距离
def haversine(lon1, lat1, lon2, lat2):# 这里error,需要专float类型才能进行运算lon1, lat1, lon2, lat2 = map(radians, [float(lon1), float(lat1), float(lon2), float(lat2)])dlon = lon2 - lon1dlat = lat2 - lat1# print(type(lon1.head(1)))# print(type(lon2.head(1)))# print(type(lat1.head(1)))# print(type(lat2.head(1)))a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2c = 2 * asin(sqrt(a))r = 6371  # 地球平均半径,单位为公里return c * r * 1000df["start_end_distance"] = df.apply(lambda s: haversine(s['start_lat_lng'][1],s['start_lat_lng'][0], s['end_lat_lng'][1],s['end_lat_lng'][0]), axis=1)
print('二阶完成')#获取小时
df['hour'] = df['starttime'].apply(lambda s : s.hour)
# print(df.head(5))
hour_group = df[['userid','hour']].groupby('hour',as_index=False).count()
print(hour_group.sort_values('userid',ascending=False))hour_num_df = hour_group.agg({'userid':'count'}).reset_index()
sns.barplot(x=hour_group['hour'],y = hour_group['userid'],data = hour_num_df)
# plt.bar(hour_group['hour'],hour_group['userid'])
sns.displot(df['start_end_distance'])
plt.show()#单车报修统计
'统计单车骑行公里数超过多少提示报修'
number_bike = df[['bikeid','start_end_distance']].groupby('bikeid',as_index=False).sum()
number_bike = number_bike[number_bike['start_end_distance']>  ]
number_bike = number_bike.sort_values('start_end_distance',ascending=False)
print(number_bike.head(5))

结果 1

" start_end_distance " 开始到结束的距离(单位:公里)
注释:180M数据,随机抽取了 20%

结果 2

每个时间段订单走势(赶时间省略100字)
注释:180M数据,随机抽取了 20%

结果 3

预估单车骑行公里数超过多少提示报修


number_bike = number_bike[number_bike['start_end_distance']> N ]
print(number_bike.head(5))
  bikeid  start_end_distance  = N 有自行车行业经验的自行决定

439670 10754.385365
441905 9453.600628
251484 8895.594132
355054 8895.594132
385307 7830.297728

CLV探索

计算用户骑行距离所消费的金额money
‘3km=1元=5分钟’
‘6km=2元=10分钟’
‘12km=3元=15分钟’
‘经过上述统计得到2017-05-24 19:00:16为结束时间,数据量320W条’
‘统计frequency频次为0的占比(2017-05-10 到 2017-05-24之间)’
‘使用BG / NBD 模型分析频次和/新近度bgf’
‘预测前5大客户未来T=15天可能发生的购买频次’
‘未来T日可能产生多少ORI ?’

注释:这个个人定义的,实际骑行距离所用的时间因人而异

from lifetimes.utils import *
from lifetimes import *
from commerce.CLV.摩拜bike import df
import pandas as pd
import datetime'1.分析用户未来5天可能消费的频次和消费金额(CLV建模)'
# 需要的字段
data = df[['userid', 'starttime', 'start_end_distance']]
# 筛选出骑行距离大于0的
data = data[data['start_end_distance'] > 0]# 计算用户骑行距离所消费的金额money
# '3km=1元=5分钟'
# '6km=2元=10分钟'
# '12km=3元=15分钟'
def fun(x):if 0 <= x < 3000:return 1elif 3000 <= x < 5000:return 2elif 5000 <= x < 7000:return 3elif 7000 <= x < 9000:return 4elif 9000 <= x < 11000:return 5elif x >= 11000:return 50data['money'] = data['start_end_distance'].apply(lambda x: fun(x))
# 特殊时间格式处理
data['starttime'] = pd.to_datetime(data['starttime'], unit='s').dt.strftime('%Y-%m-%d %H:%M:%S')
print(data.head(5))
print(list(data['starttime']))
# 将时间排序 ,查看开始日期到结束日期 0.003=2017-05-10 00:02:45  2017-05-24 18:58:01
# a = list(data['starttime'])
# def get_list(date):
#     return datetime.datetime.strptime(date, "%Y-%m-%d %H:%M:%S").timestamp()
# list = sorted(a, key=lambda date: get_list(date))
# print(list[1])'经过上述统计得到2017-05-24 19:00:16为结束时间,数据量320W条'
# CLV建模
CLV_data = summary_data_from_transaction_data(data, 'userid', 'starttime',monetary_value_col='money',observation_period_end='2017-05-24')print('CLV建模后:', len(CLV_data), ' 行\n', CLV_data.head(5))# 统计frequency频次为0的占比(2017-05-10 到 2017-05-24之间)
frequencys = (sum(CLV_data.frequency == 0) / len(data)) * 100
print('频次为0的占比:', round(frequencys, 2), ' %', len(CLV_data), ' 行')# 使用BG / NBD 模型分析频次和/新近度bgf
bgf = BetaGeoFitter(penalizer_coef=0)
bgf.fit(CLV_data['frequency'], CLV_data['recency'], CLV_data['T'])
print('lifetimes数据: ', '\n', bgf)
print('lifetimes数据summary: ', '\n', bgf.summary)# 预测前5大客户未来T=15天可能发生的购买频次
T = 15
data = CLV_data[CLV_data['frequency'] > 0]
data['predicted_purchases'] = bgf.conditional_expected_number_of_purchases_up_to_time(T, data['frequency'], data['recency'], data['T'])
# 未来T日可能产生多少ORI?
data['ORI'] = data.monetary_value * data.predicted_purchases
ROI = data.sort_values(by='predicted_purchases', ascending=False)
# print('未来T日客户购买频次和ORI:', len(data), ' 行\n', data.head(5))
print('预测15天内该前5大客户购买频次:', '\n', ROI.head(5))# 有时候出错,要检测 penalizer_coef (惩戒系数)

赶时间不写了(数据比较大,不上传了,要数据看主页加V)

Python数据分析之共享单车及建模探索(CLV建模、可视化)相关推荐

  1. [译] 用 Redis 和 Python 构建一个共享单车的 app

    原文地址:Build a bikesharing app with Redis and Python 原文作者:Tague Griffith 译文出自:掘金翻译计划 本文永久链接:github.com ...

  2. python汽车租赁程序_python数据分析实例:共享单车租用影响因素探索

    kaggle网站(Bike Sharing Demand | Kaggle)提供了某城市的共享单车2011年到2012年的数据集.该数据集包括了租车日期,租车季节,租车天气,租车气温,租车空气湿度等数 ...

  3. Python数据分析项目-共享单车骑行数据分析

    背景介绍 随着我国的经济迅速发展,城市人口急剧增加,随之带来的是一系列的问题,交通拥堵,环境受到破坏,发展公共交通可以完美的解决现在我们面临的这些问题,自行车具有机动灵活.低碳环保的优点,如果自行车可 ...

  4. 用Python语言实现共享单车的数据分析

    import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sn from dat ...

  5. 共享单车已死亡34家:每一个名字都带着血

    2019独角兽企业重金招聘Python工程师标准>>> 共享单车起步于2016年,爆发于2017年,死亡于2017年-- 2016年下半年,资本如潮水一般涌入共享单车领域,最疯狂的时 ...

  6. Python数据分析实战:上海二手房价分析

    1 数据搜集 使用 urllib 库中的request 模块爬取赶集网发布的上海二手房信息,包括包括户型.面积.单价等,再使用BeautifulSoup 库解析爬取的HTML数据,最终将数据保存到CS ...

  7. 三大招式熟练Python数据分析

    Illustrations by  Vitaly Cherkasov 文/罗攀 前言 天下武功中,哪个是最简单,最实用的了?那当然是程咬金的三板斧.传说中,程咬金晚上睡觉,梦见一老神仙,教了他三十六式 ...

  8. python共享单车案例分析_python分析数据分析项目:共享单车租用情况影响因素探索分析...

    python分析数据分析项目:共享单车租用情况影响因素探索分析

  9. python数据分析案例(四):共享单车租用分析

    1.数据获取 数据集来源:https://www.kaggle.com/pronto/cycle-share-dataset trip.csv字段描述 trip_id starttime stopti ...

最新文章

  1. 如何更优雅地对接第三方API
  2. linux服务器延时,Linux 服务器高I/O 等待延迟问题查找
  3. html制作动态坐标轴,HTML5 canvas制作动态随机星图
  4. 盐城出台推进大数据产业发展实施意见
  5. Java讲课笔记35:初探泛型
  6. python简单代码恶搞-一个可以套路别人的python小程序实例代码
  7. c# chart 各个属性_C#之Chart控件系列教程
  8. ntfs是什么硬盘?ntfs硬盘如何在苹果电脑使用
  9. U盘启动BIOS设置
  10. pyqt5 选择打开文件夹与读取文件夹图片列表
  11. 国家开放大学2021春2405现代汉语(1)题目
  12. #loj3124. 「CTS2019 | CTSC2019」氪金手游
  13. 语音合成学习(一)综述
  14. Linux设置sudo无需密码【Ubuntu、多种方法】
  15. Fiddler显示IP的设置方法
  16. 安超云荣获“国民云计算品牌”值得关注奖
  17. solarwinds如何使用
  18. java基于springboot +vue的图书馆图书借阅系统 nodejs前后端分离
  19. 华为HG8245C光猫设置VOIP
  20. 开源免费企业平台Odoo的简介和应用

热门文章

  1. 全国首个!中国电信携手华为完成钢铁场景RedCap测试
  2. 电脑怎么改变图片分辨率?在线修改图片分辨率的方法
  3. 蓝桥杯——十六进制转八进制
  4. 伪原创-在线伪原创-免费在线伪原创
  5. 记账软件,管理借还款,教你如何登记还款信息
  6. 两台电脑在局域网内如何同步数据
  7. 理解OAuth2协议原理
  8. 数据可视化实战:数据处理
  9. 腾讯云轻量应用服务器CPU主频?处理器型号说明
  10. 从GitLab拉取项目到本地