2023 年第二届钉钉杯大学生大数据挑战赛 初赛 B:美国纽约公共自行车使用量预测分析 问题二Python代码分析

2023 年第二届钉钉杯大学生大数据挑战赛 初赛 B:美国纽约公共自行车使用量预测分析 问题二

在这里插入图片描述

相关链接

【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B:美国纽约公共自行车使用量预测分析 问题一Python代码分析

【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B:美国纽约公共自行车使用量预测分析 问题二Python代码分析

【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B:美国纽约公共自行车使用量预测分析 问题三时间序列预测Python代码分析

1 题目

Citi Bike是纽约市在2013年启动的一项自行车共享出行计划,由“花旗银行”(Citi Bank)赞助并取名为“花旗单车”(Citi Bike)。在曼哈顿,布鲁克林,皇后区和泽西市有8,000辆自行车和500个车站。为纽约的居民和游客提供一种 方便快捷,并且省钱的自行车出行方式。人们随处都能借到Citi Bank,并在他们的目的地归还。本案例的数据有两部分:第一部分是纽约市公共自行车的借还交易流水表。Citi Bik自行车与共享单车不同,不能使用手机扫码在任意地点借还车,而需要使用固定的自行车桩借还车,数据集包含2013年7月1日至2016年8 月31日共38个月(1158天)的数据,每个月一个文件。其中2013年7月到2014年8 月的数据格式与其它年月的数据格式有所差别,具体体现在变量starttime和stoptime的存储格式不同。

第二部分是纽约市那段时间的天气数据,并存储在weather_data_NYC.csv文 件中,该文件包含2010年至2016年的小时级别的天气数据。

公共自行车数据字段表

变量编号变量名变量含义变量取值及说明
1trip duration旅行时长骑行时间,数值型,秒
2start time出发时间借车时间,字符串,m/d/YYY HH:MM:SS
3stop time结束时间还车时间,字符串,m/d/YYY HH:MM:SS
4start station id借车站点编号定性变量,站点唯一编号
5start station name借车站点名称字符串
6start station latitude借车站点维度数值型
7start station longtude借车站点经度数值型
8end station id还车站点编号定性变量,站点唯一编号
9end station name还车站点名称字符串
10end station latitude还车站点纬度数值型
11end station longitude还车站点经度数值型
12bile id自行车编号定性变量,自行车唯一编号
13Use type用户类型Subscriber:年度用户; Customer:24小时或者7天的临时用户
14birth year出生年份仅此列存在缺失值
15gender性别0:未知 1:男性 2:女性

天气数据字段简介表

变量编号变量名变量含义变量取值及说明
1date日期字符串
2time时间EDT(Eastern Daylight Timing)指美国东部夏令单位
3temperature气温单位:℃
4dew_poit露点单位:℃
5humidity湿度百分数
6pressure海平面气压单位:百帕
7visibility能见度单位:千米
8wind_direction风向离散型,类别包括west,calm等
9wind_speed风速单位:千米每小时
10moment_wind_speed瞬间风速单位:千米每小时
11precipitation降水量单位:毫米,存在缺失值
12activity活动离散型,类别包括snow等
13conditions状态离散型,类别包括overcast,light snow等
14WindDirDegrees风向角连续型,取值为0~359
15DateUTC格林尼治时间YYY/m/d HH:MM

二、解决问题

  1. 自行车借还情况功能实现:

实现各个站点在一天的自行车借还情况网络图,该网络图是有向图,箭头从借车站点指向还车站点(很多站点之间同时有借还记录,所以大部分站点两两之间是双向连接)。

(一)以2014年8月3日为例进行网络分析,实现自行车借还网络图,计算网络图的节点数,边数,网络密度(表示边的个数占所有可能的连接比例数),给出计算过程和画图结果。

(二)使用上述的网络分析图,对经度位于40.695~40.72,纬度位于- 74.023~-73.973之间的局域网区域进行分析,计算出平均最短路径长度(所有点 两两之间的最短路径长度进行算数平均)和网络直径(被定义网络中最短路径的 最大值)。

  1. 聚类分析

对于2013年7月1日至2015年8月31日数据集的自行车数据进行聚类分析,选 择合适的聚类数量K值,至少选择两种聚类算法进行聚类,并且比较不同的聚类 方法以及分析聚类结果。

  1. 站点借车量的预测分析:

