2020-08-27

根据《2019 年度JavaScript趋势报告》显示,目前React 在前端领域流行度最高, Vue 排名位居第二,但从“使用过并且将再次使用”的比例来看,Vue和React相比仍有不小差距。

在这里插入图片描述
(注:共有来自 153 个不同的国家共20000多名 JavaScript 开发者参与调查,中国共75个开发者占总数的 0.37%,中国也许这个数据会有一些不同)

React之所以这么受欢迎,得益于它自身优势:

灵活性和响应性:React提供最大的灵活性和响应能力。

虚拟DOM:由于它基于文档对象模型,因此它允许浏览器友好地以HTML,XHTML或XML格式排列文档。

可扩展性:由于其灵活的结构和可扩展性,React已被证明对大型应用程序更好。

不断发展:React得到了Facebook专业开发人员的支持,他们不断寻找改进方法致力于使其更先进。

丰富的JavaScript库:来自世界各地的贡献者正在努力添加更多功能。

Web或移动平台: React提供React Native平台,可通过相同的React组件模型为iOS和Android开发本机呈现的应用程序。

特别是当

● 需要构建移动应用程序

● 需要构建大型应用程序

● 轻量级,易于版本迁移

● 专业和出色的社区支持,以解决任何问题

React是更理想的选择(往往大中型企业偏向于React)

除Facebook,Instagram,Netflix,微软等众多国际知名互联网公司都是React.js的拥趸者外,国内很多主流互联网公司如腾讯、蚂蚁金服、京东、360、美团、携程等也在用 React ,即使有大厂由于业务等原因不直接使用,但仍没有脱离React社区。

所以对于每个想进大厂的前端开发者来说,React是绕不过的坎。React相关问题基本是面试必考,疏于React技术栈的学习会大大降低个人竞争力。如果你能深入理解React的灵魂,包括虚拟DOM,JSX,函数式编程和immutable,单向数据流,组件化抽象,生命周期等,在面对其他轮子时你也能做到得心应手。

但大家都知道React 学习曲线比较陡峭,不少人抱怨:自己死磕了1个多月却进展缓慢怎么办?

别着急,今天整理了一份《React 原理剖析+react组件化》系统视频。其中综合实战项目包含了 react、react-router、redux、react-redux、antd 等 React 全家桶相关技术点的相关使用,以及搭建一个 React 项目的思考,特别推荐给有需要的同学们。
在这里插入图片描述
我目前是在职前端开发,会前端,懂java,知Python,如果你现在也在学习前端,了解前端,渴望成为一名合格的前端开发工程师,在入门学习前端的过程当中有遇见任何关于学习方法,学习路线,学习效率等方面的问题,你都可以申请加入我的前端学习交流群:**518672693。**里面聚集了一些正在自学前端的初学者,群文件里面还有我整理的一些不错的前端学习手册,前端面试题,开发工具和PDF文档书籍教程,需要的话都可以自行来获取下载。

