数据合并清洗相关代码

import pandas as pd

# 读取三个 CSV 文件
df1 = pd.read_csv('F:/ruo项目/数据/cg_2015年第1-2-3期.csv', encoding='utf-8')

df2 = pd.read_csv('F:/ruo项目/数据/cg_天津科技成果.csv', encoding='utf-8')
df3 = pd.read_csv('F:/ruo项目/数据/科技成果.csv', encoding='utf-8')

# 重命名字段:统一字段含义
df1.rename(columns={
'单位名称': '单位',
'成果简介': '成果简介',
'主要人员': '负责人'
}, inplace=True)

df2.rename(columns={
'项目简介': '成果简介'
}, inplace=True)

df3.rename(columns={
'完成单位': '单位',
'成果简介': '成果简介',
'完成人': '负责人',
'项目年度编号': '年度',
'登记号': '批准登记号'
}, inplace=True)

# 合并三个 DataFrame
merged_df = pd.concat([df1, df2, df3], ignore_index=True, sort=False)

# 保存到新 CSV 文件
merged_df.to_csv('F:/ruo项目/数据/京津冀2015科技成果汇总.csv', index=False, encoding='utf-8-sig')、
包含维度:
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()

 

posted @ 2025-06-14 13:25  艾鑫4646  阅读(23)  评论(0)    收藏  举报