对所有站点公共自行车的借车量预测,预测出未来的单日借车量。将2013年 7月-2015年7月数据作为训练集,2015年8月1-31日的数据作为测试集,预测2015 年8月1-31日每天的自行车单日借车量。给出每个站点预测结果的MAPE,并且给 出模型的参数数量,最后算出所有站点的MAPE的均值(注:测试集不能参与到训 练和验证中,否则作违规处理)。
M A P E = 1 n ∑ ∣ y i − y i ^ y i ∣ × 100 % MAPE = \frac{1}{n} \sum{|\frac{y_i-\hat{y_i}}{y_i}|} \times 100\% MAPE=n1yiyiyi^×100%

data.csv是纽约市公共自行车的借还交易流水信息,格式如下表,请使用python对数据预处理和特征工程后,聚类分析:

公共自行车数据字段表

变量编号变量名变量含义变量取值及说明
1trip duration旅行时长骑行时间,数值型,秒
2start time出发时间借车时间,字符串,m/d/YYY HH:MM:SS
3stop time结束时间还车时间,字符串,m/d/YYY HH:MM:SS
4start station id借车站点编号定性变量,站点唯一编号
5start station name借车站点名称字符串
6start station latitude借车站点维度数值型
7start station longtude借车站点经度数值型
8end station id还车站点编号定性变量,站点唯一编号
9end station name还车站点名称字符串
10end station latitude还车站点纬度数值型
11end station longitude还车站点经度数值型
12bile id自行车编号定性变量,自行车唯一编号
13Use type用户类型Subscriber:年度用户; Customer:24小时或者7天的临时用户
14birth year出生年份仅此列存在缺失值
15gender性别0:未知 1:男性 2:女性

2 问题分析

2.1 问题一

  1. 绘制有向图

a. 读入数据并分别提取“起始站点编号”和“结束站点编号”两列数据,构建自行车借还网络图。

b. 对于第一步构建的网络图,我们需要计算网络图的节点数,边数,网络密度。节点数即为站点数,边数为借还次数。网络密度为边的数量占所有可能的连接比例。

c. 画出自行车借还网络图。

e. 计算平均最短路径长度和网络直径

首先选出符合条件(经度位于40.695~40.72,纬度位于- 74.023~-73.973之间)的借车站点和还车站点,并以它们为节点构建一个子图进行分析。然后可以直接使用networkx库中的函数来计算平均最短路径长度和网络直径。

2.2 问题二

  1. 数据预处理:对进行数据清洗和特征提取。可以使用PCA、LDA算法进行降维,减小计算复杂度。

  2. 聚类算法:
    a. K-means: 进行数据聚类时,选择不同的K值进行多次试验,选取最优的聚类结果。可以使用轮廓系数、Calinski-Harabaz指数等评价指标进行比较和选择。
    b. DBSCAN: 利用密度对数据点进行聚类,不需要预先指定聚类的数量。使用基于密度的聚类算法时,可以通过调整半径参数和密度参数来得到不同聚类效果。
    c. 层次聚类:可分为自顶向下和自底向上两种方式。通过迭代计算每个数据点之间的相似度,将数据点逐渐合并,最后得到聚类结果。

    d.改进的聚类算法

    e. 深度聚类算法

  3. 聚类结果分析:选择最优的聚类结果后,对不同类别骑车的用户进行画像。分析每个类别的用户行为特征。

2.3 问题三

  1. 导入数据并进行数据预处理,整合以站点为单位的借车数据。
  2. 对数据进行时间序列分析,使用ARIMA模型进行单日借车量预测。
  3. 使用时间序列交叉验证方法进行模型评估,计算每个站点预测结果的MAPE。
  4. 计算所有站点的MAPE的均值,给出模型的参数数量。

3 Python代码实现

3.1 问题一

【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B:美国纽约公共自行车使用量预测分析 问题一Python代码分析

3.2 问题二

3.2.1 读取数据

导入包

import pandas as pd
from sklearn.cluster import Birch
from sklearn.cluster import AgglomerativeClustering
from sklearn.decomposition import PCA
import time
from sklearn import metrics
import os
from sklearn.cluster import MeanShift
from tqdm import tqdm
import numpy as np
import warnings
warnings.filterwarnings("ignore")
tqdm.pandas()

# 合并数据
folder_path = '初赛数据集/2013_2015'
dfs = []
for filename in os.listdir(folder_path):
    if filename.endswith('.csv'):
        csv_path = os.path.join(folder_path, filename)
        tempdf = pd.read_csv(csv_path)
        dfs.append(tempdf)
