Elastic Stack梳理:北京空气质量数据分析实战之从数据建模到可视化洞察与NestJS集成方案

对称加密中GCM和CBC俩种加密模式的区别 **CBC(Cipher Block Chaining)** 和 **GCM(Galois/Counter Mode)** 是两种常见的对称加密模式。它们的主要区别体现在加密方式、性能和安全性上。 阅读详情

项目背景与数据准备


数据来源:美国大使馆公开的北京空气质量CSV数据集(2008–2017年),包含每小时记录的PM2.5浓度值(字段:city, parameter, date, year, month, day, hour, value)
核心问题:

  1. 北京空气质量多年趋势是否改善?
  2. 2016年底公众感知的雾霾加剧与官方数据矛盾的原因

数据特点:

  • 时间粒度:每小时一条记录(需聚合到日/月/年维度分析)
  • 数据质量:包含缺失值(标记为-99),需过滤无效数据

1 ) 数据建模

  • 索引设计:

    • 索引名:airquality(原始小时数据)、airquality_days(聚合后的日维度数据)
    • 字段类型:value(浮点数)、date(日期类型),禁用分词器(因数值型数据无需文本分析)
  • 索引结构:字段包括city(城市)、parameter(参数类型,如PM2.5)、date(日期)、value(监测值)

  • 设计原则:禁用分词("index": false),数值型字段使用float类型,日期字段定义为date格式

索引定义示例

// Elasticsearch Mapping示例
PUT /air_quality
{
  "mappings": {
    "properties": {
      "date": { "type": "date" },
      "value": { "type": "float" },
      "city": { "type": "keyword" },
      "parameter": { "type": "keyword" }
    }
  }
}

2 ) 数据导入

  • 工具:filebeat + ingest pipeline
  • 关键处理:
    • 排除无效行(如以a/d/c开头的行)
    • 通过grok解析CSV字段:
      %{DATA:city},%{DATA:parameter},%{DATA:date},%{INT:year},%{INT:month},%{INT:day},%{INT:hour},%{NUMBER:value}
      
    • 生成唯一ID:city+date组合避免重复
    • 移除冗余字段(如year/month/day,由date派生)
  • 数据导入流程:
    • 使用Filebeat + Ingest Node管道处理CSV
    • 关键步骤:
      • 排除无效行(如以a、d、c开头的行)
      • 生成唯一ID(city+date组合),避免重复导入
      • 转换时间戳格式(如date字段解析为ISO格式)
      • 移除冗余字段(如duration)

或者参考 logstash 的方式

input {  
  file {  
    path => "/data/airquality.csv"  
    start_position => "beginning"  
    exclude => ["#*"]  # 跳过注释行  
  }  
}  
filter { csv { separator => "," } }  
output {  
  elasticsearch {  
    hosts => ["localhost:9200"]  
    index => "airquality"  
    pipeline => "airquality_pipeline"  
    document_id => "%{site}_%{date}"  # 防重复导入  
  }  
}  

3 ) Elasticsearch Ingest Pipeline 配置:

PUT _ingest/pipeline/airquality_pipeline  
{  
  "description": "Process Beijing air quality CSV",  
  "processors": [  
    {  
      "grok": {  
        "field": "message",  
        "patterns": [  
          "%{WORD:city},%{WORD:parameter},%{DATE:date},%{INT:year},%{INT:month},%{INT:day},%{INT:hour},%{NUMBER:value}"  
        ]  
      }  
    },  
    {  
      "set": {  
        "field": "_id",  
        "value": "{{city}}_{{date}}"  
      }  
    },  
    {  
      "date": {  
        "field": "date",  
        "formats": ["yyyy-MM-dd HH:mm:ss"],  
        "target_field": "@timestamp"  
      }  
    },  
    {  
      "remove": {  
        "field": ["message", "duration", "error"]  
      }  
    },  
    {  
      "convert": {  
        "field": "value",  
        "type": "float"  
      }  
    }  
  ]  
}  

数据聚合与分析策略

目标:将小时数据聚合为日维度(减少粒度,便于趋势分析)。
Python聚合脚本核心逻辑:

from elasticsearch import Elasticsearch
 
es = Elasticsearch()
query = {
  "query": {"range": {"value": {"gte": 1}}},  # 过滤无效值(如-99)
  "aggs": {
    "daily": {
      "date_histogram": {"field": "date", "calendar_interval": "1d"},
      "aggs": {"avg_pm25": {"avg": {"field": "value"}}}
    }
  }
}
res = es.search(index="air_quality", body=query)
 
