資料分析練習
以下原始碼均以自己情況為主,如需參考,請謹慎再謹慎
1、原始表為access資料庫,轉為csv格式
直接另存為就可以了
2、將三省的科技成果資料彙總到同一個表中
由於表結構不一致,所以合併前要進行相似和表達意思相同的欄位的合併(獨有欄位置為空)
整理一下
表1.1
名 |
型別 |
長度 |
小數點 |
不是null |
ID |
Varchar |
255 |
0 |
|
成果名稱 |
Varchar |
255 |
0 |
|
專案年度編號 |
Varchar |
255 |
0 |
|
省市 |
Varchar |
255 |
0 |
|
中國分類號 |
Varchar |
255 |
0 |
|
成果類別 |
Varchar |
255 |
0 |
|
成果分佈年份 |
Varchar |
255 |
0 |
|
關鍵詞 |
Varchar |
255 |
0 |
|
成果簡介 |
Text |
|
0 |
|
鑑定部門 |
Varchar |
255 |
0 |
|
登記號 |
Varchar |
255 |
0 |
|
完成單位 |
Varchar |
255 |
0 |
|
完成人 |
Varchar |
255 |
0 |
|
應用行業名稱 |
Varchar |
255 |
0 |
|
應用行業程式碼 |
Varchar |
255 |
0 |
|
聯絡單位地址 |
Varchar |
255 |
0 |
|
傳真 |
Varchar |
255 |
0 |
|
電子郵件 |
Varchar |
255 |
0 |
|
表1.2
名 |
型別 |
長度 |
小數點 |
不是null |
序號 |
Varchar |
255 |
0 |
|
成果名稱 |
Varchar |
255 |
0 |
|
行業 |
Varchar |
255 |
0 |
|
年度 |
Varchar |
255 |
0 |
|
批准登記號 |
Varchar |
255 |
0 |
|
單位名稱 |
Varchar |
255 |
0 |
|
課題來源 |
Varchar |
255 |
0 |
|
單位名稱 |
Varchar |
255 |
0 |
|
主要人員 |
Varchar |
255 |
0 |
|
評價單位名稱 |
Varchar |
255 |
0 |
|
成果簡介 |
Text |
0 |
0 |
|
表1.3
名 |
型別 |
長度 |
小數點 |
不是null |
序號 |
Varchar |
255 |
0 |
|
單位 |
Varchar |
255 |
0 |
|
成果名稱 |
Varchar |
255 |
0 |
|
技術水平 |
Varchar |
255 |
0 |
|
負責人 |
Varchar |
255 |
0 |
|
所屬技術領域 |
Varchar |
255 |
0 |
|
合作單位 |
Varchar |
255 |
0 |
|
專案總規模或評估價值(萬元) |
Varchar |
255 |
0 |
|
目前所處階段 |
Varchar |
255 |
0 |
|
智慧財產權情況 |
Varchar |
255 |
0 |
|
專案簡介 |
Varchar |
255 |
0 |
|
#基於成果名稱合併 import pandas as pd # 讀取三個CSV檔案 df1 = pd.read_csv('cg_天津科技成果.csv') df2 = pd.read_csv('cg_2015年第1_2_3期.csv') df3 = pd.read_csv('科技成果.csv') # 合併三個表格 merged_df = pd.merge(df1, df2, on='成果名稱', how='outer') merged_df = pd.merge(merged_df, df3, on='成果名稱', how='outer') # 將缺失值填充為空值 merged_df = merged_df.fillna('') # 將合併後的資料儲存為CSV檔案 merged_df.to_csv('all.csv', index=False)
擬合併欄位√
cg_天津科技成果.csv
cg_2015年第1_2_3期.csv
科技成果.csv
單位 成果名稱 負責人 所屬技術領域 年度 專案簡介
| | | | | |
單位名稱 成果名稱 主要成員 行業 年度 成果簡介
| | | | | |
完成單位 成果名稱 完成人 應用行業名稱 成果分佈年份 成果簡介
import pandas as pd # 讀取合併後的CSV檔案 df = pd.read_csv('all.csv') # 合併列組 df['單位'] = df['單位'].fillna(df['單位名稱']).fillna(df['完成單位']).fillna('') df['負責人'] = df['負責人'].fillna(df['主要人員']).fillna(df['完成人']).fillna('') df['所屬技術領域'] = df['所屬技術領域'].fillna(df['行業']).fillna(df['應用行業名稱']).fillna('') df['年度'] = df['年度'].fillna(df['成果分佈年份']).fillna('') df['專案簡介'] = df['專案簡介'].fillna(df['成果簡介_x']).fillna(df['成果簡介_y']).fillna('') # 刪除原有的列 df.drop(columns=['單位名稱', '完成單位', '主要人員', '完成人', '行業', '應用行業名稱', '年度', '成果分佈年份', '成果簡介_y', '成果簡介_x'], inplace=True) # 將處理後的資料儲存為CSV檔案 df.to_csv('all.csv', index=False)
需新增欄位√
1.3天津科技成果表中不存在年度欄位,則直接新增年度維度欄位確定為2015年
#1.3天津科技成果表新增年度欄位全部置為2015 import pandas as pd # 讀取CSV檔案 df = pd.read_csv('cg_天津科技成果.csv') # 新增名為“年度”的列,並將所有值置為2015 df['年度'] = 2015 # 將處理後的資料儲存為CSV檔案 df.to_csv('2015_天津科技成果.csv', index=False)
新增地域
3、資料同步√
4、資料清洗
檢查是否存在重複的資料√
5、利用高德介面新增省份和行政區劃編碼√
import pandas as pd import requests # 讀取CSV檔案 df = pd.read_csv('new_all.csv', encoding='utf-8') # 提取第六列的所有資訊 sixth_column_data = df.iloc[:, 1] # 假設第六列的索引為5,如果不是,請替換為正確的索引值 # 列印提取的資料 print("提取的第二列資料:") print(sixth_column_data) amap_api_key = '' # Amap API請求函式 # Amap API請求函式 def get_amap_code(api_key, address): base_url = 'https://restapi.amap.com/v3/geocode/geo' params = { 'key': api_key, 'address': address, } try: response = requests.get(base_url, params=params) result = response.json() if result['status'] == '1' and int(result['count']) > 0: geocodes = result['geocodes'][0] adcode = geocodes.get('adcode', '') # 使用.get()方法獲取adcode,如果不存在則返回空字串 province = geocodes.get('province', '') # 使用.get()方法獲取province,如果不存在則返回空字串 city = geocodes.get('city', '') # 使用.get()方法獲取city,如果不存在則返回空字串 district = geocodes.get('district', '') # 使用.get()方法獲取district,如果不存在則返回空字串 formatted_address_parts = [part for part in [province, city, district] if part] # 過濾掉空字串 formatted_address = ''.join(formatted_address_parts) # 拼接地址字串 return adcode, formatted_address else: return None, None except requests.exceptions.RequestException as e: print(f"請求出錯: {e}") return None, None adcodes = [] formatted_addresses = [] # 用於儲存地址 total_queries = len(sixth_column_data) # 處理全部資料 for i, address in enumerate(sixth_column_data): print(f"正在查詢第 {i+1}/{total_queries} 條資料...") adcode, formatted_address = get_amap_code(amap_api_key, address) adcodes.append(adcode) formatted_addresses.append(formatted_address) # 儲存地址 print(f"查詢結果: 行政編碼 - {adcode}, 地址 - {formatted_address}") temp_df = pd.DataFrame({ 'Original Address': [address], 'Formatted Address': [formatted_address], 'Adcode': [adcode] }) temp_df.to_csv('new_results_file02.csv', mode='a', header=False, index=False)
6、使用機器學習演算法提取關鍵字
1.1表中有較為完整的關鍵字、應用行業欄位、行業程式碼
1.2表中有行業欄位,缺少關鍵字和行業程式碼
1.3表中所屬技術領域與行業相似,但並不是國家規範標準
第一步從專案簡介中提取關鍵字
import pandas as pd import jieba.analyse import csv try: # 嘗試讀取 CSV 檔案 df = pd.read_csv('new_all_with_keywords.csv', quoting=csv.QUOTE_NONE) except Exception as e: print("Error:", e) print("Skipping error lines...") # 使用更通用的方式重新讀取 CSV 檔案,跳過錯誤行 lines = [] with open('new_all.csv', 'r', encoding='utf-8') as file: csv_reader = csv.reader(file) for line in csv_reader: if len(line) > 0: lines.append(line) # 透過讀取的有效行建立 DataFrame df = pd.DataFrame(lines[1:], columns=lines[0]) # 對'專案簡介'列應用關鍵詞提取函式 def extract_keywords(text): # 使用 jieba 進行關鍵詞提取,設定關鍵詞數量最多為5個,允許多個字組成的關鍵字 keywords = jieba.analyse.textrank(text, topK=5, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) return " ".join(keywords) # 使用空格連線關鍵詞 # 對'專案簡介'列應用關鍵詞提取函式 df['關鍵詞'] = df['成果名稱'].apply(extract_keywords) # 輸出結果 print(df['關鍵詞']) # 儲存為新檔案 df.to_csv('new_all_with_keywords.csv', index=False)
這裡我使用百度api的關鍵字提取介面
然後以此類推就整理好了
第二步對省市縣進行分割然後資料下卷展示
如圖