data = pd.concat(dfs,axis=0)

# 根据数据表的字段说明,删除与研究无关的列,例如自行车编号和出生年份等信息,并在必要时删除带有缺失值的行。
data.drop(['bikeid', 'birth year'], axis=1, inplace=True)
data.dropna(inplace=True)    # 删除带有缺失值的行
data.shape

3.2.3 特征工程

创建新特征,包括:出发时间和结束时间之间的差值,以及出发站点和结束站点之间的距离(通过经纬度计算)等


from math import radians, sin, cos, acos
from datetime import datetime

data['starttime'] = pd.to_datetime(data['starttime'])  # 将时间格式转换为datetime
data['stoptime'] = pd.to_datetime(data['stoptime'])
# 计算时间差值和路程距离
data['duration'] = data['stoptime'] - data['starttime']
data['duration'] = data['duration'] / pd.Timedelta(seconds=1)  # 将时间差值转换为秒数


def get_distance(lat1, lng1, lat2, lng2):
    """
    根据两点经纬度计算路程距离,单位为米
    """
   。。。略
    return distance * 1000
data['distance'] = data.apply(
    lambda row: get_distance(row['start station latitude'], row['start station longitude'], 
                             row['end station latitude'], row['end station longitude']), axis=1)

features = ['tripduration', 'start station latitude', 'start station longitude', 
            'end station latitude', 'end station longitude', 'duration', 'distance']

clear_data =data[features]
clear_data.to_excel('初赛数据集/特征工程后的数据.xlsx',index=False)

3.2.3 聚类分析

K 值分析,采用手肘法



start = time.time()
trainingData = weight
SSE = []  # 存放每次结果的误差平方和
k1 = 2
k2 = 10
trainingData =weight 
for k in range(k1, k2):
    estimator = KMeans(n_clusters=k, max_iter=10000, init="k-means++", tol=1e-6)
    estimator.fit(trainingData)
    SSE.append(estimator.inertia_) # estimator.inertia_获取聚类准则的总和
end = time.time()
print(f'耗时:{end-start}s')
X = range(k1,k2)
plt.figure(figsize=(8,6))
plt.xlabel('k',fontsize=20)
plt.ylabel('SSE',fontsize=20)
plt.plot(X, SSE, 'o-')
plt.savefig('img/手肘法.png',dpi=300)
plt.show()

3.2.4 Kmeas聚类

from sklearn.cluster import KMeans
start = time.time()

trainingData = weight
clf = KMeans(n_clusters=4,max_iter=10000, init="k-means++", tol=1e-6)
result = clf.fit(trainingData)
source = list(clf.predict(trainingData))
end = time.time()
label = clf.labels_
print(f'耗时:{end-start}s')
silhouette = metrics.silhouette_score(trainingData, label)
print("silhouette: ", silhouette)

import matplotlib.pyplot as plt
import seaborn as sns
# 使用PCA将样本点投影到二维平面上
pca = PCA(n_components=2)
reduced_data = pca.fit_transform(weight)
source = list(clf.predict(trainingData))
# 绘制每个样本点与其对应的簇标签
plt.figure(figsize=(8, 6))
sns.scatterplot(x=reduced_data[:, 0], y=reduced_data[:, 1], hue=source, palette='bright')
plt.savefig('img/kmeans.png',dpi=300)
plt.show()

在这里插入图片描述

3.2.5 AGG层次聚类

start = time.time()
trainingData = weight
# 使用层次聚类
clf = AgglomerativeClustering(n_clusters=4, linkage='ward', affinity='euclidean')
result = clf.fit(trainingData)
source = list(clf.labels_)
end = time.time()
label = clf.labels_
print(f'耗时:{end-start}s')
silhouette = metrics.silhouette_score(trainingData, label)
print("silhouette: ", silhouette)

import matplotlib.pyplot as plt
import seaborn as sns
# 使用PCA将样本点投影到二维平面上
pca = PCA(n_components=2)
reduced_data = pca.fit_transform(weight)
source = list(clf.predict(trainingData))
# 绘制每个样本点与其对应的簇标签
plt.figure(figsize=(8, 6))
sns.scatterplot(x=reduced_data[:, 0], y=reduced_data[:, 1], hue=source, palette='bright')
plt.savefig('img/agg聚类.png',dpi=300)
plt.show()