# 写入新索引 air_quality_daily
for bucket in res['aggregations']['daily']['buckets']:
    doc = {
        "date": bucket['key_as_string'],
        "avg_pm25": bucket['avg_pm25']['value'],
        "year": datetime.strptime(bucket['key_as_string'], "%Y-%m-%d").year,
        "month": datetime.strptime(bucket['key_as_string'], "%Y-%m-%d").month
    }
    es.index(index="air_quality_daily", document=doc)

或参考如下

目标:将小时数据聚合为日维度(计算日均值/最大值/最小值),存入新索引airquality_days。

from elasticsearch import Elasticsearch  
 
es = Elasticsearch()  
 
# 聚合查询:按日分组,计算PM2.5统计值  
query = {  
  "size": 0,  
  "query": { "range": { "value": { "gte": 1 } } },  # 过滤无效值  
  "aggs": {  
    "days": {  
      "date_histogram": {  
        "field": "@timestamp",  
        "calendar_interval": "1d"  
      },  
      "aggs": {  
        "avg_value": { "avg": { "field": "value" } },  
        "max_value": { "max": { "field": "value" } },  
        "min_value": { "min": { "field": "value" } }  
      }  
    }  
  }  
}  
 
response = es.search(index="airquality", body=query)  
 
# 写入新索引  
for day in response["aggregations"]["days"]["buckets"]:  
    doc = {  
        "date": day["key_as_string"],  
        "year": day["key_as_string"][:4],  
        "month": day["key_as_string"][5:7],  
        "avg_value": day["avg_value"]["value"],  
        "max_value": day["max_value"]["value"],  
        "min_value": day["min_value"]["value"]  
    }  
    es.index(index="airquality_days", document=doc)  

数据分析与可视化实现


关键问题解答与数据聚合:

  1. 多年趋势分析:

    • 将小时数据聚合为日维度(计算每日PM2.5的max、min、avg),使用Python脚本:
      from elasticsearch import Elasticsearch  
      es = Elasticsearch()  
      # 聚合查询:按天分组,计算PM2.5统计值  
      query = {  
          "size": 0,  
          "query": {"range": {"value": {"gte": 1}}},  # 过滤无效值(如-99)  
          "aggs": {  
              "days": {  
                  "date_histogram": {"field": "date", "calendar_interval": "1d"},  
                  "aggs": {"pm25_stats": {"stats": {"field": "value"}}}  
              }  
          }  
      }  
      response = es.search(index="airquality", body=query)  
      # 写入新索引 airquality_days  
      for bucket in response['aggregations']['days']['buckets']:  
          doc = {  
              "date": bucket['key_as_string'],  
              "year": bucket['key_as_string'][:4],  
              "month": bucket['key_as_string'][5:7],  
              "day": bucket['key_as_string'][8:10],  
              "pm25_max": bucket['pm25_stats']['max'],  
              "pm25_avg": bucket['pm25_stats']['avg']  
          }  
          es.index(index="airquality_days", document=doc)  
      
  2. Kibana可视化结论:

    • 趋势图表:堆叠柱状图展示不同空气质量等级(按AQI划分)的年度占比。
      • AQI分级:
        • Good (0–50):绿色
        • Moderate (51–100):黄色
        • Unhealthy (101–200):橙色
        • Very Unhealthy (>200):红色
      • 结论:2008–2017年,蓝天(AQI<150)占比从38%升至47%,整体改善。
    • 2016年底矛盾解析:
      • 冬季(2016年10月–2017年2月)雾霾天数(AQI>200)达60天(2015年仅45天),且PM2.5均值更高,导致公众感知恶化。

Kibana高级图表实现:

  • 动态字段计算(Scripted Field):
    def pm25 = doc['pm25_max'].value;  
    if (pm25 <= 50) return "1-Good";  
    else if (pm25 <= 100) return "2-Moderate";  
    else if (pm25 <= 150) return "3-Unhealthy";  
    else return "4-VeryUnhealthy";  
    
  • 时间对比(Offset):
    # 比较2016年与2015年冬季数据  
    es_query: {  
      "aggs": {  
        "2016": { "avg": { "field": "pm25_avg" } },  
        "2015": { "avg": { "field": "pm25_avg", "offset": "-1y" } }  
      }  
    }  
    

Kibana可视化分析


1 )核心问题1:空气质量长期趋势

分析结论:

  • 2008–2017年北京蓝天占比(AQI≤100)从32%升至47%,污染天数比例下降,整体持续改善。

