Compare commits
13 Commits
691fb7b40f
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
716b0bde1d | ||
|
|
5a9e08345c | ||
|
|
ca0386ead9 | ||
|
|
0d79da2555 | ||
|
|
47160a20ed | ||
|
|
38c32701e7 | ||
|
|
5cd365a113 | ||
|
|
2a270ee783 | ||
|
|
7403887e37 | ||
|
|
91c54726e1 | ||
|
|
bb2e6a7c2d | ||
|
|
2b95643f3d | ||
|
|
6fd51ad286 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
Aigrind/data
|
Aigrind/data
|
||||||
Aigrind/.ipynb_checkpoints
|
Aigrind/.ipynb_checkpoints
|
||||||
|
egeland/.ipynb_checkpoints
|
||||||
|
|||||||
@@ -778,14 +778,15 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 9,
|
"execution_count": 29,
|
||||||
"id": "e950eeaf",
|
"id": "e950eeaf",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"T_df = pd.DataFrame(T, columns=[\"Media Source\", 'Campaign type', 'Target', \"Time, (months)\"])\n",
|
"T_df = pd.DataFrame(T, columns=[\"Media Source\", 'Campaign type', 'Target', \"Time, (months)\"])\n",
|
||||||
"T_df = T_df.set_index([\"Media Source\", 'Campaign type', 'Target'])\n",
|
"T_df = T_df.set_index([\"Media Source\", 'Campaign type', 'Target'])\n",
|
||||||
"T_df.to_csv('tables/payback-period.csv')"
|
"T_df.to_csv('tables/payback-period.csv')\n",
|
||||||
|
"T_df.to_markdown('tables/payback-period.md')"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -837,13 +838,14 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 11,
|
"execution_count": 30,
|
||||||
"id": "9dfee9c7",
|
"id": "9dfee9c7",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"T_sorted_df = T_df.sort_values(by='Time, (months)')\n",
|
"T_sorted_df = T_df.sort_values(by='Time, (months)')\n",
|
||||||
"T_sorted_df.to_csv('tables/payback-period.sorted.csv')"
|
"T_sorted_df.to_csv('tables/payback-period.sorted.csv')\n",
|
||||||
|
"T_sorted_df.to_markdown('tables/payback-period.sorted.md')"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1197,7 +1199,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 21,
|
"execution_count": 31,
|
||||||
"id": "f2c30d3d",
|
"id": "f2c30d3d",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
@@ -1206,7 +1208,8 @@
|
|||||||
"# df_ARPU\n",
|
"# df_ARPU\n",
|
||||||
"df_ARPU['days'] = list(map(lambda x: f\"{x} days\" if x > 1 else f\"{x} day\", dates))\n",
|
"df_ARPU['days'] = list(map(lambda x: f\"{x} days\" if x > 1 else f\"{x} day\", dates))\n",
|
||||||
"df_ARPU_melted = df_ARPU.melt('days', var_name='Campaign type', value_name='ARPU')\n",
|
"df_ARPU_melted = df_ARPU.melt('days', var_name='Campaign type', value_name='ARPU')\n",
|
||||||
"df_ARPU.iloc[[6, 13, 29]].to_csv('tables/arpu.csv')"
|
"df_ARPU.iloc[[6, 13, 29]].to_csv('tables/arpu.csv')\n",
|
||||||
|
"df_ARPU.iloc[[6, 13, 29]].to_markdown('tables/arpu.md')"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1297,7 +1300,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 25,
|
"execution_count": 32,
|
||||||
"id": "b7a20a84",
|
"id": "b7a20a84",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
@@ -1305,7 +1308,8 @@
|
|||||||
"df = pd.DataFrame(CPI, columns=[\"Media Source\", 'Campaign type', 'Target', \"CPI\"])\n",
|
"df = pd.DataFrame(CPI, columns=[\"Media Source\", 'Campaign type', 'Target', \"CPI\"])\n",
|
||||||
"df = df.set_index([\"Media Source\", 'Campaign type', 'Target'])\n",
|
"df = df.set_index([\"Media Source\", 'Campaign type', 'Target'])\n",
|
||||||
"df = df.sort_values(by='CPI')\n",
|
"df = df.sort_values(by='CPI')\n",
|
||||||
"df.to_csv('tables/cpi.sorted.csv')"
|
"df.to_csv('tables/cpi.sorted.csv')\n",
|
||||||
|
"df.to_markdown('tables/cpi.sorted.md')"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -81,11 +81,11 @@
|
|||||||

|

