# 面向金融的python **Repository Path**: zcmmmm/python-for-finance ## Basic Information - **Project Name**: 面向金融的python - **Description**: 面向金融的python大作业 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-11-21 - **Last Updated**: 2022-12-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README > 张楚明 > > 2201210516 > > 将包含作业代码的 `code` 文件夹放在 `data` 同级目录下运行 > > 作业答码存放与文件夹`code`,作业报告为`张楚明-2201210516.pdf`(内容同本文`README.md`) > > 数据集采用论文`《Data Correction and Evolution Analysis of the ProgrammableWeb Service Ecosystem》` 开源 ProgrammableWeb 爬取清洗后的数据集,其中数据存放在 `data/raw` 目录 ### 大作业内容 > 对 Programmable Web 数据集中 Mashup- API 的历史调研记录进行统计分析,给出分析过程和结果。包括: > > - 统计 Mashup 中的包含 Web API 个数、Web API 被使用的次数和 Web API 提供商发布 Web API 的个数 > > - 从需求关键词视角,分析在不同标注 Tag 或者 Category 类别中, 编程开发人员的组合需求(Mashup)与该需求所调用的服务(Web API)的关联情况 > > - 从非功能视角(例如 API 之间的兼容性,Web API 不同的服务接口协议 REST、RPC),对于相同标注下的 Web API,非功能不同对于参与服务组合的情况统计 1. 统计 Mashup 中的包含 Web API 个数、Web API 被使用的次数和 Web API 提供商发布 Web API 的个数 > 根据需求统计并输出结果 > > 代码如下 ```python import json import re # 1.统计 Mashup 中的包含 Web API 个数、Web API 被使用的次数和 Web API 提供商发布 Web API 的个数 print("统计 Mashup 中的包含 Web API 个数、Web API 被使用的次数和 Web API 提供商发布 Web API 的个数") print("数据来自 active_mashups_data.txt、deadpool_mashups_data.txt") print("api_version_accessbiliby-1.txt、api_version_accessbiliby-2.txt、api_version_accessbiliby-3.txt、api_version_accessbiliby-4.txt、api_version_accessbiliby-5.txt") mashupTitleList = [] apiCountList = [] apiUsedCountList = {} providerAndCount = {} txtFile1 = open(r"../data/raw/api_mashup/active_mashups_data.txt") txtFile2 = open(r"../data/raw/api_mashup/deadpool_mashups_data.txt") txtContentMashupList = [txtFile1.read(), txtFile2.read()] txtAPIFile1 = open(r"../data/raw/accessibility/api_accessibility/api_version_accessbiliby-1.txt") txtAPIFile2 = open(r"../data/raw/accessibility/api_accessibility/api_version_accessbiliby-2.txt") txtAPIFile3 = open(r"../data/raw/accessibility/api_accessibility/api_version_accessbiliby-3.txt") txtAPIFile4 = open(r"../data/raw/accessibility/api_accessibility/api_version_accessbiliby-4.txt") txtAPIFile5 = open(r"../data/raw/accessibility/api_accessibility/api_version_accessbiliby-5.txt") txtContentAPIList = [txtAPIFile1.read(), txtAPIFile2.read(), txtAPIFile3.read(), txtAPIFile4.read(), txtAPIFile5.read()] # 1.Mashup 中的包含 Web API 个数 # 2.Web API 被使用的次数 for txtContent in txtContentMashupList: jsondata = json.loads(txtContent) for mashup in jsondata: if mashup != None: mashupTitleList.append(mashup["title"][8:]) related_apis = mashup["related_apis"] apiCountList.append(len(related_apis)) for api in related_apis: if api != None: if api["title"] in apiUsedCountList: apiUsedCountList[api["title"]] += 1 else: apiUsedCountList[api["title"]] = 1 regular = re.compile('https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+') # 3.Web API 提供商发布 Web API 的个数 for txtContent in txtContentAPIList: jsondata = json.loads(txtContent) for api in jsondata: if api != None: visit_status = api["visit_status"] if visit_status != None and len(visit_status) > 0: visit_url = visit_status[0]["visit_url"] provider = re.findall(regular, visit_url) if provider != None and len(provider) > 0: if provider[0] in providerAndCount: providerAndCount[provider[0]] += 1 else: providerAndCount[provider[0]] = 1 print("--------------------------------Mashup 中的包含 Web API 个数---------------------------------") mashupApiCount = zip(mashupTitleList, apiCountList) for item in mashupApiCount: print(item) print("-----------------------------------Web API 被使用的次数--------------------------------------") tempList = sorted(apiUsedCountList.items(), key=lambda x:x[1], reverse=True) for item in tempList: print(item) print("-----------------------------Web API 提供商发布 Web API 的个数--------------------------------") tempList = sorted(providerAndCount.items(), key=lambda x:x[1], reverse=True) for item in tempList: print(item)import json import re # 1.统计 Mashup 中的包含 Web API 个数、Web API 被使用的次数和 Web API 提供商发布 Web API 的个数 print("统计 Mashup 中的包含 Web API 个数、Web API 被使用的次数和 Web API 提供商发布 Web API 的个数") print("数据来自 active_mashups_data.txt、deadpool_mashups_data.txt") print("api_version_accessbiliby-1.txt、api_version_accessbiliby-2.txt、api_version_accessbiliby-3.txt、api_version_accessbiliby-4.txt、api_version_accessbiliby-5.txt") mashupTitleList = [] apiCountList = [] apiUsedCountList = {} providerAndCount = {} txtFile1 = open(r"../data/raw/api_mashup/active_mashups_data.txt") txtFile2 = open(r"../data/raw/api_mashup/deadpool_mashups_data.txt") txtContentMashupList = [txtFile1.read(), txtFile2.read()] txtAPIFile1 = open(r"../data/raw/accessibility/api_accessibility/api_version_accessbiliby-1.txt") txtAPIFile2 = open(r"../data/raw/accessibility/api_accessibility/api_version_accessbiliby-2.txt") txtAPIFile3 = open(r"../data/raw/accessibility/api_accessibility/api_version_accessbiliby-3.txt") txtAPIFile4 = open(r"../data/raw/accessibility/api_accessibility/api_version_accessbiliby-4.txt") txtAPIFile5 = open(r"../data/raw/accessibility/api_accessibility/api_version_accessbiliby-5.txt") txtContentAPIList = [txtAPIFile1.read(), txtAPIFile2.read(), txtAPIFile3.read(), txtAPIFile4.read(), txtAPIFile5.read()] # 1.Mashup 中的包含 Web API 个数 # 2.Web API 被使用的次数 for txtContent in txtContentMashupList: jsondata = json.loads(txtContent) for mashup in jsondata: if mashup != None: mashupTitleList.append(mashup["title"][8:]) related_apis = mashup["related_apis"] apiCountList.append(len(related_apis)) for api in related_apis: if api != None: if api["title"] in apiUsedCountList: apiUsedCountList[api["title"]] += 1 else: apiUsedCountList[api["title"]] = 1 regular = re.compile('https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+') # 3.Web API 提供商发布 Web API 的个数 for txtContent in txtContentAPIList: jsondata = json.loads(txtContent) for api in jsondata: if api != None: visit_status = api["visit_status"] if visit_status != None and len(visit_status) > 0: visit_url = visit_status[0]["visit_url"] provider = re.findall(regular, visit_url) if provider != None and len(provider) > 0: if provider[0] in providerAndCount: providerAndCount[provider[0]] += 1 else: providerAndCount[provider[0]] = 1 print("--------------------------------Mashup 中的包含 Web API 个数---------------------------------") mashupApiCount = zip(mashupTitleList, apiCountList) for item in mashupApiCount: print(item) print("-----------------------------------Web API 被使用的次数--------------------------------------") tempList = sorted(apiUsedCountList.items(), key=lambda x:x[1], reverse=True) for item in tempList: print(item) print("-----------------------------Web API 提供商发布 Web API 的个数--------------------------------") tempList = sorted(providerAndCount.items(), key=lambda x:x[1], reverse=True) for item in tempList: print(item) ``` > 部分输出结果如下 > > 其中 `Web API 被使用的次数`、`Web API 提供商发布 Web API 的个数` 是次数/个数从大大小排序后输出 > > 可以看出 API 中 `Google Maps API MASTER RECORD` 被调用次数最多,达 2575 次 > > API 提供商中 `https://api.intrinio.com` 提供 API 个数最多,达 190 个 ```shell 统计 Mashup 中的包含 Web API 个数、Web API 被使用的次数和 Web API 提供商发布 Web API 的个数 数据来自 active_mashups_data.txt、deadpool_mashups_data.txt ------------Mashup 中的包含 Web API 个数--------------------- ('Api Expert - Yelp Local Business Search', 1) ('Bill Track 50', 1) ('Do Gooder', 1) ...... ('Flickr Leech', 1) ('Tagbulb', 63) ('Seattle Movie Finder', 1) -------------Web API 被使用的次数---------------------------- ('Google Maps API MASTER RECORD', 2575) ('Twitter API MASTER RECORD', 827) ('YouTube API MASTER RECORD', 710) ('Flickr API MASTER RECORD', 635) ...... -------------Web API 提供商发布 Web API 的个数--------------- ('https://api.intrinio.com', 190) ('https://github.com', 98) ('https://www.googleapis.com', 90) ('http://www.xignite.com', 69) ('https://api.elsevier.com', 63) ...... ``` 2. 从需求关键词视角,分析在不同标注 Tag 或者 Category 类别中, 编程开发人员的组合需求(Mashup)与该需求所调用的服务(Web API)的关联情况 > 统计每个 Mashup 对应 category 以及其包含的 API > > 并重点分析 `Mapping` 这个需求关键字相关 API,统计其使用的 API 及其使用次数 > > 代码如下 ```python import json # 2.从需求关键词视角,分析在不同标注 Tag 或者 Category 类别中, 编程开发人员的组合需求(Mashup)与该需求所调用的服务(Web API)的关联情况 print("从需求关键词视角,分析在不同标注 Tag 或者 Category 类别中, 编程开发人员的组合需求(Mashup)与该需求所调用的服务(Web API)的关联情况") print("数据来自 active_mashups_data.txt、deadpool_mashups_data.txt") print("统计 Mashup 对应 category 以及其包含的 API") mashupTitleList = [] categoryList = [] apiTitleList = [] categoryCount = {} txtFile1 = open(r"../data/raw/api_mashup/active_mashups_data.txt") txtFile2 = open(r"../data/raw/api_mashup/deadpool_mashups_data.txt") txtContentList = [txtFile1.read(), txtFile2.read()] for txtContent in txtContentList: jsondata = json.loads(txtContent) for mashup in jsondata: if mashup != None: mashupTitleList.append(mashup["title"][8:]) categories = mashup["categories"] categoryList.append(categories) for category in categories: if category != None: if category in categoryCount: categoryCount[category] += 1 else: categoryCount[category] = 1 related_apis = mashup["related_apis"] tempApiTitleList = [] for api in related_apis: if api != None: tempApiTitleList.append(api["title"]) apiTitleList.append(tempApiTitleList) print("--------------------------------Mashup 对应 category 以及其包含的 API--------------------------------") mashupCategoryApiCount = zip(mashupTitleList, categoryList, apiTitleList) keywordsRelatedApiUsedCount = {"Mapping":{}, "Search":{}} for item in mashupCategoryApiCount: print(item) for key,value in keywordsRelatedApiUsedCount.items(): if key in item[1]: for api in item[2]: if api in value: value[api] += 1 else: value[api] = 1 print("-----------------------------------分析编程开发人员的组合需求(Mashup)-----------------------------------") categoryCountList = sorted(categoryCount.items(), key=lambda x:x[1], reverse=True) for item in categoryCountList: print(item) print("-----------------------------------分析需求关键字如(Mapping、Search)所调用的服务(Web API)-----------------------------------") for key,value in keywordsRelatedApiUsedCount.items(): print("------------------------------------以 " + key + " 为例分析相关 API -------------------------------------") apiList = sorted(value.items(), key = lambda x:x[1], reverse = True) for item in apiList: print(item) ``` > 分析编程开发人员的组合需求(Mashup): > > 由统计结果可得 `Mapping` 是最经常被组合使用的需求,总共有 3138 个 mashup 中都包含 `Mapping` 需求,其次是 `Search`,被组合次数为 1178 次 > 分析析需求关键字如(Mapping、Search)所调用的服务(Web API): > > **可以在上述代码的 `keywordsRelatedApiUsedCount` 中添加需求关键字来统计该关键字相关 API 的使用次数** > > 以 `Mapping、Search` 关键字为例分析相关 API,部分输出结果如下 > > 可以得出 `Mapping` 关键字相关 API 中最经常被调用的是 `Google Maps API`,次数达到 2306 次,比其余相关 API 被调用次数的总和还要多 > > 类似 `Search` 关键字相关 API 中最经常被调用的是 `Google Maps API、YouTube API、Twitter API` 等 ```shell ----------------Mashup 对应 category 以及其包含的 API------------------- ...... ('Seattle Movie Finder', ['Mapping', 'Movies'], ['Microsoft Bing Maps API MASTER RECORD']) 分析需求关键字如(Mapping、Search)及其相关 API ------------------分析编程开发人员的组合需求(Mashup)---------------------------- ('Mapping', 3138) ('Search', 1178) ('Social', 1154) ...... ------------------------以 Mapping 为例分析相关 API -------------------- ('Google Maps API MASTER RECORD', 2306) ('Flickr API MASTER RECORD', 180) ('Twitter API MASTER RECORD', 179) ('Microsoft Bing Maps API MASTER RECORD', 168) ('YouTube API MASTER RECORD', 132) ('Yahoo Maps API MASTER RECORD', 125) ('Facebook API MASTER RECORD', 87) ('Yahoo Geocoding API MASTER RECORD', 80) ('GeoNames API MASTER RECORD', 76) ('Foursquare API MASTER RECORD', 58) ...... ------------------------以 Search 为例分析相关 API -------------------- ('Google Maps API MASTER RECORD', 232) ('YouTube API MASTER RECORD', 177) ('Twitter API MASTER RECORD', 150) ('Flickr API MASTER RECORD', 115) ('Google Search API MASTER RECORD', 106) ('Yahoo Search API MASTER RECORD', 101) ('Amazon Product Advertising API MASTER RECORD', 100) ('Facebook API MASTER RECORD', 75) ('Last.fm API MASTER RECORD', 54) ('eBay API MASTER RECORD', 54) ...... ``` 3. 从非功能视角(例如 API 之间的兼容性,Web API 不同的服务接口协议 REST、RPC),对于相同标注下的 Web API,非功能不同对于参与服务组合的情况统计 > 根据需求统计 `Web API 不同的服务接口协议 REST、RPC 等` > > 统计了每个 Mashup 相关 API 及其使用的服务接口协议,以及使用每种服务接口协议的 API 个数 > > 代码如下 ```python import json # 3.从非功能视角(例如 API 之间的兼容性,Web API 不同的服务接口协议 REST、RPC),对于相同标注下的 Web API,非功能不同对于参与服务组合的情况统计 print("从非功能视角(例如 API 之间的兼容性,Web API 不同的服务接口协议 REST、RPC),对于相同标注下的 Web API,非功能不同对于参与服务组合的情况统计") print("数据来自 active_mashups_data.txt、deadpool_mashups_data.txt、active_apis_data.txt、deadpool_apis_data.txt") mashupTitleList = [] apiServeTypeList = [] apiServerTypeCount = {} apiUsedCountList = {} tagContentApi = {} apiAndStyle = {} txtFile1 = open(r"../data/raw/api_mashup/active_mashups_data.txt") txtFile2 = open(r"../data/raw/api_mashup/deadpool_mashups_data.txt") txtContentList = [txtFile1.read(), txtFile2.read()] txtFile3 = open(r"../data/raw/api_mashup/active_apis_data.txt") txtFile4 = open(r"../data/raw/api_mashup/deadpool_apis_data.txt") txtContentAPIList = [txtFile3.read(), txtFile4.read()] for txtContent in txtContentList: jsondata = json.loads(txtContent) for mushup in jsondata: if mushup != None: mashupTitleList.append(mushup["title"][8:]) related_apis = mushup["related_apis"] apiServeType = [] for api in related_apis: if api != None: title = api["title"] versions = api["versions"] if versions != None and len(versions) > 0: serverType = versions[0]["style"] apiServeType.append((title, serverType)) apiAndStyle[title] = serverType if serverType in apiServerTypeCount: apiServerTypeCount[serverType] += 1 else: apiServerTypeCount[serverType] = 1 if api["title"] in apiUsedCountList: apiUsedCountList[api["title"]] += 1 else: apiUsedCountList[api["title"]] = 1 apiServeTypeList.append(apiServeType) for txtContent in txtContentAPIList: jsondata = json.loads(txtContent) for api in jsondata: if api != None: title = api["title"] tags = api["tags"] for tag in tags: if tag in tagContentApi: tagContentApi[tag].append(title) else: tagContentApi[tag] = [title] print("---------------------------------Mashup 相关 API 使用的服务接口协议---------------------------------") apiServerCount = zip(mashupTitleList, apiServeTypeList) for item in apiServerCount: print(item) for key,value in apiServerTypeCount.items(): print("-----------------------------使用服务接口协议 " + key + " 的 Web API 个数--------------------------------") print(key, value) print("--------------------------------各个 tags 所包含的 API 总数及其中各个 API 被调用次数---------------------------------") for key,value in tagContentApi.items(): print("tag:" + key, len(value)) tempList = [] for api in value: tempList.append((api, apiUsedCountList.get(api, 0), apiAndStyle.get(api))) tempList = sorted(tempList, key=lambda x:x[1], reverse=True) for item in tempList: print(item[0] + " 被调用次数: ", item[1], " 使用的服务接口协议:", item[2]) ``` > 统计了每个 Mashup 使用的 API 及 API 使用的服务接口协议 > > 可以看出部分 Mashup (如 `Tagbulb`)组合了使用不同服务接口协议的 API > 统计了使用各个服务接口协议的 API 个数 > 统计了各个 tags 所包含的 API 总数及其中各个 API 被调用次数 > > 以 tag `eCommerce` 为例,在此 tag 中 API `Amazon Product Advertising API MASTER RECORD` 被调用次数最多,达 433 次,使用的服务接口协议为 `REST` ,可以看到在 tag `eCommerce` 中调用较多的接口均使用 `REST` 风格,因为考虑到兼容性,使用同一种风格的 API 在能更好地统一输入输出的数据流,而不用考虑不同风格的不同规范,从而保证较高的兼容性 ```shell ----------------------Mashup 相关 API 使用的服务接口协议----------------------- ('Api Expert - Yelp Local Business Search', [('Yelp Fusion API MASTER RECORD', 'REST')]) ('Bill Track 50', [('NationBuilder API MASTER RECORD', 'REST')]) ('Do Gooder', [('NationBuilder API MASTER RECORD', 'REST')]) ('Velocipedia', [('Mapbox API MASTER RECORD', 'REST')]) ('Diabetes Prevalence & Clinical Research in the United States', [('Eli Lilly Clinical Open Innovation API MASTER RECORD', 'REST')]) ('Api Expert - MyMemory Language Translator', [('MyMemory API MASTER RECORD', 'RPC')]) ('Landslide Analytics', [('NationBuilder API MASTER RECORD', 'REST')]) ('Segment', [('Pipl API MASTER RECORD', 'REST')]) ('SpotHero -- Find Parking, Prepay & Save', [('Google Maps API MASTER RECORD', 'REST')]) ...... ('Tagbulb', [('Flickr API MASTER RECORD', 'REST'), ('43Things API MASTER RECORD', 'REST'), ('BBC API MASTER RECORD', 'REST'), ('indeed API MASTER RECORD', 'REST'), ('Technorati API MASTER RECORD', 'REST'), ('Upcoming.org API MASTER RECORD', 'REST'), ('Amazon Product Advertising API MASTER RECORD', 'REST'), ('Buzznet API MASTER RECORD', 'RPC'), ('del.icio.us API MASTER RECORD', 'REST'), ('Eventful API MASTER RECORD', 'REST'), ('eBay API MASTER RECORD', 'REST'), ('Google Search API MASTER RECORD', 'RPC'), ('Yahoo Search API MASTER RECORD', 'REST'), ('Blogmarks API MASTER RECORD', 'REST'), ('YouTube API MASTER RECORD', 'REST'), ('Yahoo Video Search API MASTER RECORD', 'REST'), ('Smugmug API MASTER RECORD', 'REST'), ('Digital Podcast API MASTER RECORD', 'REST'), ('Last.fm API MASTER RECORD', 'REST'), ('Yahoo Local Search API MASTER RECORD', 'REST'), ('Yahoo Image Search API MASTER RECORD', 'REST'), ('23 API MASTER RECORD', 'REST'), ('Spraci API MASTER RECORD', 'FEED'), ('ISBN db API MASTER RECORD', 'REST'), ('Raw Sugar API MASTER RECORD', 'REST'), ('Cafe Press API MASTER RECORD', 'RPC'), ('Yahoo Related Suggestions API MASTER RECORD', 'REST'), ('Grouper Video API MASTER RECORD', 'FEED'), ('Ma.gnolia API MASTER RECORD', 'REST'), ('Riya API MASTER RECORD', 'REST'), ('WebShots API MASTER RECORD', 'Unspecified'), ('Yahoo Answers API MASTER RECORD', 'FEED'), ('Amazon EC2 API MASTER RECORD', 'REST'), ('AOL Video API MASTER RECORD', 'REST'), ('Revver API MASTER RECORD', 'REST'), ('Twitter API MASTER RECORD', 'FEED'), ('Google Picasa API MASTER RECORD', 'FEED'), ('Yahoo Mail API MASTER RECORD', 'REST'), ('Digg API MASTER RECORD', 'REST'), ('Blinkx API MASTER RECORD', 'Unspecified'), ('LiveVideo API MASTER RECORD', 'REST'), ('BibSonomy API MASTER RECORD', 'REST'), ('Blip.tv API MASTER RECORD', 'REST'), ('Vodpod API MASTER RECORD', 'REST'), ('FriendFeed API MASTER RECORD', 'FEED'), ('Photobucket API MASTER RECORD', 'REST'), ('arXiv API MASTER RECORD', 'REST'), ('IVA Video API MASTER RECORD', 'REST'), ('Zooomr API MASTER RECORD', 'REST'), ('Simply Hired Jobs API MASTER RECORD', 'REST'), ('Kewego Video API MASTER RECORD', 'REST'), ('12seconds.tv API MASTER RECORD', 'REST'), ('Blip.fm API MASTER RECORD', 'REST'), ('Viddler API MASTER RECORD', 'REST'), ('Howcast API MASTER RECORD', 'FEED'), ('Wikipedia API MASTER RECORD', 'REST'), ('Google Books API MASTER RECORD', 'REST'), ('Floobs API MASTER RECORD', 'REST'), ('LazyTune API MASTER RECORD', 'REST'), ('Social Share Count API MASTER RECORD', 'REST'), ('Google Friend Connect API MASTER RECORD', 'FEED'), ('VideoSurf API MASTER RECORD', 'REST'), ('Bing API MASTER RECORD', 'REST')]) ('Seattle Movie Finder', [('Microsoft Bing Maps API MASTER RECORD', 'Indirect')]) --------使用服务接口协议 REST 的 Web API 个数--------------- REST 12977 --------使用服务接口协议 RPC 的 Web API 个数---------------- RPC 845 --------使用服务接口协议 FEED 的 Web API 个数--------------- FEED 1396 --------使用服务接口协议 Unspecified 的 Web API 个数-------- Unspecified 629 --------使用服务接口协议 Indirect 的 Web API 个数----------- Indirect 293 --------使用服务接口协议 Streaming 的 Web API 个数---------- Streaming 26 --------使用服务接口协议 EMAIL/MESSAGING/FTP 的 Web API 个数-------------------- EMAIL/MESSAGING/FTP 34 --------各个 tags 所包含的 API 总数及其中各个 API 被调用次数----------------------- tag:eCommerce 1439 Amazon Product Advertising API MASTER RECORD 被调用次数: 433 使用的服务接口协议: REST eBay API MASTER RECORD 被调用次数: 227 使用的服务接口协议: REST Google Base API MASTER RECORD 被调用次数: 69 使用的服务接口协议: REST Shopping.com API MASTER RECORD 被调用次数: 62 使用的服务接口协议: REST Yelp Fusion API MASTER RECORD 被调用次数: 61 使用的服务接口协议: REST Commission Junction API MASTER RECORD 被调用次数: 41 使用的服务接口协议: RPC ...... ```