3.2.6 DBSCAN聚类

from sklearn.cluster import DBSCAN
from sklearn.decomposition import PCA
import time
from sklearn import metrics
start = time.time()
trainingData = weight
clf = DBSCAN(eps=0.08, min_samples=7)
result = clf.fit(trainingData)
source = list(clf.fit_predict(trainingData))
end = time.time()
label = clf.labels_

print(f'耗时:{end-start}s')
silhouette = metrics.silhouette_score(trainingData, label)
print("silhouette: ", silhouette)

import matplotlib.pyplot as plt
import seaborn as sns
# 使用PCA将样本点投影到二维平面上
pca = PCA(n_components=2)
reduced_data = pca.fit_transform(weight)
source = list(clf.predict(trainingData))
# 绘制每个样本点与其对应的簇标签
plt.figure (figsize=(8, 6))
sns.scatterplot(x=reduced_data[:, 0], y=reduced_data[:, 1], hue=source, palette='bright')
plt.savefig('img/dbscan.png',dpi=300)
plt.show()

在这里插入图片描述

3.2.7 Birch聚类

trainingData = weight
clf = Birch(n_clusters=5, branching_factor=10, threshold=0.01)
start = time.time()
result = clf.fit(trainingData)
source = list(clf.predict(trainingData))
end = time.time()
label = clf.labels_
print(f'耗时:{end-start}s')
silhouette = metrics.silhouette_score(trainingData, label)
print("silhouette: ", silhouette)
import matplotlib.pyplot as plt
import seaborn as sns
# 使用PCA将样本点投影到二维平面上
pca = PCA(n_components=2)
reduced_data = pca.fit_transform(weight)
source = list(clf.predict(trainingData))
# 绘制每个样本点与其对应的簇标签
plt.figure(figsize=(8, 6))
sns.scatterplot(x=reduced_data[:, 0], y=reduced_data[:, 1], hue=source, palette='bright')
plt.savefig('img/Birch聚类.png',dpi=300)
plt.show()

4 完整代码下载

见知乎文章底部链接,包括所有问题的全部代码

zhuanlan.zhihu.com/p/643865954

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/46730.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Tensorflow学习

一、处理数据的结构 案例代码如下: import tensorflow.compat.v1 as tf tf.disable_v2_behavior() import numpy as np# create data x_data np.random.rand(100).astype(np.float32) y_data x_data*0.1 0.3# 创建结构(一维结构) Weights tf.Variable(tf.random.uniform(…

Megatron-LM、NVIDIA NeMo、model_optim_rng.pt 文件是什么?

本文涉及以下几个概念,分别是: Megatron和Megatron-LM-v1.1.5-3D_parallelism NVIDIA NeMo Megatron和Megatron-LM-v1.1.5-3D_parallelism是什么? Megatron是由NVIDIA开发的一种用于训练大规模语言模型的开源框架。它旨在提供高效的分布式…

安科瑞能源物联网以能源供应、能源管理、设备管理、能耗分析的能源流向为主线-安科瑞黄安南

摘要:随着科学技术的发展,我国的物联网技术有了很大进展。为了提升电力抄表服务的稳定性,保障电力抄表数据的可靠性,本文提出并实现了基于物联网的智能电力抄表服务平台,结合云计算、大数据等技术,提供电力…

雷达信号处理自学总结(持续更新)

傅里叶变换的频率分辨率 频率分辨率 采样频率 信号长度 频率分辨率 \frac{采样频率 }{信号长度} 频率分辨率信号长度采样频率​ 可用numpy模块的fft.fftfreq函数求出傅里叶变换的频率分辨率。 https://numpy.org/doc/stable/reference/generated/numpy.fft.fftfreq.html

opencv 图像距离变换 distanceTransform

图像距离变换:计算图像中每一个非零点距离离自己最近的零点的距离,然后通过二值化0与非0绘制图像。 #include "iostream" #include "opencv2/opencv.hpp" using namespace std; using namespace cv;int main() {Mat img, dst, dst…

关于position:fixed定位的位置不对的问题(即没有按照浏览器的窗口进行定位)

问题: 今天在开发过程中发现元素使用 position: fixed 时位置有问题,位置跟我写的位置对不上,后面在 MDN 上面找到了答案,下面是关于 position: fixed 的描述: fixed: 元素会被移出正常文档流,并…

通过Vue-cli解决前端跨域问题