|
||||||
|
|
||||||
|
|
||||||
| | RUS_MS1_purchase | UKR_MS1_purchase | BRA_MS1_purchase | days |
|
| days | RUS_MS1_purchase | UKR_MS1_purchase | BRA_MS1_purchase |
|
||||||
|---:|-------------------:|-------------------:|-------------------:|:--------|
|
|:-------:|:------------------:|:------------------:|:------------------:|
|
||||||
| 6 | 0.570234 | 0.644273 | 4.71347 | 7 days |
|
| 7 days | 0.570234 | 0.644273 | 4.71347 |
|
||||||
| 13 | 0.759229 | 0.644273 | 4.71347 | 14 days |
|
| 14 days | 0.759229 | 0.644273 | 4.71347 |
|
||||||
| 29 | 1.31604 | 1.82198 | 4.73251 | 30 days |
|
| 30 days | 1.31604 | 1.82198 | 4.73251 |
|
||||||
|
|
||||||
### Фактический CPI
|
### Фактический CPI
|
||||||
|
|
||||||
|
|||||||
254
Aigrind/environment.yaml
Normal file
254
Aigrind/environment.yaml
Normal file
@@ -0,0 +1,254 @@
|
|||||||
|
name: aigrind
|
||||||
|
channels:
|
||||||
|
- conda-forge
|
||||||
|
dependencies:
|
||||||
|
- _libgcc_mutex=0.1=conda_forge
|
||||||
|
- _openmp_mutex=4.5=2_gnu
|
||||||
|
- alsa-lib=1.2.13=hb9d3cd8_0
|
||||||
|
- anyio=4.6.2.post1=pyhd8ed1ab_0
|
||||||
|
- argon2-cffi=23.1.0=pyhd8ed1ab_0
|
||||||
|
- argon2-cffi-bindings=21.2.0=py313h536fd9c_5
|
||||||
|
- arrow=1.3.0=pyhd8ed1ab_0
|
||||||
|
- asttokens=2.4.1=pyhd8ed1ab_0
|
||||||
|
- attrs=24.2.0=pyh71513ae_0
|
||||||
|
- autopep8=2.3.1=pyhd8ed1ab_0
|
||||||
|
- beautifulsoup4=4.12.3=pyha770c72_0
|
||||||
|
- bleach=6.2.0=pyhd8ed1ab_0
|
||||||
|
- brotli=1.1.0=hb9d3cd8_2
|
||||||
|
- brotli-bin=1.1.0=hb9d3cd8_2
|
||||||
|
- bzip2=1.0.8=h4bc722e_7
|
||||||
|
- ca-certificates=2024.8.30=hbcca054_0
|
||||||
|
- cached-property=1.5.2=hd8ed1ab_1
|
||||||
|
- cached_property=1.5.2=pyha770c72_1
|
||||||
|
- cairo=1.18.0=hebfffa5_3
|
||||||
|
- certifi=2024.8.30=pyhd8ed1ab_0
|
||||||
|
- cffi=1.17.1=py313hfab6e84_0
|
||||||
|
- colorama=0.4.6=pyhd8ed1ab_0
|
||||||
|
- comm=0.2.2=pyhd8ed1ab_0
|
||||||
|
- contourpy=1.3.1=py313h33d0bda_0
|
||||||
|
- cycler=0.12.1=pyhd8ed1ab_0
|
||||||
|
- cyrus-sasl=2.1.27=h54b06d7_7
|
||||||
|
- dbus=1.13.6=h5008d03_3
|
||||||
|
- debugpy=1.8.9=py313h46c70d0_0
|
||||||
|
- decorator=5.1.1=pyhd8ed1ab_0
|
||||||
|
- defusedxml=0.7.1=pyhd8ed1ab_0
|
||||||
|
- double-conversion=3.3.0=h59595ed_0
|
||||||
|
- entrypoints=0.4=pyhd8ed1ab_0
|
||||||
|
- et_xmlfile=2.0.0=pyhd8ed1ab_0
|
||||||
|
- exceptiongroup=1.2.2=pyhd8ed1ab_0
|
||||||
|
- executing=2.1.0=pyhd8ed1ab_0
|
||||||
|
- expat=2.6.4=h5888daf_0
|
||||||
|
- font-ttf-dejavu-sans-mono=2.37=hab24e00_0
|
||||||
|
- font-ttf-inconsolata=3.000=h77eed37_0
|
||||||
|
- font-ttf-source-code-pro=2.038=h77eed37_0
|
||||||
|
- font-ttf-ubuntu=0.83=h77eed37_3
|
||||||
|
- fontconfig=2.15.0=h7e30c49_1
|
||||||
|
- fonts-conda-ecosystem=1=0
|
||||||
|
- fonts-conda-forge=1=0
|
||||||
|
- fonttools=4.55.0=py313h8060acc_0
|
||||||
|
- fqdn=1.5.1=pyhd8ed1ab_0
|
||||||
|
- freetype=2.12.1=h267a509_2
|
||||||
|
- graphite2=1.3.13=h59595ed_1003
|
||||||
|
- harfbuzz=9.0.0=hda332d3_1
|
||||||
|
- hugo=0.139.2=h5888daf_0
|
||||||
|
- icu=75.1=he02047a_0
|
||||||
|
- idna=3.10=pyhd8ed1ab_0
|
||||||
|
- importlib_resources=6.4.5=pyhd8ed1ab_0
|
||||||
|
- ipykernel=6.29.5=pyh3099207_0
|
||||||
|
- ipython=8.29.0=pyh707e725_0
|
||||||
|
- ipython_genutils=0.2.0=pyhd8ed1ab_1
|
||||||
|
- isoduration=20.11.0=pyhd8ed1ab_0
|
||||||
|
- jedi=0.19.2=pyhff2d567_0
|
||||||
|
- jinja2=3.1.4=pyhd8ed1ab_0
|
||||||
|
- jsonpointer=3.0.0=py313h78bf25f_1
|
||||||
|
- jsonschema=4.23.0=pyhd8ed1ab_0
|
||||||
|
- jsonschema-specifications=2024.10.1=pyhd8ed1ab_0
|
||||||
|
- jsonschema-with-format-nongpl=4.23.0=hd8ed1ab_0
|
||||||
|
- jupyter_client=7.4.9=pyhd8ed1ab_0
|
||||||
|
- jupyter_contrib_core=0.4.0=pyhd8ed1ab_0
|
||||||
|
- jupyter_contrib_nbextensions=0.7.0=pyhd8ed1ab_0
|
||||||
|
- jupyter_core=5.7.2=pyh31011fe_1
|
||||||
|
- jupyter_events=0.10.0=pyhd8ed1ab_0
|
||||||
|
- jupyter_highlight_selected_word=0.2.0=pyhd8ed1ab_1006
|
||||||
|
- jupyter_latex_envs=1.4.6=pyhd8ed1ab_1002
|
||||||
|
- jupyter_nbextensions_configurator=0.6.1=pyhd8ed1ab_0
|
||||||
|
- jupyter_server=2.14.2=pyhd8ed1ab_0
|
||||||
|
- jupyter_server_terminals=0.5.3=pyhd8ed1ab_0
|
||||||
|
- jupyterlab_pygments=0.3.0=pyhd8ed1ab_1
|
||||||
|
- keyutils=1.6.1=h166bdaf_0
|
||||||
|
- kiwisolver=1.4.7=py313h33d0bda_0
|
||||||
|
- krb5=1.21.3=h659f571_0
|
||||||
|
- lcms2=2.16=hb7c19ff_0
|
||||||
|
- ld_impl_linux-64=2.43=h712a8e2_2
|
||||||
|
- lerc=4.0.0=h27087fc_0
|
||||||
|
- libblas=3.9.0=25_linux64_openblas
|
||||||
|
- libbrotlicommon=1.1.0=hb9d3cd8_2
|
||||||
|
- libbrotlidec=1.1.0=hb9d3cd8_2
|
||||||
|
- libbrotlienc=1.1.0=hb9d3cd8_2
|
||||||
|
- libcblas=3.9.0=25_linux64_openblas
|
||||||
|
- libclang-cpp19.1=19.1.4=default_hb5137d0_0
|
||||||
|
- libclang13=19.1.4=default_h9c6a7e4_0
|
||||||
|
- libcups=2.3.3=h4637d8d_4
|
||||||
|
- libdeflate=1.22=hb9d3cd8_0
|
||||||
|
- libdrm=2.4.123=hb9d3cd8_0
|
||||||
|
- libedit=3.1.20191231=he28a2e2_2
|
||||||
|
- libegl=1.7.0=ha4b6fd6_2
|
||||||
|
- libexpat=2.6.4=h5888daf_0
|
||||||
|
- libffi=3.4.2=h7f98852_5
|
||||||
|
- libgcc=14.2.0=h77fa898_1
|
||||||
|
- libgcc-ng=14.2.0=h69a702a_1
|
||||||
|
- libgfortran=14.2.0=h69a702a_1
|
||||||
|
- libgfortran5=14.2.0=hd5240d6_1
|
||||||
|
- libgl=1.7.0=ha4b6fd6_2
|
||||||
|
- libglib=2.82.2=h2ff4ddf_0
|
||||||
|
- libglvnd=1.7.0=ha4b6fd6_2
|
||||||
|
- libglx=1.7.0=ha4b6fd6_2
|
||||||
|
- libgomp=14.2.0=h77fa898_1
|
||||||
|
- libiconv=1.17=hd590300_2
|
||||||
|
- libjpeg-turbo=3.0.0=hd590300_1
|
||||||
|
- liblapack=3.9.0=25_linux64_openblas
|
||||||
|
- libllvm19=19.1.4=ha7bfdaf_0
|
||||||
|
- libmpdec=4.0.0=h4bc722e_0
|
||||||
|
- libntlm=1.4=h7f98852_1002
|
||||||
|
- libopenblas=0.3.28=pthreads_h94d23a6_1
|
||||||
|
- libopengl=1.7.0=ha4b6fd6_2
|
||||||
|
- libpciaccess=0.18=hd590300_0
|
||||||
|
- libpng=1.6.44=hadc24fc_0
|
||||||
|
- libpq=17.2=h04577a9_0
|
||||||
|
- libsodium=1.0.20=h4ab18f5_0
|
||||||
|
- libsqlite=3.47.0=hadc24fc_1
|
||||||
|
- libstdcxx=14.2.0=hc0a3c3a_1
|
||||||
|
- libstdcxx-ng=14.2.0=h4852527_1
|
||||||
|
- libtiff=4.7.0=he137b08_1
|
||||||
|
- libuuid=2.38.1=h0b41bf4_0
|
||||||
|
- libwebp-base=1.4.0=hd590300_0
|
||||||
|
- libxcb=1.17.0=h8a09558_0
|
||||||
|
- libxkbcommon=1.7.0=h2c5496b_1
|
||||||
|
- libxml2=2.13.5=hb346dea_0
|
||||||
|
- libxslt=1.1.39=h76b75d6_0
|
||||||
|
- libzlib=1.3.1=hb9d3cd8_2
|
||||||
|
- lxml=5.3.0=py313h6eb7059_2
|
||||||
|
- markupsafe=3.0.2=py313h8060acc_0
|
||||||
|
- matplotlib=3.9.2=py313h78bf25f_2
|
||||||
|
- matplotlib-base=3.9.2=py313h129903b_2
|
||||||
|
- matplotlib-inline=0.1.7=pyhd8ed1ab_0
|
||||||
|
- mistune=3.0.2=pyhd8ed1ab_0
|
||||||
|
- munkres=1.1.4=pyh9f0ad1d_0
|
||||||
|
- mysql-common=9.0.1=h266115a_2
|
||||||
|
- mysql-libs=9.0.1=he0572af_2
|
||||||
|
- nbclassic=1.1.0=pyhd8ed1ab_0
|
||||||
|
- nbclient=0.10.0=pyhd8ed1ab_0
|
||||||
|
- nbconvert=7.16.4=hd8ed1ab_1
|
||||||
|
- nbconvert-core=7.16.4=pyhd8ed1ab_1
|
||||||
|
- nbconvert-pandoc=7.16.4=hd8ed1ab_1
|
||||||
|
- nbformat=5.10.4=pyhd8ed1ab_0
|
||||||
|
- ncurses=6.5=he02047a_1
|
||||||
|
- nest-asyncio=1.6.0=pyhd8ed1ab_0
|
||||||
|
- notebook=6.5.7=pyha770c72_0
|
||||||
|
- notebook-shim=0.2.4=pyhd8ed1ab_0
|
||||||
|
- numpy=2.1.3=py313h4bf6692_0
|
||||||
|
- openjpeg=2.5.2=h488ebb8_0
|
||||||
|
- openldap=2.6.8=hedd0468_0
|
||||||
|
- openpyxl=3.1.5=py313h9c9eb82_1
|
||||||
|
- openssl=3.4.0=hb9d3cd8_0
|
||||||
|
- overrides=7.7.0=pyhd8ed1ab_0
|
||||||
|
- packaging=24.2=pyhff2d567_1
|
||||||
|
- pandas=2.2.3=py313ha87cce1_1
|
||||||
|
- pandoc=3.5=ha770c72_0
|
||||||
|
- pandocfilters=1.5.0=pyhd8ed1ab_0
|
||||||
|
- parso=0.8.4=pyhd8ed1ab_0
|
||||||
|
- patsy=1.0.1=pyhff2d567_0
|
||||||
|
- pcre2=10.44=hba22ea6_2
|
||||||
|
- pexpect=4.9.0=pyhd8ed1ab_0
|
||||||
|
- pickleshare=0.7.5=py_1003
|
||||||
|
- pillow=11.0.0=py313h2d7ed13_0
|
||||||
|
- pip=24.3.1=pyh145f28c_0
|
||||||
|
- pixman=0.43.2=h59595ed_0
|
||||||
|
- pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1
|
||||||
|
- platformdirs=4.3.6=pyhd8ed1ab_0
|
||||||
|
- prometheus_client=0.21.0=pyhd8ed1ab_0
|
||||||
|
- prompt-toolkit=3.0.48=pyha770c72_0
|
||||||
|
- psutil=6.1.0=py313h536fd9c_0
|
||||||
|
- pthread-stubs=0.4=hb9d3cd8_1002
|
||||||
|
- ptyprocess=0.7.0=pyhd3deb0d_0
|
||||||
|
- pure_eval=0.2.3=pyhd8ed1ab_0
|
||||||
|
- pycodestyle=2.12.1=pyhd8ed1ab_0
|
||||||
|
- pycparser=2.22=pyhd8ed1ab_0
|
||||||
|
- pygments=2.18.0=pyhd8ed1ab_0
|
||||||
|
- pyparsing=3.2.0=pyhd8ed1ab_1
|
||||||
|
- pyside6=6.8.0.2=py313h5f61773_0
|
||||||
|
- python=3.13.0=h9ebbce0_100_cp313
|
||||||
|
- python-dateutil=2.9.0.post0=pyhff2d567_0
|
||||||
|
- python-fastjsonschema=2.20.0=pyhd8ed1ab_0
|
||||||
|
- python-json-logger=2.0.7=pyhd8ed1ab_0
|
||||||
|
- python-tzdata=2024.2=pyhd8ed1ab_0
|
||||||
|
- python_abi=3.13=5_cp313
|
||||||
|
- pytz=2024.1=pyhd8ed1ab_0
|
||||||
|
- pyyaml=6.0.2=py313h536fd9c_1
|
||||||
|
- pyzmq=26.2.0=py313h8e95178_3
|
||||||
|
- qhull=2020.2=h434a139_5
|
||||||
|
- qt6-main=6.8.0=h6e8976b_0
|
||||||
|
- readline=8.2=h8228510_1
|
||||||
|
- referencing=0.35.1=pyhd8ed1ab_0
|
||||||
|
- rfc3339-validator=0.1.4=pyhd8ed1ab_0
|
||||||
|
- rfc3986-validator=0.1.1=pyh9f0ad1d_0
|
||||||
|
- rpds-py=0.21.0=py313h920b4c0_0
|
||||||
|
- scipy=1.14.1=py313h27c5614_1
|
||||||
|
- seaborn=0.13.2=hd8ed1ab_2
|
||||||
|
- seaborn-base=0.13.2=pyhd8ed1ab_2
|
||||||
|
- send2trash=1.8.3=pyh0d859eb_0
|
||||||
|
- setuptools=75.6.0=pyhff2d567_0
|
||||||
|
- six=1.16.0=pyh6c4a22f_0
|
||||||
|
- sniffio=1.3.1=pyhd8ed1ab_0
|
||||||
|
- soupsieve=2.5=pyhd8ed1ab_1
|
||||||
|
- stack_data=0.6.2=pyhd8ed1ab_0
|
||||||
|
- statsmodels=0.14.4=py313ha014f3b_0
|
||||||
|
- tabulate=0.9.0=pyhd8ed1ab_1
|
||||||
|
- terminado=0.18.1=pyh0d859eb_0
|
||||||
|
- tinycss2=1.4.0=pyhd8ed1ab_0
|
||||||
|
- tk=8.6.13=noxft_h4845f30_101
|
||||||
|
- tomli=2.1.0=pyhff2d567_0
|
||||||
|
- tornado=6.4.1=py313h536fd9c_1
|
||||||
|
- tqdm=4.67.0=pyhd8ed1ab_0
|
||||||
|
- traitlets=5.14.3=pyhd8ed1ab_0
|
||||||
|
- types-python-dateutil=2.9.0.20241003=pyhff2d567_0
|
||||||
|
- typing-extensions=4.12.2=hd8ed1ab_0
|
||||||
|
- typing_extensions=4.12.2=pyha770c72_0
|
||||||
|
- typing_utils=0.1.0=pyhd8ed1ab_0
|
||||||
|
- tzdata=2024b=hc8b5060_0
|
||||||
|
- uri-template=1.3.0=pyhd8ed1ab_0
|
||||||
|
- wayland=1.23.1=h3e06ad9_0
|
||||||
|
- wcwidth=0.2.13=pyhd8ed1ab_0
|
||||||
|
- webcolors=24.8.0=pyhd8ed1ab_0
|
||||||
|
- webencodings=0.5.1=pyhd8ed1ab_2
|
||||||
|
- websocket-client=1.8.0=pyhd8ed1ab_0
|
||||||
|
- xcb-util=0.4.1=hb711507_2
|
||||||
|
- xcb-util-cursor=0.1.5=hb9d3cd8_0
|
||||||
|
- xcb-util-image=0.4.0=hb711507_2
|
||||||
|
- xcb-util-keysyms=0.4.1=hb711507_0
|
||||||
|
- xcb-util-renderutil=0.3.10=hb711507_0
|
||||||
|
- xcb-util-wm=0.4.2=hb711507_0
|
||||||
|
- xkeyboard-config=2.43=hb9d3cd8_0
|
||||||
|
- xorg-libice=1.1.1=hb9d3cd8_1
|
||||||
|
- xorg-libsm=1.2.4=he73a12e_1
|
||||||
|
- xorg-libx11=1.8.10=h4f16b4b_0
|
||||||
|
- xorg-libxau=1.0.11=hb9d3cd8_1
|
||||||
|
- xorg-libxcomposite=0.4.6=hb9d3cd8_2
|
||||||
|
- xorg-libxcursor=1.2.3=hb9d3cd8_0
|
||||||
|
- xorg-libxdamage=1.1.6=hb9d3cd8_0
|
||||||
|
- xorg-libxdmcp=1.1.5=hb9d3cd8_0
|
||||||
|
- xorg-libxext=1.3.6=hb9d3cd8_0
|
||||||
|
- xorg-libxfixes=6.0.1=hb9d3cd8_0
|
||||||
|
- xorg-libxi=1.8.2=hb9d3cd8_0
|
||||||
|
- xorg-libxrandr=1.5.4=hb9d3cd8_0
|
||||||
|
- xorg-libxrender=0.9.11=hb9d3cd8_1
|
||||||
|
- xorg-libxtst=1.2.5=hb9d3cd8_3
|
||||||
|
- xorg-libxxf86vm=1.1.5=hb9d3cd8_4
|
||||||
|
- xorg-xorgproto=2024.1=hb9d3cd8_1
|
||||||
|
- xz=5.2.6=h166bdaf_0
|
||||||
|
- yaml=0.2.5=h7f98852_2
|
||||||
|
- zeromq=4.3.5=h3b0a872_7
|
||||||
|
- zipp=3.21.0=pyhd8ed1ab_0
|
||||||
|
- zlib=1.3.1=hb9d3cd8_2
|
||||||
|
- zstd=1.5.6=ha6fb4c9_0
|
||||||
|
|
||||||
9124
Aigrind/report.html
Normal file
9124
Aigrind/report.html
Normal file
File diff suppressed because one or more lines are too long
5
Aigrind/tables/arpu.md
Normal file
5
Aigrind/tables/arpu.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
| | RUS_MS1_purchase | UKR_MS1_purchase | BRA_MS1_purchase | days |
|
||||||
|
|---:|-------------------:|-------------------:|-------------------:|:--------|
|
||||||
|
| 6 | 0.570234 | 0.644273 | 4.71347 | 7 days |
|
||||||
|
| 13 | 0.759229 | 0.644273 | 4.71347 | 14 days |
|
||||||
|
| 29 | 1.31604 | 1.82198 | 4.73251 | 30 days |
|
||||||
10
Aigrind/tables/cpi.sorted.md
Normal file
10
Aigrind/tables/cpi.sorted.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
| | CPI |
|
||||||
|
|:--------------------------------------------------|-----------:|
|
||||||
|
| ('Media_source_1', 'install', 'Brazil') | 0.00864771 |
|
||||||
|
| ('Media_source_1', 'install', 'Ukrane') | 0.0146436 |
|
||||||
|
| ('Media_source_1', 'install', 'Russia') | 0.0194719 |
|
||||||
|
| ('Media_source_2', 'install', 'English_speaking') | 0.245577 |
|
||||||
|
| ('Media_source_1', 'purchase', 'Brazil') | 0.350018 |
|
||||||
|
| ('Media_source_1', 'purchase', 'Russia') | 0.390114 |
|
||||||
|
| ('Media_source_2', 'install', 'Brazil') | 0.533882 |
|
||||||
|
| ('Media_source_1', 'purchase', 'Ukrane') | 1.33896 |
|
||||||
10
Aigrind/tables/payback-period.md
Normal file
10
Aigrind/tables/payback-period.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
| | Time, (months) |
|
||||||
|
|:--------------------------------------------------|-----------------:|
|
||||||
|
| ('Media_source_1', 'install', 'Brazil') | 0.330097 |
|
||||||
|
| ('Media_source_1', 'purchase', 'Brazil') | 0.850925 |
|
||||||
|
| ('Media_source_1', 'install', 'Russia') | 0.319666 |
|
||||||
|
| ('Media_source_1', 'purchase', 'Russia') | 0.724876 |
|
||||||
|
| ('Media_source_1', 'install', 'Ukrane') | 0.917769 |
|
||||||
|
| ('Media_source_1', 'purchase', 'Ukrane') | 0.343303 |
|
||||||
|
| ('Media_source_2', 'install', 'Brazil') | 5.33726 |
|
||||||
|
| ('Media_source_2', 'install', 'English_speaking') | 3.90023 |
|
||||||
10
Aigrind/tables/payback-period.sorted.md
Normal file
10
Aigrind/tables/payback-period.sorted.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
| | Time, (months) |
|
||||||
|
|:--------------------------------------------------|-----------------:|
|
||||||
|
| ('Media_source_1', 'install', 'Russia') | 0.319666 |
|
||||||
|
| ('Media_source_1', 'install', 'Brazil') | 0.330097 |
|
||||||
|
| ('Media_source_1', 'purchase', 'Ukrane') | 0.343303 |
|
||||||
|
| ('Media_source_1', 'purchase', 'Russia') | 0.724876 |
|
||||||
|
| ('Media_source_1', 'purchase', 'Brazil') | 0.850925 |
|
||||||
|
| ('Media_source_1', 'install', 'Ukrane') | 0.917769 |
|
||||||
|
| ('Media_source_2', 'install', 'English_speaking') | 3.90023 |
|
||||||
|
| ('Media_source_2', 'install', 'Brazil') | 5.33726 |
|
||||||
66
egeland/sql/Script.sql
Normal file
66
egeland/sql/Script.sql
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
with final_table2 as
|
||||||
|
(with pre_table as
|
||||||
|
(select
|
||||||
|
*,
|
||||||
|
-- Перевод из unix-времени в обычное
|
||||||
|
cast(to_timestamp(created_at) as time) as dtime,
|
||||||
|
-- удаление подряд идущих сообщений от одного пользователя по принципу проверки равенства
|
||||||
|
-- между автором текущего и предыдущего сообщения (true, если авторы разные)
|
||||||
|
-- coalesce -- чтобы NULL заменить на true у первого сообщения в сделке
|
||||||
|
coalesce(created_by <> lag(created_by) over(partition by entity_id order by created_at), true) as not_dupl,
|
||||||
|
-- нумерация записей внутри сделки, чтобы все сделки начинались с сообщения клиента
|
||||||
|
row_number() over(partition by entity_id order by created_at) as num
|
||||||
|
from
|
||||||
|
db1.test.chat_messages cm
|
||||||
|
order by entity_id, created_at)
|
||||||
|
select
|
||||||
|
*,
|
||||||
|
dtime,
|
||||||
|
-- учет нерабочего времени, возможны 4 варианта
|
||||||
|
-- 1) менеджер ответил ночью -- тогда время ответа равно 24:00 - `время сообщения клиента`
|
||||||
|
-- 2) клиент написал ночью -- тогда время ответа отсчитывается от 09:30
|
||||||
|
-- 3) клиент написал днем, а менеджер ответил на след. день -- тогда время ответа равно
|
||||||
|
-- разности времен сообщений за вычетом ночного времени
|
||||||
|
-- 4) обычный вариант, тогда просто разность
|
||||||
|
case when (dtime < '09:30:00'::time and created_by <> 0)
|
||||||
|
then '24:00:00'::time - lag(dtime) over(partition by entity_id order by created_at)
|
||||||
|
when (dtime < '09:30:00'::time and created_by = 0)
|
||||||
|
then dtime -'09:30:00'::time
|
||||||
|
when (lag(dtime) over(partition by entity_id order by created_at) > dtime)
|
||||||
|
then lag(dtime) over(partition by entity_id order by created_at) - dtime - '09:30:00'::time
|
||||||
|
else dtime - lag(dtime) over(partition by entity_id order by created_at)
|
||||||
|
end as diff_time
|
||||||
|
from pre_table
|
||||||
|
where
|
||||||
|
-- игнорируем дупликаты
|
||||||
|
pre_table.not_dupl
|
||||||
|
and
|
||||||
|
-- игнорируем записи в сделках, которые начинаются с сообщения менеджера
|
||||||
|
not (pre_table.num = 1 and pre_table.created_by <> 0))
|
||||||
|
select
|
||||||
|
r.rop_name,
|
||||||
|
m.name_mop,
|
||||||
|
-- приведение к timestamp для фильтрации в datalens
|
||||||
|
cast(to_timestamp(created_at) as timestamp) as datetime,
|
||||||
|
-- datalens не поддерживает тип данных interval
|
||||||
|
extract(epoch from diff_time) as diff_time,
|
||||||
|
avg(extract(epoch from diff_time)) over(partition by r.rop_name, m.name_mop) as avg_diff_time
|
||||||
|
from
|
||||||
|
-- обычный INNER JOIN трех таблиц
|
||||||
|
final_table2 as ft2
|
||||||
|
join
|
||||||
|
managers as m on m.mop_id = ft2.created_by
|
||||||
|
join
|
||||||
|
-- пришлось привести m.rop_id к int4, так как разные типы
|
||||||
|
rops as r on r.rop_id = cast(m.rop_id as int4)
|
||||||
|
where
|
||||||
|
created_by <> 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
852
egeland/test-task.ipynb
Normal file
852
egeland/test-task.ipynb
Normal file
@@ -0,0 +1,852 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "724c2204",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"# Библиотеки"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 39,
|
||||||
|
"id": "c2845a30",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"import numpy as np\n",
|
||||||
|
"import pandas as pd\n",
|
||||||
|
"import matplotlib.pyplot as plt\n",
|
||||||
|
"import seaborn as sns\n",
|
||||||
|
"from tqdm import tqdm\n",
|
||||||
|
"\n",
|
||||||
|
"plt.rcParams.update({'font.size': 14})"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 40,
|
||||||
|
"id": "7c4025d7",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"from datetime import timedelta"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "d4c4405a",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Отключение предупреждений\n",
|
||||||
|
"\n",
|
||||||
|
"Возникали на этапе подключение к СУБД"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 41,
|
||||||
|
"id": "f7cfd67c",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"import warnings\n",
|
||||||
|
"warnings.filterwarnings('ignore')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 42,
|
||||||
|
"id": "c573a116",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"import psycopg2"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "69997e6b",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"# Константы"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 43,
|
||||||
|
"id": "3e3370fe",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"USER = \"test_user\"\n",
|
||||||
|
"PASSWORD = \"j2M{CnnFq@\" # Лучше, через переменные окружения, но это в целям экономии времени\n",
|
||||||
|
"HOSTNAME = \"rc1a-p8bp15mmxsfwpbt0.mdb.yandexcloud.net\"\n",
|
||||||
|
"# HOSTNAME = \"130.193.48.126\" # Были проблемы с разыменовыванием доменного имени\n",
|
||||||
|
"DATABASE = \"db1\"\n",
|
||||||
|
"PORT = '6432'"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "ec3cb72e",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"# Тестовое задание"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "d1635ad4",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Подключение к базе данных"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 44,
|
||||||
|
"id": "e51e0bc4",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"conn = psycopg2.connect(\n",
|
||||||
|
" database=DATABASE,\n",
|
||||||
|
" user=USER,\n",
|
||||||
|
" host=HOSTNAME,\n",
|
||||||
|
" password=PASSWORD,\n",
|
||||||
|
" port = PORT\n",
|
||||||
|
")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "3790de39",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Получение таблиц из запроса"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 45,
|
||||||
|
"id": "05d856c8",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# Запросы\n",
|
||||||
|
"cm = pd.read_sql_query(\"select * from test.chat_messages\", conn)\n",
|
||||||
|
"mop = pd.read_sql_query(\"select * from test.managers\", conn)\n",
|
||||||
|
"rop = pd.read_sql_query(\"select * from test.rops\", conn)\n",
|
||||||
|
"\n",
|
||||||
|
"# Сортировка таблицы по времени сообщения\n",
|
||||||
|
"cm.sort_values(by=['created_at'], ascending=True, inplace=True)\n",
|
||||||
|
"\n",
|
||||||
|
"# Приведение к типу строки, что нужно для операции JOIN\n",
|
||||||
|
"rop['rop_id'] = rop['rop_id'].astype(str)\n",
|
||||||
|
"\n",
|
||||||
|
"# Установка первичных ключей в качестве индексов\n",
|
||||||
|
"mop.set_index('mop_id', inplace=True)\n",
|
||||||
|
"cm.set_index('message_id', inplace=True)\n",
|
||||||
|
"rop.set_index('rop_id', inplace=True)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 46,
|
||||||
|
"id": "4de1c50d",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/html": [
|
||||||
|
"<div>\n",
|
||||||
|
"<style scoped>\n",
|
||||||
|
" .dataframe tbody tr th:only-of-type {\n",
|
||||||
|
" vertical-align: middle;\n",
|
||||||
|
" }\n",
|
||||||
|
"\n",
|
||||||
|
" .dataframe tbody tr th {\n",
|
||||||
|
" vertical-align: top;\n",
|
||||||
|
" }\n",
|
||||||
|
"\n",
|
||||||
|
" .dataframe thead th {\n",
|
||||||
|
" text-align: right;\n",
|
||||||
|
" }\n",
|
||||||
|
"</style>\n",
|
||||||
|
"<table border=\"1\" class=\"dataframe\">\n",
|
||||||
|
" <thead>\n",
|
||||||
|
" <tr style=\"text-align: right;\">\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" <th>type</th>\n",
|
||||||
|
" <th>entity_id</th>\n",
|
||||||
|
" <th>created_by</th>\n",
|
||||||
|
" <th>created_at</th>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>message_id</th>\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" </thead>\n",
|
||||||
|
" <tbody>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>\"01jb2qn9kwq95f3cm3w9pte8m7\"</th>\n",
|
||||||
|
" <td>outgoing_chat_message</td>\n",
|
||||||
|
" <td>37548741</td>\n",
|
||||||
|
" <td>10262513</td>\n",
|
||||||
|
" <td>1729890002</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>\"01jb2qnbwyqywemwww3kxh8wxp\"</th>\n",
|
||||||
|
" <td>outgoing_chat_message</td>\n",
|
||||||
|
" <td>36713959</td>\n",
|
||||||
|
" <td>10262485</td>\n",
|
||||||
|
" <td>1729890004</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>\"01jb2qney0mkr94bx272g4qhs3\"</th>\n",
|
||||||
|
" <td>incoming_chat_message</td>\n",
|
||||||
|
" <td>37548761</td>\n",
|
||||||
|
" <td>0</td>\n",
|
||||||
|
" <td>1729890008</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>\"01jb2qnhnkb0n83mrg790xjn82\"</th>\n",
|
||||||
|
" <td>outgoing_chat_message</td>\n",
|
||||||
|
" <td>37548087</td>\n",
|
||||||
|
" <td>6744792</td>\n",
|
||||||
|
" <td>1729890010</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>\"01jb2qnmn7asjn9m5478zy7c82\"</th>\n",
|
||||||
|
" <td>outgoing_chat_message</td>\n",
|
||||||
|
" <td>37362585</td>\n",
|
||||||
|
" <td>10465690</td>\n",
|
||||||
|
" <td>1729890013</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" </tbody>\n",
|
||||||
|
"</table>\n",
|
||||||
|
"</div>"
|
||||||
|
],
|
||||||
|
"text/plain": [
|
||||||
|
" type entity_id created_by \\\n",
|
||||||
|
"message_id \n",
|
||||||
|
"\"01jb2qn9kwq95f3cm3w9pte8m7\" outgoing_chat_message 37548741 10262513 \n",
|
||||||
|
"\"01jb2qnbwyqywemwww3kxh8wxp\" outgoing_chat_message 36713959 10262485 \n",
|
||||||
|
"\"01jb2qney0mkr94bx272g4qhs3\" incoming_chat_message 37548761 0 \n",
|
||||||
|
"\"01jb2qnhnkb0n83mrg790xjn82\" outgoing_chat_message 37548087 6744792 \n",
|
||||||
|
"\"01jb2qnmn7asjn9m5478zy7c82\" outgoing_chat_message 37362585 10465690 \n",
|
||||||
|
"\n",
|
||||||
|
" created_at \n",
|
||||||
|
"message_id \n",
|
||||||
|
"\"01jb2qn9kwq95f3cm3w9pte8m7\" 1729890002 \n",
|
||||||
|
"\"01jb2qnbwyqywemwww3kxh8wxp\" 1729890004 \n",
|
||||||
|
"\"01jb2qney0mkr94bx272g4qhs3\" 1729890008 \n",
|
||||||
|
"\"01jb2qnhnkb0n83mrg790xjn82\" 1729890010 \n",
|
||||||
|
"\"01jb2qnmn7asjn9m5478zy7c82\" 1729890013 "
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 46,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"cm.head()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 47,
|
||||||
|
"id": "4fae9113",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/html": [
|
||||||
|
"<div>\n",
|
||||||
|
"<style scoped>\n",
|
||||||
|
" .dataframe tbody tr th:only-of-type {\n",
|
||||||
|
" vertical-align: middle;\n",
|
||||||
|
" }\n",
|
||||||
|
"\n",
|
||||||
|
" .dataframe tbody tr th {\n",
|
||||||
|
" vertical-align: top;\n",
|
||||||
|
" }\n",
|
||||||
|
"\n",
|
||||||
|
" .dataframe thead th {\n",
|
||||||
|
" text-align: right;\n",
|
||||||
|
" }\n",
|
||||||
|
"</style>\n",
|
||||||
|
"<table border=\"1\" class=\"dataframe\">\n",
|
||||||
|
" <thead>\n",
|
||||||
|
" <tr style=\"text-align: right;\">\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" <th>name_mop</th>\n",
|
||||||
|
" <th>rop_id</th>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>mop_id</th>\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" </thead>\n",
|
||||||
|
" <tbody>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>6645315</th>\n",
|
||||||
|
" <td>Гюнель и Илина</td>\n",
|
||||||
|
" <td>1</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>6744792</th>\n",
|
||||||
|
" <td>Юля и Наташа</td>\n",
|
||||||
|
" <td>1</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>10262505</th>\n",
|
||||||
|
" <td>Вика и Марго</td>\n",
|
||||||
|
" <td>1</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>10262513</th>\n",
|
||||||
|
" <td>Ира и Варя</td>\n",
|
||||||
|
" <td>1</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>10465254</th>\n",
|
||||||
|
" <td>Настя и Даша</td>\n",
|
||||||
|
" <td>1</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" </tbody>\n",
|
||||||
|
"</table>\n",
|
||||||
|
"</div>"
|
||||||
|
],
|
||||||
|
"text/plain": [
|
||||||
|
" name_mop rop_id\n",
|
||||||
|
"mop_id \n",
|
||||||
|
"6645315 Гюнель и Илина 1\n",
|
||||||
|
"6744792 Юля и Наташа 1\n",
|
||||||
|
"10262505 Вика и Марго 1\n",
|
||||||
|
"10262513 Ира и Варя 1\n",
|
||||||
|
"10465254 Настя и Даша 1"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 47,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"mop.head()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 48,
|
||||||
|
"id": "ddd63eab",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/html": [
|
||||||
|
"<div>\n",
|
||||||
|
"<style scoped>\n",
|
||||||
|
" .dataframe tbody tr th:only-of-type {\n",
|
||||||
|
" vertical-align: middle;\n",
|
||||||
|
" }\n",
|
||||||
|
"\n",
|
||||||
|
" .dataframe tbody tr th {\n",
|
||||||
|
" vertical-align: top;\n",
|
||||||
|
" }\n",
|
||||||
|
"\n",
|
||||||
|
" .dataframe thead th {\n",
|
||||||
|
" text-align: right;\n",
|
||||||
|
" }\n",
|
||||||
|
"</style>\n",
|
||||||
|
"<table border=\"1\" class=\"dataframe\">\n",
|
||||||
|
" <thead>\n",
|
||||||
|
" <tr style=\"text-align: right;\">\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" <th>rop_name</th>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>rop_id</th>\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" </thead>\n",
|
||||||
|
" <tbody>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>1</th>\n",
|
||||||
|
" <td>Катя РОП</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>2</th>\n",
|
||||||
|
" <td>Полина РОП</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>3</th>\n",
|
||||||
|
" <td>Эля РОП</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" </tbody>\n",
|
||||||
|
"</table>\n",
|
||||||
|
"</div>"
|
||||||
|
],
|
||||||
|
"text/plain": [
|
||||||
|
" rop_name\n",
|
||||||
|
"rop_id \n",
|
||||||
|
"1 Катя РОП\n",
|
||||||
|
"2 Полина РОП\n",
|
||||||
|
"3 Эля РОП"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 48,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"rop.head()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 49,
|
||||||
|
"id": "6da1229a",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"def time_diff(x):\n",
|
||||||
|
" \"\"\"\n",
|
||||||
|
" Функция, которая на каждую строку в таблице chat_members, считает время ответа по\n",
|
||||||
|
" следующим правилам:\n",
|
||||||
|
" 1) менеджер ответил ночью -- тогда время ответа равно 24:00 - `время сообщения клиента`\n",
|
||||||
|
" 2) клиент написал ночью -- тогда время ответа отсчитывается от 09:30\n",
|
||||||
|
" 3) клиент написал днем, а менеджер ответил на след. день -- тогда время ответа равно\n",
|
||||||
|
" разности времен сообщений за вычетом ночного времени\n",
|
||||||
|
" 4) обычный вариант, тогда просто разность\n",
|
||||||
|
" \"\"\"\n",
|
||||||
|
" shift_begin = timedelta(hours=9, minutes=30)\n",
|
||||||
|
" day = timedelta(days=1)\n",
|
||||||
|
" ct = x['dtime']\n",
|
||||||
|
" mt = x['lag_dtime']\n",
|
||||||
|
" manager_time = timedelta(seconds=mt.second, minutes=mt.minute, hours=mt.hour)\n",
|
||||||
|
" client_time = timedelta(seconds=ct.second, minutes=ct.minute, hours=ct.hour)\n",
|
||||||
|
" if manager_time < shift_begin:\n",
|
||||||
|
" return day - client_time\n",
|
||||||
|
" elif client_time < shift_begin:\n",
|
||||||
|
" return manager_time - shift_begin\n",
|
||||||
|
" elif client_time > manager_time:\n",
|
||||||
|
" return client_time - manager_time - shift_begin\n",
|
||||||
|
" else:\n",
|
||||||
|
" return manager_time - client_time"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 50,
|
||||||
|
"id": "e7f4d343",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# Добавление столбца с временем суток\n",
|
||||||
|
"cm['dtime'] = pd.to_datetime(cm['created_at'], unit='s').dt.time"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 51,
|
||||||
|
"id": "80dc378b",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# Аналог \n",
|
||||||
|
"# ROW_NUMBER() OVER(PARTITION BY entity_id ORDER BY created_at) \n",
|
||||||
|
"# из SQL\n",
|
||||||
|
"# Нужно, чтобы установить порядок сообщений внутри одной сделки и \n",
|
||||||
|
"# отфильтровать те, в которых первое сообщение написал менеджер\n",
|
||||||
|
"cm['num'] = cm.sort_values('created_at').groupby(by=['entity_id']).cumcount()+1\n",
|
||||||
|
"condition1 = np.logical_not(np.logical_and(cm['created_by'] != 0, cm['num'] == 0))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 52,
|
||||||
|
"id": "79d51892",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# Аналог\n",
|
||||||
|
"# created_by <> lag(created_by) OVER(PARTITION BY entity_id ORDER BY created_at\n",
|
||||||
|
"# из SQL\n",
|
||||||
|
"# Сдвигает значение на одну позицию, чтобы отфильтровать те сообщение, идущие подряд,\n",
|
||||||
|
"# которые написаны одним человеком\n",
|
||||||
|
"cm['lag'] = cm.sort_values('created_at').groupby(by=['entity_id'])['created_by'].shift(-1)\n",
|
||||||
|
"condition2 = cm['created_by'] != cm['lag']"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 53,
|
||||||
|
"id": "856be093",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# Фильтр по пересечению условий\n",
|
||||||
|
"result = cm[condition1 & condition2]"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 54,
|
||||||
|
"id": "ab1e36bc",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# Сдвиг времени сообщения на одну позицию, чтобы получить разницу времен сообщений\n",
|
||||||
|
"result['lag_dtime'] = result.sort_values('created_at').groupby('entity_id')['dtime'].shift(-1)\n",
|
||||||
|
"result['lag_diff'] = result.dropna().apply(time_diff, axis=1)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 55,
|
||||||
|
"id": "eedbdf11",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/html": [
|
||||||
|
"<div>\n",
|
||||||
|
"<style scoped>\n",
|
||||||
|
" .dataframe tbody tr th:only-of-type {\n",
|
||||||
|
" vertical-align: middle;\n",
|
||||||
|
" }\n",
|
||||||
|
"\n",
|
||||||
|
" .dataframe tbody tr th {\n",
|
||||||
|
" vertical-align: top;\n",
|
||||||
|
" }\n",
|
||||||
|
"\n",
|
||||||
|
" .dataframe thead th {\n",
|
||||||
|
" text-align: right;\n",
|
||||||
|
" }\n",
|
||||||
|
"</style>\n",
|
||||||
|
"<table border=\"1\" class=\"dataframe\">\n",
|
||||||
|
" <thead>\n",
|
||||||
|
" <tr style=\"text-align: right;\">\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" <th>name_mop</th>\n",
|
||||||
|
" <th>rop_name</th>\n",
|
||||||
|
" <th>lag_diff</th>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>message_id</th>\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" </thead>\n",
|
||||||
|
" <tbody>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>\"01jb2qn9kwq95f3cm3w9pte8m7\"</th>\n",
|
||||||
|
" <td>Ира и Варя</td>\n",
|
||||||
|
" <td>Катя РОП</td>\n",
|
||||||
|
" <td>0 days 00:02:49</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>\"01jb2qnhnkb0n83mrg790xjn82\"</th>\n",
|
||||||
|
" <td>Юля и Наташа</td>\n",
|
||||||
|
" <td>Катя РОП</td>\n",
|
||||||
|
" <td>0 days 00:00:15</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>\"01jb2qnmn7asjn9m5478zy7c82\"</th>\n",
|
||||||
|
" <td>Настя и Малика</td>\n",
|
||||||
|
" <td>Эля РОП</td>\n",
|
||||||
|
" <td>0 days 00:00:09</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>\"01jb2qnvamsq2866te84re669b\"</th>\n",
|
||||||
|
" <td>Соня и Катя</td>\n",
|
||||||
|
" <td>Полина РОП</td>\n",
|
||||||
|
" <td>0 days 00:00:27</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>\"01jb2qpc1qfrqgmgx998t9vgg2\"</th>\n",
|
||||||
|
" <td>Мария и Соня</td>\n",
|
||||||
|
" <td>Полина РОП</td>\n",
|
||||||
|
" <td>0 days 00:00:23</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" </tbody>\n",
|
||||||
|
"</table>\n",
|
||||||
|
"</div>"
|
||||||
|
],
|
||||||
|
"text/plain": [
|
||||||
|
" name_mop rop_name lag_diff\n",
|
||||||
|
"message_id \n",
|
||||||
|
"\"01jb2qn9kwq95f3cm3w9pte8m7\" Ира и Варя Катя РОП 0 days 00:02:49\n",
|
||||||
|
"\"01jb2qnhnkb0n83mrg790xjn82\" Юля и Наташа Катя РОП 0 days 00:00:15\n",
|
||||||
|
"\"01jb2qnmn7asjn9m5478zy7c82\" Настя и Малика Эля РОП 0 days 00:00:09\n",
|
||||||
|
"\"01jb2qnvamsq2866te84re669b\" Соня и Катя Полина РОП 0 days 00:00:27\n",
|
||||||
|
"\"01jb2qpc1qfrqgmgx998t9vgg2\" Мария и Соня Полина РОП 0 days 00:00:23"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 55,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"# Объединение таблиц для получения конечных времен реакций на сообщения\n",
|
||||||
|
"result2 = result.join(mop, on='created_by').join(rop, on='rop_id').dropna()[['name_mop', 'rop_name', 'lag_diff']]\n",
|
||||||
|
"result2.head()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 56,
|
||||||
|
"id": "c7038cc6",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# Группировка и применение агрегирующей функции\n",
|
||||||
|
"final_df = result2.groupby(by=['rop_name', 'name_mop']).mean()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 59,
|
||||||
|
"id": "0e3440d5",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/html": [
|
||||||
|
"<div>\n",
|
||||||
|
"<style scoped>\n",
|
||||||
|
" .dataframe tbody tr th:only-of-type {\n",
|
||||||
|
" vertical-align: middle;\n",
|
||||||
|
" }\n",
|
||||||
|
"\n",
|
||||||
|
" .dataframe tbody tr th {\n",
|
||||||
|
" vertical-align: top;\n",
|
||||||
|
" }\n",
|
||||||
|
"\n",
|
||||||
|
" .dataframe thead th {\n",
|
||||||
|
" text-align: right;\n",
|
||||||
|
" }\n",
|
||||||
|
"</style>\n",
|
||||||
|
"<table border=\"1\" class=\"dataframe\">\n",
|
||||||
|
" <thead>\n",
|
||||||
|
" <tr style=\"text-align: right;\">\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" <th>Имя руководителя</th>\n",
|
||||||
|
" <th>Имя менеджера</th>\n",
|
||||||
|
" <th>Среднее время реакции</th>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" </thead>\n",
|
||||||
|
" <tbody>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>0</th>\n",
|
||||||
|
" <td>Катя РОП</td>\n",
|
||||||
|
" <td>Аня и Ксюша</td>\n",
|
||||||
|
" <td>0 days 03:27:30.020872865</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>1</th>\n",
|
||||||
|
" <td>Катя РОП</td>\n",
|
||||||
|
" <td>Вика и Катя</td>\n",
|
||||||
|
" <td>0 days 03:24:13.302118171</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>2</th>\n",
|
||||||
|
" <td>Катя РОП</td>\n",
|
||||||
|
" <td>Гюнель и Илина</td>\n",
|
||||||
|
" <td>0 days 03:55:31.088691796</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>3</th>\n",
|
||||||
|
" <td>Катя РОП</td>\n",
|
||||||
|
" <td>Ира и Варя</td>\n",
|
||||||
|
" <td>0 days 02:44:58.748677248</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>4</th>\n",
|
||||||
|
" <td>Катя РОП</td>\n",
|
||||||
|
" <td>Ксюша и Джамиля</td>\n",
|
||||||
|
" <td>0 days 01:58:12.669724770</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>5</th>\n",
|
||||||
|
" <td>Катя РОП</td>\n",
|
||||||
|
" <td>Настя и Даша</td>\n",
|
||||||
|
" <td>0 days 03:28:37.838951310</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>6</th>\n",
|
||||||
|
" <td>Катя РОП</td>\n",
|
||||||
|
" <td>Юля и Наташа</td>\n",
|
||||||
|
" <td>0 days 03:57:47.909896602</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>7</th>\n",
|
||||||
|
" <td>Полина РОП</td>\n",
|
||||||
|
" <td>Даша и Влада</td>\n",
|
||||||
|
" <td>0 days 03:48:25.811715481</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>8</th>\n",
|
||||||
|
" <td>Полина РОП</td>\n",
|
||||||
|
" <td>Даша и Даша</td>\n",
|
||||||
|
" <td>0 days 03:27:55.650793650</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>9</th>\n",
|
||||||
|
" <td>Полина РОП</td>\n",
|
||||||
|
" <td>Лиза и Ева</td>\n",
|
||||||
|
" <td>0 days 03:19:41.608280254</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>10</th>\n",
|
||||||
|
" <td>Полина РОП</td>\n",
|
||||||
|
" <td>Мария и Соня</td>\n",
|
||||||
|
" <td>0 days 03:16:59.401098901</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>11</th>\n",
|
||||||
|
" <td>Полина РОП</td>\n",
|
||||||
|
" <td>Настя и Саша</td>\n",
|
||||||
|
" <td>0 days 02:36:18.021337126</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>12</th>\n",
|
||||||
|
" <td>Полина РОП</td>\n",
|
||||||
|
" <td>Соня и Катя</td>\n",
|
||||||
|
" <td>0 days 01:35:07.795180722</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>13</th>\n",
|
||||||
|
" <td>Эля РОП</td>\n",
|
||||||
|
" <td>Алина и Юля</td>\n",
|
||||||
|
" <td>0 days 02:28:19.712707182</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>14</th>\n",
|
||||||
|
" <td>Эля РОП</td>\n",
|
||||||
|
" <td>Ангелина Милованова</td>\n",
|
||||||
|
" <td>0 days 06:06:26.477272727</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>15</th>\n",
|
||||||
|
" <td>Эля РОП</td>\n",
|
||||||
|
" <td>Влада и Настя</td>\n",
|
||||||
|
" <td>0 days 00:28:08.972222222</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>16</th>\n",
|
||||||
|
" <td>Эля РОП</td>\n",
|
||||||
|
" <td>Даша и Карина</td>\n",
|
||||||
|
" <td>0 days 02:38:46.333333333</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>17</th>\n",
|
||||||
|
" <td>Эля РОП</td>\n",
|
||||||
|
" <td>Ками и Мила</td>\n",
|
||||||
|
" <td>0 days 02:23:03.636904761</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>18</th>\n",
|
||||||
|
" <td>Эля РОП</td>\n",
|
||||||
|
" <td>Настя и Малика</td>\n",
|
||||||
|
" <td>0 days 02:57:01.780487804</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>19</th>\n",
|
||||||
|
" <td>Эля РОП</td>\n",
|
||||||
|
" <td>Полина Мирзоян</td>\n",
|
||||||
|
" <td>0 days 01:55:44.690476190</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>20</th>\n",
|
||||||
|
" <td>Эля РОП</td>\n",
|
||||||
|
" <td>Порхачева Полина</td>\n",
|
||||||
|
" <td>0 days 05:06:48.200000</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>21</th>\n",
|
||||||
|
" <td>Эля РОП</td>\n",
|
||||||
|
" <td>Софья Боднар</td>\n",
|
||||||
|
" <td>0 days 03:26:38.134831460</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" </tbody>\n",
|
||||||
|
"</table>\n",
|
||||||
|
"</div>"
|
||||||
|
],
|
||||||
|
"text/plain": [
|
||||||
|
" Имя руководителя Имя менеджера Среднее время реакции\n",
|
||||||
|
"0 Катя РОП Аня и Ксюша 0 days 03:27:30.020872865\n",
|
||||||
|
"1 Катя РОП Вика и Катя 0 days 03:24:13.302118171\n",
|
||||||
|
"2 Катя РОП Гюнель и Илина 0 days 03:55:31.088691796\n",
|
||||||
|
"3 Катя РОП Ира и Варя 0 days 02:44:58.748677248\n",
|
||||||
|
"4 Катя РОП Ксюша и Джамиля 0 days 01:58:12.669724770\n",
|
||||||
|
"5 Катя РОП Настя и Даша 0 days 03:28:37.838951310\n",
|
||||||
|
"6 Катя РОП Юля и Наташа 0 days 03:57:47.909896602\n",
|
||||||
|
"7 Полина РОП Даша и Влада 0 days 03:48:25.811715481\n",
|
||||||
|
"8 Полина РОП Даша и Даша 0 days 03:27:55.650793650\n",
|
||||||
|
"9 Полина РОП Лиза и Ева 0 days 03:19:41.608280254\n",
|
||||||
|
"10 Полина РОП Мария и Соня 0 days 03:16:59.401098901\n",
|
||||||
|
"11 Полина РОП Настя и Саша 0 days 02:36:18.021337126\n",
|
||||||
|
"12 Полина РОП Соня и Катя 0 days 01:35:07.795180722\n",
|
||||||
|
"13 Эля РОП Алина и Юля 0 days 02:28:19.712707182\n",
|
||||||
|
"14 Эля РОП Ангелина Милованова 0 days 06:06:26.477272727\n",
|
||||||
|
"15 Эля РОП Влада и Настя 0 days 00:28:08.972222222\n",
|
||||||
|
"16 Эля РОП Даша и Карина 0 days 02:38:46.333333333\n",
|
||||||
|
"17 Эля РОП Ками и Мила 0 days 02:23:03.636904761\n",
|
||||||
|
"18 Эля РОП Настя и Малика 0 days 02:57:01.780487804\n",
|
||||||
|
"19 Эля РОП Полина Мирзоян 0 days 01:55:44.690476190\n",
|
||||||
|
"20 Эля РОП Порхачева Полина 0 days 05:06:48.200000\n",
|
||||||
|
"21 Эля РОП Софья Боднар 0 days 03:26:38.134831460"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 59,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"di = {\n",
|
||||||
|
" 'name_mop': \"Имя менеджера\",\n",
|
||||||
|
" 'rop_name': \"Имя руководителя\",\n",
|
||||||
|
" 'lag_diff': \"Среднее время реакции\",\n",
|
||||||
|
"}\n",
|
||||||
|
"\n",
|
||||||
|
"# Более красивое отображение\n",
|
||||||
|
"final_df.reset_index().rename(di, axis=1)"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3 (ipykernel)",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.13.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 5
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user