可视化方案:

  1. 堆叠柱状图(按年统计AQI等级分布)

    • 关键配置:
      • Y轴:count
      • X轴:date_histogram(年间隔)
      • 拆分系列:scripted_field(AQI等级)
    • 等级计算脚本(Kibana Scripted Field):
      if (doc['max_value'].value <= 50) return "1_good";  
      else if (doc['max_value'].value <= 100) return "2_moderate";  
      else if (doc['max_value'].value <= 150) return "3_unhealthy_sensitive";  
      // ... 其他等级  
      
  2. 百分比面积图(简化空气质量趋势)

    • 三类分组:
      • Good (AQI≤50)
      • Unhealthy (AQI>100)
      • Very Unhealthy (AQI>200)
    • 配置要点:启用stacked as percentage模式。

2 ) 核心问题2:2016年底雾霾感知矛盾

分析结论:

  • 全年数据:2016年蓝天占比(47%)高于2015年(43%)。
  • 冬季数据:2016年冬季PM2.5均值比2015年高18%,雾霾天(AQI>200)占比达40%(2015年为27%)。

可视化对比:

  1. 时间序列对比图(2015 vs 2016冬季)

    // Kibana TSVB表达式  
    {  
      "expression": "es_index='airquality_days' | where max_value>150 | divide={math 'count()/total'} | multiply=100 | label='2016'",  
      "series": [  
        {  
          "expression": "offset=-1y",  
          "label": "2015"  
        }  
      ]  
    }  
    
  2. 每日AQI热力图

    • X轴:日期(日间隔)
    • Y轴:AQI等级(rate_level)
    • 颜色:PM2.5浓度值(max_value)

工程示例:1


1 ) 方案1:基础数据导入与查询服务

依赖安装:

npm install @nestjs/elasticsearch @elastic/elasticsearch  

NestJS模块配置(elastic.module.ts):

import { Module } from '@nestjs/common';  
import { ElasticsearchModule } from '@nestjs/elasticsearch';  
 
@Module({  
  imports: [  
    ElasticsearchModule.register({  
      node: 'http://localhost:9200',  
      auth: { username: 'elastic', password: 'your_password' }  
    }),  
  ],  
  exports: [ElasticsearchModule],  
})  
export class ElasticModule {}  

数据导入服务(air-import.service.ts):

import { Injectable } from '@nestjs/common';  
import { ElasticsearchService } from '@nestjs/elasticsearch';  
import * as fs from 'fs';  
import * as csv from 'csv-parser';  
 
@Injectable()  
export class AirImportService {  
  constructor(private readonly esService: ElasticsearchService) {}  
 
  async importCSV(filePath: string): Promise<void> {  
    const stream = fs.createReadStream(filePath).pipe(csv());  
    const bulkActions = [];  
 
    stream.on('data', (row) => {  
      bulkActions.push({ index: { _index: 'airquality' } });  
      bulkActions.push({  
        city: row['Site'],  
        date: `${row['Year']}-${row['Month']}-${row['Day']} ${row['Hour']}:00:00`,  
        value: parseFloat(row['Value']),  
        parameter: 'PM2.5'  
      });  
    });  
 
    stream.on('end', async () => {  
      await this.esService.bulk({ body: bulkActions });  
      console.log(`Imported ${bulkActions.length / 2} records`);  
    });  
  }  
}  

2 ) 方案2:聚合分析与API暴露
聚合查询服务(air-analysis.service.ts):

import { Injectable } from '@nestjs/common';  
import { ElasticsearchService } from '@nestjs/elasticsearch';  
 
@Injectable()  
export class AirAnalysisService {  
  constructor(private readonly esService: ElasticsearchService) {}  
 
  async getYearlyAQI(year: number): Promise<any> {  
    const response = await this.esService.search({  
      index: 'airquality_days',  
      body: {  
        size: 0,  
        query: { term: { year } },  
        aggs: {  
          aqi_levels: {  
            terms: { field: 'rate_level' }  // 使用Scripted Field  
          }  
        }  
      }  
    });  
    return response.aggregations.aqi_levels.buckets;  
  }  
}  

控制器(air.controller.ts):

import { Controller, Get, Param } from '@nestjs/common';  
import { AirAnalysisService } from './air-analysis.service';  
 
@Controller('air')  
export class AirController {  
  constructor(private readonly analysisService: AirAnalysisService) {}  
 
  @Get('yearly/:year')  
  async getYearlyData(@Param('year') year: number) {  
    return this.analysisService.getYearlyAQI(year);  
  }  
}  

3 )方案3:实时监控与告警系统
Elasticsearch Watcher 配置:

