%23%20%2F%2F%2F%20script%0A%23%20dependencies%20%3D%20%5B%0A%23%20%20%20%20%20%22diskcache%3D%3D5.6.3%22%2C%0A%23%20%20%20%20%20%22duckdb%3D%3D1.4.4%22%2C%0A%23%20%20%20%20%20%22marimo%22%2C%0A%23%20%20%20%20%20%22matplotlib%3D%3D3.10.8%22%2C%0A%23%20%20%20%20%20%22nbconvert%3D%3D7.17.0%22%2C%0A%23%20%20%20%20%20%22nbformat%3D%3D5.10.4%22%2C%0A%23%20%20%20%20%20%22numpy%22%2C%0A%23%20%20%20%20%20%22openai%22%2C%0A%23%20%20%20%20%20%22pandas%3D%3D3.0.0%22%2C%0A%23%20%20%20%20%20%22playwright%3D%3D1.58.0%22%2C%0A%23%20%20%20%20%20%22polars%5Bpyarrow%5D%3D%3D1.38.1%22%2C%0A%23%20%20%20%20%20%22pydantic-ai%3D%3D1.59.0%22%2C%0A%23%20%20%20%20%20%22scikit-learn%3D%3D1.8.0%22%2C%0A%23%20%20%20%20%20%22sqlglot%3D%3D28.10.1%22%2C%0A%23%20%20%20%20%20%22tqdm%22%2C%0A%23%20%5D%0A%23%20requires-python%20%3D%20%22%3E%3D3.14%22%0A%23%20%2F%2F%2F%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.20.1%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20duckdb%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20numpy%0A%20%20%20%20import%20polars%20as%20pl%0A%0A%20%20%20%20conn%20%3D%20duckdb.connect(database%3D%22bagaco.duckdb%22)%0A%20%20%20%20return%20conn%2C%20mo%2C%20numpy%2C%20pl%2C%20plt%0A%0A%0A%40app.cell%0Adef%20_(bagaco%2C%20conn%2C%20mo)%3A%0A%20%20%20%20_df%20%3D%20mo.sql(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20SELECT%20COUNT(*)%20AS%20total_docs%20FROM%20bagaco%3B%0A%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20engine%3Dconn%2C%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(items%3D%5Bmo.md(text%3D%22%23%23%23%20Total%20document%20count%22)%2C%20_df%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bagaco%2C%20conn%2C%20mo)%3A%0A%20%20%20%20_df%20%3D%20mo.sql(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20SELECT%0A%20%20%20%20%20%20regexp_replace(lower(regexp_extract(url%2C%20'%5E(%3F%3Ahttps%3F%3A%2F%2F)%3F(%3F%3A%5B%5E%40%2F%5C%5Cn%5D%2B%40)%3F(%5B%5E%3A%2F%3F%5C%5Cn%5D%2B)'%2C%201))%2C%20'%5Ewww%5C%5C.'%2C%20'')%20AS%20domain%2C%0A%20%20%20%20%20%20COUNT(*)%20AS%20n_docs%0A%20%20%20%20FROM%20bagaco%0A%20%20%20%20WHERE%20url%20IS%20NOT%20NULL%20AND%20url%20%3C%3E%20''%0A%20%20%20%20GROUP%20BY%201%0A%20%20%20%20ORDER%20BY%20n_docs%20DESC%0A%20%20%20%20LIMIT%2010%3B%0A%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20engine%3Dconn%2C%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(items%3D%5Bmo.md(text%3D%22%23%23%23%20Top%2010%20domains%20by%20document%20count%22)%2C%20_df%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bagaco%2C%20conn%2C%20mo)%3A%0A%20%20%20%20_df%20%3D%20mo.sql(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20SELECT%0A%20%20%20%20%20%20%20%20regexp_replace(lower(regexp_extract(url%2C%20'%5E(%3F%3Ahttps%3F%3A%2F%2F)%3F(%3F%3A%5B%5E%40%2F%5C%5Cn%5D%2B%40)%3F(%5B%5E%3A%2F%3F%5C%5Cn%5D%2B)'%2C%201))%2C%20'%5Ewww%5C%5C.'%2C%20'')%20AS%20domain%2C%0A%20%20%20%20%20%20%20%20ROUND(AVG(educational_score)%2C%202)%20AS%20avg_edu_score%2C%0A%20%20%20%20%20%20%20%20COUNT(*)%20AS%20n_docs%0A%20%20%20%20FROM%20bagaco%0A%20%20%20%20WHERE%20url%20IS%20NOT%20NULL%20AND%20url%20%3C%3E%20''%20AND%20educational_score%20IS%20NOT%20NULL%0A%20%20%20%20GROUP%20BY%201%0A%20%20%20%20HAVING%20COUNT(*)%20%3E%3D%20100%0A%20%20%20%20ORDER%20BY%20avg_edu_score%20DESC%0A%20%20%20%20LIMIT%2015%3B%0A%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20engine%3Dconn%2C%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20items%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3D%22%23%23%23%20Domains%20with%20highest%20avg%20educational%20score%20(min%20100%20docs)%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_df%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bagaco%2C%20conn%2C%20mo)%3A%0A%20%20%20%20_df%20%3D%20mo.sql(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20SELECT%0A%20%20%20%20%20%20%20%20regexp_replace(lower(regexp_extract(url%2C%20'%5E(%3F%3Ahttps%3F%3A%2F%2F)%3F(%3F%3A%5B%5E%40%2F%5C%5Cn%5D%2B%40)%3F(%5B%5E%3A%2F%3F%5C%5Cn%5D%2B)'%2C%201))%2C%20'%5Ewww%5C%5C.'%2C%20'')%20AS%20domain%2C%0A%20%20%20%20%20%20%20%20ROUND(AVG(educational_score)%2C%202)%20AS%20avg_edu_score%2C%0A%20%20%20%20%20%20%20%20COUNT(*)%20AS%20n_docs%0A%20%20%20%20FROM%20bagaco%0A%20%20%20%20WHERE%20url%20IS%20NOT%20NULL%20AND%20url%20%3C%3E%20''%20AND%20educational_score%20IS%20NOT%20NULL%0A%20%20%20%20GROUP%20BY%201%0A%20%20%20%20HAVING%20COUNT(*)%20%3E%3D%20100%0A%20%20%20%20ORDER%20BY%20avg_edu_score%20ASC%0A%20%20%20%20LIMIT%2015%3B%0A%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20engine%3Dconn%2C%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20items%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3D%22%23%23%23%20Domains%20with%20lowest%20avg%20educational%20score%20(min%20100%20docs)%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_df%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bagaco%2C%20conn%2C%20mo%2C%20plt)%3A%0A%20%20%20%20_domain_scatter_df%20%3D%20mo.sql(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20WITH%20domain_stats%20AS%20(%0A%20%20%20%20%20%20%20%20SELECT%0A%20%20%20%20%20%20%20%20%20%20%20%20regexp_replace(lower(regexp_extract(url%2C%20'%5E(%3F%3Ahttps%3F%3A%2F%2F)%3F(%3F%3A%5B%5E%40%2F%5C%5Cn%5D%2B%40)%3F(%5B%5E%3A%2F%3F%5C%5Cn%5D%2B)'%2C%201))%2C%20'%5Ewww%5C%5C.'%2C%20'')%20AS%20domain%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20COUNT(*)%20AS%20total_docs%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20AVG(educational_score)%20AS%20avg_edu_score%0A%20%20%20%20%20%20%20%20FROM%20bagaco%0A%20%20%20%20%20%20%20%20WHERE%20url%20IS%20NOT%20NULL%0A%20%20%20%20%20%20%20%20%20%20AND%20url%20%3C%3E%20''%0A%20%20%20%20%20%20%20%20%20%20AND%20educational_score%20IS%20NOT%20NULL%0A%20%20%20%20%20%20%20%20GROUP%20BY%201%0A%20%20%20%20%20%20%20%20HAVING%20COUNT(*)%20%3E%2010%0A%20%20%20%20)%2C%0A%20%20%20%20domain_categories%20AS%20(%0A%20%20%20%20%20%20%20%20SELECT%0A%20%20%20%20%20%20%20%20%20%20%20%20domain%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20category%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20ROW_NUMBER()%20OVER%20(PARTITION%20BY%20domain%20ORDER%20BY%20n_docs%20DESC%2C%20category%20ASC)%20AS%20row_number%0A%20%20%20%20%20%20%20%20FROM%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20SELECT%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20regexp_replace(lower(regexp_extract(url%2C%20'%5E(%3F%3Ahttps%3F%3A%2F%2F)%3F(%3F%3A%5B%5E%40%2F%5C%5Cn%5D%2B%40)%3F(%5B%5E%3A%2F%3F%5C%5Cn%5D%2B)'%2C%201))%2C%20'%5Ewww%5C%5C.'%2C%20'')%20AS%20domain%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20category%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20COUNT(*)%20AS%20n_docs%0A%20%20%20%20%20%20%20%20%20%20%20%20FROM%20bagaco%0A%20%20%20%20%20%20%20%20%20%20%20%20WHERE%20url%20IS%20NOT%20NULL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20AND%20url%20%3C%3E%20''%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20AND%20category%20IS%20NOT%20NULL%0A%20%20%20%20%20%20%20%20%20%20%20%20GROUP%20BY%201%2C%202%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%0A%20%20%20%20SELECT%0A%20%20%20%20%20%20%20%20domain_stats.domain%2C%0A%20%20%20%20%20%20%20%20domain_stats.total_docs%2C%0A%20%20%20%20%20%20%20%20ROUND(domain_stats.avg_edu_score%2C%203)%20AS%20avg_edu_score%2C%0A%20%20%20%20%20%20%20%20COALESCE(domain_categories.category%2C%20'Unknown')%20AS%20category%0A%20%20%20%20FROM%20domain_stats%0A%20%20%20%20LEFT%20JOIN%20domain_categories%0A%20%20%20%20%20%20%20%20ON%20domain_stats.domain%20%3D%20domain_categories.domain%0A%20%20%20%20%20%20%20AND%20domain_categories.row_number%20%3D%201%0A%20%20%20%20ORDER%20BY%20domain_stats.total_docs%20DESC%3B%0A%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20engine%3Dconn%2C%0A%20%20%20%20)%0A%0A%20%20%20%20_categories%20%3D%20sorted(_domain_scatter_df%5B%22category%22%5D.unique().to_list())%0A%20%20%20%20_colors%20%3D%20plt.cm.tab10.colors%0A%20%20%20%20_category_colors%20%3D%20%7B%0A%20%20%20%20%20%20%20%20_category%3A%20_colors%5B_index%20%25%20len(_colors)%5D%0A%20%20%20%20%20%20%20%20for%20_index%2C%20_category%20in%20enumerate(_categories)%0A%20%20%20%20%7D%0A%0A%20%20%20%20_%2C%20_ax%20%3D%20plt.subplots(figsize%3D(12%2C%206))%0A%20%20%20%20for%20_category%20in%20_categories%3A%0A%20%20%20%20%20%20%20%20_subset%20%3D%20_domain_scatter_df.filter(%0A%20%20%20%20%20%20%20%20%20%20%20%20_domain_scatter_df%5B%22category%22%5D%20%3D%3D%20_category%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20_ax.scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3D_subset%5B%22total_docs%22%5D.to_list()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3D_subset%5B%22avg_edu_score%22%5D.to_list()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20s%3D16%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20alpha%3D0.65%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3D_category_colors%5B_category%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20label%3D_category%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20_ax.set_xscale(value%3D%22log%22)%0A%20%20%20%20_ax.set_xlabel(xlabel%3D%22Total%20documents%20(log%20scale)%22)%0A%20%20%20%20_ax.set_ylabel(ylabel%3D%22Average%20educational%20score%22)%0A%20%20%20%20_ax.set_title(%0A%20%20%20%20%20%20%20%20label%3D%22Domain%20Scatter%3A%20Total%20Documents%20(Log)%20vs%20Avg%20Educational%20Score%22%2C%0A%20%20%20%20%20%20%20%20fontweight%3D%22bold%22%2C%0A%20%20%20%20)%0A%20%20%20%20_ax.grid(visible%3DTrue%2C%20axis%3D%22both%22%2C%20linestyle%3D%22-%22%2C%20linewidth%3D0.5%2C%20alpha%3D0.35)%0A%20%20%20%20_ax.legend(loc%3D%22best%22%2C%20fontsize%3D8%2C%20ncols%3D2)%0A%20%20%20%20plt.tight_layout()%0A%20%20%20%20_ax%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bagaco%2C%20conn%2C%20mo)%3A%0A%20%20%20%20_fast_total_words%20%3D%20mo.sql(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20SELECT%0A%20%20%20%20%20%20%20%20SUM(%0A%20%20%20%20%20%20%20%20%20%20%20%20CASE%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20text%20IS%20NULL%20OR%20text%20%3D%20''%20THEN%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELSE%20len(trim(text))%20-%20len(replace(trim(text)%2C%20'%20'%2C%20''))%20%2B%201%0A%20%20%20%20%20%20%20%20%20%20%20%20END%0A%20%20%20%20%20%20%20%20)%20AS%20total_words_fast%0A%20%20%20%20FROM%20bagaco%3B%0A%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20engine%3Dconn%2C%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20items%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(text%3D%22%23%23%23%20Total%20words%20in%20dataset%20(fast%20computation)%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_fast_total_words%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bagaco%2C%20conn%2C%20mo%2C%20plt)%3A%0A%20%20%20%20df_per_halfyear%20%3D%20mo.sql(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20SELECT%0A%20%20%20%20%20%20%20%20EXTRACT(YEAR%20FROM%20CAST(date%20AS%20TIMESTAMP))%20%7C%7C%20'%20H'%20%7C%7C%0A%20%20%20%20%20%20%20%20CASE%20WHEN%20EXTRACT(MONTH%20FROM%20CAST(date%20AS%20TIMESTAMP))%20%3C%3D%206%20THEN%201%20ELSE%202%20END%20AS%20year_half%2C%0A%20%20%20%20%20%20%20%20COUNT(*)%20%2F%201000000.0%20AS%20total_doc_count_millions%2C%0A%20%20%20%20%20%20%20%20ROUND(AVG(educational_score)%2C%203)%20AS%20avg_edu_score%0A%20%20%20%20FROM%20bagaco%0A%20%20%20%20WHERE%20date%20IS%20NOT%20NULL%0A%20%20%20%20GROUP%20BY%201%0A%20%20%20%20ORDER%20BY%201%3B%0A%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20engine%3Dconn%2C%0A%20%20%20%20)%0A%0A%20%20%20%20year_half%20%3D%20df_per_halfyear%5B%22year_half%22%5D.to_list()%0A%20%20%20%20total_doc_count_millions%20%3D%20df_per_halfyear%5B%0A%20%20%20%20%20%20%20%20%22total_doc_count_millions%22%0A%20%20%20%20%5D.to_list()%0A%20%20%20%20_avg_edu%20%3D%20df_per_halfyear%5B%22avg_edu_score%22%5D.to_list()%0A%20%20%20%20_x_positions%20%3D%20list(range(len(year_half)))%0A%0A%20%20%20%20_fig%2C%20ax%20%3D%20plt.subplots(figsize%3D(12%2C%206))%0A%20%20%20%20ax.bar(%0A%20%20%20%20%20%20%20%20x%3D_x_positions%2C%0A%20%20%20%20%20%20%20%20height%3Dtotal_doc_count_millions%2C%0A%20%20%20%20%20%20%20%20width%3D0.65%2C%0A%20%20%20%20%20%20%20%20color%3D%22%23449DE3%22%2C%0A%20%20%20%20%20%20%20%20edgecolor%3D%22%234a4a4a%22%2C%0A%20%20%20%20%20%20%20%20linewidth%3D0.6%2C%0A%20%20%20%20%20%20%20%20alpha%3D0.85%2C%0A%20%20%20%20%20%20%20%20label%3D%22Total%20Document%20Count%20(M)%22%2C%0A%20%20%20%20)%0A%20%20%20%20ax.set_xticks(ticks%3D_x_positions)%0A%20%20%20%20ax.set_xticklabels(labels%3Dyear_half%2C%20rotation%3D45%2C%20ha%3D%22right%22)%0A%20%20%20%20ax.set_xlabel(xlabel%3D%22Half-Year%22)%0A%20%20%20%20ax.set_ylabel(ylabel%3D%22Total%20Document%20Count%20(Millions)%22)%0A%20%20%20%20ax.grid(axis%3D%22y%22%2C%20linestyle%3D%22-%22%2C%20linewidth%3D0.5%2C%20alpha%3D0.35)%0A%0A%20%20%20%20_ax2%20%3D%20ax.twinx()%0A%20%20%20%20_ax2.plot(%0A%20%20%20%20%20%20%20%20_x_positions%2C%0A%20%20%20%20%20%20%20%20_avg_edu%2C%0A%20%20%20%20%20%20%20%20color%3D%22%23d73027%22%2C%0A%20%20%20%20%20%20%20%20linewidth%3D2%2C%0A%20%20%20%20%20%20%20%20marker%3D%22o%22%2C%0A%20%20%20%20%20%20%20%20markersize%3D4%2C%0A%20%20%20%20%20%20%20%20label%3D%22Avg%20Edu%20Score%22%2C%0A%20%20%20%20)%0A%20%20%20%20_ax2.set_ylabel(ylabel%3D%22Avg%20Educational%20Score%22%2C%20color%3D%22%23d73027%22)%0A%20%20%20%20_ax2.tick_params(axis%3D%22y%22%2C%20labelcolor%3D%22%23d73027%22)%0A%0A%20%20%20%20_lines1%2C%20_labels1%20%3D%20ax.get_legend_handles_labels()%0A%20%20%20%20_lines2%2C%20_labels2%20%3D%20_ax2.get_legend_handles_labels()%0A%20%20%20%20ax.legend(%0A%20%20%20%20%20%20%20%20handles%3D_lines1%20%2B%20_lines2%2C%20labels%3D_labels1%20%2B%20_labels2%2C%20loc%3D%22upper%20left%22%0A%20%20%20%20)%0A%20%20%20%20ax.set_title(%0A%20%20%20%20%20%20%20%20label%3D%22Document%20Volume%20%26%20Avg%20Educational%20Score%20Over%20Time%22%2C%0A%20%20%20%20%20%20%20%20fontweight%3D%22bold%22%2C%0A%20%20%20%20)%0A%20%20%20%20plt.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bagaco%2C%20conn%2C%20mo%2C%20plt)%3A%0A%20%20%20%20df_word_count_distribution%20%3D%20mo.sql(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20WITH%20wc%20AS%20(%0A%20%20%20%20%20%20%20%20SELECT%20len(string_split(text%2C%20'%20'))%20AS%20word_count%20FROM%20bagaco%20WHERE%20text%20IS%20NOT%20NULL%0A%20%20%20%20)%2C%20bucketed%20AS%20(%0A%20%20%20%20%20%20%20%20SELECT%0A%20%20%20%20%20%20%20%20%20%20%20%20CASE%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20word_count%20%3C%3D%20150%20THEN%20'Note%20(0-150)'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20word_count%20%3C%3D%20600%20THEN%20'Short%20Article%20(151-600)'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20word_count%20%3C%3D%201500%20THEN%20'Standard%20Article%20(601-1500)'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20word_count%20%3C%3D%205000%20THEN%20'Longform%20(1501-5000)'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20word_count%20%3C%3D%2020000%20THEN%20'Deep%20Report%20(5001-20000)'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELSE%20'Book%20(20001%2B)'%0A%20%20%20%20%20%20%20%20%20%20%20%20END%20AS%20length_band%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20COUNT(*)%20%2F%201000000.0%20AS%20doc_count_millions%0A%20%20%20%20%20%20%20%20FROM%20wc%0A%20%20%20%20%20%20%20%20GROUP%20BY%201%0A%20%20%20%20)%0A%20%20%20%20SELECT%0A%20%20%20%20%20%20%20%20CASE%0A%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20length_band%20%3D%20'Note%20(0-150)'%20THEN%201%0A%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20length_band%20%3D%20'Short%20Article%20(151-600)'%20THEN%202%0A%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20length_band%20%3D%20'Standard%20Article%20(601-1500)'%20THEN%203%0A%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20length_band%20%3D%20'Longform%20(1501-5000)'%20THEN%204%0A%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20length_band%20%3D%20'Deep%20Report%20(5001-20000)'%20THEN%205%0A%20%20%20%20%20%20%20%20%20%20%20%20ELSE%206%0A%20%20%20%20%20%20%20%20END%20AS%20bucket_order%2C%0A%20%20%20%20%20%20%20%20length_band%2C%0A%20%20%20%20%20%20%20%20doc_count_millions%0A%20%20%20%20FROM%20bucketed%0A%20%20%20%20ORDER%20BY%201%3B%0A%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20engine%3Dconn%2C%0A%20%20%20%20)%0A%0A%20%20%20%20length_band_labels%20%3D%20df_word_count_distribution%5B%22length_band%22%5D.to_list()%0A%20%20%20%20doc_count_millions%20%3D%20df_word_count_distribution%5B%22doc_count_millions%22%5D.to_list()%0A%20%20%20%20y_positions%20%3D%20list(range(len(length_band_labels)))%0A%0A%20%20%20%20_%2C%20word_count_ax%20%3D%20plt.subplots(figsize%3D(12%2C%204.8))%0A%20%20%20%20word_count_ax.barh(%0A%20%20%20%20%20%20%20%20y%3Dy_positions%2C%0A%20%20%20%20%20%20%20%20width%3Ddoc_count_millions%2C%0A%20%20%20%20%20%20%20%20color%3D%22%23449DE3%22%2C%0A%20%20%20%20%20%20%20%20edgecolor%3D%22%234a4a4a%22%2C%0A%20%20%20%20%20%20%20%20linewidth%3D0.6%2C%0A%20%20%20%20%20%20%20%20alpha%3D0.85%2C%0A%20%20%20%20%20%20%20%20label%3D%22Total%20Document%20Count%20(M)%22%2C%0A%20%20%20%20)%0A%20%20%20%20word_count_ax.set_yticks(ticks%3Dy_positions)%0A%20%20%20%20word_count_ax.set_yticklabels(labels%3Dlength_band_labels)%0A%20%20%20%20word_count_ax.set_xlabel(xlabel%3D%22Total%20Document%20Count%20(Millions)%22)%0A%20%20%20%20word_count_ax.set_ylabel(ylabel%3D%22Word%20Count%20Band%22)%0A%20%20%20%20word_count_ax.set_title(label%3D%22Word%20Count%20Distribution%22%2C%20fontweight%3D%22bold%22)%0A%20%20%20%20word_count_ax.grid(%0A%20%20%20%20%20%20%20%20visible%3DTrue%2C%20axis%3D%22x%22%2C%20linestyle%3D%22-%22%2C%20linewidth%3D0.5%2C%20alpha%3D0.35%0A%20%20%20%20)%0A%20%20%20%20word_count_ax.legend(loc%3D%22lower%20right%22)%0A%20%20%20%20plt.tight_layout()%0A%20%20%20%20word_count_ax%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bagaco%2C%20conn%2C%20mo%2C%20numpy%2C%20pl%2C%20plt)%3A%0A%20%20%20%20_df_heatmap%20%3D%20mo.sql(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20SELECT%0A%20%20%20%20%20%20%20%20category%2C%0A%20%20%20%20%20%20%20%20EXTRACT(YEAR%20FROM%20CAST(date%20AS%20TIMESTAMP))%20%7C%7C%20'%20H'%20%7C%7C%0A%20%20%20%20%20%20%20%20CASE%20WHEN%20EXTRACT(MONTH%20FROM%20CAST(date%20AS%20TIMESTAMP))%20%3C%3D%206%20THEN%201%20ELSE%202%20END%20AS%20year_half%2C%0A%20%20%20%20%20%20%20%20ROUND(AVG(educational_score)%2C%203)%20AS%20avg_edu_score%0A%20%20%20%20FROM%20bagaco%0A%20%20%20%20WHERE%20date%20IS%20NOT%20NULL%20AND%20category%20IS%20NOT%20NULL%20AND%20educational_score%20IS%20NOT%20NULL%0A%20%20%20%20GROUP%20BY%201%2C%202%0A%20%20%20%20ORDER%20BY%201%2C%202%3B%0A%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20engine%3Dconn%2C%0A%20%20%20%20)%0A%0A%20%20%20%20_categories%20%3D%20sorted(_df_heatmap%5B%22category%22%5D.unique().to_list())%0A%20%20%20%20_periods%20%3D%20sorted(_df_heatmap%5B%22year_half%22%5D.unique().to_list())%0A%0A%20%20%20%20_grid%20%3D%20numpy.full(%0A%20%20%20%20%20%20%20%20shape%3D(len(_categories)%2C%20len(_periods))%2C%20fill_value%3Dnumpy.nan%0A%20%20%20%20)%0A%20%20%20%20for%20_i%2C%20_cat%20in%20enumerate(_categories)%3A%0A%20%20%20%20%20%20%20%20for%20_j%2C%20_period%20in%20enumerate(_periods)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_match%20%3D%20_df_heatmap.filter(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(pl.col(%22category%22)%20%3D%3D%20_cat)%20%26%20(pl.col(%22year_half%22)%20%3D%3D%20_period)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20len(_match)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_grid%5B_i%2C%20_j%5D%20%3D%20_match%5B%22avg_edu_score%22%5D%5B0%5D%0A%0A%20%20%20%20_fig%2C%20_ax%20%3D%20plt.subplots(figsize%3D(14%2C%206))%0A%20%20%20%20_im%20%3D%20_ax.imshow(_grid%2C%20aspect%3D%22auto%22%2C%20cmap%3D%22RdYlGn%22%2C%20interpolation%3D%22nearest%22)%0A%20%20%20%20plt.colorbar(mappable%3D_im%2C%20ax%3D_ax%2C%20label%3D%22Avg%20Educational%20Score%22)%0A%20%20%20%20_ax.set_yticks(ticks%3Drange(len(_categories)))%0A%20%20%20%20_ax.set_yticklabels(labels%3D_categories)%0A%20%20%20%20_ax.set_xticks(ticks%3Drange(len(_periods)))%0A%20%20%20%20_ax.set_xticklabels(labels%3D_periods%2C%20rotation%3D45%2C%20ha%3D%22right%22)%0A%20%20%20%20_ax.set_title(%0A%20%20%20%20%20%20%20%20label%3D%22Avg%20Educational%20Score%20by%20Category%20and%20Half-Year%22%2C%20fontweight%3D%22bold%22%0A%20%20%20%20)%0A%20%20%20%20plt.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bagaco%2C%20conn%2C%20mo)%3A%0A%20%20%20%20_category_summary_df%20%3D%20mo.sql(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20SELECT%0A%20%20%20%20category%2C%0A%20%20%20%20COUNT(*)%20AS%20total_documents%2C%0A%20%20%20%20ROUND(AVG(educational_score)%2C%203)%20AS%20average_educational_score%2C%0A%20%20%20%20ROUND(AVG(educational_score)%2C%203)%20AS%20mean_educational_score%2C%0A%20%20%20%20ROUND(%0A%20%20%20%20%20%20%20%20SUM(CASE%20WHEN%20educational_score%20%3E%3D%203%20THEN%201%20ELSE%200%20END)%20*%20100.0%20%2F%20COUNT(*)%2C%0A%20%20%20%20%20%20%20%202%0A%20%20%20%20)%20AS%20pct_high_educational_score_documents%2C%0A%20%20%20%20COUNT(%0A%20%20%20%20%20%20%20%20DISTINCT%20regexp_replace(%0A%20%20%20%20%20%20%20%20%20%20%20%20lower(regexp_extract(url%2C%20'%5E(%3F%3Ahttps%3F%3A%2F%2F)%3F(%3F%3A%5B%5E%40%2F%5C%5Cn%5D%2B%40)%3F(%5B%5E%3A%2F%3F%5C%5Cn%5D%2B)'%2C%201))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20'%5Ewww%5C%5C.'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20''%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%20AS%20total_different_domains%0A%20%20%20%20%20%20%20%20FROM%20bagaco%0A%20%20%20%20%20%20%20%20WHERE%20category%20IS%20NOT%20NULL%0A%20%20%20%20%20%20%20%20%20%20AND%20educational_score%20IS%20NOT%20NULL%0A%20%20%20%20%20%20%20%20GROUP%20BY%201%0A%20%20%20%20%20%20%20%20ORDER%20BY%20total_documents%20DESC%3B%0A%20%20%20%20%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20engine%3Dconn%2C%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(items%3D%5Bmo.md(text%3D%22%23%23%23%20Category%20summary%22)%2C%20_category_summary_df%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bagaco%2C%20conn%2C%20mo)%3A%0A%20%20%20%20_overall_average_educational_score%20%3D%20mo.sql(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20SELECT%0A%20%20%20%20%20%20%20%20ROUND(AVG(educational_score)%2C%203)%20AS%20overall_average_educational_score%0A%20%20%20%20FROM%20bagaco%0A%20%20%20%20WHERE%20educational_score%20IS%20NOT%20NULL%3B%0A%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20engine%3Dconn%2C%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20items%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(text%3D%22%23%23%23%20Overall%20average%20educational%20score%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_overall_average_educational_score%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bagaco%2C%20conn%2C%20mo%2C%20plt)%3A%0A%20%20%20%20_category_distribution_df%20%3D%20mo.sql(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20SELECT%0A%20%20%20%20%20%20%20%20category%2C%0A%20%20%20%20%20%20%20%20COUNT(*)%20AS%20n_docs%0A%20%20%20%20FROM%20bagaco%0A%20%20%20%20WHERE%20category%20IS%20NOT%20NULL%0A%20%20%20%20GROUP%20BY%201%0A%20%20%20%20ORDER%20BY%20n_docs%20DESC%3B%0A%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20engine%3Dconn%2C%0A%20%20%20%20)%0A%20%20%20%20_educational_distribution_df%20%3D%20mo.sql(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20SELECT%0A%20%20%20%20%20%20%20%20educational_score%2C%0A%20%20%20%20%20%20%20%20COUNT(*)%20AS%20n_docs%0A%20%20%20%20FROM%20bagaco%0A%20%20%20%20WHERE%20educational_score%20IS%20NOT%20NULL%0A%20%20%20%20GROUP%20BY%201%0A%20%20%20%20ORDER%20BY%20educational_score%3B%0A%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20engine%3Dconn%2C%0A%20%20%20%20)%0A%0A%20%20%20%20_fig%2C%20_axes%20%3D%20plt.subplots(nrows%3D1%2C%20ncols%3D2%2C%20figsize%3D(14%2C%206))%0A%0A%20%20%20%20_axes%5B0%5D.pie(%0A%20%20%20%20%20%20%20%20x%3D_category_distribution_df%5B%22n_docs%22%5D.to_list()%2C%0A%20%20%20%20%20%20%20%20labels%3D_category_distribution_df%5B%22category%22%5D.to_list()%2C%0A%20%20%20%20%20%20%20%20autopct%3D%22%251.1f%25%25%22%2C%0A%20%20%20%20%20%20%20%20startangle%3D140%2C%0A%20%20%20%20%20%20%20%20pctdistance%3D0.8%2C%0A%20%20%20%20)%0A%20%20%20%20_axes%5B0%5D.set_title(label%3D%22Category%20Distribution%22%2C%20fontweight%3D%22bold%22)%0A%0A%20%20%20%20_score_values%20%3D%20_educational_distribution_df%5B%22educational_score%22%5D.to_list()%0A%20%20%20%20_score_label_map%20%3D%20%7B%0A%20%20%20%20%20%20%20%200%3A%20%22Score%200%20(very%20low%20educational%20value)%22%2C%0A%20%20%20%20%20%20%20%201%3A%20%22Score%201%20(basic%20educational%20relevance)%22%2C%0A%20%20%20%20%20%20%20%202%3A%20%22Score%202%20(some%20educational%20elements)%22%2C%0A%20%20%20%20%20%20%20%203%3A%20%22Score%203%20(appropriate%20for%20educational%20use)%22%2C%0A%20%20%20%20%20%20%20%204%3A%20%22Score%204%20(highly%20relevant%20and%20clear)%22%2C%0A%20%20%20%20%20%20%20%205%3A%20%22Score%205%20(outstanding%20educational%20value)%22%2C%0A%20%20%20%20%7D%0A%20%20%20%20_score_labels%20%3D%20%5B%0A%20%20%20%20%20%20%20%20_score_label_map.get(int(_value)%2C%20f%22%7Bint(_value)%7D%20-%20Unknown%22)%0A%20%20%20%20%20%20%20%20for%20_value%20in%20_score_values%0A%20%20%20%20%5D%0A%20%20%20%20_score_color_map%20%3D%20%7B%0A%20%20%20%20%20%20%20%200%3A%20%22%23d73027%22%2C%0A%20%20%20%20%20%20%20%201%3A%20%22%23fc8d59%22%2C%0A%20%20%20%20%20%20%20%202%3A%20%22%23fee08b%22%2C%0A%20%20%20%20%20%20%20%203%3A%20%22%23d9ef8b%22%2C%0A%20%20%20%20%20%20%20%204%3A%20%22%2391cf60%22%2C%0A%20%20%20%20%20%20%20%205%3A%20%22%231a9850%22%2C%0A%20%20%20%20%7D%0A%20%20%20%20_score_colors%20%3D%20%5B%0A%20%20%20%20%20%20%20%20_score_color_map.get(int(_value)%2C%20%22%23999999%22)%20for%20_value%20in%20_score_values%0A%20%20%20%20%5D%0A%20%20%20%20_axes%5B1%5D.pie(%0A%20%20%20%20%20%20%20%20x%3D_educational_distribution_df%5B%22n_docs%22%5D.to_list()%2C%0A%20%20%20%20%20%20%20%20labels%3D_score_labels%2C%0A%20%20%20%20%20%20%20%20autopct%3D%22%251.1f%25%25%22%2C%0A%20%20%20%20%20%20%20%20startangle%3D140%2C%0A%20%20%20%20%20%20%20%20pctdistance%3D0.8%2C%0A%20%20%20%20%20%20%20%20colors%3D_score_colors%2C%0A%20%20%20%20)%0A%20%20%20%20_axes%5B1%5D.set_title(label%3D%22Educational%20Score%20Distribution%22%2C%20fontweight%3D%22bold%22)%0A%0A%20%20%20%20plt.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
982a05e000734c26e0c8cbfb99559c8f