作者: dolphin

  • R for Data Science (2e)

    R for Data Science (2e) R语言数据科学第二版

    《R for Data Science》旧版

  • R语言gm音乐包使用方法

    你想要了解 R 语言中 gm(Graphical Music)包的使用方法并获取可运行的示例,我会从安装、核心概念到具体示例,帮你全面掌握这个包的使用。gm 包是 R 语言中用于以编程方式创建、修改和导出乐谱的工具,它将音乐结构(音符、和弦、拍号、调号等)转化为可渲染的乐谱,支持导出为 MusicXML、PDF、PNG 等格式,非常适合音乐分析和程序化作曲。

    音乐编辑涉及软件musescore and LilyPond(符号生成音乐)

    注意事项

    1. gm包使用链式编程风格(%>%操作符),使代码更具可读性
    2. 可以通过help(package = “gm”)查看完整的函数文档
    3. 支持多种音符时值:”w”(全音符), “h”(二分音符), “q”(四分音符), “e”(八分音符), “s”(十六分音符)等
    4. 可以设置音符的力度(velocity)、八度(octave)和音长(duration)希望这些示例代码能帮助你开始使用R语言的gm包创建自己的音乐作品!

    一、安装与环境准备

    1. 安装 gm 包首先需要安装 gm 包及其依赖,gm 依赖xml2、fs等包,还需要lilypond软件来渲染乐谱(导出 PDF/PNG 必需): 安装CRAN版本(如果已发布) install.packages(“gm”)
      或安装开发版(推荐,功能更新) ***用这个***否则不输出内容
      install.packages(“devtools”)
      devtools::install_github(“flujoo/gm”)
    2. 安装 LilyPond(关键依赖)gm 渲染乐谱依赖 LilyPond,需单独安装:Windows:从LilyPond 官网下载安装包,安装后将路径(如C:\Program Files\LilyPond\usr\bin)添加到系统环境变量。(下载的自拍压缩包bin目录,放入上述目录即可)
    1. 你还需要安装 MuseScore,它是一款开源免费的打谱软件。编辑生成的乐谱MuseScore 有默认的安装路径,如果你安装到其它路径,请在 .Renviron 文件中设置:
    2. 打开 .Renviron 文件。可以用命令 file.edit("~/.Renviron")
    3. 在其中加入 MUSESCORE_PATH=<MuseScore 可执行文件的路径>,比如 MUSESCORE_PATH="C:/Program Files (x86)/MuseScore 3/bin/MuseScore3.exe"
    4. 重启 R。

    二、gm 包核心概念

    gm 的核心是通过Music对象构建乐谱,主要包含以下层级: Music 对象:整个乐谱的容器,包含多个Part(声部)。 Part 对象:单个声部(如钢琴右手、小提琴声部),包含多个Measure(小节)。 Measure 对象:小节,包含音符、休止符、和弦等音乐元素,以及拍号 / 调号定义。 Note/Rest/Chord 对象:音符、休止符、和弦,需指定音高、时值、八度等属性。

    三、完整使用示例

    以下是从基础到进阶的示例,覆盖 gm 包的核心功能:

    # 加载gm包
    library(gm)
    # 生成乐谱数据
    music <- 
      Music() +
      Meter(4, 4) +  # 4/4拍
      Line(c("C5", "D5", "E5", "F5"))  # 音符序列
    music
    # 展示乐谱(调用MuseScore渲染并打开)
    show(music)
    vignette("gm")

    四、关键参数说明

    元素常用参数说明
    note()pitch(音高)、octave(八度)、duration(时值)时值可选:whole(全音符)、half(二分)、quarter(四分)、eighth(八分)、16th(十六分)
    chord()pitches(音高向量)、octaveduration多个音高同时发声,如chord(c("C","E","G"), 4)
    rest()duration休止符,参数同音符
    export()fileformatformat 可选:musicxml(默认)、pdf

    总结

    1. 核心流程:初始化Music对象 → 设置全局属性(拍号 / 调号 / 速度) → 添加Part(声部) → 给Measure(小节)添加音符 / 和弦 / 休止符 → 导出 / 预览。
    2. 关键依赖:使用pdf/png导出功能必须安装 LilyPond 并配置环境变量,否则仅能导出 MusicXML。
    3. 灵活操作:可通过modify_note()/add_measure()等函数动态修改乐谱,支持程序化生成复杂旋律。

    如果需要特定场景的示例(如节奏型生成、调式转换),可以告诉我,我会补充对应的代码。

    作者flujoo:我的 R 项目:https://github.com/flujoo/gm

    See vignette("gm") for a complete guide to gm.

    Complete Guide to gm • gm 查看gm完整教程

  • 氛围编程

    https://github.com/liyupi/ai-guide

    https://www.codefather.cn/

    Vibe Coding(氛围编程)是一种利用自然语言描述生成可执行代码的AI驱动开发模式,适用于编程学习和快速原型构建。以下是具体使用方法和学习路径:
    一、Vibe Coding核心使用流程

    1. 自然语言描述需求
      用清晰、具体的语句描述功能目标(支持中英文),例如:
      “创建一个Python函数,读取CSV文件并绘制销售额折线图,X轴为日期,Y轴为销售额”2. 选择AI编程工具
    • 主流工具推荐:工具适用场景集成环境GitHub Copilot全栈开发VS Code/IDEAChatGPT通用代码生成Web/APICursorAI专用编辑器独立IDEReplit在线协作云端IDE
    1. 迭代优化生成代码
    • 首次生成后补充细节要求:
      “添加数据清洗步骤:过滤缺失值,将日期列转为datetime格式”
    • 通过多次对话修正逻辑错误或优化性能二、学习编程的实践建议(结合Vibe Coding)
    1. 新手入门路径
      graph LR
      描述基础功能] –> B(生成10-20行代码)
      B –> C{逐行解析代码}
      –> D[修改参数观察变化]
      –> E[尝试扩展功能]
      `
    2. 关键学习要点
    • 必学基础概念(即使使用AI):
      • 变量/数据类型
      • 条件语句(if/else)
      • 循环(for/while)
      • 函数定义
    • 调试技巧
      • 在生成代码中主动插入print()或断点
      • 询问AI:“如何修复这个报错:[错误信息]”
    1. 进阶实践案例

    “`python
    使用Vibe Coding创建爬虫示例

    用户描述:”用Python爬取豆瓣电影Top250,保存标题和评分到CSV“

    port requests
    om bs4 import BeautifulSoup
    port csv
    url = “https://movie.douban.com/top250”
    response = requests.get(url)
    soup = BeautifulSoup(response.text, ‘html.parser’)

    with open(‘movies.csv’, ‘w’, newline=”, encoding=’utf-8′) as f:
    writer = csv.writer(f)
    iter.writerow([‘Title’, ‘Rating’])
    for item in soup.select(‘.item’):
    tle = item.select_one(‘.title’).text
    ting = item.select_one(‘.rating_num’).text
    iter.writerow([title, rating])
    `
    优化指令示例

    “添加异常处理:网络请求失败时重试3次,保存数据时避免重复写入表头”


    三、注意事项

    1. 代码质量管控
      • 始终审查AI生成的代码:
      • 检查安全漏洞(如SQL注入风险)
      • 验证边界条件处理
      • 添加必要的注释
      • 对关键模块进行单元测试
    2. 工具局限性
      场景 推荐度 说明
      学习基础语法 ★★★★ 动态生成示例比文档更直观
      开发业务逻辑 ★★ 需人工设计核心架构
      调试复杂BUG ★ AI难以理解深层上下文 重要建议:初期将Vibe Coding作为“智能代码补全工具”而非完全替代,配合经典教程(如Python官方Tutorial)系统学习,逐步减少对AI的依赖。
  • streamlit股票可视化看板Python代码

    使用说明:

    1. 安装依赖库:bash
      pip install akshare streamlit plotly pandas numpy
    2. 运行应用程序:bash
      streamlit run stock_dashboard.py
    3. 功能介绍
    • 侧边栏参数设置
      • 输入股票代码(如SH600938、SZ000001)
      • 选择数据周期(最近1个月至2年或自定义日期)
      • 选择要显示的技术指标(均线、RSI、MACD、成交量)
      • 调整指标参数(如RSI周期、均线周期)
    • 主界面显示
      • 股票基本统计信息(最新价、涨跌幅、最高价、最低价等)
      • 交互式K线图(支持缩放、平移)
      • 技术指标图表(可选择显示)
      • 股票数据表格(最近50条记录)
      • 数据下载功能(CSV格式)
    1. 技术特点
    • 使用akshare获取A股历史数据(前复权)
    • 使用plotly绘制交互式图表
    • 支持多种技术指标的计算和显示
    • 数据缓存机制,提高性能
    • 响应式设计,适配不同屏幕尺寸

    该应用程序提供了一个功能完整的股票数据可视化看板,用户可以方便地查看股票的K线图和常用技术指标,并进行基本的数据分析。
    Pytyhon代码

    import pandas as pd
    import numpy as np
    import akshare as ak
    import streamlit as st
    import plotly.graph_objects as go
    from plotly.subplots import make_subplots
    from datetime import datetime, timedelta
    
    # 设置页面配置
    st.set_page_config(page_title="股票数据看板", layout="wide", initial_sidebar_state="expanded")
    
    # 设置中文显示
    st.markdown("<h1 style='text-align: center;'>股票数据可视化看板</h1>", unsafe_allow_html=True)
    
    # 侧边栏设置
    st.sidebar.header("参数设置")
    
    # 股票代码选择
    stock_code = st.sidebar.text_input("股票代码", "SH600938", help="例如:SH600938(工商银行)、SZ000001(平安银行)")
    
    # 日期范围选择
    date_range = st.sidebar.selectbox(
        "数据周期",
        ["最近1个月", "最近3个月", "最近6个月", "最近1年", "最近2年", "自定义日期"],
        index=2  # 默认选择最近6个月
    )
    
    # 根据选择设置日期
    if date_range == "自定义日期":
        start_date = st.sidebar.date_input("开始日期", datetime.now() - timedelta(days=180))
        end_date = st.sidebar.date_input("结束日期", datetime.now())
    else:
        end_date = datetime.now()
        if date_range == "最近1个月":
            start_date = end_date - timedelta(days=30)
        elif date_range == "最近3个月":
            start_date = end_date - timedelta(days=90)
        elif date_range == "最近6个月":
            start_date = end_date - timedelta(days=180)
        elif date_range == "最近1年":
            start_date = end_date - timedelta(days=365)
        elif date_range == "最近2年":
            start_date = end_date - timedelta(days=730)
    
    # 转换日期格式
    start_date_str = start_date.strftime("%Y-%m-%d")
    end_date_str = end_date.strftime("%Y-%m-%d")
    
    # 技术指标选择
    st.sidebar.header("技术指标")
    show_ma = st.sidebar.checkbox("显示均线", True)
    ma_periods = st.sidebar.multiselect("均线周期", [5, 10, 20, 60, 120, 250], [5, 10, 20, 60])
    
    show_rsi = st.sidebar.checkbox("显示RSI", True)
    rsi_period = st.sidebar.slider("RSI周期", 6, 24, 14)
    
    show_macd = st.sidebar.checkbox("显示MACD", True)
    
    show_volume = st.sidebar.checkbox("显示成交量", True)
    
    # 获取股票数据
    @st.cache_data(ttl=3600)  # 缓存1小时
    def get_stock_data(stock_code, start_date, end_date):
        """
        使用akshare获取股票历史数据
        """
        try:
            # 转换日期格式为akshare要求的格式
            start_date_ak = start_date.replace("-", "")
            end_date_ak = end_date.replace("-", "")
            
            # 转换股票代码格式为akshare要求的格式
            if stock_code.startswith('SH'):
                stock_code_ak = stock_code[2:]
            elif stock_code.startswith('SZ'):
                stock_code_ak = stock_code[2:]
            else:
                # 假设已经是正确格式
                stock_code_ak = stock_code
            
            # 使用akshare获取股票数据
            stock_df = ak.stock_zh_a_hist(symbol=stock_code_ak, period="daily", 
                                         start_date=start_date_ak, end_date=end_date_ak, adjust="qfq")
            
            stock_df['日期'] = pd.to_datetime(stock_df['日期'])
            stock_df.set_index('日期', inplace=True)
            
            # 重命名列名以便于使用
            stock_df.rename(columns={
                '开盘': 'open',
                '收盘': 'close',
                '最高': 'high',
                '最低': 'low',
                '成交量': 'volume',
                '成交额': 'amount',
                '涨跌幅': 'pct_change'
            }, inplace=True)
            
            return stock_df
        except Exception as e:
            st.error(f"获取数据失败: {e}")
            return None
    
    # 计算技术指标
    def calculate_technical_indicators(df):
        """
        计算常用技术指标
        """
        # 计算均线
        for period in ma_periods:
            df[f'MA{period}'] = df['close'].rolling(window=period).mean()
        
        # 计算RSI指标
        if show_rsi:
            delta = df['close'].diff(1)
            gain = delta.where(delta > 0, 0)
            loss = -delta.where(delta < 0, 0)
            
            avg_gain = gain.rolling(window=rsi_period).mean()
            avg_loss = loss.rolling(window=rsi_period).mean()
            
            rs = avg_gain / avg_loss
            df['RSI'] = 100 - (100 / (1 + rs))
        
        # 计算MACD指标
        if show_macd:
            # 计算12日和26日指数移动平均线
            df['EMA12'] = df['close'].ewm(span=12, adjust=False).mean()
            df['EMA26'] = df['close'].ewm(span=26, adjust=False).mean()
            
            # 计算DIF和DEA
            df['DIF'] = df['EMA12'] - df['EMA26']
            df['DEA'] = df['DIF'].ewm(span=9, adjust=False).mean()
            
            # 计算MACD柱状图
            df['MACD'] = 2 * (df['DIF'] - df['DEA'])
        
        return df
    
    # 绘制K线图和技术指标
    def plot_stock_chart(df, stock_code):
        """
        使用plotly绘制股票K线图和技术指标
        """
        # 确定需要多少个子图
        rows = 1
        if show_rsi:
            rows += 1
        if show_macd:
            rows += 1
        if show_volume:
            rows += 1
        
        # 创建子图
        fig = make_subplots(
            rows=rows, cols=1,
            shared_xaxes=True,
            vertical_spacing=0.1,
            subplot_titles=(
                f"{stock_code} K线图",
                "RSI指标" if show_rsi else None,
                "MACD指标" if show_macd else None,
                "成交量" if show_volume else None
            )
        )
        
        # 1. 添加K线图
        fig.add_trace(
            go.Candlestick(
                x=df.index,
                open=df['open'],
                high=df['high'],
                low=df['low'],
                close=df['close'],
                name="K线"
            ),
            row=1, col=1
        )
        
        # 添加均线
        if show_ma:
            colors = ['blue', 'green', 'orange', 'red', 'purple', 'brown']
            for i, period in enumerate(ma_periods):
                color = colors[i % len(colors)]
                fig.add_trace(
                    go.Scatter(
                        x=df.index,
                        y=df[f'MA{period}'],
                        name=f"MA{period}",
                        line=dict(color=color, width=1)
                    ),
                    row=1, col=1
                )
        
        # 2. 添加RSI
        current_row = 2
        if show_rsi:
            fig.add_trace(
                go.Scatter(
                    x=df.index,
                    y=df['RSI'],
                    name="RSI",
                    line=dict(color='brown', width=1.5)
                ),
                row=current_row, col=1
            )
            # 添加超买超卖线
            fig.add_hline(y=70, line_dash="dash", line_color="red", opacity=0.7, row=current_row, col=1)
            fig.add_hline(y=30, line_dash="dash", line_color="green", opacity=0.7, row=current_row, col=1)
            current_row += 1
        
        # 3. 添加MACD
        if show_macd:
            fig.add_trace(
                go.Scatter(
                    x=df.index,
                    y=df['DIF'],
                    name="DIF",
                    line=dict(color='blue', width=1)
                ),
                row=current_row, col=1
            )
            fig.add_trace(
                go.Scatter(
                    x=df.index,
                    y=df['DEA'],
                    name="DEA",
                    line=dict(color='red', width=1)
                ),
                row=current_row, col=1
            )
            fig.add_trace(
                go.Bar(
                    x=df.index,
                    y=df['MACD'],
                    name="MACD",
                    marker_color=df['MACD'].apply(lambda x: 'red' if x > 0 else 'green')
                ),
                row=current_row, col=1
            )
            current_row += 1
        
        # 4. 添加成交量
        if show_volume:
            # 根据涨跌设置成交量颜色
            colors = df['close'].diff().apply(lambda x: 'green' if x >= 0 else 'red')
            fig.add_trace(
                go.Bar(
                    x=df.index,
                    y=df['volume'],
                    name="成交量",
                    marker_color=colors
                ),
                row=current_row, col=1
            )
        
        # 更新布局
        fig.update_layout(
            height=600 + (150 * (rows - 1)),
            width=1200,
            title_x=0.5,
            xaxis_rangeslider_visible=False,
            hovermode='x unified',
            showlegend=True,
            legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1)
        )
        
        # 更新X轴
        fig.update_xaxes(
            type='category',
            tickformat='%Y-%m-%d',
            tickangle=45,
            showspikes=True,
            spikemode='across'
        )
        
        return fig
    
    # 显示数据表格
    def show_data_table(df):
        """
        显示股票数据表格
        """
        st.subheader("股票数据")
        
        # 选择要显示的列
        columns_to_show = ['open', 'close', 'high', 'low', 'volume', 'pct_change']
        
        # 添加选中的均线列
        if show_ma:
            for period in ma_periods:
                columns_to_show.append(f'MA{period}')
        
        # 添加RSI列
        if show_rsi:
            columns_to_show.append('RSI')
        
        # 添加MACD相关列
        if show_macd:
            columns_to_show.extend(['DIF', 'DEA', 'MACD'])
        
        # 显示数据
        st.dataframe(
            df[columns_to_show].tail(50),
            height=400,
            width='stretch'  # 修复:删除重复的width参数,保留width='stretch'
        )
    
    # 计算并显示基本统计信息
    def show_statistics(df):
        """
        显示股票数据的基本统计信息
        """
        st.subheader("基本统计信息")
        
        col1, col2, col3, col4 = st.columns(4)
        
        # 计算统计数据
        with col1:
            st.metric("最新价格", f"¥{df['close'].iloc[-1]:.2f}")
            st.metric("最高价", f"¥{df['high'].max():.2f}")
        
        with col2:
            st.metric("开盘价", f"¥{df['open'].iloc[-1]:.2f}")
            st.metric("最低价", f"¥{df['low'].min():.2f}")
        
        with col3:
            st.metric("成交量", f"{df['volume'].iloc[-1]:,.0f}")
            st.metric("平均成交量", f"{df['volume'].mean():,.0f}")
        
        with col4:
            # 计算涨跌幅
            change = df['close'].iloc[-1] - df['close'].iloc[-2]
            pct_change = df['pct_change'].iloc[-1] if not pd.isna(df['pct_change'].iloc[-1]) else (change / df['close'].iloc[-2] * 100)
            st.metric("涨跌额", f"¥{change:.2f}", f"{pct_change:.2f}%")
            
            # 计算总收益率
            total_return = (df['close'].iloc[-1] / df['close'].iloc[0] - 1) * 100
            st.metric("区间收益率", f"{total_return:.2f}%")
    
    # 主程序
    if __name__ == "__main__":
        # 获取数据
        st.info(f"正在获取 {stock_code} 从 {start_date_str} 到 {end_date_str} 的数据...")
        stock_data = get_stock_data(stock_code, start_date_str, end_date_str)
        
        if stock_data is not None and not stock_data.empty:
            st.success(f"成功获取 {len(stock_data)} 条数据")
            
            # 计算技术指标
            stock_data_with_indicators = calculate_technical_indicators(stock_data.copy())
            
            # 显示统计信息
            show_statistics(stock_data_with_indicators)
            
            # 绘制图表
            fig = plot_stock_chart(stock_data_with_indicators, stock_code)
            st.plotly_chart(fig, width='stretch')  # 修复:将use_container_width=True替换为width='stretch'
            
            # 显示数据表格
            show_data_table(stock_data_with_indicators)
            
            # 下载数据
            csv = stock_data_with_indicators.to_csv().encode('utf-8')
            st.download_button(
                label="下载数据 (CSV)",
                data=csv,
                file_name=f"{stock_code}_{start_date_str}_{end_date_str}.csv",
                mime="text/csv",
                help="点击下载当前股票数据的CSV文件"
            )
        else:
            st.error("获取数据失败,请检查股票代码和网络连接")
  • 二奶奶家-四姑过世

    四姑2026-1-9逝世

    刘南星阁 礼金 刘*芳100刘*柱300刘*栋300

    大姑* 二姑* xxxx名字未知。 刘书伟 三姑 刘书俊 四姑 刘书阁 五姑 刘书润 六姑 刘书平 七姑

  • 昨天交物业费2042元

    尾号5486卡1月8日16:11支出(转账财付通-扫二维码付款)2,042元,余额3,306.95元。【工商银行】

    _cuva
  • churchofjesuschrist

    耶穌基督後期聖徒教會 花时间浏览一下,可能会有意想不到的收获

  • 2026年1月-7日股票巨亏

    两个账户一共亏5000多,有史以来,第一次,中国海油在抽风……谨慎操作,现在仓位有点高了,昨天还有成交量翻了3倍还多,成交30多亿,换手率3.41

  • 老年大学钢琴

    今天是这学期,最后一节课弹奏东方红、送别、莫斯科郊外的晚上……学了点,好像又没学到什么,这大学上的,还得靠自己练,自己体会,发挥主观能动性!学琴路漫长……一学期学会两首曲子,虫儿飞和萱草花,但我不会左手伴奏……难呀。好好练吧,争取自己能弹个歌曲,娱乐自己

  • 张朝阳跨年演讲-太阳系

    搜狐关注流观看—-提问环节有人问?焦虑、拖延。 不要自己设限,做一个理智的人,行动改变情绪