项目背景 本研究基于抖音用户浏览数据,以“作品发布时间”为基准,从作者/作品角度出发,对数据进行深入分析。总计15527649518条数据,覆盖了40天(可能不连续)的数据记录;数据涉及59232名活跃用户,分布在387个城市中;共有208187名独立作者,他们发布了449472部作品,其中包含40761首配音和72种视频时长,以及分布在411个城市的4个频道。尽管播放完成率仅为40%,点赞率却低至仅1%。 分析思路 在分析过程中,首先对数据进行了预处理,确保数据的质量和准确性。随后,通过提取关键字段,如用户ID、城市、作品ID、作者ID、所在城市、频道、完成状态、点赞数、音乐ID、视频时长、实时状态以及H值,这些字段共同构成了分析的基础。 数据字段描述 为了更清晰地理解数据内容,我们对数据进行了详细的字段描述:
uid:用户唯一标识符
user_city:用户所在城市
item_id:作品的唯一标识符
author_id:作者唯一标识符
item_city:作品所在城市
channel:频道
finish:作品完成状态
like:点赞数
music_id:音乐ID
duration_time:视频时长
real_time:视频的实时状态
H:某种指标(具体含义未明)
date:日期 数据概览 通过对数据的初步分析,我们发现:
播放完成率高达40%表明大多数作品都得到了观众的完整观看。
点赞率极低,只有1%,说明观众对内容的互动参与度不高。 变量可视化 为了直观展示数据特点,我们进行了变量可视化处理。特别地,我们关注了一个特殊的用户ID30679,该用户浏览了1951个视频,总时长达到20601分钟,相当于343个小时的视频观看时间。这位用户每天平均观看时间为8.6小时,显示出其重度用户的特质。 总结 通过上述分析,我们不仅对抖音平台上的内容消费行为有了更深入的了解,还发现了一些有趣的现象,如某些用户对特定内容的极高投入度。这些发现对于理解用户行为模式、优化内容推荐系统以及制定更有效的营销策略具有重要的参考价值。 在分析视频内容的浏览量时,我们注意到一些关键因素。首先,最高浏览量的作品往往具有均衡的作者、城市和配乐特征。这意味着作品不仅在内容上吸引人,而且在视觉和听觉上都得到了广泛的认可。此外,98%的作品来自0频道,这一数据表明大部分观众是通过社交媒体平台而非传统电视或广播渠道观看这些视频。 进一步的分析揭示了观众偏好的观看习惯。大多数观众更喜欢浏览时长为9-10分钟的视频。这种偏好可能与现代观众的生活方式和时间管理有关,他们更倾向于在通勤、工作间隙或休息时间内观看短小精悍的内容。然而,无论是长视频还是短视频,其浏览量并没有明显超过9-10分钟的视频。这可能意味着观众对于视频长度的容忍度有限,或者更短的内容更容易吸引注意力。 最后,晚间0-7点和下班时间18-24点是作品发布高峰,这两个时间段的作品获得了较高的浏览量。这表明观众在这些时段更加活跃,更愿意花时间观看新发布的视频内容。这也反映了观众对新鲜内容的高需求,以及对社交互动和娱乐的需求。 综上所述,通过对视频内容的浏览量的分析,我们可以得出一些有趣的结论。一方面,均衡的作者、城市和配乐特征有助于提高作品的吸引力;另一方面,观众的观看习惯和偏好也对作品的成功至关重要。了解这些因素可以帮助创作者更好地定位自己的内容,以满足观众的期望并提高作品的浏览量。 重构内容:
浏览量前十的用户
df1 = data.groupby(‘uid’).agg({‘count’: ‘sum’}).sort_values(by=‘count’, ascending=False).head(10)
浏览量前十的作者
df2 = data.groupby(‘author_id’).agg({‘count’: ‘sum’}).sort_values(by=‘count’, ascending=False).head(10)
浏览量前十的作品
df3 = data.groupby(‘item_id’).agg({‘count’: ‘sum’}).sort_values(by=‘count’, ascending=False).head(10)
浏览量前十的城市
df4 = data.groupby(‘user_city’).agg({‘count’: ‘sum’}).sort_values(by=‘count’, ascending=False).head(10)
频道浏览情况
df5 = data.groupby(‘channel’).agg({‘count’: ‘sum’}).sort_values(by=‘count’, ascending=False).head(10)
浏览前十的配乐
df6 = data.groupby(‘music_id’).agg({‘count’: ‘sum’}).sort_values(by=‘count’, ascending=False).head(10)
作品时长分布(浏览)
df7 = data.groupby(‘duration_time’).agg({‘count’: ‘sum’}).sort_values(by=‘count’, ascending=False).head(10)
发布时间分布(浏览)
df8 = data.groupby(‘H’)[‘uid’].agg({‘count’: ‘sum’}).sort_index() 请注意,上述代码假设
data是一个包含所需数据的DataFrame。每个分组和聚合操作都是针对特定列(如uid、author_id等)进行的,以计算每个用户的浏览量、作者的浏览量、作品的浏览量等。然后,根据这些数据进行了排序,并选择了浏览量最高的前十个条目。最后,对于每个分组,都使用了head(10)来获取浏览量最高的前十个元素。
def create_bar_lan(x, y, title, title_pos):
bar1 = (
Bar()
.add_xaxis(x)
.add_yaxis(title, y)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False, distance=30))
.set_global_opts(
title_opts=opts.TitleOpts(
title=title,
pos_left=title_pos[0],
pos_top=title_pos[1],
title_textstyle_opts=opts.TextStyleOpts(
color='#ea513f',
font_family='cursive',
font_size=19
),
xaxis_opts=opts.AxisOpts(is_scale=True, axislabel_opts={'rotate': '75'})
)
)
return bar1
根据提供的内容重构,并保持段落结构如下:
from IPython.core.getipython import get_ipython
import pandas as pd
from bar_lan import bar_lan
# 获取当前会话的DataFrame
df1 = pd.read_csv("path/to/your/data1.csv")
df2 = pd.read_csv("path/to/your/data2.csv")
df3 = pd.read_csv("path/to/your/data3.csv")
df4 = pd.read_csv("path/to/your/data4.csv")
df5 = pd.read_csv("path/to/your/data5.csv")
df6 = pd.read_csv("path/to/your/data6.csv")
df7 = pd.read_csv("path/to/your/data7.csv")
df8 = pd.read_csv("path/to/your/data8.csv")
# 创建柱状图
bar1 = bar_lan(df1.index.tolist(), df1[df1['count'] == '5%'], '浏览量前十的用户', [0, 0])
bar2 = bar_lan(df2.index.tolist(), df2[df2['count'] == '55%'], '浏览量前十的作者', [0, 0])
bar3 = bar_lan(df3.index.tolist(), df3[df3['count'] == '5%'], '浏览量前十的作品', [0, 0])
bar4 = bar_lan(df4.index.tolist(), df4[df4['count'] == '55%'], '浏览量前十的城市', [0, 0])
bar5 = bar_lan(df5.index.tolist(), df5[df5['count'] == '5%'], '浏览量前十的频道', [0, 0])
bar6 = bar_lan(df6.index.tolist(), df6[df6['count'] == '55%'], '浏览量前十的配乐', [0, 0])
bar7 = bar_lan(df7.index.tolist(), df7[df7['count'] == '5%'], '浏览量前十的视频时长', [0, 0])
bar8 = bar_lan(df8.index.tolist(), df8[df8['count'] == '55%'], '浏览量前十的时间', [0, 0])
# 使用Grid进行图表排列
grid = (
Bar(init_opts=opts.InitOpts(width='800px'), height='1200px'),
.add(bar1, grid_opts=opts.GridOpts(pos_left='10%', pos_right='60%', pos_top='5%', pos_bottom='83%')),
.add(bar2, grid_opts=opts.GridOpts(pos_left='60%', pos_right='10%', pos_top='5%', pos_bottom='83%')),
.add(bar3, grid_opts=opts.GridOpts(pos_left='10%', pos_right='60%', pos_top='30%', pos_bottom='58%')),
.add(bar4, grid_opts=opts.GridOpts(pos_left='60%', pos_right='10%', pos_top='30%', pos_bottom='58%')),
.add(bar5, grid_opts=opts.GridOpts(pos_left='10%', pos_right='60%', pos_top='55%', pos_bottom='33%')),
.add(bar6, grid_opts=opts.GridOpts(pos_left='60%', pos_right='10%', pos_top='55%', pos_bottom='33%')),
.add(bar7, grid_opts=opts.GridOpts(pos_left='10%', pos_right='60%', pos_top='80%', pos_bottom='8%')),
.add(bar8, grid_opts=opts.GridOpts(pos_left='60%', pos_right='10%', pos_top='80%', pos_bottom='8%'))
)
# 使用Page进行页面组合
page = Page(layout=Page.SimplePageLayout)
page.add(grid)
page.render_notebook()
点赞分析 点赞数多的作品/点赞率 为了分析点赞数多的作品,我们首先对数据进行分组并计算每个作品的点赞率和点赞数。接着,我们将这些数据按照点赞数进行排序,以找出最受欢迎的作品。同时,我们还分析了不同用户城市中点赞分布的情况,以及是否存在头部效应。 80%的点赞来自?%的人 通过进一步的分析,我们发现点赞也存在一定的头部效应,这符合“5-96法则”。这意味着在点赞数最多的前5%的用户中,贡献了总点赞数的96%。 此外,我们对每个用户的点赞数进行了累加,以便了解整体的点赞趋势。我们还计算了每个用户点赞数占总点赞数的比例,以确定哪些用户对点赞的贡献最大。最后,我们计算了每个用户点赞数占其总点赞数的比例,从而得出了每个用户的粉丝占比。
k = 0.1
for i, j in zip(df_like3['点赞占比'], df_like3['用户数占比']):
if k >= 0.9:
break
if i >= k:
print('{}的用户点了{}的赞'.format(format(j, '.2%'), format(i, '.2%')))
k += 0.1
def line_chart(t, data): chart = ( Line(init_opts = opts.InitOpts(theme='light', width='500px', height='300px')) .add_xaxis([i[0] for i in data]) .add_yaxis( '', [i[1] for i in data], is_symbol_show=False, areastyle_opts=opts.AreaStyleOpts(opacity=1, color="cyan") ) .set_global_opts( title_opts=opts.TitleOpts(title=t), xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=True), yaxis_opts=opts.AxisOpts( type_="value", axistick_opts=opts.AxisTickOpts(is_show=True), splitline_opts=opts.SplitLineOpts(is_show=True), ), ) ) return chart
df = df_like3['点赞占比'].reset_index().values.tolist() line_chart(t='用户点赞量', df).render_notebook()
为了更有效地分析数据,我们可以对视频点赞数(like)进行分段统计。首先,我们将使用groupby函数按照视频的播放时长(duration_time)进行分组,然后计算每个时长段内点赞数的总数。接着,我们将展示前20个结果,并绘制一个图表来直观地表示视频时长与点赞数的关系。
# 对点赞数进行分组并计算每个时长段内的点赞数总和
df_like6 = data_like.groupby([data_like['duration_time']])['like'].agg({'like': 'count'}).sort_values(by='like', ascending=False).head(20)
# 绘制视频时长分布图
duration_time_like_plt = (Bar()
.add_xaxis(df_like6.index.tolist())
.add_yaxis('like', df_like6['like'].values.tolist())
.set_global_opts(title_opts=opts.TitleOpts(title='视频时长分布(点赞)'))
)
duration_time_like_plt.render_notebook()
这段代码将执行以下步骤:
- 对
data_like数据集按照duration_time字段进行分组,并计算每个组的like数量。 - 对得到的
like数量进行排序,选择前20个结果。 - 使用绘图库(如matplotlib)创建一个柱状图,横轴为视频时长,纵轴为点赞数。
- 设置图表的标题为“视频时长分布(点赞)”。
- 渲染图表到Jupyter Notebook中。 通过这种方式,我们可以得到一个直观的视觉表示,帮助理解不同时长的视频在获得点赞方面的表现。 为了重构内容,我们需要先理解原始数据结构。假设我们有以下DataFrame:
df_item: 包含视频ID和浏览量的数据,其中每个视频ID对应一个作品的浏览量。df_use: 包含用户ID和浏览量的数据,其中每个用户ID对应一个用户的浏览量。 我们的目标是去掉那些浏览量等于1的作品(长尾作品)和浏览量小于等于4的用户(长尾观看用户),并分析剩下的数据。 以下是根据提供的内容重构后的代码:
# 删除浏览量等于1的作品
item_long_tail = df_item[df_item['count'] == 1].index.tolist()
use_long_tail = df_use[df_use['count'] == 1].index.tolist()
# 删除浏览量小于等于4的用户
long_tail_excluding_df = data[(~data['item_id'].isin(item_long_tail)) & (~data['uid'].isin(use_long_tail))]
# 部分用户的数据删除后导致作品浏览量等于1,再删除这部分数据
mask = long_tail_excluding_df.duplicated(subset=['item_id'], keep=False)
df_filtered = long_tail_excluding_df[mask]
# 查看数据极值,分位数
import numpy as np
# 获取数据的最小值、最大值、中位数、25%分位数和75%分位数
min_val = df_filtered['浏览量'].min()
max_val = df_filtered['浏览量'].max()
median_val = df_filtered['浏览量'].median()
q1_val = df_filtered['浏览量'].quantile(0.25)
q3_val = df_filtered['浏览量'].quantile(0.75)
print("最小值:", min_val)
print("最大值:", max_val)
print("中位数:", median_val)
print("第一分位数:", q1_val)
print("第三分位数:", q3_val)
请注意,这段代码依赖于实际的数据结构和列名,因此您需要根据实际情况进行调整。 内容重构:
- 数据分组与聚合
- 首先,通过
groupby方法对数据集进行分组,依据时间戳(time_cut)和作品ID(item_id)。 - 然后,使用聚合函数计算每个组的
uid(用户ID)和like(点赞数)的总和。 - 最后,重置索引并删除任何缺失值。
- 特征提取与可视化
- 接下来,从上一步中筛选出具有最高点赞数的前3000个作品。
- 创建两个新DataFrame,分别代表下班、上班和睡觉时间段内最受欢迎的作品。
- 将这三个时间段的作品ID列表转换为列表形式。
- 可视化展示
- 使用
df_bar表示按播放量排序的前3000个作品。 - 分别绘制三个时间段作品的柱状图。 代码实现:
# 数据分组与聚合
df_long_tail = df_filtered.groupby(['time_cut','item_id'])['uid','like'].agg({'uid':'count','like':'sum'}).reset_index()
df_long_tail.dropna(inplace=True)
re_long_tail_qu = df_long_tail.groupby(['time_cut'])['uid','like'].quantile([0.25, 0.5, 0.75])
re_long_tail_max_min = df_long_tail.groupby(['time_cut'])['uid','like'].agg({'max','min'})
# TOP3000作品分析可视化
top3000_bars = []
for bar in re_long_tail_qu:
top3000_bars.append([bar.uid] + bar.tolist())
red_bar = top3000_bars[top3000_bars == '上班'][0]
blue_bar = top3000_bars[top3000_bars == '下班'][0]
green_bar = top3000_bars[top3000_bars == '睡觉'][0]
# 可视化展示
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
# 下班时间段作品柱状图
plt.bar(red_bar, len(red_bar), color='red')
plt.xlabel('作品ID')
plt.ylabel('数量')
plt.title('下班时段作品数量')
# 上班时间段作品柱状图
plt.bar(blue_bar, len(blue_bar), color='blue')
plt.xlabel('作品ID')
plt.ylabel('数量')
plt.title('上班时段作品数量')
# 睡觉时间段作品柱状图
plt.bar(green_bar, len(green_bar), color='green')
plt.xlabel('作品ID')
plt.ylabel('数量')
plt.title('睡觉时段作品数量')
plt.show()
根据提供的内容,重构后的内容如下:
import pyecharts.options as opts
from pyecharts.charts import Bar
from pyecharts.globals import ThemeType
from pyecharts.commons.utils import JsCode # 颜色的RGBA值,透明度范围是0到1
red_color = JsCode("""
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
<rect id="rect1" x="0" y="0" width="16" height="16" fill="#ffffff"/>
<rect id="rect2" x="16" y="0" width="16" height="16" fill="#ffffff"/>
<rect id="rect3" x="0" y="16" width="16" height="16" fill="#ffffff"/>
<rect id="rect4" x="16" y="16" width="16" height="16" fill="#ffffff"/>
</svg>
""")
blue_color = JsCode("""
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
<rect id="rect5" x="0" y="0" width="16" height="16" fill="#ffffff"/>
<rect id="rect6" x="16" y="0" width="16" height="16" fill="#ffffff"/>
<rect id="rect7" x="0" y="16" width="16" height="16" fill="#ffffff"/>
<rect id="rect8" x="16" y="16" width="16" height="16" fill="#ffffff"/>
</svg>
""")
green_color = JsCode("""
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
<rect id="rect9" x="0" y="0" width="16" height="16" fill="#ffffff"/>
<rect id="rect10" x="16" y="0" width="16" height="16" fill="#ffffff"/>
<rect id="rect11" x="0" y="16" width="16" height="16" fill="#ffffff"/>
<rect id="rect12" x="16" y="16" width="16" height="16" fill="#ffffff"/>
</svg>
""")
category = [f'{i}' for i in range(0, 1600)]
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(xaxis_data=category)
.add_yaxis(
series_name='上班', y_axis=red_bar, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=red_color)
)
.add_yaxis(
series_name='下班', y_axis=blue_bar, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=blue_color)
)
.add_yaxis(
series_name='睡觉', y_axis=green_bar, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=green_color)
)
.set_global_opts(
title_opts=opts.TitleOpts(title='头部视频分布(观看量)'),
xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=False)),
yaxis_opts=opts.AxisOpts(
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
)
# 渲染为 HTML 文件
.render_notebook()
)
bar.render_notebook()
根据提供的内容,我将对内容进行重构并保持段落结构。
作者归类 为了对作者进行有效的分类,我们将基于作者的播放量、点赞量和作品量进行归纳。具体步骤如下:
- 数据预处理:首先,我们需要从原始数据中筛选出与作者相关的数据。这包括作者ID、点赞数、播放次数和作品ID。
- 分组计算:使用
groupby方法按作者ID对数据进行分组,然后针对每个作者计算其点赞数的总和(即点赞量)以及作品数量的独一无二项(即作品量)。 - 数据标准化:为了确保后续分析的准确性,我们对点赞量和作品量进行MinMaxScaler标准化处理。
- 绘制散点图:接下来,我们使用K-Means聚类算法来探索不同作者之间的相似性。通过绘制散点图,我们可以直观地看到不同作者之间在点赞量和作品量上的分布情况。
- 选择最佳K值:最后,我们使用Elbow Method(肘部法则)来确定最佳的K值,该值表示将数据集划分为K个簇时的平均误差最小化。 以下是实现这一过程的代码示例:
# 假设df_filtered已经包含了所需的数据
# 根据作者的播放量、点赞量、作品量,对作者进行归类
df_author = df_filtered.groupby('author_id')['author_id','like','item_id'].agg({'author_id':'count','like':'sum','item_id':'nunique'})
df_author.columns = ['page_views','like','item_id']
df_author.reset_index(inplace=True)
# 数据标准化
model_scaler = MinMaxScaler()
data_scaled = model_scaler.fit_transform(df_author[['page_views','like','item_id']])
# 使用K-Means聚类算法探索不同作者之间的相似性
K = range(1, 10)
meandistortions = []
for k in K:
kmeans = KMeans(n_clusters=k)
kmeans.fit(data_scaled)
meandistortions.append(sum(np.min(cdist(data_scaled, kmeans.cluster_centers_, 'euclidean'), axis=1))/data_scaled.shape[0])
# 绘制散点图
plt.plot(K, meandistortions, marker='o')
plt.xlabel('K')
plt.ylabel('Average distortion degree')
plt.title('Use the Elbow Method to select the best K value')
plt.show()
以上代码将帮助你根据作者的播放量、点赞量和作品量对作者进行有效归类,并通过可视化手段探索不同作者之间的相似性。 首先,我们需要根据提供的内容重构代码。
- 导入必要的库和模块。
- 定义KMeans模型,设置聚类数量为4,最大迭代次数为50。
- 使用KMeans模型拟合数据,并将结果存储在cluster_labels_k变量中。
- 输出归类结果,将cluster_labels_k转换为pandas DataFrame,并命名为cluster_labels。
- 计算各个聚类类别内部最显著的特征值。
- 遍历每个聚类,提取特征描述信息,并将其与聚类标签一起存储在cluster_features列表中。
- 将cluster_features列表转换为pandas DataFrame,命名为df_clusters。
- 使用模型标准化器对df_clusters进行标准化处理,并计算其最大值、最小值和平均值。
- 将处理后的数据转换为列表,并命名为num_sets_max_min。 以下是重构后的代码:
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import pandas as pd
# 定义KMeans模型
Kmeans = KMeans(n_clusters=4, max_iter=50)
Kmeans.fit(data_scaled) # 拟合数据
cluster_labels_k = Kmeans.labels_ # 获取归类结果
cluster_labels = pd.DataFrame(cluster_labels_k, columns=['clusters']) # 输出归类结果
res = pd.concat((df_author, cluster_labels), axis=1) # 将结果合并到原始数据框中
# 计算各个聚类类别内部最显著特征值
for line in range(4):
label_data = res[res['clusters'] == line]
part_data = label_data.iloc[:, 1:4]
part_desc = part_data.describe().round(3)
merge_data = part_desc.iloc[2, :]
cluster_features.append(merge_data)
df_clusters = pd.DataFrame(cluster_features)
# 使用模型标准化器对df_clusters进行标准化处理,并计算其最大值、最小值和平均值
num_sets_max_min = model_scaler.fit_transform(df_clusters).tolist()
为了重构这段内容,我们需要确保代码的逻辑和结构清晰易懂。以下是重构后的内容:
# 初始化雷达图选项
init_opts = opts.InitOpts()
# 添加雷达图的指标项
radar_indicator_items = [
opts.RadarIndicatorItem(name="page_views", max_=1.2),
opts.RadarIndicatorItem(name="like", max_=1.2),
opts.RadarIndicatorItem(name="item_id", max_=1.2),
]
# 设置雷达图的区域样式和文本样式
splitarea_opts = opts.SplitAreaOpts(is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1))
textstyle_opts = opts.TextStyleOpts(color="#000000")
# 添加雷达图的系列名称和数据
series_names = ["第1类作者", "第2类作者", "第3类作者", "第4类作者"]
data_values = [num_sets_max_min[0], num_sets_max_min[1], num_sets_max_min[2], num_sets_max_min[3]]
# 添加雷达图的系列到雷达图中
c = radar(init_opts=init_opts, add_schema=add_schema, add=add, series_name=series_names, data=data_values, splitarea_opts=splitarea_opts, textstyle_opts=textstyle_opts)
# 渲染雷达图
c.render_notebook()
这段代码首先定义了雷达图的选项,包括指标项、区域样式、文本样式等。然后,它创建了一个雷达图实例,并设置了相应的参数,如系列名称、数据、区域样式和文本样式。最后,它调用render_notebook()方法来渲染雷达图。
为了重构内容,我们需要将原始的代码段进行适当的修改以适应特定的上下文和需求。以下是根据提供的内容完成的重构:
# 假设 res 是一个已经定义好的三维可视化结果对象
res1 = res.reset_index()
# 提取所需的列数据
res1 = res1[['page_views', 'like', 'item_id', 'clusters', 'index']]
这段代码首先重置了名为 res 的三维可视化结果对象的索引,然后从该对象中提取了所需的列数据,并将结果存储在一个新的列表 res1 中。这样,我们就完成了对内容的重构。
重构后的内容如下:
import asyncio
from aiohttp import TCPConnector, ClientSession
from pyecharts.charts import Scatter3D
symbol_list = [ 'circle', 'rect', 'roundRect', 'triangle' ]
config = {
'xAxis3D': 'page_views',
'yAxis3D': 'like',
'zAxis3D': 'item_id',
'color': 'clusters'
}
res2 = res1.to_dict(orient='records')
data = [
[
item['config_xAxis3D'], item['config_yAxis3D'], item['config_zAxis3D'], item['config_color'],
item['config_yAxis3D'] if item['config_yAxis3D'] else None,
item['config_index']
] for item in res2
]
c = (Scatter3D()
.add(
series_name='',
data=data,
xaxis3d_opts=opts.Axis3DOpts(
name=config['xAxis3D'], type_='value', textstyle_opts=opts.TextStyleOpts(color='#E03D30'),
),
yaxis3d_opts=opts.Axis3DOpts(
name=config['yAxis3D'], type_='value', textstyle_opts=opts.TextStyleOpts(color='#FCC320'),
),
zaxis3d_opts=opts.Axis3DOpts(
name=config['zAxis3D'], type_='value', textstyle_opts=opts.TextStyleOpts(color='#279846'),
),
grid3d_opts=opts.Grid3DOpts(width=100, height=100, depth=100),
)
.set_global_opts(
visualmap_opts=[
opts.VisualMapOpts(
type_='color', is_calculable=True, dimension=3, pos_top='10', max_='8 / 2', range_color=[
'#1710c0', '#0b9df0', '#00fea8', '#00ff0d',
],
),
opts.VisualMapOpts(
type_='size', is_calculable=True, dimension=4, pos_bottom='10', max_='80 / 2', range_color=[
'#1710c0', '#0b9df0', '#00fea8', '#00ff0d',
],
),
],
)
)
c.render('scatter3d.html')
请提供需要重构的内容,以便我能够进行相应的分析和建议。