[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6XDWSFC8T0JJHKPQRS1QN3F":3,"skill-same:01M6XDWSFC8T0JJHKPQRS1QN3F":63},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":36,"commitSha":37,"skillDirectory":38,"forksCount":13,"repositoryHtmlUrl":39,"repositoryHomepageUrl":6,"ownerHtmlUrl":40,"ownerBlogUrl":6,"ownerDescription":41,"updatedAt":42,"install":43,"resources":56},"01M6XDWSFC8T0JJHKPQRS1QN3F","did_causal_analysis",null,"Difference-in-Differences causal analysis to identify demographic drivers of behavioral changes with p-value significance testing. Use for event effects, A\u002FB testing, or policy evaluation.","Waaaalnut\u002Fskillsbench","Waaaalnut","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F103995656?v=4","01M6XCS9K1V51EY3JMB7DGMX24","01M6XCS9Q4WPW88W62C55G1H44",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks-no-skills\u002Ftrend-anomaly-causal-inference\u002Fenvironment\u002Fskills\u002Fdid_causal_analysis\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30],"analysis","did causal analysis","testing","policy","Evaluation","use","behavioral","event","with","for","changes","effects","value","2026-11-10 10:12:30",false,"---\nname: did_causal_analysis\ndescription: Difference-in-Differences causal analysis to identify demographic drivers of behavioral changes with p-value significance testing. Use for event effects, A\u002FB testing, or policy evaluation.\n---\n\n# Difference-in-Differences Framework\n\nDiD framework for causal inference with automatic method selection (Multivariate vs Univariate) based on sample size.\n\n## Methodology\n\n### Intensive Margin\n- **Definition**: How much behavior changed among participants (continuous outcome)\n- **Data Structure**: Sparse data - only entities that participated (made purchases, had events, etc.)\n- **Outcome**: Continuous (e.g., spending amount per purchaser)\n- **Key Point**: Do NOT include non-participants or create complete grids - only analyze actual participants\n\n### Extensive Margin  \n- **Definition**: How many people changed behavior (binary 0\u002F1 outcome)\n- **Data Structure**: Complete panel - all entities × all periods (includes non-participants)\n- **Outcome**: Binary (0\u002F1 indicating participation)\n- **Key Point**: MUST include non-participants to measure adoption ratess\n\n### Regression Methods\n\nBoth methods use: `Y = α + βX + γPost + δ(X × Post) + ε` where δ is the DiD estimate.\n\n**Multivariate Heterogeneous DiD**\n- Estimates ALL features simultaneously in one regression\n- Controls for confounding between features\n- Used when: `n ≥ k × min_sample_ratio` (default: 10k samples minimum)\n\n**Univariate DiD**\n- Separate regression for EACH feature\n- More robust with small samples\n- Used when: Insufficient sample size, or as fallback\n\n**CRITICAL**: Both use statsmodels regression to provide p-values for statistical inference.\n\n## ⚠️ CRITICAL: Data Preparation Requirements\n\n### Intensive Margin - Sparse Data (Purchasers\u002FParticipants Only)\n\n**CORRECT approach** - Only aggregate actual transactions:\n```python\n# Group actual transactions by entity-period\nintensive_df = transactions.groupby(['entity_id', 'period'])['value'].sum().reset_index()\n# Result: Only rows where events occurred (e.g., 3,404 rows for active participants)\n```\n\n**Why this matters**: Intensive margin measures \"how much MORE did participants engage\", not \"did non-participants start engaging\". Including zeros for non-participants dilutes the effect and changes the research question.\n\n### Extensive Margin - Complete Panel (All Users)\n\n**CORRECT approach** - Create complete entity × group × period grid:\n```python\n# Create all possible combinations\nfrom itertools import product\nall_entities = entities_df['entity_id'].unique()\nall_groups = target_groups  # e.g., categories, regions, products\nall_periods = ['baseline', 'treatment']\n\ncomplete_grid = pd.DataFrame(\n    list(product(all_entities, all_groups, all_periods)),\n    columns=['entity_id', 'period']\n)\n\n# Mark who participated (1) vs who didn't (0)\nevents_lookup = transactions[['entity_id',  'period']].drop_duplicates()\nevents_lookup['participated'] = 1\n\nextensive_df = complete_grid.merge(events_lookup, how='left')\nextensive_df['participated'] = extensive_df['participated'].fillna(0).astype(int)\n# Result: All entities × groups × periods with binary outcome\n```\n\n**Why this matters**: Extensive margin measures \"did the participation rate increase\", which requires knowing both who participated AND who didn't participate.\n\n## API\n### Constructor Parameters `DIDAnalyzer(min_sample_ratio=10, significance_level=0.05, min_group_size=1)`\n- `min_sample_ratio=10`: Samples-to-features ratio for multivariate DiD\n- `significance_level=0.05`: P-value threshold 0.05-0.1 based on the context and requirement\n- `min_group_size=1`: Min observations per group for univariate DiD\n\n\n### `intensive_margin(df, features, value_col, top_n=None, sort_by='estimate', asc=False)`\nAnalyzes **intensive margin**: how much behavior changed among participants.\n\n**Input Data**: Sparse entity-period data (only participants)\n- `df`: Sparse DataFrame - only entities with participation\n- `features`: List of demographic column names\n- `value_col`: Continuous outcome column (e.g., 'amount', 'spending')\n- `top_n`: Top N features (None = all)\n- `sort_by`: 'estimate' or 'p_value'\n- `asc`: True for ascending, False for descending\n\n**Returns**: List of `{\"feature\": str, \"did_estimate\": float, \"p_value\": float, \"method\": str}`\n\n### `extensive_margin(df, features, value_col='purchased', top_n=None, sort_by='estimate', asc=False)`\nAnalyzes **extensive margin**: how many people changed behavior.\n\n**Input Data**: Complete entity-period panel (all entities including non-participants)\n- `df`: Complete DataFrame - ALL entities × ALL periods (includes non-participants)\n- `features`: List of demographic column names\n- `value_col`: Binary outcome column (0\u002F1), default 'purchased'\n- `top_n`: Top N features (None = all)\n- `sort_by`: 'estimate' or 'p_value'  \n- `asc`: True for ascending, False for descending\n\n**Returns**: List of `{\"feature\": str, \"did_estimate\": float, \"p_value\": float, \"method\": str}`\n\n### Internal Method Selection Logic\n- Tries Multivariate Heterogeneous DiD first (if sample size sufficient)\n- Falls back to Univariate DiD if needed\n- Both methods provide p-values via regression\n","# Difference-in-Differences Framework\n\nDiD framework for causal inference with automatic method selection (Multivariate vs Univariate) based on sample size.\n\n## Methodology\n\n### Intensive Margin\n- **Definition**: How much behavior changed among participants (continuous outcome)\n- **Data Structure**: Sparse data - only entities that participated (made purchases, had events, etc.)\n- **Outcome**: Continuous (e.g., spending amount per purchaser)\n- **Key Point**: Do NOT include non-participants or create complete grids - only analyze actual participants\n\n### Extensive Margin  \n- **Definition**: How many people changed behavior (binary 0\u002F1 outcome)\n- **Data Structure**: Complete panel - all entities × all periods (includes non-participants)\n- **Outcome**: Binary (0\u002F1 indicating participation)\n- **Key Point**: MUST include non-participants to measure adoption ratess\n\n### Regression Methods\n\nBoth methods use: `Y = α + βX + γPost + δ(X × Post) + ε` where δ is the DiD estimate.\n\n**Multivariate Heterogeneous DiD**\n- Estimates ALL features simultaneously in one regression\n- Controls for confounding between features\n- Used when: `n ≥ k × min_sample_ratio` (default: 10k samples minimum)\n\n**Univariate DiD**\n- Separate regression for EACH feature\n- More robust with small samples\n- Used when: Insufficient sample size, or as fallback\n\n**CRITICAL**: Both use statsmodels regression to provide p-values for statistical inference.\n\n## ⚠️ CRITICAL: Data Preparation Requirements\n\n### Intensive Margin - Sparse Data (Purchasers\u002FParticipants Only)\n\n**CORRECT approach** - Only aggregate actual transactions:\n```python\n# Group actual transactions by entity-period\nintensive_df = transactions.groupby(['entity_id', 'period'])['value'].sum().reset_index()\n# Result: Only rows where events occurred (e.g., 3,404 rows for active participants)\n```\n\n**Why this matters**: Intensive margin measures \"how much MORE did participants engage\", not \"did non-participants start engaging\". Including zeros for non-participants dilutes the effect and changes the research question.\n\n### Extensive Margin - Complete Panel (All Users)\n\n**CORRECT approach** - Create complete entity × group × period grid:\n```python\n# Create all possible combinations\nfrom itertools import product\nall_entities = entities_df['entity_id'].unique()\nall_groups = target_groups  # e.g., categories, regions, products\nall_periods = ['baseline', 'treatment']\n\ncomplete_grid = pd.DataFrame(\n    list(product(all_entities, all_groups, all_periods)),\n    columns=['entity_id', 'period']\n)\n\n# Mark who participated (1) vs who didn't (0)\nevents_lookup = transactions[['entity_id',  'period']].drop_duplicates()\nevents_lookup['participated'] = 1\n\nextensive_df = complete_grid.merge(events_lookup, how='left')\nextensive_df['participated'] = extensive_df['participated'].fillna(0).astype(int)\n# Result: All entities × groups × periods with binary outcome\n```\n\n**Why this matters**: Extensive margin measures \"did the participation rate increase\", which requires knowing both who participated AND who didn't participate.\n\n## API\n### Constructor Parameters `DIDAnalyzer(min_sample_ratio=10, significance_level=0.05, min_group_size=1)`\n- `min_sample_ratio=10`: Samples-to-features ratio for multivariate DiD\n- `significance_level=0.05`: P-value threshold 0.05-0.1 based on the context and requirement\n- `min_group_size=1`: Min observations per group for univariate DiD\n\n\n### `intensive_margin(df, features, value_col, top_n=None, sort_by='estimate', asc=False)`\nAnalyzes **intensive margin**: how much behavior changed among participants.\n\n**Input Data**: Sparse entity-period data (only participants)\n- `df`: Sparse DataFrame - only entities with participation\n- `features`: List of demographic column names\n- `value_col`: Continuous outcome column (e.g., 'amount', 'spending')\n- `top_n`: Top N features (None = all)\n- `sort_by`: 'estimate' or 'p_value'\n- `asc`: True for ascending, False for descending\n\n**Returns**: List of `{\"feature\": str, \"did_estimate\": float, \"p_value\": float, \"method\": str}`\n\n### `extensive_margin(df, features, value_col='purchased', top_n=None, sort_by='estimate', asc=False)`\nAnalyzes **extensive margin**: how many people changed behavior.\n\n**Input Data**: Complete entity-period panel (all entities including non-participants)\n- `df`: Complete DataFrame - ALL entities × ALL periods (includes non-participants)\n- `features`: List of demographic column names\n- `value_col`: Binary outcome column (0\u002F1), default 'purchased'\n- `top_n`: Top N features (None = all)\n- `sort_by`: 'estimate' or 'p_value'  \n- `asc`: True for ascending, False for descending\n\n**Returns**: List of `{\"feature\": str, \"did_estimate\": float, \"p_value\": float, \"method\": str}`\n\n### Internal Method Selection Logic\n- Tries Multivariate Heterogeneous DiD first (if sample size sufficient)\n- Falls back to Univariate DiD if needed\n- Both methods provide p-values via regression\n",{"name":5,"description":7},"main","7eeb258ada72b7f58119b0e7a2c00ea89d9beedd","tasks-no-skills\u002Ftrend-anomaly-causal-inference\u002Fenvironment\u002Fskills\u002Fdid_causal_analysis","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench","https:\u002F\u002Fgithub.com\u002FWaaaalnut","student of Zhejiang University","2026-04-21 23:16:23",{"source":8,"skillName":5,"commands":44,"prompt":54,"zipAvailable":55},[45,48,51],{"tool":46,"command":47},"npx","npx skills add Waaaalnut\u002Fskillsbench --skill did_causal_analysis",{"tool":49,"command":50},"bunx","bunx skills add Waaaalnut\u002Fskillsbench --skill did_causal_analysis",{"tool":52,"command":53},"pnpm","pnpm dlx skills add Waaaalnut\u002Fskillsbench --skill did_causal_analysis","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks-no-skills\u002Ftrend-anomaly-causal-inference\u002Fenvironment\u002Fskills\u002Fdid_causal_analysis\u002FSKILL.md",true,[57],{"path":58,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":61,"sourceHtmlUrl":62},"scripts\u002Fdid_analysis.py","SCRIPT","脚本",13560,"https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks-no-skills\u002Ftrend-anomaly-causal-inference\u002Fenvironment\u002Fskills\u002Fdid_causal_analysis\u002Fscripts\u002Fdid_analysis.py",[64,78,93,120,141,159],{"skillNo":65,"name":66,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":74,"publishedAt":31},"01M6XEWMJ6VY3ZC53MPDCPG3GH","data-reconciliation","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fxlsx-recover-data\u002Fenvironment\u002Fskills\u002Fdata-reconciliation\u002FSKILL.md",[69],{"categoryNo":70,"categoryName":71,"taxonomyType":72,"taxonomyTypeDesc":73},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[75,76,77],"data reconciliation","reconciliation","data",{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":31},"01M6XEW8MNPMF1KRXV6ATGFRQF","speech-to-text","Transcribe video to timestamped text using Whisper tiny model (pre-installed).","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-tutorial-indexer\u002Fenvironment\u002Fskills\u002Fspeech-to-text\u002FSKILL.md",[],[85,86,87,88,89,90,91,92],"speech","text","speech to text","transcribe video","whisper","model","Video","transcribe",{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":104,"publishedAt":31},"01M6XEW3FQZP0T1RKQQJFXVY9T","video-processor","Process videos by removing segments and concatenating remaining parts. Use when you need to remove detected pauses\u002Fopenings from videos, create highlight reels, or batch process segment removals using ffmpeg filter_complex.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fvideo-processor\u002FSKILL.md",[99],{"categoryNo":100,"categoryName":101,"taxonomyType":102,"taxonomyTypeDesc":103},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[91,105,106,107,108,109,110,111,112,113,114,115,116,117,118,23,119],"processor","video processor","batch","create","reels","when","parts","segments","process","videos","you","segment","filter","ffmpeg","remove",{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":127,"publishedAt":31},"01M6XEVXJ5KZ0NTY3XZKRY4AS1","silence-detector","Detect initial silence segments in audio\u002Fvideo using energy-based analysis. Use when you need to find low-energy periods at the start of recordings (title slides, setup time, pre-roll silence).","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fsilence-detector\u002FSKILL.md",[126],{"categoryNo":100,"categoryName":101,"taxonomyType":102,"taxonomyTypeDesc":103},[128,129,130,131,110,115,132,133,134,135,136,112,137,138,91,18,139,140,23],"detector","silence detector","title","slides","time","energy","at","recordings","detect","find","Audio","start","setup",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":31},"01M6XEVT3NGRN1FT7JPMAPXS6M","segment-combiner","Combine multiple segment detection results into a unified list. Use when you need to merge segments from different detectors, prepare removal lists for video processing, or consolidate detection outputs.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fsegment-combiner\u002FSKILL.md",[],[116,148,91,149,150,151,152,27,110,153,154,112,115,155,156,23,157,158],"segment combiner","detection","prepare","merge","video processing","outputs","combine","processing","consolidate","results","list",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":168,"publishedAt":31},"01M6XEVMPVASGS2KX86QK4FMT7","report-generator","Generate compression reports for video processing. Use when you need to create structured JSON reports with duration statistics, compression ratios, and segment details after video processing.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Freport-generator\u002FSKILL.md",[165],{"categoryNo":166,"categoryName":167,"taxonomyType":72,"taxonomyTypeDesc":73},"01JBSEEDCAT000000000000034","行政与办公人员",[169,170,171,116,110,27,115,26,155,172,173,174,23,152,175,91,176,177,108],"generator","report generator","report","statistics","structured","reports","json","compression","generate"]