PUT _watcher/watch/pm25_alert  
{  
  "trigger": { "schedule": { "interval": "1h" } },  
  "input": {  
    "search": {  
      "request": {  
        "indices": ["airquality"],  
        "body": {  
          "query": {  
            "range": { "value": { "gte": 200 } }  // PM2.5 > 200触发告警  
          }  
        }  
      }  
    }  
  },  
  "actions": {  
    "email_alert": {  
      "email": {  
        "to": "admin@example.com",  
        "subject": "High PM2.5 Alert",  
        "body": "PM2.5 levels exceeded 200 at {{ctx.payload.hits.total.value}} locations."  
      }  
    }  
  }  
}  

NestJS 告警订阅服务:

import { Injectable } from '@nestjs/common';  
import { ElasticsearchService } from '@nestjs/elasticsearch';  
 
@Injectable()  
export class AlertService {  
  constructor(private readonly esService: ElasticsearchService) {}  
 
  async subscribeAlerts(): Promise<void> {  
    // 模拟Watcher回调(生产环境用Webhook)  
    setInterval(async () => {  
      const result = await this.esService.search({  
        index: 'airquality',  
        body: { query: { range: { value: { gte: 200 } } } }  
      });  
      if (result.hits.total.value > 0) {  
        this.sendAlert(result.hits.total.value);  
      }  
    }, 3600000); // 每小时检查  
  }  
 
  private sendAlert(count: number): void {  
    console.log(`ALERT: ${count} locations with PM2.5 > 200!`);  
    // 集成短信/邮件服务(如Nodemailer)  
  }  
}  

工程示例:2


1 ) 方案1:基础客户端调用

import { Injectable } from '@nestjs/common';
import { Client } from '@elastic/elasticsearch';
 
@Injectable()
export class ElasticService {
  private readonly client: Client;
 
  constructor() {
    this.client = new Client({ node: 'http://localhost:9200' });
  }
 
  async searchAirQuality(query: any) {
    return this.client.search({
      index: 'air_quality_daily',
      body: query 
    });
  }
}

2 ) 方案2:模块化封装(Repository模式)

// elastic.module.ts
import { Module } from '@nestjs/common';
import { ElasticsearchModule } from '@nestjs/elasticsearch';
 
@Module({
  imports: [ElasticsearchModule.register({ node: 'http://localhost:9200' })],
  exports: [ElasticsearchModule],
})
export class ElasticModule {}
 
// air-quality.repository.ts
import { Injectable } from '@nestjs/common';
import { ElasticsearchService } from '@nestjs/elasticsearch';
 
@Injectable()
export class AirQualityRepository {
  constructor(private readonly esService: ElasticsearchService) {}
 
  async getDailySummary(year: number) {
    return this.esService.search({
      index: 'air_quality_daily',
      body: { query: { match: { year } } }
    });
  }
}

3 ) 方案3:高级配置(动态索引+管道)

import { DynamicModule, Global } from '@nestjs/common';
import { Client, ClientOptions } from '@elastic/elasticsearch';
 
@Global()
@Injectable()
export class ConfigurableElasticService {
  private client: Client;
 
  init(options: ClientOptions) {
    this.client = new Client(options);
  }
 
  async createPipeline(id: string, pipelineConfig: any) {
    return this.client.ingest.putPipeline({ id, body: pipelineConfig });
  }
}
 
// 使用示例
const elasticService = new ConfigurableElasticService();
elasticService.init({ node: 'http://prod-es:9200' });
elasticService.createPipeline('air_quality_pipeline', { ... });

工程示例:3


1 ) 方案1:基础数据导入服务

import { Controller, Post } from '@nestjs/common';  
import { ElasticsearchService } from '@nestjs/elasticsearch';  
 
@Controller('data')  
export class DataImportController {  
  constructor(private readonly esService: ElasticsearchService) {}  
 
  @Post('import')  
  async importData() {  
    const csvData = await this.readCSV('airquality.csv');  
    const body = csvData.flatMap(doc => [  
      { index: { _index: 'airquality', _id: `${doc.site}_${doc.date}` } },  
      doc  
    ]);  
 
    await this.esService.bulk({ body });  
  }  
 
  private async readCSV(path: string): Promise<any[]> {  
    // 使用csv-parser实现(略)  
  }  
}  

2 ) 方案2:动态聚合查询API

import { Body, Query } from '@nestjs/common';  
 
@Get('aggregate')  
async aggregate(@Query() params: { level: string }) {  
  const query = {  
    aggs: {  
      yearly_stats: {  
        date_histogram: { field: "date", calendar_interval: "1y" },  
        aggs: { level_count: { filter: { range: { max_value: this.getRange(params.level) } } } }  
      }  
    }  
  };  
  return this.esService.search({ index: 'airquality_days', body: query });  
}  
 
private getRange(level: string) {  
  const ranges = {  
    good: { lte: 50 },  
    unhealthy: { gt: 100, lte: 200 }  
    // ...  
  };  
  return ranges[level];  
}  