1、找到vue.config.js 在vue.config.js当中增加如下配置 devServer: {port: 3001,proxy: {/agent: {target: http://10.8.50.250:6666,ws: false, //true,开启ws, 如果是http代理此处可以不用设置changeOrigin: true, // 如果接口跨域,需要进行这个参…

Rust之包、单元包及模块

包:一个用于构建、测试并分享单元包的Cargo功能;单元包:一个用于生成库或可执行文件的树形模块结构;模块及use关键字:被用于控制文件结构、作用域及路径的私有性;路径:一种用于命名条目的方法&a…

【电商小知识】7个步骤让你快速了解跨境电商!

近几年来,随着互联网的发展,国内外的商业贸易越来越流畅,直播电商的火爆也带动着一大批相关的产业链发展,其中跨境电商就是尤为突出的一个。尽管在国内做跨境电商的企业数量非常之多,但仍有许多新人争相入局&#xff0…

安防监控视频汇聚平台EasyCVR修改录像计划等待时间较长是什么原因?

安防监控视频EasyCVR视频融合汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检…

Ceph部署方法介绍

Ceph部署方法介绍 Installing Ceph — Ceph Documentation Ceph环境规划 admin是一个部署节点

计算机视觉:图像质量评价指标之 PSNR 和 SSIM

1. PSNR (Peak Signal-to-Noise Ratio) 峰值信噪比 由上可见,PSNR相对MSE多了一个峰值,MSE是绝对误差,再加上峰值是一个相对误差指标 一般地,针对 uint8 数据,最大像素值为 255,;针对浮点型数据&#xff…

低代码开发重要工具:jvs-flow(流程引擎)审批功能配置说明

流程引擎场景介绍 流程引擎基于一组节点与执行界面,通过人机交互的形式自动地执行和协调各个任务和活动。它可以实现任务的分配、协作、路由和跟踪。通过流程引擎,组织能够实现业务流程的优化、标准化和自动化,提高工作效率和质量。 在企业…

Python(Web时代)——初识flask

flask简介 介绍 Flask是一个用Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。它是BSD授权的,一个有少量限制的免费软件许可。它使用了 Werkzeug 工具箱和 Jinja2 模板引擎。 Flask 的设计理念是简单、灵活、易于扩展&a…

Java后端程序员不得不知道的 API 接口常识

说实话,我非常希望自己能早点看到本篇文章,大学那个时候懵懵懂懂,跟着网上的免费教程做了一个购物商城就屁颠屁颠往简历上写。 至今我仍清晰地记得,那个电商教程是怎么定义接口的: 管它是增加、修改、删除、带参查询&…

【Hammerstein模型的级联】快速估计构成一连串哈默斯坦模型的结构元素研究(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 💥1 概述 在许多振动应用中,所研究的系统略微非线性。Hammerstein模型的级联可以方便地描述这样的系统。Hammerstein提供了一种基于指数正弦…

关于在虚拟机CentOS7的Docker下安装Oracle

这不三阶段了,要上Oracle了,感觉这个班卷的程度到位。二阶段我就上了ElementUI和MyBatis,项目也是用这些技术写的,整体钻研程度还行。于是布置了两个任务:在windows下安一下Oracle,在windows下安装Oracle那…

需求管理全过程流程图及各阶段核心关注点详解

分析报告指出,多达76%的项目失败是因为差劲的需求管理,这个是项目失败的最主要原因,比落后的技术、进度失控或者混乱的变更管理还要关键。很多项目往往在开始的时候已经决定了失败,谜底就在谜面上,开始就注定的失败&am…

Redis缓存击穿问题以及解决方案

Redis缓存击穿问题以及解决方案 前言一、什么是Redis缓存击穿二、解决方案1.使用锁来解决使用锁的流程:核心思路:思路流程图:操作的锁的代码:业务的实现: 2.逻辑过期来解决思路分析:解决流程:业…

(一)RabbitMQ概念-优势、劣势、应用场景 、AMQP、工作原理

Lison <dreamlison163.com>, v1.0.0, 2023.06.22 RabbitMQ概念-优势、劣势、应用场景 、AMQP、工作原理 文章目录 RabbitMQ概念-优势、劣势、应用场景 、AMQP、工作原理RabbitMQ概念RabbitMQ的优势RabbitMQ劣势RabbitMQ应用的场景RabbitMQ_AMQPRabbitMQ工作原理 RabbitM…