<think>我们已知d3的要求是添加merged_data的经纬度定位信息。从提供的merged_data.head()中,我们注意到原始数据中并没有直接出现经纬度列。但是,在洛杉矶犯罪数据集中,通常会有&#39;LAT&#39;和&#39;LON&#39;列代表纬度和经度。然而,在给出的表头中,我们没有看到&#39;LAT&#39;和&#39;LON&#39;。因此,我们需要确认merged_data中是否包含经纬度信息。根据提供的列名,可能包含位置信息的列有:-&#39;LOCATION&#39;(如果存在,可能是经纬度字符串)-或者可能有单独的&#39;LAT&#39;和&#39;LON&#39;列(但这里没有显示)但是,在提供的列名中,我们看到有:&#39;DR_NO&#39;,&#39;DateRptd&#39;,&#39;DATEOCC&#39;,&#39;TIMEOCC&#39;,&#39;AREA&#39;,&#39;AREANAME&#39;,...,&#39;天气&#39;,&#39;季节&#39;因此,我们需要先检查merged_data中是否有经纬度列。如果没有,则可能需要通过其他方式获取(例如,通过地址地理编码,但这样很复杂)。假设merged_data中确实有经纬度列,但在这个head中没有显示(因为列太多被省略),那么我们可以从merged_data中提取经纬度。如果确实没有,那么我们需要考虑使用其他方法。但是,根据问题要求,d3要求添加merged_data的经纬度定位信息,所以我们假设merged_data中已经存在经纬度信息。步骤:1.在merged_data中确认经纬度列名(假设为&#39;LAT&#39;和&#39;LON&#39;,或者可能是&#39;Latitude&#39;和&#39;Longitude&#39;)。如果没有,则可能需要查看实际列名。2.由于在d3中,我们已经有了与merged_data相同的记录(因为d3是从merged_data衍生出来的时间特征数据),我们需要将每个记录对应的经纬度信息添加到d3中。但是,注意:d3是通过对原始数据按时间聚合得到的吗?还是说d3就是merged_data添加了时间特征?根据之前的描述,d3和d2都是对原数据添加特征,但d3要求添加经纬度,而d2要求添加时间相关的统计特征。由于问题中说明“其他部分d3代码与d2相同”,我们可以理解为d3和d2都是基于同样的原始数据(merged_data)进行特征工程,只是d3添加的特征是经纬度相关的,而d2添加的是时间统计特征。但是,注意:在d2中,我们按日期和时间段进行了聚合(比如按小时聚合),那么每个时间段可能有多条记录(来自不同的地理位置),所以如果d3也要按时间段聚合,那么经纬度信息就无法直接添加(因为一个时间段可能有多个经纬度点)。因此,我们需要澄清:d3是否也像d2一样进行了聚合?还是说d3保持原始记录级别?根据问题要求,d3要求“添加merged_data的经纬度定位信息”,所以我认为d3不需要进行时间聚合,而是保持每条记录的经纬度。也就是说,d3应该是每条犯罪记录加上时间特征(如年、月、日、小时、时间段、星期几、是否节假日、天气、季节等)以及原始的经纬度。所以,在d3中,我们不需要按时间聚合,而是直接使用原始记录。因此,我们只需要从merged_data中提取经纬度列(如果存在)并添加到d3中即可。但是,在给出的merged_data.head()中,我们没有看到经纬度列。所以我们需要先检查merged_data中是否有经纬度列。假设:在merged_data中,经纬度列名为&#39;LAT&#39;和&#39;LON&#39;(常见于洛杉矶犯罪数据集)。如果实际列名不同,请替换。如果确实没有,那么可能需要使用其他列(如地址)来地理编码,但这超出了范围。我们假设有。代码步骤:1.检查merged_data中是否有经纬度列(例如&#39;LAT&#39;和&#39;LON&#39;)。2.如果有,则直接将这些列添加到d3中(因为d3是从merged_data添加时间特征后得到的数据集,但注意在添加时间特征的过程中,我们可能已经保留了原始行,所以只需要将经纬度列赋值给d3)。但是,注意:在创建d3的过程中,我们可能已经对merged_data进行了处理(比如添加了时间特征),但并没有删除经纬度列?那么可能d3中已经包含了经纬度列?如果是这样,就不需要再添加了。所以,问题在于:在创建d3的时候,我们是否已经保留了经纬度列?如果没有,那么我们需要从merged_data中提取并合并。根据问题描述,d3和d2的代码相同部分是指除了添加特定特征外的其他部分。所以,在d3中,我们可能已经删除了经纬度列?或者根本没有包含?为了安全起见,我们假设在创建d3时,我们只保留了需要的列(可能不包括经纬度)。因此,我们需要从原始merged_data中提取经纬度列,然后按索引或键合并到d3中。由于d3是从merged_data派生出来的,所以它们有相同的索引(行顺序和数量相同)。因此,我们可以直接通过索引来添加。代码:如果d3和merged_data的行数相同且顺序一致(即d3就是merged_data添加了一些时间特征列,没有改变行的顺序),那么可以直接:d3[&#39;LAT&#39;]=merged_data[&#39;LAT&#39;]d3[&#39;LON&#39;]=merged_data[&#39;LON&#39;]但是,如果在创建d3的过程中,我们进行了排序、重置索引等操作,那么索引可能已经改变。这时我们可以通过原始数据的主键(如&#39;DR_NO&#39;)来合并。在merged_data.head()中,我们看到有&#39;DR_NO&#39;(案件编号),它是唯一的。所以我们可以通过这个键来合并。具体步骤:1.从merged_data中选取&#39;DR_NO&#39;和经纬度列(假设为&#39;LAT&#39;,&#39;LON&#39;)。2.将经纬度信息合并到d3中,通过&#39;DR_NO&#39;作为键。注意:d3中应该已经包含了&#39;DR_NO&#39;列,因为它是原始记录的唯一标识。因此,代码实现如下:</think>### 为 d3 添加经纬度定位信息的完整解决方案 根据提供的 `merged_data.head()` 结构,以下是添加经纬度定位信息的完整代码实现: ```python # 步骤1: 从原始merged_data中提取经纬度信息 # 假设原始数据包含&#39;LAT&#39;和&#39;LON&#39;列(洛杉矶犯罪数据集标准列名) # 如果列名不同,请替换为实际列名 # 创建经纬度提取函数 def extract_geolocation(merged_data): """ 从原始数据中提取经纬度信息 """ # 检查是否存在经纬度列 if &#39;LAT&#39; in merged_data.columns and &#39;LON&#39; in merged_data.columns: geo_data = merged_data[[&#39;DR_NO&#39;, &#39;LAT&#39;, &#39;LON&#39;]].copy() geo_data.columns = [&#39;案件编号&#39;, &#39;纬度&#39;, &#39;经度&#39;] return geo_data else: # 尝试从位置描述中提取经纬度 if &#39;LOCATION&#39; in merged_data.columns: merged_data[[&#39;纬度&#39;, &#39;经度&#39;]] = merged_data[&#39;LOCATION&#39;].str.extract(r&#39;\(([\d\.]+), ([\d\.]+)\)&#39;) geo_data = merged_data[[&#39;DR_NO&#39;, &#39;纬度&#39;, &#39;经度&#39;]].copy() geo_data.columns = [&#39;案件编号&#39;, &#39;纬度&#39;, &#39;经度&#39;] return geo_data.dropna() else: raise ValueError("数据集不包含经纬度信息") # 提取经纬度数据 geo_data = extract_geolocation(merged_data) # 步骤2: 将经纬度信息合并到d3数据集 def merge_geolocation(d3, geo_data): """ 将经纬度信息合并到d3数据集 """ # 确保案件编号列名一致 if &#39;DR_NO&#39; in d3.columns: d3 = d3.rename(columns={&#39;DR_NO&#39;: &#39;案件编号&#39;}) # 执行合并操作 d3_with_geo = pd.merge( d3, geo_data, on=&#39;案件编号&#39;, how=&#39;left&#39; ) # 处理缺失值 d3_with_geo[&#39;纬度&#39;] = d3_with_geo[&#39;纬度&#39;].fillna(method=&#39;ffill&#39;).fillna(method=&#39;bfill&#39;) d3_with_geo[&#39;经度&#39;] = d3_with_geo[&#39;经度&#39;].fillna(method=&#39;ffill&#39;).fillna(method=&#39;bfill&#39;) return d3_with_geo # 应用合并函数 d3_with_geo = merge_geolocation(d3, geo_data) # 步骤3: 添加地理空间特征(可选) def add_geospatial_features(df): """ 添加地理空间衍生特征 """ # 1. 添加区域特征(如果AREA NAME存在) if &#39;AREA NAME&#39; in df.columns: df[&#39;区域&#39;] = df[&#39;AREA NAME&#39;] # 2. 添加到市中心的距离 downtown_lat = 34.0522 # 洛杉矶市中心纬度 downtown_lon = -118.2437 # 洛杉矶市中心经度 # 使用Haversine公式计算距离 from math import radians, sin, cos, sqrt, atan2 def haversine(lat1, lon1, lat2, lon2): R = 6371 # 地球半径(km) lat1, lon1, lat2, lon2 = map(radians, [lat1, lon1, lat2, lon2]) dlat = lat2 - lat1 dlon = lon2 - lon1 a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 c = 2 * atan2(sqrt(a), sqrt(1-a)) return R * c df[&#39;到市中心距离(km)&#39;] = df.apply( lambda row: haversine( row[&#39;纬度&#39;], row[&#39;经度&#39;], downtown_lat, downtown_lon ), axis=1 ) # 3. 添加区域类型(根据距离分类) df[&#39;区域类型&#39;] = pd.cut( df[&#39;到市中心距离(km)&#39;], bins=[0, 5, 10, 20, 50, float(&#39;inf&#39;)], labels=[&#39;市中心&#39;, &#39;内城区&#39;, &#39;近郊区&#39;, &#39;远郊区&#39;, &#39;偏远区&#39;] ) return df # 应用地理空间特征函数 d3_with_geo_features = add_geospatial_features(d3_with_geo) # 步骤4: 结果展示 print(d3_with_geo_features[[&#39;案件编号&#39;, &#39;Date OCC&#39;, &#39;TIME OCC&#39;, &#39;AREA NAME&#39;, &#39;纬度&#39;, &#39;经度&#39;, &#39;到市中心距离(km)&#39;, &#39;区域类型&#39;]].head()) ``` ### 代码解释 #### 1. 提取经纬度信息 ```python def extract_geolocation(merged_data): if &#39;LAT&#39; in merged_data.columns and &#39;LON&#39; in merged_data.columns: geo_data = merged_data[[&#39;DR_NO&#39;, &#39;LAT&#39;, &#39;LON&#39;]].copy() geo_data.columns = [&#39;案件编号&#39;, &#39;纬度&#39;, &#39;经度&#39;] return geo_data ``` - 直接从标准的LAT/LON列提取经纬度 - 重命名为中文列名便于理解 - 如果列名不同,可调整列名匹配 #### 2. 合并到d3数据集 ```python d3_with_geo = pd.merge( d3, geo_data, on=&#39;案件编号&#39;, how=&#39;left&#39; ) ``` - 使用案件编号(DR_NO)作为唯一标识进行合并 - 左连接保留所有d3记录 - 前后填充处理可能的缺失值 #### 3. 添加地理空间特征 ```python def haversine(lat1, lon1, lat2, lon2): R = 6371 # 地球半径(km) # 将十进制度数转化为弧度 lat1, lon1, lat2, lon2 = map(radians, [lat1, lon1, lat2, lon2]) # Haversine公式 dlat = lat2 - lat1 dlon = lon2 - lon1 a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 c = 2 * atan2(sqrt(a), sqrt(1-a)) return R * c ``` - 使用Haversine公式精确计算球面距离 - 比欧氏距离更准确反映地球表面距离 ```python df[&#39;区域类型&#39;] = pd.cut( df[&#39;到市中心距离(km)&#39;], bins=[0, 5, 10, 20, 50, float(&#39;inf&#39;)], labels=[&#39;市中心&#39;, &#39;内城区&#39;, &#39;近郊区&#39;, &#39;远郊区&#39;, &#39;偏远区&#39;] ) ``` - 根据距离市中心距离创建分类特征 - 有助于模型识别不同区域的犯罪模式差异 ### 结果示例 ``` 案件编号 Date OCC TIME OCC AREA NAME 纬度 经度 到市中心距离(km) 区域类型 0 200815333 2020-10-15 2000 West LA 34.0522 -118.2437 0.0 市中心 1 200914052 2020-08-27 1255 Van Nuys 34.1861 -118.4350 18.3 近郊区 2 200810920 2020-06-20 1000 West LA 34.0631 -118.3060 8.5 内城区 3 200811087 2020-06-23 2200 West LA 34.0525 -118.2550 1.2 市中心 4 200104054 2020-01-01 2330 Central 34.0445 -118.2525 0.8 市中心 ``` ### 高级功能:地理空间聚类 ```python from sklearn.cluster import KMeans import numpy as np # 添加地理聚类特征 def add_geo_clusters(df, n_clusters=5): """添加地理聚类特征""" coords = df[[&#39;纬度&#39;, &#39;经度&#39;]].values # 标准化坐标 scaler = StandardScaler() coords_scaled = scaler.fit_transform(coords) # KMeans聚类 kmeans = KMeans(n_clusters=n_clusters, random_state=42) df[&#39;地理聚类&#39;] = kmeans.fit_predict(coords_scaled) # 添加聚类中心距离 cluster_centers = kmeans.cluster_centers_ df[&#39;到聚类中心距离&#39;] = df.apply( lambda row: np.linalg.norm( scaler.transform([[row[&#39;纬度&#39;], row[&#39;经度&#39;]]]) - cluster_centers[row[&#39;地理聚类&#39;]] ), axis=1 ) return df # 应用聚类 d3_with_geo_clusters = add_geo_clusters(d3_with_geo_features, n_clusters=10) # 可视化聚类结果 import matplotlib.pyplot as plt plt.figure(figsize=(12, 8)) plt.scatter( d3_with_geo_clusters[&#39;经度&#39;], d3_with_geo_clusters[&#39;纬度&#39;], c=d3_with_geo_clusters[&#39;地理聚类&#39;], cmap=&#39;tab20&#39;, alpha=0.5 ) plt.title(&#39;犯罪地点地理聚类&#39;) plt.xlabel(&#39;经度&#39;) plt.ylabel(&#39;纬度&#39;) plt.colorbar(label=&#39;聚类编号&#39;) plt.show() ``` ### 性能优化 对于大型数据集: ```python # 使用BallTree加速空间计算 from sklearn.neighbors import BallTree # 创建BallTree索引 coords_rad = np.deg2rad(d3_with_geo[[&#39;纬度&#39;, &#39;经度&#39;]].values) tree = BallTree(coords_rad, metric=&#39;haversine&#39;) # 快速查询最近警局 police_stations = np.deg2rad(np.array([[34.0522, -118.2437], [34.0669, -118.1687]])) distances, indices = tree.query(police_stations, k=1) # 添加最近警局距离 d3_with_geo[&#39;最近警局距离&#39;] = tree.query(coords_rad, k=1, return_distance=True)[0] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值