3 ) 方案3:实时脚本字段处理

// 在NestJS中通过Elasticsearch动态更新Mapping  
async setScriptedField() {  
  await this.esService.indices.putMapping({  
    index: 'airquality_days',  
    body: {  
      properties: {  
        rate_level: {  
          type: "keyword",  
          script: {  
            source: `  
              def val = doc['max_value'].value;  
              if (val <= 50) return "1_good";  
              else if (val <= 100) return "2_moderate";  
              // ...  
            `  
          }  
        }  
      }  
    }  
  });  
}  

技术细节与最佳实践


  1. 性能优化:
  • 索引分片:按时间范围分片(如yearly-2016),提升查询效率
  • 冷热架构:将历史数据迁移至冷节点(使用ILM策略)
  • 聚合时优先使用filter替代query缩小数据集范围。
  • 对于时间序列数据,启用index.sort加速范围查询:
    PUT /airquality_days/_settings  
    { "index": { "sort.field": ["date"], "sort.order": ["desc"] } }  
    
  1. 数据准确性:
    • 使用Pipeline错误处理(on_failure回调),记录导入失败数据
    • 数据校验:在NestJS服务层添加Joi验证
  2. 数据一致性
    • 使用document_id防止重复导入(如site_date组合)。
    • 管道中remove无用字段减少存储开销。
  3. 可扩展性:
    • 微服务集成:通过Kafka将数据流同步至Elasticsearch
    • 集群部署:配置3节点ES集群(1主 + 2数据节点)
  4. Kibana高级技巧
    • 动态对比:利用offset=-1y自动对比去年同期数据
    • 百分比模式:在面积图中启用stack as percentage直观显示占比变化
    • 热力图配置:Y轴使用terms分桶(AQI等级),X轴用date_histogram(日粒度)

Kibana仪表板实现关键技术


  1. 堆叠柱状图(年度趋势)

    • 配置要点:
      • Metrics:按AQI等级拆分(Filters Aggregation)。
      • Bucket:按年聚合(Date Histogram,间隔1年)。
      • 堆叠模式:Percentage(显示占比趋势)。
  2. 时间对比(YoY分析)

    • Offset应用:直接对比同年期数据。
      "aggs": {
        "current_year": { "avg": { "field": "value" } },
        "previous_year": { "avg": { "field": "value", "offset": "-1y" } }
      }
      

环境配置与优化建议


  1. Elasticsearch配置:
    • 启用索引生命周期管理(ILM),按时间滚动存储(如按月分片)。
    • 设置refresh_interval: 30s提升写入性能。
  2. NestJS最佳实践:
    • 使用拦截器统一处理ES请求异常。
    • 环境变量管理ES连接参数(通过ConfigModule)。

学习资源与延伸实践


资源类别推荐内容
官方文档Elasticsearch Aggregations
数据集Kaggle空气质量数据集
实战案例使用ecommerce样例数据构建商品销售分析看板
社区支持Elastic中文社区(搜索@rockbean提问)

关键建议:

  • 内外兼修:深入理解DSL查询而不仅依赖Kibana界面操作
  • 版本迭代:关注ES 7.x+的SQL查询特性

延伸学习资源


  1. 官方文档:Elasticsearch Docs
  2. 数据集:
  3. 性能优化:
    • 冷热数据分层(Hot-Warm架构)
    • 向量化查询(knn_search)

核心总结:通过数据粒度聚合、动态字段计算、时间偏移分析,验证了北京空气质量长期改善与短期波动并存的现象。技术关键在于精准的管道设计与Kibana可视化深度配置。

总结与学习路径


核心结论:

  • 北京空气质量整体改善(2008–2017年蓝天占比↑),但2016年冬季雾霾加剧(连续污染天数增多)
  • 技术验证:Elastic Stack可高效处理时序数据分析,结合NestJS构建生产级应用

通过本项目,我们实现了:

  1. 数据全链路处理:原始CSV → ES索引 → 聚合二次存储 → Kibana可视化。
  2. 矛盾问题解析:结合长期趋势与季节差异,解释公众感知与官方数据的偏差。
  3. 工程化落地:提供NestJS与ES集成的三种生产级方案。

更多学习资源:

  1. Elastic官方文档
  2. Elastic中文社区(用户@rockbean)
  3. 公开数据集:Kaggle、UCI Machine Learning Repository

关键建议:

  • 内外兼修:深入理解ES原理(如倒排索引、分片机制),而非仅关注可视化
  • 实践驱动:使用公开数据集复现分析流程,并扩展至电商日志、用户行为等场景
  • 版本迭代:ES 6.x至8.x的核心原理不变,关注新特性(如SQL查询、向量检索)
