import pandas as pd
# 加载数据
df1 = pd.read_csv(r'F:\ruo项目\数据\cg_2015年第1-2-3期.csv', encoding='utf-8')
df2 = pd.read_csv(r'F:\ruo项目\数据\cg_天津科技成果.csv', encoding='utf-8')
df3 = pd.read_csv(r'F:\ruo项目\数据\科技成果.csv', encoding='utf-8')
# 字段统一
df1.rename(columns={'单位名称': '单位', '成果简介': '成果简介', '主要人员': '负责人'}, inplace=True)
df2.rename(columns={'项目简介': '成果简介'}, inplace=True)
df3.rename(columns={
'完成单位': '单位', '成果简介': '成果简介', '完成人': '负责人',
'项目年度编号': '年度', '登记号': '批准登记号', '省市': '地域'
}, inplace=True)
# 添加标准维度字段 - 年度 和 地域
df1['年度'] = df1['年度']
df1['地域'] = df1['单位'].apply(lambda x: '河北' if '河北' in str(x) else '未知')
df2['年度'] = 2015
df2['地域'] = '天津'
df3['年度'] = df3['年度']
# df3中地域已通过重命名为“地域”
# 合并数据
merged_df = pd.concat([df1, df2, df3], ignore_index=True, sort=False)
# 保存最终结果
merged_df.to_csv(r'F:\ruo项目\数据\京津冀2015科技成果汇总_含维度.csv', index=False, encoding='utf-8-sig')
import pandas as pd
import matplotlib.pyplot as plt
# 从CSV文件中读取数据
data = pd.read_csv('combination.csv', encoding='utf-8')
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 按地域分别筛选数据(注意实际列名为'省市')
hebei_data = data[data['省市'] == '河北']
tianjin_data = data[data['省市'] == '天津']
beijing_data = data[data['省市'] == '北京']
# 统计各省份不同行业的科技成果数量
hebei_counts = hebei_data['行业'].value_counts(dropna=False) # 保留空值处理
tianjin_counts = tianjin_data['行业'].value_counts(dropna=False)
beijing_counts = beijing_data['行业'].value_counts(dropna=False)
# 绘制各省份科技成果行业分布柱状图
plt.figure(figsize=(18, 6))
# 河北省
plt.subplot(1, 3, 1)
if not hebei_counts.empty:
hebei_counts.plot(kind='bar', color='skyblue')
plt.title('河北省科技成果行业分布')
plt.xlabel('行业')
plt.ylabel('数量')
else:
plt.text(0.5, 0.5, '无数据', ha='center', va='center', fontsize=14)
# 天津市
plt.subplot(1, 3, 2)
if not tianjin_counts.empty:
tianjin_counts.plot(kind='bar', color='orange')
plt.title('天津市科技成果行业分布')
plt.xlabel('行业')
plt.ylabel('数量')
else:
plt.text(0.5, 0.5, '无数据', ha='center', va='center', fontsize=14)
# 北京市
plt.subplot(1, 3, 3)
if not beijing_counts.empty:
beijing_counts.plot(kind='bar', color='green')
plt.title('北京市科技成果行业分布')
plt.xlabel('行业')
plt.ylabel('数量')
else:
plt.text(0.5, 0.5, '无数据', ha='center', va='center', fontsize=14)
plt.tight_layout()
plt.show()
# 绘制各省份科技成果行业分布饼状图
plt.figure(figsize=(18, 6))
# 河北省
plt.subplot(1, 3, 1)
if not hebei_counts.empty:
hebei_counts[:5].plot(kind='pie', autopct='%1.1f%%', colors=['lightblue', 'pink', 'lightgreen', 'yellow', 'orange'])
plt.title('河北省科技成果行业分布')
else:
plt.text(0.5, 0.5, '无数据', ha='center', va='center', fontsize=14)
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar, Page
# 读取数据
df = pd.read_excel('合并结果_添加地域信息(1).xlsx')
# 数据清洗,删除地域或行政区划编码为空的行
df = df.dropna(subset=['地域', '行政区划编码'])
# 定义行政区划代码映射(示例,需根据实际标准行政区划表完善)
# 这里仅给出部分示例,实际使用时需要完整的映射表
code_to_name = {
'110000': ('北京市', '北京市', '北京市'),
'110100': ('北京市', '北京市', '市辖区'),
'110101': ('北京市', '北京市', '东城区'),
'110102': ('北京市', '北京市', '西城区'),
'110105': ('北京市', '北京市', '朝阳区'),
'110106': ('北京市', '北京市', '丰台区'),
'110107': ('北京市', '北京市', '石景山区'),
'110108': ('北京市', '北京市', '海淀区'),
'120000': ('天津市', '天津市', '天津市'),
'120100': ('天津市', '天津市', '市辖区'),
'120101': ('天津市', '天津市', '和平区'),
'310000': ('上海市', '上海市', '上海市'),
'310100': ('上海市', '上海市', '市辖区'),
'310101': ('上海市', '上海市', '黄浦区'),
# 需补充完整全国行政区划代码与名称映射
}
# 从地域字段和编码提取省市区名称(辅助解析不规范地址)
def extract_names(region, code):
code_str = str(int(code)).zfill(6)
province, city, county = code_to_name.get(code_str, ('未知省', '未知市', '未知区县'))
# 若地域字段包含名称,优先使用地域解析
if region:
if '省' in region:
province = region.split('省')[0] + '省'
elif '自治区' in region:
province = region.split('自治区')[0] + '自治区'
elif '市' in region:
province = region.split('市')[0] + '市'
# 处理直辖市(如北京市、上海市)
if province in ['北京市', '上海市', '天津市', '重庆市']:
city = province
county = region.replace(province, '').strip() or city
return province, city, county
# 提取省、市、区县名称
df['province'], df['city'], df['county'] = zip(
*df.apply(lambda row: extract_names(row['地域'], row['行政区划编码']), axis=1))
# 统计各省的项目数量
province_count = df['province'].value_counts().reset_index(name='项目数量')
province_count.columns = ['province', '项目数量']
# 统计各市的项目数量
city_count = df.groupby(['province', 'city']).size().reset_index(name='项目数量')
# 统计各区县的项目数量
county_count = df.groupby(['city', 'county']).size().reset_index(name='项目数量')
# 创建省级柱状图
def create_province_bar():
bar = (
Bar()
.add_xaxis(province_count['province'].tolist())
.add_yaxis("项目数量", province_count['项目数量'].tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title="各省项目数量"),
toolbox_opts=opts.ToolboxOpts(is_show=True),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))
)
.set_series_opts(
label_opts=opts.LabelOpts(position="top"),
itemstyle_opts=opts.ItemStyleOpts(color="#63869e"),
tooltip_opts=opts.TooltipOpts(trigger="item"),
markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值"),
]
),
markline_opts=opts.MarkLineOpts(
data=[
opts.MarkLineItem(type_="average", name="平均值"),
]
),
)
)
bar.options['toolbox']['feature']['restore'] = {}
bar.options['toolbox']['feature']['saveAsImage'] = {}
return bar
# 创建市级柱状图
def create_city_bar(province):
city_data = city_count[city_count['province'] == province]
bar = (
Bar()
.add_xaxis(city_data['city'].tolist())
.add_yaxis("项目数量", city_data['项目数量'].tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title=f"{province} 各市项目数量"),
toolbox_opts=opts.ToolboxOpts(is_show=True),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))
)
.set_series_opts(
label_opts=opts.LabelOpts(position="top"),
itemstyle_opts=opts.ItemStyleOpts(color="#63869e"),
tooltip_opts=opts.TooltipOpts(trigger="item"),
markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值"),
]
),
markline_opts=opts.MarkLineOpts(
data=[
opts.MarkLineItem(type_="average", name="平均值"),
]
),
)
)
bar.options['toolbox']['feature']['restore'] = {}
bar.options['toolbox']['feature']['saveAsImage'] = {}
return bar
# 创建区县柱状图
def create_county_bar(city):
county_data = county_count[county_count['city'] == city]
bar = (
Bar()
.add_xaxis(county_data['county'].tolist())
.add_yaxis("项目数量", county_data['项目数量'].tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title=f"{city} 各区县项目数量"),
toolbox_opts=opts.ToolboxOpts(is_show=True),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))
)
.set_series_opts(
label_opts=opts.LabelOpts(position="top"),
itemstyle_opts=opts.ItemStyleOpts(color="#63869e"),
tooltip_opts=opts.TooltipOpts(trigger="item"),
markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值"),
]
),
markline_opts=opts.MarkLineOpts(
data=[
opts.MarkLineItem(type_="average", name="平均值"),
]
),
)
)
bar.options['toolbox']['feature']['restore'] = {}
bar.options['toolbox']['feature']['saveAsImage'] = {}
return bar
# 创建页面
page = Page()
province_bar = create_province_bar()
page.add(province_bar)
# 添加 JavaScript 事件以实现下钻功能
js_code = """
var provinceChart = echarts.getInstanceByDom(document.getElementById('{0}'));
provinceChart.on('click', function (params) {{
var province = params.name;
var cityBar = new echarts.init(document.createElement('div'));
var cityOption = {{
// 这里需要动态生成市级图表的配置
// 你可以根据 province 去获取相应的市级数据
xAxis: {{
type: 'category',
data: []
}},
yAxis: {{
type: 'value'
}},
series: [{{
data: [],
type: 'bar'
}}]
}};
// 生成市级图表的配置
{
let cityData = {city_count.to_json(orient='records')};
let filteredCityData = cityData.filter(item => item.province === province);
let cityNames = filteredCityData.map(item => item.city);
let cityValues = filteredCityData.map(item => item['项目数量']);
cityOption.xAxis.data = cityNames;
cityOption.series[0].data = cityValues;
cityOption.title = {{ text: province + ' 各市项目数量' }};
}
cityBar.setOption(cityOption);
// 替换当前图表
document.getElementById('{0}').innerHTML = '';
document.getElementById('{0}').appendChild(cityBar.getDom());
// 为市级图表添加点击事件以实现区县下钻
cityBar.on('click', function (cityParams) {{
var city = cityParams.name;
var countyBar = new echarts.init(document.createElement('div'));
var countyOption = {{
xAxis: {{
type: 'category',
data: []
}},
yAxis: {{
type: 'value'
}},
series: [{{
data: [],
type: 'bar'
}}]
}};
// 生成区县级图表的配置
{
let countyData = {county_count.to_json(orient='records')};
let filteredCountyData = countyData.filter(item => item.city === city);
let countyNames = filteredCountyData.map(item => item.county);
let countyValues = filteredCountyData.map(item => item['项目数量']);
countyOption.xAxis.data = countyNames;
countyOption.series[0].data = countyValues;
countyOption.title = {{ text: city + ' 各区县项目数量' }};
}
countyBar.setOption(countyOption);
// 替换当前图表
document.getElementById('{0}').innerHTML = '';
document.getElementById('{0}').appendChild(countyBar.getDom());
}});
}});
""".format(province_bar.chart_id, city_count=city_count, county_count=county_count)
province_bar.add_js_funcs(js_code)
# 渲染页面
page.render("bar_drilldown.html")
# -*- coding: utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
# 从CSV文件中读取数据
data = pd.read_csv('combination.csv', encoding='utf-8')
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 按地域分别筛选数据
hebei_data = data[data['省市'] == '河北']
tianjin_data = data[data['省市'] == '天津']
beijing_data = data[data['省市'] == '北京']
# 绘制各省份科技成果行业分布柱状图
plt.figure(figsize=(18, 6))
plt.subplot(1, 3, 1)
hebei_counts = hebei_data['应用行业名称'].value_counts()
hebei_counts[:10].plot(kind='bar')
plt.title('河北省科技成果行业分布')
plt.subplot(1, 3, 2)
tianjin_counts = tianjin_data['应用行业名称'].value_counts()
tianjin_counts[:10].plot(kind='bar')
plt.title('天津市科技成果行业分布')
plt.subplot(1, 3, 3)
beijing_counts = beijing_data['应用行业名称'].value_counts()
beijing_counts[:10].plot(kind='bar')
plt.title('北京市科技成果行业分布')
plt.tight_layout()
plt.show()
# 绘制各省份科技成果行业分布饼状图
plt.figure(figsize=(18, 6))
plt.subplot(1, 3, 1)
hebei_counts[:5].plot(kind='pie', autopct='%1.1f%%')
plt.title('河北省科技成果行业分布')
plt.subplot(1, 3, 2)
tianjin_counts[:5].plot(kind='pie', autopct='%1.1f%%')
plt.title('天津市科技成果行业分布')
plt.subplot(1, 3, 3)
beijing_counts[:5].plot(kind='pie', autopct='%1.1f%%')
plt.title('北京市科技成果行业分布')
plt.tight_layout()
plt.show()