【ODX介绍】-4.2-UDS诊断$27服务在ODX-D诊断描述文件中如何描述 共25页精讲:附ODX-D XML:UDS $27 Security服务0x61和0x62 Sub-Function,其它Sub-Function可参照其格式。 目录 1 ODX-D描述一个UDS $27 Security服务Sub-Function的结构 2 标签DIAG-SERVICE描述的内容 2.1 举例:DIAG-SERVICE的XML描述 3 标签REQUEST描述的内容 3.1 举例:REQUEST的XML描述 4 标签POS-RESPONSE描述的内容 4.1 举例:PO.. 阅读详情

相关推荐

Calibre license失效的解决方法

Calibre license失效的解决方法

qq_45354630的博客 6484

智能数据分析平台深度评测:主流产品优劣势与适用场景解析

智能数据分析平台的选型,核心是判断企业当前处于哪个数据阶段、下一步要解决什么问题。四款平台各有明确的能力侧重:帆软 FineBI 强在报表与指标体系的标准化,观远数据强在行业场景与决策智能,火山引擎 DataWind 强在字节生态与对话式问数,ThinkingAI 的价值在于把"分析"推进到"行动",让数据闭环真正转起来。与其纠结哪家功能更多,不如先用一个真实业务问题做验证,最快能跑通闭环的那一个,往往就是当前阶段的最优解。

效率工作研究中心 87

kali破解wifi之airmon-ng 工具利用

......

qq_42378173的博客 1万+

适合做数据分析的 AI 工具怎么选:五类任务对应五类工具

选数据分析 AI 工具这件事,答案取决于三个条件:你的任务类型、技术门槛,以及要不要做工程化交付。先把结论放在前面:临时看看数据,用聊天式对话分析;日常表格处理,用 Excel/WPS AI;团队看板和口径管理,用商业 BI 或开源 BI;写代码做专业分析,用 Python 生态加编码助手;如果是多文件工程、要跑通并验证、要留版本记录,就进入 AI 原生 IDE 的领地。把“工具哪个好”换成“我属于哪类任务”,选型就不再是排行榜问题,而是条件匹配问题。

2603_96806404的博客 238

雷达原理习题答案【西电】

  目前教材用的是陈老师新版的,但是,我发现课后题有一部分是之前某本书里的。答案如下【建议参看原题→查阅答案】 【原题点这里!!点这里!!】 目录跳转功能目前好像只支持网页版 文章目录% 第一章、第二章% 第三章% 第四章% 第五章% 第六章% 第七章% 第八章 % 第一章、第二章 % 第三章 % 第四章 % 第五章 % 第六章 % 第七章 % 第八章 ...

薛定谔的壳的博客 1万+

使用Hyper-V使用下载下来的macOS安装引导安装macos

然后关闭工具返回安装界面选择第二个reinstall,选择119g那个硬盘。我的资源上传了:macOS Monterey on Hyper-V.7z。设置固件的启动顺序,引导安装盘放到第一位,mac安装110g放第二。选择disk utility格式化那个110g。下载解压的macos引导挂载到虚拟硬盘。其他设置安全禁用,检查禁用,集成都选中。新建一个虚拟硬盘装mac,110g。

viviliving的专栏 3026

企业做 AI 数据分析,该用通用办公 Agent 还是专业数据 Agent?

企业做 AI 数据分析,选型的核心判断标准是数据复杂度,而非单纯的产品偏好。当数据分析停留在单表、小数据量、口径模糊的浅层问答时,通用办公 Agent 已经足够;当数据涉及多表关联、大数据量、严格指标口径和权限治理时,通用 Agent 的生成 SQL 路线会在这四道门槛前暴露能力边界,专业数据 Agent 才是承接深度分析的可靠选择。两类 Agent 的定位决定了它们应当协同而非替代。

Leo的博客 118

LangChain .NET:C#开发者构建AI应用的RAG框架与实战指南

大语言模型(LLM)作为当前人工智能的核心技术,通过深度学习海量文本数据,掌握了强大的语言理解和生成能力。其原理基于Transformer架构,通过自注意力机制捕捉长距离依赖关系,从而实现对复杂语义的建模。这一技术价值在于能够将非结构化的自然语言转化为可计算、可推理的表示,为各类智能应用提供认知基础。在实际工程实践中,LLM常被应用于构建检索增强生成(RAG)系统和AI智能体(Agent)。RAG通过结合外部知识库检索与LLM生成,有效提升了问答的准确性和事实性,是构建企业知识库、智能客服等场景的关键技术。

weixin_42538175的博客 706

适合做数据分析的AI工具怎么选:按任务类型拆解五类方案与选型维度

以 AI 原生开发环境这一形态为例,TRAE 保留编辑器、终端、调试、Git 等传统工作流,并内置可规划并执行任务的 AI 智能体,生成的代码可以直接在终端里运行,报错可以进调试器定位,每一次修改都有 Git 提交可回溯。做数据分析选 AI 工具时,最容易踩的坑不是工具太少,而是把不同物种的东西放在一起比:把能聊天的通用大模型当成 BI 用,把自动补全的编程助手当成分析师用,最后得出 AI 做不了数据分析的结论。最后一步建议:拿你手头真实的一个分析任务去试,看工具在报错之后的表现,比看任何评测都准。

2603_96881810的博客 223

通过Python实现物联网金橙子自动打标

对于自家公司使用金橙子打标卡时,为了与生产线或者PLC联动等,往往需要对金橙子打标卡进行二次开发,而在二次开发中不得不涉及到MarkEzd.dll这个文件,而这个dll文件网上版本多不说,一般都没法直接使用,最后还不得不花大价钱购买专用库。而本文针对这个问题,涉法通过python来绕过MarkEzd.dll文件,直接进行自动化控制EzCad来实现联动,可应用于实际生产。文章最后拓展一下以物联网的形式,实现手机平台等登录网页,输入想要的印字内容后,远程打印的案例。

lylelo的博客 3366

基于FPGA的最大功率点跟踪(MPPT)系统开发 - MATLAB实现

最大功率点跟踪(Maximum Power Point Tracking,MPPT)是太阳能光伏系统中的重要技术,它通过调整太阳能电池板的工作点,以最大化输出功率。通过FPGA系统设计和硬件验证,我们可以实现太阳能光伏系统中的最大功率点跟踪。这种基于FPGA的MPPT系统具有高性能和灵活性,适用于太阳能光伏系统中的实时最大功率点跟踪。MPPT算法的选择对于系统的性能至关重要。在本文中,我们选择使用Perturb and Observe(P&O)算法,它是一种常用的基于光伏阵列电压和电流测量的迭代算法。

CoderExtra的博客 387

数据分析报表自动化:从数据到决策的报告流水线

报表自动化不是把 Excel 换成看板,而是把「取数 → 清洗 → 建模 → 可视化 → 分发」固化为可调度、可复现的流水线。它让人从重复劳动里抽身,只做判断与决策。本文系统拆解 3 个核心能力与 5 个落地步骤,并说明通智睿见如何以智能数据平台的能力,把报表结论沉淀为可问、可测、可复用的洞察资产。

淡然一笑 的专栏 155

100天精通Python(进阶篇)——第43天:批量将PDF转Word文档(附上脚本代码)

100天精通Python(进阶篇)——第43天:批量将PDF转Word文档(附上脚本代码)

努力让自己发光,对的人才能迎着光而来 9万+

适合做数据分析的 AI 工具怎么选:按任务类型与工程要求定位到具体方案

回到最初的问题:适合做数据分析的 AI 工具,答案不是一个名字,而是一张按你的任务条件展开的选型表。表格办公和零代码临时分析不需要引入 AI 工具,对话 AI 加电子表格就能解决;企业级看板交付在成熟 BI 产品里选;写代码的 analysts 和开发者在开源生态加编码助手这条线上效率最好;而当分析项目复杂到需要多文件工程、运行验证和可追溯交付时,TRAE 这类提供 Agent 窗口与 IDE 窗口双形态、保留完整编辑/终端/调试/Git 工作流的 AI 原生 IDE,是值得考察的一类新选项。

2608_96881912的博客 141

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

读数据分析思维通识课02从数据中快速发现规律(上)

读数据分析思维通识课02从数据中快速发现规律(上)

lyingSeven的博客 358

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

WorkBuddy 接入奥威BI:让企业级数据分析在对话里完成

业务人员不需要下载数据、不需要打开 BI 门户,只需在对话框里说出业务问题——比如“分析去年公司经营风险”——就能拿到一份口径统一、数据可溯源的图文分析报告。奥威BI 的价值恰恰在于承接这类存量系统——通过数据接口把金蝶云·星空、K/3 WISE 以及用友等 ERP 的数据统一接入并建模,之后 AI 通过 MCP 调用的就是已经治理好的数据。写好配置之后,需要在连接器管理页面右上角的自定义连接器入口里,对新服务点击“信任”,这一步做完,WorkBuddy 才真正具备调用奥威BI 的能力。

qq_43696218的博客 295

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

云计算技术应用专业考证路线:从Linux、云平台到Kubernetes与数据分析

云计算技术应用专业选证书,首先要看就业方向:是做云平台运维、Linux系统管理,还是向容器平台、云架构与数据应用发展?岗位不同,值得投入的证书也不同。面向2027年的实习和求职规划,可以重点考虑六项证书:华为HCIA-Cloud Computing、阿里云ACA云计算助理工程师、RHCSA、CDA数据分析师、AWS解决方案架构师助理级认证和CKA。它们分别对应云平台基础、系统管理、数据分析、架构设计与容器运维等能力,不必全部报考。

gentleing的博客 103

基于springboot+vue+uniapp的羽毛球预约小程序(Websocket智能沟通、Echarts数据分析、会员闭环管理、灵活运营规则、全流程预约)

本系统基于B/S架构,采用前后端分离设计,集成微信小程序与管理后台,实现多角色权限管控。核心亮点包括:全流程可视化预约、灵活运营规则配置、会员闭环管理(含余额、充值、退款)、ECharts多维度数据分析及WebSocket智能客服。支持语音、图片沟通,提升服务效率。系统覆盖用户、工作人员、管理员全链路功能,实现场馆资源高效管理与用户体验优化。

paopaokaka_luck的博客 262

“扣子编程”开发数据分析专家Agent实战案例

本项目虽然规模不大,但涉及提示词设计、工具编排、模型调用等多个关键环节。以下五条经验对同类项目具有普遍的借鉴意义。

夏天又到了的专栏 649

关于Atera数据分析的几点问题探讨

关于Atera数据分析的几点问题探讨

weixin_53637133的博客 156

visium数据分析范例--解码调控胶质母细胞瘤可塑性的基因调控程序

visium数据分析范例--解码调控胶质母细胞瘤可塑性的基因调控程序

weixin_53637133的博客 190

AI 办公提示词模板实战:5 个可复制的 Prompt(会议纪要 / 周报 / 邮件 / 合同 / 数据分析)

5 个可直接复制的办公 Prompt,覆盖会议纪要、周报、对外沟通、合同速读、数据结论。每个给模板、约束点、失效条件,另附五要素框架、失败模式对照表和批量调用骨架。

m0_50747450的博客 295

Claude 做数据分析的这两年:一份复盘与发展线索

企业一方面是继续让 AI 进入企业更多工作环节,另一方面是在使用的过程中,持续构建自己的企业知识库和语义库,让 Agent 越来越懂自己的业务。

Aloudata的博客 520

2027校招准备:商务数据分析与应用专业证书、SQL与项目怎么搭配?

企业认可需要区分三件事:招聘公告明确要求、明确写出优先,以及作者认为有助于学习。三者不能混为一谈。本文所附资料未提供可核实的2026年企业具体岗位JD,也未提供认证官方考试大纲,因此不编造企业认可名单,不把学习建议写成招聘条件或考试内容。截至2026年11月11日,9—10月已经过去。2027届学生应关注仍开放的秋招、补录及后续招聘,具体批次和资格以企业公告为准。

cspttty的博客 219

2026年企业数据分析 AI 选型:基于通用大模型与专业AI数据分析平台的能力边界对比

企业在 2026 年讨论数据分析 AI 选型时,最常见的误判,是把 ChatGPT、豆包等通用大模型直接当成企业数据分析工具。这个判断看起来并不突兀:通用大模型能理解自然语言,能生成结构化内容,能解释字段含义,能写 SQL,也能根据一张表给出经营建议。很多企业管理者由此产生一个直接判断:既然大模型已经具备强对话和强生成能力,那么企业数据分析也可以交给通用大模型完成。这个判断的问题在于,它把会聊天和会分析混成了同一件事。通用大模型可以提升知识处理和内容生成效率,但企业级数据分析的核心并不只是回答问题。

Leo的博客 84

数据科学与大数据技术专业考证路线:从Python、SQL到数据分析与数据库工程

面向2027年的实习、求职与升学准备,数据科学与大数据技术专业的学生经常会遇到一个选择:学过Python、数据库和统计学之后,应该考什么证书,才能让备考与专业能力提升相互促进?“比较好考”需要结合已有基础判断。学过Python的学生,更容易从程序设计类考试入手;偏向数据分析岗位的学生,应关注业务分析、SQL和统计方法;计划从事数据开发、数据库管理的学生,则需要进一步学习数据库设计与系统知识。选证书的实用顺序是:先确定岗位方向,再对照考试内容,最后评估备考投入。

gentleing的博客 160
上一篇: ElasticSearch 梳理:房屋搜索平台与日志分析系统构建指南
下一篇: RabbitMQ:消息可靠性保障之消费端 ACK 机制与限流策略解析
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值